|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
3 h2 g9 \7 J [0 a f) S* x" _% J9 `% h
.model small
: e8 S2 D) w. q5 s/ Y9 t5 I .386- T& n# [: ?9 t/ Q$ G+ @( d+ g7 \
CFG_ADDR EQU 0CF8h3 I/ ^" z9 d% U- n! W/ [( w
CFG_DATA EQU 0CFCh
6 g( Z. T7 V1 ^/ |6 @$ F SMBUS_BUS EQU 0
3 E. \% x, T& Y2 k SMBUS_DEVICE EQU 31
, v. F% p. E" Y, h SMBUS_FUNC EQU 3
. n9 ]9 a7 J. Q, w' l
: X& ^& @0 H# K( E .stack 100h
, }# G/ g3 ?! |, M+ ~" u. M6 O7 F) j1 Q .data
, ]5 t* K. k1 f5 e, d9 xbase dw ? ;smbus I/O space
$ M7 U- m: r% x+ B# B: znum db 0 ;byte select
( @% V8 z9 |) @' mSmbStatus db ?: `2 j2 f5 e: }* C B1 E2 e
, \% ]8 L( w% _ .code3 [ }0 f( o; \! Q
0 b4 G& M% n) z6 O) y$ a; oLF_CR MACRO
4 v+ h( s7 {7 A" w8 B$ e pusha2 q5 Z1 N- [' S7 y6 _
mov dl,0dh
6 d K: C7 t m mov ah,2
, u# r* l) W6 s; u- W/ j" l2 m int 21h
+ W: I: H2 [& {* g mov dl,0ah ;next line
* k1 [9 a: y( u% s1 u1 n" {! R4 n mov ah,2% i( ^& W* x Z* z5 s
int 21h
- K- E3 w5 n) d3 ~" G2 y1 R popa 8 m& b% q; g' V: G: z9 M
ENDM, r F5 Z; `: {2 T
; R' h6 N+ o& B6 z9 j
2 R- i& @8 L4 R& B9 v6 x
main proc far! _ C. i8 ?% E+ J1 Q
mov ax,@data$ c# ~8 @' @6 X: l# j3 X" j; P" [" U4 n4 b
mov ds,ax
* w0 G2 ]& ~* Z T( r$ y9 j) o
1 F: z- ]/ f/ R; F mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
F6 E6 {$ X+ Q; w+ }/ E+ U/ F mov dx,CFG_ADDR
* h1 i1 I2 l) S; ~& } out dx,eax3 j; B5 d. r; U ^, H* n
mov dx,CFG_DATA" j1 c5 `" { } ^% h% \
in eax,dx
) m3 u0 H) q( T, G0 X + K4 c9 Y! Y) {- F! F
shr ax,5 ;bit 15-5,the base address) R2 [4 H( X4 L$ C/ A! L& D
and ax,0000011111111111b
0 k0 i9 ?/ D0 l& O' V mov base,ax1 {" _ ^) E& |; W4 K$ @
6 g* N' |: y. x: d- A2 k
call ReadSpd1 n/ Y9 ?* f- q! d
exit:
1 z7 _- ^7 {7 \8 Z mov ax,4c00h2 g1 L& B, X p" `( S
int 21h/ ?( v# ]" y& [% R
main endp( F }6 V$ C: H3 w
+ @3 B: @, M$ O) C) [& f6 I j2 R! l
& W% g: _9 V3 bReadSpd proc
' }# e b, W* I3 z9 M1 g, f pusha
8 t. \" v: V: Y3 UAgain:0 m( z0 g% Q* k |: Q
mov ah,num
( D- s+ G- L9 m- s" q and ah,00001111b3 h0 r* J8 c' u
.if(ah==15d) ;CR_LF0 b3 Z0 Z. {- H7 z
LF_CR
, A2 x) ?+ g% ^% n2 h+ `; X .endif
% L) B4 h3 P" D 3 B& I# r4 E4 O* d4 w7 n! F: F
.repeat8 ~" `6 V! f! v: @9 @' M$ y6 P3 v
mov dx,base ;reset host,claim host in use" p; w( T8 p8 _: `2 V' Y# t+ X
add dx,0
9 @/ ?1 k" j u) a mov al,40h
! ?" Q: |: v. Q2 w6 x* q out dx,al
3 F: Q& } j+ K% o0 J
$ i5 a$ k, W: _( a mov dx,base
2 m9 Q" ]0 e+ N in al,dx
2 Y% p2 w5 s; X* M' @ mov SmbStatus,al( c {) j" F# s8 L
+ M5 }' W) @, T5 }( j
mov dx,base ;clear all status bits( \5 s) a; D- Q( ]! Y( ?9 q
mov al,1Eh ;host status register
+ H* M j& Q* g1 D: x% t# C0 ^7 o Y3 K out dx,al
: d' T3 |- N2 F' \: Q% @
& q! s, t( _4 c3 I mov dx,base ;set offset to read ' F0 Q! k. m- c1 E& [7 C/ B
add dx,3 ;host command register5 I4 x! U6 _4 M- f/ C: r# _3 X
mov al,num
2 w' ~" b4 E# o out dx,al1 O1 W: u7 ~4 G( d5 h/ i; I
# L9 M5 g) Z+ I5 W5 i
mov dx,base ;Transimit Slave Address register
$ R \1 c. [/ P0 s3 Y! I; E3 n add dx,4
- V* p( q) O9 @* [% f7 l mov al,0a1h' A5 q( \5 o$ C8 S/ W; T6 J
out dx,al- E' n) t& A+ G
/ g& C% l6 Z2 {, y: _- [
mov dx,base ;set "Read Word" protocol and start bit
3 H( z# U. u( l+ s add dx,2 ;Host Control register5 Y L5 |/ [8 _+ Y
mov al,48h , T2 T" b" h; I& C
out dx,al
8 B) \. r! B2 k1 _( f# z5 B) j
3 U0 E8 F1 m3 Q) b, m3 ~5 C9 c9 o
8 K, C: J# _& P: V' g. k mov dx,base
j+ C6 W7 R9 ^1 _; G5 ` in al,dx. H6 z) `( B& I& I* H
mov SmbStatus,al6 m, B- j9 T, ^9 R
and al,1Eh
4 V ~6 L7 w5 ?) n) l .while (al==0) ;check repeatly until any of" {" x, K; U4 G n9 C+ b+ Q9 P
mov dx,base ;FAIL,BERR,DERR,INTR t: z3 |( `6 E( |/ p3 d' A5 w
in al,dx
( v! z$ |$ Q5 j6 m* Z, n( _ mov SmbStatus,al/ R' E% Y8 E/ P/ h4 T( U3 W4 a
and al,1Eh
' y( W- e! h: o# T .ENDW
$ o# g0 i$ _4 D! i/ t" [: A9 t! o
u7 J" f2 v1 V8 O& y c; W1 O# c mov al,SmbStatus 7 d1 \/ C$ S1 l, s* @
and al,1Ch. O, Z. [/ X, J0 D2 F" D+ y0 T2 V
.if (al!=0) ;check for errors , M$ o5 c- G$ o5 A) H2 S+ r
mov al,SmbStatus4 g+ i$ y8 [7 F8 e* ^
and al,08h
# z) w3 o7 \4 H, _8 k; R$ m0 K/ I: c .continue .if (al!=0) " ]: C6 @% T( h: ~& M2 r: T1 j
jmp @F
2 U9 E: R; k/ [5 j6 H" i' q- C$ O .else0 T5 m2 E+ F9 }6 q3 x( ~& a
mov dx,base' J3 G! z6 O' C
add dx,5h; z8 y$ O: E. C
in al,dx
% d! J6 B& w) s, o% \' [ call binhex 4 a! B3 U1 ?4 \0 S% V
.break
4 x S% @* d3 b7 C$ T0 l) N! G .endif4 x7 ^8 j; _" R; k# D8 s' w, h
8 y& y! a) B( R9 v% N( W" ` .until (0)
, ^3 I; P+ A2 @1 N# j8 ] + F% G! a+ I* r
( K# s" X' R0 H4 w+ {. A# J$ |
2 T( k" v0 _- }$ ^" ]$ } mov dl,20h ;output a space
( E7 ]! {$ g7 w mov ah,2
/ x$ P/ ?$ ]! i! s/ x" m pusha
. e# m9 \; e' L, s. I4 T int 21h
6 w0 ]1 E" c6 ^- V/ t( r! c; B1 s popa2 ?, K6 a1 J7 D
inc num
8 a4 i, u% _* l( _* \- m, ^
1 G! a! M/ e1 M7 R2 m0 G5 o- |! m: V cmp num,80h ;get first spd 128 bytes
; Y, {. \( J3 x" S jnz Again
, h+ i( X6 T) G g2 h. o
6 j' ]6 N% I* m@@:
) c8 y+ w* |% e( C% j popa8 C7 ~3 E5 D# _) v* t
ret
# {8 c, M; F* U! gReadSpd endp7 g. i+ V6 Z9 N- t1 p
! _* t4 |2 h7 C- y) j8 }# J+ }
) V y$ @- h0 i( {# `' B" w5 |
- p9 \: O6 p2 C% `* ebinhex proc
4 [8 N6 t3 F* f# L pusha 0 s# J/ ], W8 b7 a: O
) z; d- h1 E: l/ x9 ?$ v
mov ch,2 ;2 hexadecimal digits to be printed! V& m: z# j! \
loop3:- g6 O" h! Q0 V' {
mov cl,4 ;bits to be shifted
: B2 g. X) |5 A' d% V0 W3 ?3 N. F rol al,cl
8 N( I- P7 `' U. F4 K0 Q mov bl,al p6 R! {6 a! y O
and bl,0fh ;mask the 4-bit Msb, M7 r4 X/ O3 x! s5 J; c1 J+ A
add bl,30h& t2 Q( f' T, h3 v2 i1 S9 U* N8 p
cmp bl,3ah
. P1 W; p4 w, P$ ?" i jl next1 ;number or alpha?
8 G, c) u! L9 G7 l) h6 e- M add bl,7 & ?, @' a, Q" {9 z/ [9 p' b
next1: 7 w0 t% ]( t" y' o% ^
mov ah,2 ;print one hexadecimal digit
' Z8 t9 S4 u( y% I: ]4 U mov dl,bl& f: H7 z) n9 F( d
pusha
4 ?' H, _0 `: f+ i, r2 E int 21h) W( U" B( G8 d. q
popa
) J: }$ r9 @7 D- H3 q* g+ u& w dec ch
$ g$ D9 E( e* w jnz loop3
1 V; ]: |) h. b6 t4 \ popa5 T3 Z$ m" G3 Y: C" T, s
ret+ N6 }0 G4 E8 G% Z/ u
binhex endp2 t+ p y0 I0 ^! n2 m' w G2 a t
end main |
|