|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
1 | l$ |8 [1 K k
% c$ l- s- z6 ~# \ .model small
& `! Z* o9 h2 a; o8 S .386
/ ? |* D2 h; H% {- r* X CFG_ADDR EQU 0CF8h
3 e D4 N3 |% ?- j( h CFG_DATA EQU 0CFCh$ } H" f; L* V u1 n
SMBUS_BUS EQU 0
9 r3 h- `+ B# U* v" A1 G- W! f SMBUS_DEVICE EQU 31
! B# U9 r) H2 J# V SMBUS_FUNC EQU 3
/ N' J1 f& e1 p$ U3 e9 [ ; p0 ]9 @4 k) X5 s# m/ W
.stack 100h
- u% w, }* k# a7 U. [" j( c .data# X( X n5 H9 u8 ]. S" C7 i+ m
base dw ? ;smbus I/O space. b" ~( C6 `& h6 e
num db 0 ;byte select
/ ~& O4 C/ j# dSmbStatus db ?
8 r& }0 w$ W' y$ a- J5 g, m
; v6 c+ B8 F( M, N .code7 q: R' k6 e- }. E* A
+ A6 T; }+ Z7 d" n1 K' lLF_CR MACRO/ ^3 k5 R% x0 O$ Z% s: a" b, A7 l4 k
pusha
2 W( s7 r. c$ N0 n2 B9 z3 V mov dl,0dh
: p3 {5 A3 } | mov ah,2# Z$ b* y) @+ B7 k% C; Z/ R
int 21h
1 U# K. t" j9 z' v6 y$ m5 A mov dl,0ah ;next line 7 J+ R- m. V7 i
mov ah,2! J1 Y" b0 P8 G
int 21h# ~+ I8 A# |. u+ p0 W; O. M6 R' [) s
popa . v5 r! D/ U' y+ `4 I1 s
ENDM" a7 c1 V' w" t2 @
9 A8 v3 `9 o: r' V8 w- j
. X8 S* I8 I6 C Mmain proc far7 l3 G$ ^# U* S3 z B$ M( M
mov ax,@data
, R* C5 ?7 y. V# ` a H; o: o mov ds,ax
5 i' {% i9 l7 Q& y& S6 M3 \ : s+ X) \$ W, K) g
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h: o4 E' A% M) o) X; d0 O
mov dx,CFG_ADDR
% m/ ^" V" p, F' W out dx,eax' b4 }- F+ ^+ t7 u, ?: ^
mov dx,CFG_DATA/ h3 p5 W7 F$ W V7 [
in eax,dx1 \+ }. p- C, W9 E: g
0 p8 m: [# d h9 X, \* r
shr ax,5 ;bit 15-5,the base address
5 z k5 K0 H% g5 O, l6 F and ax,0000011111111111b9 z" P3 s9 |) g! U) |4 i$ r `
mov base,ax5 J1 F- T; }2 O
# c4 ~+ t _* Z3 p1 Z( s9 D
call ReadSpd
8 Z: f2 @2 g; V0 x0 w v Hexit:8 e$ C" p% U# i2 {& @' }8 |
mov ax,4c00h
0 G. Q2 x5 z& i7 S2 f int 21h' v" Y. f5 T$ M
main endp
! S/ }6 S5 ?( R8 r3 d1 z$ d* k
0 j: \, r ~2 r) B T" f2 e* m- J* }: p X* @1 B2 T
+ u9 g/ x+ _3 i g/ q0 O1 K, D3 K
ReadSpd proc
" \! c" E2 h/ m6 j* L1 D pusha0 x. }7 C+ T1 t/ K' W9 u) X
Again:
4 j3 p J2 A- H/ D: q mov ah,num
: r! f. i" ^8 S# h0 N7 _ and ah,00001111b o# W5 b& y3 ]
.if(ah==15d) ;CR_LF
& h7 W( e f& G LF_CR
) m. r- x) k6 i' f3 m& \ .endif
1 F8 c+ j& q3 P! [; K" q
: {4 O0 @9 W! Q; ? .repeat
* G7 {& b& }# \/ j; ^' o mov dx,base ;reset host,claim host in use
- y' p4 K( I4 m& z/ ` add dx,0
7 M! V$ z6 A y mov al,40h3 z. N) a8 C" r' E1 s6 e/ E* C" I
out dx,al
' |7 ]) H: ]! W
2 x. x; X* [* q1 e2 ^ mov dx,base
# h3 j; }( y2 ^$ I in al,dx0 \9 s0 q8 [* |% f6 U D
mov SmbStatus,al
8 ~9 G' t2 K% Y0 Q3 z; v
2 J6 B6 M+ c/ p$ O3 v mov dx,base ;clear all status bits* ^* |. e8 H- W0 H8 Z3 l8 H
mov al,1Eh ;host status register
$ I; O. g' R* h9 _1 e5 { out dx,al' ]- o: \. n- O, z) U+ M
5 C) l; z+ j) h y" L, m$ e- u mov dx,base ;set offset to read ; T0 B5 W# R; @1 K+ v
add dx,3 ;host command register
( ]# ]9 h# o+ b% Z8 ` mov al,num6 q- {# x/ ]% P$ j0 M7 @
out dx,al: z$ k3 l5 I+ |
& n# I# |7 u9 j9 t/ T mov dx,base ;Transimit Slave Address register/ V* W( B- @; E0 C8 Y. ?: ?/ u
add dx,4% N) W1 \1 U. q( f$ r8 r
mov al,0a1h
8 S' a* e" z. G9 ? out dx,al- a, U; O7 V0 h* V( x; T+ Z
) ?7 I. n) F2 z( f1 r5 j7 d
mov dx,base ;set "Read Word" protocol and start bit
m8 ]! M$ M( {- B1 b+ q" D% K& A9 O( A2 | add dx,2 ;Host Control register4 f. S) `7 W7 g! ^ u4 B) E5 \
mov al,48h # p% h" w) G7 ?+ K, }2 \$ l
out dx,al
0 M0 p3 t7 b w' m: ~. p1 T+ X6 C; \ & e r$ L, ]1 |1 V/ [
2 ?- S. L7 Z: ?' k2 R$ a4 I9 F
- Q6 l* ]5 L4 R- K1 G mov dx,base4 N8 ?+ o* H. s* I1 \" j9 s, N! U# n
in al,dx+ s t" H) U4 n$ g
mov SmbStatus,al
) H) Z& J% H0 J; }1 N and al,1Eh
A5 E( m }, X .while (al==0) ;check repeatly until any of; O& e+ ], ~. t
mov dx,base ;FAIL,BERR,DERR,INTR
f2 Q# s* W1 @; s' I- b, q5 [1 ? in al,dx
) I( @ G- l2 _" |6 L N% z mov SmbStatus,al# w, A5 H+ Y; r2 D/ R t
and al,1Eh " ^& O% m/ T& ]- P8 M9 d8 v
.ENDW v5 a$ ~# u: Q' Y" z9 `& y
( Y9 r7 W4 q- n/ D mov al,SmbStatus + I5 [% a: J9 j: c! ?. ^) D; o
and al,1Ch
! Q+ ?# B, ]4 B x .if (al!=0) ;check for errors
' W \( j) `/ {& b, B. F# a# n# V: Q mov al,SmbStatus5 t: y E2 z; J9 }$ d& V# i
and al,08h ! K% a- i: r+ ^: {& `
.continue .if (al!=0) 9 a4 F6 X, t# p" g' l2 B7 g) [& H
jmp @F 7 h& x w ]+ Y; u9 q/ A' T+ h
.else
$ G4 f& n3 ^+ h4 J mov dx,base
$ S# {7 v5 Z. Q/ v# l add dx,5h
# J$ t7 A" g! L8 A* J in al,dx + H+ q+ O1 v, Y5 k# T9 w
call binhex " ?) U$ q" |! C: S* I
.break: P; S" u4 I4 L6 x8 l9 V( Z2 p: V8 Y+ o
.endif* l- A2 [6 k N9 V& ~1 p- W" ]
8 o0 M& e& e( c( _ [# d .until (0) ' k$ \% l1 V h5 K' s) b
l9 N: R$ O+ m# e' c" Q ) }: t% X% g; ~# k4 V
. @5 M2 P% T) v: W. J3 b mov dl,20h ;output a space. B4 Q( F- T4 o" ~
mov ah,26 X& P/ `4 f9 U
pusha
" S% L* c- J. E, z6 } int 21h. ^* ]+ p$ g2 b3 _2 S
popa1 t- D8 b( g# }, b9 H& i
inc num
- j9 c& \/ q" ]! Z
8 w! F" J- P' E cmp num,80h ;get first spd 128 bytes 0 p' ]; `- j1 J! m: a# Q$ z7 r
jnz Again& b$ B) X' ]7 o5 c
9 {% O5 w1 o0 P
@@:$ U2 }, s: d! A+ W
popa
8 Q, m; K8 z1 _1 M! Q0 ^1 ?3 w) e ret% P. U, s2 o3 h' D# I
ReadSpd endp5 z2 Z9 |& G9 `) r/ k" J4 t
! r- C: {; n; g8 J) ?
7 U, ?$ d+ e0 g) W) A8 [* _8 D4 m8 _/ g& a3 _
binhex proc
2 K; K, p- n9 X1 ?2 S pusha & g9 h) q l; ?1 o
o2 z6 k7 s; }' r( B# O* M
mov ch,2 ;2 hexadecimal digits to be printed
* m) X( v6 h9 u8 x+ kloop3:/ L1 Y4 k! d# x$ ~0 }9 q$ e9 p
mov cl,4 ;bits to be shifted
3 L) a! i' q* g7 v7 f3 X/ t; Q- C' \ rol al,cl
' l/ \ N/ X' n1 H& a7 F mov bl,al& X1 [4 |: q( W& L
and bl,0fh ;mask the 4-bit Msb/ |, N3 d4 Y) S# @+ R' S
add bl,30h
/ ~5 Z5 h$ J2 [; |$ K4 t/ R cmp bl,3ah
' A: `+ d" x+ t3 g3 j9 A3 K, L jl next1 ;number or alpha?5 |# q" ?( w5 |% m% X# q8 o
add bl,7
f1 L. ^9 Y6 w* Knext1: L6 `: C {- ~7 A) G5 I4 ~& {
mov ah,2 ;print one hexadecimal digit
) k" c& S2 t( i( S, O( v mov dl,bl: s6 n' b$ ]# v$ N* J+ `/ h# \9 u
pusha5 N" d2 |0 e/ w& _' i* P- E7 `
int 21h# `$ ^' E0 G- u+ w' e5 {. }( L
popa: n0 d2 `* L' Z F! ]* x
dec ch* u7 {& \' g Y- v4 d) i
jnz loop3
7 |4 K$ |% }# a1 e popa/ D; L4 C/ A) A" i6 N7 x6 W
ret
* t4 I, C& r4 X" U) dbinhex endp
$ H+ \! ?3 `: L1 f end main |
|