|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。+ k0 U5 C" D( m
可惜读取不到正确值。一直读的是FEh......
. y8 B1 M( Y8 ~9 i4 r& e7 z希望各位大神能帮忙看看,指点一二。小弟先谢过了。
0 D* P/ z# t0 u& ~
% |, a" c. m# \代码如下(masm5编译链接通过,DOS下运行):
3 v% L1 i! l# R% L+ Z8 K1 C
7 Z m9 u* C7 Y! r2 n7 ^assume cs:code,ds:data* I7 V, i% w" e/ J" \7 f9 O
2 W& l1 e9 H) I8 i; q: jdata segment m. T5 y! L! [ R
EC_CMD_PORT equ 66h ;地址端口 ) X6 A. `6 t8 D$ D7 v* X
EC_DATA_PORT equ 62h ;数据端口
8 R' q Y4 k2 [4 f6 C Q CMD_READ_EC equ 80h ;读寄存器命令 3 S* \- X5 K- V' x# w
POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址
1 r: w6 `) z/ W- _6 B% {8 xdata ends$ v) s. Q! w2 {/ K0 b
/ ^$ n5 G' j% s* T# e' y$ {" s/ m3 O$ rcode segment ) U! W& E8 O/ M) b- V/ j, g7 g
start:
! M, }% i9 n9 A |, F( }! u0 R! J( U mov al,CMD_READ_EC ( I8 W$ r& U+ J- `, B) s
call write_ec_cmd ;写80h到0x66h端口% o2 n" F, ?* |5 @8 S
mov ax,POLLING_DATA
" V+ Y' W6 A% d+ N. d; Y8 Z& ? call write_ec_data ;写ECRAM地址到0x62h端口
) ^5 D, H3 o v$ _5 l1 a) J* Q call read_ec_data ;从0x62h读数据
' W- y* M5 `' x2 |, ~% P8 v+ }% w
mov ax,4c00h
2 |& e2 U# ?, I; g5 R# E* X int 21h
) q) a" v s) K! ^7 y$ i9 d' F8 K: l0 w6 N9 z( v' W9 c
write_ec_cmd:
/ Q! n, S3 O3 A( x' o$ V mov ah,al" O7 v) l) Y$ E1 E6 K* H0 z
call pmuWait4IBE- F7 h2 ]/ ~; `: o9 s
mov al,ah: O( O) o, Y5 ^3 _2 s- |" ?
out EC_CMD_PORT,al
( U; j% D; P `- x7 @5 I1 y ret0 j! P. C6 E0 Z$ A9 I
* ]$ M. h8 N9 Y4 M/ h% g: R
write_ec_data:' c, _4 |& ^; ^ g
mov ah,al
3 k' R2 F- \' [# o- r9 ~ call pmuWait4IBE( w6 C- B5 a3 h, \
mov al,ah
3 T- @9 w# o! e4 e9 H out EC_DATA_PORT,al8 q- Q' H' D/ Z/ C/ R' r
ret" K4 I+ e( P1 s
; Q0 h/ n) ]. v5 y6 L7 e
read_ec_data:6 x& d+ S: `! v( X
call pmuWait4OBF
/ ?6 b- e/ s& c jcxz $+2
$ P1 s7 I' X& I* a: e! m0 p jcxz $+2! @/ w7 ]+ c6 l( O. M
in al,EC_DATA_PORT/ {4 ~. ]4 t& U4 y: M$ N
ret
4 V; h6 E* @8 i( Z$ w * w9 v/ F; B( \. S, K2 w
pmuWait4IBE:
; O7 ?7 ~: v2 z5 S JCXZ $+2
9 s6 `7 V4 ~( F JCXZ $+2
: B$ t5 C+ Z% n1 S$ B! u IN AL,EC_CMD_PORT ;Read PMU status
4 X& x- ^( K/ Y& g7 x: S. i3 \ F2 p TEST AL,2 ;Is Input Buffer Empty?
- b0 ]9 V( N* T) ]* h; P JNZ pmuWait4IBE ;Jmp if no ( @. N) }" M2 Z/ g( N
ret" a3 w2 o& l5 I/ `% A3 J# }1 L
$ ` l Z7 g. q- C2 x* u& B5 S, }
pmuWait4OBF:5 ^2 ~& k6 J) F5 \3 _4 h7 f( z( |
JCXZ $+27 L5 ^2 C( T. a9 _3 I3 ^
JCXZ $+2 ( i4 j5 ^3 N$ n) e8 m: S9 _
IN AL,EC_CMD_PORT ;Read PMU status % \- _$ |0 N [' o+ W
TEST AL,1 ;Is Output Buffer Full?
0 H% U! Z6 k8 k1 L! F/ [5 y JZ pmuWait4OBF ;Jmp if no
% e4 w% K$ o' k6 S1 |4 q ret
/ \3 p; L/ g/ _ ) W/ B+ J6 S4 c
code ends
; @' h* s0 l8 q1 y$ G! W7 A$ I9 m4 }; Yend start! L8 H! C7 f2 K: b
5 h# N% F/ A& w; F5 h
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。
* R# E/ w y0 |: p% j/ P/ l5 g
& k- g* ^8 W& D[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|