|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: : n* w$ a U& d4 Y; W7 j/ b K
/ M* X# H% z1 L: t& ?. i2 r .model small
. |+ o4 C7 N$ R) [1 c .386: h1 U+ T2 o/ B* S1 Y5 P' R
CFG_ADDR EQU 0CF8h* X, ~" A4 t7 X8 k
CFG_DATA EQU 0CFCh% q: `+ @6 e$ A; V. ?6 Y5 ` L
SMBUS_BUS EQU 0
$ c$ U9 a1 P3 ] SMBUS_DEVICE EQU 31
6 T) `+ v9 _9 E5 S; `& W' Y7 F SMBUS_FUNC EQU 3
0 R% m$ W" p# c! C ; r D4 u6 Q! v J7 N" g
.stack 100h: m- y% i0 N7 `. S, w
.data' A |6 I: U7 Q
base dw ? ;smbus I/O space
( ~( J1 o2 _0 w: `5 H/ O; t% F6 Anum db 0 ;byte select- m* k" _5 p( Y
SmbStatus db ?
- ^ F% Q" e! ?, [8 P; e" Z0 e* ~: C6 O
.code
! G, K0 O$ l6 S. N0 m: z2 e2 s ; s5 V4 J0 }& r% i6 o
LF_CR MACRO1 j/ {2 L9 N) k: L
pusha
h; ?* u$ J9 c7 T; O$ [- r; m mov dl,0dh * j7 t4 p$ |5 y' V$ ?1 [* ` Q+ V9 B
mov ah,2
* Y' t& S( d- A$ p9 L0 r' n3 C { int 21h
. x- P, `% X. N0 I3 |+ T mov dl,0ah ;next line 9 x2 I3 d1 H$ F7 C2 E
mov ah,2+ f, a% v' _5 [5 P# S! |6 u% w) H
int 21h' l$ b$ O7 a/ E6 W" L' |3 F
popa
) L- W% x7 s! o1 s o" H8 [2 B( w; a ENDM
* w8 V) k+ J8 p0 `/ J. C9 \0 C! |: ]7 |! O
; O; n: R' y7 v6 B) R
main proc far- }7 { u8 R) T) T ~
mov ax,@data: [6 f' j; w; n6 F }* e2 k- G- M* J
mov ds,ax
4 d5 e2 ?. L- A. g+ T, \2 h: F' N! E
0 _$ ~. Z/ U K; X mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
, i2 ^, y2 g! s8 l: ]7 G mov dx,CFG_ADDR5 l+ } _+ V [# O- h8 @
out dx,eax$ ^4 N6 e Q; C+ V3 i
mov dx,CFG_DATA
( Y% P5 ^6 y) v( R0 i in eax,dx5 e1 G4 y/ i2 B# l C. C; N
8 Z* K2 M; Z& v2 \, g, ?' _. B
shr ax,5 ;bit 15-5,the base address
" h$ c; ~. ?; ?* ^% v; x and ax,0000011111111111b
5 [2 ]' W3 o$ p7 x mov base,ax
- k; L' @$ i0 y- U, }) }9 j
9 [ s' m/ t1 K* T( t call ReadSpd3 i3 {4 ] @! ?1 M4 F
exit:
7 }% }( `- ~3 p8 J mov ax,4c00h
% {) N5 D& |8 d9 h& S/ K* @9 b int 21h
$ ^- s$ u* N0 U+ Kmain endp
# ?% Y; E0 h( }7 @9 C( v0 ^6 M$ z" ~
& G1 Z1 _, ?0 P. Z2 v) r0 D
1 D# C7 g# A8 \" k6 @
ReadSpd proc
+ I9 Y. K7 f Z A8 u6 A9 c pusha
2 q5 M& }# x; C3 O [Again:
$ H+ F# A: w. s* R7 y3 e mov ah,num
! l' _" Z$ U0 J8 {8 ?5 {# b and ah,00001111b/ R! P# G& p4 j
.if(ah==15d) ;CR_LF* _& Y7 G4 v6 N
LF_CR% i9 t$ b, X2 p1 T" I% c+ e
.endif
: c" u! F S& U+ E) c' S0 [3 h* y I' M
% d+ [+ W8 ?3 N, b) y- _ .repeat
& d* X' I h3 h* E1 ]# ^* S$ e; y8 t8 u mov dx,base ;reset host,claim host in use3 c. z- w( }0 ^/ g# n! V
add dx,0+ S/ N3 D& t! P+ z2 x
mov al,40h
3 ~6 W2 Q2 `; @8 ~7 [1 z out dx,al
: ], i8 t) N) ~) E. n
" E* }) w+ @8 ?- z$ r) j1 _3 |/ n mov dx,base
* n# |% P4 R. O in al,dx! ?( S. l# t$ D/ W4 d
mov SmbStatus,al( s% d q- L2 z: m; m
) d6 O& Y/ Z+ x' Q6 ?
mov dx,base ;clear all status bits8 T C% w% I& p% n* Z* P4 e
mov al,1Eh ;host status register
( J% `. N' l5 k9 N" G' M out dx,al
$ d$ ]# T8 B Z
7 z& [4 m" `! g- @5 r, u: {* u" ] mov dx,base ;set offset to read
) A4 g* u3 i/ B7 Q% ~ add dx,3 ;host command register
/ o R( `3 Z6 a: ? mov al,num4 ?( I0 Z: C/ N$ [) D
out dx,al
8 N- V0 G5 D, E: K. g- A / s& {1 j: r# U+ Q( j+ Z& n p
mov dx,base ;Transimit Slave Address register: V0 F2 N' w4 `' N6 `- n
add dx,4
/ B2 @* s1 A/ f8 v { mov al,0a1h
- ?+ T3 _; f+ a1 a1 H' { out dx,al" B* B" \6 Q' d! Q3 r2 k7 n
' [9 N9 |$ b9 q# p% B+ J2 e
mov dx,base ;set "Read Word" protocol and start bit/ X: K$ n3 _: ?: O) w
add dx,2 ;Host Control register
7 L8 o/ ]# i4 u mov al,48h
- A! _: h; f/ D- } out dx,al
2 z, w8 ]2 k8 I0 z9 N
* m- q" A/ e' s- ^2 {
5 T3 K6 Q3 L4 @3 d. i A! o
$ w' O- O# ^2 Z" B: d/ m$ V mov dx,base
2 h6 T" L! ^- Q; n" V: H) U in al,dx' F8 p7 y1 S4 G( k' J* Q4 _
mov SmbStatus,al
; q$ ~* q$ R* {8 e- G2 x" a, a7 e and al,1Eh
/ {; `: z6 G! R9 R3 w9 X .while (al==0) ;check repeatly until any of$ P4 _9 `. v: g
mov dx,base ;FAIL,BERR,DERR,INTR
4 ~- b9 |, z) Y+ D& @ in al,dx& @7 d3 H, j8 @, Z8 k0 k5 V1 x
mov SmbStatus,al/ o+ \' m: M4 J: ^) R$ a0 q/ b! z
and al,1Eh
% W+ }, `/ { [7 C2 L" Q. |( P .ENDW" j$ n- o3 f5 r/ g/ ^& H$ f
! f; ~9 V, F) {, Z0 S4 S1 @ mov al,SmbStatus
/ H( `/ u, t( {1 \/ |9 a ]5 f and al,1Ch( O0 O4 v2 |' {' e9 e0 {& v! z- g
.if (al!=0) ;check for errors
& C4 Y) I3 K# M. l mov al,SmbStatus
3 p% t3 f1 b( E5 {* o, y and al,08h
8 a3 W- q: V8 ]5 Q# N8 @ .continue .if (al!=0) ' t4 r2 E3 C* F1 G( ?
jmp @F
% ^! B0 l9 `: q' I& X5 x5 R9 o/ P .else
$ t& e: d3 Y! e. @" k mov dx,base" g+ Q2 N& }" G, {2 ~
add dx,5h
' ?/ G# V, p- N4 x/ `6 J! N in al,dx
" }. t4 H" i: K, U, Q$ _ call binhex
6 t; X+ W1 ?' K ~+ ` .break: r. ^: V4 N; y- `
.endif
2 x: V4 g* j" W) Q8 V% q
; A- y# x# X, L, e( @ .until (0)
8 A, [. j' i/ s J# ^
/ P. S K7 _& C
: N7 c9 d7 s: F6 }# K
% X; C5 m8 O3 r! a mov dl,20h ;output a space; I* b1 `9 c0 h0 S8 z+ U$ g
mov ah,2* R% V1 O( ~* {( H" {7 b
pusha) _% L E7 |$ [) t
int 21h
& w1 O4 o0 _0 x# x8 V: h/ {8 O popa. b1 x2 v4 k: B. s
inc num' K- S& A; X* k# n7 x
) _( b, w @) S; |4 S( C4 |
cmp num,80h ;get first spd 128 bytes 3 b- n3 J5 ?5 N: n
jnz Again ?3 ]( M5 E- l' R7 ]5 L
! V/ y$ {* L o
@@:( b& [2 P0 b/ h$ P% g7 m
popa
: A! ?, t# R6 f4 J# e ret
( h# u; F8 r* TReadSpd endp
- n( o" N0 X( W' `/ X5 P) _2 w8 \( A( g' h m0 h( }9 f
: ?; S" o% ^- F' f% w" d
4 K! z6 k' ~6 p. T
binhex proc
$ d" a) v# E5 j& X3 y pusha 7 r% ?. d6 x' o- z
* A7 X* c6 M) i; `. j* K
mov ch,2 ;2 hexadecimal digits to be printed5 |9 ]& g$ N+ m# Z9 w% u
loop3:+ b% m4 M% V8 z9 J ]$ G% b
mov cl,4 ;bits to be shifted) u" ^2 ~: D9 n
rol al,cl& k* x# B, z% _1 Y/ O& t
mov bl,al' y4 @# @% y% K! {3 ?" a- ~
and bl,0fh ;mask the 4-bit Msb& }0 g' Q/ B2 R6 o% O: c; z
add bl,30h5 X0 M# ~0 V- G
cmp bl,3ah( f7 a4 D# L; k* f: U6 i
jl next1 ;number or alpha?) q N- g w% O/ k
add bl,7
8 G& x6 I3 ]) Z. ^next1:
6 } }7 O% e1 h" } l; L$ F/ \. _; T mov ah,2 ;print one hexadecimal digit/ Y5 w) c) U0 c5 C/ W8 c& L
mov dl,bl- b4 i, p F8 |+ A, y. m- Z& m% z
pusha
3 ~$ D2 x) N2 y int 21h! h4 ^' W2 I- Z% ?
popa, @4 D- v- ?. I v0 k. ?
dec ch
( ~ ~1 U7 \0 g- z: w8 |0 h jnz loop3
3 g3 c' ~; Q! W' V4 D( s7 r popa6 s5 u" h( x; k9 t( J, g
ret. b; c3 @, ~7 s3 Z7 U
binhex endp. e6 y6 A A% f& g% D8 `( l
end main |
|