|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
) G" _/ c4 T' a5 B1 U: b
) b" }. d* j# W) h) d .model small7 V' I/ U+ Y6 Q; A- i
.386
" W- W, `) e5 I" b+ s$ G$ ^ CFG_ADDR EQU 0CF8h
7 _% Z9 C3 O) [ CFG_DATA EQU 0CFCh
$ S+ [: Q9 D' N0 I7 V SMBUS_BUS EQU 0
0 ^1 |* i; b& Y$ u8 T SMBUS_DEVICE EQU 31, E$ I, F1 [6 s2 i7 v" |4 q
SMBUS_FUNC EQU 3
. @0 e6 ?5 ]! n/ |: g
* X9 [8 [) |( j+ N" a .stack 100h, ^/ f/ s' ?+ A( `' I3 D0 \
.data
( v: n7 W8 C: G4 Vbase dw ? ;smbus I/O space
, S# ?# u: I: t- R$ w( Enum db 0 ;byte select9 b' N3 z9 {2 c$ ~5 @- {
SmbStatus db ?
" Z( }# V5 r; a# g
% r* l5 i% I5 Z; y* E. s) l .code
4 d- f2 `8 `3 k) H3 M1 O/ O # X& L) p7 @6 q! v+ A, ]
LF_CR MACRO
. u0 j' O. t) a, m+ y0 ]$ Z2 A pusha
( g `1 j( ?9 A9 u# C) g; ?* x: q mov dl,0dh
6 z1 o" x4 n# c8 u* C mov ah,2: a x% T4 ]2 N, Z
int 21h. Y! g' n* f: ]6 \
mov dl,0ah ;next line
* h& M# ~# b/ Y7 ~* s mov ah,2' P% s# @$ q e: x! v# O- y
int 21h! \) I ]) C/ J
popa ! ~& n7 @0 l+ _3 O& z
ENDM7 m% X1 b- h" W- P4 X6 E
: Y, v: E: \6 V1 x) p
* l0 V7 J3 k2 I" R
main proc far
* `3 u- U! ^" {: w: i mov ax,@data
?3 v( n" m N mov ds,ax
' B: l1 U1 S7 ] " H4 @4 F9 m% ~
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h/ O9 P3 T. h' L
mov dx,CFG_ADDR5 R$ ?* L* ?" Z, ] d
out dx,eax
7 w6 }! x0 L: L mov dx,CFG_DATA. P! C2 y% f9 r
in eax,dx5 z- I" P3 G8 p; f2 a
& D- b4 B% g# _/ ~6 e" n
shr ax,5 ;bit 15-5,the base address K. t/ |* @- Y! [
and ax,0000011111111111b
, Y0 y) j( _- q mov base,ax' Z `/ v/ e! U h9 P; T5 @
4 z \6 A! Y; J- n# {
call ReadSpd$ S) Y' S8 S! v5 \( @
exit:
# V/ O8 b5 J- n5 O" a mov ax,4c00h# G/ ?6 `0 N: A+ l. d& ]3 @2 X
int 21h5 ?+ |# j0 p& t! x5 g& X$ y! L1 e; T
main endp
0 @1 w8 U& b2 U: V4 ?
5 v' g9 ~7 ?- D0 k/ B2 U4 |* J! b: q8 _; }
( B& w; `4 \7 Z7 |
ReadSpd proc k, r; Q3 t. C/ ~0 m8 P
pusha
4 b0 S7 ^3 f: Y( j% SAgain:6 B; c: x; K# K$ _) i0 U
mov ah,num1 a& Z- d( Y' u. }, e& P
and ah,00001111b
. z x, E# m& r" ]: t7 s: L, Y .if(ah==15d) ;CR_LF
% n* A* N% { S. \1 v LF_CR
7 C* G: x! D0 s5 ~& @, ]' L .endif
4 Z4 M2 j8 \% P# X. t
8 R& i; V, O1 u .repeat5 \! r/ Y5 A& w; @! M
mov dx,base ;reset host,claim host in use
8 d/ {9 c/ y1 H5 P$ ~ add dx,0
- u8 A0 N5 O$ f4 v8 e: @1 I) e8 W mov al,40h2 V: f3 h8 }9 p5 L. O
out dx,al
! G! L) n3 c! d7 I& o ~
& Z) \; R% Q, H6 g mov dx,base $ {; I$ e' R4 B! T- w( ^
in al,dx, k* Q2 {; p; N+ y9 |: U) ~- M
mov SmbStatus,al
* R* v W9 T2 x2 t * G# k, }* ~3 d8 M8 }
mov dx,base ;clear all status bits0 s5 `' d+ |; b
mov al,1Eh ;host status register
: Y% l/ p. ?$ f/ H1 X: B6 q1 V out dx,al3 M( C$ s! I/ r% Y
# @. e. ?0 l3 ~( Z# o/ |3 ?! Z mov dx,base ;set offset to read
' v+ b0 H$ o L, C- w \ add dx,3 ;host command register
% b7 v* S+ f. e0 } mov al,num' q2 R: J1 p0 z# [: p/ T0 I
out dx,al. t! k; d( ?( C/ o% Q. a
! L& w- C7 j( B/ j( o mov dx,base ;Transimit Slave Address register$ b7 n6 U. |6 M" d7 _
add dx,4
/ Y( r8 l7 J L# ^3 c6 ]8 i- K( Q mov al,0a1h
6 X* l5 J9 r+ C% |: m$ I out dx,al
9 T& d& }$ h% }+ P% d2 T ! _$ [) b0 e' r8 r
mov dx,base ;set "Read Word" protocol and start bit
) g+ q( G1 l( i3 J. K add dx,2 ;Host Control register- O3 b/ h5 H" J8 N8 x' _$ \
mov al,48h
2 D- d J. a( s4 | out dx,al
9 Z2 I0 ~! X/ P5 [% N; I
0 _* T1 [" `5 R- R- X1 S" g M, v. G6 a _: l* D5 U: o3 m
8 z# A' q8 q" Y( Z
mov dx,base
% V9 S. ^- U/ O+ [/ h+ L; t* v in al,dx
( {% S7 `, y* w/ p mov SmbStatus,al, j Z# J8 O; K6 d* k
and al,1Eh k7 ]( k- F) l$ Q' f3 V
.while (al==0) ;check repeatly until any of* V6 t- z# j6 @. f
mov dx,base ;FAIL,BERR,DERR,INTR+ J! g1 o5 g( T3 u) @
in al,dx' {5 r# x* f& t+ }
mov SmbStatus,al
' p# X+ I, h3 x, |; ^6 v& m and al,1Eh : R8 x9 u) ^1 C5 f4 M" Y
.ENDW# M3 ~7 K3 ^* e/ N- {( I% N! b; b" t% e
2 O& V; g. x6 t: G' c8 O7 Y4 _ mov al,SmbStatus 6 t% @- U- t J1 [, {2 }% M& d3 y
and al,1Ch
4 B' R8 }/ f0 B% A5 i .if (al!=0) ;check for errors ) E+ x2 s. T [; e3 t# a2 D
mov al,SmbStatus
& C- b, ]7 n9 K6 f; c4 a and al,08h
! ]# x& v0 I% E- {" K3 W/ Q3 f .continue .if (al!=0) & Y0 M7 C# f& C( n; Z* N/ }3 ]" z
jmp @F . h, }% W# P" V; Q* `
.else
9 r9 w/ i' r& g8 r G( q8 J mov dx,base
. n; E, S# K+ s+ |$ j add dx,5h. w: ]0 Q. I9 |% S' e1 Q9 ^6 V
in al,dx
* _: X) C% Q# L2 R- l3 _ call binhex
1 m2 ^( W. x8 a* Y( v( N .break- K4 S, ~( j9 z1 z5 l
.endif
9 R2 c4 }/ l& o$ F- G H7 v
6 [$ p g2 L1 T. H .until (0)
/ t# [$ U+ a, |2 d" N ( r, o! g2 A* t. [
6 \3 Q8 |+ U X% [/ u. j
* Y- I& X$ o" Z9 Z+ U/ G3 |2 ~
mov dl,20h ;output a space3 K5 X5 r: w0 `- j9 K
mov ah,2
2 _- h5 [& P4 g: B, K e9 b/ s# k pusha
3 Y; c0 U& a( E0 F) s7 r int 21h. x4 F" c* s* `: J* o
popa* ^0 x& \/ _7 Z: A0 X3 p! G
inc num
. C: o* \0 B/ b5 w' k) s
6 H( u# [8 O1 i) D cmp num,80h ;get first spd 128 bytes & D# q' K( v, e2 c5 b, a, ]
jnz Again1 L5 n+ B+ H! V+ k3 N) p6 }
) Z6 x5 z3 d8 u! P/ y$ Z@@:
0 P: w( l' S2 v6 E# E3 w/ L popa' C8 C0 ^2 T8 @
ret
! F4 s0 Y9 I$ C3 }( @' }ReadSpd endp4 @6 J4 a# u& _$ _0 R) j8 x9 ~
& t2 l- Y( {# J+ u; o5 l" O
) F4 s% T+ k5 h8 [2 w
( Q. N- }" {4 d0 ^4 d6 Dbinhex proc
! B2 v+ T7 A/ v5 X4 S. c pusha
+ w. W4 ]' y. C
. L, ~4 F. `6 | mov ch,2 ;2 hexadecimal digits to be printed+ z5 I3 }3 k+ Q0 Q
loop3:
( T7 q9 Y) J8 f1 A- c4 {1 i mov cl,4 ;bits to be shifted, C! u# I. y9 x; d+ d5 `& ]2 }
rol al,cl
/ Y' a D- C Y) c5 Y1 | mov bl,al) d4 i7 y( N9 N: z
and bl,0fh ;mask the 4-bit Msb$ i2 T5 ^/ ~3 p/ Y/ y9 A) `, w
add bl,30h
; T/ e" {/ l; v, k. g) j cmp bl,3ah
' o: `+ J1 X4 `5 ^9 E/ w. W! b' s jl next1 ;number or alpha?
/ O! f. I# w6 ` add bl,7 : J# X' S; d# ]1 j2 U
next1: 6 Y; B2 B' ~: G& e- i
mov ah,2 ;print one hexadecimal digit
4 O7 n9 Y% t$ V4 }, d9 { mov dl,bl& Q) j$ ~. N* `& ]. @0 n& }% C% |
pusha. P6 l$ T, _" B% q3 N
int 21h7 I6 ~$ s# A9 {$ `+ q8 `
popa
" m3 w; {7 @6 W W dec ch! \& t4 ~4 j: }' t4 [; |
jnz loop3
+ i4 [: Y* Z9 E% \5 V! c# q q popa
/ {# t5 k' ?3 V ret& E- X* r$ U' O8 ~0 `0 H; l' z& L# Y
binhex endp
) w- O! {. U( ^/ N Y end main |
|