|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
+ C. Y4 k" i, n0 V& \
5 }- Y& W0 n3 ] .model small
! f" {0 m1 A) O .386
5 ?. F! w3 a1 u( A( } S CFG_ADDR EQU 0CF8h4 l$ U4 `) d2 o
CFG_DATA EQU 0CFCh
0 N8 Z6 R7 I {/ o' G9 R SMBUS_BUS EQU 0
4 x8 o5 G3 u; h5 V' E" f SMBUS_DEVICE EQU 31
( Y- h: `& Q- s# N SMBUS_FUNC EQU 3
' v' B; e2 \$ R1 `, |. j, n9 _
9 j( p& x3 Z- t3 _- [3 J9 e .stack 100h. w4 a+ \2 X: Y+ I
.data
9 \; A1 n- O( [- X- S/ Ibase dw ? ;smbus I/O space
5 r* T3 w4 A% Wnum db 0 ;byte select
" g% Q3 @0 C6 ZSmbStatus db ?
8 d1 c5 r5 H% c& K) [2 p/ f# c" p7 [& |: }
.code
6 g" T8 R8 i8 c- k Y' U 4 M; k4 _. M# {4 p( k% Y6 J) I
LF_CR MACRO* m1 |2 W7 R, m& u8 v/ A9 C
pusha5 L! F# f' x6 _7 z+ K
mov dl,0dh 6 J: j" h# f: S
mov ah,2
$ {4 p" H m( d int 21h
% _) p8 z4 _) O! }+ K7 Q' }1 g mov dl,0ah ;next line
& v. {" a2 f2 D# x mov ah,2
, r; b; [/ X* W+ i6 o' a int 21h0 P( i5 ~! f# L9 G+ [2 Y
popa + E3 U1 `8 D: p5 n! o5 ^$ e
ENDM* e; z+ w! x7 i6 \- t! s; O
4 l2 }, ?& T& N! D( F: ?4 W, G4 v5 g+ r
main proc far
) o: `; a5 o1 ^! t$ n mov ax,@data
7 i9 Z5 E8 J5 [ s% c mov ds,ax
1 w) w6 S1 @& G- s5 a . Z9 q Z, l! |
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
4 [6 N8 P! `" Z# T) f8 R# ^9 U mov dx,CFG_ADDR
: ?2 H1 X m, V: y# i out dx,eax! K, J/ y% t Z4 T+ u9 M0 f% ]
mov dx,CFG_DATA
9 V6 Y! S# d# H8 ?% k in eax,dx
+ j7 B ?7 e% F: {4 {9 \8 A ' f6 o2 |1 x) }/ N* j' q E
shr ax,5 ;bit 15-5,the base address7 h& d- X9 b. X- C
and ax,0000011111111111b
u6 o; t* T2 E7 Y; C, F6 q0 w mov base,ax
3 B2 z9 J, e, a8 x6 G: t, P- ^+ O 5 m, k7 S8 Y) z& J% i/ R
call ReadSpd4 e; D3 F0 N% [5 C# N7 _& L
exit:* T' b8 d+ p+ t6 D* T f
mov ax,4c00h9 o( O7 `) A& N" \: Z3 e6 m
int 21h
1 {; l* u, Y9 A8 E/ W4 b" hmain endp
( F8 m/ Z' Q' S" u N5 Z z: s1 \) w& L% {. D H K! h
# j! ]: a" j( f" A+ p* v
7 { J+ K( o, X5 wReadSpd proc
7 [& l2 t; I) s* R; o" D pusha+ i6 p! f- y0 _
Again:
" e& ?1 R0 r1 C6 Q3 k% {, v& d mov ah,num
( j# {! o5 f6 U* @ and ah,00001111b
" P a6 v+ ^" R! F" p .if(ah==15d) ;CR_LF
$ N$ ~" V/ ~" t/ v LF_CR
2 ^; A- ~" U; r" e( B .endif
7 H+ m: B- r# c) i# ^
3 M5 ]6 h- z. @3 t1 ^ ] .repeat: Z( S+ q7 Z. p" A- U
mov dx,base ;reset host,claim host in use
% c( ?/ g, @, Z" U add dx,0
% e2 k! E3 P, I0 A" n$ k6 u4 m( ^% I mov al,40h7 U9 M; J& v) s/ O% o
out dx,al
: d8 y# s, s0 g3 [( R2 l2 ~% U M
; r0 \# U$ c- p. ^# L+ O4 X( v mov dx,base 3 ]6 \8 o0 `1 V
in al,dx
0 p* f9 ^! `* |9 L mov SmbStatus,al
$ h1 B8 T* p- i9 [/ k8 V' S) B , F+ C/ b8 G! C* Y% @- x- q4 g2 j
mov dx,base ;clear all status bits9 [$ x/ U0 T6 V# J$ K; ]9 V# a
mov al,1Eh ;host status register* q* ~+ y+ |- F' o3 w3 h! |$ q5 a q
out dx,al0 w+ u& c% @& ]* j
' P9 l/ N- q3 v8 c; X/ q mov dx,base ;set offset to read
+ Y# Y2 z# t; ~* \ K+ H add dx,3 ;host command register
! a( [% b- t( t: _ mov al,num
( L/ ~ ] y$ L) ^" x out dx,al- q* F: B2 [& w) q2 W1 i: E
8 J2 }' {9 [6 V8 ?+ s8 g/ O$ q mov dx,base ;Transimit Slave Address register
. p$ ~: ^4 m( p3 j* g) o add dx,4+ E3 Y/ z/ k) I7 d, l: g" _
mov al,0a1h% C' F" c" L$ ^; _# R( q; y" Y% W
out dx,al1 w. W; |( n. x0 g* Q% a+ z8 h3 u3 p
+ e9 ~( b" a* p$ z* E9 `# P+ v' c! p
mov dx,base ;set "Read Word" protocol and start bit
$ c0 o7 |& i7 Y. B! w add dx,2 ;Host Control register
! h. h) w/ ~# v& E% A mov al,48h 7 H& Q3 j# X& s, H" N
out dx,al! y5 I9 L. l- N6 G: _' O, t5 z. H! A
, Z3 u H6 }. I" m, m' d
, q: {/ m' q7 u$ |: _& u7 z / M5 p# H* K# [( Q2 ~
mov dx,base
8 k! }7 [5 @; w; c8 S5 R$ } in al,dx6 K; W4 H! n! m" `( ^) \. W- A: }0 \9 V
mov SmbStatus,al i, @: Z8 v" |* ]8 e
and al,1Eh
6 f1 K5 ^! n0 `1 V! E& m$ U4 W1 } .while (al==0) ;check repeatly until any of! t6 K: J( g/ z7 f! X( P
mov dx,base ;FAIL,BERR,DERR,INTR& E1 L" N) G; h, _! [/ {3 C
in al,dx
& M- d$ ^4 ^ y7 b- V mov SmbStatus,al! P/ u& \: Z8 l# A' o- b
and al,1Eh 0 T5 z( V$ n+ Z) m- X9 J
.ENDW
) |) a3 I) o% h) ]" y+ h
; o0 D( [, w" l mov al,SmbStatus 6 `$ |( }+ X) A# B9 @% x" v1 @
and al,1Ch
/ W4 ]. a: \! p .if (al!=0) ;check for errors $ _6 H0 X& M% Q4 I; d1 a `) K' `
mov al,SmbStatus7 L, F: n+ t3 T1 c8 r
and al,08h / @- [1 I; j# t' N
.continue .if (al!=0) 1 J2 p( W9 J4 d) q& H( E
jmp @F % q: W4 B5 Z, b7 R
.else7 W3 N4 B! L6 L5 {( U
mov dx,base
; W& V+ q1 e( i' f add dx,5h
3 V! K/ J l1 h6 X in al,dx
* t: h/ @) {8 v9 D2 ` call binhex
! C) h& I' H+ f" p .break
6 q7 k8 e7 l* _7 \ E% O! I) Y .endif2 c* O9 b: d! S4 s# u% Z# [5 w4 q4 x
/ K& n e+ Z& ^ J0 b. K7 a
.until (0) 0 U( y/ Z# g, s1 [+ Y& i. W
6 V1 V) v6 `- g# D1 }9 b8 b; I ' s- Q9 {" m, d0 `( L
( T! @5 X( I% r% ? mov dl,20h ;output a space
- f$ L5 H: A3 \+ d mov ah,29 s. _# C4 P$ J; o1 v) M
pusha
) w: D" v; p% A/ R1 V& t9 c% z1 ^9 ~/ x int 21h7 t- f3 t' ?: r( ^, p
popa$ X, X7 Z8 {3 `) r9 _- w4 B3 w
inc num5 x1 s0 E t# M5 i6 R( U6 t' H8 Z
0 ^2 ?" b& s* Q5 s" { cmp num,80h ;get first spd 128 bytes
5 I4 A9 p( Q! m2 } U( N jnz Again
1 ]1 Y7 r8 x& b) | % F. [: u$ V; e
@@:
1 }* E1 a( W% M- `0 O6 ?/ j popa
1 |! o0 J$ g8 o# N( Y% V$ L ret
- G& N0 U1 k m2 k2 GReadSpd endp. j: m/ S0 u& R% l1 M) a3 O
+ j, T3 D. J$ g
* ~+ k5 m9 K0 y' U# e' ~5 F6 V+ U% Y
binhex proc % `0 K4 i2 W* o6 o7 p, R7 ^
pusha
2 `. u, g: q; e' C# C
- W, `- V. E9 s9 p; h1 m mov ch,2 ;2 hexadecimal digits to be printed; M/ b2 l l1 A d& R: E0 @# K3 @
loop3:! m Z" M1 m0 x( \; x0 f
mov cl,4 ;bits to be shifted
6 h: N/ X. [1 y N7 \: f; q rol al,cl
( @" `" L' [: D$ p mov bl,al- u/ k+ |6 K3 k# W7 l! B8 p' M* f
and bl,0fh ;mask the 4-bit Msb
9 J# s! n5 |( o k2 r5 ~ add bl,30h
+ D& z# I$ K+ ~ cmp bl,3ah
, B7 a( Z8 F8 P: w9 X: k jl next1 ;number or alpha?
) ~1 Q! x% D; o: u/ L# ?. q9 r8 L" l add bl,7
4 L- }; {& q3 O, O& \next1:
+ {1 @8 Z5 W, r. ] mov ah,2 ;print one hexadecimal digit+ ~* t/ {- n i9 N4 z, ]
mov dl,bl
9 f b! C+ v3 s! H/ z pusha
4 _# I+ T7 @# B) h* a& p3 B int 21h) o- }- o1 [% g
popa
# m7 o$ U+ f ^: N3 D5 q. s" U dec ch7 h: _5 U0 {9 b6 p. v
jnz loop3
( x0 s7 B5 M( `; t- {, R+ {5 K popa' S; n4 O6 }6 @0 P0 z
ret
/ r$ l: B3 c1 K' qbinhex endp
3 a2 m/ }8 h- `$ V1 s end main |
|