|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: , {7 P/ i7 P1 T3 t6 T
8 M) O) t, W. _6 j' J& D2 e' j/ _( b
.model small# Z8 {: ~ a- Z# Q, T* }) C
.3866 Y( s; F0 w; Y; \; d# x! o! y4 R" u
CFG_ADDR EQU 0CF8h
9 N$ a0 g1 s8 D CFG_DATA EQU 0CFCh, L5 a4 L6 S2 m
SMBUS_BUS EQU 0( Y! w. C7 T; }8 p0 v
SMBUS_DEVICE EQU 31& t$ y- j! @: i" g
SMBUS_FUNC EQU 3; }. H& |& e7 {6 H8 L% A
: g0 u. Y6 b: \0 Z+ G0 M' T' ]- u .stack 100h$ w7 f0 @1 @6 I; \- Z1 ~
.data
: s6 Q% {1 _9 A9 `* T, @base dw ? ;smbus I/O space4 J. Y! u) C$ k7 o
num db 0 ;byte select# B# C" W+ f* X1 M! C5 [ C v
SmbStatus db ?+ o- S3 T3 c/ l5 e
: Q7 l8 S6 X7 k4 h+ F
.code1 s N9 z! ~+ e/ J b
0 ~6 T2 }3 A( \+ t% I$ L0 W( F9 dLF_CR MACRO6 w; C L" G+ ?
pusha8 N+ ~" m$ h! F" |: S- N4 X8 M
mov dl,0dh
, u$ `5 i2 \5 R i1 D$ V mov ah,2
' o9 p( a5 g: Y* m+ C8 k int 21h1 u9 Y |& B) f* M
mov dl,0ah ;next line 8 S3 B0 _+ e* g$ g. P
mov ah,2
0 M c" [* @9 G4 A7 y4 g0 f7 o int 21h
+ {5 L3 g* l! K popa
6 X1 ^* L4 i6 \, I6 H: C ENDM
3 k3 x3 d" Y" \8 a3 ~! U7 w$ Y4 `" l8 w# C! T( F0 N
7 `) A" H9 D% d" O ~! J8 a# imain proc far
6 D& K/ m$ _" ?. ^3 e* v0 H mov ax,@data
) O) J& g X. O7 u; V* n4 i mov ds,ax$ a- L+ M4 U7 J
# {& a9 x, d0 K Z/ }) B0 D mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
& i1 T! p/ T( L8 o. d; q# i/ L mov dx,CFG_ADDR0 D; u' x9 m [2 v* Y# U0 ?
out dx,eax2 t2 }1 K5 P$ p9 x2 |
mov dx,CFG_DATA u) p6 p: ]% i
in eax,dx2 a; R, [! x7 E# D. g
3 r% D4 a% Q7 z5 v
shr ax,5 ;bit 15-5,the base address
- Y' N5 {2 `) F' I* h and ax,0000011111111111b
! Z( X) @7 X/ l mov base,ax) J* n( X* n+ h3 T& u, Y
7 d2 p% \2 Q5 c$ n% p/ R call ReadSpd
: N0 j/ K1 R( R8 Oexit:+ k6 N2 M2 z5 ~
mov ax,4c00h4 A @3 l4 z. ~9 o6 P4 c+ p% ~4 d/ H
int 21h. T% O8 K; S1 b
main endp. M: i( K8 O8 G1 d
u1 t$ o2 O& w* N$ [
. ~6 M( w3 X- j) k! F. s
$ c! K: ?9 D2 c/ m0 h) XReadSpd proc3 s" G1 o3 b) g/ p+ k
pusha9 j# }. q# }9 S
Again:+ ^! y5 P' b+ y! T2 _
mov ah,num- E: q! T( q2 \$ M' p9 N G- k
and ah,00001111b+ C1 }0 D* k" M4 s( N7 L
.if(ah==15d) ;CR_LF
$ C* Z" c1 {5 g" ?9 O! k LF_CR0 W) I! r4 T, e% D7 _" }
.endif
0 K( U7 Z7 H2 P; [ j1 Y $ b6 T7 @3 D5 L# g6 S, Z# p# [
.repeat
: ?# ]3 n# L) J( L5 N! n$ n% f mov dx,base ;reset host,claim host in use
2 l7 ]8 a9 O# F, T# i+ ?7 F- m add dx,0
0 Z' s6 W0 Q7 W8 t- k! V6 V mov al,40h
! d1 i3 ~; ]7 @( e. p: R out dx,al
# s/ q7 D2 |- [+ G5 \ ; V- y3 [, B$ |. _
mov dx,base 2 }* ~- N+ h9 `" w% k
in al,dx
( V0 g. I* ~7 L2 O mov SmbStatus,al5 }0 |/ {- q; B& M
- Z4 R5 F, Z6 L2 u2 g
mov dx,base ;clear all status bits( k" M/ t: k$ q( M7 w) S
mov al,1Eh ;host status register: T2 o" l5 s: _2 W
out dx,al$ y2 ]+ W$ Q* s) u5 S2 _. K
9 K8 P) }3 q6 p9 w' ]+ Q mov dx,base ;set offset to read
: ?1 P, y/ P. [+ ?: l add dx,3 ;host command register: N, D9 S% N6 J
mov al,num( \1 A+ f6 m3 A8 h! T% E
out dx,al+ o a+ c5 J* P0 Y* P5 @" }6 Y
7 `' \: m8 K# v' h( [! F3 n( a mov dx,base ;Transimit Slave Address register' w5 r! J) I3 Y ] o& ]1 U
add dx,4
* m) Z( m/ y8 N% R6 p, J mov al,0a1h
. u$ D v0 m. ?& X out dx,al7 \6 T+ [4 `% f/ }& U; C
; L4 n/ K8 _/ S# g) Q5 l+ M! R mov dx,base ;set "Read Word" protocol and start bit3 l1 ?5 D: H% y* [3 K5 V7 G3 F
add dx,2 ;Host Control register' O5 x& d% E* x. c& x5 @
mov al,48h
+ C1 e `/ j" A4 D" d out dx,al( g6 _& G: k4 J4 ?
L, @; s( C+ q& D2 a' K3 C C
5 N6 S' c) E7 ~0 Y" T# _ 6 n8 I# { k- R
mov dx,base& I) V' @8 J9 S3 D; ]
in al,dx
- K' D% Z, _8 w X mov SmbStatus,al+ L" o! V/ y: H, T z
and al,1Eh
; d# b; `+ R6 _% j .while (al==0) ;check repeatly until any of
8 D( l( x# h @$ \ mov dx,base ;FAIL,BERR,DERR,INTR
4 m0 m( X, J+ T: f in al,dx/ N, U) v$ ^5 v- B0 X$ k5 z
mov SmbStatus,al m1 G7 E* U) V! N2 z2 m! p: A
and al,1Eh
, ~: ]9 N# y. i& W5 K( q .ENDW, t0 G% z' l4 q, g0 l6 |/ u1 Y) i w
. Z7 s1 T9 W! p- r( X, g% ] mov al,SmbStatus
?( `( p. d$ N* B7 s1 L and al,1Ch3 i, U* G( ~. }7 j2 T
.if (al!=0) ;check for errors + }5 @8 j- b% H
mov al,SmbStatus
* X" {$ ~' K6 M8 V. ^+ z) g and al,08h / S. W4 `6 c$ v$ d$ s
.continue .if (al!=0) $ Z* V* m0 \) ^
jmp @F
6 ?+ Z" J# O- S% r$ A% f .else3 u9 {7 @" @$ _) a7 K1 `6 [9 {
mov dx,base6 ~8 ~3 Q: U3 ^. r" H1 [: P( `$ D
add dx,5h
) E: r, B. ^% r& Q7 q: L) W0 q( B in al,dx
0 x3 E' s* X, w call binhex
0 Q& ~% d; ? F& ^- L1 Q% b .break" e0 [, b0 ^5 ]# d/ q8 @/ i
.endif
/ V; w* Z* O2 ~' f( r
- I* ?; Z& T3 v6 O) U$ Y8 f, J6 W .until (0)
, {+ z0 w- V+ W" K2 `5 U
) j/ a- N' |! z
( R* i/ a2 ^% E4 i9 P: K0 p- C ; L/ O" l) s" t% s; {' c( p
mov dl,20h ;output a space
- _+ u: ]" ?4 R V mov ah,2
0 E I N8 J' o, P t. r8 I1 n8 b pusha; R3 P8 O8 U1 F3 w4 F; n, N* H
int 21h) g* T; {% {$ I1 j% N4 Q
popa
& d: x& y0 w1 a2 E2 l inc num# n7 Q, T, N5 A0 s
1 r" B5 `( |4 V3 Q f
cmp num,80h ;get first spd 128 bytes
, k( f+ ^$ U* M4 T" M2 [: s" I& i jnz Again( [' E; V A) U( W+ A6 v. q* I% }
& E7 K6 C7 t) [7 \
@@:+ S1 U6 _- w" d, H, T) P) U7 E
popa
: M; u! l: |0 v+ T' r ret
% E. O: y; H5 G) KReadSpd endp. e( ~9 C4 [! U+ f5 X8 f" c
) C6 m5 N1 A, q8 o" m. Z: c- k+ P3 g) `5 O/ w2 ^
: ^5 o9 S9 [% T) k, h# nbinhex proc $ S& x* o3 p3 j& u# C/ J& T- ~
pusha
5 l' R; r' M8 Z2 ?! h ' }! c) r: _; U& ]0 L; _% w
mov ch,2 ;2 hexadecimal digits to be printed; t$ }+ F: ^" c: d4 I
loop3:
7 I. }% i5 F2 m/ B& P mov cl,4 ;bits to be shifted; h% W( z, I/ ^! T
rol al,cl
2 ]( V( t# _0 v0 p' x4 \ mov bl,al
$ l0 J; q' c& s9 h8 B3 n and bl,0fh ;mask the 4-bit Msb
6 J: g0 a. j) j2 z add bl,30h
0 o0 h$ d4 J) w) w4 U) P% n( e2 { cmp bl,3ah% c8 j" j) F5 Q8 C; B$ L
jl next1 ;number or alpha?- i) r+ W# h0 d2 z6 k! c1 F( F
add bl,7 / F4 x8 w$ j* P+ } K+ n5 @; U
next1:
( L9 Q9 J2 \' \& T/ ?2 Y mov ah,2 ;print one hexadecimal digit
; ~9 l* N1 r$ A7 |9 c. j mov dl,bl6 S8 i, J2 ]6 W% O0 k, ^/ \- i
pusha
1 I! N0 I- Y3 Q# r+ o$ X, x& A int 21h" F% K4 F! h2 i/ p
popa
& b4 u( S; T" R, L9 u9 ~7 p dec ch0 `, R, ]2 p$ Z+ z+ ~9 [) B1 c
jnz loop36 ` ^( j3 N- \) P8 [
popa( q0 Z! v' H$ c) c2 x4 q
ret7 q. f& i; v$ Q: W2 }5 O
binhex endp
) P2 i' r* A8 w3 v end main |
|