|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
2 a' n4 o' p2 f- s可惜读取不到正确值。一直读的是FEh......
, K5 ^# w5 a. h; A' x. F8 L, Z: f希望各位大神能帮忙看看,指点一二。小弟先谢过了。* V" A+ L# Z) v7 X) G7 p# T6 M
# k( z4 ^$ s T6 S0 X
代码如下(masm5编译链接通过,DOS下运行):6 h% f% B) M8 P% T2 F. R
6 O& {' W9 T3 h8 Q/ \; @
assume cs:code,ds:data, I0 X2 T0 m2 ~" d. E
, |9 { c. u" t# i" r+ c/ cdata segment 8 F5 U' B$ y% t
EC_CMD_PORT equ 66h ;地址端口 1 u5 N$ U. r& G b
EC_DATA_PORT equ 62h ;数据端口 9 P! A' n$ w8 G+ ~& n( Q- T* P. j
CMD_READ_EC equ 80h ;读寄存器命令
0 N! |0 M4 D& h3 |) S) V8 w/ } POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址 0 L4 {( e) B" r/ I( Q' D) e
data ends: ?, D! h7 q6 |" Y: D# Z8 c4 t
8 b, n/ q! O# D$ t Y+ Lcode segment 4 }- ]8 y* N2 W$ D
start:
. s- B. ]) W: X3 c' j! f mov al,CMD_READ_EC
, H" O" ^% `# p) s. ]2 I call write_ec_cmd ;写80h到0x66h端口2 L) H t. N+ t3 l1 g+ I3 D# m
mov ax,POLLING_DATA
* B* O! `9 f/ w, p, q' ~/ ] call write_ec_data ;写ECRAM地址到0x62h端口
* `7 u" }2 J% v/ z call read_ec_data ;从0x62h读数据' N7 G1 T( z2 [/ m
- _& U. y, w; D mov ax,4c00h , Y, M! h- p2 A b3 H
int 21h# T0 G. I2 K5 z; y+ L- f, P
4 ^. s! Q2 U, g( w& l% z5 l* e% a3 swrite_ec_cmd:7 ^( h) s4 [4 m5 i
mov ah,al b3 O D [3 C( W5 z3 W! C1 c) ^4 N
call pmuWait4IBE
: N% Q+ u! F) t& Q. u8 r, m) D, U mov al,ah
9 G) s. a5 ~# w) R- V* t out EC_CMD_PORT,al$ g$ }+ ~: Q' z
ret
! V g2 f$ M" N; e: W6 R2 a( ]8 ~
/ n$ }0 p, c9 P5 C* swrite_ec_data:1 H9 r2 k8 e) T5 X
mov ah,al
7 e/ g- {7 |5 T1 w& s$ W6 u! @; e$ I0 E call pmuWait4IBE
- _* `( h! {- Z2 g X$ K( k+ e mov al,ah' K1 z# ]8 t, z" H% m$ A
out EC_DATA_PORT,al; }5 `& T, f3 `' t- U& f" X3 q
ret
7 h5 j. g0 ~& z* S! A+ Q2 M
. E3 n$ r0 c0 j7 e# x* jread_ec_data:
+ _% T5 u7 z4 o! x4 l. \ call pmuWait4OBF# ~8 L& s/ e4 c8 w n- f9 q" V
jcxz $+2
) p( ~: Y" P1 O1 V jcxz $+2
# q8 f9 U7 T$ |2 `* Z7 { in al,EC_DATA_PORT3 _+ D7 @ `% r
ret
+ M& W }6 O, e/ a 6 h- s1 }$ H6 G& O. `7 l. j
pmuWait4IBE:3 `. A7 r- D1 ~/ `2 s* V
JCXZ $+2, F6 X% {! s: R: }# }& \
JCXZ $+2 + d; E# K$ \8 `: ^) d/ L" v6 p8 k% V
IN AL,EC_CMD_PORT ;Read PMU status
6 j' k/ t5 C7 O( n& Y TEST AL,2 ;Is Input Buffer Empty?
0 s" ^1 f* H+ p: g/ K JNZ pmuWait4IBE ;Jmp if no # a/ ], D- h1 E9 M. m8 |- n/ ^
ret
# T6 N4 `8 {# n, X4 A1 O7 }1 G$ k8 [2 F$ S+ }
pmuWait4OBF:
6 L& I3 V' n, t( { JCXZ $+2
) M9 e R4 G9 p. k2 @* E8 G& n: a JCXZ $+2 / e; b3 V: I8 \% x, k$ P- Y8 @
IN AL,EC_CMD_PORT ;Read PMU status
( b i, U; \, I2 D& H0 q1 u# [ TEST AL,1 ;Is Output Buffer Full? 6 ?% J% d6 D6 z" e* x$ X: n
JZ pmuWait4OBF ;Jmp if no 7 m! B% ]0 f9 x- }
ret
- Y% k. ^) k& k
9 z+ Z5 g7 [, |, W$ d" M: Ycode ends
) A, E0 |2 l+ [" @end start
( e" o* U' y0 i" R* ] t1 v. t) V8 }) t/ o* k
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。
5 q6 ]6 u2 M" x
! J9 X, Z- P s+ V [[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|