|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
9 x+ G: h O9 s7 A* m8 _& z$ b) }6 d3 [, u3 ^ b
.model small/ [8 {( s5 u1 k% m" g. g3 Q
.386) [! D# R9 B8 j% v
CFG_ADDR EQU 0CF8h
@- V2 m/ W6 o) n: d d/ ^' l8 O) I. D CFG_DATA EQU 0CFCh) J/ q; O2 ?2 G `0 X. p
SMBUS_BUS EQU 0
% l2 V2 ]0 P1 w* |, L4 `+ t( L SMBUS_DEVICE EQU 31, N7 d/ U- ]$ v8 D- L2 E
SMBUS_FUNC EQU 3
$ R% `, n! T" K% c1 `; R! @$ _ 1 t! p& {( c) v1 ~. f$ X6 M
.stack 100h
* U, a: x8 ?( a \" p( Z .data
' F/ p0 [" w, o, F6 Ybase dw ? ;smbus I/O space
( o) D& S! u. _, m! }num db 0 ;byte select3 p4 H' ?$ N, b2 E
SmbStatus db ?; o7 e9 x0 t; o5 M+ ~2 @( Q% m/ L4 L
: V6 [+ s( L0 ^1 N/ I. z
.code
6 u j* Z8 j3 L- T
9 H8 E6 e8 ]. CLF_CR MACRO
3 V' f! C1 B" a- N8 F: w) i1 u pusha
4 C: `) M4 }# c4 Z% i+ h/ ^( z. X mov dl,0dh
- P! i, O3 [1 X mov ah,27 A+ A& y' W) n3 _
int 21h
0 [9 n5 C$ D- }( d, w! [; E4 A mov dl,0ah ;next line ! r1 e% ~! u" P! d" d+ R8 \
mov ah,2
9 C6 l3 ]/ \ `* N5 {) A" c8 e/ z int 21h! i: v! S5 f5 W; d# a" i t5 @
popa 7 z2 O3 j u: u" _
ENDM; j) z/ i6 x% S4 ?' |! b
( y2 U3 v" c, U4 c# t4 \1 P/ Z
5 ^6 i( K( I% L/ c; `4 Y: J
main proc far
! Q8 W! n% K/ l mov ax,@data$ R. p' v) W6 U/ A* d
mov ds,ax
: i7 Y! O1 p+ R, n% G) e/ K( k$ [0 O " B! p" N$ R# k% j
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
/ T. k5 e) d( z5 a, t7 D" h; m mov dx,CFG_ADDR6 c0 D. O& [% p( A6 K1 h$ ?* h
out dx,eax6 a5 _2 \) T W( U& N" u t( W
mov dx,CFG_DATA) x, f2 s4 ?) O% Y2 T. j# z; H4 p
in eax,dx
& o6 U9 b" K" t) o2 E W 2 Q) P6 L/ E: o2 m0 c2 ]5 j- k
shr ax,5 ;bit 15-5,the base address+ N# p3 n8 u- R
and ax,0000011111111111b( h8 `- _1 i+ ~& z; N: t) o. h
mov base,ax
6 s2 [: I8 B# K( K
* A8 x( O' A- q! c! M+ n- z' `3 r call ReadSpd
4 u5 d; o4 ?+ {5 I& e, |/ dexit:
4 J7 }! {4 z7 K3 Y( f$ y* _ mov ax,4c00h1 l( H, s# t8 m% ]8 T
int 21h9 X5 \" o4 T+ s* s- c, k( Y3 _8 r
main endp
) F! f1 V' d- o! v% |; v1 u$ ?
* A% `) v4 Z# J. r f1 O7 q+ m3 D: R
# `$ J8 s- _. M' W
5 v7 g0 W7 q1 ?$ ]( ]# X9 y) g& vReadSpd proc9 m# `1 G& G; P' V4 i3 I! O2 J
pusha
$ ^! e( ]! v( F( ?. PAgain:
2 F, W- N. I* A: J0 n+ ? mov ah,num
6 V9 n/ Q- ~- j and ah,00001111b
( n4 s" U! J/ i; Q, H! z! e# q .if(ah==15d) ;CR_LF
, n, J" C' y% p3 \0 g. g5 t LF_CR1 ^# I# |$ A8 w% u4 M: `$ X/ j2 a8 }
.endif+ i2 M) [: t, C" o
5 ~3 g. y% Z% W+ x0 V# o1 P+ U3 p
.repeat# ]. A/ ~/ a3 S- I, e
mov dx,base ;reset host,claim host in use
$ P R+ @0 k3 R+ e8 P3 N: N# \ add dx,0( S5 K$ D5 Q u0 a, p) g+ A/ @
mov al,40h1 s4 R+ l& p0 }- r' V' q+ o5 B
out dx,al% \/ W9 V# g/ e( O; K/ G
1 C9 H: k( ^8 @3 E
mov dx,base
2 M% Y2 l3 L+ P7 N9 [+ f+ ` in al,dx3 w* ~; z6 i6 F" Z
mov SmbStatus,al
3 h( P" r! O# [
) y. e. I) e* }/ J& k' A/ B4 X8 Y mov dx,base ;clear all status bits
6 ~. c' f+ k( g mov al,1Eh ;host status register' o$ d* ^2 n) m/ T; k9 A9 j: V
out dx,al2 E9 A% c7 N) c3 G
! n$ e# D1 L( g* n4 _
mov dx,base ;set offset to read
% n' o- }1 T+ u0 k5 B' p# q3 Y& L add dx,3 ;host command register4 R/ h; ^( B) d8 ^, @$ }+ E
mov al,num
2 G3 L. G/ j! f% A7 @! z7 Z7 v; P out dx,al3 o6 f7 e L, Y5 k: ^# h0 m
4 b1 @# [. M/ w9 E2 V4 I9 A: T
mov dx,base ;Transimit Slave Address register9 `6 C, R: U. @3 F
add dx,4
6 Q H4 b w, a3 V+ ^ mov al,0a1h
# n+ @7 T& r! W5 q out dx,al
/ r4 a8 `) _- X4 ~8 L 7 @( V. x( U# S" V
mov dx,base ;set "Read Word" protocol and start bit" h! x, r U: V8 A# E# `1 c& q @( X# B/ I
add dx,2 ;Host Control register& G" p( o D" Y. w, e
mov al,48h 3 q5 k; M! a, [: l2 T! w+ H
out dx,al. c" E- U& k5 M
! i6 f) |0 f8 Q( w x9 Z+ Z9 C1 W# k$ Q
4 }) P$ Z Q6 Z7 p2 j6 ]7 Q
mov dx,base
" t+ f" |9 b6 R- i/ q. { in al,dx
! h6 X: I: {5 V$ h5 t# J6 N mov SmbStatus,al6 O8 }# p0 W4 o& Z
and al,1Eh
' z3 x, ^! j k, q& ~/ G6 q .while (al==0) ;check repeatly until any of6 {$ v w3 H& m4 ?
mov dx,base ;FAIL,BERR,DERR,INTR% f. Z% Y: f6 y- {
in al,dx# k' L6 h, L$ P6 p1 ? M
mov SmbStatus,al2 t; `' y# }! R4 W' w2 z
and al,1Eh ! \5 \8 g4 W- P8 O4 \8 f# p
.ENDW
8 p; w$ C/ n% i! `: v9 x3 `/ f7 @ ) u9 a* Q+ X6 } t2 R2 E y
mov al,SmbStatus , n4 K0 h) H& Z# d
and al,1Ch
' x0 J# Y5 |5 D0 U5 `5 i& C# i .if (al!=0) ;check for errors
1 b3 \9 `! R6 g- B. x% d* w mov al,SmbStatus5 H. |2 d2 b; Q) R/ m2 `4 {, s
and al,08h ! g# w/ t$ u) Q! ^6 j4 t: x7 q
.continue .if (al!=0) 1 @8 v' u) m, W1 x+ t
jmp @F
1 w' f! L: F7 n! |: d .else
* m) E* h0 N5 ]; Y* |2 b( @0 T( G2 o mov dx,base
3 o6 |3 u9 G) S/ H N% \ z: M add dx,5h( ^5 P4 b2 `- Y: I6 L
in al,dx % c$ o. h3 v6 X6 z3 a
call binhex + a: `& z1 L2 c, Y
.break
. Y& j A) O* j' h7 i2 { .endif
7 l' D; @$ P: ^# @1 j6 K( \* p* s * e! W) O+ E0 L* q) E
.until (0)
( e0 |8 ?* w+ e8 K7 T# |5 ~
! u( W7 [7 ]% e; |# k 4 b# I9 r' e$ o
9 K% V# G# F: p( ~ mov dl,20h ;output a space; v: ^; k1 m' g& @$ P4 A
mov ah,26 [5 R# p9 ?8 x; N8 w. M
pusha
5 Q" F- e9 T* H- L1 j7 | int 21h
5 z4 v4 C. I9 v7 z) \) m popa
" a; q" s/ Y6 q inc num' K$ d. |& t# A
: W% c+ f+ Y& a/ l3 D cmp num,80h ;get first spd 128 bytes 5 [% r. q; ~/ z% s1 z# _. }
jnz Again
7 Z/ e9 E8 U; e P/ | 3 F+ T5 ^6 U6 U; x3 n
@@:
* Z5 m" C: `9 ]' w5 M- i5 [2 l popa
# O! D7 y# J* r* D ret
9 M$ V8 T ]2 V1 h) lReadSpd endp' ~- `, b1 b" o) C( F2 c
5 l9 }. L2 Q9 R( f( m+ _% o
2 H$ S; V8 s: P2 p) n( R; I& b- Z3 C4 d, |- ^! I0 A5 f" w2 |
binhex proc * Z& V" @' `1 p4 O% V7 X
pusha - T5 ^! p8 ?, ]. C- q
% ?# A7 I B; C& a' a6 e3 L i
mov ch,2 ;2 hexadecimal digits to be printed0 d ^0 \* v8 c! U0 u
loop3:/ u+ I* Z9 [) b/ L5 D
mov cl,4 ;bits to be shifted
8 E0 C" S0 V C rol al,cl
8 _1 C1 r& ]7 @" i+ U8 Q mov bl,al
8 M3 w, A! z" u and bl,0fh ;mask the 4-bit Msb
/ e3 q5 u6 }$ [2 ^* Z& ]5 i" x- ] add bl,30h
% V7 p1 |! b1 {4 ?( Z* u3 q4 c$ ?- m cmp bl,3ah
% r' ?/ {" J9 c8 q( g+ U jl next1 ;number or alpha?
9 q' n5 M$ l# U: j% p2 } add bl,7
9 W8 N# `9 Z" |next1: 3 g& H. P8 \! [4 \% s, I- ^
mov ah,2 ;print one hexadecimal digit
" q h8 ?5 E: N, i mov dl,bl5 Z: q4 a' M9 j0 x
pusha
* {# ]! b# g* Z" J# A int 21h
/ o& m* g7 g. e; Q Y popa1 ]: @% W! y& g& M
dec ch
9 S6 _: t9 y {6 v& I0 p+ S jnz loop3
7 d y9 T% T; t+ h8 Q popa& I. P; c, S6 ~! W; ?
ret0 i" M4 G" Y; ^, f7 j) ^
binhex endp
0 w w2 J C1 O& ~* Z! U end main |
|