|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: , K1 D7 i7 e: M3 v- u" w* J( ]
! H- ]' B9 [: S6 f j2 D1 }
.model small
1 l) e, u! y( @7 C% |- ^ .386
; }0 H# W/ ]4 A$ q CFG_ADDR EQU 0CF8h( D) o% R, p. G* |( j' h( y
CFG_DATA EQU 0CFCh
' g! q5 ?7 ?! v6 z$ ]" d SMBUS_BUS EQU 0 b* T. D% m5 j. `
SMBUS_DEVICE EQU 31) O% K# F/ L W$ w
SMBUS_FUNC EQU 3
, ^9 [4 c3 p! _+ w2 ^; V) b7 ~6 F" t 9 x; ?- x3 _8 C! z# h
.stack 100h
$ A4 u( c; n' {! n' {6 r1 Y .data
+ r2 ?1 L; k. d/ Kbase dw ? ;smbus I/O space
- H7 |- C; a! E# Y3 |/ G: G. knum db 0 ;byte select, N4 P! z1 {& F) m+ |
SmbStatus db ?& n) \: \& j' W0 {, ?% r3 Q0 `
; V( X( |. o: J) @5 b8 z) z
.code
; D5 Y7 Q! F+ {# i6 t 0 a: n1 L+ I( V+ w
LF_CR MACRO2 k' C( M; H$ D/ H. n
pusha0 \4 o B4 W% T
mov dl,0dh
1 i0 M8 b9 N ^9 a% n6 Q mov ah,2
: J6 e% z: p+ Z6 D7 g int 21h" W4 Y. W7 [6 g( X+ F1 E
mov dl,0ah ;next line M$ I0 c6 }/ @9 p
mov ah,23 S- K; r7 ]* [" p5 h1 B
int 21h0 T4 i% t) d8 z& U3 A
popa
$ `+ |9 n2 z/ M. ~2 j/ o. D ENDM
5 P2 I4 j' V% L* @+ `. v* |/ o
% i7 X: ^/ U* y! \1 G S- m8 J" c0 R* @3 B! ?- U
main proc far
$ c+ ^% R3 i! ^; | mov ax,@data+ o' y# h" Z" _1 n1 k
mov ds,ax( B! _4 P( g1 R
) S. |. k; V1 q1 L# S+ F! P1 t. |! q
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ q( f% X% l: f+ m/ `
mov dx,CFG_ADDR
9 N. t2 V) I7 f2 b8 Z+ B out dx,eax; @* q: \8 l$ ~) v+ w6 E
mov dx,CFG_DATA
! A( E1 \4 L5 |! F5 t+ r! Q) d in eax,dx0 E; g0 c% ~% R( Q; `
c- A9 R6 d3 X; k shr ax,5 ;bit 15-5,the base address
& e, [6 j, q% C) k& l and ax,0000011111111111b
( U' F. G" q1 g* r$ k mov base,ax
! x. m# U, q8 u! J5 V6 R- t - {' z, B* s+ |6 f1 S
call ReadSpd
A5 E& i. z+ P( }! Y' Gexit:
$ Q1 K( U/ ^! ?' \! q( G mov ax,4c00h
( r) S/ i2 u' ?, F0 {3 B, `" n int 21h
5 u$ p# r% R: E( f4 j1 ^main endp
" C/ k" `# W) V5 V
6 d. h" }+ r( U& F
+ k7 q& d6 X; Y7 z$ ?
( Q3 }9 u! P9 K, p5 FReadSpd proc9 p) h$ f! ?/ C8 N3 u
pusha2 x' T- X' t# [. b" h4 Q7 `% X' X
Again:0 M" g1 P2 Y, T- A! Q, `0 P
mov ah,num1 V. N/ ?+ B4 Q) `) [4 c/ U
and ah,00001111b
2 c2 [3 h$ P2 q' y. q .if(ah==15d) ;CR_LF
% G; Z' v6 X, ~+ I LF_CR. c1 N \' s' J6 h; v! n
.endif- e: \' G" w' _% ?
5 ^+ M9 r: y) O) n5 n! M' J: _
.repeat
" E0 S {. B, E- Z& | mov dx,base ;reset host,claim host in use
, Z$ t8 ]0 O5 ^2 ^, R2 F5 ~ J add dx,0) n- _9 J# X' r _& u1 F0 l. c
mov al,40h
$ ]! x5 j% W+ W$ G out dx,al% p* \3 [ `6 } F+ O
3 B5 p* W! o5 M- X4 X, A- e mov dx,base 3 i) O+ {8 U% J+ O% H
in al,dx
6 j$ Q) w. q4 h1 v mov SmbStatus,al$ U+ d; ~0 d3 f U! A* r
6 z u6 x9 K: ]4 W$ U
mov dx,base ;clear all status bits
( N( a+ m9 _% S! |3 ]5 e9 { mov al,1Eh ;host status register
9 Q/ p! Q/ ?1 _ out dx,al. \2 H6 T) f. J+ ^' ^. k
# I+ S. ~# Y& B5 { }7 w
mov dx,base ;set offset to read $ [& {8 Y- V: R$ L
add dx,3 ;host command register1 _2 N: E; E. ?, h3 a4 R: w
mov al,num
: l( g# L1 f6 Z3 l out dx,al9 N+ p* `0 \- ?" ^
9 O9 k0 |7 R, Q$ X3 C5 E mov dx,base ;Transimit Slave Address register* [$ A0 P- @; J8 L
add dx,4
( ]$ R. K; M4 r" A ]. K% c mov al,0a1h8 F# ]9 \5 n, d- j+ K
out dx,al8 U( ~' n/ p1 _2 y
8 L) p5 Z- V( [2 F) z& \# v
mov dx,base ;set "Read Word" protocol and start bit9 W8 S( A' P+ d6 f
add dx,2 ;Host Control register! b4 i4 \! e* Q
mov al,48h
6 C! I* m# R+ M out dx,al
) M$ U/ D& |- t3 v9 x W, u
" k, T' h, W+ Q" L: p- Z, a+ @# n4 Z+ C8 b6 K: E Z' R& {) o" l g$ a
" r* ]8 Q4 x/ }# E- }. |2 z( d! ? mov dx,base, y% A r4 K0 Y* C" V
in al,dx
8 |: ~7 L9 L! E# S mov SmbStatus,al
% [ ~/ O, S1 x+ ]6 b and al,1Eh
9 m" ?! G0 V9 Z/ N& C- n9 g .while (al==0) ;check repeatly until any of
( E# c! N7 ?, [ mov dx,base ;FAIL,BERR,DERR,INTR
' x) C6 |5 o0 \3 ?" S! b in al,dx, w# f( Y7 D3 ^( o0 r9 G
mov SmbStatus,al& v8 B7 x' |' |8 X0 g& E
and al,1Eh % j/ l k( B9 D& t# h) R
.ENDW0 q' \3 [- L! J* U* u V7 K
, E8 ~" [- e, G mov al,SmbStatus
" t) A! {- J; A5 F7 U: Y and al,1Ch1 }1 z- x& F1 v# l- r1 F2 A
.if (al!=0) ;check for errors , V5 c9 S4 K, G* V
mov al,SmbStatus
/ K% [& z* `; |) @ and al,08h , o- s/ W {* x* A0 f# X- i
.continue .if (al!=0)
2 X, t0 P8 M0 d8 y jmp @F
$ N9 J% c) _* u% Q .else
# n3 T4 Q' r u o* u mov dx,base
* e: t5 t. d" B8 S add dx,5h- q! t7 P0 x2 l
in al,dx " a# y% `. Y7 N4 G/ Z
call binhex 2 G- _; ~; F/ m" I) g
.break2 E) ~/ `# Y8 a8 T- B
.endif
8 b) |/ O8 {2 V4 r# K. \ 2 P8 V z: c$ ~, D# w7 c2 j
.until (0)
6 n; W2 D+ V: M + N7 |- }# h$ W8 r4 l( S* t
5 V" L# G1 P" ^2 h9 ^ f6 R
8 G/ b3 U4 D' j- R, e9 g$ G
mov dl,20h ;output a space
1 B t+ @! F' X$ S1 G2 D. h1 v mov ah,2
( { ?' u& P* o' P Z2 { pusha' } J. n9 T; ^8 h
int 21h' a+ x3 k0 _7 e& A b
popa
+ n% V% W' j' b* Y& U2 c inc num
- Z7 n6 U4 k3 R2 m( m5 R) [4 ?5 n4 p/ ~9 T8 t3 V; W
cmp num,80h ;get first spd 128 bytes 0 J" f5 j* n) b( y" S9 ~
jnz Again
) e( D$ Y9 i0 \( H ; Q6 ~) v7 J' j% E0 B, i' G
@@:
9 ]8 E, W, ]" z+ k# b) k popa+ g# n6 v/ W L- \* c
ret
! M1 G9 b/ X: I: n& \ReadSpd endp
, w( Y2 a" u! F9 c/ y1 |, l
' Z3 e- L* p/ V7 r3 }, s( Q& N% e+ |' c' d! k. Y
% \. W8 y w! U
binhex proc 5 e( M1 V5 u. B" u4 ?# H
pusha # U) T# z, S) N$ T" M; M: J
# r* C4 r$ p/ A9 I! a mov ch,2 ;2 hexadecimal digits to be printed
+ U; U7 q4 P* ~+ H! z0 d- Ploop3:
$ _: }$ o; L8 Q5 p6 b3 A mov cl,4 ;bits to be shifted
# z/ h8 A$ v o rol al,cl; t3 c7 L# G0 @1 R3 Q$ s, \8 |
mov bl,al! ?+ E9 g. b* X. p6 V/ w9 R3 B
and bl,0fh ;mask the 4-bit Msb3 l* K$ R& \/ d4 m# I# M5 A6 F
add bl,30h2 l8 \/ M" M9 ^: H& @
cmp bl,3ah _" ^$ o# K; R' [% n8 W6 y' U6 K2 A
jl next1 ;number or alpha?
% x2 C4 g& o, V9 y( ] add bl,7 ; g' R% Q) K' J
next1:
. I0 d$ M. N$ [7 j) X7 h: n mov ah,2 ;print one hexadecimal digit
* S+ a s0 G" E( W D mov dl,bl
0 S5 Q! d' Z. x: M pusha6 F6 C+ M' E4 t; b& D
int 21h+ M/ w q' o, K$ J+ c7 ?2 y. p
popa7 k( K" O8 }: o# E w/ U9 v
dec ch. d/ c" e0 v+ C: t7 q% |+ W I
jnz loop3( e' _ H" D O
popa
# A9 ]9 O$ o5 p6 B# U6 s ret
( {, X C6 U5 Y: D; W* a7 |6 z% Wbinhex endp
3 g' M5 M$ Y, k+ H end main |
|