|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: 7 n# r }, Y4 B' v9 W2 z; L
$ P4 p0 {, m/ @; @) l9 u! z .model small5 c# m3 L& U# e$ `
.3868 G5 }$ @: V# h$ ~5 W) M
CFG_ADDR EQU 0CF8h
7 i/ i2 v5 n( b: E, h# } CFG_DATA EQU 0CFCh
6 [" l5 v9 D3 m' D: _ SMBUS_BUS EQU 0" Q4 D; C0 R' n% D+ Q( B! _! f
SMBUS_DEVICE EQU 31
* K4 ~% z! H3 m$ S1 _$ a6 t" G SMBUS_FUNC EQU 3& D' a1 [3 f& _' }2 p
c) B9 n: S# b! R- Y- c( b
.stack 100h! ~+ g/ x' W9 n
.data
' t# Y* N: A1 i2 g- w$ g gbase dw ? ;smbus I/O space
8 g7 `& D! x5 A9 ]* T& x4 I( Enum db 0 ;byte select$ j$ e+ l9 J: K
SmbStatus db ?
" ^/ v( S6 ]1 e: s, K% u1 {0 u; K! D% L Z
.code
+ b$ v u+ l, T& T5 B& g* I . z% Y3 p" R$ F4 r/ d c B
LF_CR MACRO0 T2 {! x$ `' H7 @- L; `9 w7 A
pusha6 i. \8 h! K5 x/ P
mov dl,0dh / z/ d( N1 T5 O9 U) f0 {8 k
mov ah,2
4 i9 I8 L2 Z+ A/ A: } int 21h
+ D, O k1 U' u* n/ ?5 w5 u3 Q1 P6 g8 d' P mov dl,0ah ;next line ) s J9 `: `4 I* J+ r
mov ah,2% w. `. M; m1 p7 }5 u; q
int 21h
/ R8 z: N7 E8 c" P' P popa : L( J6 P8 D) i% K
ENDM
! A% o h' i2 a# {; w f1 ^
* }9 I; z; }. |; D8 _% M3 e7 m$ \
main proc far
* P% j `, e% { mov ax,@data/ k0 ~. Q: j" N* @% e+ g6 U4 q
mov ds,ax
5 s, R7 |3 ]1 P' i * \; B& E5 Q+ v0 v/ z
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h1 N5 {4 m e8 ~7 g
mov dx,CFG_ADDR1 u' H4 [+ d, c3 {7 S8 |- s8 b2 ]
out dx,eax
9 `: N3 G1 P0 ?( o! Y1 ?* }& [ p mov dx,CFG_DATA
V- y0 s5 J7 a5 j$ B) ]$ n in eax,dx
# h: ~/ ^, R. D9 a8 G
7 b) R* A' R" x shr ax,5 ;bit 15-5,the base address3 f, L3 |, G5 z4 j+ u v
and ax,0000011111111111b
* G# u; N8 J4 W/ Z" W6 k+ w; O mov base,ax
- s" p+ R* A4 e+ e+ F1 [$ f: e 7 C2 m" m9 o2 ], [; T; `
call ReadSpd$ S. g7 H* J- v: y! Z
exit:% T' ]& r/ E! q! D# l
mov ax,4c00h( i6 G, k, F9 z2 M6 }' i
int 21h
9 m: t* ?7 R% r+ O9 l/ f0 E$ b% Q# y; K5 Tmain endp
' m* E: D3 w5 H w8 J3 g X8 n, }7 N8 d0 f, x+ p/ l
/ c& Y6 Q/ j1 o4 M5 K+ J1 V$ D4 q6 S
3 J" ~2 f6 `3 O5 ^+ \' l/ t
ReadSpd proc7 H3 S0 o/ P/ v s
pusha
B' e1 O% ]7 J# e; Q3 JAgain:
( a9 E( }" u- u0 B [$ @# N. I mov ah,num
9 N2 x9 s8 T: P' v) |& } and ah,00001111b6 I: c) g. p) ^8 \$ \/ u, e0 A
.if(ah==15d) ;CR_LF2 B7 n, @, ` p( R
LF_CR* T j9 y, D2 Y8 T$ H# [/ v
.endif
$ D7 i% h" w$ E( T8 E: R
. y" `7 `( D1 S- | .repeat
" [* j u w+ Z( a& P1 }. V- {& ? mov dx,base ;reset host,claim host in use5 K a1 w$ X% G# ?) Y
add dx,0) i# D7 J. V+ \8 L, {
mov al,40h
9 m1 y) T# d8 J, F out dx,al
( v; \: U# D& _# H' ]- G4 v * {. N) U# ^5 V+ `# B' y4 q9 Y
mov dx,base 0 H1 E) E+ A/ _2 D% w
in al,dx* T0 P7 X# I& @: q3 j. [3 d+ @
mov SmbStatus,al
6 g9 C' S! o1 b0 Y) m7 I D ^ 1 p) j; g7 t4 c) r p a' A! z! V
mov dx,base ;clear all status bits' I+ d* @/ [; o
mov al,1Eh ;host status register: S$ i2 q( _- { P1 e
out dx,al
# G- x+ k5 ?4 m! ?: v2 J) E / t+ U* j0 l R9 h+ Q4 K' q8 ]# D
mov dx,base ;set offset to read
" D% X- k8 T1 a7 k9 v add dx,3 ;host command register
! T: e1 u& X# i% Y2 X mov al,num6 T5 Q+ x% U: O; K) f
out dx,al( u: H3 @4 T/ J- f* h2 y7 d
: O5 g: u& S, Q6 k/ D, R* ^ mov dx,base ;Transimit Slave Address register
% N& [& |) {, O1 G add dx,4! L" H. `4 J6 d& J( h+ {; q
mov al,0a1h2 c3 n% X- K' d1 L
out dx,al
6 H9 c9 ~' z% R9 D! g
) F ^) [* A5 |0 y* V, z! ~ p8 b mov dx,base ;set "Read Word" protocol and start bit2 c8 ~) J5 T9 K% L
add dx,2 ;Host Control register- g, Z8 ?4 R: K! [, B% G
mov al,48h
; c" k' ]( i6 r out dx,al y) c' u) z& R4 B |2 d
" f o q& X0 m6 p' ~4 O# q! d
. r+ H* t$ e; {: q! L; Z
& ^. @, B$ c2 Q0 P7 s0 A% U mov dx,base
* s; F& x% J! d9 V* B* g% k" O in al,dx; q+ ]$ S8 F2 `' o% x
mov SmbStatus,al
' Z, k3 r2 y" e" Y$ V and al,1Eh
4 x* N) j6 M2 P% b& Y .while (al==0) ;check repeatly until any of M/ e3 H+ |3 p# N% @+ L
mov dx,base ;FAIL,BERR,DERR,INTR
2 N, ~7 Z$ f% x in al,dx
& ?2 |) U4 Z2 `( w+ |7 u# X mov SmbStatus,al9 L2 E W. @$ r4 Y' t
and al,1Eh $ _% w" t& v. i; y
.ENDW7 n8 p2 ~' t5 M8 r0 e. E* v: N' r! E
9 K. ?4 G) m! j
mov al,SmbStatus & |/ a7 ~! S+ h, g. R# S- v& P& x( l& {
and al,1Ch$ t7 c5 K( s6 V' q
.if (al!=0) ;check for errors
4 ?. l; e$ S- O3 }/ O& |& ], y mov al,SmbStatus
; `5 {& L( R5 q3 U. ^; X and al,08h + ]# h* A& }# _- V6 c
.continue .if (al!=0) . H+ k4 B: U2 S( b
jmp @F & M& k. R" B7 u5 D/ O
.else* W( h8 h( `8 J. m7 d2 S' m
mov dx,base! v- Z8 h3 \- N
add dx,5h. @* C4 l4 b1 g2 N. d3 Y: N
in al,dx
! i, L0 p0 `6 ?! c# C: h2 N6 d call binhex 6 ?" }6 k% L; W
.break
$ f5 Q" O, ~5 m: E8 M .endif* n) u! f9 w) T
+ }7 _% y" E6 B, w
.until (0) }, x* x* @ l% K7 x; {" k
! ^ j" k4 S2 C1 o
& Y6 Y' m* [ P- J/ h
3 a5 w( Y% e8 B, y# @6 } mov dl,20h ;output a space# ~. ]6 m, J' m4 }! F% d5 ?1 {
mov ah,2
) z8 R' z3 [+ m! k2 ^4 V pusha- f/ ^" ?& Z6 A8 E
int 21h' t _4 p3 b6 e1 j3 q6 t. ^
popa+ e( i7 Y$ q( ^/ `1 f2 H
inc num/ c. X8 q% E# k! S5 O9 T
! f% h( V$ x1 q' w
cmp num,80h ;get first spd 128 bytes % p, N; G4 A! a7 D4 M' _- O4 N% L/ B
jnz Again
2 B# I4 N( f5 u( P& n
0 j7 o0 ]& a S c@@:
7 ?5 o* s/ R: }0 _& x: ~+ J; F popa
5 R& M! ?( \+ N4 O5 Z ret3 `; y8 P0 `2 g( x. r
ReadSpd endp
5 c- T1 w' K, E! O5 }( q) _$ M) H o# R) S! M
. u: S: S1 s+ W! B" f8 K
# ^6 v8 ~3 V( U$ D/ `
binhex proc , ~. L" d8 n4 ^4 j6 @! e
pusha
V4 M# S- i' t0 z: |% Z M6 Z9 f , ^3 N1 @8 q& J* j* U. p% f4 ?
mov ch,2 ;2 hexadecimal digits to be printed
' B: c" W; m6 aloop3:
4 t2 ?1 s/ [6 ?7 N* z+ | mov cl,4 ;bits to be shifted
+ K+ d5 B/ t5 H1 Y- e, `* s p rol al,cl
3 o0 U( m- o1 ?% f mov bl,al5 y# v$ _( n, n2 ^/ J* U1 _
and bl,0fh ;mask the 4-bit Msb
2 p/ i* O9 q9 \* M5 Y( w& { add bl,30h+ U' F7 ]5 u D4 r( |& ?. K
cmp bl,3ah
& [# M& R; _5 Q- ` jl next1 ;number or alpha?
; C. b$ z# o* C" A( n2 ^, G add bl,7 . X+ c: o; c9 n) V4 `7 P
next1: . z- C* [" {" D5 w, [4 L. H
mov ah,2 ;print one hexadecimal digit d; y5 v3 S1 d( e4 j6 s
mov dl,bl* B( N* y. T9 \% K2 C
pusha
; ~8 n& q0 R4 t. h ~( Y9 n int 21h
; N; Y: [3 U! c3 M8 Z0 ~7 ] popa- a- X4 @ _2 R B2 j) d
dec ch
3 @. J6 N; P B# ] jnz loop3
; L Y/ {! t8 V2 T) K: F" v& J, Y popa
5 l$ E" W/ c7 L, ^6 q( w ret
, K8 C/ t/ h8 T3 A- J: D( Tbinhex endp# _1 ^+ c$ R, H! z* |9 B/ S
end main |
|