|
|
小弟根据本论坛的几个帖子,用asm写了一个读取EC RAM的程序。
$ B) e# @* t; r; p( f. [$ Q- a可惜读取不到正确值。一直读的是FEh......
3 R* z+ d A) l0 L希望各位大神能帮忙看看,指点一二。小弟先谢过了。/ t5 X' \9 F- ^# f2 e
' a4 T U0 R- z* W2 E6 D
代码如下(masm5编译链接通过,DOS下运行):
2 w: D, a/ ?8 ~* i1 }+ f8 ]2 k' o" A f8 m; U2 u
assume cs:code,ds:data) I+ m1 G# g& K0 H0 y6 m& o0 X
( v d% `( {2 j2 x2 c6 m5 idata segment
, R# [/ Q' ~$ o8 b3 c! O EC_CMD_PORT equ 66h ;地址端口
# z! Z+ R5 }' W j0 Z! p. m% p EC_DATA_PORT equ 62h ;数据端口 ) f" P7 J5 @9 E; ?
CMD_READ_EC equ 80h ;读寄存器命令 9 d& Z" i v# O" E G) L' c% [
POLLING_DATA equ 130 ;EC RAM INDEX要访问的ECRAM地址 1 z6 a9 h9 j) e- e* n' y
data ends4 U, G+ l3 B( k2 z
6 \) o/ ]3 y( kcode segment , ^4 V1 h3 U& O/ Y
start: 4 M1 K* n) m. Y) H
mov al,CMD_READ_EC
# P" f4 w3 t1 {/ e9 x* \" c call write_ec_cmd ;写80h到0x66h端口
* L% M5 }. Q2 p, N4 c: c. J: ] mov ax,POLLING_DATA
1 V& }% c7 n3 K4 P8 ]" c3 Q call write_ec_data ;写ECRAM地址到0x62h端口
! [8 M, T" G( u" G. y call read_ec_data ;从0x62h读数据" i* B2 b/ V8 |2 p0 @
# R3 X) j0 P C/ x
mov ax,4c00h
: ?8 X+ {/ k; t3 V int 21h5 ?1 V7 ?! V/ z' Q e1 e0 i) |
+ i& i5 C3 I0 J2 @$ C! c- p( L k8 S
write_ec_cmd:
: g% E) x0 e# w mov ah,al* P; F! ~3 C8 r) S- _
call pmuWait4IBE
( V0 y' w' L1 n5 Y mov al,ah% e8 l5 h+ Z% u P* V) l+ M2 G
out EC_CMD_PORT,al% r/ g1 f' i/ P8 c
ret! c1 D( }+ ] e- {& Q! J6 o
7 g( k# O2 d4 E0 c) f& `, e
write_ec_data:0 Z* J0 n% j2 I
mov ah,al
1 a g( L& N6 D7 g call pmuWait4IBE, W- I& w4 V: Z. R" y% B2 |! y
mov al,ah4 P; v4 L8 j1 U, [
out EC_DATA_PORT,al
5 Z9 P6 U) i5 u1 z) c R1 x ret
0 l9 p4 h; K( y' d0 O) F/ r
& V1 L) ]7 y, k1 J0 L: M8 B" J& n7 wread_ec_data:
, e. Q D0 p/ `/ w4 l call pmuWait4OBF
: w4 v8 I& r5 g# E( _' h jcxz $+2" N2 t) c5 r+ s- q! T
jcxz $+2- \3 Z7 T8 U8 N) x: Q0 x6 F8 g
in al,EC_DATA_PORT0 X1 ^' \. O5 {; C: V' v6 ]
ret
( L$ m: _6 u& I2 {- {. E# u% H 0 Q; v9 A! v4 s. X" j
pmuWait4IBE:! b. j* |. ?9 f
JCXZ $+2
( F8 N8 m1 z& U/ e V JCXZ $+2 . c0 l$ L" [* _7 a# O
IN AL,EC_CMD_PORT ;Read PMU status
2 X1 R+ ?7 A7 R0 u0 ]3 w" ` TEST AL,2 ;Is Input Buffer Empty?
+ n! @4 f8 b! p( Y" Z' y JNZ pmuWait4IBE ;Jmp if no
: ^' @. d1 P3 i ret4 A- K' [/ v' N, w) G+ ?( b
! w! \# n' f, E! g' G% _pmuWait4OBF:
- o2 s+ s: t: n- C) p! ~- _ JCXZ $+2( a5 l) d0 J: e( L
JCXZ $+2
) O* a( c4 Q7 n2 `4 r' A7 ~- I7 U. C IN AL,EC_CMD_PORT ;Read PMU status - Z5 }/ l) A m, L5 A1 ?
TEST AL,1 ;Is Output Buffer Full?
- q, t6 j9 r$ l( n8 z" c JZ pmuWait4OBF ;Jmp if no
4 J4 }; A( n! u0 t+ \! j+ N7 [* ` ret0 O$ K" G4 d- \/ t$ t% V( O
0 V5 Q& ~0 M' M7 x7 [7 m
code ends
! e8 G" E% i; q3 y% l9 w: Z9 P+ Send start5 ^ E& T/ ~7 B# }; P9 Q- w
7 ?) I) _5 k. j0 T; h4 a! ~
还有一个问题,就是像RW这种类型的软件是怎么做到稳定读取EC RAM数据。也是使用62h/66h端口么?望指点。。。。。。
/ ~- o* g$ }- J% ?8 B3 k! u; }; [( W/ B# R$ H9 |! s# g6 G, J- }
[ 本帖最后由 yejieku 于 2010-5-23 01:43 编辑 ] |
|