|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
) J6 |* u: C* F
2 H' Y1 q! K5 E) C R& l .model small
+ b) ?+ V# O1 V .386/ `4 v, E1 ^% o1 Y; U% V
CFG_ADDR EQU 0CF8h
( P6 F% K l% n+ Q1 B CFG_DATA EQU 0CFCh6 G# c. x* n6 U! t* a% R
SMBUS_BUS EQU 0
" I: V, Q# r9 a; s' z( c3 [ SMBUS_DEVICE EQU 31
& f$ }0 w H- i" _" K: u Z SMBUS_FUNC EQU 37 Y/ g$ e" C& C4 ^. O
0 Y6 k3 j! e6 m+ c' t .stack 100h# C c% b: u/ u$ u7 M
.data& d8 |. Q9 z) r
base dw ? ;smbus I/O space& e3 ^5 s/ {' ?' D7 C2 G+ v5 H. }
num db 0 ;byte select! [# a8 S1 I9 x
SmbStatus db ?
9 R7 L, Y, ?8 V% a$ |1 |$ I
, M! M! J) ~* w0 M$ ]. k .code+ |# L9 j9 E# ~7 k
C0 f4 o( t. _* ]! G% I
LF_CR MACRO4 ? [2 `! c N/ R/ d
pusha
% B. @$ o. {% f; H+ v& P# y3 c- ^ mov dl,0dh
- p- g; |5 Y! \" @- s- y" h mov ah,2
$ P) N* G, B8 k% s% t* u int 21h
; z& ]6 c* z' r; f) p mov dl,0ah ;next line
: N5 K6 {) r( ?* Y& w mov ah,2) V- p8 R3 s4 z& R/ Z2 R
int 21h- C! l9 Q% v7 B/ |4 t
popa
6 ^/ L" L" M7 I6 k# S I ENDM
& g7 a9 G& w' v! H! [" V3 B9 o9 A/ I, _! f
$ \" e2 e* E; Y0 F( Fmain proc far
6 O9 E: W/ |. i5 n mov ax,@data
, s' _6 @+ g. m/ D mov ds,ax
: p$ Z0 A( R9 X0 v& |+ k+ W1 L4 v% ]
4 p' K3 `+ m8 a9 x+ w mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
5 e! R: u/ C# Q mov dx,CFG_ADDR. J- i) ]4 l' A/ `8 b
out dx,eax
# q8 W& Q: G7 W/ E1 E5 ~ mov dx,CFG_DATA* a; W; x, P6 j" E* {6 t2 e
in eax,dx9 a, z' H0 u: ~3 w7 K# d" J/ H
7 o" B8 q0 w4 b
shr ax,5 ;bit 15-5,the base address2 x& O) m; P: R0 M
and ax,0000011111111111b# f F4 K7 ` `2 q- j. `! n
mov base,ax: q. z2 p5 p$ S( G
9 Z. A3 k9 c( g3 R7 i: N, P7 L call ReadSpd
1 k7 T$ Z8 N# [8 v9 Vexit:2 U) t# g6 H! T) q% V
mov ax,4c00h
, S* Y6 K) H6 s! N& C int 21h
! g. T7 F. M+ g: omain endp/ G* g/ w: o/ D9 Q' M8 u. x
0 P' N, G2 e7 {: a! S0 s' r; W) H
9 `' J2 f8 o: |
3 C/ }: N, _) o6 Q9 RReadSpd proc
* K! N5 f K5 u9 {, n0 x2 h pusha- v" |$ [7 r8 W/ l+ e6 B
Again:
# A6 V; }) [7 O' V" P mov ah,num* y/ m7 k9 R0 S2 W/ ^( L4 w' g
and ah,00001111b
" n" e' b, E, l5 `7 M9 [ .if(ah==15d) ;CR_LF
( y( H$ K& J9 J+ J6 ^ m8 V LF_CR
4 V8 g S1 d7 U2 N$ V .endif; ?2 W" \2 z0 B; ]( S* `8 m% z2 H" k
# H P- C! g. w9 g2 v- p
.repeat8 @: P% j/ W- ?% T( f$ x& [
mov dx,base ;reset host,claim host in use4 W( X6 u8 ^# \5 C$ O( Q I
add dx,0- e1 A- B7 y, N
mov al,40h
# q/ A. j- Y6 D5 L8 U# j ^% q out dx,al2 k7 t* D1 P3 y+ r% x0 m
: {0 q: h: y0 U9 Y# w$ y
mov dx,base 1 g1 C1 B s, w! v, E9 H
in al,dx, r' j1 R- `8 X9 ^- J4 S g% [
mov SmbStatus,al
" M4 |3 t( ?) l) x) ^ j
' a* l3 Z# q6 u0 x. f mov dx,base ;clear all status bits
* m, F6 r; D8 V. Z mov al,1Eh ;host status register
( e g8 @# Z# g1 @ out dx,al, [4 ~5 K( A) V4 d: g
, i8 l4 Q+ n/ W, N; ?" A+ a
mov dx,base ;set offset to read , N* W# y& F3 i; T; G4 w
add dx,3 ;host command register# v0 `: C+ [+ L0 Y) ^( N
mov al,num" ~. [2 M& q7 T- j6 w
out dx,al, i- L6 H9 U" _! m) W: X$ M
$ I' @) C( X. ]+ K' |1 ]) } q# h
mov dx,base ;Transimit Slave Address register/ A( @3 X* @9 ~5 Y$ A/ Y' L3 N
add dx,4; Y) f6 `, z6 \! D( l6 v
mov al,0a1h- m. Y) V; |& q# r4 ?$ o$ j
out dx,al
; c6 V: Y9 W9 A4 `* }8 X; K
% x' D) q" B G; Q* X mov dx,base ;set "Read Word" protocol and start bit
: t0 N# b$ A# p: R3 v add dx,2 ;Host Control register" ?: w9 O( W$ p
mov al,48h + r! M& W8 N! u
out dx,al
$ o m+ A9 N# i) w0 P- B. t5 N 1 D( [) L1 O0 g4 V) B0 O9 W
& E# [ w0 i& y$ ^- o* s
8 I1 h/ H! [+ v# m6 f4 H mov dx,base2 f0 m- i3 P/ M7 w J/ b
in al,dx1 m1 |4 V4 A5 J3 r6 d; d0 E, j3 Z) o( e
mov SmbStatus,al
" f; x$ {2 a7 k! {5 U& R and al,1Eh1 h/ P, O3 g8 u/ ~+ s; ^- Z
.while (al==0) ;check repeatly until any of
5 T/ A9 m% x+ G mov dx,base ;FAIL,BERR,DERR,INTR
5 i% j9 d$ v/ t& q in al,dx
, @4 u0 V* m, ~, v% s mov SmbStatus,al
" V% {& h9 A; {1 n: G and al,1Eh
4 F% C! G9 t! U% J: O% g .ENDW: j9 y) _0 W3 o* h
& A$ k7 o) y# g mov al,SmbStatus
6 s: p9 z9 C. G/ J# G, G and al,1Ch4 |. @4 h8 n, T, C; Z( Z- l
.if (al!=0) ;check for errors 2 A9 q0 h. J( {2 W( x3 H/ ]# V
mov al,SmbStatus
0 }7 N1 ]+ A [# m, b1 B! z8 z and al,08h
' t9 Y6 T3 E6 a3 i9 e8 z. R .continue .if (al!=0)
! Q3 \; m' T* E8 M. A0 c5 c jmp @F 6 W k; m1 c! V! D3 M; V; ~. I
.else6 G4 X. b4 p4 R5 D2 j2 N
mov dx,base
( z1 t( O& O) [: P' j add dx,5h
6 k& `9 |, V+ z0 o% g' a in al,dx
4 C. p, e* b( ]9 ]2 T call binhex 3 s* z9 E% ^& a( ?0 \3 x
.break
+ `/ w9 I' l% \! ^ .endif
& o) X& q9 n r+ f " m, {: W1 ]. |9 x. b+ Z( b1 H
.until (0) . ]0 U0 F3 o2 k. b5 b) @
- [& W7 a L% e! x w: q6 v
0 u6 G$ Y. E" E ; L5 m* ~. W8 v
mov dl,20h ;output a space
8 a/ f, u$ d( N; h3 n7 I mov ah,2' h e4 a) J+ X9 _! f& f$ e! o
pusha6 D9 ^. R/ u1 }7 i
int 21h2 I/ R4 {4 ~' d
popa, b/ u. a' U9 S8 W$ D" T1 \ n
inc num7 x! a9 j% z+ z9 F S
' ^4 G- f, O5 u- b cmp num,80h ;get first spd 128 bytes / k* \; X7 O1 W7 z5 \* T6 g$ j6 y
jnz Again! L ] A' h6 c7 \8 v
3 w) [/ M" w! c) S: n' u
@@:$ J8 n! t" M: w0 e9 v
popa
^! b" b# K" D ret
( x8 ~' t( u) `" \4 EReadSpd endp% e3 n% N# `* n3 S5 s0 G/ o K
5 y; r% O: B3 w" s) X- v/ m4 N( d" c; Y6 G, O2 h; l
9 b2 J% }) Y3 {/ E5 fbinhex proc ! b1 I/ C5 K5 b6 \3 {% Z! F
pusha ( G, H2 d! `4 k% N- `+ A- w, ^; v
& ~! ]5 i8 m7 I9 X- T1 W mov ch,2 ;2 hexadecimal digits to be printed
0 H2 T& }" y0 i5 s5 W) M2 K) Rloop3:
! L! F# N9 Z, a0 p# E* k1 B3 y mov cl,4 ;bits to be shifted S* r9 a9 x3 X( t X8 F' U3 M! s7 c
rol al,cl! z1 D6 M. ^* [ V% G
mov bl,al
5 A# g0 w5 j6 w5 ^3 C and bl,0fh ;mask the 4-bit Msb
]# t3 K! o* u+ I% u3 |; a add bl,30h0 X$ f2 W' Z% b9 y ?
cmp bl,3ah
/ \' Q( {) M% q2 x- N$ k3 w jl next1 ;number or alpha?
+ ^ [5 q; K( g* ]) i! V& z; u, q2 ? add bl,7
7 P. b4 O) _! u% cnext1: " |4 i: f! G8 z2 y5 F3 z) ?
mov ah,2 ;print one hexadecimal digit' S5 v3 u# N% t! O; H
mov dl,bl
5 ]% o7 g+ |$ n' U: q! i pusha
7 [, G- c* o/ ?; r3 T& J int 21h8 {2 \" m; | g) ]) `3 B, Z
popa
; `7 D" b) X& M4 a- ^% Q7 a; ?4 | dec ch/ u- _3 D' F0 a; d2 U
jnz loop3* O5 n# O- t' _8 l& H5 q
popa% O6 @* r% [& U7 N( J+ ^* n3 c
ret
* F. D4 k M" b- P" sbinhex endp
5 G1 k+ Q/ N J) w' X end main |
|