|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
2 h0 b. F0 e3 W4 _
6 h9 q- I- {' e8 ? M! U .model small
8 o( n) B( y* R, m9 C- ]( J8 ^; D4 J .386+ ]3 o$ M2 ] U
CFG_ADDR EQU 0CF8h
3 W- k7 A5 Z E# B r6 W CFG_DATA EQU 0CFCh% z, E, l, f9 e9 y
SMBUS_BUS EQU 0" d% R+ P D4 e
SMBUS_DEVICE EQU 314 z% N* F, e6 f, ?% b9 K7 ]- @
SMBUS_FUNC EQU 3/ H2 O- ~) l3 T9 a7 s1 g) v7 Y
0 W2 x7 b8 q- G- g U5 Y$ k .stack 100h) n' x7 c. H+ f" R0 N4 D
.data! V4 H: p. S0 t5 r
base dw ? ;smbus I/O space8 P2 v4 f6 ^. A: T3 b) m
num db 0 ;byte select( F2 d! ?6 \5 V6 E" c) G
SmbStatus db ?
. y/ D& v6 Y' C: P& U2 k+ ^, p+ N& j1 O# W" m$ ^, I* g
.code
6 y8 m0 L$ K1 `: n' ?1 w
2 @$ T. e. i b/ k% [LF_CR MACRO0 O% T, T9 X: P I
pusha/ X2 K3 f- j. l0 Q8 h
mov dl,0dh ) D" W2 n9 i& I
mov ah,2
/ [% H# [/ a1 T ], ? x int 21h
5 X5 A7 e, ]- Y$ k7 N) V mov dl,0ah ;next line - ]1 H2 p. C( @% k/ U
mov ah,2* u1 x* s, n6 D) ?8 ^/ f
int 21h: s0 U$ [! V0 P- C# S
popa
* N7 O; d9 T/ ]. J ENDM5 p. F4 P6 d$ {
- A" [" C/ d* O# C. S
0 A, x# \0 |% _main proc far
( X* j+ w; e: l1 Z mov ax,@data
1 t, B: F- A$ A5 v( v mov ds,ax
2 Y8 S, x, o5 n2 p- Y; a3 S
( g4 f% f- _8 C mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
3 s$ u1 Q @5 X! ^: i9 c" |1 g( f7 I mov dx,CFG_ADDR
( F, S! G+ l. b out dx,eax
6 k. Z' }' W) a" p mov dx,CFG_DATA
! I9 [8 O$ \, m. x in eax,dx+ C2 g$ H$ A: d/ S1 H' a
' f6 }9 D3 B# H; U) w
shr ax,5 ;bit 15-5,the base address
3 V7 w# E+ q% x. e1 e4 a and ax,0000011111111111b# b! n$ T# J1 a6 ^& R
mov base,ax
. v7 w( V" ?2 f9 _) I) l% \ " _, |( x2 q/ l! v/ P$ S+ U9 E$ G
call ReadSpd4 S# j0 B5 a' k
exit:
! ?$ V2 C# ^* E+ B mov ax,4c00h% V6 d( E9 X3 s0 p
int 21h
- M. |- H/ n& }% V; Imain endp; U1 W2 g! I' b1 D
8 |$ u5 K# E. D# u
* j5 J+ k5 h& g0 }4 ]2 k1 a
. X9 ?: l/ r1 q9 }" t' g \) J/ w5 FReadSpd proc" ~4 x+ j% l- D
pusha
' y6 I h8 F0 W( YAgain:4 B+ o) o7 a9 T! ]1 {/ l
mov ah,num
( P7 U: z3 m( Z/ l* z and ah,00001111b
, G' x, Y; C( i7 \; v: X( Q .if(ah==15d) ;CR_LF
/ m6 L8 S' S# Q LF_CR
3 O1 m7 `! C7 ], m .endif
$ B2 E6 {" N h9 w0 Y 1 W, ?! U7 C. \5 F
.repeat
6 H4 F4 J- M* [4 A4 Q2 U( v! P mov dx,base ;reset host,claim host in use
, L& f9 y1 A6 W% `: { add dx,04 y) t* b& X9 c* l
mov al,40h
* x* Q! `% P& B. I" u1 l out dx,al7 L; }2 h6 n3 n P+ r
* l$ ]$ |5 |! Y1 o* |' m mov dx,base
3 q8 h9 l% g9 X Q" h in al,dx
) J' P5 ]. ^' ~- \( d mov SmbStatus,al
% n: P" Y2 g' |/ f$ c3 d5 I* j0 Z2 X o
( A+ K9 }- O( b+ I/ O mov dx,base ;clear all status bits
! e6 d# ? r- m- t) ~) G- [ mov al,1Eh ;host status register
+ T6 l& T9 R2 Q- a) H+ W out dx,al0 k+ J5 L7 L% R' ]$ ?6 Q& \$ p& I
. e' l5 t' {* M4 u; X: h# P
mov dx,base ;set offset to read
& u# t+ T; Y/ v. Q, Y add dx,3 ;host command register0 D4 k' M t, G( g( x8 {3 Q
mov al,num8 ~! I9 D3 {0 b, s
out dx,al$ v3 P$ L; v- P2 |' n0 N2 X8 r
c8 m4 p0 F2 j) I; g* Q
mov dx,base ;Transimit Slave Address register" |* U3 \- Z) [; Q+ s
add dx,4( F$ k+ o: {" C$ H+ B! F) |
mov al,0a1h% q" R5 U2 e9 r# I7 A/ @9 ~
out dx,al
- U1 N. S( Z* J
$ u$ _& t9 b7 q5 T( e& \ mov dx,base ;set "Read Word" protocol and start bit- {0 {7 J1 c& o
add dx,2 ;Host Control register7 Q. _0 d, l/ R$ r+ X/ o
mov al,48h
* ?2 U* p5 l& u5 o7 `' p out dx,al6 f( V) s( O# a) s
6 h7 E! n# x' U0 J' Q1 c
. [, ~( v, P) x4 @' y1 h: ]2 [6 |0 Y ! J9 O% u" r; Y5 V
mov dx,base
& S5 O" s p# {( D in al,dx
7 [; |$ X9 s+ ~) s5 z$ R R mov SmbStatus,al
5 v4 @7 r* p1 g and al,1Eh
: U9 z" k: ?( C3 \- l$ B .while (al==0) ;check repeatly until any of. u& x8 C U4 f C U6 Q
mov dx,base ;FAIL,BERR,DERR,INTR
- p+ D1 ^5 p( c+ U2 ], d. X l in al,dx
2 Z2 o5 w% s1 a; U: \: f, W mov SmbStatus,al0 L+ `( T2 R9 Y, W) D0 a/ |8 x3 t
and al,1Eh
4 r7 _0 f, b) M! I6 N .ENDW
/ y6 \) Q v2 c
: p/ X( u; T/ o* P2 m% z mov al,SmbStatus 3 f' d, n% Y7 T9 L& O
and al,1Ch5 W( u4 A& Y: B# K
.if (al!=0) ;check for errors
& G6 }: w( y" z mov al,SmbStatus
- u! L+ z9 _! E7 _# V; M and al,08h , g: L9 }3 w1 ~% ^5 U% ^. Y0 q
.continue .if (al!=0)
* q+ U$ l" Q* E8 X5 [8 d) u jmp @F
8 k4 b H X$ Q- b1 T2 n .else% d% ^& ^4 e+ C& M7 G" a$ H( d
mov dx,base
& w7 H6 E9 N3 K8 }! I/ w X add dx,5h
! [* ]$ z4 [# U5 | in al,dx
( _& u c9 c2 d: p- K+ b! K& z call binhex * a, t: c1 ]6 f; m! F' t" b
.break
5 P4 C8 _+ s+ S .endif) O5 D5 D* Z9 h2 l; Z
$ k" V% [5 ~8 z- ]- ]0 p+ W .until (0)
9 W, D# w! }' o
, ?+ {, S$ y) Y! k1 z% B; S . p9 X" ^$ v* O7 D
6 u- R- v4 `) l mov dl,20h ;output a space
6 j* r9 p R' m8 g mov ah,2
4 t+ B7 n" k- t, h pusha! b7 @! l/ ~" `* B
int 21h% T4 g! t, j3 ?) I- D, x) X( B
popa
5 C9 D4 D. p! y! x inc num( n; j: a+ J* f0 s
Q$ Z0 ?; C. l5 n% d! Z _9 N
cmp num,80h ;get first spd 128 bytes 4 h& ^5 g1 e) y& B
jnz Again
. U3 Z: |9 |8 T+ ]0 I0 D z 4 n" n, i% \" Y: d
@@:/ A, j- z5 i8 j! e' V3 [
popa
/ \; @! A# S, n l+ Q. M ret
% b& O6 L; d5 O/ S$ ZReadSpd endp
5 e3 q- O! O4 V0 L8 A
$ b* p: A7 ]# U1 M2 [
/ ^4 l9 y' }' p/ F1 b7 C. E
; M# A5 J+ H7 Z% C# l& sbinhex proc , j F- ?& W& ]( I7 I- H3 J# k! M& h( h. h
pusha
9 [3 W9 T+ K" r4 G( q5 _/ Y + C/ D& ~$ E9 F8 V; P
mov ch,2 ;2 hexadecimal digits to be printed% T8 K2 j7 ?' V2 r, s6 P
loop3:* {( v* \) R2 j6 q. W5 `3 ^
mov cl,4 ;bits to be shifted0 R9 }# i5 S' s" R; W
rol al,cl/ l2 e" T' R0 r+ {8 P. g# s9 z
mov bl,al& k+ m# U0 @8 A0 U) A( ?: N l2 ]
and bl,0fh ;mask the 4-bit Msb$ ^- {* K! [0 `* x
add bl,30h
1 c. M* ~. G+ v; g cmp bl,3ah
: l2 I1 _2 i( R7 x jl next1 ;number or alpha?3 C+ V. y( t# ~$ _: {
add bl,7 6 I% ~4 w/ J Y2 _1 Q! S
next1: 8 d% V4 Q! `3 ?: ]9 W: D( g$ U
mov ah,2 ;print one hexadecimal digit6 A1 \ @ H7 u% r+ U
mov dl,bl
6 V3 B% Q( D: Y5 k( ~' L pusha
& | G% U- F% d, H& s" t int 21h
/ H. r2 f; j: J" p- x- D popa6 k/ U q: t0 d9 g0 o7 b
dec ch
0 t7 w+ j6 g# j6 P( Y6 } jnz loop37 X4 t+ G2 W3 t: R
popa. q0 ]: F L5 A
ret
, N, ]$ y, E j& abinhex endp
8 j. w# M$ j# a( X& o2 S+ S# Z2 ^ end main |
|