|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: * Q8 j# P- d8 {7 i$ g |( M
" r8 [1 h, C" l .model small
+ \: N% {. p+ A9 u .386) Z& Q" V) r$ ~, s: U
CFG_ADDR EQU 0CF8h% V( i0 u, Y9 [
CFG_DATA EQU 0CFCh' Z# h9 G1 {9 A# S
SMBUS_BUS EQU 08 z0 {' F% T& t ]
SMBUS_DEVICE EQU 319 B# ~$ r* [; f: N" W
SMBUS_FUNC EQU 3, o" D! b3 o& v9 w, e
) }( F6 O) O% m |- R .stack 100h
" M" D/ s8 G0 @, c: Y .data
. @; `# r6 P0 t6 N4 |$ [9 x/ x jbase dw ? ;smbus I/O space/ A% U" b/ O4 g9 K
num db 0 ;byte select" q" J. I; b( L5 z7 K R- c
SmbStatus db ?% J; b) E; @' u$ b# R
$ f+ B* M, Z) i0 y# _' O3 C! P% x .code
4 ?7 c: Q2 W5 {7 v& V
3 F; W3 @- F) A+ V9 _0 F7 J: }! V/ KLF_CR MACRO2 p4 X/ ?+ B D5 O
pusha
3 X" o6 f: ^2 i+ R' y mov dl,0dh 3 v M9 o' j& W4 O$ M6 y. Q, J
mov ah,2
% x7 ~! t+ {: y# n9 U( r7 { int 21h7 I7 {+ _# Q$ ~" C7 |
mov dl,0ah ;next line
. U5 V E( ^+ c- Z mov ah,2
; b8 \+ Z5 u9 O+ B/ Y- B3 k int 21h
+ }" C6 d. ]8 z. I* P( O popa $ `# w$ M, z3 V
ENDM
& z* {+ O' [% ?# o5 h8 w( [1 t' M) G% e! q$ D
+ a6 T4 n1 z& d
main proc far% g4 r0 T* H( d+ Y
mov ax,@data
& h9 s$ P/ D5 C# V! e' Y mov ds,ax, V+ {& E! D# @* [' f: p
/ Y+ x# `' Q' ], f
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h! {, F5 o& { H" h3 P# h
mov dx,CFG_ADDR
# h8 [5 }2 G* J4 `4 T7 b out dx,eax
! F2 G8 C! l. X. Y mov dx,CFG_DATA
9 M- E- b( {& F in eax,dx
7 ^& l, K/ `% h9 \) g( J3 { ) w4 a0 T5 P+ |& Q
shr ax,5 ;bit 15-5,the base address- F: S$ N1 X+ U0 ~2 Z
and ax,0000011111111111b
3 w4 F3 [0 f; S! {( O( u# v mov base,ax
5 [3 v" Z$ i1 o8 u
! `* y, l9 E8 a: v2 Y call ReadSpd: N, D2 W2 m3 l5 ~$ F2 S
exit:
+ b9 I) u3 o+ b9 e5 h mov ax,4c00h6 P6 Y. t( v# c0 w& S
int 21h( q* V n" C- u7 w: g) b9 O
main endp
0 k* x0 I. N+ ]1 h% @3 c% e
, u F( R/ H% K! ~. A r( | ]5 a5 A# X" @# U4 Y w# l# K) m) y
; d8 U/ N* g6 A: t' J" d
ReadSpd proc
, E5 U' [! l9 H! D- ?, P pusha, z" u5 i2 g# U
Again: P) u; V0 ^6 f5 W/ G' v( {7 K
mov ah,num
5 I- U% J- q+ G3 r1 C6 X9 ` and ah,00001111b
1 b- w! l7 u! z( P2 _" z1 A .if(ah==15d) ;CR_LF8 j$ Q& v+ H+ Z' q! l
LF_CR' y' {+ [, V4 ?6 ]5 t
.endif: Q7 e/ _) k' E: k6 Z" z, M4 J
& b4 J* f; y5 B9 Y8 j/ {9 t
.repeat$ b* P% y) e& R( N
mov dx,base ;reset host,claim host in use
% C* H/ h9 c1 ~0 @ x5 Y1 v add dx,0
/ ?; ]# I+ b/ g2 v6 |/ Q mov al,40h4 T" y8 L9 b3 x* d: ~' _
out dx,al
5 o* x3 F/ W$ v; |, K - r# C& j; T5 p& J# p
mov dx,base ; x7 m% S! @ b" y7 z
in al,dx- C/ g$ T, R# {2 T! d2 F
mov SmbStatus,al
9 h5 b/ L( U/ A
9 z2 N5 B0 Z" }( a8 V mov dx,base ;clear all status bits
+ S' b3 b7 K# r" H mov al,1Eh ;host status register4 E; `) U7 m( q6 L$ Q
out dx,al3 T+ K2 `) |$ m" [9 Z' Z8 U' z' g
* V8 |0 d1 }( w' W: s' C
mov dx,base ;set offset to read
8 Q0 s% @- u8 ]! H9 g$ a6 o# {+ o+ } add dx,3 ;host command register& ]5 o3 j: l8 C/ y
mov al,num) }- _& o+ N1 Z6 C" f9 v
out dx,al. H% k# A. k* \# N# H4 q
( n- T- n: e* z8 j mov dx,base ;Transimit Slave Address register6 ^# A$ U: w) _# G; z
add dx,4% I, U/ l0 j8 Y' z, |
mov al,0a1h/ S. R% N1 |9 O
out dx,al
3 K2 ^% x1 J C: o! @ / e9 m0 R& I! p
mov dx,base ;set "Read Word" protocol and start bit
) V4 r* g# z1 _5 X* h- n add dx,2 ;Host Control register
' ]0 z' C6 p7 _( }9 R7 a+ ]# D mov al,48h . H) j9 `6 k5 | A# c
out dx,al$ D/ e- M" h) @, Y5 H
* E6 t7 i4 i" k+ O2 a; d
v2 F( ^! ?8 e: U% l% \" r3 E1 [ ]
# V/ C- N e3 r( Y mov dx,base
5 Y7 E- n0 `+ N+ A6 ] in al,dx
6 @ B: T6 P: Q% D mov SmbStatus,al
& h% [0 `. L" d5 Z8 a' o- n$ [ and al,1Eh4 j4 Q9 N5 B, L
.while (al==0) ;check repeatly until any of
0 ]. m3 G( E% E2 J# T' k ~; K mov dx,base ;FAIL,BERR,DERR,INTR
3 [; [; a! u7 `& g1 X in al,dx
g3 v- u0 Z$ p7 z mov SmbStatus,al
2 C4 x1 w6 [" |* U3 y5 i and al,1Eh
% O! }% n( U$ f0 R U' Z0 R) y! l6 ~ .ENDW
; J- z5 C$ U, S
1 A1 j1 G; \2 n2 Y& Q. m mov al,SmbStatus
5 W- }, S. x0 S+ L ]$ X4 M+ l4 h and al,1Ch$ @: E: K) p/ ~+ ]7 G6 w
.if (al!=0) ;check for errors
' f/ g! @: j5 }3 c9 H- A5 p mov al,SmbStatus# d! g: w9 k1 K1 v0 Y6 ~9 ]9 o: \
and al,08h & O# r- Y$ F; c% a f8 h
.continue .if (al!=0)
' k" j0 Q- }/ } v jmp @F
8 ~' ?* J/ \, ?" ^; x) s .else; c' U2 T, l0 V$ K; q
mov dx,base
# r' N v0 u3 R, _4 P1 i% P3 O add dx,5h3 g, {! B2 _1 W V6 | W6 y: V
in al,dx
! F: D! ~+ }4 n4 p, o4 c$ Q call binhex
& F5 H* a5 ?1 X3 k' g/ D .break
7 k& ~3 ?# h1 Y' v .endif
2 u+ o# D+ [& _( S0 L: m" j 8 _$ B4 e2 P) \, ^9 h0 C
.until (0) 7 \; C/ Z" U5 R/ t! ~, s1 B. @
, o7 a5 X# y- }; g F0 x$ o. D! A3 M4 i0 r $ ~2 L! n& j; J" D$ x2 P
6 }+ o+ G( C. X5 \9 ^# ?, H7 q mov dl,20h ;output a space: V' H6 `& j) S$ m3 v
mov ah,2+ N m @2 H" x' Y8 ?" H
pusha
t/ S% o: K6 _( g6 k) [$ [ int 21h
" Z- f2 Q2 x/ N* h7 V6 ~ popa
' q5 i N% U ^1 Y8 ^& @& j inc num
0 C+ I) ]1 C- g. H$ c6 o1 n
9 g+ Y% C3 j# _/ ~' Y cmp num,80h ;get first spd 128 bytes
- `; _$ E3 ?( S: f5 d+ _ jnz Again! Y; O8 I/ {% [0 d: F% Q3 Z
2 P* `# @: p' t2 @# B( p5 z$ g
@@:
# S2 B: ` g0 U& b* _1 M* \ popa1 u4 u# u1 T c3 d# A N. A
ret
% |4 r% ~, J, R6 D4 ?8 P# |ReadSpd endp
: K2 S. C! B$ W+ q) E1 P9 _; B7 q* P/ f8 N9 [2 o4 p" m G. Z
6 ~5 F- i' L6 y0 P( s
$ t5 z; X* i" F4 ^! H7 M
binhex proc
( U; y1 P. d( _2 F: ~ pusha ; v0 T; \' H2 j; F9 ^5 K# D
2 d9 u) |+ T" C8 L& D5 p# f mov ch,2 ;2 hexadecimal digits to be printed8 s/ ^0 ]- u/ F6 Z
loop3:, L$ h( n, W4 x( [ L; t( J1 k
mov cl,4 ;bits to be shifted
$ E4 @& w3 `$ \; ] rol al,cl
0 z; |& Y1 p2 ]) I) H( Z6 { mov bl,al- F% s9 w# a; O8 w# P# R
and bl,0fh ;mask the 4-bit Msb
" P/ O7 y+ A8 i3 P6 x add bl,30h. D+ o) T1 Y1 Y0 K1 q
cmp bl,3ah& v7 @& l8 |: R7 m% d3 w( |
jl next1 ;number or alpha?
0 A W( _8 u/ d" ?4 C add bl,7 7 \2 ]$ [+ Q% `4 R l3 b5 f( h
next1:
( e1 C3 x. b5 a+ J mov ah,2 ;print one hexadecimal digit" Y8 r2 q/ B9 k8 n
mov dl,bl
- l* _3 z5 t3 R0 @2 U [" p pusha
+ J, g5 f* m, }! U" r int 21h
' |6 T2 v6 Q9 a% A2 r: D4 N popa
4 |$ S4 D( N8 c4 A5 [ dec ch
5 K0 G, H$ P' S3 d" m# | jnz loop3
! y/ p+ {# a6 n9 E+ f popa
8 [* M9 N* y& |0 x8 x: X ret6 ~/ V B! b$ }+ M e% }9 H1 n
binhex endp& A$ i9 V; `# P B; {6 T$ N; I8 `0 S
end main |
|