|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
2 B& ^7 h2 m1 j2 V
/ S5 S, G* i; K6 b. l2 l& x .model small
% F0 @" h! J& I8 ?+ f' ^9 X1 m .386
1 F# E! v- l* w6 K9 C CFG_ADDR EQU 0CF8h
0 D) A6 M% |/ s( l, Q- L: y CFG_DATA EQU 0CFCh! D. F2 `. T5 s1 X5 Z
SMBUS_BUS EQU 02 i L1 s+ Z" V8 `8 |
SMBUS_DEVICE EQU 316 c& y* ^! a2 p }# }* N' C2 W
SMBUS_FUNC EQU 3
) O e1 X2 g1 d0 \' k' f6 f7 Z ! |2 d: O7 j" l- O) ~$ U1 T
.stack 100h
* L- ?5 R, @0 K$ C9 T( `( G1 Q |% m .data
$ |4 i" E( t* ]% `" ~base dw ? ;smbus I/O space9 |& d6 ^ T) Y
num db 0 ;byte select
9 }" R# D# h# xSmbStatus db ?' [! g# @- t# C) M5 t6 o( ?0 G
$ f; t A; y% U8 V
.code
9 _& O. N/ c& c w ) I9 K1 F0 z6 O W4 k
LF_CR MACRO
$ W% s& w) m B7 {, a; q pusha
' g! e8 a# a$ V! ^" y2 k6 k mov dl,0dh
6 E$ [% J6 O3 d7 b+ ]. B mov ah,2
- i( D' s- T" _. S+ r int 21h
- m; c+ ^6 H4 _& e% R# C mov dl,0ah ;next line
7 P7 B4 r5 m6 M- N6 A8 _ mov ah,2
3 i m% ?/ [" a5 e3 }3 I8 O2 C, v int 21h, d" b% L1 \6 M& P+ c
popa
1 R e8 y- W' }9 ^1 k" @ ENDM( E8 ^* \+ P% z
; e2 C" t- t8 }! S2 \
3 S* {6 F- c" d# R3 F3 p1 imain proc far+ S/ Z3 W5 H c) ~4 U8 Y$ O
mov ax,@data; J! m( H, q" o! D# ~+ ~4 x- \
mov ds,ax
6 T9 X4 W5 Y) ]1 p4 M * _7 Z3 q, o/ V$ P# i0 y$ {
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
8 d$ O; H! t% x8 ], p mov dx,CFG_ADDR `$ e/ K* a: R ]
out dx,eax
5 N* c1 W7 S v/ f mov dx,CFG_DATA
0 S+ X' `4 j# h1 A in eax,dx
& ^' o7 n: B0 P
% g+ U; e6 {* Y& C8 N5 Z1 e shr ax,5 ;bit 15-5,the base address
! j# S" Q8 L. w/ s; D- ~6 _ and ax,0000011111111111b- c3 o# a. N6 Z& F( V! @' r X6 Y
mov base,ax
/ i3 Z/ R5 Z# |, Y3 M2 X/ t l$ v' |1 {0 Z- a0 P4 S. b1 s6 V
call ReadSpd
2 C4 ?: [/ H4 U: d& kexit:
- c- H. [' u8 `$ E- { mov ax,4c00h
6 Q4 h$ v/ n2 h4 ` int 21h
# u& ]" ^- K$ E1 Wmain endp- B, G/ z6 e9 h! B" L3 K: o
/ a5 X0 j, Y+ |/ d* _
' A: g# M- g) k- C- ]9 e
9 G4 S. |3 s9 p1 q& o/ m+ \ReadSpd proc
/ B$ s/ O% R' g- M! A& P* g pusha
" e. ^2 L5 ^8 S: w# yAgain:6 C7 Q, y: y6 j1 R
mov ah,num
- K' `2 Z/ M) A# Y and ah,00001111b5 x m! \& S& L1 z0 \2 w B! h5 ^' O& x6 Y
.if(ah==15d) ;CR_LF
& i: J4 G2 D# y& {' M" F LF_CR0 b4 a9 y j4 }& I) U% F# S; X% l
.endif
7 Y' S7 m1 Q6 D# g9 W ' _# Q6 i9 i+ Z* L( P
.repeat0 D. c5 O7 j" A
mov dx,base ;reset host,claim host in use, i k0 k2 F' J
add dx,07 a1 M% w! k/ D' v
mov al,40h
1 r! S* X, y% R! ^; R4 V5 w out dx,al
+ n3 f r9 a( r6 k" S9 Y! [, ` ; n$ U4 v* f0 j/ Q! u; N
mov dx,base
4 n( {1 v0 o$ f, O# D in al,dx- d5 E! D( F% Q' |$ a9 m7 K6 s
mov SmbStatus,al) Y/ @9 u& D [9 F* ^0 i5 p
) }# g2 Q3 n+ Q! Z
mov dx,base ;clear all status bits
7 o1 ?' u4 n- B8 s, o7 N mov al,1Eh ;host status register
D5 ^- H! E/ s. _6 z$ e7 C* J# S out dx,al
; n, {" t4 f# J1 x" D1 ^ & H# s P* n4 ?9 W) M! a
mov dx,base ;set offset to read 8 Y6 ^% u* J+ l' l, Z6 |9 b
add dx,3 ;host command register& m; k8 |, l4 B! Y3 @" e# m/ Q
mov al,num) f2 G/ w, R0 @. b# @
out dx,al
3 k3 b* j' p3 L8 B+ F, e( N* f* u
, l0 A' R. B* ~% O/ h, C mov dx,base ;Transimit Slave Address register9 N6 T9 E; N8 _7 s9 ?0 ^
add dx,4+ |$ @ A1 \1 p" C( V5 e
mov al,0a1h9 V' r) s+ A& A, t/ K ~/ @+ A# u
out dx,al
9 j" M4 w! [# C, R / V8 x& a/ {2 _( N9 T2 n
mov dx,base ;set "Read Word" protocol and start bit
; i$ Y( U) N8 t; i5 a1 ]) v add dx,2 ;Host Control register) t+ E; |0 O5 P- U% D' @
mov al,48h : e0 @1 a3 {6 }
out dx,al
" C2 E7 G) r) ^% {: F, l" r& {6 @ s0 ^ ) H8 l& x, w+ S% @) a
h0 ^# E: N l6 H$ }$ X
2 F! @/ y7 \6 J- h6 o mov dx,base
3 I7 ?. B9 c$ r+ G' ]! F/ N" H in al,dx
9 Z2 Y4 G: Y- @ q' Q* S$ `/ K mov SmbStatus,al
# O% P% ~- u" o% P; j; d' g9 y and al,1Eh V, n6 r" O0 U. X1 ]4 u) S6 q
.while (al==0) ;check repeatly until any of
! }3 P$ p+ _* o# K z mov dx,base ;FAIL,BERR,DERR,INTR
" ^* p( h" `/ N. q0 A( F. w in al,dx
2 y) x( C+ O5 y/ O/ s) T/ K mov SmbStatus,al) B/ |, ^& L+ [+ C* x
and al,1Eh ( ~/ U, u7 \/ S7 b# l
.ENDW
7 Y1 B) H8 N* e1 V7 P: s
' ~5 |& w A( K' i0 V. J( W mov al,SmbStatus / a L# E! [# H) U. _+ |
and al,1Ch
# n# F5 |. K' }0 ]. {8 G$ v .if (al!=0) ;check for errors
" C/ {1 _# m& T, g& l$ Z, L$ d+ l* B$ ? mov al,SmbStatus
9 s* n* p0 u9 |4 h2 {3 b& f and al,08h
! e' @. K% w( L .continue .if (al!=0)
$ ?" T ?8 [, F& `, p& | jmp @F ! j9 Z# j+ [3 Q, `4 A
.else. e- D) Q* f% ^4 H2 O- Z1 ^
mov dx,base# I+ ]# f8 y# `& a0 L
add dx,5h
0 a5 Q) f3 v3 ]" |8 O' a in al,dx 4 G: x1 C6 G1 i' C: O3 C" `
call binhex
- ~4 i* L P" x/ {- S .break
7 T. c* @/ S( c! _- |% m .endif
& o! _! \+ H' y0 [' ^( G( I ; \! N4 x' M- u# Y. V3 Y( H
.until (0)
8 Z! i+ {' W/ x1 _! A
2 R. j; d) l, E, {3 k1 M6 T8 T
9 p. C. G( J& |, s0 \ 8 F4 ?3 Y; G+ @; b
mov dl,20h ;output a space
% ?9 ^: s- j! p& b mov ah,2
! b1 O! k/ {* x2 O! x pusha
0 ?# W' Z' x$ F8 u9 b int 21h
- s% b% K; y0 l' F5 q: r+ h popa
$ q, z" Q+ n+ T9 B! X& O. A inc num
3 N! s$ h( c' H( J: H0 ]/ k$ k$ O
cmp num,80h ;get first spd 128 bytes
$ K O' O% M( K6 q/ G9 o jnz Again) {" Y: [# n. T* A7 G
$ |2 F3 O, |" p5 f& J1 @' D
@@:$ g! O. t5 ~4 J3 c. m$ @
popa
" D" @, V1 ^4 J" W, ], ]' O ret, w, X! Y" b" O ~
ReadSpd endp
* S3 J4 F# \9 p- ~& j2 x: ]6 Z. l2 h% V- J; ]% U4 ?/ M. r0 B' W
% v3 G- r' n5 k0 G7 C% i4 I1 T# U8 X% T# B; I
binhex proc & n9 {8 l# U& S! q
pusha
" } g8 t D& x, I" Q, J, v" Z / S8 W q3 i" {7 v
mov ch,2 ;2 hexadecimal digits to be printed% J3 p( J9 L {* v
loop3:" w M! B& U- v8 y
mov cl,4 ;bits to be shifted. K9 b9 r. l1 e4 @
rol al,cl9 N9 g3 c u' y6 W" K
mov bl,al- j2 `/ q. B4 c: p0 L( f4 D, ^
and bl,0fh ;mask the 4-bit Msb
; r2 d E- G! Q2 e/ Y add bl,30h
6 c. a' h' v' A& \ cmp bl,3ah2 X* v9 S' R1 M
jl next1 ;number or alpha?4 s. K1 Z" O5 E1 J2 j. I
add bl,7 1 |# k; v! |( `) J9 R, j9 p3 D
next1:
+ _3 \. F( a3 B) F) b2 C8 f mov ah,2 ;print one hexadecimal digit
' P0 u8 F- G: o7 L+ J mov dl,bl, p1 I1 A- r9 Q
pusha
: Q: L7 ^/ ^% I6 X int 21h( Q3 v D8 H3 a2 M, K% r" e
popa
$ g0 i" H& O5 a5 n5 ^4 i dec ch& ?- o; [0 x2 u G2 t! F
jnz loop33 Q5 Y/ b' u" s. {' u% t
popa8 y2 ^3 i8 C* B% m' J
ret* P( h1 k3 v! q
binhex endp R3 _9 Q5 J3 ]+ i$ u8 f
end main |
|