|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
( x+ O U: P, W5 {! M
* c& V+ v, R* _, e8 N .model small
3 C2 p4 k/ _ R& p' |; l .386
4 T1 E* Z( [7 B" h8 a2 m CFG_ADDR EQU 0CF8h
5 n* e1 {+ ~ J" B6 M CFG_DATA EQU 0CFCh0 o- O& C! c( e1 z
SMBUS_BUS EQU 06 o; t. r3 `6 ^* A
SMBUS_DEVICE EQU 31% {3 u1 h c6 M6 q( w O+ |& ~$ x
SMBUS_FUNC EQU 3! d# S4 n" y- B$ d
+ ?4 m8 ~& A V4 } .stack 100h
: a7 U# U% l! w; G: y! U# C3 Q .data
7 A% G; w* G6 q+ @8 lbase dw ? ;smbus I/O space
; v* Q: b0 \( I1 |. x) W' Inum db 0 ;byte select) p2 y: _5 C% \$ G/ w
SmbStatus db ?
. r) m& I* P% W% K& q- K: [
$ M, ^, M& a, B V .code5 k& H) t% E% [% p) D
. e2 [( v5 l) W" u/ u4 r1 \; I+ V0 gLF_CR MACRO
* V1 \( c' n& x7 v% d pusha
4 c# g0 E# D' b: U: ]6 O2 o mov dl,0dh 8 }7 B& @ I& {0 C3 [! J. O
mov ah,2$ j z0 ~; p) i0 P7 r% d
int 21h5 G2 ~6 d% \7 U9 W( c+ |3 u8 c
mov dl,0ah ;next line . a" b/ N, u( x" e
mov ah,2( z f& x9 _; K: T/ _( l% H1 p
int 21h' J2 ?6 O# }+ j+ w# p
popa
. X( y% j8 l" v1 Z. a" A2 d ENDM
& A+ I5 ~) r! x% T: [8 f0 y4 u8 W3 y, |8 L( L" J
U2 z+ H+ L' q" R. V; u" j# F: e' b
main proc far U7 [6 K& z g/ I8 A3 r7 y
mov ax,@data+ m! j; C( `- Y7 [
mov ds,ax p$ N2 s4 V) H
$ e, j' q( N" x" G* x Q. J mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
+ y0 A, o5 F1 S; P mov dx,CFG_ADDR F( B. _9 C/ o, ] _# v. g
out dx,eax$ a. w# `# w, f& J# ]. X& T/ k
mov dx,CFG_DATA
/ L" N% {& C0 l0 Y# P3 V( b in eax,dx5 _+ T ~3 D* t* _: Y* ~
+ J- F1 t I' G) q" `
shr ax,5 ;bit 15-5,the base address
3 x! A' Y1 J. r; D4 S$ ` and ax,0000011111111111b
& M& |: ?1 |& D$ I' X( _2 \ mov base,ax
& y" W+ j" p9 A+ C. C # w: O6 _' B. l# N7 M8 e
call ReadSpd/ k; Y U: d$ ]
exit:4 M8 }1 p9 Q* e7 Z) k
mov ax,4c00h& U S1 E9 O: J' ]+ a3 w4 P
int 21h7 t$ V% d2 [+ a! K9 u/ D
main endp
4 E6 }9 {8 G" a" v; y; q* T$ Y7 C; Q- @
* {* r, w0 e# Z: A! l6 u" I# u$ p; Z/ ~
ReadSpd proc a* G; ^7 `7 M- {! [! q- x
pusha
/ C; i2 R' I$ c8 }Again:$ W. W8 \1 ` Q- J' v! i. B" e
mov ah,num# t/ Q& E' `1 c9 W0 ?3 n9 T1 D
and ah,00001111b
+ ?; w7 j9 j# f4 W! g .if(ah==15d) ;CR_LF
. h1 ?! h$ q; R LF_CR
) i2 H( ], Q; v6 Y1 K7 O' `" X .endif2 Z8 S" L0 O; {; G% a0 m5 z7 c* m
, F7 I3 m) g6 g .repeat
2 v8 b1 x3 }( c mov dx,base ;reset host,claim host in use
# B- h: j& X$ O add dx,0
: O! D! `' T. j, b: o8 C, K& L mov al,40h2 g. o* b5 [9 E4 B9 v
out dx,al" Y% \- n1 J4 q7 b1 J
9 }; Z% D7 ?$ g6 e
mov dx,base ! P4 @/ j) G/ a) K! v0 O) i
in al,dx, o! u+ F( R$ J1 e
mov SmbStatus,al, ~1 N: A \/ J8 p* K! D4 k
/ ?; y z+ G. z$ z mov dx,base ;clear all status bits
. D4 _ a1 N. x0 u+ B mov al,1Eh ;host status register/ Q3 R1 k+ g3 _) z) ]
out dx,al; n0 k; o- L, s1 A
. `2 |" q" Y. T' C5 c4 w' p, H mov dx,base ;set offset to read ' @" Y! P* G: j
add dx,3 ;host command register1 ?+ [- M4 [' |% a @
mov al,num, f( u2 Z. K5 \) U w# C/ K
out dx,al
6 D$ B4 y5 N6 d: q( d8 u* b n; `! y$ q3 ]; x& v
mov dx,base ;Transimit Slave Address register$ s, P; F! b+ P) o- I
add dx,4
/ p7 D7 ]8 T/ J1 q A0 k mov al,0a1h; G3 V3 V; h4 {: M5 x8 f
out dx,al" `5 n& F q8 d
! U5 [0 V$ Q7 h mov dx,base ;set "Read Word" protocol and start bit
m& O/ C6 Y3 o B( `& p add dx,2 ;Host Control register& |$ M! T } b# A5 ]
mov al,48h
0 F( M4 { [- H( ?6 w- n4 ` out dx,al
4 p4 h# i8 i6 Z( V9 K" G7 Y( } % H5 r2 n1 e0 Z+ r( r, E& W
! F( A4 `. t1 W. e! N
4 g5 P! B/ \' J6 U
mov dx,base9 Y8 u8 b$ H3 X$ I& W
in al,dx0 \* ?" I( s2 x) j5 [! M
mov SmbStatus,al
" A! \$ e& a+ d$ t. E5 k and al,1Eh
2 h) f) m% b2 y- g' U f$ o; X .while (al==0) ;check repeatly until any of) B4 T8 i0 P1 H' ~& b
mov dx,base ;FAIL,BERR,DERR,INTR! j9 D0 p: K6 ^- z$ K
in al,dx- L1 H5 g* H6 E
mov SmbStatus,al
8 C( {7 D8 L/ u and al,1Eh
- i$ G( ?; @+ m" f .ENDW6 j& s$ {0 u8 ]4 j% N& s3 x
# a3 W5 y) o$ \" f9 C% G mov al,SmbStatus - c& d9 G/ L0 C. {( W# V
and al,1Ch
3 H1 T, l |1 t# I- z B" k .if (al!=0) ;check for errors
7 G. N2 M& O, G6 u mov al,SmbStatus
7 W, J0 l! W) F; K9 ^6 E# ?) h: ~ and al,08h ) ?: e5 r( O1 n, ?0 s
.continue .if (al!=0) ' V: U$ L( t$ |5 Y$ ~9 m
jmp @F $ V) h* b9 B& e) K: `, ]; _
.else
+ ~ Z4 r9 ?& q7 V: q6 Q) s5 R: i mov dx,base" m( |- S% A% _
add dx,5h' ?4 ^) f! i5 N/ }0 s, f+ ~' C- \3 G
in al,dx }: m: O" J% @% [8 x7 J
call binhex 8 ~" G" @' i0 n0 v& B0 ]8 Q0 Q
.break$ T/ i# [1 O- J- {2 N& W: g" X
.endif
* a/ N* W2 m! c ' o' N! u# o" [/ Y
.until (0) % R" U; _5 g5 ]! M
$ L. F$ T6 U! [6 s- I ?- R( C _' |0 i ' a( J& N9 j0 N1 M0 v- T; t' T
# V' ` C Y4 a G, K2 H
mov dl,20h ;output a space. O$ ~' ]; I/ B) U; V
mov ah,28 v# n) ]8 Q' J/ K/ Z! p
pusha
3 }6 U; U7 y' j, O. P int 21h- V; ~8 u0 x n; o7 f
popa
. `( ]+ P& v+ K( s inc num
% d. T2 m6 [. V) x1 a7 R8 Q" l5 A0 M; S' |& @! n( |
cmp num,80h ;get first spd 128 bytes ) @6 n- G; @5 d: t$ F+ `$ Y, F8 J
jnz Again+ ^6 P3 s' W* p, M2 C& L4 U" r1 M
6 s: N/ c$ B/ C/ J8 u
@@:1 s. s' G& g+ @5 o% Y( L
popa7 m$ w$ [) M" u3 b
ret
r" S7 V% L) v( l* K1 E R/ X2 Q2 }) ZReadSpd endp
7 C5 }- G+ j* z( O
* S4 S5 `3 M& ?$ f# f3 ^
3 I7 I4 q! C- A
" z$ k% V* ]% M3 C4 M8 e8 L% _% }binhex proc
" W' v7 A9 F# ?7 p0 P( }5 r pusha & n4 K! p3 y; j1 B
; q3 R" S" n2 c# S% Z" T
mov ch,2 ;2 hexadecimal digits to be printed& ~4 N% r& l. T0 e% K1 @
loop3:) ^/ Z; `2 K% s
mov cl,4 ;bits to be shifted( R1 t+ \& e. e" ^: U0 f
rol al,cl
) \7 }2 W7 k( Q# b3 s mov bl,al; P7 N& R w5 n# J$ h# @: Z
and bl,0fh ;mask the 4-bit Msb8 K+ }* x& _# l* s, s
add bl,30h
3 T, n' Q1 V2 {* D3 Y cmp bl,3ah
6 v$ B# `6 y& A& @6 R jl next1 ;number or alpha?! ]$ y6 Z0 N; ?' Y3 P2 z
add bl,7
8 }) g8 G) m2 m- V! Z' Jnext1:
# V6 L/ S. B7 K7 ?. }7 X- C mov ah,2 ;print one hexadecimal digit
" {: b; _5 N: P8 @ mov dl,bl
/ B1 E' A& |' {) {* C. Y pusha
+ T) ]$ L2 G# k( [ int 21h5 N" f. L/ E2 F2 K
popa
6 y& ~8 {. C( L6 j; p2 a% r2 h dec ch' M# J; R# |3 Z
jnz loop3' Y( z, ^4 W. F7 _
popa
3 D4 T! O; f% s1 Y ret
6 p( N) e7 o$ l/ qbinhex endp
5 O- _" }& S& G* P/ L$ i end main |
|