|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
+ u; b' g0 f- v8 G: F
' J: J: C5 N) h0 Y .model small: M$ V9 L# E* _2 M$ v" d: ~
.386
+ I; h8 N Q0 C$ @% z CFG_ADDR EQU 0CF8h
3 I; O9 }+ J0 p, O( [$ y CFG_DATA EQU 0CFCh; a7 A E+ O: t" C5 N8 Z
SMBUS_BUS EQU 0+ P: `4 n9 }! d. b( u- @
SMBUS_DEVICE EQU 31+ N% a9 t9 ~% k& P( r. @
SMBUS_FUNC EQU 3
$ ?, I, V) D M/ ~, B7 _8 `, X: W
' I) _# ~$ S) G; q$ b .stack 100h- Z9 ]0 n& d: F" A4 }7 ~
.data
) q7 ^1 @7 g. P$ U' j- I& q2 A+ cbase dw ? ;smbus I/O space+ g/ f6 L3 |7 W4 m3 R9 {5 u7 N
num db 0 ;byte select
2 W! N5 S. r2 Z* D4 l9 ZSmbStatus db ?* F% t: p. r7 d3 R. }4 |7 a6 J
H' ?' ~3 A4 N3 `2 z
.code
4 ^' l" X+ z1 z( M9 E- Q# v5 R ! k: L5 Z+ o& U0 M
LF_CR MACRO$ Z& L$ b8 m4 t/ U) V
pusha
# t; p5 q" `- _* f0 i* z mov dl,0dh ! g) }3 [" c" V% Y
mov ah,2+ W6 g0 K. u' M
int 21h- ^6 T' a2 ^# H( b+ Z% j
mov dl,0ah ;next line 8 V, G6 k4 a6 {
mov ah,2
6 M# x, Q7 R% Q$ e int 21h j; m* v+ K- I; e8 c0 E+ F
popa ( ?) }# N2 A! a
ENDM! j' _1 k: l/ j) t) {) e
B$ I- P) [! r( T4 N
$ P. L9 K4 e2 ^) i Qmain proc far
/ H2 R/ g8 {2 I( Q$ k" D+ ?# y mov ax,@data
+ c& E# S7 g" V8 h: G$ S& s2 ^. e mov ds,ax( ?/ i3 P7 t5 J6 u
: B0 b* a2 q2 w/ [ mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
4 u; j: n9 G& D3 S% h mov dx,CFG_ADDR9 V$ H1 V$ u3 @% U: q* ?
out dx,eax
3 _, g( A/ o+ H9 R7 h' @( m mov dx,CFG_DATA' G' c; G: M. i$ ~/ v9 `
in eax,dx- `, y+ d0 @; ^# Z
+ N( W+ _9 ^# Z* k, U
shr ax,5 ;bit 15-5,the base address
$ U3 j/ J* S# i+ f4 Q and ax,0000011111111111b
8 a7 B1 l* v1 T: m. r mov base,ax
. T: @8 a: y' l8 T( l# K ( e+ f8 d( P" i/ C; V& Y
call ReadSpd
& @, y" H) U' |* e& I# N9 eexit:
/ S) d: d- Z! l" \ mov ax,4c00h* l; y% o$ @4 A0 K. K, I
int 21h/ A- Z# k/ y- p+ B/ T
main endp) p0 b7 [- S6 m. B* q' Y4 ^5 |
: X) a2 o( N; e) i {7 [
4 C4 N, Y* X/ Z6 g8 \5 @
8 M, ~, Z" {4 `2 P9 }' dReadSpd proc
- V. i6 j) O K0 {5 G pusha
# x: r: o7 S! j1 S/ eAgain:
; P! f* r1 ?6 r+ {3 O3 ] mov ah,num
" i+ \5 u% c0 |2 I and ah,00001111b
$ U( B' }6 y/ a1 W .if(ah==15d) ;CR_LF
+ o# ?3 O3 p5 H. f2 Q; Q i LF_CR4 [# Z! T/ i$ g6 ^: v' R7 d
.endif
9 |6 K5 k" D u7 w) ` - x& M0 `; ?5 |* c+ G
.repeat
% \$ J3 x) b1 U& k mov dx,base ;reset host,claim host in use! d/ h1 @0 n8 B3 u/ m
add dx,0
" y" a5 I. a. G mov al,40h& b! P" E. v& \& D7 Y5 @: Y
out dx,al
8 I4 u* T1 O0 Y
+ T2 q3 y& U* Q | k mov dx,base
, x: h8 C0 r$ D' a0 L in al,dx" o+ `+ y- q5 [# _% P5 T
mov SmbStatus,al
|5 R/ i1 P! w w. \
6 k! v5 [ F7 c! }( ]& A mov dx,base ;clear all status bits
' O. e( d0 ?8 A5 F8 X) ], m mov al,1Eh ;host status register
6 V- K2 }' X& [ out dx,al* U T8 X% l( R O) I/ k7 K
$ v, @! O# f6 g( G& a2 A1 r2 Z/ }3 G mov dx,base ;set offset to read
1 m' l5 ]9 I* T) h; F9 [ add dx,3 ;host command register
3 T7 a( x3 a+ M- W* E* u mov al,num/ O6 J! M4 E& q2 y2 ^1 }' c
out dx,al- G4 @" x# u% }
& x- P: F9 ~7 b* ?! i: W% ~
mov dx,base ;Transimit Slave Address register
l% K& Y7 `5 ]7 X add dx,4. y6 N" @+ N' Y4 Z! T R
mov al,0a1h7 g) R ^ e$ Q# G$ ~# X9 l
out dx,al
- V3 R. }; p# T
' Y: ^/ K) h% ]* B mov dx,base ;set "Read Word" protocol and start bit; e. B& V; q% C B4 ?0 p* a! s
add dx,2 ;Host Control register
4 W' X. S, u. ^* {+ z8 i* y! [1 Z mov al,48h 1 _& O4 r# |5 {
out dx,al
- _! q5 Z; d' X8 m 5 L; D' b( K( P. ?% `# B; Z. q
% ?* v/ z) ~% @4 Z$ { # ?# L2 z: A4 a2 I
mov dx,base
8 \3 N2 X3 @* l7 I. O in al,dx' Q0 Y, E4 R! ~/ }' z
mov SmbStatus,al- z5 K+ T/ H7 z5 l9 Z. ?/ [
and al,1Eh( K6 n$ @2 `5 D. ?/ p: S
.while (al==0) ;check repeatly until any of
- x* |. q6 Y! Y; h. m mov dx,base ;FAIL,BERR,DERR,INTR/ Z" ?; x4 x- b: B4 l5 o3 g
in al,dx
! [4 v( y$ S: T4 E* ^7 e: }, g mov SmbStatus,al
2 F0 E3 M& q+ C0 h O4 f and al,1Eh
! M) K9 [ | N% q- {0 k .ENDW
6 R% P+ f9 x$ B5 g' ?6 N/ y
8 e: z( }& J$ |5 z) m7 r2 D mov al,SmbStatus 9 M, y* M C/ C% t" A& o
and al,1Ch
" ^4 z6 l; T h# d4 Q .if (al!=0) ;check for errors
/ V! T' S9 p! H6 z) U: d mov al,SmbStatus
U4 Q0 a Z. v8 Y" Y" [3 h1 w5 W and al,08h
) [+ p7 V( R9 U9 W .continue .if (al!=0)
% w6 g5 O0 l) X f7 @- L6 @: y jmp @F
. s9 Y# c6 E7 A A .else; y5 ^2 e! Z& B: H
mov dx,base, f* @ s& x7 D: Z% }
add dx,5h- B( m* _/ M) V9 r7 g' a
in al,dx
) Y# d/ z6 o! ^& g/ T: \ call binhex
, r' @" w$ c r3 ^$ \$ r .break. C: Y4 [2 }$ K3 v8 {' b. @
.endif
; j6 n2 ?( L" h' `; b) W
. t* F" X+ T" j7 k; d# \ .until (0) 5 O# s2 t2 k6 ]4 I* C$ R) k
5 D0 u4 }( w3 U; y6 r - y, z [% {% ^& }' G3 ]
! v: @4 D+ B2 Y
mov dl,20h ;output a space
3 T. y" ?0 u) E3 m mov ah,2- Y" F* a: j1 s- m! m
pusha
' }5 }6 g# M2 F: P9 |' m+ o5 | int 21h
+ J9 ~1 Z2 m2 a. r popa
' m6 t6 E6 q! P3 X inc num) L; D: C. _& c5 x; T8 M6 K, ~
7 q; I: \! A* t1 X9 r' _
cmp num,80h ;get first spd 128 bytes 9 Q' a$ @) c# D9 s5 i
jnz Again4 L% }5 _! P" }0 f: A5 F
% _1 ]+ j( J3 p& c+ b' h+ X/ b
@@: P$ l- N* R* Y' D. W4 ]
popa, G7 |$ r) d9 l2 _. }* m8 S' l
ret
% H C/ U% c. kReadSpd endp6 p5 y8 J. u" E- x8 Y3 b* r3 r/ c+ t* n
3 a! d. u2 J$ \0 p3 `
) ~2 V' u5 o2 {3 F, e5 `3 g- U' [/ @" Y" G5 n; w( B' X
binhex proc
. t+ p1 y7 F+ h pusha 0 r+ i+ {- p2 A- L/ p1 T
5 r2 A. |$ R4 p( x, s) \% h" G- L8 c! H mov ch,2 ;2 hexadecimal digits to be printed
$ _# N+ g4 w8 h N) h) Eloop3:# i$ ~: g8 f! w5 @/ Y8 u d
mov cl,4 ;bits to be shifted) P* U* f# J) d1 | m3 |! A
rol al,cl4 R9 _, n' u& H( E
mov bl,al
! `& y+ V: e- b8 J/ X z and bl,0fh ;mask the 4-bit Msb
; \4 M: J& Y) K# b9 p0 C add bl,30h
$ v( J1 z- j7 Q$ q* j cmp bl,3ah
5 F8 s+ B2 |# H3 i jl next1 ;number or alpha?" I5 F6 o+ V. y* \# W5 m# ?* ?
add bl,7
; ]4 w% a' P0 }; B, p5 f( Cnext1: 2 @+ \1 e/ \6 G& H
mov ah,2 ;print one hexadecimal digit
t1 {: Y. i: h' a& A" ?. `. t mov dl,bl
4 b, M6 X# \& B! l pusha
# B7 I% {, O0 X' A% X int 21h
6 a e% _6 o$ I popa) |0 C+ ^3 w' b2 y+ ~) j4 S
dec ch
! s4 V( c" P( O( q jnz loop3/ t; ^% W/ Y: n: \ w
popa0 Z, C) |: P- K, r# E2 i: K! h5 S
ret0 e9 F( |8 V! K* U
binhex endp
/ r! }, Z8 p7 Q% i. m# G end main |
|