|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
% w3 t* W* H) r6 Q0 h i
) m) w$ u5 C/ N2 w3 d .model small
8 u0 v3 Q) f$ K% G+ V& i9 _ .3861 e8 q9 r. [9 D F' E
CFG_ADDR EQU 0CF8h( d8 q$ K" j. G
CFG_DATA EQU 0CFCh
0 t) m8 p/ o) e# w, M, \ SMBUS_BUS EQU 0$ Y4 b( U# M4 [6 C" V
SMBUS_DEVICE EQU 31
6 r" V+ @; E1 } Z SMBUS_FUNC EQU 34 I$ J4 Y9 v# S& ]8 q+ _- R
5 b( v, c+ g# f! D .stack 100h1 Y, ~" w# }8 d. k* H0 ^
.data
: ~% L$ G' e8 [3 m( nbase dw ? ;smbus I/O space% W& c) {2 a6 Z7 M8 J& Q( l
num db 0 ;byte select
) h5 b( V2 |5 R& |. q1 s& HSmbStatus db ?* \/ W& p) g: m1 W, t# u m
' U. M! d( `$ s% j& w( r0 P .code! y4 p( Q# R$ V( g% j6 H
. ?# Q4 {0 j* l! S! a; k9 e
LF_CR MACRO
4 e9 v! f K" s5 H2 t pusha" H; Q: ]' D8 V$ P" m; u% o) I
mov dl,0dh
) \" @/ F* w* ^9 |0 A6 } mov ah,2 s7 T9 Q" X- F: a6 u1 f
int 21h+ ~1 b* g! d. W% X8 [
mov dl,0ah ;next line
" n/ X) r/ f$ B% s, j( O# l mov ah,2$ _5 |' A: A5 T% l# U+ F( m
int 21h7 |: e ]. P% }! j
popa ' [- A6 }: l: a x! X5 L
ENDM
) |% j# n/ z: q
, a( Q8 F' E+ B( p$ Q3 j% f! G S4 E7 D; Q1 D. Z
main proc far
. ~" o+ K" V1 s! R mov ax,@data1 k* F9 Y$ [2 a' j4 Z
mov ds,ax
6 A1 ?4 G2 X* a, }* D1 J ( d9 M0 S1 [8 V
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
8 Q/ i- {3 n3 b l; u0 { mov dx,CFG_ADDR
3 G. H m, d1 A, U; H5 ] out dx,eax# b; ~7 x2 z3 S5 X$ v8 ]
mov dx,CFG_DATA
; L; e+ N1 Q/ l. e3 k/ ` in eax,dx( w' \8 y: P) {0 c( K# A: w3 Y
3 v* d5 `: D. j4 Y shr ax,5 ;bit 15-5,the base address
) S" |% I+ T- r9 R and ax,0000011111111111b
7 f" M1 ~6 w$ z Q0 E, x [- D mov base,ax
/ q! A( ]: S& A
6 d5 T7 e# B1 W1 {! d) S, n call ReadSpd6 j/ [" x! D+ y- ]2 p; p' W' ~6 u; [
exit:
7 E1 }" x8 j& s s mov ax,4c00h
: Q, T4 q" e" n9 Q1 w$ x' C int 21h
6 p4 h0 }2 o0 S( `main endp
& A% x T! C; x. u& h% Z/ U" _
/ F w0 y* Z" V. J
) Q8 I) t- c4 z4 ~5 Y- q
+ _0 _; s. _, p, O( e9 KReadSpd proc
6 _( [& G) I, ?4 u# Q pusha; H% _! _, O, \- S/ j& }
Again:. H2 D5 V4 f7 \ M# {4 u
mov ah,num1 l0 ]; S& L& _1 ]: Y
and ah,00001111b
- N2 d5 c) ]( u6 Q2 Z `( v( a .if(ah==15d) ;CR_LF1 l, ]- u: q) Y H/ k1 h1 X
LF_CR9 l2 v. U1 n) e0 }) j6 K
.endif
$ l' i. m$ K2 j }
& y- g! e6 |0 v! f .repeat
# Z% i. ~1 J. Z, g2 Y7 U mov dx,base ;reset host,claim host in use
t4 T5 n$ [- K% i add dx,0' S- ?. @5 ?9 g7 ^$ `
mov al,40h
% m7 f% ?) e' Z* ~ out dx,al
& f. N5 S! X: Q9 W' q; y5 P
+ m# c& t3 b! q( P( @% S mov dx,base % T3 ]7 B- L( I7 P) [/ V
in al,dx
, c& R) |8 A( I) E mov SmbStatus,al
3 @( f5 m: t k9 [7 k+ b( m) u
$ ~ C- a" ?, ]! j2 s' b: v* ]# T* d mov dx,base ;clear all status bits
: m" S+ Y, T& L5 ?/ F( \; [ mov al,1Eh ;host status register
! r# m1 J0 I" F9 ^( P0 S& N out dx,al
0 A3 m1 H& k6 j- N! d) f) t
+ L# V. V& o6 v" b# x! e& a mov dx,base ;set offset to read
# _% T5 |! w$ j) [% U& L* o9 H add dx,3 ;host command register
3 u1 M$ y/ }& U' @) F# |2 q* ^6 P4 y n mov al,num3 \8 q6 W5 Q7 m" {- H# [# G
out dx,al
* x6 I5 N$ p/ o- H8 S4 h: r, }5 _
; d* @( z7 E0 d* h- E b' ` mov dx,base ;Transimit Slave Address register
8 E. K$ u% G2 N7 X4 M* g$ A add dx,4
. y5 @7 l) B! h2 M6 ]. U mov al,0a1h' N# A5 l3 j, V, }; J3 m2 Y! X
out dx,al
6 _/ M" ~ A5 t/ r# C5 J : d/ ^! p" n J6 a) j
mov dx,base ;set "Read Word" protocol and start bit* \9 L$ {( G, R, _* Y" V
add dx,2 ;Host Control register; d. y5 e) n* u; J
mov al,48h % r( ?" z: |* E) u V# E! ^! C
out dx,al, v; p9 R& U7 w) u4 m& d5 M& ^
- k' C2 b$ Q |3 _- t
: {. |9 [, c" Z5 ]' f) W d
9 H$ `* s* v1 v. g) ?9 M% @" X0 Y
mov dx,base& M: H! v# J, o/ N6 S
in al,dx ]( z* D/ I3 D5 i( T# j
mov SmbStatus,al
- {: _/ }3 U$ R T: R0 T' e9 R0 h and al,1Eh; N& P6 [+ J1 J. t' V' {0 T1 f5 _% b
.while (al==0) ;check repeatly until any of) Q7 H. w) O9 m9 c) O
mov dx,base ;FAIL,BERR,DERR,INTR
! t# U" E! e5 ~ in al,dx% H# M& l1 d$ e$ X; |1 W/ N- G& X
mov SmbStatus,al3 @/ i( t6 l+ N5 P1 |& o
and al,1Eh
+ R0 T1 L3 D4 C* Y .ENDW
w3 ^; q: `0 W- t6 h
' c( v h! f K- @2 F% x mov al,SmbStatus
+ E1 U: M( `; l6 G# G$ x and al,1Ch
5 y' j1 f5 E) n. L1 i: V4 i" U .if (al!=0) ;check for errors
9 V' L( T; J( f+ [, J mov al,SmbStatus3 j% p i; L9 w# g
and al,08h " e" N B3 ^0 i. ]
.continue .if (al!=0)
" W3 j8 B2 P. q- ]. R jmp @F $ }. L9 m6 I+ t0 R6 v( k G( `/ g; p
.else
% t( E+ a# E7 L5 K. h. H. G- f mov dx,base# T8 I" g- K0 Z, U
add dx,5h
1 }/ i0 v7 \. e* S' N in al,dx ; a& x; {, U: f2 J
call binhex " t; [ D: T4 s9 S( i
.break! M' l0 u. ~; u. f
.endif a: i- S# {$ X/ ]7 g$ f
! ] ?( A# C0 S4 r" N .until (0) 2 |1 o' m! C+ F; y5 @2 F
! h, j* w8 t9 N# k
2 }, x0 V y9 x/ | \ ) N3 {7 I- x; G! D1 p# w
mov dl,20h ;output a space
& C' m, \. ~0 n3 r3 I mov ah,26 p, h) `( ]! a
pusha; k- ?3 y. K l4 R$ a4 E6 |1 ?
int 21h
9 H% ~. W% I. T. T popa
- n. o' t9 K# Q inc num
9 B9 c7 ?# S9 k+ D( r2 r e: c# `$ Y" y3 D7 ]
cmp num,80h ;get first spd 128 bytes * g z# u1 h1 M9 _& ?
jnz Again7 n- [* b9 g5 E9 b
" y/ ?: t& o# A" s@@:
9 [! u6 N, E, c popa/ T5 y3 q/ b' u+ N- b* z% }
ret8 l. a3 k4 }$ X# n: S! C4 H
ReadSpd endp
) ?6 j, r! E2 P
& z" a6 Z8 ]% `0 f0 ]" R& J: I# Q) M) P2 D; M
! T6 R0 d6 k: I' C8 E# b! L
binhex proc
U3 p0 P9 a" s& q' g pusha $ I D; ?' {' z: e% u- L7 T
" O' t9 _# f, u( z7 {
mov ch,2 ;2 hexadecimal digits to be printed
; g) Q% |; E2 o3 R& xloop3:
( O! S% o3 _7 r: i4 u# J& U mov cl,4 ;bits to be shifted
, Z5 u; s5 H+ r- k p7 a rol al,cl
$ U- z4 t. m1 ~, u3 R+ i mov bl,al5 z5 B/ u1 Y+ U- [4 B& x0 R: j+ C, L. m
and bl,0fh ;mask the 4-bit Msb9 D2 ^& j6 B5 H0 ~3 h+ n
add bl,30h# A! \( e8 ^% y0 C8 N y
cmp bl,3ah
. e0 B* O a8 Z2 Q2 h jl next1 ;number or alpha?
3 j! Y0 V* D6 L8 M add bl,7
. d8 X4 G. o, Z7 I9 R, _" ]next1: : K2 j, t% V8 j8 V, U7 |- {! q
mov ah,2 ;print one hexadecimal digit
2 z5 k5 ^" o2 t' Y( T mov dl,bl' X' ?) ^" H8 O
pusha
, E |$ n/ o# E3 D int 21h
/ a2 ?. J( y& ?: T0 i popa
) X5 ?6 ?- `% c+ V/ v6 D8 \ dec ch! Z* _5 g: Z& v( t; `2 n1 P
jnz loop38 M, j q9 \- W
popa8 n6 y# E( I2 `# z: k
ret$ F9 @1 R K' O1 _1 ]/ h9 D
binhex endp
9 w- S9 X1 f L- w* K. M6 e, i/ P end main |
|