|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: ! r; V( u# q6 ^0 E) ~4 W" T. L( X
" M. q" b3 z2 k2 N4 d9 x1 M .model small
' G( L+ h3 R; j( ?3 L .386/ ^* r) {, O7 ]
CFG_ADDR EQU 0CF8h
" v% G5 J! p4 h, [0 V7 E- u CFG_DATA EQU 0CFCh# l; _: y$ l% u; a; |
SMBUS_BUS EQU 0
% Z' t) |* k# T SMBUS_DEVICE EQU 31* P! D! K/ Z" C c: k, M) l$ Z
SMBUS_FUNC EQU 3- j2 u! F( G1 G/ b( D8 D9 |+ f
) `) Q* c0 ]% ^ .stack 100h
) ]6 m) B3 e' Z9 h7 I6 c, `2 x1 R .data! ]5 [/ O# [3 `8 ?
base dw ? ;smbus I/O space
+ D/ W1 o; O3 Onum db 0 ;byte select A4 B6 g7 i9 L* Q5 T4 a- u
SmbStatus db ?
' {6 ^, _7 P* W% {/ O" [5 g8 B* x: a- Q1 V" ?
.code+ m2 J5 @; `- q, z/ e% @- M' Q
# k# O- `3 t: v/ C: \) wLF_CR MACRO7 c' V7 S4 k% ~3 P4 O# P' p, X
pusha
: x" `. D* E. y0 _& n! } mov dl,0dh
8 R) Q, ~3 T; z! y6 |1 n# }& h) }+ a mov ah,2
7 ^1 o; c) _# X2 i3 m% Y) c8 [% B int 21h/ r1 K& Y6 T7 u0 t9 |
mov dl,0ah ;next line " p: ?% U+ c( r% O
mov ah,2, v& T5 V' ~; d, Y
int 21h# c5 a) y; ^+ c$ C
popa
3 T1 i" B/ h, Q' \7 }5 C ENDM! {/ P) i7 h8 r" B2 p! |2 K0 b
1 G$ P8 }! Z" ?1 e9 `( w
5 L7 }$ G2 I$ U; Q; R* v9 t& |main proc far+ I# h/ {! M( V- o S5 \( ~. ?: w
mov ax,@data$ p4 W7 x2 P$ _: Y7 a7 U
mov ds,ax
2 c7 N" W0 J$ v7 M1 b + r6 |8 y7 z: x: v/ n5 ]
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ Z& H4 {4 s* N% q i& `+ w
mov dx,CFG_ADDR
1 [9 {* ?; Y& L( i M out dx,eax) N5 Z" }+ m2 N- f- d0 j
mov dx,CFG_DATA
$ p! T" M9 [& ]' w. r* R in eax,dx
+ ^. B8 v2 |% |! N* i; d7 b
9 h2 V# M0 ?7 |8 i) a6 n9 b+ J shr ax,5 ;bit 15-5,the base address! m/ Q4 {5 o% R9 x
and ax,0000011111111111b2 f a5 d" Y8 \+ d3 `8 q5 r+ a
mov base,ax9 d1 v- r4 ~& s2 s
' y% p) q! Q0 n3 N% A' ?& S8 z# A
call ReadSpd
1 X; }) R. V9 N1 Eexit:
1 I4 @! O. f+ K. a mov ax,4c00h
. M" R8 @. k) N. i int 21h
: T: h1 j8 f# Umain endp- ~' I9 I. f- J# e& f
' T0 u2 p6 V' L( X. B- |
9 ?; F/ j5 Q. K$ N5 p( d: D) Y3 U5 V5 `0 u: i5 ?# N- D
ReadSpd proc
2 G1 a' X5 t9 l4 g+ a! U pusha* ], `$ @; s1 x# k/ d, d+ f; w
Again:: f$ U/ U H" `+ Z
mov ah,num
. e5 t8 Y( h- R( Q/ i and ah,00001111b' l" e4 J. R1 H+ B* s$ u' u8 o
.if(ah==15d) ;CR_LF: `% W& J: D1 w6 U n
LF_CR, \ m8 B# u$ p
.endif0 h& N# }5 w- e I3 V: D. N7 G* ]$ f
- K M- c, s! O3 x) ]
.repeat& ^8 R% ^1 K6 [) x0 E; P
mov dx,base ;reset host,claim host in use
/ ~, n8 h. p$ g5 l" m. t% O add dx,0
$ K4 G1 i" ~& M( Z mov al,40h
) w3 k# c4 I9 \( o out dx,al- `! V* k+ `( G1 W; J: |& o/ n
: m2 p1 K' C+ f ?8 Q' O+ x) X
mov dx,base 0 ~6 {6 x& d" K* @) _9 k' u+ a# Q7 `
in al,dx
" _9 Q) d% k/ a0 a mov SmbStatus,al
5 `- K; |# ?9 C+ `7 W3 c 2 B; x+ z/ f0 X: o2 T
mov dx,base ;clear all status bits# N% ^0 a% {% e# l: o
mov al,1Eh ;host status register
" D7 L8 b" T0 U& C5 W! ` out dx,al' P( \. a( L/ @- m) d Y
9 z9 S# U" a! S+ l* t mov dx,base ;set offset to read - F/ \0 |/ s) g; `' S
add dx,3 ;host command register+ o5 ` K( C1 _/ ?8 {4 _
mov al,num
6 q6 B; {6 D( y# E out dx,al
; i: K$ B* V* L q6 P6 N/ l
- v- a' r9 j$ L/ Y$ V mov dx,base ;Transimit Slave Address register
$ q" v+ u% m6 i9 @' D" G1 M add dx,4" l9 G# ?* }+ \
mov al,0a1h- p2 L( L* g, |( ]6 ^0 R3 U
out dx,al$ s4 R4 h* o# {5 ^% Y# U
. ^+ G W6 N4 d* l; ]* ~
mov dx,base ;set "Read Word" protocol and start bit- a& }! K- x* d; X
add dx,2 ;Host Control register6 s0 S) [5 O H" r7 b' x, j
mov al,48h
1 i3 {' N. A: {* t8 B out dx,al5 Y) H; ^& c: N
w( Y$ k0 [ M3 C
: d! Q" m+ [, n& D$ o
& B8 P# l8 A. T0 f9 _ mov dx,base
- O, [% S& s- o in al,dx* q0 w9 r% m" M( ]1 o5 \& P
mov SmbStatus,al
1 P3 Z, j, V8 A% U! Z+ n and al,1Eh
% L) d) \: k' B .while (al==0) ;check repeatly until any of, Z8 f4 f5 _, P. W
mov dx,base ;FAIL,BERR,DERR,INTR
) v3 z- v3 U( W& Q in al,dx# L# Y' W& Z% P5 u
mov SmbStatus,al
% I) g' N5 s0 [3 Y0 _+ B2 E" l: Y7 C and al,1Eh
- }9 [8 J* m, Z+ L$ j. n* k .ENDW
# h. Y$ n5 B; {! I# H' z1 j
' n; u8 `. c4 ~. i7 B1 P' h. o mov al,SmbStatus
+ y* H1 _$ b7 z) z and al,1Ch: n' M: P7 S( ~3 s: W# F
.if (al!=0) ;check for errors 3 v9 d' D$ G- {6 |7 z8 m2 l& m
mov al,SmbStatus% n0 e7 l- k% \
and al,08h
) Y0 R' V7 w$ A2 w, U .continue .if (al!=0)
7 P) `$ @/ H. w% W3 ^; z jmp @F
5 D. G7 E3 D2 y' U# @3 ?; t. n1 | .else
+ N, A- h: n# \! }5 C5 v+ S" l mov dx,base
; t/ D; E+ J* T. \ add dx,5h" ^* |) i) V% t+ }
in al,dx 9 O4 f3 ?" X% d- N6 u$ t0 c
call binhex ( N/ q8 p4 h9 e- j0 D7 M
.break" S/ q4 L; }$ C J+ I3 [
.endif6 k/ q; E, D6 ?3 ]% \
( e: A0 _, v8 K# k
.until (0)
) y* i6 }' Q+ A! t$ F, n+ r! F1 L/ i
! d" j& `% n$ z. w8 {) |$ v- R * ~# i- q. Y/ y1 E
. ~7 W: o: F# N7 w2 _5 u; A mov dl,20h ;output a space# C; k! k0 W% M) ]+ ^$ H5 j
mov ah,2
1 K; b+ k: j- x& {: D. m pusha
6 N/ B# }) p; z( d: i/ S5 x# [$ ` int 21h
2 l: ~5 _, g, y/ r; F& j. H/ i4 L popa
4 A; t, y) V% y% K- U. O- ~% V inc num# a S9 f6 J* U1 [" S
9 r& g( z# Y; Z) l" g% P cmp num,80h ;get first spd 128 bytes
7 h. h! x; ~, j j& F, V jnz Again
) _( Y6 {5 l5 B. U% y9 `0 D+ y
; Y1 N6 |1 v' ?9 U$ Q: u@@:
' [/ j. L% ?) e popa
7 K. i3 U6 L" Z" ]% E/ c, B ret4 U9 v2 I6 @( \* j7 |
ReadSpd endp
' D7 ^) X- K) S8 {' s0 E$ e1 g: ]# w& }& w8 s& |
7 }& l% A6 v: l& R" L
$ y7 d: }2 b+ Z% u+ o7 L
binhex proc
, |& E3 T: K; x x1 s; z pusha " N2 e) ~. }. d0 `: ]5 T7 d' ?8 y
% v4 t8 l D# ?7 |5 L, N0 I$ d7 B& D
mov ch,2 ;2 hexadecimal digits to be printed$ @) ]1 I+ r5 ?5 A" s7 b. ?
loop3:8 F$ v; U6 y# ^( J: r
mov cl,4 ;bits to be shifted+ ~! G8 E* h* x/ y' ]' y
rol al,cl
2 s+ `7 Y1 f, x4 g& k. H7 x mov bl,al7 [8 b, z1 [& P, P
and bl,0fh ;mask the 4-bit Msb
" p& ^, N+ m1 z8 C7 O5 { add bl,30h E% ~6 P9 B# x2 }9 F
cmp bl,3ah i* P2 a, w$ r; w- M% ?- C! Z2 Y
jl next1 ;number or alpha?( @8 p9 m# `3 K. {5 \
add bl,7
' m0 a* J4 L( A) I2 A* U6 Tnext1:
" Q/ Z& t& u! }+ R2 Y8 }; b. M2 ? mov ah,2 ;print one hexadecimal digit1 a- N/ R, N" w
mov dl,bl! d1 C N6 ]6 z1 a! P& `' i
pusha
& n) ~, K: ]3 O1 s int 21h! R: R% O5 T3 y' q
popa
( ^: G5 w6 A+ H* n1 c& l% I dec ch- m& I' i2 C& o9 ]
jnz loop3* D _" A. c( m3 \, h, p [
popa, R6 f( r$ c& l
ret" P/ \9 y9 I% K/ I7 s, S. {: `
binhex endp
. ]4 y1 W! z( _4 B9 P$ {( a# w end main |
|