|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
; K- P7 I& H3 [ R; E可惜读取不到正确值。一直读的是FEh......
& P; l7 W7 A$ O: k7 r希望各位大神能帮忙看看,指点一二。小弟先谢过了。
, r/ m5 ?' D% _8 h" Y7 e
/ g' \- d% B6 z, C& n& R代码如下(masm5编译链接通过,DOS下运行):
6 k' m: U4 _9 T* F7 ?0 V7 T# d; Z" w% E% J
assume cs:code,ds:data: C" N& [2 E5 o1 s$ U
) S9 a6 j: C5 B* L4 i) e* a& R( \
data segment + m2 _5 K/ G* ^% M+ ?1 Q
EC_CMD_PORT equ 66h ;地址端口
, P5 P O7 ~3 Z% n EC_DATA_PORT equ 62h ;数据端口
( c1 t* ~: `# l9 J/ T5 S CMD_READ_EC equ 80h ;读寄存器命令 , N c4 I1 X& B2 R! U$ J) p
POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址
. G _9 j4 x6 I. ddata ends0 i' o; s! O2 D
2 d2 Q4 o* H1 c% `code segment
2 \9 z$ J3 H l7 j2 O8 a' Jstart:
4 a: r: \/ e. j) u+ B: g mov al,CMD_READ_EC
( F* Q% Z+ y( }* B: x" @ call write_ec_cmd ;写80h到0x66h端口" X5 e) J4 `) d4 p u
mov ax,POLLING_DATA
0 ?0 h7 ?; K" X9 H# Q, J) w* w, K0 a call write_ec_data ;写ECRAM地址到0x62h端口7 q" x0 w9 c" I* z: L
call read_ec_data ;从0x62h读数据
# L5 L0 Z/ b- Y1 `& X; T& q; V8 A( N5 w3 ~" ?5 J4 Z9 J: h
mov ax,4c00h 5 J/ G1 ~; {4 P! M
int 21h! D5 b$ M7 L( l6 z0 N) @
1 ?" V, h- P) ], D% a
write_ec_cmd:
" k$ @- N* f7 y) u) E9 q mov ah,al
$ c1 \$ J3 u7 Y call pmuWait4IBE4 @" G4 E' ?3 g, ^
mov al,ah
4 H( d! ?* n; v# @ out EC_CMD_PORT,al
@6 `* Y7 O' q" C" C& ?6 Q! C L3 L ret
5 h8 C& ]$ U6 P/ h: Y: i) k" \4 z) n% \; ^
write_ec_data:
0 ^9 L. o6 |2 t- W! J* {; A5 T. g mov ah,al
( p% p! I9 ^7 h! `, z; _# b5 R call pmuWait4IBE
' K# T" `* T+ X mov al,ah# c4 g( p# o# ]( |5 I5 B+ j1 @
out EC_DATA_PORT,al
+ j% o. M% P6 W- P3 V. v* V ret
3 S1 ~" Q% c# {; a2 A. W0 p& ~& ^6 a% |) H* z% ^
read_ec_data:% k6 n# d4 Y; ?4 l
call pmuWait4OBF0 w6 G1 i$ o( s2 y2 U R: N
jcxz $+2. N$ Y5 r$ Z1 ]( e$ K2 a8 d
jcxz $+2% P7 D3 j D9 G, Z! k" \
in al,EC_DATA_PORT
) \/ D& Q" S$ {* ?4 `, Q/ S ret2 q* }0 b, S" n# E0 ]
5 C) s& Z2 O5 t$ y9 q6 B
pmuWait4IBE:0 b* p6 Z8 P, ?. S5 X
JCXZ $+2
/ v( v( M/ `0 C4 `8 x JCXZ $+2 8 [" i" D( \) n. ~+ z" e2 g
IN AL,EC_CMD_PORT ;Read PMU status 0 Q; s7 O: {- V# h- F
TEST AL,2 ;Is Input Buffer Empty?
0 A: @* C/ o. x8 W JNZ pmuWait4IBE ;Jmp if no
- _) i' I2 h# F5 J8 ]& v2 U ret/ |5 y( Z8 m4 v. T9 r
/ s Y2 C( o- e3 X" Z! Y' I) ]0 c$ b
pmuWait4OBF:. C+ O) K' \; s- ?# k0 N
JCXZ $+2
, ^1 b4 o! C* I( v- h6 L! o JCXZ $+2 ; C% w, J O* D8 g5 D
IN AL,EC_CMD_PORT ;Read PMU status
1 C1 X) T1 t# E0 e D6 z4 A TEST AL,1 ;Is Output Buffer Full?
+ \1 v, w' a+ q6 k JZ pmuWait4OBF ;Jmp if no
) J( K8 X( J) t/ p% l$ k/ [ ret
& c; |9 @1 W' C5 j$ h 6 ^. A6 _0 q, \% d
code ends ( y" z6 Q% a0 ~! |
end start. a! q4 k4 T" w0 N) u a5 ~
# \/ ^7 {! |% U$ g$ ~% ^! a+ l1 w
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。
) R' C2 o# B$ U, E3 G A6 S) j
x! O2 x* u! Y }3 |+ z4 C6 d[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|