|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
* e& w8 i6 t! Q# n+ K. u1 {1 ^9 W可惜读取不到正确值。一直读的是FEh......, Y' p9 O' [. `8 I+ i
希望各位大神能帮忙看看,指点一二。小弟先谢过了。
- b6 K* c$ I. S6 a
0 h. Q- ?, _( T; r$ V4 R代码如下(masm5编译链接通过,DOS下运行):
0 b0 G K& l! G" e- v+ D! l, O v
assume cs:code,ds:data: f6 g9 o; m" u2 C* o, ^
d; C! v# D# N) \5 | Z6 Edata segment
# C% s; l6 H, K$ Q3 M/ A EC_CMD_PORT equ 66h ;地址端口
0 i7 u' F/ l; W; b( e1 }6 b EC_DATA_PORT equ 62h ;数据端口
9 T/ Y% M0 t/ G, l CMD_READ_EC equ 80h ;读寄存器命令
; w d' W! H; ]/ l! e6 H POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址
! O9 g8 @2 p. [: [$ Qdata ends, i/ l/ a+ ^4 d; p$ q" Y. _
+ p: ~3 l) W* C, A% C2 h3 t5 F' H9 X
code segment ! b3 c) N% Z; K9 B5 ^) @# A
start: 0 s* v7 x: x/ k+ y
mov al,CMD_READ_EC 7 ?+ B- S( X% X4 ^, n' ]2 ?
call write_ec_cmd ;写80h到0x66h端口
, p$ X* J( r2 `, D mov ax,POLLING_DATA ' i6 ~* X2 s4 c: X4 p& j
call write_ec_data ;写ECRAM地址到0x62h端口
6 \% Z6 e, W/ m O$ t0 c5 G. k call read_ec_data ;从0x62h读数据
( L# E: H% L) R& d! }1 K0 E/ m* {- }
mov ax,4c00h 2 }" E, O$ M8 ^# _% K! [% ?/ b
int 21h
$ z! u+ F5 P0 p' I7 R) ?
q, _7 B% c( _write_ec_cmd:9 I% e' Y$ ~" B# D
mov ah,al
; @6 H# X: f- A- e3 j* S1 p/ J call pmuWait4IBE9 ]7 t2 o4 s; c3 q1 N6 F
mov al,ah
1 t1 E' l' t& O. R out EC_CMD_PORT,al
$ a$ T$ e. B6 v! j2 } ret4 O; y! H' W' r P: g+ u5 e
/ V) R9 g$ H& E4 S, Iwrite_ec_data:1 l) `/ d; b. h9 I4 w
mov ah,al Y2 J7 N/ e6 c
call pmuWait4IBE
: i( Y# c# A- t! ?& ? mov al,ah) l' e3 t; F8 v# b
out EC_DATA_PORT,al
- ~. |; O! g/ Z# U ret: ], B, d4 @3 N/ d' D! z/ r6 x7 X3 ^
: H/ c( b0 y9 W6 U" O: R
read_ec_data:
5 o& U4 q: T5 ~9 |) W. S call pmuWait4OBF
: J9 b4 [6 n" u+ l5 O3 U$ a jcxz $+2
* y4 w8 b8 h! S jcxz $+2( T9 D& ~7 r9 I$ {2 W" ?
in al,EC_DATA_PORT
0 g3 O" `; {4 u9 V3 j0 e8 h" c ret0 l* c/ L& z5 S/ U* M* k
' v" s+ S) o- n* {1 _6 l" UpmuWait4IBE:
- q+ t8 @# _+ b5 E% U JCXZ $+2# i3 ]5 o3 F# X
JCXZ $+2
) B+ |# Q+ Z: X! S* @# ?0 i7 J IN AL,EC_CMD_PORT ;Read PMU status . D) F# e6 E2 N+ Z4 F% j8 }
TEST AL,2 ;Is Input Buffer Empty?
3 {7 N* U$ q2 R0 K: j# |# C JNZ pmuWait4IBE ;Jmp if no
4 s X* @ t/ g# v/ I7 S" Y ret' b$ Y/ r) O4 b* A3 ?
% v; Z- k" H6 ]: h s2 j3 V
pmuWait4OBF:
' D3 U h- D( G: V5 X JCXZ $+2
4 `% m5 o/ N( ], ?% G" p JCXZ $+2 2 W% b5 H' H8 y$ O2 h1 E; X
IN AL,EC_CMD_PORT ;Read PMU status U- \7 S h* |+ X/ j7 c8 U
TEST AL,1 ;Is Output Buffer Full?
7 G- D3 h+ h" X/ q( l: P' \ JZ pmuWait4OBF ;Jmp if no ( p% v: [: z- Y6 I" d1 c' m" R
ret
; F, c4 U5 a M( |- U% N9 D5 o1 [
6 [# Z4 f6 c2 }, Rcode ends / ^" c. L6 X" u- V) p) j
end start
# X+ `8 q# ^; Q* Y/ _$ I# F/ {4 L5 L8 W7 i! t8 V* X% }$ P- p
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。
' H! @/ p% R- h7 _2 S9 U5 i0 V' l
[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|