|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: h; V( N( W/ w
' F6 }1 q( S: \, [
.model small
2 _ `, ?/ R( E' J7 n4 ^. a4 f7 r H .386
$ Y, b7 N# `" U7 L7 [3 N CFG_ADDR EQU 0CF8h# N8 {* y7 Z* j5 C) C
CFG_DATA EQU 0CFCh
$ h) s2 J, q7 p* ^0 b SMBUS_BUS EQU 0
7 x' ~, l# ^7 {6 \! c! m! E SMBUS_DEVICE EQU 31- m4 U2 ^. C. n, r
SMBUS_FUNC EQU 3( D H& u; p. T( C+ Q) k, h; ~* h
! q' W k6 s) l6 L9 z O7 L
.stack 100h
; ~( v: M2 c" C* t5 `8 S k5 q" E .data
; |3 d" J, s- ~; c1 xbase dw ? ;smbus I/O space
( T( q# V/ Y4 l. c a9 _/ B5 D4 M) Znum db 0 ;byte select
1 p0 G& _2 C8 v5 ~- t1 W2 fSmbStatus db ?' Y. D8 h, P# }9 W# d7 z; s% ^* R
# C0 h& S9 k' _/ I2 g
.code
" T: h3 _ o& A3 r2 y
$ Z- I \6 f" N; K! {LF_CR MACRO
) ~! E; f, ^7 R6 H pusha
+ T% O. \! Q, Y: K mov dl,0dh * c1 \- e; w- ~' V4 D/ F
mov ah,2' u& X/ X" { F
int 21h
- z2 ]. {0 x% b v/ E4 ~3 I mov dl,0ah ;next line 9 q9 r' X# x) k8 x' T/ M) y
mov ah,2
8 N$ N$ D: c! Z7 B( {2 r int 21h, @; k/ t& ? Q% O/ x/ [
popa 2 l$ s+ \) p, ?
ENDM
. ~1 n4 S! A8 z) i) l; u' D
! P" r$ x5 N* B9 c& Z* U& z+ B1 [1 v& x
main proc far
- \8 C$ a' P% \* v, |( s2 E" [ mov ax,@data
1 x$ ]: ?# y8 v/ @2 C: U6 E) H mov ds,ax1 V+ n6 q' A: X# x- g
8 I' |1 A% Z7 l' h/ s7 X( \9 \* c, a mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h, X* | m5 a3 w7 K
mov dx,CFG_ADDR9 _) ^+ L a# h! W
out dx,eax8 T. b# r+ ~" ?5 l8 j1 Y
mov dx,CFG_DATA
1 J0 O1 U* v3 X: P9 T" t in eax,dx( N+ T' {9 g/ L1 s' ~
7 ?, }8 i; X7 V shr ax,5 ;bit 15-5,the base address
$ z! {+ a. v9 ]$ @+ K and ax,0000011111111111b7 ^6 e2 Q0 @! L: D% H
mov base,ax1 r+ X) d% ]+ i/ w
$ g7 B- x1 K1 k
call ReadSpd
; d0 z1 `' z' O" [: ]exit:
, f: V2 N' P7 h9 C( x% i: J mov ax,4c00h
3 k' J8 H1 A/ K' |. B# y; W' m int 21h9 S. C$ L( r2 m/ q$ p* i+ P
main endp
: m% v1 g; J) q! ~ }8 L% C4 @; k/ O# C. V* G3 q, r
( j# l; R2 N; r' L" {: i
. D% Z5 t6 l- D3 q: R+ T( x: P4 RReadSpd proc
* c! P9 V. a8 w; P p. u; l$ I0 r pusha
/ Q5 q+ I7 M4 J! ~$ [' t2 ~7 P2 [Again:/ d9 j2 p( _ R, A; w
mov ah,num& X: _& d& I3 W7 X( X6 K
and ah,00001111b
0 t1 A$ e' u5 [ \; d1 a# W1 h .if(ah==15d) ;CR_LF
& M2 p; c* g3 C5 t, c$ R LF_CR
3 c! w7 E8 g0 }3 k+ R3 i .endif; ^# ]+ J" M2 R9 r' p$ ^" h0 d
9 F* ?& D1 _; Z8 [. w .repeat
, o1 F( E7 Q( B4 f! v mov dx,base ;reset host,claim host in use
' i( E* R- t5 N. S+ I add dx,0- e3 y7 z8 y# O6 }* O. W2 B
mov al,40h8 |9 Z) ^5 f* U
out dx,al
6 X! o; g" s) f6 _
0 t! t# n$ B. q; Z mov dx,base
) h3 u+ E4 e* B% w) m in al,dx
( E3 y! u% j6 z8 d5 x mov SmbStatus,al7 m5 Z2 K j9 \ O; ^( B
0 U6 \2 _( X( G" _& a mov dx,base ;clear all status bits
" |1 u: E" W! Y# h( R mov al,1Eh ;host status register& s" s8 @; [. q; \+ C6 X
out dx,al* I6 z# U$ t) J9 z9 |& K: i0 Z. s
/ B& J) h3 l7 \: c) U) g8 E mov dx,base ;set offset to read 4 K# Q5 A9 @& m9 h( s
add dx,3 ;host command register$ ~4 ~% ^6 x r
mov al,num3 n! |5 a9 [# o* p* L! T
out dx,al" r8 U' r# `5 o7 ~2 p, a
# k4 I9 C5 [6 B& V
mov dx,base ;Transimit Slave Address register
8 E. J2 |; ?0 p4 E, a add dx,4
! Q5 q8 I, n1 ~$ T- p mov al,0a1h
" P$ I( O0 x# m. d3 }- ] out dx,al
5 N8 ~% p/ o ]9 o! J. \0 k
# o% H( i" |! K! w/ a mov dx,base ;set "Read Word" protocol and start bit( t: V) c0 }2 K
add dx,2 ;Host Control register
. W& l1 f; Q9 _. T4 g" n9 x( o+ k mov al,48h
5 o9 p6 L8 {8 y x7 t( O out dx,al9 c4 `) b5 ]$ _1 o' _+ q* S: [+ j
! }- ^6 q& i. ]: \0 z
, h5 g2 u4 F" L, k4 C8 O
- ?- `# V6 S" m5 H mov dx,base
/ J8 W6 I1 v1 q' ^/ y' y in al,dx
2 Y: J8 @- u9 c4 ^1 b6 W mov SmbStatus,al
5 {! Q: _/ ?* `, l) C C, p/ o% f and al,1Eh
' N1 }6 [# t6 k* t .while (al==0) ;check repeatly until any of _ R+ d2 J' ~; s7 w& h1 Y
mov dx,base ;FAIL,BERR,DERR,INTR
: `4 P6 ]8 k( u% h. Q6 T0 ^ l in al,dx
. W) P9 D4 X, K& f" q mov SmbStatus,al5 f. X) P% d6 ?% U9 j
and al,1Eh 5 \3 r5 f- ?1 V S1 Z
.ENDW. D5 F$ O6 v( x8 [ R) G
- [& j' Q; c+ Q! E" |- |
mov al,SmbStatus
/ w y$ _; [! h+ r6 e and al,1Ch
1 q+ y. c7 h: F# g; l .if (al!=0) ;check for errors
+ S8 O' q: P4 Q# G) j. J mov al,SmbStatus
" I5 D8 M4 X" i* D" o' Y and al,08h
K# z5 Z1 L# S* l0 v .continue .if (al!=0) " x) |5 A$ K# ]6 k. E1 F
jmp @F . ^1 ], k! t( h" o
.else
; _) S6 H; I5 G' |, q mov dx,base8 o. L) x# u) G8 Y
add dx,5h% [; x1 ^' W n, A
in al,dx 6 ~' W8 K' e+ e% z
call binhex
& J q$ F1 X4 _+ J, j .break/ h* J P! E: ^# j( W1 }6 F
.endif
4 U# J& ?; q# S7 M5 y6 b+ Z0 f; ` 0 b1 [* H3 J* F* r& q- I+ i
.until (0)
6 v ^9 Z# G8 c4 L* _# M& ]! E/ c* z / R* m0 u" F4 C) a
f/ D% F& d2 a' F ! b( @5 I n/ f/ j1 b
mov dl,20h ;output a space, \7 F) n- ^2 }1 Z/ g
mov ah,2; I6 ?! Y5 h, j* a
pusha
9 A3 |, F3 N6 T8 x8 q2 i int 21h
; d0 a8 L+ O1 O; T( c# Y popa
) R- d) T, G; Y inc num' s. A; X F+ Q& r6 F. w8 I
, ]# e8 ]1 e% V/ o cmp num,80h ;get first spd 128 bytes 7 B ?# r3 g I9 M
jnz Again
/ b7 ^" U, y$ }0 Z0 K9 e1 M1 Z % ]9 e6 F6 e, s* z- m
@@:
* a! V& P& k4 D3 O/ ^% o popa5 t4 ], d5 g( ?& ?0 F
ret
% d/ `' W a5 q% B8 dReadSpd endp
; i5 C4 H6 x8 n6 D8 d# t/ i9 |9 |# M+ u1 {
8 P7 e# B; h3 G: X( ]
q8 t2 U* X3 V$ ybinhex proc
2 E. S. ^1 k3 V s7 `9 m pusha
$ c/ j9 \- z/ l$ _1 ] 9 \; [, [8 i/ S9 w* T4 s0 V) u8 _
mov ch,2 ;2 hexadecimal digits to be printed
# H; m5 @4 B! w( x6 Eloop3:
n6 i3 j. i T' T3 Q- S% j: D mov cl,4 ;bits to be shifted o+ y8 r, c: \( {# X# m
rol al,cl
7 N! j; k6 g! M, ]$ p mov bl,al) t: u) n+ y& l/ B" U
and bl,0fh ;mask the 4-bit Msb
& x3 _, t. H* f( M) x6 ]9 D add bl,30h1 ^* G6 l( K, i, y% J) @+ b; z# v
cmp bl,3ah
, f2 M; Q- W' \) T. Z jl next1 ;number or alpha?
5 x8 e2 c, S0 b; F- V add bl,7 + f2 j% k9 C) v6 G
next1: - S' _6 v' t4 k, r. ~' {% k& I
mov ah,2 ;print one hexadecimal digit
. d& v" i4 A' X* ^' n mov dl,bl
; k0 C) Y- R3 q# M. R pusha
' a- n( k. O7 ~/ r8 r7 ] int 21h2 L& H6 m: l: W# E' j1 v2 ?# c) W) s
popa4 ]5 O0 N3 h) [# M( q( i
dec ch" X; S; L+ y$ |- m' [$ H! G6 o
jnz loop3
' F z3 d1 K+ Q9 K popa
- `- o* c5 k$ H" z2 @ ret. ?* {0 G( a; u4 M0 y" ?
binhex endp
0 }& T! h, u+ Z& e9 v end main |
|