|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
6 v6 }, j- L# E% P8 }' R* t b" \( ] j( F6 h: j
.model small
8 M: i7 t$ A' { .386
' I$ t) N: D$ |$ M0 h8 i CFG_ADDR EQU 0CF8h7 M7 N/ J0 J, k: s: o: R
CFG_DATA EQU 0CFCh
1 C7 k3 M; E( Q9 o$ x- i) @: h SMBUS_BUS EQU 0
" W% e- Q; w$ N6 G0 } u SMBUS_DEVICE EQU 31# I/ Y3 W+ i2 G, N3 j
SMBUS_FUNC EQU 3; v2 r% E, j' a$ t
. F- A- M. a' G2 } .stack 100h7 G3 s I; w5 w* l& K- S) V
.data
2 `* ^% s7 M1 L; ^; h/ [0 tbase dw ? ;smbus I/O space
}4 Z3 S1 x1 L1 xnum db 0 ;byte select
0 ]) j2 ]" z( j" ^6 T) d2 XSmbStatus db ?
1 B+ K) V; T$ p7 L% }6 s4 x# V% R
.code
; D1 K6 e: s/ @& o+ ]
! g5 @, D2 \! o9 }( qLF_CR MACRO, ]4 f5 E) W5 [ b$ R2 s2 g3 B2 A
pusha; A& q( F, g1 _: G( ~, m8 V
mov dl,0dh ! ~# ]/ ]3 a( e- ~
mov ah,2) ^4 v; ?# ?1 N, [3 M6 {7 s2 _5 b, R
int 21h
! ^' O! Z/ L6 {6 M9 N& H mov dl,0ah ;next line
& ^# s1 M/ Y, X5 f8 p. G mov ah,2
! X* c& ^ M8 S- L1 c4 y. Q int 21h( i% _. b9 z) C; a6 [; b: R8 U3 D
popa 5 Q+ L' P8 r6 d
ENDM! M/ i5 S% I1 v& K7 g4 i. U: Y
. h& Z. Y0 j Z7 ^2 g- s+ v& @( y- R5 o5 h& u' V! p! L. P6 q
main proc far9 D& P! n/ I6 t& a$ ^
mov ax,@data
! ~8 {( t, u* Z0 W% j mov ds,ax
) m; u8 C; r* I& _
+ f8 h, N1 t" y/ z4 N: C mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h% D1 @8 _" W1 ^' D: ?& t3 F/ q
mov dx,CFG_ADDR( T3 ~) D8 N% J( B% J
out dx,eax
6 p$ m9 w; P4 T8 [5 Y# h mov dx,CFG_DATA2 D9 [& Y& q1 E3 T
in eax,dx
% h' O& a& w, s: t
& s5 I% H7 }$ C: f shr ax,5 ;bit 15-5,the base address/ j# M' j) G3 f$ ?- S
and ax,0000011111111111b! X- N) {8 `( b1 }! Z
mov base,ax/ C% q C/ D- J& e- K
; \/ ~* N' b4 d; W
call ReadSpd, x% t" [; z3 U! ~# n0 r
exit:/ @- f- ?# A2 ^4 _
mov ax,4c00h
9 @ \; H d- w7 ~# _$ m9 z* s$ C int 21h5 i3 i2 o. c2 S+ y5 A# z
main endp
* B# D* _8 e) D! p* E4 s9 g$ C1 z/ | J, ?& T. S9 J
) e$ ?6 L! O% f& x, S: y: ^4 E1 Y6 G0 ?; }
ReadSpd proc1 }" }/ E$ u+ ~; L
pusha
; a/ G9 A1 j; LAgain:
" t+ `; [5 e2 N2 @" b* \! Q w mov ah,num
* a; N! B- K9 ^* e and ah,00001111b
& B& ?8 {7 i6 z7 t" q% }0 ] .if(ah==15d) ;CR_LF
1 Q7 M0 q: _% ~: `7 J- N LF_CR
7 \, d. S/ {! }, C .endif
2 _0 A5 P3 _, e. x) p$ J2 n& U* ^" m0 S
4 r3 L2 R! t/ r# b% y% l .repeat. w: U: U/ L- t3 |* w4 a
mov dx,base ;reset host,claim host in use
. |4 ]: W5 f, d( i$ d add dx,0/ t4 w* ]; u, z
mov al,40h
: L/ \+ p2 |' z s! ~7 j4 g out dx,al* A9 c b w( B* X: L
1 w7 Q( d+ O& D/ x/ m
mov dx,base - U, X/ }, N5 b; ^& p9 ]
in al,dx, p) ?0 b: j* B1 x: X& A' Y
mov SmbStatus,al
9 Y8 I1 K& |" t* O9 y ; ?6 j, z' q* ~3 R8 r
mov dx,base ;clear all status bits
- _" c8 \. v, N5 I: ]- ?( _ mov al,1Eh ;host status register
: V$ q5 G8 B8 Z1 X1 f) ^: Y out dx,al
$ G" N% r1 V8 I; ~! d" A% V$ k
% k4 {6 ~* [' }, `8 c mov dx,base ;set offset to read x) f$ O8 l2 j, _- Q/ x
add dx,3 ;host command register/ c3 [% v& y0 z, w* x
mov al,num9 g" _/ A6 e0 Z1 Q) d9 b
out dx,al
' i0 A) Y" Y3 C Z7 i/ z$ o: C
4 A. ?; X p$ r( M, t9 I mov dx,base ;Transimit Slave Address register \% [5 w& C: c- k
add dx,4
/ s- C% P6 u6 B, d8 I1 S7 z mov al,0a1h- K% R! Q6 G6 V2 Q V) K D
out dx,al
8 ~( z; ]" r' @6 ?. B' o/ V3 O
+ j+ |# F# X3 M mov dx,base ;set "Read Word" protocol and start bit
& H, W+ U7 G4 G add dx,2 ;Host Control register
* U# a- j; a9 B7 w mov al,48h 5 j; t0 q4 l2 x/ y$ v
out dx,al9 g) {8 H, @2 g% [9 I$ U8 H
2 s& N! O% d* S' d$ j. x
/ b! {' V3 s f9 @& @
* U& ]. S2 a4 @# ^8 v1 W
mov dx,base
) F* R3 p- r V4 }2 e: N in al,dx! r4 K! {! p; {2 a& h# L4 q$ T
mov SmbStatus,al) |0 [/ `3 l/ e. S: D' ^
and al,1Eh
3 B- d* G* n0 `& E' c" A .while (al==0) ;check repeatly until any of& U5 |5 D. k/ a5 _# c# [6 P, h! h
mov dx,base ;FAIL,BERR,DERR,INTR* g- R6 m& |. Q5 H5 L; r' A% `
in al,dx
, b) n7 O! X9 j- e. K: u mov SmbStatus,al
# [ S7 N [/ O% i% s% j and al,1Eh + c4 A8 C) M# a, P8 b; e3 T" D
.ENDW
8 N# W. W* Q0 G
* i( P- Z# i6 s' B: x) c( x: l: d mov al,SmbStatus ) w9 u% H8 ^* q. `) m- b
and al,1Ch
/ ?& f+ Y/ y" C- D4 R" A .if (al!=0) ;check for errors
: q) r* Y+ K3 ~- b mov al,SmbStatus/ N6 e8 Z( S5 z, Q" Q& L
and al,08h 4 q C9 O: Y7 }9 O7 Z
.continue .if (al!=0) 5 E: ^0 L9 p7 L5 Y+ f) ?
jmp @F 7 k" X( ~( S8 v) c9 X1 v7 Q
.else
: q3 @9 x7 C7 y* u# l" q: C& J mov dx,base! E6 c8 P& F+ a( z
add dx,5h# d9 ^) a8 X2 c) u# C: A
in al,dx ( i- j7 l4 w: k/ Y
call binhex . g, z; ~9 z5 _1 r
.break
9 B) [7 r$ v7 F4 ]# N .endif
( h9 ]9 k7 U6 ^, n! |- Z% c) K 2 R2 E( R# E9 E- X2 X# Q1 \
.until (0)
& b/ \) p- W: q 0 W, z% g% {" H( O
; u9 { a" q' L1 n' V
+ ^7 B, {& L9 s* d4 g0 y& f
mov dl,20h ;output a space
' T& ^2 k9 x: i, O$ Q mov ah,2
* |% d$ H9 z" X/ t. B8 n' ^" T pusha" v2 r4 f- J( [* _7 X6 L
int 21h
0 Q( |8 z* F% p) b3 k popa
A$ X# `; R/ i% L4 `4 o inc num; z, f9 f% I4 {6 ]4 m! d
1 ]$ T! B4 m; C+ i5 c8 Z$ q
cmp num,80h ;get first spd 128 bytes $ H) w2 B9 A1 M( [: b( t' t2 C
jnz Again1 e: b2 W- b; I6 s7 h# Z6 e
' \) D5 Z9 C% E, u4 N
@@:
# Y( ? w4 P$ L6 T popa
& X! j6 C! a k2 k& n/ b! l ret
2 k; T6 T" C9 Z2 |# u: \ReadSpd endp* x! f6 X) Z( w! W7 t5 r
' W* p4 C+ d& t
5 G/ o6 r( g% A: j3 A- P1 l
- G" T. e' N! x1 Ibinhex proc
6 L- C# k% b) H( ?* O% d pusha
0 c: l/ f: A$ L0 A
7 `" I, L( E1 k B l) Q mov ch,2 ;2 hexadecimal digits to be printed
) \- r5 W( d& q& P8 ploop3:
9 W+ V: ~# e# Z! @% |9 a mov cl,4 ;bits to be shifted
" t2 _2 f9 v$ {$ Q0 ? rol al,cl
7 ~5 C( `, A. V5 X% w mov bl,al* ?# M$ p) t& |- d' k% O
and bl,0fh ;mask the 4-bit Msb
2 C& M0 k3 q' i+ k add bl,30h G6 x1 g/ W; ^; e# S; d
cmp bl,3ah! c- A" } z' W$ h2 B+ j9 \$ v5 X
jl next1 ;number or alpha?
# ]) x. @. M( Z; |3 N6 o add bl,7 " T! k( o, r* D$ ?7 G$ I7 t
next1: , ?+ @+ R- P; I2 [
mov ah,2 ;print one hexadecimal digit
8 [5 `! G, s6 o! a mov dl,bl
( X9 t, v* x. [; T( h/ W; i pusha
; ]0 j+ }4 t$ x5 Z; i4 V int 21h9 P" o6 @; q9 m/ B5 d1 ?
popa
; ]' }" N9 d& C4 _% c# U2 i) ~ dec ch
: G6 S$ _# e4 N2 O jnz loop3) N% O+ V+ }! o; \
popa
2 U3 c6 \8 l+ z# m ret
# V8 f* m- M N1 s. T/ Q. ]binhex endp
7 o& B" m7 O/ b) U4 K3 E end main |
|