|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: * @7 ?5 D8 F! H) w
/ L' s- _* _* D0 N' U0 n$ o" b- ^' ~ p
.model small8 H, Z" v5 t4 v% r5 t
.386; {' k9 l8 L& i$ }
CFG_ADDR EQU 0CF8h
. \9 o2 S/ }; B1 Q, s$ r CFG_DATA EQU 0CFCh
' J+ d3 v; Q/ Y: a) O3 S3 S7 g SMBUS_BUS EQU 0
7 d# x" w: S0 g7 c3 [" ~ SMBUS_DEVICE EQU 31
" z$ z3 F& k, a SMBUS_FUNC EQU 3
. l, l3 ]4 O6 ^7 X
) \4 \/ F+ b: Q. W2 v .stack 100h
: o3 b6 @. @" q- Y .data! _! r0 S) g7 U: Z% \5 X8 C
base dw ? ;smbus I/O space
8 ^2 ?; H! J. r" _9 v z6 f) O5 Pnum db 0 ;byte select3 d* l) }9 ~; k z3 n1 C
SmbStatus db ?! T/ h# `4 ?( x% r
1 y9 {! d, N* _ .code
0 u, Q8 J4 |& M7 w6 `3 W* K: |! w, R/ n
1 Q( F/ ]3 u( B4 q0 a$ t1 D& W% MLF_CR MACRO
( p' ~- n$ ` b( A pusha$ W4 F" e; @/ Q; z1 U" J
mov dl,0dh
- n4 S! V+ N: _" ?- W: X6 w5 H. r" a; R mov ah,2' P6 F I }9 `( r( x* i' x
int 21h5 I p% u* c, L. ]
mov dl,0ah ;next line 6 E. D3 T7 K" N/ g& A7 X" D" V- S
mov ah,2, G/ h$ v0 v2 I3 K/ Y% b' s
int 21h
8 ?3 o+ j! H- B8 E( a, Y; y+ G popa : y) g2 V4 F* a, w6 k. N4 Z
ENDM
" C9 d, ?: N! v# G- k8 a3 p9 d9 m, I, w
, {2 b0 u: W! Jmain proc far
) h' o0 B* u4 L/ B mov ax,@data& [. Y" P6 F6 ^& `/ F8 s8 i/ e
mov ds,ax
) m! n6 k# i% q3 K3 ~
0 i5 c6 o+ k( R; o mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h% E l% I( g$ h: c5 g/ A
mov dx,CFG_ADDR
6 p/ b$ ~2 a5 P& } out dx,eax
/ [! f$ }2 y% j1 q* O; a. j9 @ mov dx,CFG_DATA! N' j$ D: O: h* S
in eax,dx( f0 W2 o# X0 g* X$ h/ o8 u M
5 Q1 l- I% Z& I shr ax,5 ;bit 15-5,the base address
1 Y0 D& |! m* q% f ` and ax,0000011111111111b D1 l$ E) \ l4 I' j9 M9 A4 J
mov base,ax
) T- H1 t% r( t+ V 1 a1 h# ]% g# V! m4 ^1 \& B
call ReadSpd% b& \! |- d6 M7 |# a) A' @
exit:- t/ }4 U- f, G! i% ?' Q& A5 i0 {+ }
mov ax,4c00h
. G+ t& e- {4 H& F d& F int 21h3 }- x7 {) [( v1 ~- Q2 v
main endp
: _5 B2 d& N1 }* r1 k" b
* X% v8 }4 ~; t0 ?% B
- m r: a* w3 D v+ Y4 E6 O4 C+ K, V) R0 Z& ^! @/ p
ReadSpd proc; @; L; W2 a- N1 _( K: T0 Y( T
pusha/ A, k: _$ h/ c9 `% E! l
Again:
6 G/ Y/ a2 S2 h! H3 I mov ah,num
/ n( g& F, k/ V4 T) i+ j4 o and ah,00001111b0 k( C0 z! l( U: ~/ c$ W
.if(ah==15d) ;CR_LF
) ]3 S7 }% H V1 `; G9 m LF_CR4 W9 a! O$ m# W/ _
.endif& r, r y/ m, {* W h; L
- ]. `% [- d$ I# ?8 \8 h0 } .repeat
/ l: Y) e# }! J# H Z1 {2 M mov dx,base ;reset host,claim host in use
9 |& u. Q" ?7 g' N add dx,0* Y% m4 L7 n+ t* ~/ I: ]# I
mov al,40h
5 ~: T$ ~) u8 a: V. m9 z) y$ m out dx,al
: ^3 G. K+ K/ P- w" z
+ A7 k7 S, D$ A" \ mov dx,base % a3 n' b% J7 L) O, L8 j- l
in al,dx
" Z: m: n6 W" d8 P" u7 a$ j$ n" o mov SmbStatus,al$ ~2 g1 C3 `1 y: E
# o+ c/ O% b( O k9 A! Q- W9 W mov dx,base ;clear all status bits
0 r: a- s6 }- U/ Y" Y mov al,1Eh ;host status register2 C4 F2 ]) {9 j) b" m
out dx,al
% W5 j2 S, y l$ n6 _5 y1 f ! O) i% [$ C" P+ J8 r5 |& k
mov dx,base ;set offset to read . W9 @: i4 N; J9 L
add dx,3 ;host command register. J$ N* O" q8 F: v
mov al,num; a3 z4 b! n( V, m; J
out dx,al
; ]. S' c3 v5 C7 w $ Z3 w% J8 c6 h7 q
mov dx,base ;Transimit Slave Address register9 i* X& s4 J" c: ~! p
add dx,4
- E: ? u1 t/ ?( y" c) H; ]$ j mov al,0a1h/ h4 M8 U% E0 T& D# \
out dx,al
- c h) i* o/ ] G u' { % `9 R$ ^6 G, }: }- G+ f2 f
mov dx,base ;set "Read Word" protocol and start bit
' W4 e0 b: i9 k, v; O add dx,2 ;Host Control register
1 Z g! ~: @2 c% m9 l mov al,48h
$ @: S1 y1 }7 U. l out dx,al6 `4 k& H- ~( }: I6 L: e
+ ] U% i! I# S9 I, X, H8 r9 O
2 S9 {; f; U2 P
. n2 {* [3 M7 r9 P+ Q/ L* ? mov dx,base2 X3 Q6 c8 V* e! P) Y
in al,dx
7 S, s+ D8 Q- L6 r! V mov SmbStatus,al
! k3 v: e/ B: {9 l4 g2 D% M. o2 l and al,1Eh
5 T; d' ?3 n7 R9 y+ K .while (al==0) ;check repeatly until any of
/ m5 [2 I% N$ @. _+ { e% C! O mov dx,base ;FAIL,BERR,DERR,INTR* G; l: b( {7 T6 @
in al,dx
- }# x% z7 \8 W9 n' @$ J& D mov SmbStatus,al& y9 \ g( t6 c: e$ s4 s
and al,1Eh
0 v, s, y7 Z+ M+ k( O; k9 I4 } .ENDW
) y* s$ H. ]2 o- O. E
, }) r" L0 P& {- C mov al,SmbStatus / G2 }2 \1 A3 M% y5 J
and al,1Ch! i& ?4 X: a/ d6 d/ j: c* v, n. X
.if (al!=0) ;check for errors 3 t8 [, F: D6 y/ i: G5 `: h
mov al,SmbStatus9 X) I, z; m# D
and al,08h " Y0 x1 x( i$ d4 ^- z' w0 x3 r
.continue .if (al!=0)
) K/ w2 g6 Z, m+ a3 D jmp @F ( }% y; `! X% s8 `& ?( n5 \
.else
" K! E2 ~- M! N3 @: h. s mov dx,base) c8 o6 B! u; x2 R" {
add dx,5h4 c6 L k4 x: \* V" h8 h, F, d% R5 A- h
in al,dx ' [2 s$ ^+ q( ^+ g
call binhex
! q/ A. @$ a, n" s .break; t, } l. d- V+ L. |( r8 }" [9 Q
.endif' H0 g! T4 J6 M$ X+ }3 N5 |1 W3 w/ P
7 p5 ~ I6 v4 s& `
.until (0) $ D- H* L6 x8 g0 c3 A! |. ]: K$ J
$ S! H! _& S$ `6 r& ` , S) ^$ M2 q x8 d' n2 ?9 q+ v! l
5 g! z1 T8 \6 }! n
mov dl,20h ;output a space8 Z p6 l1 ?8 V& f' B/ N' K
mov ah,2; l3 y1 y3 {, L7 G! T/ A; h
pusha* X- Z6 L. C, |0 \, [8 E( p
int 21h; A6 d3 K9 |- T f2 H
popa2 T5 s! f& ?' ]& p
inc num
$ B6 E/ o l( V' H' e2 Q
* r. o9 P% q2 W. q. a! v cmp num,80h ;get first spd 128 bytes
" x2 M5 v c" f i# n* c jnz Again: A7 x8 I I2 X m
8 F) Z' b5 S& g( r1 T
@@:4 Y. ?5 L5 g/ S: e+ n( k% \6 j: f
popa) ?+ L0 Q! T; ?+ K2 a( k: S0 K" w
ret
' V( i- C) I$ Z0 ] R9 |ReadSpd endp
/ R( _ O* F m9 T; [ g X3 f6 O! o( C6 _
/ h! D" ^, I( e& Q5 l$ v' \3 X. t* O0 g; z5 x
binhex proc
- u* B5 t( Y0 K6 Y, ^ pusha
! l* A1 v+ F# S1 O/ \ 8 J# w& e2 q+ V+ l% c
mov ch,2 ;2 hexadecimal digits to be printed5 y, K( N8 {, }1 w$ U7 V: g7 N1 c
loop3:
0 d( V- U0 w; }: M* i8 P, o* K/ C7 v( M mov cl,4 ;bits to be shifted
- h1 s7 }& x9 l+ |1 a' R8 y rol al,cl# s. u0 A; v4 i+ m y/ v+ [
mov bl,al9 Z9 C: I* y$ v4 B7 l( d+ t6 X
and bl,0fh ;mask the 4-bit Msb
: e+ Z* J0 Q3 b0 U# [# V0 n2 q add bl,30h
1 n% X; h8 w; f" r3 c5 i- n cmp bl,3ah
: U/ t& e1 L; O# b* `; f jl next1 ;number or alpha?
5 W. A7 O, R; R9 T add bl,7
* W' L8 f5 J4 h& k; D0 Rnext1:
V3 N( O( `( e+ P `# K mov ah,2 ;print one hexadecimal digit1 S& R5 \# r7 q7 {2 U6 q1 q/ s( z; H
mov dl,bl
$ S" g& }$ g \$ z1 w" e! t pusha
% r: K; u- O1 G p# l, C7 l6 a# ~; B int 21h
# |; b+ Q) L' F2 \ popa
/ F! t, K4 i. f5 N. b* O( M dec ch
# g+ P$ f7 Q( u3 H: v& N% I jnz loop3# o' \& Q o5 s5 Q1 C" [
popa
2 ?% f/ b$ U6 y ret$ q9 I" U5 `8 N9 P: o( p- F6 h# C
binhex endp
4 [/ Q s' i9 l( L w2 ^) P end main |
|