|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: 1 o% W2 K: f( d
5 _; I4 ? u u! X
.model small) `, [9 k, D7 z- l `; }
.386
# W5 E" d/ J; t: U7 O/ b$ Q CFG_ADDR EQU 0CF8h
7 m% y( M2 R3 t! T% g+ @7 p CFG_DATA EQU 0CFCh% H. `0 d* |" |4 W
SMBUS_BUS EQU 01 s: b5 {6 c& ^( q# }( n) P
SMBUS_DEVICE EQU 310 T6 h* U7 J m0 A; z4 b" T
SMBUS_FUNC EQU 3
! p& k3 N$ Z: {, C. v9 d7 v 3 |" C% q0 b. i. n& H
.stack 100h% U. Y" v# N/ u/ y: ~% j
.data) F& i+ x; C6 L& D j6 O4 P
base dw ? ;smbus I/O space/ K* }" z& ?. \* J' m5 S6 `- s
num db 0 ;byte select1 M- x0 g7 i( S
SmbStatus db ?
6 n9 `% ~" m7 m5 v
- ?) e) S( W8 ?6 m" M4 x .code
" X2 Y/ o( `2 {' |; C8 V; [ " u; C* L6 }% k3 x8 C% @, O
LF_CR MACRO" x! g: n4 N9 w# A
pusha
; m1 F% m5 I$ I mov dl,0dh
( S5 w, u6 L. d0 S; P v5 Y mov ah,2) l: `! s0 O. p1 D) d
int 21h+ B* S& r* s9 ~1 C
mov dl,0ah ;next line & j$ l; b7 G7 f5 i D
mov ah,2
- @6 H- @" X) j- |9 P% F int 21h5 ^% Q- h+ J) }( L. X
popa
* F0 [( n- T. R2 p6 j6 O ENDM, k+ \: c* |+ D6 M
* \# S% i# t4 m/ m( i* U8 Q9 f
8 M& _% ]8 {* O8 g3 k$ wmain proc far
) p8 H7 [3 ?: N& R0 D x0 H mov ax,@data2 T5 k8 c1 A" v8 `9 I) S% A
mov ds,ax
4 b, J! M! C8 P: w
5 z5 F3 F8 p+ L A8 l7 x" B( J mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
* L- ~( m' E- x mov dx,CFG_ADDR9 f$ N# P2 T! P6 ~; c0 p
out dx,eax
5 H" \/ R8 U, _' c1 P& K mov dx,CFG_DATA8 V7 V1 R3 W% E6 O6 h
in eax,dx
2 o5 t9 ?+ S5 f/ _
# M# L5 g0 ~2 m) C4 V shr ax,5 ;bit 15-5,the base address
" p" m; b# w" ^3 u) }# L6 ] and ax,0000011111111111b, z: s& X8 _0 W5 {# J+ p0 w/ W# `
mov base,ax4 M7 p9 s) p4 ?! i8 ^) a
( c- @( E8 J2 k I9 X
call ReadSpd$ c6 [ S; \) E8 Q6 ]
exit: R. L F. `1 P! G/ C& s9 u/ P P- K9 w
mov ax,4c00h* w5 C5 K! \3 C5 S4 `
int 21h" N' b5 H( \& @
main endp9 N, I' w6 H3 }( Y6 G( W6 ]% o; H
& L4 v$ h/ J! r0 j! B) u$ U7 ]0 e
* }) C G8 z. x% KReadSpd proc
- f& H9 ^7 O3 N X pusha
4 \5 t) ?8 B$ F5 x! l" vAgain:' F2 X$ ?9 U. a
mov ah,num, V) } q; ^$ W! d
and ah,00001111b `$ G2 g+ o1 i9 S
.if(ah==15d) ;CR_LF& q; t, ^0 [5 N5 h* Y
LF_CR
7 J! ~2 b& s5 F' T0 j6 A .endif
! T" I6 |: M$ W/ D" \( `' K ! z V! ~3 p/ F/ k# m
.repeat) |3 j2 u; l" b5 w. o2 t3 g/ E
mov dx,base ;reset host,claim host in use
( M b) |4 O. P1 o) b6 }, y* f, ` add dx,0
% g* ?# N* b- W E. ?/ y. X1 \ mov al,40h
/ }9 Q$ _" o1 K1 m' `- K7 \$ v out dx,al
1 B( B! q f9 A7 b$ m& ?6 y5 ` ; L' l7 L( Y2 p
mov dx,base
2 E' J: Y. ?' G7 X$ r+ S+ _( i in al,dx
7 T V: A' }& {% W0 d8 u [" [( A mov SmbStatus,al
9 E. P7 {. k5 x1 \8 n6 Z
7 u9 a( T4 }$ L) ^0 f mov dx,base ;clear all status bits+ F$ |/ i+ L, b/ ]9 Q1 J6 c
mov al,1Eh ;host status register: y, E7 M: d' z1 Y
out dx,al
) Y) @3 O( ]- v# t) g/ ^ ! N4 E6 s' x: J7 l
mov dx,base ;set offset to read
! s+ ~" u& G2 Y' ~8 W* g add dx,3 ;host command register# g- p: _, \7 G/ f: S
mov al,num* Z8 m' T, c3 |* O
out dx,al
- F* B! h! ^: m% M8 R# N : {7 x/ ~, O; S4 s+ K0 v
mov dx,base ;Transimit Slave Address register9 i( M7 N5 e- Z9 D1 ~
add dx,4" O }, g: k) {1 c4 s( n* Y
mov al,0a1h/ {! Y7 L. \) X4 ~
out dx,al
5 T+ E0 X4 [2 l7 S0 h/ ~
! p! b) W8 X- L n' O9 g+ N mov dx,base ;set "Read Word" protocol and start bit
( |8 ]8 e5 p! j9 J/ A& H! t( i add dx,2 ;Host Control register1 O9 @: e5 D7 U9 U
mov al,48h
2 n0 ]4 b" t0 w) \3 |* a. Z out dx,al
$ O5 @) Y. u; H$ i+ J& Q, W* H R" }' f7 B% l- {$ V
0 y4 j% _ A& k# v) ?- `8 D
# ?4 x2 V* d9 ~& w mov dx,base
- J& R( I; v2 {3 Y1 ? in al,dx
$ s' c7 A; {4 }7 C5 l& U mov SmbStatus,al6 e( F" h2 Y2 G1 d
and al,1Eh+ }) C( ~- P! K/ j; |
.while (al==0) ;check repeatly until any of
" |' }8 l: k2 g q; Z/ Y/ r mov dx,base ;FAIL,BERR,DERR,INTR
( d2 K6 Q2 {$ u1 { U0 T3 E. a in al,dx9 Z9 o9 W" j* z# H8 i
mov SmbStatus,al4 ^' b2 D3 M/ U& k; }3 ^
and al,1Eh # y/ O( [; E- {% x: `! ?- ~
.ENDW
2 I. B* S- L R- o, d 3 Y; X. I! |4 g- v4 Y; o4 c' T- B! P) s
mov al,SmbStatus # K. O; J3 D) f' p
and al,1Ch
; s4 \7 x( g3 F .if (al!=0) ;check for errors - D7 B8 d* `, j6 E: g* ^7 z$ H2 V/ T
mov al,SmbStatus: D3 K0 O# q, d% X. D. \5 _
and al,08h ; l9 B' s7 n% e2 @: L" f# g& I
.continue .if (al!=0)
! L9 \& |7 U& r% w: L jmp @F * `% m0 n* O. |8 {
.else
) _' t3 z+ k$ ]9 { mov dx,base
) O" _' \- A! [: E add dx,5h/ P" b# A+ d) n* W7 \, O7 |+ P: K
in al,dx
( p" |( U4 Z+ ^5 T' L call binhex
( I) e" P) [6 F/ |6 G .break9 o: l/ \3 u" C: T8 s" J
.endif
$ p, K, a( T2 w- N- m+ V | % j) K# L- Y" B+ J
.until (0) / I* P) ?4 w& e! C
w1 M% W, H! ~5 y( U: E$ ~* j
* L" }/ \( R3 h2 E0 K. U$ q
) W$ Q, g8 k# \3 P1 p mov dl,20h ;output a space
- _7 E, E+ O' U- W. D mov ah,2' t7 C) S; E! Z- ?
pusha
Q p Y/ A% u z3 d int 21h
; |+ u& |6 | m& c) q popa1 m& M7 U& {* _3 P$ ~ I9 V
inc num
+ w' K) `2 d& A; b2 a. E) B/ U. E) e; L$ K8 d0 I% [( j+ J
cmp num,80h ;get first spd 128 bytes 6 |& Z4 F9 v7 [
jnz Again
# @9 z0 p6 h+ ` + B' h, o0 b4 ~; ^
@@:* l, A2 T9 l! |3 l( d2 @
popa
0 Y2 h; ~* [! L0 D- S( N ret
3 I3 G) k5 a, ?7 kReadSpd endp
( A6 S) c) p) d7 a0 s1 C. h* F4 [7 k3 @+ Q3 a2 O
6 b6 K/ E& ~6 @2 K5 X: U# T
3 m/ K2 Y5 T! G3 w7 C6 k6 d
binhex proc / n6 I g+ J* B
pusha
. |" i; [( O- ?
. V6 K. G6 j/ V+ S5 w mov ch,2 ;2 hexadecimal digits to be printed
. [9 H4 e i6 d( Lloop3:
2 n5 p$ b' H0 m9 V6 f! t; R2 b mov cl,4 ;bits to be shifted! B4 J" w( i( z7 V0 N
rol al,cl3 h" I0 M M- }2 y7 |1 t
mov bl,al
/ F3 _: a$ V( R B. q1 Q1 G+ q: S( \! Q and bl,0fh ;mask the 4-bit Msb
) ]) m$ c; P3 E( C6 t add bl,30h5 ?* }0 G3 [8 P4 C$ G/ W7 ]1 G, J7 G
cmp bl,3ah
/ d8 l x2 F6 G; p C jl next1 ;number or alpha?
( \: ~9 @& a4 u, y add bl,7 + a2 I) G7 _) d, p- m; U) a
next1:
8 T, R0 L3 Q. ~- m mov ah,2 ;print one hexadecimal digit6 c" U" \6 x% i; t/ _) {
mov dl,bl
) I; j7 l$ |: \ pusha
v6 l9 c% _: a4 Q int 21h
\" n% p1 ?+ G `4 R9 y popa. O0 {% E$ v9 J; @6 Q- E
dec ch
! |/ a/ s& R9 n' E+ {/ [ jnz loop3
: J) V& t: ^6 v2 V7 G popa/ Q7 ^! ?2 k$ [! t) y/ p! P6 ~
ret/ u5 ~/ } W! L& R$ V3 I# Y
binhex endp
, s* a; h/ \4 h end main |
|