|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
# y; M1 U) B" {3 ^( [8 m
* A+ \3 `1 O, A) S .model small
& `# {: g) A+ H: A# X; F3 G" E .386' @- ~8 H. z) W9 {6 y$ \* p* o
CFG_ADDR EQU 0CF8h
# I* ~, B- u O& `1 Q* v CFG_DATA EQU 0CFCh3 H- I3 g4 `6 p; ~/ O+ r
SMBUS_BUS EQU 0
" d/ l: N9 n. F5 x SMBUS_DEVICE EQU 31
3 I6 x! ^% j4 Z% c SMBUS_FUNC EQU 3
: A) P" ]6 U, z+ z
, u* w! P3 C+ K; U* L5 s K* A5 Z$ f .stack 100h
6 a4 |* _- c- B" R3 \# Q; P; j! N. ` .data0 V! ~9 V3 j1 j
base dw ? ;smbus I/O space
2 Y# B* n+ S, K1 k B- Onum db 0 ;byte select
+ e# i5 N7 E w1 p( zSmbStatus db ?
# \$ n }/ }; I. K
3 u( b: {1 x: ?) B .code
* J/ }; J/ g" v" x" T9 N ! w3 x8 M- ?8 D/ ?1 B1 S
LF_CR MACRO8 m3 T& f i4 @/ j \; [/ K
pusha
! c( x$ S% c( g. d5 T) o) a' x: O mov dl,0dh 2 Y+ ?+ ~: [, J% m
mov ah,2
* H! t3 S: B& _5 R int 21h
" _, K8 m+ q! I% M mov dl,0ah ;next line
7 y/ ^. S$ ]* u2 I/ P6 V. C mov ah,2
3 b' o+ W; L: A# f" A' C/ ? int 21h( j, {& G9 M$ y/ c# s5 O
popa
7 ]& |) R0 b# H# p+ g ENDM
, i# p4 P! P/ `3 V) b
0 N1 ^8 F3 z. }" z; r
9 D% W0 u1 `- H) Smain proc far
/ T+ t; q5 T( B# V4 S' P mov ax,@data# c. M# G8 b: z0 i& {8 z! [3 w
mov ds,ax
1 W. n- @5 t( ^) h% F* Y- b# I , P! }8 Q8 W" f4 P6 ^# J
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h! h- h! X7 S9 b$ F. c" T6 M# H* r
mov dx,CFG_ADDR# s5 k. T: r1 K( i+ _8 x" f6 S% V
out dx,eax* y! ]1 }) w5 T; y3 O- E; v
mov dx,CFG_DATA
& W! C. t- j' [+ c/ V in eax,dx
8 |3 C. \' s% Y8 S- ^. t ! N0 K$ [2 P- {
shr ax,5 ;bit 15-5,the base address; w% ^7 G5 o- r o# X: |4 l
and ax,0000011111111111b
+ W$ g- C8 t6 R; |8 G5 C. b mov base,ax* t9 m' i3 W: j8 f4 x4 j5 L' i/ i
- Q* l% K+ a- r H5 }6 e: e call ReadSpd8 Y6 O7 C5 H$ G" A a* `# c
exit:
. r- Z' f: {5 P* ^ mov ax,4c00h5 M% x" z6 G- H- p8 C
int 21h! B7 G( D, F8 }0 {1 e! J9 W
main endp* o( {* j; w& F3 L- M7 Z6 v% r
+ ^6 Z% n3 H0 D
& T2 Q4 h& m3 b3 e, W" F. ?$ x- [+ e; G: T1 z1 k
ReadSpd proc
$ [. J- p$ }9 R# N3 f; n, I" j pusha
: D/ ~2 e/ D* [/ j5 q7 u3 uAgain:
% D& }8 v" [- ~& m mov ah,num
) h6 i0 Q# r8 A1 { and ah,00001111b3 [! s- O3 j1 P5 C: X+ X
.if(ah==15d) ;CR_LF
" ~- E2 K; x' v6 o$ C* b5 H LF_CR
9 v. b* A+ a; ]/ c* P# C( O0 ? j .endif
1 V V! J: [; x: `; n) T1 E5 u/ B3 M / P5 `6 k# K5 }/ v; Z/ a. R1 b- a
.repeat0 r9 q( R7 P* C" R6 j9 m1 ~6 L5 {
mov dx,base ;reset host,claim host in use
: Q, Z* i7 `7 a( ]* y% E/ g. g) q add dx,0
- R2 y" u5 A2 u% `- V# K mov al,40h1 `& P4 ^/ _4 U- Z# G! q
out dx,al
* @2 {. ^" U2 }1 T2 P% k8 K & ?2 \/ J5 R; Z# K* L% M
mov dx,base 1 [1 ^ l) I0 a q) `) \* u. V! y
in al,dx/ e" j5 I, @# Y7 `. M- q9 n+ V
mov SmbStatus,al
; g/ i" n( x* Z' N% ], G 2 Y' I0 H' N9 k) ~5 T9 O9 G
mov dx,base ;clear all status bits4 f4 W; ]3 \4 o& S" I) i3 f
mov al,1Eh ;host status register
7 s N$ e1 m% `3 O1 _ out dx,al
( k' z+ s U! Z8 p" |$ l / R, m2 b* x! B1 e1 y/ [* ~
mov dx,base ;set offset to read
) p5 l8 ?9 z1 I5 e7 Y, I# ? add dx,3 ;host command register
/ T( Z+ P% \5 H/ L0 ? mov al,num" ~9 g, v2 g( a: B0 r
out dx,al
8 [* z$ | Y* h) B7 D! N* Q) |
: @. _# A0 |% h( ? mov dx,base ;Transimit Slave Address register
1 O6 O ^+ u" a5 c( S" r1 z) h add dx,4! t5 c4 s' j, ?. X8 x
mov al,0a1h
& t' [8 [% @% v* h out dx,al2 p: b' B6 y) N
- L+ C" u! H1 j) s) }; M mov dx,base ;set "Read Word" protocol and start bit
$ J1 J8 {2 B( Z7 ^; Z/ o) n add dx,2 ;Host Control register
# m$ m2 _! ~0 w( l; | mov al,48h ; n7 A& S0 O0 }; q
out dx,al0 L ]& F, u) ~
$ b+ I4 x4 s ~1 c; j
1 I3 a: @/ s! |# n% u3 e ; { _6 B& l& W8 o2 r, D
mov dx,base
. b( k7 `9 {# v% v% R! [! J in al,dx
* D5 A9 l- x3 z mov SmbStatus,al1 H0 u' G# k6 |# U* k+ q0 d
and al,1Eh- g6 h$ a7 E6 s( s
.while (al==0) ;check repeatly until any of
1 F" r( ?3 s* l* s) H' ^ mov dx,base ;FAIL,BERR,DERR,INTR
" Q- s, Q9 W6 }0 l: k in al,dx, T6 w& [0 l+ X& Z& R
mov SmbStatus,al
( E( X( B; G+ I2 |& \ and al,1Eh
' ]6 i+ D( k* ?0 m# q .ENDW
- G, z2 e& y8 c3 k% t
% l- w) F. b9 N: i$ c* w mov al,SmbStatus
9 J, ]0 Y) w) u8 o! @1 w$ m and al,1Ch
2 Y; v0 M6 j& o: v/ x' Y; H .if (al!=0) ;check for errors 7 O+ ~0 Y/ M0 F' D& Y
mov al,SmbStatus
% |3 j1 M7 Q( @6 A0 I/ c and al,08h / y! N% X: v$ Y8 G2 x' b
.continue .if (al!=0) 4 Y4 z8 x; H) b* K9 ]" z3 G
jmp @F \; ~* @6 ~, [9 k0 i& o: |
.else9 k5 m6 G$ {% _/ e/ B
mov dx,base
$ D+ o* n: Z: \; P4 Q. N; w g add dx,5h
$ R$ ~$ |/ Z) ` in al,dx
0 k3 n) I& S0 l. P: t: }" ^$ C call binhex ( E6 E) a) T; ^! P0 s: ~
.break
8 F. }; i4 a- l .endif8 Y% r R. q& N: }* \6 H4 k
) b( h0 X6 J8 g/ G
.until (0) " B. p: G, K0 _# W d' e6 y! j" i
) j$ Z, K6 a# H1 z& b+ [
. P' Z f% U1 D
' g4 \ ]9 t6 U& y
mov dl,20h ;output a space0 x a2 W7 C z! D
mov ah,2
" U8 f4 t e* R pusha" J2 V2 w& W, @* r# D+ x1 A. n4 s
int 21h
- k0 \4 h6 S: O7 P popa
h2 Z) ^4 S5 s4 o1 W j inc num
: G! b+ U* d: w" a) f0 e9 V7 B- K; ]8 F" u. U% Z
cmp num,80h ;get first spd 128 bytes 4 T( S" x! t& l+ D
jnz Again
. m+ O w% S3 f
/ n6 F3 I6 r! ^& R/ `8 Y2 T@@:5 }7 j( n8 T/ e0 I: b" y
popa
, s" P, w0 H8 P V4 T' f( ^3 r ret, l: z, q- n% z' M" |9 h
ReadSpd endp# A4 f6 @- l; l" o+ c5 P+ q
5 f' g5 b& t" c+ Z1 I9 l4 l. B
) l! r9 a5 e7 R% d$ v. ~1 t. R* f' B6 O) y
binhex proc
! o o: z; [ G& \0 X7 c1 H) @ pusha ! N$ `: v9 }1 e( l7 A% k
5 w+ c% {: T) v$ v0 a: H0 U- s mov ch,2 ;2 hexadecimal digits to be printed1 X0 ~* v% }( A& s0 y
loop3:' @7 z6 r: h$ o A' H( c
mov cl,4 ;bits to be shifted0 X( X/ [) \; L# T, h0 K
rol al,cl
. F4 v& v, z/ ]8 h. L; {4 d2 } mov bl,al
+ m E4 j; r0 K: g! D' e9 ~8 E4 q and bl,0fh ;mask the 4-bit Msb
4 z2 W8 _5 Z$ g7 l: Q! I, q add bl,30h3 G0 y1 |1 i2 w4 c# G, o; t+ h
cmp bl,3ah
Q5 C# c, Z9 s1 Q, ? jl next1 ;number or alpha?
, }* D+ R6 u& h# O6 g3 e% ? add bl,7
' B+ a( w/ k9 gnext1: Y8 G2 @' t* R9 Q5 ?
mov ah,2 ;print one hexadecimal digit
3 |* x6 i9 Q, a mov dl,bl
9 V+ K$ a/ y; j/ w$ `- S pusha
8 X8 ` i: H" n3 P c# M int 21h7 B4 K) a& I2 k& m
popa# p- Z; d: x" G! D9 r! N
dec ch @, b. F: O, w5 V4 o& b
jnz loop3 y0 ]& [. {& D, g0 ^9 m+ j
popa& W2 a- B x2 G1 L
ret2 i* l/ y/ H0 `2 b
binhex endp: K/ ^1 h" e( W, K R0 a
end main |
|