|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
$ c8 l& j9 G3 E2 _5 m8 Y0 q可惜读取不到正确值。一直读的是FEh......
1 a& h, |1 Y2 I5 n4 H- |% X8 d5 r( q希望各位大神能帮忙看看,指点一二。小弟先谢过了。
7 G: o8 Y8 d w+ C9 @
g, j2 |8 Z0 j) T; A, [$ Q代码如下(masm5编译链接通过,DOS下运行):
( i) M+ e% Z. g% w6 @) {0 j' f" N' V. ~9 v3 \4 E* W" ]
assume cs:code,ds:data' a/ \# R' q0 l8 b, V* Y* s ^
. H/ P7 t. T! g8 J7 M- Odata segment
# Q( a# m; v! n% K ^7 l, G EC_CMD_PORT equ 66h ;地址端口 8 h- ]) I. q, y2 v/ [" i
EC_DATA_PORT equ 62h ;数据端口
+ Q9 `$ K( q8 C( | C CMD_READ_EC equ 80h ;读寄存器命令
0 L! z% Y0 Z. w' O POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址 0 l0 Y! Z' d7 C9 }5 P. G
data ends% d5 s3 d6 p6 p9 k( G
S3 L, ^& j! E; x$ V: k8 L+ q- h$ Icode segment $ v4 j; w8 ?9 [
start:
. @5 A4 x. Z: A! R; V6 w mov al,CMD_READ_EC
& b0 m, u1 @0 y; F$ w7 W" H call write_ec_cmd ;写80h到0x66h端口 m8 r* h3 `3 A+ P* i9 F* x
mov ax,POLLING_DATA * U+ c2 _' N9 n
call write_ec_data ;写ECRAM地址到0x62h端口: K6 R$ X% _' s4 G0 u* ]: t
call read_ec_data ;从0x62h读数据
' C/ {& _* D" L. \) u. i
Q% p* b8 M4 o4 N$ x+ d mov ax,4c00h
( D% Q A& @; E5 \ int 21h$ Y3 S/ g9 | O' U u; C
* m" U* l2 ?( F/ ~7 ^- R+ hwrite_ec_cmd:7 H6 c& V" F( O* B& q8 x
mov ah,al) a9 a8 l, O( R8 R3 B1 W
call pmuWait4IBE
. _. u" v7 s$ g1 R; c4 ] mov al,ah
$ e8 k3 ~: h/ o$ r+ x) M u out EC_CMD_PORT,al, _8 E: h7 m/ M" X2 t+ n
ret
5 U) t" i8 {" Y# ?
. |! f) d- X* W7 wwrite_ec_data:
0 N! z5 h6 g! h0 O% L* F! V mov ah,al; X2 N& J+ m2 k6 U8 F
call pmuWait4IBE. Y/ M8 V. X* {/ q
mov al,ah9 g" x4 w! Y5 O
out EC_DATA_PORT,al: h8 o7 s4 U% ~1 {0 Q# G E9 t
ret
0 c1 t7 l. w2 d5 P# `( i7 \0 B- U* b2 g9 [* J
read_ec_data:; d8 P2 x0 W4 A2 w$ s! a4 C; F
call pmuWait4OBF1 r! x' H7 v- w2 k; ]4 W8 @3 Y2 {
jcxz $+2
- S6 F( p/ c# i) i jcxz $+2+ _7 }0 j0 H4 o2 B8 `
in al,EC_DATA_PORT# N8 F! n3 x3 t1 G- S& _
ret
. Q, m8 L' e3 o6 T
' S) M' q# M* c! \7 [pmuWait4IBE:
g0 P) f6 i$ X- I JCXZ $+2 Q. |, c: r5 k9 x6 }' `
JCXZ $+2 & O7 s& `4 L+ _6 Q0 E
IN AL,EC_CMD_PORT ;Read PMU status
( l7 ?0 t5 a2 i* p2 ^6 o TEST AL,2 ;Is Input Buffer Empty? 1 \5 q' f7 t- N0 `
JNZ pmuWait4IBE ;Jmp if no ( D' l* Z7 @ D+ K* t8 I
ret0 [1 m) N# q6 [( ?: z% K
; i7 i' ]* q4 }4 i4 C& v" }
pmuWait4OBF:4 {1 R) l( ]3 M7 z/ g7 R9 D2 v; W
JCXZ $+2
, i6 j7 G5 \. N( w( l JCXZ $+2
3 S# I" _6 F% p IN AL,EC_CMD_PORT ;Read PMU status
7 s0 G! L" }8 V4 ^ TEST AL,1 ;Is Output Buffer Full?
( ^+ Z8 u- ^1 Y, d JZ pmuWait4OBF ;Jmp if no
% K- E _ j& P! y$ R/ Q) j ret, V6 f8 L/ m3 p- I
5 B% {2 i/ X. ~# E" q, L, c: vcode ends 5 p7 O1 K6 F8 J
end start
5 }7 u0 y, }$ s5 X& \9 u, @$ R5 F& Z; Q& V Z( I
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。" C: f8 ]; |7 [4 j5 r+ {, O
# F. | `# r5 m" ]; W2 u* _
[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|