|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: 3 u7 \9 N7 k7 i& L$ Y
3 ^0 d1 y% k2 M# h, Y2 f% ?
.model small* T P: }: _+ I% E
.386& U) k( x2 @2 U o+ @# O9 l
CFG_ADDR EQU 0CF8h
' r0 O3 D7 z. P4 y) s9 F' g CFG_DATA EQU 0CFCh0 ]/ a; e) m5 H5 r' a
SMBUS_BUS EQU 0
" f* G# E% Q$ a: x1 H SMBUS_DEVICE EQU 310 S: J9 v$ [ L/ o; |
SMBUS_FUNC EQU 31 w' r1 v- a" a8 ~6 |3 ^, Y5 r
# D4 j& z2 u, `+ ]1 }2 T( c
.stack 100h
5 p/ @0 c. u7 o% N .data% Z+ Z. _5 {8 B6 V, X! D) x
base dw ? ;smbus I/O space3 ]5 ?2 o% W/ ^& F+ }; `
num db 0 ;byte select
( {" [. d* k3 s d W$ C. K$ c! WSmbStatus db ?
5 U4 |( {2 N7 l7 F
; v. T" ]' i" K .code% K& i6 y4 X; x
, x/ p5 `0 |$ K9 c' W; U
LF_CR MACRO
$ a6 T! Y1 ]) K1 W6 C( | pusha
: u% p5 i+ g, I3 ~+ Q( ]) P mov dl,0dh
. f1 {( { r/ m$ f mov ah,2
% G$ E+ l' y. M5 ] ~ int 21h& Q) T- J3 N; I7 d. }# m
mov dl,0ah ;next line
- R) g* I3 G5 ^( l. M% C mov ah,2& O' n6 M8 m' o/ T
int 21h+ H4 }1 @4 u' c9 n0 y& F e
popa ( z, Q2 j9 a" U/ @" C1 g+ i' c
ENDM
- o' Y- ^3 `; {7 @2 c. h
6 V3 j9 g0 D( H2 N6 Q
7 D7 Q, H6 h$ J% tmain proc far
1 R; Z* P: V {; M7 B4 ` mov ax,@data8 ?. B* b, Y7 {- H5 D3 z4 \& `
mov ds,ax
! m2 Y- M5 d% Q2 E8 T5 p- \ x7 u ) l4 {* M% e% A" W+ v9 u4 v N
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ ~4 a% ~8 g- x5 n3 K, o& h8 A
mov dx,CFG_ADDR
+ h& C) L7 K& M V out dx,eax
h. [6 M) Y f' E. b) S mov dx,CFG_DATA
. ?$ ~6 b$ L+ ? in eax,dx
& {& {( v/ g& E7 ?5 |" x0 R 6 E3 g- W- l8 P; t5 x
shr ax,5 ;bit 15-5,the base address
5 Z+ G; a9 ? J) e- E$ k) C ^ and ax,0000011111111111b9 h8 ^' l: M0 e u1 k% A
mov base,ax
, e, E/ K6 Y1 ^- k4 t
) J. h1 k/ r6 g5 ~6 t; N call ReadSpd, u# |1 x9 L) `6 r
exit:
4 Z/ w0 \# e. `+ Z5 _( i* ` mov ax,4c00h. z1 \7 y) N6 T% [; Y0 N3 _
int 21h+ d+ z! |. _4 B, ?5 \9 a
main endp
! C+ O' g$ F2 a' h/ [# Z( _# Z
' T+ u* H$ [" }. `9 E
4 e% C' L* P1 L. ]
ReadSpd proc- H- G4 e# v1 M6 Q8 m, b
pusha& o! p8 |/ X z' ~" E
Again:
9 d& u# A5 q, D' c mov ah,num
6 r3 G* ^! G3 ] and ah,00001111b8 o, S, z" d2 F$ u: I# I1 W- b9 [
.if(ah==15d) ;CR_LF
9 d! G: X% { ^ LF_CR2 m/ I1 N7 |4 n; s6 g
.endif5 p4 @) {! o R9 N" X$ I4 Z+ c; [
! B! k2 A% P& L
.repeat
* `7 L. Z; n# p2 a mov dx,base ;reset host,claim host in use
) A9 m, D- U( q/ x# p add dx,0& I7 }+ p. y9 v4 N |
mov al,40h
* G/ N+ N6 p/ L& h+ k out dx,al D( W3 y6 Q, R% H4 w5 p
) `+ y; @- v0 d" V; L& l, ? { mov dx,base
8 k3 O c* y H2 ~9 i2 M) b in al,dx* f# P0 ~6 W ` F2 T: _$ ?
mov SmbStatus,al8 h" h& D0 E# g* g: u8 @
3 u3 a9 p. o) i- ?. b# c- D* ]
mov dx,base ;clear all status bits
* D& ]' a6 Q* T/ x1 I) [$ K1 H mov al,1Eh ;host status register+ L1 e, R. q( g$ i7 ]1 ~9 s
out dx,al
. U/ I& R( k5 C& p0 E% \5 d
, q4 d/ U0 B0 p9 u mov dx,base ;set offset to read ; t* |4 q4 z8 X" ^
add dx,3 ;host command register( m5 T) }, B) r' n
mov al,num3 `% G3 e; M2 Q# _# j* H7 r
out dx,al1 P; H, Q, @5 u. l: K. s3 P# M: |
$ F% p. v& j4 `$ d4 r9 E mov dx,base ;Transimit Slave Address register
1 E+ g; d; D9 g: v5 a/ r2 k8 X add dx,4
3 K* B }7 [+ j0 a/ c5 X mov al,0a1h' { b$ ]0 ~ x6 w
out dx,al; I9 ~7 \& n3 M9 y+ T- T* v2 \- h
/ g* V( ]; g2 [6 z+ D2 l
mov dx,base ;set "Read Word" protocol and start bit1 |* A) O4 J. |
add dx,2 ;Host Control register, C# x5 N0 h, I' p) g* l. F' C& e
mov al,48h
* L' \3 q) ~! y' A out dx,al
) A. Z% ^0 h5 T/ q- T/ \: ] * A/ Q6 a7 \- Y, ?/ {
6 k2 W; k7 D5 d
4 d, t" p/ c, G, q: ~
mov dx,base* j$ `% }7 q3 O! m' n
in al,dx
) i D' a4 e. L3 I4 _; D. ?; \ mov SmbStatus,al$ ]& ~, ]) T; r# m* _
and al,1Eh
6 `+ x) l/ p7 |! i/ _+ f2 P5 W .while (al==0) ;check repeatly until any of
, D, v2 F4 R U9 u mov dx,base ;FAIL,BERR,DERR,INTR$ X& b6 i! L! v9 x& W: }4 l
in al,dx
+ }- j# R7 E3 a% b# J mov SmbStatus,al/ q& x; j9 e' {2 [( N8 _
and al,1Eh
8 U5 ~8 k7 V2 p0 y* b0 R9 I! }: ~ .ENDW' A8 f( S& Y& `
) c& T2 B& R6 {% t+ U
mov al,SmbStatus
7 ^ c( t" r+ `! g: K3 | and al,1Ch
6 Z5 V# x& c+ G$ ?/ i6 k1 c8 x3 l) b .if (al!=0) ;check for errors 4 W2 z- k, @$ r+ @: _, _
mov al,SmbStatus H( L8 c" O) g, n+ I, A" a9 i$ j" N
and al,08h
$ y/ e) n$ D; V# k; q .continue .if (al!=0)
% H5 q2 j( c: C* U7 H: ]+ s7 G jmp @F
8 _. ?3 i0 S$ {, R9 s .else2 Y% |' @6 a) v7 T
mov dx,base
; X( ]% @; X+ W- M! x2 v M8 D add dx,5h- s) `& o% n0 U6 |) B2 W! o
in al,dx
0 J5 \, e8 F" d+ V call binhex 6 \( o. i' j. z' G+ ^0 G+ I
.break
0 ~& L* R3 @: @" M. ] o; y .endif% m& Z5 R# X8 c
6 x# y' ^* c7 I d D6 _# |, @2 M- ] .until (0)
* S' a( ]% w; B/ h c 3 \) p4 |; R& s1 L2 |
F; l; f5 k% f& P% R7 c
/ m+ [; O" _' ?: `/ F mov dl,20h ;output a space
D0 p3 v( P3 B- G mov ah,2
9 O; t# b! K7 e1 E1 }* y) { pusha
1 [* A- h% W' N int 21h* L* K ?* u+ \' y) ]6 G
popa
- L, F4 T: k0 D& ]1 | inc num& R* d% p0 y0 v, O3 g; U
3 N! k+ l* f' f2 a0 y8 Y cmp num,80h ;get first spd 128 bytes ) S: A/ J' B* j: j8 H1 j0 Z; B3 c( s( g
jnz Again
% k8 Z5 { W6 U7 { - P) @) a+ _/ @2 d4 H
@@:
, m- b6 K( r4 _$ U6 H- b! f# c popa
% w: a4 C) O1 `. V$ n5 x ret9 W4 d% p; p+ |, [3 t
ReadSpd endp6 w; y N& p6 ?; ]! {& m
# F8 f+ p) y; U' y; p
7 H k1 y X7 Z1 n9 a/ N" t
. ?+ a& ^; Y6 u n. xbinhex proc : ^, C$ V9 E6 \
pusha * F1 a/ Y9 C! W3 e \( O: n
) b$ B' C3 @2 q0 s& e1 E- N mov ch,2 ;2 hexadecimal digits to be printed
3 f2 B5 I& ^7 c: K9 c" c+ E& aloop3:
/ t F! h, K5 R6 C5 Q mov cl,4 ;bits to be shifted
5 [: L; O! e* t, _+ [+ Q- p4 h: a+ \ rol al,cl
: l7 {: V) k, v" P mov bl,al
% A; l3 C1 T. ]+ J; f# T1 s1 i; K; B and bl,0fh ;mask the 4-bit Msb
% _% I( a+ q# W6 E* h5 ^ add bl,30h
1 z, ?2 `0 E* p' n cmp bl,3ah$ _- x" E. X' @1 k/ |2 J
jl next1 ;number or alpha?
" G8 {8 m8 q9 z0 v8 ? add bl,7
) G& ^2 M$ B$ u# `1 ~7 \next1:
9 Y. g9 c! Y( \! W) {; C6 V# m mov ah,2 ;print one hexadecimal digit- R$ ~& x' v4 o3 \+ j9 R' m& p
mov dl,bl( F3 k0 b1 J: p) L9 @/ z
pusha6 R7 i* ?( H2 V* b
int 21h
) h/ C1 F3 ^. F2 K4 W+ S" j popa
6 E( t. u: F( N+ r: W dec ch, ?( Y2 t- x4 T& y) z# l; H# t
jnz loop3# R1 [# g6 [; q1 y
popa
/ ?3 T1 o: t6 ?% \5 ^ ret
3 X0 E$ g$ ]8 [" [2 j I9 _binhex endp9 `9 Y6 L0 _" s8 {
end main |
|