|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
* S# {" t3 H4 Z- b) d f! F! s8 [0 E* T; U5 J4 t
.model small
& P" ^7 `9 O& t# k7 C! I3 _4 o9 \ .3866 I/ Y% Y/ s v: F- S8 G
CFG_ADDR EQU 0CF8h
$ y1 f0 K+ Y% y8 \3 q/ h CFG_DATA EQU 0CFCh
# Y$ O& I4 p6 \- S$ y6 K1 I SMBUS_BUS EQU 09 n" W0 B2 o$ z7 u- w
SMBUS_DEVICE EQU 31
g( v0 }# a; k- Z- C% @. q SMBUS_FUNC EQU 3/ p) T# `- b2 l {" \; ~
$ f5 r' N5 q5 ~6 X7 D4 ^ .stack 100h
: d2 u: W- ?: }* k .data* {" A/ d/ d7 m7 K# I" g, q
base dw ? ;smbus I/O space
$ f1 o* o( t {& Vnum db 0 ;byte select
; c" |- r' s# q; |% y, p0 [# uSmbStatus db ?
5 j, q9 V2 J" l4 u2 I# F( V' H+ g# w$ ]) l7 N6 E: B& J
.code+ Q1 z+ t- A2 j1 B: h3 e0 Q
8 A( C2 L. f8 @
LF_CR MACRO
j9 i2 I6 X9 _0 J! V pusha3 p! \) c0 m# V0 t
mov dl,0dh ; T8 x: S* C9 S6 t) r& U
mov ah,21 s) N1 J2 v; Z+ \4 t9 \( M
int 21h
0 J. O4 x! j6 r) O1 F' N4 V! w mov dl,0ah ;next line # X1 u4 Y" l4 i) z7 {2 I
mov ah,2: o# T6 W5 m' h- o% J8 B" o
int 21h
$ c2 q; r7 d& R popa
( B2 U9 e! v) W, {- H ENDM
* k7 e) Y- r( J
0 i$ q1 b; I: J+ Y
; B* o+ s% W$ n* W3 _main proc far' q4 P7 o# f' x6 Q' |) w% R
mov ax,@data
* C- S+ N3 z* |, c; H, K2 A7 f4 q! O mov ds,ax
* h( j2 Q$ B) M5 A1 J: ? 2 M7 C' ^3 {- l; ?: K! D4 n4 C; y$ s
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
- Q6 L0 y1 F) A mov dx,CFG_ADDR8 _. R$ t+ ?5 m. i: d& h% Y
out dx,eax
3 {. N+ M$ K4 O mov dx,CFG_DATA
' E* Q+ P8 e" V; R in eax,dx
0 j' N+ X, u" `1 c) Q+ i( v
! ~ R. B5 h) y# V8 G& I6 T. J shr ax,5 ;bit 15-5,the base address* ~9 a0 P$ F& k0 `1 h8 Z
and ax,0000011111111111b
; g) X1 Y2 A h' U2 Z4 p; }# t) e mov base,ax$ g' o# I* V! }
6 ~3 J( N/ ?8 g& D! c* v: Z call ReadSpd
7 I1 L+ m3 V2 v; J0 aexit:& v0 z% [- a: V' }
mov ax,4c00h
: i+ z' r, e+ h: }- z2 b( z int 21h- O5 E' D, V/ }
main endp- H% k: k1 R& M/ H( `. h
, T# ^9 {! m/ C/ \5 h4 p: a. w# b9 r$ L
- {7 G, U: | {
ReadSpd proc5 S& W" p$ j Q" k7 I
pusha- x, [6 E' Z* l8 Z3 T, i8 L' ?3 G
Again:- E5 \- u6 x. j, q
mov ah,num
* Y$ h* @0 t) d3 T! U2 e# @ and ah,00001111b6 ?3 K3 p* K) L' W8 C0 E; ~
.if(ah==15d) ;CR_LF
2 `( M. ]5 v) a+ x+ V LF_CR
, ]: D% O, u$ C9 @) t .endif. X4 J7 W( e7 H5 r" |5 a: Z
- H. q0 ~7 \( h! g7 l M" \* G .repeat
+ d i, J% h% I1 Z% n+ R+ n mov dx,base ;reset host,claim host in use; a1 N5 Z9 W* J' E
add dx,0. ~8 U# q' r! V8 X
mov al,40h
m. e' G# S5 D: M. E$ i% J out dx,al* c8 G+ Z( Y& @' n6 P
. W$ K) q- y8 Z
mov dx,base
; j: v( I# B ^ @: N in al,dx
( z! Q& l( L8 ^ mov SmbStatus,al. A) G! d- K: ]$ B8 P8 Y
( [$ \0 G/ @! S6 C" r4 q mov dx,base ;clear all status bits& ]& O1 X0 R' Y
mov al,1Eh ;host status register$ F4 R; O7 r" M# a
out dx,al
, K( z/ \( _/ f
& K4 L% C6 }" d# X% S mov dx,base ;set offset to read ) f, K% s; F4 h+ T, E. G1 p
add dx,3 ;host command register
/ B& s$ n2 u5 y* y- x! y mov al,num
% R. M5 W+ K' g( I" q% ] out dx,al1 j* {7 b% ^! x2 |4 {
[5 R) Q l! i5 p0 E( o& w5 r7 y
mov dx,base ;Transimit Slave Address register
$ c( _( j. ]' a; G5 K0 r add dx,4: x4 N( A' u3 Q, ~1 M: D" G
mov al,0a1h
9 n% H( S) S# R4 m: F out dx,al1 h; r- R- g- K4 A6 H j
4 i! T, m$ F$ r4 z, L2 m
mov dx,base ;set "Read Word" protocol and start bit
6 a7 m- U* U. _, O, d3 J add dx,2 ;Host Control register- n6 H# X9 }- {, \5 B6 n1 d
mov al,48h ; e6 }3 n( D5 }3 E2 l6 ^& I% g
out dx,al+ }9 j- T* |/ p: `) V- B8 |
3 h: \( ]6 d. {; _: h* @) Q& Z& H; j9 M$ a$ e
" d/ F: e; h; Y3 K% q
mov dx,base
4 C: x/ _2 T" L# ^9 c* a: Q; v8 J in al,dx+ S% {1 ^0 A7 }8 `
mov SmbStatus,al
u* i u8 h5 J: ^ and al,1Eh
P& o' S. b' r X .while (al==0) ;check repeatly until any of
! ^5 r; j2 R1 D3 p mov dx,base ;FAIL,BERR,DERR,INTR
0 d8 j% B% t, [# o9 f( {( p in al,dx
L6 g `' }( S+ R mov SmbStatus,al
$ }& d! F6 O5 F' i$ ^* K0 Q7 n and al,1Eh
' |- ^* B5 p- v .ENDW* i% Z( Z2 }% L8 j9 N3 a; K9 n0 |
l, `- n6 k( s! X0 s mov al,SmbStatus
. p; E9 B5 s: @5 F! h* J1 y% P and al,1Ch
4 [: |. [1 J9 n( y* J .if (al!=0) ;check for errors 0 _. Z$ x z% X. i9 w1 V. X9 r
mov al,SmbStatus2 {7 x1 n2 Q4 ]4 z6 p7 P' d
and al,08h # D: h, \& @3 J5 L& M
.continue .if (al!=0) " B! X: n* b6 I3 v- V
jmp @F 4 W; M2 |( f' R/ L: ^3 m/ l
.else
1 b2 G/ o, a5 W M( y) X! H mov dx,base" N8 u6 K' v9 `& t0 S2 o
add dx,5h0 N" e- ^# c# {! }! |: d
in al,dx
6 A- U, ^2 m: n# w5 t. x- \ call binhex 8 c7 s# p' f2 `4 ^2 e6 d! a0 }
.break
9 k, ]1 a2 O4 ?1 K B. U: M' E5 J .endif
8 s- d2 o. A2 X3 d F: y: K; u; E 3 e7 G6 V9 I& v: a
.until (0) & c: u' U3 G; L9 i& r" z
4 ?* x; Y" N, R * T+ f/ B3 | X/ P& o
4 F& g* |8 @* ]2 Q' t5 n
mov dl,20h ;output a space
9 O' i: G* C+ B7 h7 h* r6 y% W mov ah,2! G2 k* E% b# C
pusha" d( E( W; v' u- @$ p
int 21h
3 r; H' `" S8 R d- q7 Y& t popa
6 o$ V$ ^6 K$ f$ x inc num
+ W- E8 L, I! E5 t8 o
' b. @: y0 c& S0 F( W) C cmp num,80h ;get first spd 128 bytes * Z; a R2 ]% u' p5 c1 q1 H( Z
jnz Again/ {2 Q; ^1 H& i! E: v: x$ r
0 o0 V6 }. [8 Z! W6 c- M: N4 o) L1 k" n! o@@:/ I. D3 W0 H, O* `; T
popa
1 T- o3 B1 t* j7 a/ z5 h ret
3 o. g8 O/ G3 c) I& ^ReadSpd endp: D6 M- L. g. S. U- F# f5 p& q M
" m& c" d- I2 r4 f* ~" |/ h" E. a5 _
) X6 c- b" J1 c# P" [9 R$ W6 J; N% _8 b3 z. Z X
binhex proc
4 G) U% N+ H5 H% V7 b" \0 E" O pusha
/ V5 e4 q! `# D6 ~/ N" b/ M# k % } a5 |" T# w- @
mov ch,2 ;2 hexadecimal digits to be printed" j+ O7 E, a, ]& {% g; @
loop3:
2 P5 U+ [% V4 d5 u- V mov cl,4 ;bits to be shifted* y5 \ M6 Y+ E( t
rol al,cl4 t4 G# I) U3 f* S" Z( B
mov bl,al# T. r8 l9 Q# U0 l
and bl,0fh ;mask the 4-bit Msb z- }' Z+ R/ |/ a4 k& P+ J* t
add bl,30h) w2 e4 x& t; S" b
cmp bl,3ah
* X/ i7 A' ~' }( J' ]6 g4 J! A jl next1 ;number or alpha?
% z3 T) a& f- i3 a add bl,7 , K( x7 @% P) S/ i* g- k9 c
next1: + R5 g( l* ^8 o' n0 Z, b/ d
mov ah,2 ;print one hexadecimal digit
; p8 W, ~' w: v mov dl,bl& F$ k0 d! B. t% f+ S) V
pusha8 k. V6 g; ]0 \9 u
int 21h
/ |0 e5 {- I( U8 H popa
, X3 I: [- X+ z3 r% d# n dec ch
" [* E% x+ G9 v P% f3 a7 I jnz loop3' ` }* E, Y% F
popa" {6 D1 a' u+ U. l9 {6 w
ret
4 Z% `5 j. O5 {; T/ m, V" Nbinhex endp5 L1 d9 f1 o9 x `4 l u
end main |
|