|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: 4 ?4 g2 M3 Z: I1 v; e
( X2 b) ]7 Q" L
.model small
) W3 ^* X. k" Q' q$ n3 Z7 Y) U3 j .386
0 B- `7 t9 l- X9 {& U4 O( K CFG_ADDR EQU 0CF8h' v0 j% r N: Q/ ^: b
CFG_DATA EQU 0CFCh( Q, |1 i, |( P& J: Y* P# [+ n
SMBUS_BUS EQU 0* h h) a$ Y9 Z+ W# v1 |; L( \
SMBUS_DEVICE EQU 31; V4 K d: F( D5 k
SMBUS_FUNC EQU 3
# p- c4 m' l( L: }6 r2 d
7 A3 }4 | T4 l' a9 x0 p .stack 100h
2 I# G3 n& g2 L/ V& M .data( C( Y* I* z5 Z1 ^5 R8 t0 C
base dw ? ;smbus I/O space
) j/ x% q3 C# w" o3 P! mnum db 0 ;byte select
/ \( B) Z! X2 U- c! k$ C; G' mSmbStatus db ?8 o( I& K- K! {( a7 Z+ E4 P: n
1 r# l) W1 g4 \8 q& D' B6 U
.code- O7 n. O! n9 L$ G/ c/ q( |& m
3 f- i0 d# G! r1 oLF_CR MACRO
" ~. Y) H. Y$ E pusha! |% D9 N$ n3 q7 |# d# \$ r A
mov dl,0dh
3 R/ ]: I" X" V2 h( b o6 |& \ mov ah,2- x W4 k4 r4 ^4 }( \* b1 l% }
int 21h+ r) T& G+ h' `9 V* Y5 {3 E
mov dl,0ah ;next line
1 i4 \' M7 B# Y0 {7 H$ `8 g mov ah,2' y/ ]! S" \4 }( B% U% c; @4 t
int 21h
& x! W& d. {9 F* I' W q( P0 q popa 6 B, F7 ]2 T4 Z! v: ^' g
ENDM C" `6 v) n) s0 s; S) {
, @; o1 h& y6 t: Z' {7 l; p1 r) _ \0 O0 R4 q9 P
main proc far
5 G, D2 q4 V! f' F5 j$ \ mov ax,@data. e4 n% g, [( j5 O- E. T: `% L5 A
mov ds,ax
/ c7 T& E1 E* }6 m; f4 \
) z8 L1 r% V. j( G mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
3 K w8 X; k& c" ]0 z A mov dx,CFG_ADDR
' K0 W! ` [& s# O1 J* b out dx,eax
2 i6 S% \' z1 F4 D0 { x( E mov dx,CFG_DATA4 p( Z: v5 O- R1 ?* C, H; }
in eax,dx8 c k6 h, Y! Y$ W: \/ i. l
7 {2 c ~1 p1 f1 i- P: C; O$ n# G shr ax,5 ;bit 15-5,the base address% S1 y) r* D/ i4 x" |
and ax,0000011111111111b {, @; g: }4 N9 h
mov base,ax& ~2 }5 N+ p: ?) E
! G2 ?4 b) b$ `5 X, H6 Z ~5 B% k4 W call ReadSpd5 g8 E" `1 ]* {& W' F" ?* }
exit:
( ], k4 ]1 l1 @ n" F1 h6 V mov ax,4c00h7 B1 P6 y" f- t
int 21h# L3 L0 Z& N. Q- }
main endp
! W4 w( v8 p1 |2 ^
% w4 J" m$ }) P* U
?" h0 W3 a. e6 U* @
; {6 Q1 K& K8 gReadSpd proc
0 `! k6 W/ C% p V- d, G) x* T pusha6 ~+ o7 Y# `& M- U+ s
Again:. ]7 W ?/ C" o0 Z6 j
mov ah,num
5 t4 a; H3 j+ J8 | and ah,00001111b
( n! `6 u& F- r6 E5 @" [! M .if(ah==15d) ;CR_LF
+ H {3 n& }$ ^5 F4 n+ B# U! W LF_CR* b( O! p6 D# O7 w& D/ w+ ]# b* p
.endif, D* a+ c/ |2 Y; E" B" \) U
. M6 g$ s& W f .repeat0 m! V) O$ m6 P& D0 q. G" G
mov dx,base ;reset host,claim host in use7 H. _# ^+ }' L! k" q
add dx,0
. K- e; X0 x( [' d8 t- V mov al,40h
/ t2 T' P6 Y' N# G out dx,al* Q6 Z, n) v, k o" l6 A$ M
0 }+ p i1 X# `/ Z! \
mov dx,base 7 o1 }( I8 `- h, w/ j$ S: }0 ?
in al,dx7 Z5 {* g& J: [( a
mov SmbStatus,al
6 N5 k& V! Z6 X z$ L 4 T; [: U, X4 b* n0 r/ o. G% R8 t
mov dx,base ;clear all status bits* r- u: C% h, b# W7 e! N% |5 ]4 Y+ t
mov al,1Eh ;host status register% Y) F8 A v/ J! B0 H
out dx,al
- y7 { o" O7 W' `8 M1 P7 g7 R1 j
8 E' c' h' L0 [7 j mov dx,base ;set offset to read
! I9 X( U7 L' W add dx,3 ;host command register5 i; R& @! A" O; Y5 ^/ f
mov al,num3 ^( V1 l: F2 Y# ]
out dx,al
$ v+ c+ z* z! j. k$ a4 m . N+ L( D \% X. q `% h
mov dx,base ;Transimit Slave Address register
. A3 w9 l. k9 P" p+ M$ o add dx,4+ j: u* U+ D4 H6 @3 E& v
mov al,0a1h6 @# D- G0 y4 n% m1 Y
out dx,al
) J% B5 \7 E7 ]' B: d R
6 m* f( B$ N |. Q/ { mov dx,base ;set "Read Word" protocol and start bit5 c% h! C3 F& j: a
add dx,2 ;Host Control register; V" x0 j1 g6 v' W _4 h# A/ X9 t$ B
mov al,48h
) \% K B" \4 `5 V. k$ P; ~* H% O8 T2 Z out dx,al/ e. N( A8 X# h( F4 l9 Z
* j) ~0 k# A) p
8 b1 B* x4 J; r. R! f- f/ {6 |9 v2 i
}8 j2 C: B3 j$ V0 _& x mov dx,base
- n/ C0 i" @- f: Z in al,dx
( r* {; b1 D% e$ }; d mov SmbStatus,al
' W- U8 p2 Q+ q2 u0 ` and al,1Eh& z; C1 l8 [: r" b
.while (al==0) ;check repeatly until any of
: m/ i2 o: X9 O! A. U mov dx,base ;FAIL,BERR,DERR,INTR0 a/ V$ @. I9 Q0 T- `
in al,dx
# H# v/ ~0 {4 B3 x" l1 ^) ? mov SmbStatus,al# b% x4 d6 ?- N( l3 m
and al,1Eh
9 [! _0 F* b) f/ f C( A .ENDW- |5 p" W' q& ]0 r: R+ c
3 i" i4 p* W8 c2 E9 K
mov al,SmbStatus , g v1 Q: I+ r4 [! _
and al,1Ch# I& W# y" U5 D Z( H& ]
.if (al!=0) ;check for errors
+ ]/ f H8 \, x+ h- F e ? mov al,SmbStatus2 ?- E- k& F- D: i! S# d
and al,08h
0 e( M: K4 K4 w' j .continue .if (al!=0) ; G3 s9 x. v* [
jmp @F
' v. @: i. w( v' ~ X9 u2 d .else
1 Y* h8 T# X2 X( Y1 k- b1 y) m6 [ mov dx,base/ `; M' W: B% ^
add dx,5h) k$ e( y5 Z! `. H' O. Q
in al,dx
, @) g, ^: j5 ]2 L0 q call binhex
- F& K8 Y2 [& ]: o. k .break
% a8 R/ L# w8 `. _ .endif
8 c/ y8 P% a5 q0 y( _
1 A6 l. ^4 ?# e$ @ .until (0) : S' M, m6 O+ j
1 \$ Z- u; z, Z2 V7 g
/ |! e+ ]0 Z- q
6 u. q4 V( p' \ mov dl,20h ;output a space2 m9 W' [: X8 R' q( K1 L
mov ah,2# R% H/ T" ~% g x) B
pusha) v$ r- z2 {& _' S6 b6 [+ K
int 21h
! B) z- A- \$ M* k( U popa
. _2 M+ Z. ^/ ]! f9 j, Z! B inc num$ H! e# j; r0 k4 k$ v$ s# x3 Z
- a) v" p$ G4 O
cmp num,80h ;get first spd 128 bytes
7 e8 i( L. ?. `; G, k, l jnz Again
7 i& f, V8 [. g) V# o% S4 x! T8 p , I# e6 K1 Q) {( a4 c' L
@@:9 |, F0 y) f& ?+ ]
popa
( Q# W) V, ?& s! c6 r& ~ ] ret9 ^2 u- z: Q9 o, Y- `
ReadSpd endp+ N3 C3 b. Z1 F9 m
. W& |% D7 R0 C" l: t# g( E
! Y4 F' u9 @" J+ j( ?/ A- ?# j' P7 O% g5 \7 ^* V
binhex proc ( {; ], R! t0 x
pusha
6 |& ]2 x. y' H 0 g# M/ C: R1 C" i6 Q1 F8 u. ^1 ?
mov ch,2 ;2 hexadecimal digits to be printed- v; X/ M3 J7 U, B0 k) M4 |( n9 d
loop3:
2 }+ x" L" B! B( k+ e$ C# d mov cl,4 ;bits to be shifted
. _: |2 Y7 ?! g8 H* C% d; \: z0 N rol al,cl
]+ N0 `! u0 s8 u, a' a$ f2 i) L9 |8 s mov bl,al
* _! r+ s# w- c& v* g and bl,0fh ;mask the 4-bit Msb
6 y: G. y5 K/ A) h add bl,30h
- f, v/ x6 v& R cmp bl,3ah
, b% d! Y/ C9 \+ k, L jl next1 ;number or alpha?
- L* U( L. J8 X, s' ^ add bl,7 1 y' {+ u* a" V& D
next1: ) [! }7 J% z8 t
mov ah,2 ;print one hexadecimal digit/ N4 Q& ~3 s! D, p1 Y7 t
mov dl,bl. G4 _# ]2 [7 c
pusha2 O) I. J( J- f8 t% Y4 E, H2 B
int 21h
: P, K0 `# m, a* E& \$ m popa" U( v8 [9 S: J! o+ B
dec ch" t# z) L+ d, t
jnz loop30 J1 o9 r4 P' b! B9 x8 b' O3 c
popa
3 d4 m+ ] B! k ^, q0 i* c ret- q% p& o: n: l) Y! s& e) r( g
binhex endp8 S) W0 t2 ^6 K9 ^
end main |
|