|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: - |5 X2 j+ V! b) z& Y6 Z* v
7 l# D# e0 K7 C
.model small4 Z5 }+ H) I& {/ l) s& R2 X* p. B
.386) g$ j4 w+ y- b% e% D# C2 ~
CFG_ADDR EQU 0CF8h6 W7 {; ?! P* l2 T7 C
CFG_DATA EQU 0CFCh
- P% T! X: ]" a+ Y2 q9 ] SMBUS_BUS EQU 0
- d, E ]8 L' m0 d SMBUS_DEVICE EQU 31
) ~9 i7 W, n2 O3 u } SMBUS_FUNC EQU 3
: ?& H4 R7 m8 p1 f
' B6 ]: ^( q! h- H) Y1 ? .stack 100h, `" n. E) G% T4 E1 m
.data
% R0 W3 A: o$ `9 `! {base dw ? ;smbus I/O space
% }0 E: N+ Y' T6 S5 \* k% Q. I' gnum db 0 ;byte select5 z. [8 g4 j2 Y# ]& d% M* O V
SmbStatus db ?
0 ~! ]5 J! |$ w6 G5 m7 J3 w% P: z0 |6 n; a, F$ n: t
.code6 Q# [6 O. ^8 b9 s' @3 Y, L2 c6 F
2 P9 ~( G6 A* z& P5 Z
LF_CR MACRO
! [2 \! E0 `. ^ pusha
. I% x9 x* o( i4 |" N. e9 [ mov dl,0dh
( |5 D1 |0 |# T8 o8 ? mov ah,2/ U2 g( y: \5 T( E+ O% d
int 21h& h3 g% H4 L% J6 C, C
mov dl,0ah ;next line + ^! I* p' H. U! d6 i3 H/ X
mov ah,2
& ?% A; t8 }% { int 21h
- T X3 R. D X' Z* X popa # ^2 Z$ b4 v. g1 U# f# X0 m
ENDM' y' I% m" t1 d0 h5 ~2 s5 I* x
0 {4 @& {! l3 ?2 f+ ^
: \ g& W) U7 ]# V' L* s( ~
main proc far) I9 D* [9 r/ J; N: F2 }: G
mov ax,@data
0 x6 u9 p7 c$ i mov ds,ax
/ Y4 H9 U- ? u' F) w
2 G* W+ C* f. e# K mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
# f0 F: ~4 ~1 S$ e3 t# M( E mov dx,CFG_ADDR
2 v$ L8 P: r- y2 \4 e. D out dx,eax
1 j: A2 P/ w) v7 @& h% G [! y mov dx,CFG_DATA
- m2 e; ?- }- ^" W+ `# J2 l in eax,dx$ c1 V6 {: s9 ~, E; D2 E* T
_9 E) @: {# P! f0 [& D j2 a3 [
shr ax,5 ;bit 15-5,the base address0 p# {: r2 [; d# }% c% s5 k8 y4 F
and ax,0000011111111111b
, f8 E$ H V% j0 \: h6 W mov base,ax- S0 z$ i# D( g7 v6 T
^' x+ o( y k7 p; v( M call ReadSpd/ Y1 |3 ~, v7 v6 ]5 o) _
exit:: @; d$ s% G( v5 O, r1 [" J
mov ax,4c00h
" L, j& f% H% z# b int 21h
4 G. Q9 k6 _# c2 d$ U# W8 @! m. ~main endp
* ?# W4 B: D' W1 K+ x0 V. ?
# y8 p- h" ?. N6 p* d3 ~! v" u7 t
/ `, m3 @! A, I! d/ q+ i' D5 X$ y% u4 d) c) F/ i2 b
ReadSpd proc2 u( G5 `& A6 H+ z$ @; ~
pusha$ f- o5 c5 B8 f
Again:
+ R- ?: _! m! o4 X7 ~* j# r* n mov ah,num
4 n* G3 Q( H h9 Q! d5 S' V. c& t and ah,00001111b; x2 ^" c: B* k, Z( G) ^3 \( t! q
.if(ah==15d) ;CR_LF
& {; ~0 s" p2 d+ m" }, q, R$ k" f9 i LF_CR" f6 D8 q$ i# p# }4 n5 S
.endif
u) I8 Z" ?% q4 z2 V6 U w
$ i. }" F3 I$ P5 a8 Z- X" F Y .repeat
5 s- k% U* a$ O5 u( y mov dx,base ;reset host,claim host in use8 s8 I( t) b' ^! h" g6 V6 ]0 o2 Q
add dx,02 m; b! i, c4 E$ k/ f9 m, O
mov al,40h
: r2 R, G- _! E4 x out dx,al
$ x! H& r# n* O( B# m% z ; I, m V4 o5 Y: o
mov dx,base
! s/ ` @' }" B5 j6 H- s in al,dx
/ k6 w! Q, i3 v: R5 T" m mov SmbStatus,al
( W2 Y4 k, q$ G2 `+ e
3 V& v" T5 b8 v6 K* N" A: O5 v; r1 z mov dx,base ;clear all status bits: K3 l% B0 z4 L8 W6 O
mov al,1Eh ;host status register) }+ M7 E! n) j' r! ]" t
out dx,al U7 L. c* c4 ^3 K
7 R) q4 i; V! j! }( N" T! ^ mov dx,base ;set offset to read : ` D- z$ _* x) Y% T
add dx,3 ;host command register
4 n; i* ~3 H( c4 |+ H* E# p; V mov al,num% v6 ?; D2 ^3 ^1 u
out dx,al
' B3 ?, W$ k9 `: B# j7 g" b: J
& H3 u+ z# l7 J1 i+ P mov dx,base ;Transimit Slave Address register( e9 d7 K8 f0 C+ L
add dx,43 N( B; |3 z% p
mov al,0a1h8 o+ s+ { A) w! d
out dx,al1 k# N' i, Q/ j' }& s
: `# I2 e0 M2 v" i+ U mov dx,base ;set "Read Word" protocol and start bit! E$ g: b/ j' s, ~& {3 ]1 o3 O
add dx,2 ;Host Control register( m& X- q8 R: ~# j6 Q% m
mov al,48h
( U+ [7 ~7 \ K. D0 m5 F out dx,al
8 B4 S2 F/ `& x6 w: h0 r& }. x 9 L" W( C4 H4 q* P
8 Y/ Z6 \: C; n 8 U0 ?8 ?2 ~6 W$ W% E* ~
mov dx,base# K$ Y9 C$ Y# B6 i6 a7 }% c4 y( W" ^
in al,dx
$ t a) U/ T5 |! p6 ?- z8 W0 d+ Q mov SmbStatus,al- I2 ~ F# w0 u. b. i0 s9 S. w7 U& p
and al,1Eh
. p( H* v0 y& ]& M .while (al==0) ;check repeatly until any of
' A9 b% l* K3 Y. K% K- w mov dx,base ;FAIL,BERR,DERR,INTR
! [# [# B; ^$ B0 D! G8 Y, k7 u7 H in al,dx
; z' O" Q* l- P! | mov SmbStatus,al% l7 c# H9 \$ K [. L9 c3 q% Z
and al,1Eh ! P- c2 A m" s/ l
.ENDW
6 n( D! ?4 M+ Z2 d
6 O* q7 j, R9 t5 V$ Q mov al,SmbStatus ' y! \6 l/ I1 n8 `: _0 N- x
and al,1Ch
; {& E! b6 ?8 C& ?5 ]3 d .if (al!=0) ;check for errors
: s; \ }3 C% ^; j! \ mov al,SmbStatus
, o. V- R) ^0 H: b and al,08h
9 H. }1 e& n0 q .continue .if (al!=0)
" w/ B$ C& t& Y! W" V. o jmp @F 2 ~3 P9 k, J, ?( B2 y) {7 Q
.else
7 B2 ~3 k; S @0 R- x5 ` mov dx,base
. R. Y- l' p+ L4 e* t$ I add dx,5h/ x5 i- l, k0 o, r3 Q3 B
in al,dx
( Y; ^2 w$ E5 ?5 O9 p call binhex 2 {4 g" }4 y4 e4 _: x% b
.break
8 ^" i) T2 y- L) A .endif
! P4 b* q" L- [) C, v
9 c9 O( G3 H- y3 V# u6 k) }* k .until (0)
; c# G- w& l" B . W, y$ H8 Y! D1 S& B* L/ s& Q& ^
& ^0 W. Q4 Q+ @! @4 O
6 g( B0 i' W" C mov dl,20h ;output a space
2 u8 j; Z& s, S; n+ o$ w5 X2 K mov ah,21 H/ _/ @0 q, u( Q. z7 s
pusha! K% R1 t# q F6 ]( r _8 y
int 21h- s- F: z$ s3 P7 W {5 Q9 M
popa* I+ V/ @+ z& f" H" u, P
inc num Y# {% u: D: J9 Z% H4 V
- H- A. h. r7 u' h0 D/ I' I3 s( | cmp num,80h ;get first spd 128 bytes
' Z0 p$ |9 y" \$ Z jnz Again
: f" s- w$ [6 q# W# ?
. E8 q8 Z; p" d- N6 @2 s, Z@@:+ r5 N# p0 G: o2 y
popa
+ e+ @( F% A: P5 d* P! ` ret
( R' h+ N* D. ?& p+ R6 o% ~, K% UReadSpd endp0 D0 R- h( z& F$ B; n
3 n/ h# f1 G0 T
, K4 |# z- H3 P( \
/ x3 w& Q; T9 N5 n5 ebinhex proc
8 x# ?- z. Z o0 s7 x pusha 0 }: k/ a" m6 L4 z, q4 E @6 x
" T9 i9 Y9 L' B* @
mov ch,2 ;2 hexadecimal digits to be printed
c N$ v7 `- l; C8 a8 d, I) D5 Gloop3:
% s, F# Z3 C/ J, r3 @* B h mov cl,4 ;bits to be shifted0 @6 {: H" g% P7 M4 E0 i% V
rol al,cl6 }+ p) b2 g& G0 z, W9 W$ ?8 X' f
mov bl,al
7 a. p, O R, o. t and bl,0fh ;mask the 4-bit Msb2 b- a4 W3 X: W3 C4 D3 C5 f z0 |
add bl,30h
1 \* _9 I$ o. g i8 b cmp bl,3ah
& g, b1 C j* |( ^ jl next1 ;number or alpha?
7 I% r% b( P; a$ \ add bl,7
9 A+ e9 w+ n+ O) bnext1:
7 L* w. q. c; u mov ah,2 ;print one hexadecimal digit4 q8 s0 P& L6 l O- D0 n7 ]! M
mov dl,bl, ~! E5 Q j5 s' O
pusha
. o6 @ \# E( ]$ B* k int 21h" y& Z8 {, H3 h/ T4 o1 v
popa, z( @7 Y1 d" g# k* K; m
dec ch
3 i" A- H# H3 d jnz loop3
5 |1 j& L- e: a0 A# g popa' n' @$ e9 O+ g; n7 t
ret
9 o8 J% F1 ~5 q/ P, j+ k% Abinhex endp8 K: L& J" h( \% I* ]: k, [
end main |
|