|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: $ [0 w' g: M) }; C$ h
+ {1 j3 B0 x M2 j D5 A D6 Z .model small1 H' x) t: `% G f. c
.386
2 g7 D$ y7 H0 ~% \ C/ G CFG_ADDR EQU 0CF8h
l5 R6 Q# z, c% u9 n7 G: b CFG_DATA EQU 0CFCh V- m( r" Q/ o- X; O; l
SMBUS_BUS EQU 0$ U; ~5 b/ H, q4 f
SMBUS_DEVICE EQU 31
6 h- ^& Y9 y4 I/ Z% { SMBUS_FUNC EQU 3# b* H$ W' w+ O8 o) B! o5 n
# V6 N6 z9 a) c .stack 100h
+ s9 N1 T+ o0 S .data* h) M2 E+ `2 W& y3 \
base dw ? ;smbus I/O space
. L- k7 j3 _8 F$ C1 r; Cnum db 0 ;byte select
6 G) `3 x9 R& K6 V& {SmbStatus db ?
, ~0 X# j. U5 j( w9 I' n- W
. T% f/ |- W3 N7 B8 M .code
W5 h x1 B5 Z" i+ D
( C; z, X' J$ J4 h0 a cLF_CR MACRO, E( l% w$ O. G. q6 g. \6 T
pusha, K5 S% { l' @
mov dl,0dh # s3 g" @8 [; ~" q( E7 ^ B$ Q- O
mov ah,2
6 S1 w6 t9 U( h! [+ K6 a* o int 21h
; N& b0 x1 D7 H1 H/ n4 m mov dl,0ah ;next line
" x) H) f' V8 \0 Y9 I- o mov ah,20 C4 s; y* M0 `" ]" u3 H0 S( K
int 21h
- d: I! @. N0 z2 l# h popa ! F% y, H2 S7 i6 m0 o' G8 c: D
ENDM+ M& Q* } u9 [3 W1 H+ i8 N: R
* o/ Z$ R3 O, K/ J: ?
6 M/ Z3 w N2 B
main proc far8 N8 n; r( F" p, u& x0 P8 O
mov ax,@data
7 o c3 p5 x6 O' d. H2 h mov ds,ax
0 F* U4 m+ M, G; {& y) [
1 A! G' y; z2 r5 f1 ? mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h. \$ n, Y( Y6 ~+ t
mov dx,CFG_ADDR
* J. D. N8 H( \1 I out dx,eax
8 R5 R+ G4 M/ L K mov dx,CFG_DATA# s0 t' `* M1 e, A
in eax,dx8 {6 m) e( x$ q. h7 B: K! \( F
( _. ?' g `8 t, R# L shr ax,5 ;bit 15-5,the base address
$ C Z; [$ g6 @1 F5 J and ax,0000011111111111b
5 d. ^* G1 j: x mov base,ax2 g" n+ J1 S+ p/ p8 m Y G a
1 j0 A: Y( G7 {9 u) v4 W2 C$ {
call ReadSpd
! L7 v. d. ~( q6 gexit:, A: |$ ^/ @- ~8 ?+ `/ U% D6 Y
mov ax,4c00h( R" P& T' i1 N% b
int 21h
, F( t% X1 J, L: I/ {main endp
* R/ c) b* L7 K
7 ?" G1 O( @9 [; m5 K
9 t4 o8 \, N) L; U# Q. s* ]" T
: u# k6 a9 B: g- D6 {" hReadSpd proc9 K2 S2 m" t% K, L
pusha& m7 y: Z8 K- M1 I7 z1 f
Again:
0 O9 ~7 G' y3 U6 {0 i' p; ]' t mov ah,num) z; C r- V" |; c" V
and ah,00001111b
: _* a1 B0 F% Y+ ~* r' K .if(ah==15d) ;CR_LF
% X; j' I/ k1 I; F LF_CR
/ s. H) h7 q& `: w .endif2 a6 I( C% N+ f/ i X. I7 Z, f
, C) l% j5 h( E4 x .repeat
' I+ a( v) v6 Z3 l mov dx,base ;reset host,claim host in use
0 c7 T' a' X% K8 _' }) `1 b3 f4 t3 w add dx,0( |. o& i( O$ \( |2 a( T
mov al,40h T4 X# i2 o' L+ a% y! A- }) q
out dx,al: u4 j2 Y2 r4 p% x+ [/ @# l k1 h" B
9 e/ |; j s( a3 b# ?! n8 Z mov dx,base
& r& j( ]) W, M$ Z in al,dx
' B' ^/ S4 O/ p/ `4 I ~ mov SmbStatus,al4 R! }8 c# |7 U& M. ?
4 e& z" L& q, k; j. o
mov dx,base ;clear all status bits
& k" r2 T) _' t mov al,1Eh ;host status register
% @3 t, ~7 t) W7 _3 t5 D* ^9 O out dx,al
3 z t5 x& n! R& K " Z! ~- m' Q5 Z8 K' \$ c
mov dx,base ;set offset to read
8 Y8 C' l- x! R0 R; t% w add dx,3 ;host command register( [) Q& q- ^# }* a4 x
mov al,num
/ T. s9 }% n! O/ b out dx,al* h8 c! F: @4 n
& ` r. j- \+ U7 l3 _0 E F5 u
mov dx,base ;Transimit Slave Address register1 A1 Y# o" K" Q
add dx,4
" \4 t9 l( T. K+ N mov al,0a1h
! _' Q, I" d3 M/ ?; e& Q+ j* q out dx,al* K: n& L& f% |3 u
3 W" g, J0 J7 g. z, W- X" _5 x8 ~ mov dx,base ;set "Read Word" protocol and start bit8 p( k# k! e# w4 F% j5 X5 G. B! |% f" t
add dx,2 ;Host Control register) I0 o) d4 ?/ G2 d
mov al,48h 6 `, I2 b* v& X" p; w6 d
out dx,al5 v% H+ U% T4 ~1 Z
. h- j) L" x; j- J3 A5 m9 J' }: z. U+ h( Y
$ s ?% j4 x$ S+ K* O0 I$ V
mov dx,base5 n% x( F& F- l3 L5 H
in al,dx0 _ a6 x3 k" z0 I0 C
mov SmbStatus,al. o+ _% H) \ b: U* G4 `
and al,1Eh7 l8 Z* B4 a" E9 V% [9 J9 C; _& Z
.while (al==0) ;check repeatly until any of4 D/ \5 ]- H" v7 e+ {6 ]: e/ m
mov dx,base ;FAIL,BERR,DERR,INTR
, H% @ J" B9 ` in al,dx
$ C! [0 Z z* k2 p: |3 J" b mov SmbStatus,al
- b6 l& D, T ?8 v: u, ~ and al,1Eh
9 \+ O; @$ t1 c, u1 v1 @. I* [ .ENDW. Q! \9 _, c6 [1 U% q
1 ^$ B5 v- g* }: E- ]& |! m mov al,SmbStatus
9 }+ ]' v0 E1 |; j& i and al,1Ch
. |; i2 k* y* V, K .if (al!=0) ;check for errors
5 H, W. @ Z8 L: E3 ?8 ]$ n mov al,SmbStatus
9 o8 P! p1 E2 ^& ` and al,08h % F v* D$ j) s# q a1 Q
.continue .if (al!=0)
9 A$ }* |9 h- o7 `; C& Z$ L jmp @F
/ p/ p' Z' C; B0 s/ h( Q; Q4 C .else' U" F3 p7 H- {4 t
mov dx,base
5 Y) r7 ~9 y, a2 T9 I: V% C add dx,5h
2 V& l+ z6 C& d4 k2 ~; O1 `; u. g in al,dx 2 o! O2 C6 t1 M" ^+ x$ v. |/ g
call binhex 4 J( }8 I1 x- P$ H0 m
.break
( G/ j6 @! E9 |2 P .endif
( L9 P% e4 ?* C0 g8 u3 P & I/ m; p, f4 j1 A2 z
.until (0)
0 M# m' e* }0 L8 x! a& N" V
7 E! O5 H7 Q0 R! ^+ L % q8 ?! @8 _/ T4 M! X1 c, a
' X% W, ~% b! J3 i) | mov dl,20h ;output a space
3 J2 {7 Q$ v$ p mov ah,26 W( U! }. b* X/ ^
pusha, H B, P" }' z: O. ~
int 21h
4 `% J6 I" a; e+ s popa' r6 j/ G+ X! X; N6 d
inc num* `, f& C# x8 D; \7 x/ g+ A
5 \, ]8 M$ p2 a cmp num,80h ;get first spd 128 bytes 7 m1 ]8 u. P* W1 m' k$ a: c+ N6 q9 U1 W
jnz Again
2 K3 f3 y) b; @8 m
( F; Q9 `+ G, l! K2 V3 R( p$ c3 d@@:
) ~' T) h, D* C2 A1 q popa- b) w6 x8 M( E1 X8 J
ret
6 }6 [; ?5 n% T6 d1 K3 k* a6 HReadSpd endp! j$ m" r& K. F$ s% C2 d
* q2 J, j$ Q2 ^0 o. U2 d1 p% V7 g
% \: w. L% v2 m. ?8 j! e
b" M- _ t. e4 k- k% [6 hbinhex proc " x4 v5 N9 Z% ]- k2 x1 B: v
pusha
3 @$ F9 \1 P: ?2 C" Q
' k% d' l7 l U mov ch,2 ;2 hexadecimal digits to be printed
4 [" E i$ V) J' q1 b1 qloop3:
% k& w/ A& ^- P* c$ E* {' c1 B mov cl,4 ;bits to be shifted
8 q, I4 s0 }8 k J; X1 a$ T& c. r rol al,cl4 D; v# H+ d8 U' x, z
mov bl,al
$ w7 f% y6 r/ t. e+ N) N and bl,0fh ;mask the 4-bit Msb
" @# d" g# C, g7 j7 W+ u add bl,30h% Y5 f) q8 G: p( f3 N7 `" Z2 [
cmp bl,3ah! r3 @$ V) C0 W5 S" z/ w
jl next1 ;number or alpha?
! `: w9 h% t( x0 ]$ Q8 Y W- o add bl,7 9 R h, ]( a( J7 ~
next1:
( T8 A/ p v3 v; O, C mov ah,2 ;print one hexadecimal digit
R7 Y& i1 R# y2 r/ g mov dl,bl }6 I; C/ q1 c- n3 \5 d- q
pusha
5 ~1 D; C( x8 }' |0 t, H int 21h
) s+ X$ y2 |: u' k, p& F popa- @; \ }* m( ]$ K! L! L
dec ch' O" n/ T& w1 ~# [! c' H" m9 ~
jnz loop3
; ^5 a- ~0 n/ j- Y" y popa; c9 O3 f: E H% y
ret+ B$ T9 t# q `6 y5 l1 B2 i, b
binhex endp& S5 e0 g& W, _( w P, S
end main |
|