|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: - u/ ~' ]8 y. G7 n4 b8 R
) e5 ` ]0 O$ s9 Z6 Y- L0 R1 i9 S .model small
" t3 _ _! N) a .386' ^" R/ w2 _8 j- P; o- [
CFG_ADDR EQU 0CF8h- {# e6 M4 H# G$ S
CFG_DATA EQU 0CFCh
$ n3 Z1 J, I7 X SMBUS_BUS EQU 0' D" ]0 B# u( R# g
SMBUS_DEVICE EQU 313 M6 b. N2 X5 I7 ^! ^6 |
SMBUS_FUNC EQU 3
9 B8 f) p( A. c% Y; ?
/ U1 B2 h* i) w- Q- S! D .stack 100h" u6 C: j8 i2 J( ~4 F# r
.data
' P% i5 n; i4 p- f* j( f8 Mbase dw ? ;smbus I/O space
7 H( G* E' `. q8 @( S# {. y5 s9 k' ynum db 0 ;byte select) x& l! Y) |/ w3 `4 |, e: O+ @
SmbStatus db ?; I( Q! F2 H, W& d9 g/ D
9 _8 _9 A4 a8 Z+ b5 K .code# z$ h8 J1 s5 L9 p% x3 w8 b- b
" |* [, n$ s1 F; Y* WLF_CR MACRO
7 G% _: T4 e( n3 U pusha
! E( S/ s5 ^4 W mov dl,0dh
# @, n# I/ D4 a- U mov ah,2
& @7 r4 C* a( B- Y+ S& e& f& k( r& K int 21h
& u; u& W. i6 C: o0 M1 ?5 s mov dl,0ah ;next line
+ G" \+ c) s+ j& V( j$ Q# y& B r mov ah,2) C0 c* X- u, @! @0 {# I% Z
int 21h8 r) F! R3 ?; Z: K- f
popa 9 m0 e g/ o1 Q* ?/ D' ?
ENDM
! R" _) n7 H) a8 a$ V' L6 |. q" H* t% M0 C; k9 w
% Z7 \ @% W+ ~% h
main proc far
: F5 _! l V8 H- F1 m0 A: u mov ax,@data' a1 Z: W9 I7 N. f( e1 o O
mov ds,ax
- b& x7 d" N2 R& L4 V3 @
; ~. m6 [) P9 F( R mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
f$ m0 Y. U. B- _$ B, C mov dx,CFG_ADDR
, M6 b) ]- L- a: H out dx,eax
W) g* N8 s5 \0 U mov dx,CFG_DATA
( X6 m% Q5 P: p; T9 P+ l% x9 V in eax,dx
- O% J a `9 c! o& [* W! \8 N - L" p3 n8 w/ r' n! D# w
shr ax,5 ;bit 15-5,the base address
* Y3 P; u8 }6 D L) Q and ax,0000011111111111b! V: O# D" O# U. B$ d# b% I
mov base,ax+ |7 y+ y3 F- L
7 C% g ]/ T" F: T+ @" S: M call ReadSpd6 E0 d. H. _& G9 @
exit:3 T3 z& s- g6 j8 E
mov ax,4c00h* y) @1 A( b) b |. v
int 21h: z9 i* _9 W/ j0 I5 v' {: W/ x' n6 g
main endp
* h: G( m. M( ^* |; A4 a- P8 R# @9 m$ f2 B
7 {5 o- ~8 a- J: x5 o4 A
4 v; Y9 P; c/ R" `% w) h2 X
ReadSpd proc* D3 d. I2 \5 _: A
pusha: O9 R7 S/ C) { C6 N* K8 ~, p
Again:
. Q! \* J, w8 h mov ah,num, P1 {: V B) N5 S
and ah,00001111b/ u0 l+ u h9 c2 n, @9 \
.if(ah==15d) ;CR_LF' _; j4 o4 \( G* p2 l
LF_CR
; N U( o. O5 L q: b7 f" W .endif
P: N9 F e" @6 L3 O
) m7 C% y! z2 @1 H .repeat3 i; @! f4 o1 t! L' i- z' T
mov dx,base ;reset host,claim host in use
A) s5 p& ]6 h. U$ y add dx,0
7 g) W- R) T. S% {% X) z; q mov al,40h/ T- l2 i+ d& S j
out dx,al. `' U( M+ r1 E& h4 A$ v
3 |! X/ T6 l- ?/ e$ X \
mov dx,base 7 ^! h" D, r1 E+ E8 I0 K& \
in al,dx
2 v8 R8 [: i9 v: I. T5 } mov SmbStatus,al8 b& b6 c. F( c6 v# A. H
# w L+ E0 F8 X, w, e! U8 i mov dx,base ;clear all status bits& n. @% H8 I# ~3 G+ G: `. U
mov al,1Eh ;host status register
. P: r: T% K+ a out dx,al+ s# O$ G# W Q2 d3 T! Z
( N8 d2 v, ?! {* z3 F mov dx,base ;set offset to read
$ I; V) a) K2 I add dx,3 ;host command register1 a. Z" E: g) X" i) U
mov al,num
% p% O! L; T4 L: V/ C5 Y out dx,al0 t% |; d/ @' J2 T0 o4 r
7 `' h6 T9 @( q% }
mov dx,base ;Transimit Slave Address register- x& I. i) j! k1 ]% w- Z
add dx,42 Z1 ]3 U4 ^0 C& a, D6 S$ u+ A+ j
mov al,0a1h
5 t! B* c6 N. \, t& B) ^ out dx,al0 @1 \1 n+ A8 q, T
5 k. v. r1 m3 a+ T+ K
mov dx,base ;set "Read Word" protocol and start bit
. ^' d' |3 A* {$ d6 A add dx,2 ;Host Control register. G/ d$ F: X, f& p
mov al,48h
( `3 B( Q# c" k! E out dx,al
) R( w; ~* P* J- W1 f" c E: i / S1 H; Q9 }0 S7 e6 K( v
3 ~! l" J& g! a& S( o- l ) [" p O6 _; k1 C+ M$ P2 {
mov dx,base
* C m7 q" r3 A/ h) Q in al,dx n$ I* T* q3 p. ` Z
mov SmbStatus,al+ X2 O, A4 Z7 {# C! T' s
and al,1Eh2 n: ^! R& u0 u( u
.while (al==0) ;check repeatly until any of
* J7 d m* ~# W3 r4 d: j3 r; g; x mov dx,base ;FAIL,BERR,DERR,INTR, l& r! r/ c6 ?4 c
in al,dx4 k1 j2 w1 \! S9 R
mov SmbStatus,al
# T4 E' V$ v; [7 s and al,1Eh % R' s2 p, u, d1 e
.ENDW4 ~7 W }$ U/ M7 N* q; Y
. l, x2 c1 \' m8 w# I- M mov al,SmbStatus 2 ^! M3 z5 {8 F0 x
and al,1Ch+ l; `; v; N. l, P1 h9 |- f
.if (al!=0) ;check for errors
! H" v _# x$ ?4 ^: K mov al,SmbStatus5 m: {/ j) M; U& [9 J) a
and al,08h
! r& N% J- Y6 P0 d3 H+ Z .continue .if (al!=0) 9 e4 Y4 M3 l; E7 n- n' J1 w
jmp @F # O) B8 v* Y$ h* V# D% a) ]/ a
.else( u0 m6 W0 |- m8 h" y8 g+ U
mov dx,base
; E6 o# ]: G" X add dx,5h
7 B2 p1 r# J3 A7 |. Q! n in al,dx
# \( {8 h& ~5 m& F5 i" { call binhex 5 A, d4 k/ m4 Z% s5 a4 v9 X: i( o
.break
, _( F- ~- p) G' I .endif
, F0 P' K3 y% c' ~7 a/ l
3 `5 F$ R- e% Z& k2 ^! t .until (0) 0 I$ {1 T' ]8 n% x6 \* |, T: A
* O# |8 h E' Q3 `7 h' ~
+ X& n+ W2 K) t" `
# ^% q; r4 a0 J
mov dl,20h ;output a space2 }! A6 w, P4 ]( x7 x9 m
mov ah,23 D6 R# J" m8 }) Y2 A1 h
pusha# G8 }1 n5 M. Y) T
int 21h7 m5 _( [4 {/ e
popa
. t9 Y, } g) p$ x$ `% V. }5 E inc num
7 G; F* l2 q4 A* ?; v# c2 a8 {0 o& T/ k
cmp num,80h ;get first spd 128 bytes E% o7 b/ z2 s
jnz Again8 j! M+ Q% \% M5 `7 Y! L, K
$ ^6 {% o9 ]" V: Y) Z; k7 q4 }@@:- f) P$ E2 q8 c7 T" ~
popa
9 y5 D/ F7 Z# n# T ret* J. J8 { c @" ?7 R' k; Z; x* ^
ReadSpd endp% T9 n. Z' _5 v5 o6 ~+ s
6 [/ @' h) f( L8 z0 i; V/ u( x4 @4 F
1 {1 y1 P/ B; w# p* e7 e6 P
3 N/ N+ c9 E4 [5 I, `" J
binhex proc
1 B+ B$ [1 T8 _ pusha ) z1 \' e1 y6 |- r, q1 ?
/ l9 A7 _. Y0 V4 P7 C; p8 l- H mov ch,2 ;2 hexadecimal digits to be printed: z/ M% o; Z9 A7 V. h9 X
loop3:
; Z. i6 Y: _( I. V" R mov cl,4 ;bits to be shifted: ~& a! `3 `1 }* i7 R% B
rol al,cl' t! x( W. Y5 u( z. j2 ~% L
mov bl,al7 A8 B2 p) P7 g; n. ~$ Q1 V
and bl,0fh ;mask the 4-bit Msb
5 J5 J0 V( p7 F add bl,30h
6 Q9 M4 g+ c M& O. ]& ~& R cmp bl,3ah
8 a5 L0 p q8 z5 Q, k jl next1 ;number or alpha?2 _8 S4 |, p, a' L
add bl,7 8 v3 [- h9 R% ^ b7 @
next1:
2 G0 Q. ?6 |7 q( Y* Z) \- v8 c. n2 F mov ah,2 ;print one hexadecimal digit, R) `/ \- r6 [4 V) _5 ?) X! }
mov dl,bl
8 a* I' @( m5 C% w pusha+ K' i+ }; }2 u( d. N
int 21h
: _$ M" j! M8 } n u; a popa
. N" b- Q% @# r; s dec ch; o( H" U5 U8 F ^
jnz loop32 F7 y( Q4 m/ Y" i1 `: \0 ~3 A
popa
2 h4 n3 h4 J; n' Y2 {# _3 e/ j: w5 X ret, W) X1 [% h, V9 u
binhex endp" X2 [& V. C' k2 Z5 \8 o
end main |
|