|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: ! q( U. m& S" |9 V! n
: b2 n$ S0 i3 y* ?1 [# t$ p
.model small
0 r3 G+ x# \4 t3 \ .3868 v: x2 C& @3 u# e" N
CFG_ADDR EQU 0CF8h, b& {, P1 O. I* A7 X
CFG_DATA EQU 0CFCh
( d% ~) R t- Z8 q/ v SMBUS_BUS EQU 0
/ R) a( |0 ?0 ~& C' Q SMBUS_DEVICE EQU 31
7 T5 }" f7 F# v2 B; ? SMBUS_FUNC EQU 3; x7 `/ ~ A6 h9 G! c% N
: u6 I' \1 j# m% g. E1 z* E, {7 R .stack 100h5 T, p7 ?' D' g9 H S: L9 p4 X' V
.data
3 i7 [/ f! L- t; J0 y# Q" [, J5 f! P# Mbase dw ? ;smbus I/O space/ O7 w2 x. e/ x) K/ z
num db 0 ;byte select* ?. l/ ~0 x, Y4 W. ~" L
SmbStatus db ?. g: p( ]' @& e1 z
1 R" E$ v. C8 y3 R" ~1 K1 s .code
: r7 U: [" V) a/ b
" _4 z( ^1 v6 g# {0 d4 jLF_CR MACRO
4 L5 U P1 C1 S8 @' E3 u0 j pusha0 L' l- E3 O6 P# C
mov dl,0dh
/ d+ f; G, _8 A' B9 U mov ah,2
; ]+ L) \+ ~8 r3 b4 S( \ int 21h: }% z6 M" D* P, ^3 h
mov dl,0ah ;next line
% Q& e+ Q- }: h( p mov ah,2
/ w y) w; {% C& J3 j int 21h
7 X! |8 |4 H1 B) G0 g- r popa 9 Z+ g8 t: d2 `' G: J1 {& M) y; y7 p
ENDM# ]. S+ q! e, Q1 a
" r" l( {7 c7 s& _+ u0 L+ a
6 u$ r) A! o# `& B9 S3 R0 j
main proc far
- u% k5 g9 W# {5 U mov ax,@data
, w' o1 z l! x( U' ^3 c& w( S mov ds,ax9 X' J6 H0 z) Q$ O2 G
) \2 |6 H. x3 B# b
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
# X" c. k% V0 P* t! ~ mov dx,CFG_ADDR
, g9 G6 q2 {& s+ J out dx,eax
% d# |' Q$ ^7 @# A/ Z mov dx,CFG_DATA0 N3 X( L; Z; _% X0 P* g" s- c
in eax,dx N t- a) U+ p! u# x
- H% J, {* B1 C. s: I2 t) f( H0 k2 w2 B shr ax,5 ;bit 15-5,the base address
* \4 _& l- f6 b- R: q and ax,0000011111111111b& ]& @9 X+ b. S) \3 |; }
mov base,ax
7 t* j, |- s. m# f ) \6 I |! f* j
call ReadSpd
- H! y8 g" {5 J$ C: X' `exit:2 ^! o- L% l0 _; `3 L
mov ax,4c00h
y* \* P/ r' X$ L6 J1 r int 21h8 F: e* ?2 c6 e" Y/ T X9 J
main endp) g& B; Q% O3 p* J( @5 |; Z! }7 T
/ H, x% n, ?$ r% \8 C
0 f& R# X: u6 E; q
3 h, W: a6 i1 T4 u2 F8 z" YReadSpd proc! m: Q5 h/ d" a! `, f, G2 c7 o
pusha# e3 q/ P/ m2 M% U
Again:6 X5 j9 e8 Y+ T. U7 ?5 e% g2 ?% V& ^6 c
mov ah,num
6 B* i+ S5 k2 Y and ah,00001111b
' v7 a. k; O* _% N/ B4 ~8 P( `) f .if(ah==15d) ;CR_LF
' z' x1 E3 O: c2 M LF_CR/ t6 X" K" N3 Q, {# g0 q6 v
.endif
, N2 s3 S' _+ H 8 M. J3 r3 e+ u4 O7 t* G
.repeat; R# q" o6 q$ N7 R9 E, Z9 I2 I
mov dx,base ;reset host,claim host in use
4 W4 s- M# m) b& ^# p+ x) h add dx,0
2 I4 L2 n# y1 w1 d" Y mov al,40h
/ V& G, X( u9 ?& b out dx,al& r& V2 `) ?$ k) F
" Y8 T% e/ ?( M- a" l mov dx,base
; H2 H6 `0 D1 h' d) K8 c in al,dx
* i; K, o$ e( t p9 a+ G0 ~6 \* B4 ] mov SmbStatus,al k8 k: l/ X/ P6 I) A
# x" q" C: M# e: `- O mov dx,base ;clear all status bits9 ^: q$ {/ N) n8 C1 J6 {
mov al,1Eh ;host status register4 m& A7 \7 e- N* ?% _% S& W
out dx,al
& o _1 k! @7 _' M! Z( B9 K% N
- q" O8 P0 A' ?& Q* ~5 \+ P# P3 a mov dx,base ;set offset to read
5 V6 l, c9 ~( Z; O/ Q' m3 ^+ _1 P add dx,3 ;host command register# n. t6 J& R# V) v" `5 c0 y
mov al,num
1 f' P% U& ?+ h, F4 K5 A! u out dx,al; T& L4 H8 H9 z4 i4 w( C7 I
$ R: X: {- `; m9 ]1 z7 U6 d0 ]
mov dx,base ;Transimit Slave Address register& N4 U4 a5 q' j% y9 U" [
add dx,46 U- h7 m5 d# @) ]& ^3 f$ Y) X
mov al,0a1h" C# ^1 w% u% C( v1 _7 ]
out dx,al
8 b& r: i- [ O4 M$ Y0 }' n6 ]) {
% p6 q0 B: k& N8 Z mov dx,base ;set "Read Word" protocol and start bit i1 i5 z; K! J
add dx,2 ;Host Control register4 H! Y: b. C; e
mov al,48h
; E5 L) T' r- j8 { out dx,al
! E y# X5 \! e% u" ~2 w5 Q
4 O+ X" K' o3 r' y% O2 H- @' r
$ s% a v! W1 D+ a- R! d4 n( v % ^! H6 G% p: a* Y
mov dx,base
0 Y5 c* f' E; I( q ?0 E" g- X/ Z in al,dx
; L" b4 L5 B0 G5 V2 ~' w mov SmbStatus,al9 {* F0 ~) s* b" G' ~
and al,1Eh
& A/ }3 A+ v4 C7 F' \ .while (al==0) ;check repeatly until any of2 }; S1 L/ a/ A. N! c. U& r
mov dx,base ;FAIL,BERR,DERR,INTR. ~2 A2 `. b, N8 h0 @2 H% y
in al,dx4 Y1 Z( E: g2 q
mov SmbStatus,al
. ^; @# e: s( s z+ {+ ~; Y. G and al,1Eh 7 F; B; f: q& W( p) y
.ENDW: ?% U% d" E( R: ~7 D) a! ~
) z+ C! T' e# L' Y! V" r
mov al,SmbStatus
+ p8 H/ k7 f- X! S4 r and al,1Ch
/ R8 T4 ]! ?1 M4 ^0 z( w+ f .if (al!=0) ;check for errors
/ P) ?/ r) L9 i9 G6 m/ z `0 s+ a, S mov al,SmbStatus
9 M+ G) [9 W% R/ }2 r1 h( g! Q and al,08h - H. I$ W5 u4 J* V0 t0 F i
.continue .if (al!=0) 9 G ]$ P, F9 P7 ?! c& I
jmp @F - C% S+ X) y. V
.else
$ [: |5 Z/ j- K mov dx,base0 x) j3 y: X) s$ y5 J. U) [
add dx,5h/ c6 O* S( X. x0 b0 D
in al,dx
9 T1 [1 N! {5 U3 K: R, ~/ W call binhex
N: v: J9 u6 E .break5 A! r# C) t/ ]) m {
.endif9 O8 x) h( o5 T6 y; U
6 Q E2 i% I( D+ Q: L. s .until (0) 4 n% S; P. h8 O5 \. A1 H
+ Q8 h% M% H6 N z8 p
* A5 Q; X. @: t* t9 j7 ~; t
% |5 d3 k6 z- Q
mov dl,20h ;output a space
j5 [% f) R% D, m) x: x! Y mov ah,21 C6 e+ c' b" ^
pusha; t+ h6 ]' N1 J6 a) x! {2 H
int 21h0 }2 i' V1 U4 [1 C2 Z( E
popa2 b" r4 Q2 u7 J; } P$ I O1 A: B
inc num- K/ |% i& Z& j+ i! i: p \
) q8 {& C# m$ S cmp num,80h ;get first spd 128 bytes
3 m1 T7 ^6 H5 l& a jnz Again, e: ?" z0 y5 t2 w$ r3 h/ O: {
% J) R0 c$ l: D/ b. P$ T@@:
/ v9 d. q- o) | P: a3 j popa
S l3 [- {$ {: @ ret
' \% r* r: E" a! H4 @5 CReadSpd endp
3 p2 Q y3 r; l, z
6 t$ I4 W3 ?: T; P" Q% h ]/ q+ E! k: X
& p6 t, p" `! [6 [binhex proc 3 [/ b6 E6 Q+ V: e6 q( h3 U: ]
pusha * I' p: L1 B9 y, e# b8 f- H- `
3 ]) B6 `& e4 q: {; a+ j( d
mov ch,2 ;2 hexadecimal digits to be printed: c& h' Q+ s5 e- A, Z" Z: G( {
loop3:3 c; R! T: n: D% k& k3 m, w" ?
mov cl,4 ;bits to be shifted
5 w5 B) d3 i! Y$ c( U rol al,cl0 w8 K" {: T6 m8 |
mov bl,al
- ? R3 W3 q. v& D and bl,0fh ;mask the 4-bit Msb7 `! j1 w7 A& H. o
add bl,30h# x* k8 q3 m) o N4 l# r- x
cmp bl,3ah
- {+ _7 R! T9 x jl next1 ;number or alpha?4 g4 Q) j7 x* t0 L8 p
add bl,7 b% P7 y" w* @! A( q, Z6 L) u$ F
next1:
1 ^) G, }6 b5 m) ]6 r/ N mov ah,2 ;print one hexadecimal digit
0 @' F* [, N* q) Z mov dl,bl1 \. I1 T- H) n F% q8 ]
pusha
4 d! k9 E) h* z \ [ |8 Y+ R int 21h. `: i5 b; D& S3 t6 I) F
popa1 s' P. a' w3 Y& k1 D8 a( O
dec ch/ n& B h; J) F* I4 G& c0 t) } I
jnz loop3
# b' \+ W) T' V: ~ popa
: Z& `* A/ t% o, P9 ` ret
6 O8 `/ g" g. }- a- W0 F6 R$ gbinhex endp
1 f; h% U4 ^$ ~+ n end main |
|