|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。* ~" y4 n( h1 ]* _4 t1 ?; B5 e. L
可惜读取不到正确值。一直读的是FEh......4 Z9 u ]' m& J5 }$ ^8 {2 | a1 ~
希望各位大神能帮忙看看,指点一二。小弟先谢过了。( h; h: U- S# S- W
, f( N! e% p5 Z6 \! M2 T+ p" U/ }
代码如下(masm5编译链接通过,DOS下运行):/ h3 r* H0 H( B
; D0 ?" d& z9 q: G6 r* l- O& s, x0 [assume cs:code,ds:data
3 h8 {( h, ^/ |: F2 U
0 [* i% k0 i" {' w( rdata segment % O+ U, I6 B/ ]5 r
EC_CMD_PORT equ 66h ;地址端口 ; h5 A# O5 G& \- k9 t& d2 s. [0 [
EC_DATA_PORT equ 62h ;数据端口 ) F' t# q2 N1 w/ ^" ?( s) H
CMD_READ_EC equ 80h ;读寄存器命令
3 q/ F6 D2 @1 s5 ^. t N- W5 K: J POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址
$ w3 Y7 _# R& w& w& l, xdata ends2 A/ b9 a/ ?- U3 A* p
( j, a2 ~" D9 b: J; b, pcode segment 1 ^$ T9 X/ s% O/ I6 _8 }
start:
* Q0 [7 w1 w7 |1 e+ \ mov al,CMD_READ_EC , X' _. C. b- w3 z4 q! V8 j% z
call write_ec_cmd ;写80h到0x66h端口
$ Z: G. m9 [1 Q4 s" ]( q# L3 O mov ax,POLLING_DATA 5 ?$ s; W! |% w: k, o
call write_ec_data ;写ECRAM地址到0x62h端口- n3 D$ d3 e* k5 }% W5 s
call read_ec_data ;从0x62h读数据% L: l3 J% ~3 X2 e1 |$ v9 p
0 v- N; e- X6 l% l8 d4 y
mov ax,4c00h
9 r# a: H! p( ]6 }$ P5 K) Y int 21h
6 I1 k& U# N* s. }5 [' K# j0 k: V# F+ N4 `$ ^/ o% v# |9 l
write_ec_cmd:0 \6 c$ {$ V2 n* X0 J
mov ah,al c$ V) f Q4 A7 ?! V0 j! H
call pmuWait4IBE: h; `- |( e5 O1 K- z
mov al,ah# L3 R/ F2 G3 K- _4 ~
out EC_CMD_PORT,al
, u$ R4 t# T2 k. ~: F Y& r+ s ret
8 s4 {, Q9 A5 W$ E" V; E( k2 j$ S' J& m7 S/ }
write_ec_data:
" T% \& A3 B: h ^# {! q0 M mov ah,al; d$ Y, E5 ^* v3 L& S# l
call pmuWait4IBE; E8 j# f' t4 ]: B4 j9 E. Q0 b0 E6 @
mov al,ah) r2 v6 }: n4 F0 J: c( Q
out EC_DATA_PORT,al$ b% t9 [# y2 N' q
ret# B2 g, u& ]$ b, x
* ]" `6 N! O' t- M, L5 V" b" }read_ec_data:( k z, V+ O8 `
call pmuWait4OBF
/ K1 E | x+ l7 @' V jcxz $+2
" s* ?8 \- _3 \7 b9 ^* Z jcxz $+2/ p5 O P: \/ P) N9 U& T
in al,EC_DATA_PORT
5 o' P4 I3 A& \% B* ^, ?) l ret
0 R5 z7 k7 ?, k2 ?) m$ D9 C
6 d# L5 F0 Q' w/ h8 xpmuWait4IBE:' P0 z& Q, @; c' ^- s, A
JCXZ $+2
3 n7 g# \8 \' s6 F JCXZ $+2 " H' [$ O K4 \* }; K
IN AL,EC_CMD_PORT ;Read PMU status 4 \: X) E! z: c' ^$ \7 v
TEST AL,2 ;Is Input Buffer Empty? . q1 b4 y1 {: \# _4 }) R5 A
JNZ pmuWait4IBE ;Jmp if no
: l9 h$ F2 b( }8 C ret
* d% R5 O6 h' a2 g3 k0 |: ^0 r2 L# H" j2 p! X% r6 {
pmuWait4OBF: H& [! ~7 a. l8 V5 p0 q
JCXZ $+2) F* @: P9 }2 X* E E, _
JCXZ $+2 * ~# @ h) i% `7 |& z
IN AL,EC_CMD_PORT ;Read PMU status
( D( o& j$ H) V# s8 M, J TEST AL,1 ;Is Output Buffer Full?
' W/ X4 V: N, p% h, e; h- c JZ pmuWait4OBF ;Jmp if no ; ~. U: r) a- v+ V: R+ _
ret# R+ x4 D( G2 D
: ?' Z2 I8 `* K f( k. C |code ends
8 M* @% q; `/ @3 ]+ Mend start" {5 _$ F5 b0 r# p
7 U4 ?8 I2 G8 A( w还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。) l( ^$ U8 ~# ?- `. D& G J
- } a. M3 {4 V# ~: s$ l8 _8 h( v[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|