|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: ( k/ g/ N6 R z5 k: p7 `; i8 [
+ A w* e) j, p' W: q .model small
( c* {! D. ?& |3 h! q% ` .386, @6 s( }, Y+ g) V0 A: r( J
CFG_ADDR EQU 0CF8h
9 h8 i* I; D& w' l# H2 a, o CFG_DATA EQU 0CFCh
6 p4 j/ V. p9 P0 P4 n6 n SMBUS_BUS EQU 0
/ `5 g y; e( ^% a4 j$ H { SMBUS_DEVICE EQU 31
0 @# H1 T) h6 \6 ]. V8 c6 c2 M6 P7 A SMBUS_FUNC EQU 3
; w3 h8 e( q; z) J! f/ |
8 D# o0 N0 V5 B& g/ C- y* [ .stack 100h
5 b2 V# Q7 |% U2 x& [: B7 N .data/ I, D+ U& A+ g7 _6 ]
base dw ? ;smbus I/O space; [4 [2 g% ]# d! p
num db 0 ;byte select
/ {5 [. C) v- K1 }; CSmbStatus db ?
3 o( Y& W; U4 Y0 a1 s8 W, m1 Q
: \' V- S; R6 L: N6 B0 C# u1 o .code9 |& |- U6 b1 r0 ]' G: W9 h
" ]( h# h1 E" V0 k+ O& KLF_CR MACRO
7 S9 C6 \" @$ U- N pusha
# b% @$ H/ Y4 K mov dl,0dh $ D1 u3 x; ?7 p9 l
mov ah,21 \) x' M; F1 ]# }$ U6 b: ]2 B) \
int 21h! _4 G. L* s$ ]; C
mov dl,0ah ;next line . \6 S2 j$ k6 N$ h6 ?: l! u x
mov ah,2
* s6 B) x! B ^, D0 M2 s. C% U" { int 21h5 a6 b0 n! f5 V: t5 k6 R( l
popa
6 @1 L) D5 L) P ENDM
2 p8 `6 O+ Z+ s5 p0 z# f
6 o4 G) C. X9 |
( I7 x) R1 I8 A+ N3 X% x0 mmain proc far$ f" E' {0 l! j$ I+ ?. x
mov ax,@data) J. [. z: U! K7 E
mov ds,ax" b& D$ ^' ~5 n5 _8 k2 t8 u9 D
' v* X. D; c5 r; m
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h8 _$ b% T' Z- \& N0 J" m
mov dx,CFG_ADDR, i- U* {. G! z# x8 k
out dx,eax
9 H4 h; `8 v# A- Z mov dx,CFG_DATA
: a( m; O# S/ k; m. h1 \* H% G/ L in eax,dx
) j2 N+ V+ X' \$ _* |$ L
. n* @' L1 n0 H shr ax,5 ;bit 15-5,the base address
9 D. f# o2 o( ?) n and ax,0000011111111111b. b7 Q9 Y% Y4 F- h6 }
mov base,ax. Q$ j" A- ~$ b% X
; r- C, X+ B/ T- g' R- r; g5 I. r call ReadSpd' u. Y1 E8 w. h( q- P7 ]
exit:
; z0 u' l9 C( j) o E$ ?: E' z mov ax,4c00h7 b9 v5 H3 B$ B7 n8 c# Z
int 21h- L5 R. X: M8 ?: u$ r
main endp
5 r; s7 |# B5 G) M/ t- `
% K3 z! \4 ]/ F* b9 a, P) Q: t' m- o8 |( g+ [; Z
- h7 [0 ~( w! ]% n/ M* r9 vReadSpd proc3 T& N; w; x- f6 O1 T# U$ i
pusha
) n! O) J: f$ @5 }1 x1 a/ o+ \Again:" q. A4 F* e8 p7 H8 |& `8 }4 j
mov ah,num" k1 k0 W3 c1 C8 E9 k
and ah,00001111b; v% T" K( v6 a
.if(ah==15d) ;CR_LF' Y8 a, ~/ d& x( {+ R8 |/ e
LF_CR
$ Q2 i7 K1 J: Y- B! B% | .endif' S3 Z1 i2 W1 O) z4 |8 e
7 q h! ?7 X3 d, Y- m .repeat
8 V) W3 b+ s& z( n mov dx,base ;reset host,claim host in use6 N7 N4 _+ r& G* e( b2 H
add dx,0
8 v' ?7 V) A) D$ L mov al,40h
- Z2 g6 r5 T& K! u" z out dx,al) [4 `% F( S3 o( _
8 |9 ]( a& g" y; {5 v mov dx,base
, Y. W% U) T) b1 T' z in al,dx7 {( X* @/ E5 t3 U
mov SmbStatus,al6 h4 [" E+ C; z% x! W2 u: R" @
: q7 O9 K/ D8 Z Y: A
mov dx,base ;clear all status bits3 J, {) E, b4 y, P
mov al,1Eh ;host status register
$ V2 ], L2 ^7 p( o4 b7 B out dx,al N! e2 S% B; u- G# x. m& ]
( g9 V, D4 e( l% v
mov dx,base ;set offset to read t7 X* o5 n0 o- t
add dx,3 ;host command register. A5 d$ ~% `1 I2 D$ f: K/ t
mov al,num
+ a# h% W2 c- X$ O. f% ? out dx,al6 ]6 l2 ^" z5 C0 Y
8 o1 }3 }- [5 b n" [4 R) N5 { mov dx,base ;Transimit Slave Address register) }% t" q" N& E% K+ H( r* I
add dx,4
+ u9 o2 z5 O& Y4 V: S9 J. J. S mov al,0a1h
) Z0 R) s! A: B+ B out dx,al# g' N5 \. \: M: e& q
3 y* O/ {' e( w4 a
mov dx,base ;set "Read Word" protocol and start bit
8 P0 x( B$ T& D# x- S1 T. ^; P4 ^6 O4 s add dx,2 ;Host Control register
% a" f4 j& X3 t7 H, p( R9 s, m mov al,48h
: m% A' F' c+ {# \8 q# g/ Z out dx,al W( r. F% d2 e; L. U
& @ @, S7 W* h ]0 g i H
f5 V5 D; x4 c2 c; o ; x+ n8 D! [5 _3 {
mov dx,base/ t6 }. F1 X: e
in al,dx
2 Y; A& X$ C' D" ]5 A# L mov SmbStatus,al
& ~1 k- |; {* I4 j7 D and al,1Eh
& B! {8 v0 v3 \ .while (al==0) ;check repeatly until any of
$ V! x/ E) d. Y1 v mov dx,base ;FAIL,BERR,DERR,INTR- k, f5 k5 h6 ]" U& S" Q
in al,dx
$ V: w+ o7 @- U5 K$ m- I mov SmbStatus,al1 q% y/ [* L6 m5 {; |/ q
and al,1Eh
) U3 z8 O; l( [9 z .ENDW& B t$ K* A, y- T1 ?
* `0 q$ V' ^& ]9 F
mov al,SmbStatus ; U, p& c* d6 z
and al,1Ch1 A0 _' w9 [! a0 A6 G
.if (al!=0) ;check for errors
# u4 y; B9 @/ y. r# u9 X mov al,SmbStatus
/ J D" {- T4 ^9 q and al,08h ( z6 d" [5 r/ Z3 S* K
.continue .if (al!=0)
2 r; H3 x! m. q0 d. l9 \ jmp @F ; f- I, b. w- w2 U/ s6 U6 u4 o, o. O0 B
.else/ [$ x% k8 T$ d$ c) E
mov dx,base
( l* r. }/ A7 J' f add dx,5h
! X& z/ b X- z! J in al,dx 9 Q/ a. o# p5 y0 @0 s; C0 K
call binhex
2 S+ ~1 O1 A( \# ~- W5 d .break
& E# o+ _) e% N1 k# ?$ J .endif G5 @+ H) ^4 R7 G _ s1 z' N
" Z( l7 Y* k5 z4 D. |9 o/ x
.until (0)
* B; j2 |# v, O
& a6 d5 z) k9 d$ ?, u0 }% ^
, ]/ h# `& o) Z
& f+ |% n0 N& F3 W( L1 C mov dl,20h ;output a space
$ g/ s7 E% D% }6 \9 E2 A& b mov ah,27 n0 T* {. T2 f/ o7 `, r5 Q* e
pusha
+ E! x( v" j3 b int 21h
7 \- o, D: q, @ W3 \; B popa
( X/ [" K9 u! S" g5 M inc num
: L$ t, j" m2 I/ A; }) e/ z1 I/ c& }$ u
cmp num,80h ;get first spd 128 bytes 5 [: f/ S2 _5 H& q. \/ G t
jnz Again
# f: U9 g' a1 E- f3 g: C
; P, c: b" C( j! m0 B@@:
+ `; q# X# F: ^2 I3 n/ P popa, T- @! V Z& T! N' x
ret
; d$ n& p/ ]4 b# p* PReadSpd endp% \( s) N4 v9 n2 G9 f: x
1 N4 |) ]/ W8 Z7 n0 x6 A# C5 W( e& Z# f4 N* n/ ?# M
7 B/ c$ o/ J: D' Y: p& X
binhex proc - O T: x% }0 Z- w3 x7 W5 B
pusha 3 t& J2 m# p P; O) J, `3 B( f* `2 k
- i& h& M0 {: ^# V, k; {: K mov ch,2 ;2 hexadecimal digits to be printed
& D0 s% P' ?' h( |: Lloop3:
4 o" X4 K$ M$ T mov cl,4 ;bits to be shifted
' c( _( u6 Y4 a. w2 I6 q rol al,cl4 l9 O @: g& U
mov bl,al \- F1 r |' R b9 i6 ? g0 r& ]
and bl,0fh ;mask the 4-bit Msb' v& v. p _3 A L5 Q; J
add bl,30h* @; k7 a% p6 i. H
cmp bl,3ah5 s6 V9 b2 c: x3 Q2 V
jl next1 ;number or alpha?
' l7 t8 B8 t& X V, l, N add bl,7
1 C/ a/ p8 |! bnext1:
& v4 R4 V$ I* r3 m' u( }$ `$ n3 n O mov ah,2 ;print one hexadecimal digit
c$ S/ L& q- Y& g mov dl,bl
# s7 Z* X* ^; X. N1 ~ pusha4 q8 K7 R @0 a# ]: \
int 21h
* L$ t' [6 O7 J- @ popa
/ {: g# l3 M9 L$ _* L$ ^+ \ dec ch
Z$ A: A: |1 j7 E8 m9 p; ^3 G jnz loop3
5 S" j+ S) ^ Y( T1 [ popa. d' T( _# H3 X2 a! n W9 X' n
ret
" c O# A" [2 P" fbinhex endp
0 g x; n% ?/ o; u8 @, q end main |
|