|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
9 v y, @% B* \* Z' {7 t8 R: j1 Q. z" Z4 l; A4 S
.model small, H/ o" f. O5 q8 [5 N
.386
) B$ _* ~' L! u4 |* B& g) W# R) o/ w6 ] CFG_ADDR EQU 0CF8h R \% A: T2 J5 j
CFG_DATA EQU 0CFCh
; P& D' {! s7 K/ z3 L( v; I3 z SMBUS_BUS EQU 0& f) Y* l# X9 I- J0 }2 W
SMBUS_DEVICE EQU 31
& N" a7 ]5 ~$ F( ]0 {/ b( J SMBUS_FUNC EQU 3' p8 Y4 R: u3 D4 U# P# S
2 Z! R9 u- l) {; Y/ h8 ~2 u4 F& ^) y& O
.stack 100h
! g7 n' y! e t* \9 m# p7 \6 H .data
( h1 m0 n9 A6 k: f% sbase dw ? ;smbus I/O space
" D9 ^* |/ E3 b, E9 unum db 0 ;byte select n/ C6 O% o' j0 z
SmbStatus db ?' f4 ~. y! ?3 W( n
4 E9 [+ B9 V7 I4 t3 O
.code: }& \& v1 J8 a- L% l
8 t; Z+ N1 Q: v% ?- DLF_CR MACRO! Y' A; @* \9 {1 k/ E8 W! K
pusha( ]8 B" ~$ [2 s2 \
mov dl,0dh 1 F6 n0 c. o8 | N1 M x
mov ah,2
9 K& w' q8 N5 k; v( e int 21h+ D2 r1 }8 e D+ v& a
mov dl,0ah ;next line
- o; N3 Y" B. u, m mov ah,2
! ~$ V; V. d$ ` W# j6 d8 ~/ I int 21h3 A( ~1 L7 P7 l/ x, G" a
popa
! J% e* d' ?, n ENDM8 J+ K9 i9 I+ s# e* W2 {
; R- N- e+ B" e
0 t% U% X) l0 Y K6 t" ]
main proc far
% ~1 }8 s4 W5 O( u; h mov ax,@data+ o, k; L& V! G/ P
mov ds,ax2 W/ U* j5 a7 ]
. m/ D# K7 N* W' \+ e" A3 ` Q
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
: F( L6 a" m1 J9 @2 j J) L mov dx,CFG_ADDR5 J2 J0 H5 `0 f; h3 D
out dx,eax
6 h$ |/ r/ H" _) H1 x& | mov dx,CFG_DATA: W; m, H+ i2 f; K- r @. {
in eax,dx. s. [* e1 o- z8 m; Z$ u) D
: N' i" _, Q7 @# S% _/ `8 Y
shr ax,5 ;bit 15-5,the base address0 W2 e: h x8 Q z$ |4 c: L
and ax,0000011111111111b
$ R- G# W t; [1 } mov base,ax. G7 L# q8 j4 f O2 L- P0 e. n, l$ j( R
5 H: `/ `, m- Z call ReadSpd' k b( ^5 }# {' | C) f
exit:! G5 O$ t6 h5 {
mov ax,4c00h" [. O" g3 |+ P2 n& Y% F
int 21h
' A6 q# d+ ^3 ~% x) ymain endp
+ t% j6 }& ?; o' d, q
& R! @) \0 r+ [( u# V1 C3 w. D- ?+ L$ f
3 h* J) s/ _, H0 L$ e! ^3 f
ReadSpd proc
5 {: h; ?3 N9 K0 X pusha
) d s( q/ @1 o1 sAgain:
( `( G- H) r8 \/ P$ P mov ah,num
1 B" D; x/ K& m( O3 b$ v# d D/ F# E and ah,00001111b5 ~0 T, i% g9 X6 I
.if(ah==15d) ;CR_LF
7 o: X9 [( ]7 N% P4 y# D- W LF_CR6 P' A8 W- P7 c) Z1 A K: B
.endif
3 S6 l+ _) w! N, q# m: m X! ]
' X$ t; f) `9 G! H3 @6 K4 U .repeat9 j: h' v6 |! S8 @
mov dx,base ;reset host,claim host in use
2 X: g2 H$ h3 w# C0 i& ]4 ]5 b) u add dx,0
' D4 J. X5 S2 V; t9 f+ [ ^ mov al,40h+ _ Z9 [4 p( f
out dx,al
/ u" _' E. y8 U" P; V) Q
! o# r6 H0 G" |# o) Q# B0 Q mov dx,base ! R1 j% f- q+ C3 a) H
in al,dx
3 T# ~6 o, O. W z& S7 x mov SmbStatus,al+ O/ e% V1 C8 G( s! ~
* I( c1 T. G1 G" x5 M mov dx,base ;clear all status bits; `! _( J; m8 ~* ~* ] Z
mov al,1Eh ;host status register
. a: V, f: D0 u+ l. V$ t out dx,al7 v% D* w8 k3 r7 l& m
- j6 ~3 Y5 D4 ^- |/ D3 ^0 z' q
mov dx,base ;set offset to read
2 F8 m. |2 ~6 L. c2 T( j1 J0 F add dx,3 ;host command register
, K$ m: v1 d3 P1 b% ^5 u; j mov al,num; \) g& z8 I; ^) c# y" G
out dx,al+ H6 q% }6 w8 V
( X* v3 n9 q# _ ]) C mov dx,base ;Transimit Slave Address register: E* U8 }, O4 t2 s$ v3 [
add dx,4
0 b3 \: s+ I; w( C' T# ] mov al,0a1h
! Y2 B3 a2 e, z$ m) z# U0 y out dx,al
g# }' f0 K3 ?& I; }! i 3 s% A! A2 o) [/ m! n( U1 f
mov dx,base ;set "Read Word" protocol and start bit
9 e! O7 _$ p' |; m% n add dx,2 ;Host Control register$ u- l; F5 d- a9 L" y% k
mov al,48h
6 A8 @0 T4 z3 o out dx,al8 {4 _2 D6 O5 \/ o) J; y) [
2 p1 R3 N0 n0 q2 I- Y( [0 M( p7 d
6 j: O$ N3 }5 b+ s4 l5 K
$ z+ M: h( c% d/ F9 L9 P' N mov dx,base
+ X/ i/ f1 E" c' _: } in al,dx( s6 i( H" [9 B$ X* P j5 y; c
mov SmbStatus,al
& u0 s8 Z/ n8 r! P and al,1Eh
' ~* }) k+ G1 t1 Z+ y4 S" V .while (al==0) ;check repeatly until any of
/ ]" h4 S: N) Y: U7 [ mov dx,base ;FAIL,BERR,DERR,INTR
6 _) x! e1 y/ X3 V# ^ in al,dx
" t/ @$ M4 \' n# j* l* D9 S) m7 H: G mov SmbStatus,al, \) [( {* K- H% \
and al,1Eh
) k, q: B/ a5 B$ M2 e' a+ q: C3 Z* [: V .ENDW) I0 @9 v2 x1 }, o: K
. {# ~3 U+ q* X
mov al,SmbStatus
& O2 s3 H. o9 U: ^ and al,1Ch
4 x+ M; C, N4 F8 m6 _+ r) x .if (al!=0) ;check for errors 7 E$ {* U8 L$ H; z
mov al,SmbStatus
$ y f( L* q6 n and al,08h
7 q; n/ E c! B! ?3 ~ .continue .if (al!=0) ( X0 T) o0 m# `( n
jmp @F 0 n' `- O! n! M
.else5 a4 O* S6 j. W; Q# M- `
mov dx,base
. A' E7 Z+ u) Z- q" j add dx,5h
/ J2 _! Q! D! X) K# k& T in al,dx
" J; N. A, `, T- h- w3 Z6 I call binhex ; K9 d3 w! b. M
.break. [& E# }! S( Q* T3 N2 m
.endif
1 t7 }2 }1 z! Y! q
- L- h. @# ~5 \; a$ H8 h1 O .until (0) / }0 c* L: L9 A$ t) M; J3 n
; f" S: V. z* h/ `: r5 l* P! i 5 |9 B' p; ~0 l3 D3 V; M
* a2 [' [$ F: z
mov dl,20h ;output a space
7 j& @1 {+ F6 ^4 V# E" S8 z mov ah,2 `" @' d( K% x* `& o5 b# o" ~
pusha
8 t0 x% h5 A5 ^) T" J int 21h
1 K+ c% j( t- c popa
0 c* }0 Q4 ]/ l: `0 @ inc num
5 L# @4 Z. @' I. m8 @0 A! `$ |* G) p: y1 K9 }
cmp num,80h ;get first spd 128 bytes 2 }. y9 O2 b0 S$ ]4 ]8 q- e4 o( q
jnz Again& c' ]' j" B+ l! i
( W$ }* N4 g& Q; y7 P7 x3 @@@:
# G5 ^# w1 z* h$ a1 d: p/ c popa
8 N& i' d2 _: C' T- W1 k- {2 V ret
3 z- Z+ x$ ?9 B' rReadSpd endp
0 h+ ^4 l/ F2 ?/ s& q3 r
( j6 _3 O* b! ^, f+ l
2 o2 D+ R* f' G) @7 r) u/ ]- Y/ y$ o6 E( a/ B# ]' T
binhex proc 5 `% T" H3 D& G" y, L2 n
pusha / U7 `" z( w0 A: a
/ a" M# \5 a7 L0 y# z mov ch,2 ;2 hexadecimal digits to be printed: t, P% Q" @8 j; o$ l3 }- M( C
loop3:
- X4 M) v8 L q: p# L5 t8 _1 y mov cl,4 ;bits to be shifted' m. h! ]# r" y( a7 M3 ?; K
rol al,cl
# t. y& P2 {8 {- C mov bl,al, t; @1 ^" S. d `1 j$ d7 S* N
and bl,0fh ;mask the 4-bit Msb% L1 `) V x5 x: ~. ~
add bl,30h+ d9 L% ]2 y) N
cmp bl,3ah/ \* X% f. C/ D
jl next1 ;number or alpha?
, O8 d" n9 H7 l5 q" _6 j add bl,7
, a$ g9 z( a( o, q' g/ @next1: ) p/ v) B. S9 l
mov ah,2 ;print one hexadecimal digit9 N' q$ W; R, d# Y2 w! k
mov dl,bl
) _) W! o- D* S9 X pusha
/ S$ Q) ^& L! ?- B' G w int 21h4 F' \; O, I$ B3 Q' r
popa
) a* d0 Z+ x( K9 G2 H- x dec ch
1 E% c! P$ Y; o3 |* T jnz loop3- A# g) r1 V3 G4 T0 [7 G# J! d8 h
popa
# U* ^4 l) j J' s; G ret ~7 L5 z2 w8 |1 k/ T9 G
binhex endp
9 d5 l( T: n0 P- Z1 o5 W8 x. Y end main |
|