|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
3 r: @8 b$ n, ?$ o
. Q, I }, u; b; l5 ~ `8 m .model small# ^! s% c0 [3 d9 k
.386
/ v4 n0 s5 i& }) ], b, N) A CFG_ADDR EQU 0CF8h6 r9 Z) a; Q7 ~1 s
CFG_DATA EQU 0CFCh
5 W- s2 k6 Y l' p8 d, r5 T( W SMBUS_BUS EQU 00 V" m3 D" o( V. L8 i) y$ X0 `: P9 M
SMBUS_DEVICE EQU 31( c$ r- |! l4 v! \- e& Y" m
SMBUS_FUNC EQU 3
: ^6 y5 B3 A7 f5 w- m4 m
: W6 {( W9 O& f. { .stack 100h
& K" W$ [/ x( ~6 R8 @& v .data
' s1 S$ n% }; mbase dw ? ;smbus I/O space0 T+ R0 K0 F* w' R% t4 b0 _9 s |
num db 0 ;byte select: t! i- G# d. f5 j% L
SmbStatus db ?
4 f( O% Q, ]8 Z$ `
- J, `4 t* n: D& K, t. o .code5 L: e$ l' I4 ^# d+ o4 P2 t7 u
& E( V. q3 z5 ~LF_CR MACRO: P$ e) ?, A/ {' X0 H5 j- |
pusha
9 D6 {' t! `6 m/ g$ \ mov dl,0dh
: D5 m) O& k. X5 ~2 { mov ah,2
8 l X8 {8 w$ M4 y int 21h
! I: [' R* u4 p0 n; ~ mov dl,0ah ;next line . T% X" k0 s7 h% [# O& r7 }
mov ah,29 y; E% _ h( `) M: R0 `' ?
int 21h# Z7 u" J" A% c0 _
popa
& U/ c2 L/ _! ?* @9 H9 e ENDM
9 K- Q% q3 O% i- N2 d# @7 [6 k7 I( f7 B$ W. J Y' R
# ~& m9 d% Z6 k
main proc far
5 x: {4 a8 A, B5 K" l mov ax,@data( [: Y8 ^* l4 U3 @
mov ds,ax
2 z( S7 `* u# N5 L, O# ~- J4 S & H! Q# d) i7 F4 o. S6 U
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h% H6 F) a8 I8 c) D7 W6 O
mov dx,CFG_ADDR# m' l: d4 s( ?( {" n
out dx,eax9 U# J0 L* m' N0 n* ]
mov dx,CFG_DATA
# V7 V* e, ^" n" `' h in eax,dx
6 t4 p( r) F* k 7 B7 x" U- p6 S; f
shr ax,5 ;bit 15-5,the base address7 d: d Y; U# H, y1 W
and ax,0000011111111111b
! \2 s" J4 a0 _' L9 ^ mov base,ax7 q; L) y$ @# k( e
. u6 q# L# |" _- y: p6 f call ReadSpd
8 _8 p# U! e; ?: aexit:
5 M! S: O( Z& y; C$ E$ m2 @ mov ax,4c00h3 O- I' X4 F. ^6 i4 K0 y6 Z
int 21h* T% B; b3 u3 a0 e9 ^" l
main endp7 o1 i+ W$ r) v/ ?2 W* j# A, y
* B u, Y4 \$ W) \: q$ b5 X/ |# s
, `& G9 I. n" {$ t8 J+ h/ a
& l# `- Z W/ S6 lReadSpd proc
7 Q! i* g. m5 O6 y, s pusha
: X$ Z2 ~, k; ^1 r# G% x4 d0 w8 [Again:
( L& A% k$ { @! ^' ?$ f% q! e+ J mov ah,num6 E+ r' M: k; B+ N" t
and ah,00001111b
+ u- n8 Z$ ?% t* U! {: k R .if(ah==15d) ;CR_LF! a4 w7 B; \6 k! a! L
LF_CR7 q! A2 `; @. K/ r5 X) r& g) S
.endif9 t& w3 T9 H' @" o
+ w; q! [9 ?- U" D* j! S
.repeat- Y# Y* d1 _- D6 [. k+ F6 L
mov dx,base ;reset host,claim host in use% j: }2 X0 _3 S9 `3 B
add dx,01 k8 z- K* ~- s/ }3 H
mov al,40h
- L5 B" n" K- ]: B8 O8 I% l8 t/ v, R out dx,al. n5 G6 v" c5 ?1 Q: C
3 x- [" [ _) e mov dx,base 7 \5 U2 V8 n& \* i7 e. }# w5 Y
in al,dx
& |$ Y. R* @, Y: K mov SmbStatus,al0 I) G0 W+ A8 E
3 E2 q, D2 n0 B6 z
mov dx,base ;clear all status bits" L, r' m2 z6 A8 l |5 s
mov al,1Eh ;host status register1 a* Q) ~6 ~' `# c& [2 W! y
out dx,al3 m6 y7 {* k7 Q; k& A" \6 y! Q
% z0 A3 Z# Q9 z4 D- Y$ l
mov dx,base ;set offset to read ( F# q. c8 l6 t0 `
add dx,3 ;host command register
' { M7 f( w) g9 k. S3 } mov al,num1 y0 T( Y! y5 i% O O9 ^! l
out dx,al
0 H; N6 |/ R: E( F/ S! d$ z 3 i& n! K. D9 I: D& w% f' n
mov dx,base ;Transimit Slave Address register( {5 `. i% z- ]. ~- K
add dx,4
$ M# I4 k8 a/ K4 O/ X e mov al,0a1h
. q7 ?9 s5 [: U, T: V# V out dx,al
, t' F7 F" P0 t6 u2 g " o9 s9 G4 i- h
mov dx,base ;set "Read Word" protocol and start bit
9 p$ i9 h8 Q* m- Z+ Y( p add dx,2 ;Host Control register
6 B0 T0 C7 h: f7 l0 D) p* X. u mov al,48h
. e9 _! x# l' }3 ` out dx,al
* L K* e2 n" ^$ x 8 V- O6 N6 M; Q- ]
$ T5 y2 z/ `9 u5 C) `! ~3 p
1 K- y' o. A+ V1 S2 D% G: M6 J! g mov dx,base
# G& U" X1 h, z, M- P- b in al,dx
. @' b, G* ~9 K0 r mov SmbStatus,al
, ], f3 u& i: g9 [, m and al,1Eh
3 Q3 M1 A- n1 r3 N( m$ l .while (al==0) ;check repeatly until any of
9 `5 N. d' c$ [" g" { mov dx,base ;FAIL,BERR,DERR,INTR
8 E1 a8 t3 u7 q/ l# Z: \% w1 Y0 _ in al,dx3 C0 e- j/ Y0 m& c3 c& i5 \. v
mov SmbStatus,al1 X B+ b" {3 e* \. F
and al,1Eh 9 @+ o8 M6 h' }+ G o9 Y8 Z! ~
.ENDW
+ {, R) p: V+ V* M" A' Y! k# ~ 5 {3 y+ \8 p9 R: ~
mov al,SmbStatus
" i1 t6 s% N' z. q( l/ m+ `4 ]: R and al,1Ch0 [7 S( o$ M2 \ ^) _
.if (al!=0) ;check for errors . @3 P: v3 K4 B1 c9 y
mov al,SmbStatus
2 P- x3 `& c1 S( |) | and al,08h
& {" h8 t5 w& B5 W2 n' n .continue .if (al!=0)
: H$ X, e7 W9 C9 n9 j z jmp @F
/ F& W0 p3 b# x8 _0 z0 Y .else7 l3 i6 h7 K4 G/ C5 h# p
mov dx,base
4 u- o1 |( r7 q# q. r7 v7 p add dx,5h
5 S. ^0 |- z. Z0 i in al,dx
9 N+ d1 j3 b- l5 n* T* T call binhex * {0 o7 f9 i# }0 T
.break
% p6 k1 q' I4 i' t+ { .endif
* N K+ o' B1 ~
+ U2 h# B6 Y, J; ]; c .until (0) 3 ~1 S5 F7 Y8 Y" q! H. ~
% T' a: x/ Q- j# `3 c0 [2 c! d5 e
+ X3 F& K5 _, v) l, K ; t& J/ f% ~& x3 M1 b0 M
mov dl,20h ;output a space
. b5 K) R' n5 R) B' l; N+ S2 G0 l mov ah,2
" I1 Z2 b; S. s- |1 x% O) c9 ~2 i pusha
4 b6 D: p) Z! ^& R& o) z! _ int 21h, Q) M- t4 I, a( E0 d
popa
# m f. |+ U' M inc num" _' R. j- ~* O" p3 u; V
$ E! ?6 F, y! g' @# E
cmp num,80h ;get first spd 128 bytes
9 x+ T7 r9 F1 ^ jnz Again6 r- L6 r6 G' A6 `2 z! f8 _
: q" U6 \0 C. n( k: V@@:
2 o' u4 S: N6 q& I) \ popa
8 l Z+ e; B" p- b* ~ ret
1 h8 D0 c1 O5 C, Q9 [3 P/ SReadSpd endp7 P0 l; s% o( ^5 Z# \9 O7 D$ L
2 x1 z6 h- B8 ~% O
8 w: L) Q0 S- X" ~
7 F* {9 P- J& B+ G4 `& C/ obinhex proc
0 z* B) B# h2 D3 A1 f: P pusha
3 h8 ]5 o" Z1 m% j0 W5 y
) q; [% g/ [1 l, ^& S5 L: N3 z mov ch,2 ;2 hexadecimal digits to be printed
3 F3 _! M+ J9 o9 r& Cloop3:% u% @ V% y5 n, f# v
mov cl,4 ;bits to be shifted
, K* ~1 {" C) \4 T, d T: k4 [& s# j rol al,cl& N! e& ?- {$ w n1 Q( \
mov bl,al6 e" I; [# t& z( C# O7 L2 i4 r
and bl,0fh ;mask the 4-bit Msb* \2 z8 {1 K' G# I
add bl,30h
4 r% M' c' w/ r cmp bl,3ah
4 } @: _) p1 o% L4 H/ s; j n* { jl next1 ;number or alpha?( m1 ]3 x4 L0 R9 l6 P/ n
add bl,7
- b- W N# E3 Y' k& inext1:
' ~# {% Y2 t; B9 @3 \ K6 b& s mov ah,2 ;print one hexadecimal digit' |" R% M6 w4 N; [5 d8 B
mov dl,bl. o) [& u/ X( M# ]! D
pusha
0 o1 F' ~" {8 b0 P7 {) g( i9 f int 21h
" K; Z4 D) N4 Q7 S3 \ popa" I5 d) ?! Y" A2 f
dec ch
: G K( v1 n$ M% h( j9 ]4 X jnz loop33 A$ R4 R# X' @ k# K+ Y
popa+ E& T4 c- P6 w; a
ret
8 O1 I& J, P ]2 p {" Z# nbinhex endp# f. H4 a1 e8 R3 z0 Z
end main |
|