|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: , O6 O4 d) N5 u5 d# @3 M9 l
. P7 V& I1 A! l" T' W .model small2 s8 s1 l6 v1 w/ J) l0 u O7 o$ \
.386/ V! {( E+ t% _0 Q/ f
CFG_ADDR EQU 0CF8h
`5 P3 X/ S* h& J5 C/ x6 G" O CFG_DATA EQU 0CFCh7 c9 o/ a4 S3 U+ S5 x# ?
SMBUS_BUS EQU 0; p1 f3 R" j4 }) C
SMBUS_DEVICE EQU 31
! }: [( J& P( b, V) E% G& g SMBUS_FUNC EQU 33 e5 s; W, [- ?2 K5 Z! l
. d8 ^8 |1 ~: x( L2 W0 _- p2 X .stack 100h, Q' z" G# @2 @) N- i: g' T. R
.data z% L" ~) J/ h* u5 R" G; U
base dw ? ;smbus I/O space: q# w7 D" E$ [ U
num db 0 ;byte select* u5 j4 r7 e' s- e4 U3 R
SmbStatus db ?; m& C6 y% [. v' N% `$ \3 n, n& S" q
: R/ o" |7 r+ L% a3 n9 Y. z$ B Q .code' N# U: n' Q- \
1 ]) K- g9 o! y6 ALF_CR MACRO: v8 c- f# B2 S
pusha7 k! e) I& J& p5 \- n
mov dl,0dh
& u9 m" v! G R c1 c mov ah,2* q0 Z# A: \5 u' \4 }7 B3 w
int 21h6 A% R9 J( m2 ?6 a, T. K) T
mov dl,0ah ;next line
8 `1 ^8 t# }* H mov ah,2: l6 b+ k- y1 x8 F1 K9 I- x% l
int 21h0 C- m6 G) {* l: S7 {
popa
/ ?" ~/ \* j; m# ^+ x. i4 ]# ` ENDM
1 Q) ?. l8 Z) p( U6 B5 r$ e4 N# Y# A
" L$ P3 ?8 u! L/ p$ P" W, fmain proc far, c8 j% @# p% T7 t3 G3 x- {
mov ax,@data0 t) Q | b/ B: j V9 T$ D
mov ds,ax$ g* F* R7 ~" W; e
; M: b9 s* o. W/ H
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
, ^$ h. n6 ]6 J$ G/ c9 } mov dx,CFG_ADDR: M6 B6 O! P! D6 |
out dx,eax
) m8 q" s- @/ X5 H mov dx,CFG_DATA
) |* o1 B5 A2 M8 U+ a$ C, r in eax,dx
) B, N$ n4 |. @- X s- O5 X {7 [: G
) {; a' F( [" d3 m- g$ Z shr ax,5 ;bit 15-5,the base address" m8 G0 ~$ a6 l' f) b% e
and ax,0000011111111111b( O7 q& D, K3 }8 P6 W1 l& g
mov base,ax/ _! o& ?& M; \
# y$ x3 z: r! p! |
call ReadSpd
' U+ Y0 H* T0 V3 J! Q7 Dexit:
6 k5 O; J- U5 H9 y) w5 z mov ax,4c00h
: Y$ v9 O9 z& D) {: p; t: x int 21h( K5 N! e# C# V
main endp
( J3 H$ y) E0 k0 x. q0 J, U9 o2 z' a* V4 V5 T; i/ N( M# T
& q! m1 ?* Q8 t% r# K. \) `' H9 T" f1 q- i
ReadSpd proc# V5 q: ~+ E& |" |3 V+ N
pusha! T* z! e% I7 \+ t
Again:
6 m" b% l$ a m" M- p8 I3 d mov ah,num+ Q$ C$ x O4 B
and ah,00001111b! ~7 F( {& k. g1 c6 X& {9 }0 x
.if(ah==15d) ;CR_LF
/ P3 z$ t; z9 M LF_CR
: @( j3 {, ?+ t# C .endif
; ^# s! w% L" i4 I2 B& c& D0 X , S7 D. L8 ?6 {) U# _
.repeat2 _1 c) J& r, P; o+ p" Z
mov dx,base ;reset host,claim host in use& n4 \0 @, C9 G/ i# j" V4 h5 y* ^, b
add dx,0' d/ b7 V- L3 G$ q- s( M: e M! l; {
mov al,40h/ r/ W8 R/ g9 M) N
out dx,al. z+ Y s, b9 E% }. T) h
4 k3 e$ L& Y0 r# w4 o+ U# i
mov dx,base
8 m4 l: w4 u) g in al,dx
5 Y0 u3 h1 {% t Y+ k3 U mov SmbStatus,al# e" |6 X" ?" i( p6 O7 P% F
4 X) w! z6 A) [8 P: c. x( f/ j1 ?: ?5 J mov dx,base ;clear all status bits
) ]! Y& l* p' S mov al,1Eh ;host status register
/ m$ b W+ l$ t, D8 N2 d out dx,al8 @& m6 P+ e9 y3 ~3 V- e
; z# E8 h; l N( u2 E2 [, x
mov dx,base ;set offset to read 0 t2 h# r; C2 e+ |4 ^0 |8 z
add dx,3 ;host command register
6 ?2 `/ I; ~6 T. h6 E mov al,num
! x. K! D1 ]/ j* E out dx,al: [$ U) T) g1 C+ d% b
- H$ s4 V0 v% Y7 q# l mov dx,base ;Transimit Slave Address register
" t- F& ~/ p4 H* N* ] { add dx,4
: `& y) b9 T; ~- e8 U* k: H" _6 B mov al,0a1h4 I* k& X0 }( i* l0 {1 z
out dx,al3 Y5 `- n2 x+ v' V$ s# J
% M$ Q# K/ c. }8 A$ l3 S( l O mov dx,base ;set "Read Word" protocol and start bit8 E* L! h. M2 x5 E& ?3 v, o
add dx,2 ;Host Control register
: W4 I0 ?. K! I- V/ d; I# T' ^9 V* F! @- { mov al,48h
1 F, y3 G8 v1 E/ K3 |$ C out dx,al' \" Q5 ~# |$ T8 f a
2 u. }1 p- s, v1 C! `
+ X( N4 W! K7 |3 B; O: l) d7 S ; q; O2 z# L( @ H* p
mov dx,base- S$ ?( R1 Q- o4 ?- h$ b
in al,dx
3 a1 v& o7 `# s/ L mov SmbStatus,al9 M; g0 V! T9 u6 j2 M4 [: [
and al,1Eh
7 Y1 g$ V0 f% N( f9 N .while (al==0) ;check repeatly until any of3 L! l1 H7 L' U& b
mov dx,base ;FAIL,BERR,DERR,INTR
# R5 [7 P, K8 s in al,dx
# j5 U; s# A4 ^' n( \! O mov SmbStatus,al
) y7 [+ l" k, m' y. m- q- I. n and al,1Eh
?6 G7 n' W3 h: F d. Y .ENDW# t" C9 c9 P8 `. Z: M2 M: T8 ~2 c
, T, m) X$ l, ^; m
mov al,SmbStatus 1 `3 z0 E4 m1 Z1 _; d: u9 ~
and al,1Ch) m/ I5 A3 ^4 _
.if (al!=0) ;check for errors " |$ s! z% e- P- r$ ?' w
mov al,SmbStatus
, V! {/ i; p% U, n and al,08h
4 a, k! W5 j8 `# I" D: c .continue .if (al!=0) 2 Y" O2 ^2 d' P: Y$ c3 x2 }. U
jmp @F + o, R# _( C" f; d4 w( C
.else
" r: g9 K# x& F. Y, {+ s mov dx,base8 f" Q& }5 |- c% R; M6 ?. E
add dx,5h
! @4 W- Z5 B6 e in al,dx : g0 Y' {9 d9 L2 F! z
call binhex 1 x# I7 l# M0 s
.break
, Z' o) Q" g. M' l6 s/ E/ @ .endif
- w& D! B8 l8 M O
/ z7 T& L" {. X9 L: N/ H" V .until (0)
+ x# W6 r2 F9 ^0 c, u( n' m& }8 p $ s R/ s/ `* `
% T& o; T* l& m( P
; P5 G4 d8 o: r4 S! ? mov dl,20h ;output a space
\( l& A! n0 F" u& n mov ah,27 e! L+ a% r* |8 A. }# Q2 m
pusha0 u; C- B \- I7 m- ~: v
int 21h
8 p& [5 Z8 w5 R1 Y popa
% w. V& \( f* |* h) I& G inc num2 @3 p9 W( i E8 Y& L6 w; t
% t4 F& a1 P0 x! R5 L' {4 M3 O2 H cmp num,80h ;get first spd 128 bytes
/ M8 ]; Y, c* ]% {" v$ o jnz Again
) q9 H, c! G& m2 k8 i
" C& l& @7 p& v6 _@@:
8 h* m- D5 o- v' l8 T/ ]5 S: N popa
$ |, L! ?$ ~2 ~3 x+ o4 m ret
0 v" k7 a: Z1 O5 [ReadSpd endp
1 ?0 l0 U, {; B4 h ~6 o
+ e1 o" ^- U+ w: U# b, s
( W7 j5 r* S3 q6 h& ^& U) I' h
0 y( {6 Z. t4 z; Y2 @0 l% o4 Abinhex proc
( U$ p) B3 h. b; I pusha
) ^% u% n4 ~3 f# V5 U
7 l8 ]8 j8 X2 {" ~ mov ch,2 ;2 hexadecimal digits to be printed0 a; [& u5 r4 n8 C5 N: [# @
loop3:
1 k, T4 H( w" z4 u4 v9 E mov cl,4 ;bits to be shifted/ Z+ r" `0 W; q* W3 z
rol al,cl
2 ?3 z4 N% d7 ?' F/ p! x mov bl,al2 K k% ~, C2 W: m* Y. K
and bl,0fh ;mask the 4-bit Msb6 l4 P- q* V3 W0 @
add bl,30h
7 {9 \! I: ^; o# y! @8 z/ m0 G cmp bl,3ah
0 C1 Z, x. X+ D jl next1 ;number or alpha?) H, h; d, [4 M: _3 W
add bl,7 - u, f. g1 v; }. s- t
next1:
5 X# H9 r' E* w; A7 m3 f" z mov ah,2 ;print one hexadecimal digit! q! `( ?& ]2 z) e4 R: Y
mov dl,bl
9 u+ B* R7 ?3 n8 ^! B8 r' Z* t6 s+ s pusha
/ U# Q& y/ c& S) S) H6 a' x' x int 21h! H" |0 M6 ^- |' h. m- S. ^
popa+ Y4 [& m# Q' d# x& f/ R* d
dec ch1 ^( c& v4 m3 k: V! A$ M
jnz loop3* f1 F+ v6 d# S8 O% X. }8 V
popa- \! N& r- X" t& _; E
ret. e1 N s: e8 o5 n$ C9 U
binhex endp+ s& S& s2 ?- e' F& o
end main |
|