|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
* P8 B) k3 I+ b
0 _$ z' f9 E% K' G; v7 U& t# M .model small
4 m+ g+ v# a8 O. C# A .386
; q( f1 _0 x$ A) z/ W4 e CFG_ADDR EQU 0CF8h
) t. {9 f+ l' h+ K& y6 w; p CFG_DATA EQU 0CFCh
- I5 }/ E& M7 Q4 G8 [; J SMBUS_BUS EQU 0( O G" ~% H. W* {. `* D) H
SMBUS_DEVICE EQU 31
. n' V9 x% n2 ?6 q6 \6 X6 ? SMBUS_FUNC EQU 3
6 R$ e; r R; F T# M 6 [, E( L# ^& b, ^
.stack 100h
! u# u1 v. Y/ o$ H+ o* Y .data
: V/ u) U0 g, _2 s4 k7 ibase dw ? ;smbus I/O space, m9 L, o7 x! b, B( e; L/ o
num db 0 ;byte select& w k7 p/ ]5 @
SmbStatus db ?' W0 h7 y+ s* ~/ ^: l# @# F! p4 o2 g/ }
0 Y( ]/ l$ r/ L6 Z# F. ^9 T7 S
.code6 g! F% U% B1 g
& ~$ `+ _- t" w2 U' F0 [LF_CR MACRO1 m* b8 D3 |, u3 M; {
pusha
0 i9 Z/ _& i& k/ Y: D mov dl,0dh 9 r8 U$ T* F' K( E
mov ah,2( j4 L* Y; E ]' Z& |# J$ H
int 21h: e1 T" W! t- w% n
mov dl,0ah ;next line
- O1 O" t( w5 L. b8 W" _8 P+ ~ mov ah,2; {/ w- s W0 H2 m
int 21h2 n5 X, x. s( t# t
popa
* N" ?8 ^9 e3 x* I ENDM
% s2 @, B, }0 q3 p u( f* H+ m. E5 [% D/ _! z1 u% v# b
# _; x |" D6 g
main proc far
0 G) S8 Y) H( S6 o1 t5 D% D: r o mov ax,@data. K4 X* ~1 `4 D" P
mov ds,ax9 O* q* q2 U1 D* x! ^
( C% h1 A* i9 U3 ~ k% D mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ U0 f" m, _4 W' k' m- e
mov dx,CFG_ADDR
* \9 F! f+ S! Q out dx,eax, U* i7 Z" |! e9 ]" i
mov dx,CFG_DATA5 e; q; d( r# p! t7 P. z; y3 ]
in eax,dx
6 Q9 x; |" v( f8 g. ^0 X5 c- l ) g9 T7 Q, y7 ^/ @
shr ax,5 ;bit 15-5,the base address
! i- D3 S$ C8 j5 y& _8 b2 v# [ and ax,0000011111111111b7 k9 K9 |$ l, \. }+ U4 `
mov base,ax, o( j& L6 p3 J# N9 v, G: Z' c
; f4 @+ o3 t% }- P: {, X& K call ReadSpd$ \$ B' b/ R5 m6 i0 |
exit:: R# Q* R% ^) j X( q0 l n- k
mov ax,4c00h
0 K4 I5 u; {, | int 21h, n J) M5 R8 i
main endp
$ @9 U, y; I. E6 d3 W) R. w
/ b& q7 S0 n& v( [5 K1 Q* Z3 w
: A. P* Z9 z! {, ^7 L, H/ p& Y
; S2 F* ~+ Y/ I5 JReadSpd proc2 s# i* F+ U* w
pusha. m- d8 k" O# X& V7 X4 k7 v4 E
Again:6 M( b5 D% n4 V# n5 A7 I8 R
mov ah,num
7 J+ Z4 g9 r: f% I$ _7 s) u8 M! C and ah,00001111b5 l6 T+ T# i$ f
.if(ah==15d) ;CR_LF
^; g- q% J. [4 ~7 B q/ m2 g LF_CR) K7 i% q1 T: H8 B$ x
.endif
% l1 F N k3 _( d& C1 y $ B9 Q# y g J5 I3 S/ C: X: y
.repeat
. A" X. K8 a) A7 ?6 L7 k. X( m; C0 ~ mov dx,base ;reset host,claim host in use
1 S7 H9 i/ O6 ?' H9 Y% Q( A, x# O& X add dx,0, D: s5 P, }- Y- K" @$ U! F
mov al,40h
0 q/ i6 m3 e' I/ n A6 d8 l# B out dx,al
& k: p5 R/ X( k5 n7 A7 v- x- ~! \ $ E1 U4 C8 l8 U
mov dx,base 8 W+ l( i" z2 F; A! j: o a8 u
in al,dx. _: ^# f; m7 m2 X
mov SmbStatus,al6 F" Y) Q( [* H2 C9 |: z7 N
1 R8 O2 z0 |; ~
mov dx,base ;clear all status bits
" C6 Q+ [5 e# ^) S7 E mov al,1Eh ;host status register% J9 @' b, W# J! q. Z# A
out dx,al
' r) g$ A8 ^ Z 4 y6 q- \- x' p( Y, p. f! o
mov dx,base ;set offset to read ( X P5 L; t* l2 F% z% \( Y1 ^( x6 _
add dx,3 ;host command register
. A, {( j6 m; j+ ` mov al,num
0 v+ E Y0 w" W0 {! a) h out dx,al/ F: Q1 n$ j$ f% ~ A
6 o5 E/ N) T( H9 t6 ] mov dx,base ;Transimit Slave Address register
6 A0 M0 `( p; C- x! | add dx,4
# b" u) w, u% M. |, y" { mov al,0a1h
4 j9 C( p$ _' g- q$ E% ` out dx,al) k$ S9 ^9 ]. i" E2 }
# H$ C0 V- c/ T. m# C mov dx,base ;set "Read Word" protocol and start bit
0 L8 ?1 M, h4 E+ [& L; ?- | add dx,2 ;Host Control register
' h2 j" l% p% B8 N mov al,48h + t/ B. p$ E) M5 \
out dx,al
: H# |, _& I* K; {* X- ^
7 {1 Z# L$ J1 g5 w6 h7 Z3 `9 b' x2 x( g, h) ]) R
. n' E4 `9 k; H b) f+ Q mov dx,base/ V2 C7 s* n* V7 Q+ a1 o1 }/ j
in al,dx
! Z( t/ H0 r! o7 U# _8 | mov SmbStatus,al) d8 U1 g3 C- Y! U
and al,1Eh
: w1 O) J) k. e. M .while (al==0) ;check repeatly until any of
6 |4 `9 J' f: b( `# j: Q8 E% o; g mov dx,base ;FAIL,BERR,DERR,INTR, c9 y, s& `4 u6 y6 m6 z
in al,dx
% d& Q- \/ o1 i% x; s1 K( G mov SmbStatus,al
- C; l1 Y& v* `% k$ x& e2 { and al,1Eh
+ g, l9 ?5 x' A! m; Y" d& D .ENDW1 m- a2 l/ j$ e0 `: K2 [9 }
! B1 G" X+ q" L. K- C, W: h' p8 ? mov al,SmbStatus
/ q1 {% i" @; h6 u and al,1Ch. |" f3 D" Z; H4 X
.if (al!=0) ;check for errors
4 Q" e t) [+ ` mov al,SmbStatus
2 h/ G& n; A2 D and al,08h 3 n/ ]& [3 Q5 |! I- m. K
.continue .if (al!=0) ) `( r/ Z) p( V3 P6 }, |& C
jmp @F & A" D+ L v( j/ U
.else2 h! q8 ^4 Q+ R
mov dx,base8 z$ a+ v6 f% S4 D# K2 _
add dx,5h+ f4 J" ?$ \# U' L5 k
in al,dx ) X, |( U* y6 R3 l! B2 ]" L% s
call binhex $ \3 r! `# o' f; j1 Z
.break
& {; t/ y5 o; Y |& N/ ^ .endif! |5 n+ }9 w5 A" S
, k8 T- t8 f: z
.until (0)
# f0 V1 k p9 x* @
+ g$ O8 w; S2 k+ L+ f
- \# y" O. O" q) \) e' Q: e! N& o
3 y! E5 Y, v3 r% I2 B mov dl,20h ;output a space+ v# I7 }% D2 m& _
mov ah,2
$ s* l) B B3 o, U& n. H( V pusha; }& G4 m0 p& J# k6 O
int 21h
) Q6 i+ o' j8 k# B+ F8 y popa; p3 g! S! b8 k8 d4 l3 z0 B
inc num
1 {7 D3 W; z9 N. G# j+ Y; N5 }& y) s" M" k3 S
cmp num,80h ;get first spd 128 bytes 3 G. B$ y; L5 r5 Z# [% K8 R9 h- T' A
jnz Again
$ j. f& n4 j* P' e2 i! @5 R# A e : X/ C( b z" _9 b' q* z
@@:
& o8 _8 T/ C4 h$ H/ O( o# m popa
* k, o9 M$ t/ ]1 D- r) w ret
- Y3 l% X1 ~; o: M! M! mReadSpd endp/ ~9 }! [+ a8 e" O% j* N4 h) d
5 T |. w( O* B8 Z( C" H5 H; {3 s1 \+ h! b
% ]' w/ d# |( b1 m$ I5 ~/ d; Sbinhex proc 1 l; J) I6 L ~' H ^! n
pusha ' Z/ @- j7 y4 B& P, B
4 @+ Q. K' c, U7 a" b6 b. K, R
mov ch,2 ;2 hexadecimal digits to be printed" u8 x7 m: G7 P4 d/ b9 ~
loop3:! Z4 ^2 g. ?6 Y" ]4 |
mov cl,4 ;bits to be shifted: ?% u/ ?; S$ H" x" f% L" T6 ^ F
rol al,cl
& F* B7 ?* [/ T1 L @( f8 J3 h mov bl,al3 U& P( X7 w% M5 M; \# E- h! x
and bl,0fh ;mask the 4-bit Msb+ z+ ]. f4 S3 v1 T& ]
add bl,30h
, `% b. S* U( o9 n cmp bl,3ah
0 M5 J9 D& P! A7 ?3 z' y5 o# D jl next1 ;number or alpha? k4 q0 p f; w, p+ I- n& @
add bl,7 9 s! q4 ]9 N$ i6 _3 N
next1: 1 g: \# Z" f, E' h8 w2 K) ~. t
mov ah,2 ;print one hexadecimal digit
5 Y6 y3 J, N1 ^5 H# [8 T mov dl,bl. K6 ?/ N) l1 Q# X8 e
pusha
}/ z! Y; `9 L* C0 q4 f int 21h9 `& V5 k% c/ x0 t# j! \
popa* S! V2 N" ~3 @. j2 @" T
dec ch5 B9 x+ S7 T O8 c ^
jnz loop3; l% r& C8 R8 E$ @+ C- S
popa
9 S1 g9 L' V4 [: k+ k7 Z ret% ^* R1 Q% o, \ z
binhex endp
- l2 K$ w, h% s3 F end main |
|