|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: & k2 {$ {# r+ L1 Z
! I& H1 \' e1 E# d: W0 y* g
.model small
# S6 g: U) C# C; t .386
/ N$ E' B6 T# a" c CFG_ADDR EQU 0CF8h
0 x: |: D" L5 V CFG_DATA EQU 0CFCh
3 ]. J5 ]0 }! H SMBUS_BUS EQU 0/ w8 [, o |$ s6 e }6 X
SMBUS_DEVICE EQU 31
. t& X. a/ A- ~- m7 u SMBUS_FUNC EQU 3* s; n( y, U2 s
* E# v6 K5 r( Q$ `2 Q
.stack 100h8 l _; t+ c! ~- ]& p" m/ R
.data
m4 [! A) @+ A9 Y( gbase dw ? ;smbus I/O space
- N3 x6 P: H5 @num db 0 ;byte select
$ n k. z5 W' o1 U2 PSmbStatus db ?
: G+ m$ r- V+ r) k% s
4 \$ D1 D' M' o1 ?; o; M .code# I, Z! ]. y, L: o
" E& e1 d- d! t! U/ l5 F6 S3 Z) V' }# {LF_CR MACRO' O J) g5 {1 s, a8 w8 O
pusha
' N# A( \/ D& t9 P2 M mov dl,0dh
4 j$ O: F7 P8 p9 h# V; A+ \/ W mov ah,29 U# ~/ l/ _* T4 Z" N' @8 l& r
int 21h% n1 c n1 ^0 S8 q* | w2 ^6 U
mov dl,0ah ;next line & [( w' R1 ?4 @& G: s
mov ah,2$ n9 \( ^- b: I
int 21h# q6 i0 `3 F4 y! r# j9 g& r3 {
popa
% _/ p9 G; S7 ^5 W ENDM
/ i r4 x0 W0 e6 S$ }7 I3 ?
) f, C* R2 e2 H* ~! O; k( X; @% R+ i& i) ^- F& {9 X' J: w* I
main proc far3 o# `0 U3 L. c, Z' z
mov ax,@data
# U3 g7 z+ r) F3 p+ f y! f6 a mov ds,ax0 P( M: G$ J/ j7 {8 ]
$ |$ T# d- W4 O2 @: R mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
3 T/ i. \0 P# T mov dx,CFG_ADDR
& B& p! }2 W; C4 x' r out dx,eax
$ P2 h2 g" @8 M mov dx,CFG_DATA
" Z+ o7 h f* M# A# Z' [& M3 V4 R7 T in eax,dx
4 W: v; j& p8 R& h& H $ i$ Y( l/ Q) w9 k5 {
shr ax,5 ;bit 15-5,the base address
- v( K0 `% {- _- j+ W and ax,0000011111111111b
+ m0 U0 U1 ~1 q7 l6 f1 F9 o1 H) U mov base,ax
4 Z# a |: ]# I
3 o6 g) n4 v' m9 m9 t1 N call ReadSpd( _, E8 X1 c5 \+ z" u
exit:! v, N' g/ K% J" ]
mov ax,4c00h8 C s% X' s, ^ o7 u
int 21h# R7 ]( c4 T/ |8 A/ c9 ~/ h
main endp
* _( K3 `! s& d' \* w/ t
. ^* F0 c) Q" ^% r0 I
3 g7 L" j$ U. Q6 D7 R# L/ v5 k- [: S0 \8 w
ReadSpd proc0 O% s* w; p- b5 l# C% D
pusha6 @2 N2 q9 ~ v7 l7 a& j
Again:
5 W$ w' n. z. }* R4 u6 @( I' Y mov ah,num
- q3 z; u/ q6 x8 z, D. M and ah,00001111b
3 `% M7 F7 a y. ~ .if(ah==15d) ;CR_LF
+ a1 h- C6 @, r$ h LF_CR- I8 }6 M+ P+ O% p
.endif
& a5 y/ U6 W1 u; p/ D3 ]$ A- t C* v4 S! C4 x
.repeat; y2 f$ H9 ?0 d; f; V- `
mov dx,base ;reset host,claim host in use
; _7 ^3 ~, P; L add dx,08 k) p; y- \: o
mov al,40h5 V0 b$ O( ~4 n6 l; m
out dx,al; b* z7 K# q# c K4 T
e# A9 W9 B$ O+ ]( W$ o- y mov dx,base
" |2 g1 r8 J0 A# W7 h& k+ a in al,dx( r7 k! N# p( W3 P
mov SmbStatus,al! W5 ?8 {. S. ]3 @' s9 o3 @
, P0 S0 K2 D, N a9 U3 `. | D" P mov dx,base ;clear all status bits1 S" }. k) G. Y0 w; l# G
mov al,1Eh ;host status register
$ t- [6 l' A* z" @) c$ b out dx,al$ i0 Y8 B5 R, o% f
! a/ z l# x+ b* ]8 `% J
mov dx,base ;set offset to read
2 a5 ~. D9 |- r/ ` add dx,3 ;host command register
9 X0 L( u' n+ k, _& @ mov al,num
! w) \$ V) a( K& |/ f, Y out dx,al
' V1 t/ s S5 f2 r1 S5 T
3 u7 [# o+ f0 F) N" n6 L. y# d2 X mov dx,base ;Transimit Slave Address register5 |4 E. f! p$ b1 ^, `
add dx,4
- v5 m* j1 x) e: e mov al,0a1h9 R1 N* N0 ]: ?) P. k! v
out dx,al% d+ Y5 r0 R# Z* e% ~4 k+ M
+ ^+ Q7 y2 ? U$ L4 U% P" y4 x8 c
mov dx,base ;set "Read Word" protocol and start bit; y& w4 |8 {, f$ @9 r1 v& E' w
add dx,2 ;Host Control register6 K( |- h. F! Y0 W# ?
mov al,48h
$ H. B' T( k4 D! p; x1 c9 V( w4 g. p6 a out dx,al
0 t+ l, C7 K' \. e+ ]
9 |. [9 i8 c- e9 M1 Z4 a+ b# Z ?6 g i' g1 z9 J$ f# i, L, S
7 i: @8 Y( p. j$ l+ i: r
mov dx,base: z8 [" T5 ^) d5 t
in al,dx. i5 ?( O9 ]: E% W
mov SmbStatus,al
: Z2 i9 {% m1 q, {/ b and al,1Eh+ L z2 _4 k8 G) A, j/ v+ F" j
.while (al==0) ;check repeatly until any of) j' b' M4 R. h5 ?
mov dx,base ;FAIL,BERR,DERR,INTR
* f# o }7 [3 H; X8 ?: _ in al,dx
5 U' N: N- y' K8 m mov SmbStatus,al
% C7 |5 I% O3 ? and al,1Eh
* d9 S6 O2 T7 k4 n .ENDW
; k4 A( [+ h9 U$ D' \5 w7 X! a% J& u $ q) V* t7 Z0 i* O; U
mov al,SmbStatus
" |) P$ ?; g5 O, j7 K and al,1Ch) a! Q( B- p+ N! ]2 @$ g
.if (al!=0) ;check for errors
, M; v1 x+ m1 q7 P, c* V mov al,SmbStatus
! d" S' s+ K! A" ?1 K and al,08h
) ?* h) f$ n* B% K .continue .if (al!=0) ; K& m- p3 g Y9 s3 ~0 c9 h
jmp @F & d# Z m( Z/ q, J8 b! N3 t
.else3 j+ T4 `! j" {- @9 g# K
mov dx,base T; `- [% b+ A8 T
add dx,5h
+ Q( z: r' @; P* Y) V' _4 C in al,dx
$ J2 C. v' T: V6 _ call binhex # @6 J6 S9 o, F' ^. v+ R# \3 z' e
.break/ O$ F( `1 J( N7 u! z
.endif: `* b- b9 ?+ T0 M
- O2 ?0 c: s2 I3 W" h( W* h .until (0)
; v' \0 j7 R F3 Z% Y+ e- z 7 A4 J7 T7 ]9 a
& Q, R9 r1 h9 z: N/ | - }2 r/ ~1 H* B7 e: T
mov dl,20h ;output a space1 K% Q4 V9 z% @
mov ah,2
! y3 y( \" h9 p& b9 p5 N pusha0 n) T7 A+ g9 e
int 21h4 u+ s& D6 M& w1 G$ v
popa0 { Q6 Y- z" I8 i
inc num+ @7 U8 p2 F$ t! h$ C \
2 |- c6 \- v, `9 U% X
cmp num,80h ;get first spd 128 bytes
+ ]$ e# T+ r/ ^& _! ] jnz Again
& y# {$ e. C" ? p& z: r6 ? 9 P: `0 p G, ?
@@:
1 T9 M' {) D8 ? popa
# L& h" P. S) D+ h ret! N& C" Q$ x( f7 _5 H; u
ReadSpd endp- N9 r5 I% Z% Y4 P* {. W/ w" m
/ W4 O- M& Z' W; O H
: Z- t% I5 E0 ] g
7 F7 \ q( j7 s- L
binhex proc
I- V& \/ ~# ]* @. K1 T pusha 1 u+ t, u8 ~0 t8 `2 K& B
% _, J! J2 y: d n mov ch,2 ;2 hexadecimal digits to be printed
# T; x- L* X4 z+ vloop3:" a' D9 j! P y9 x
mov cl,4 ;bits to be shifted
3 X8 G% ?9 e; s) y: S. p6 g rol al,cl/ S- ?! L, Q7 w/ Q( F. ?$ J, n* S' e
mov bl,al
7 H, K9 [/ t6 N& ^ N2 W3 W: D and bl,0fh ;mask the 4-bit Msb2 z0 U8 A z) [, y. I
add bl,30h
% H4 Z' @9 c, G( I3 B cmp bl,3ah% r8 {1 U+ C* `7 c- u
jl next1 ;number or alpha?
: d& X4 L( D+ H' `. V4 }! T add bl,7 ( c/ A0 x2 v% X% c! \7 J6 a' H$ U
next1:
) T. ]% N3 V* N; ? mov ah,2 ;print one hexadecimal digit
3 Q5 E6 I: n2 v2 |0 q8 Y mov dl,bl
* @2 ]! E% N0 [/ k5 B* _& U pusha( ^' j* @, L% o% G @4 j
int 21h) l& @- t! O' r' _) j% E
popa, E5 u; Z, @5 W2 b
dec ch- L6 d% `1 r; A4 z; _* ~& d/ ?
jnz loop33 G5 B3 W" `1 `3 x
popa) A) i! h m* W4 D$ i& |% F9 i
ret
8 ~, C( Z( m9 q6 O" I" kbinhex endp
" e1 R2 Q9 A* g) l end main |
|