|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: + J* y6 X$ d; ^# q% Y$ f# Q
, k- n8 @! h; }9 X6 j .model small5 m! H" i# ?) @! Y
.386' V ? I5 B" x: G [
CFG_ADDR EQU 0CF8h
* K& i" I5 a' e CFG_DATA EQU 0CFCh! Q) l6 K0 d/ g9 Z
SMBUS_BUS EQU 0
3 Z' R3 V+ i, \% i3 G3 x3 b2 u SMBUS_DEVICE EQU 31% l4 O0 P. w9 V3 c/ s
SMBUS_FUNC EQU 3
, l5 c: g9 _# _* U' J& l
a0 y% c, E" S! I3 z: j; x! d .stack 100h+ d1 u1 J) _# x: h9 A% F
.data
6 _ K. L" Y. v0 R' D) j; Xbase dw ? ;smbus I/O space9 E! k% i6 G# e! H# D" `% a j8 h& R
num db 0 ;byte select( Z. C1 _( x0 A$ t6 H' { r1 R
SmbStatus db ?
* _# u& P3 n5 ?1 V2 ~8 s
' w% y9 S* _& y" f+ Q .code" h1 V* y# y e0 u. u
2 {4 b( C" i6 X/ ELF_CR MACRO
4 G0 B/ q1 I* j4 I( @, g. \/ O6 [ pusha
# ]& q6 ~0 g2 r4 J! j' U. ~ mov dl,0dh
, c6 c# D8 P% B+ J1 R1 k n- t7 ^ mov ah,2# Q- P0 Q, C. Q) l' }" v
int 21h F( Y& v7 {* v
mov dl,0ah ;next line 9 _% R- }4 p c" I, u% A2 j
mov ah,2
( o; z: w- ?8 d8 o$ v3 t) Y int 21h
6 G m3 S( U: u( X2 i popa 6 [# f& C! M/ ]% \
ENDM+ e# \9 G5 _9 A3 ^6 i& y
; }4 v( |1 X2 Z
5 v" n" T' O/ |: z3 ~* f, Bmain proc far0 @( Q* h& X6 i/ t) A5 g
mov ax,@data
$ r7 T3 Q, }5 N: C" N5 M mov ds,ax
3 K, y; M+ {0 V" {; B# Y0 H& I
5 I0 r* C# q* \9 C mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h' \1 I8 w; b, w4 M
mov dx,CFG_ADDR
) n# J+ w! |' a1 \ out dx,eax7 j, F4 n8 c3 ]# m( ]. }
mov dx,CFG_DATA [; R9 u$ b% X( k* G
in eax,dx( F" i; J9 G9 y+ Y9 r8 R
! l& ?+ ^; L$ y5 z6 c8 y3 x
shr ax,5 ;bit 15-5,the base address
" v1 r$ Z; `# j$ g6 o3 Z+ W and ax,0000011111111111b
; w6 B( ]9 f5 n' Q mov base,ax# y5 A& d5 X. X3 ^( G' M
5 m* O: ~. _! s$ E9 L8 \ call ReadSpd1 ?8 p4 O5 t, M, O
exit:
1 i/ |2 c6 J3 u. @) Q) F e mov ax,4c00h' l: y) w S0 G: w' u' F5 s
int 21h
1 ~7 Z: N$ m8 G+ s0 @/ L* zmain endp
1 @7 L- @( x2 G6 v9 B6 D! U' b3 q/ p! C
& Y" P( \( P( s6 S
- \7 l2 T2 Q3 \6 ~+ @& Q J! N7 s
ReadSpd proc% t! d2 y5 s2 b6 O
pusha, L; g8 ~# s1 M2 h7 T! `* _: U
Again:% ~/ P0 R5 e/ K: p9 b+ Y+ E
mov ah,num
$ E7 i+ E( n0 Q. e5 A9 L and ah,00001111b
# Q' w `2 z) l3 A! Z$ b .if(ah==15d) ;CR_LF
: E T; ]) t: O8 v' M LF_CR- K3 Z! W/ r* j0 x" E3 d" R. b( Y
.endif
9 P7 B" K2 I3 \9 A" `' c n& l. M0 m( x- t$ u% O1 g
.repeat/ L1 H% O3 A4 B% b
mov dx,base ;reset host,claim host in use
( ]7 x8 C3 n) i, Z add dx,0' ]5 K/ d0 X+ ]! q4 `
mov al,40h
" b/ ?& \. ]$ R+ B7 j* T& O V out dx,al! O3 }4 A9 k3 t7 V- u0 j/ [
: ^$ b' F# ~' w. v) g w" ? mov dx,base
8 x5 b% e, G0 j in al,dx) ?+ _* L% }4 x
mov SmbStatus,al" ~" d9 x* {' n# c
B, @5 ]$ c, f4 k mov dx,base ;clear all status bits0 C1 d" P5 G! q0 ~& G7 b1 c
mov al,1Eh ;host status register
' C) b7 v. E0 Z# A1 v out dx,al
# M1 Y2 c' e* R m ; g# j ^2 o: H" S8 V, N3 L
mov dx,base ;set offset to read % U. G4 Z, M5 ~* `/ { b# n& E0 ^) e
add dx,3 ;host command register; c3 W) L/ L, W0 B
mov al,num
, ]- ^8 b7 i4 `" ^# M7 A/ | out dx,al, M: B5 f1 A4 T% V
9 {5 n/ j7 ` f. G$ D2 { mov dx,base ;Transimit Slave Address register. \9 X+ E8 d7 N2 J" d7 `
add dx,4% B$ A& h% P8 S0 f o; i
mov al,0a1h) V. Q4 P% r" A2 S: d' [
out dx,al
& l, W; U8 ^' n) J
: R6 u+ p! l% O, H8 d mov dx,base ;set "Read Word" protocol and start bit
, `# D+ A# W8 {. P5 _5 @" E I add dx,2 ;Host Control register, ~+ i5 Q! J, M' a1 @- x) H- ^
mov al,48h
+ K6 O. g! O) A3 j out dx,al
' d {; q# v8 l1 C* Q' S" ~ : I, [8 r3 P* L P/ l# X
5 f. [: }4 S- p- W" b . f/ _6 n* q3 K8 X$ J
mov dx,base
7 k' a" A: t8 Q* L# K7 @$ K7 _& Y in al,dx/ Q8 e+ }3 U+ L8 p. T& {- h8 Y* x; Z# d
mov SmbStatus,al
. X8 f, G {: [/ r! S7 e and al,1Eh' Z8 ^, B4 [! _. \6 E
.while (al==0) ;check repeatly until any of, Z( K: {1 X5 [9 {$ e% C
mov dx,base ;FAIL,BERR,DERR,INTR. k, E& L/ M5 I8 _
in al,dx& I5 e- F, o" r$ B4 ]2 l7 ?
mov SmbStatus,al1 e2 D. M$ j# ?; V6 e4 K
and al,1Eh
+ w8 L# T5 D% K: ~+ ~5 t% B+ ?- s ? .ENDW& u H: c) v; Z( d7 R
1 U" v5 n6 f8 L6 H# X
mov al,SmbStatus / V* L1 n7 s% N* p
and al,1Ch
) r! t6 t' l2 I8 | b4 |: c; m% l/ F .if (al!=0) ;check for errors + {4 u& w" e8 ?4 u5 ]+ ~3 y- u7 j
mov al,SmbStatus
) `5 s0 [% \6 o and al,08h # @: d( o( f0 k
.continue .if (al!=0)
$ L8 J' V! A$ ^1 A# N jmp @F
5 m+ I* x* U* W0 n" r5 N .else1 @! V- G7 g+ s: D" j* P2 L8 \3 h
mov dx,base
7 s% m M. {5 U add dx,5h+ E9 ~6 @( f! a) B- V5 H
in al,dx
) ]% S: S+ Y* N3 V7 V call binhex
$ V, [3 J% f( F( |: v; I .break
0 n5 K; G$ e2 ]6 O/ n2 O' X .endif9 o4 a; C8 @3 G! U% x* X% e
( A/ T5 c# T6 p# `; a .until (0)
. Z( o" B/ J. o) U ( s' `2 Y2 G- X: w# X
' ]5 l$ H9 z2 y9 M
, _5 P: ~9 b8 Y% t: h) }: J# d mov dl,20h ;output a space: L7 Z, d4 A0 Y. Q* h
mov ah,2
: a+ B$ h5 D P5 k5 B5 _7 J pusha
7 X* {- k; J7 B# i, y int 21h
7 U; C9 Z3 ^3 u: g# p popa( D! a; n5 a. W3 u
inc num
7 }6 Q. o! c5 @ ~/ \- [, j( K7 S* g9 [8 @( Y
cmp num,80h ;get first spd 128 bytes 1 w; ]2 V: n- R; |, ^
jnz Again
& x1 a1 Q5 ]) {6 n) n
/ G/ n/ U. ~8 h@@:- p" m+ F# m1 a0 d
popa6 h( h0 l. w& Q# b3 V
ret
1 C# f' a( K% D' Z( }! oReadSpd endp4 q4 S0 G3 t0 b
: \3 x1 U: T8 ?& l1 \ a
1 O- r( O1 ^6 c; `3 _/ k6 }* Q9 T* t* R# E8 l4 D& n# H
binhex proc
- P! e* X- z" ] pusha 3 K* K' Y7 i0 b2 e
1 S" B% u3 y; ^. B/ J3 C' W7 F. {; W mov ch,2 ;2 hexadecimal digits to be printed5 u8 Z' {8 I4 p# R
loop3:9 f' d! g* ]* x3 F8 G
mov cl,4 ;bits to be shifted
2 y1 x; p$ Y3 V& A) E rol al,cl7 R0 h; x% c5 I/ h/ b& q1 w
mov bl,al4 ` {* [9 m; N' y/ t
and bl,0fh ;mask the 4-bit Msb
; c2 [3 [ ~* @7 J( X: T. N' K add bl,30h2 A% F2 D# R$ U
cmp bl,3ah, u+ R$ U1 j$ R6 T2 c0 c
jl next1 ;number or alpha?
' [" e& K0 ]( \$ o' R3 \) }% \ add bl,7
O: r) p2 R; `: `next1:
. D6 b a) Y( o, D; s' N- p mov ah,2 ;print one hexadecimal digit
) p2 V. ?/ T; Z3 B) r mov dl,bl% j- r8 P( F g7 j5 e7 L) L
pusha: |8 g# C5 X* Y. Z0 w5 ^* j p
int 21h, w. g- Y0 P j* Q, w
popa: H9 t9 d% F( D0 h4 A" J8 Y
dec ch3 ]7 [" y, [5 F/ R* h+ u" [
jnz loop3
Y' _- S2 u% L ^, G6 Z9 E popa! o4 |/ p4 f5 i3 A# x
ret. m" W( n( P$ ^" v8 m
binhex endp; y K" p5 Q1 ^( I' r$ \
end main |
|