|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
0 @1 ]" o7 ^, r1 s) {* X
* @ i$ T5 F. F3 o8 L .model small" u" _7 m- J" P7 f v5 t4 [7 R7 f
.386
8 r, D. q& D1 \, Y! o CFG_ADDR EQU 0CF8h: P c% _( p8 R7 E" ^
CFG_DATA EQU 0CFCh
" o: ]' d% `8 [' }( G" T3 T. P SMBUS_BUS EQU 07 x5 [ _1 W; s2 ~( u6 L
SMBUS_DEVICE EQU 311 b0 T' H% q% |# Q
SMBUS_FUNC EQU 3# X. h! [% u7 t
6 F3 y+ T! E( J2 q; G: ^ .stack 100h0 n* u4 p1 _: R3 H! T! C" D
.data
2 H$ \. Z0 o7 n( v$ O, o9 [8 P) [. nbase dw ? ;smbus I/O space+ J7 x- o% R& u& J6 B% q' ]
num db 0 ;byte select1 o7 ~! o% k0 t4 N+ L. d
SmbStatus db ?
+ B* S2 ~1 y) }/ U" b
0 n3 L+ \7 o# l* n. ?$ B% o .code- n3 O$ q; B0 t- q g
7 [5 T: v3 K( ~% q- }LF_CR MACRO5 x1 l; H+ R4 w/ Q) j
pusha
2 f1 [1 W3 o6 f8 f1 m2 d/ s! R mov dl,0dh " R- t# j; {; v& u: O
mov ah,2
! }- _1 i& s2 O. l7 ^1 s int 21h
2 y9 W, K$ a. M mov dl,0ah ;next line . ]# D# L. |3 E6 {, z
mov ah,25 e8 x; [: g1 G) X Y/ |- n+ ?+ }0 I
int 21h
/ P6 s3 s! q& a3 W popa
/ q% v3 B, o+ z9 ?6 E) X' q. @ ENDM
& a% M+ Z' P- c+ p: N' i" \0 s& l u* w; S" a
: x$ H8 }8 w# Y6 H2 U9 z3 o
main proc far
2 d1 Z4 r4 v6 ~4 E) Q1 ^) P mov ax,@data D' W4 u) P4 {" k5 y$ N
mov ds,ax
9 v8 ]8 k) v. T8 s, B0 ~! B / ~# A) O. t0 @- b3 h3 U
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
! f3 M: [- l! i. V mov dx,CFG_ADDR# `& q- r! b @: P, w, _
out dx,eax0 m; j' L3 F) r, L
mov dx,CFG_DATA
5 @ C# _1 m0 n) U! U* P/ z# l8 K1 v" Y in eax,dx% n8 X2 L8 z2 b5 _! @8 T2 r/ p6 e
4 \- U0 T1 Z7 [4 {/ p
shr ax,5 ;bit 15-5,the base address
5 k- S. Z$ ?5 K) U( ^' o9 U and ax,0000011111111111b% b- ^# K. `$ n& |% H$ E' {6 L
mov base,ax7 a7 c3 r+ h' g* y3 Z$ b+ ?
, E% O, J5 n% J8 [5 U7 x l
call ReadSpd) t" J6 L2 f& s0 e
exit:
6 ]4 R6 m+ i1 `0 j. V. q mov ax,4c00h1 |$ ^+ h' _/ D, E, f
int 21h- G* S4 r) w( i0 z& M
main endp
! J8 t! u, _0 z4 K. C, k) f, K
8 w L* x6 ^% y& | Q+ t* m5 K& L! D$ e
" s8 m! v5 h; U' M( d. p/ ?. X- ?ReadSpd proc
1 x2 y! ?2 z. n: P9 H pusha6 z: t, g6 d7 N; U
Again:4 Q% Q, O$ A2 _( I' k
mov ah,num1 ^$ Q* S0 [1 z6 y3 F! [
and ah,00001111b( J0 c0 v6 q; i3 M6 A6 U i
.if(ah==15d) ;CR_LF6 f/ X" Y# D% q" v7 C& T. A7 P- h
LF_CR
& L( ?8 w: `' D1 R7 l .endif
/ _- o0 ~! A2 u y) A* x0 i . I+ F7 O2 F+ U( u4 u
.repeat4 ?% U, Q$ k- ^( s0 N" |. ~
mov dx,base ;reset host,claim host in use
% |' H9 F7 X5 W$ v7 ] add dx,01 B i) z& _# s+ S ~
mov al,40h$ T# I4 v! J* ^( s
out dx,al! ~% Q5 G5 f. I* ^
% v2 `. f1 e6 Z N
mov dx,base ! K" f9 Z; w# ~- |& ~) ?; F. R
in al,dx, {* X" D# a+ Z% ~" a" E, m
mov SmbStatus,al6 ^5 `/ d7 O9 z
# ~( o, p$ H* A, K f$ L9 j
mov dx,base ;clear all status bits! d5 r+ J7 [( `8 C; `- K' V0 k, f
mov al,1Eh ;host status register
u v: n9 N7 T! b1 j9 `; w# h out dx,al( u% W3 p; p* {% o$ N* d, V
7 G0 C$ T# P( v. y- z. ^& }
mov dx,base ;set offset to read
; K9 A$ @# q8 T4 m add dx,3 ;host command register, C$ G. `7 M0 i5 \& H, U( M2 B
mov al,num6 C: Y! \2 o4 p: R1 p+ x
out dx,al+ U/ O: y2 ^. n* w/ p
% M9 x L1 d) q% h# M0 f' ` mov dx,base ;Transimit Slave Address register
9 C% @+ W& K }$ B6 a' T" ` add dx,4# A$ g6 F0 x# X0 N; o" d
mov al,0a1h; i9 o2 i! h/ e1 M4 v
out dx,al/ [- u1 R" W6 W( l$ N5 u' {4 I
: a2 I! c3 L) E( ?5 S/ i) g! ~% D mov dx,base ;set "Read Word" protocol and start bit( l, H0 K7 t: q
add dx,2 ;Host Control register# x! O/ R( W |
mov al,48h
5 G- |5 W- [. w& q' h! ^ [ out dx,al
& }% @& u4 ?7 P. U( I; C9 L & k; d4 ~" T4 ]
7 z/ Y8 @. F# R* J& i5 I
+ [4 S: b; p5 Y7 S& |! J( a
mov dx,base: q" j' F6 |( V$ i) ]# j
in al,dx. K! |0 [+ R7 e( w4 @0 V& Q8 {
mov SmbStatus,al
, a4 _- T0 R% \- ~/ v and al,1Eh) X/ U: c+ d' O4 }1 ^4 a5 b4 z
.while (al==0) ;check repeatly until any of
$ z# p [* N3 e' { mov dx,base ;FAIL,BERR,DERR,INTR# j$ t: N' ^* c2 i( J4 I) M
in al,dx3 C+ y3 W# l5 Z" N' B
mov SmbStatus,al: L4 @* l. M" \" T6 f) h- Y* T
and al,1Eh ( n) N7 J. R; j+ t3 N3 }2 k/ p
.ENDW
' u; w `3 {' m. g5 R$ H, d, ?* o& V
6 ?- V$ \% }0 N# T) q6 ]$ ~, V mov al,SmbStatus
0 n; n- [1 q2 O and al,1Ch
# A* n5 }4 G. I* X% X' @. e6 U .if (al!=0) ;check for errors ; [+ q$ p4 l1 |9 \! H. L
mov al,SmbStatus
7 a% T& r) T2 @/ l1 s( @1 A and al,08h % e- _% X% d! p& K" H# _; m
.continue .if (al!=0)
2 B! A8 L$ B6 s$ o jmp @F
' L$ c) |" v9 K( o3 N: z p, ~; q .else
, Q% a* w/ l5 U mov dx,base
# ~' x( M- a: S# N! S( V add dx,5h
/ d/ L- a( P3 O5 i( s( R in al,dx - T9 V- j9 g; j2 r- b
call binhex
& t0 S; O {; R! @) R+ |4 G6 M7 a .break0 W' a2 R& Z- x( ?$ J$ Q: [! i7 l
.endif" [! M4 f( g4 }+ J
, J9 \- V& d! M0 |/ t- G6 L) W8 G .until (0)
* q3 e) I- x; c5 A& W6 U ! O& e- M" e/ F0 M0 L
* u! D( x/ p! k0 e ; N1 K' q/ c6 ]% Y9 }( o- T. W/ q
mov dl,20h ;output a space0 o( ]6 S' E. P) F. f& V3 v# [, ~
mov ah,2
& b' b' v3 R! j+ N# G' K9 o pusha* U) o) N# }2 f$ S, a. f* a8 M) [
int 21h4 A; P `7 Z) ~2 p4 g+ l: _
popa
; X# x% ^* h2 F inc num
" m8 H! ^, |9 p. D. g. @7 ~; Y) I/ \- z: y2 Z- s) b* R" Y
cmp num,80h ;get first spd 128 bytes + v/ d m {, C* S& ?" F F: N
jnz Again& ~+ R9 M: b+ I
; m4 `) c* C1 P% t, h! S
@@:
. H1 |2 ^ Q& b/ x3 n; O: a popa
B9 g. D- {) Y( Y ret
1 Q9 i5 g& w* `) l( N6 O; b/ `/ zReadSpd endp; {2 n( X4 i! @* j
' \, j$ c( ]# }) Y8 s. Q, s9 o7 Y2 k
: ^1 C/ o6 ^/ o- ^
binhex proc 3 \6 \ m- V7 l+ o% w) B, }; B$ b
pusha
K* e, m L* [# {3 ]" M . `: N0 o5 f/ l& w5 g
mov ch,2 ;2 hexadecimal digits to be printed
9 j! ~1 K M3 t* aloop3:% O; \$ S$ A" L( z8 b( u% S+ {
mov cl,4 ;bits to be shifted
8 f. c+ `- c1 ^, m rol al,cl& ]; O2 ~9 _! W( c, p
mov bl,al
9 S! m2 ]0 ?/ B1 }! w" l and bl,0fh ;mask the 4-bit Msb
, z! d5 H1 J% M9 _ i( M add bl,30h
. n7 c5 W5 G, n. F. y; L+ ? cmp bl,3ah) o' _" p# o6 ]$ v2 R! G
jl next1 ;number or alpha?/ w9 M+ J' l7 }/ e* {' [
add bl,7 # j+ ]: {$ L5 d5 T: s* m) p
next1:
- ~$ ^+ N6 ]. p8 m3 W mov ah,2 ;print one hexadecimal digit0 D6 m# u+ |; \
mov dl,bl& f! R' ~5 T. P) B4 w
pusha0 Q* |; P( H) I5 S' n" H
int 21h
! u3 M; h2 \3 Q6 L. Y popa* @. @- |. k' l. _* f" H
dec ch
: v9 b. |7 Y3 d3 T# l jnz loop3" w2 Y4 u- ^: S: O0 Z4 Z% A% N
popa) [! g& s/ R& c4 F3 H' |. U
ret
7 k# H6 l/ A6 I; `binhex endp
* _# J' b% {/ {2 ]) ^: K end main |
|