|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
4 j6 P# @2 e" c9 B可惜读取不到正确值。一直读的是FEh......
, Z4 Q8 v" c7 S r2 f/ i9 f* i V- b希望各位大神能帮忙看看,指点一二。小弟先谢过了。
: W7 a8 O8 ^! h& C% t0 n6 F4 O ?4 L/ h7 z' ~& m! w! S! R
代码如下(masm5编译链接通过,DOS下运行):
: T* Y6 s J4 l* X/ q- N, W7 M! n- W Q# g% q8 r; Y
assume cs:code,ds:data
& ]2 _! n2 R- D& N; X p, @
S& g4 S/ O4 o9 i* ~; udata segment
( K/ y3 Z7 A8 F9 c) M EC_CMD_PORT equ 66h ;地址端口
- @' t, }9 x2 m4 b X* @$ ]1 D EC_DATA_PORT equ 62h ;数据端口 ) z4 ?1 P# ?! Y9 J& S& W5 d
CMD_READ_EC equ 80h ;读寄存器命令
5 I9 a" V) i5 e; t: ] POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址
% x+ T7 d$ C' a8 I% R# Rdata ends& @5 i; n4 a8 V& g i N
( i$ Q" L" e. h: o6 E% ~code segment 0 z$ o/ e7 S8 A |8 k8 w, l0 b
start: + G. `6 V& z8 D1 J0 A7 _8 [
mov al,CMD_READ_EC
% h, I5 u& a. ^9 D* E+ V+ f/ @ call write_ec_cmd ;写80h到0x66h端口
& `& W N; B) R3 O$ ` mov ax,POLLING_DATA
) M% P C K8 c' d2 Z! W call write_ec_data ;写ECRAM地址到0x62h端口
: H" e6 J, u$ B. | C1 Z- l" h call read_ec_data ;从0x62h读数据
( j8 p2 y% n& W' l* |' p# Q( A" ]0 V. _7 w# `5 M) |* B" }
mov ax,4c00h
8 s* W) u0 Y7 K7 y' {' G" e' Y7 r int 21h% ]% _3 e9 T. a4 s
! ^+ ~5 b5 D2 ?8 _3 x! z8 S( t6 `write_ec_cmd:: |0 \1 ?- _) u% @4 h$ o
mov ah,al _5 x) {' T2 z0 F
call pmuWait4IBE2 a# x: S. t( d, H+ e. I5 Y
mov al,ah" l% a1 W7 ~) |2 T) f
out EC_CMD_PORT,al( g+ K7 o) v8 l) }3 n
ret* t' t) h' h+ h
$ H2 U+ \- E! j0 Q$ Nwrite_ec_data:: t {( b4 i; X8 z0 y+ [6 _
mov ah,al5 E9 N6 k" Z% R, K
call pmuWait4IBE
) H; @! G! ]9 [5 ~8 y mov al,ah
+ o0 [9 ~) W1 I0 g5 s, v out EC_DATA_PORT,al/ ?) L( b4 U$ S2 _% x
ret$ A |! e1 v3 Q# B D
) ]" \4 {- }# Y4 S5 y; u( G. Gread_ec_data:* o8 }+ g ~6 \
call pmuWait4OBF
4 A7 y4 S" w% h5 h: m( Q jcxz $+2
5 r) m' n# M& w& G) F; ]0 @ jcxz $+2
1 _4 V8 W; }4 x4 o2 g" q6 F7 b( ]5 R in al,EC_DATA_PORT
5 }% e- B* }1 S6 f7 q ret
: h y; o. F: E% z- `) |! { T $ j9 P8 |' }0 \9 T
pmuWait4IBE:
& m/ A2 Z6 O1 T7 ?0 Q) X: ]6 E JCXZ $+2
* u3 v% F; [3 n/ U* ~8 Y JCXZ $+2
: J( c* R6 D# X9 D( v7 n IN AL,EC_CMD_PORT ;Read PMU status + h8 |& C2 F/ ~4 U- ~* \# R. {5 U* y6 l
TEST AL,2 ;Is Input Buffer Empty?
# j) u7 ]" T" L$ U" |2 j JNZ pmuWait4IBE ;Jmp if no 1 `, F& I* N+ u" C2 q; `$ g* D4 V, Y. j
ret
% Y& H0 e0 ~9 u% E) s9 @! m/ R7 w3 w/ P4 p
pmuWait4OBF:
. l, n' g* R6 b JCXZ $+2
% J: X$ D. W+ H( d6 i JCXZ $+2
; l& x5 @+ l+ \% f* r IN AL,EC_CMD_PORT ;Read PMU status
0 p4 X3 O: H. d5 b( s# E( [ TEST AL,1 ;Is Output Buffer Full?
# m4 D( a5 G5 M JZ pmuWait4OBF ;Jmp if no
2 {+ \% x* ^$ @& W! C7 y ret3 e2 d3 Y4 L$ t! E/ r
# S* E. e3 F% D$ C g3 ?4 {
code ends - H! q, j# _2 P+ V$ p
end start, [; Q4 k5 m3 K8 G/ q" }' y
7 \& K I4 ?, B; W* _还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。# Q6 v' o3 ^- N
9 R/ \; e( _0 X[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|