|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
$ V8 Z, h2 W' U- K3 @ S( p4 L9 u$ l( c x9 n, w. T" p$ A# c
.model small
& Z$ j; W. l+ E2 I6 m .386, ]2 E' D3 S( B& r6 ?3 i9 j# c
CFG_ADDR EQU 0CF8h4 |; |, W6 ]% b+ Z) |3 f, C7 B
CFG_DATA EQU 0CFCh
( |( ]$ w5 c' a SMBUS_BUS EQU 0
2 `* q. s4 r8 W8 [; }4 z SMBUS_DEVICE EQU 310 K b( W9 J8 d
SMBUS_FUNC EQU 36 ]" F8 i* B. ?4 O0 @
& R; d9 j. b8 X. r* p6 s- W9 J% s9 V
.stack 100h9 N ?7 _8 T, F2 H4 P& n' m
.data. X6 L6 h; ^3 U; [" q4 n$ p* s( _/ s
base dw ? ;smbus I/O space3 A5 \9 I! l# f7 h9 E3 F. Z# M
num db 0 ;byte select% K6 q+ N( G: p
SmbStatus db ?5 J# Q; k5 E" l
2 [* W, ]- X% G, ]
.code
# C+ f$ d5 H8 ~2 e4 F 8 r9 K) q5 j) v9 \, u( x# B3 V4 ?
LF_CR MACRO
/ \0 _5 _% k' B: u$ m: Q) ^% X pusha7 S. N: i* q: U' H% [' ]% g* ]: b
mov dl,0dh
' z* V. f: U. I% A6 `, ]) P mov ah,2
1 j" q" W% X" I! A' m5 P int 21h
) J7 W9 t! a& f mov dl,0ah ;next line
' K: |# i2 o4 U8 b% A9 u mov ah,2
; v9 [ m& _! R2 g int 21h
- e$ D% u) g0 L( }& D popa $ f8 R! c) l; ?, B/ q9 Z% `
ENDM
: }0 b: N* |- V- @0 X2 l& v* i$ G4 C4 M) }' Y
* S! z; a4 h% W
main proc far$ N0 V% I# P: U; G Z# W
mov ax,@data& T+ g+ c! g$ L% b) e: J
mov ds,ax/ M2 T' ] \0 x3 C, `4 h# ]
) A2 t' m, r; Q2 b mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h5 H) U9 n6 N! q t/ ~: p
mov dx,CFG_ADDR
6 i& Y5 F% X; [% ? out dx,eax
* ~' q# ?7 B9 d, ` mov dx,CFG_DATA
! M+ Y' F* d/ P0 y9 ` in eax,dx4 A8 y4 E9 u* ?9 P" U
9 G9 Q3 o% f- K shr ax,5 ;bit 15-5,the base address, v& h2 H/ h' X5 v( x0 H
and ax,0000011111111111b
. D' u$ G- u3 f2 a* D; i; U mov base,ax
9 [$ g0 a1 ^; S9 ?0 G
g F) o+ K z! |% k call ReadSpd
" g; @. ^) ^7 D! T" e0 U9 S% [exit:
1 `/ ]- O; ]) Q6 j6 J mov ax,4c00h2 L6 f/ V) ]' a+ u% J: K
int 21h4 _; i8 a6 w( A! t" u
main endp7 w. @' r' X$ U) ]
) ^/ C- f( N% {% L) |; \- D5 U# i+ c
8 a% m) U5 A, h9 `- U) u L
ReadSpd proc% j6 m- l+ R1 S( `5 K
pusha
4 ?3 S: x/ p4 i) ~2 x4 n' |* KAgain:
. y b8 s2 W M! b3 O1 N mov ah,num9 x1 w* u% @" `4 i3 R
and ah,00001111b2 r6 I& w) y {; D9 H
.if(ah==15d) ;CR_LF7 h% }" q) c: ^ O
LF_CR. a& L C% ^$ V! D* s
.endif. M$ E" k* H, Q9 O
+ `3 H% P3 X0 B
.repeat
9 p! t5 c4 P0 j% a( t mov dx,base ;reset host,claim host in use
, V) j& C" i6 M/ N2 Y+ a add dx,0- B8 z1 @# @" N! w8 U9 S Q
mov al,40h
$ L) l) v. P8 O- X out dx,al* t- m( A% ~; j( I. R
0 u- m, i1 G) r/ ] Z mov dx,base 0 d8 Q, a: Y: [: X0 c
in al,dx* s$ q: L8 x& N/ d" |( b* n* ^9 z
mov SmbStatus,al
; k6 k; [+ P9 v) l2 i3 X* ]
, ~4 \. n( I3 X% [/ |9 X mov dx,base ;clear all status bits
3 j/ R( F7 C- n$ S mov al,1Eh ;host status register' B/ W9 `0 A u( r9 U+ k" N
out dx,al
: V8 |9 V# s, n' b& g / z" Y7 s" I2 ^# ^, S( L+ V
mov dx,base ;set offset to read & H# b; I X5 o+ W6 R
add dx,3 ;host command register
! G* C# j( h7 S mov al,num7 W; e- s# B. o+ J" o; B
out dx,al4 I2 N# q8 F3 j l g4 K( Z& f
: u" e, x# [- L* V. ]9 O
mov dx,base ;Transimit Slave Address register' D y$ E, n8 B# |
add dx,45 \" {# A+ w5 ]
mov al,0a1h2 f8 m# ]2 P1 I8 B' t" y, [
out dx,al
$ s+ M5 P- \; V5 Z5 a# c/ O& L/ } % Y5 ]7 B2 [! F$ Q M. Q3 g
mov dx,base ;set "Read Word" protocol and start bit6 w& V( p$ d$ ?! `, O" o8 ~
add dx,2 ;Host Control register
$ E5 i/ u2 [3 T( Q8 J0 D# d0 F mov al,48h - R5 s5 B+ p+ K3 `9 u# }6 I
out dx,al
6 Q( m A0 ]7 v1 I 3 U$ p- i D$ k3 p, @5 W. w
3 w7 H7 h* s X: p1 n# i; I
3 i/ F4 v' v) N9 g. d- A. \1 Z
mov dx,base/ N2 g' J% Z% h
in al,dx: z# U3 b& ?3 N- b
mov SmbStatus,al: c: O. m+ a- ]; ~+ b( X5 R$ D
and al,1Eh+ G9 L) N# Z4 t1 I7 }: \! C
.while (al==0) ;check repeatly until any of+ Q0 q3 Z! D& X0 j0 _+ K
mov dx,base ;FAIL,BERR,DERR,INTR
' P) k. H6 ]+ S in al,dx' {. e: W! ~5 Y- c
mov SmbStatus,al
- X' w6 M, h# p9 E and al,1Eh ; }- b; X2 c5 F2 w A& P$ q
.ENDW
. ]. [, [0 |: {' ]
& m: c$ R1 b4 L! b' I9 ^ mov al,SmbStatus
2 R0 r$ O& o- a+ z4 W! a0 P/ Z' J and al,1Ch
/ d( O) h" C$ \3 A* R .if (al!=0) ;check for errors 5 R. @7 X; e8 C/ [- p8 s# O
mov al,SmbStatus3 v6 ?8 f5 _/ Z' l% P
and al,08h 8 U# G, P5 X' v
.continue .if (al!=0) ( {! a3 f# h0 {; t; c! j" M
jmp @F
( r7 b! C; n$ O ~ .else1 N+ R/ i+ t/ f! q q1 R4 ]
mov dx,base
$ k1 r& o7 M+ R' @4 g: _" Y/ @ add dx,5h# D; g: d8 f* X( ]2 ]4 I. c
in al,dx / C/ z/ e/ r/ t
call binhex / z% Y- A+ f4 B, [
.break3 I3 c! d! v: g: A
.endif* q4 k9 r0 O8 C0 U
. I- B) k4 q$ I9 P& }/ Z# ]. w .until (0)
5 O, k5 \" g' ]: y" c" K& r( ^0 Z
, `0 d6 E7 W8 }% {" q# h . c/ ?8 ?3 j. m6 U" J+ C
: v6 M) J- l# x+ H( d. _7 r
mov dl,20h ;output a space% y$ @: q- O1 j. v$ K" `$ ^$ I( {
mov ah,2% I2 q$ Z0 D' y- [$ T, c6 j
pusha
2 k) V$ u) R9 }. Z& R6 P int 21h8 l( B7 w: {6 I4 m# A9 O; G
popa
& m5 y! q6 L- M6 x+ S. \ inc num
6 }2 `2 G/ n0 M, }, d3 e2 A
2 C. g) y; x! R# K cmp num,80h ;get first spd 128 bytes
- _8 e' L H' V' L jnz Again. A L8 o5 n1 D7 U1 m
2 G. Q$ k; k0 N1 q& L' }% z' g0 s@@:
& Z' B" \ P# N9 ~6 B8 | popa0 V" c) h8 r3 C: V G
ret
a! G) n" h$ lReadSpd endp; g+ _" \) ~6 B8 z5 a7 W
4 u. w2 C; m! P; [' E. x5 r
" W2 u; t# p: k' D; A- X0 U4 S
8 _/ A+ f7 O6 e* mbinhex proc
* j1 `5 f- G! C: L( {) X pusha
. h2 y2 x1 {3 {/ z( x
1 M+ L- g% o% ~1 S$ p) e) d/ J mov ch,2 ;2 hexadecimal digits to be printed
2 ]* y0 I' Y' _1 V* y4 Z: M7 wloop3:0 T7 `$ G; H5 z0 u& E
mov cl,4 ;bits to be shifted
, Y7 ?; z8 g }. C- d$ t+ s rol al,cl
2 _3 \& O+ y& L+ s: \9 ? mov bl,al
. t9 Z2 F% d, p# x+ `8 m- _* d. d and bl,0fh ;mask the 4-bit Msb1 r3 k) n' G6 v; {0 U' Z
add bl,30h
% O8 G* _6 i, g0 R5 m cmp bl,3ah
, F# e# }8 {7 t$ q4 q jl next1 ;number or alpha?" L, x- E& t( W3 G( ]
add bl,7
+ S( Q$ {% y0 ~/ X' t @1 Rnext1: ' ~' e" m7 R6 D$ |4 i% ~+ u) D
mov ah,2 ;print one hexadecimal digit
! f( ^, @, z$ o- q/ F L mov dl,bl
6 I0 ~( A/ M) d4 Y1 D2 @! b pusha( N6 Y4 C1 D% g/ f8 ^* F0 F0 ?% e
int 21h
, x' l6 B2 i6 k* \5 I/ e% Q/ H# K popa9 n$ @5 f" z9 ]- L0 Y2 h( O
dec ch0 s/ J! r+ I' U H X" {
jnz loop3# ]3 Z, O# i" b9 t9 T* G
popa& X, l* j- c" @ R' r4 Y, O
ret: C* Y$ ]1 f% F T7 e$ ?" M
binhex endp9 h% w* s# H. g. h w0 J0 K9 ~0 e/ Z
end main |
|