|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: ( w+ G; b. n% }7 h4 ]: K
( K8 {8 v* f& \" K& q e
.model small
9 N( d! }9 |7 u9 B; p .386
8 F1 i2 l5 Q% M2 W CFG_ADDR EQU 0CF8h
: _& @) [4 \. n* n3 p/ ? CFG_DATA EQU 0CFCh9 ~* S' W+ v: ]/ d2 n, ~$ T
SMBUS_BUS EQU 0! A: i2 D& p2 D: y
SMBUS_DEVICE EQU 31
2 P9 c% @4 F- m SMBUS_FUNC EQU 3) Q" W7 I; }/ ~* I: m% O
0 j: A; u3 L% U" G# ]
.stack 100h
4 X; q8 k; @& o# v- D5 C! e .data. j, E# s0 q+ V0 n
base dw ? ;smbus I/O space7 i0 b( E3 W5 q
num db 0 ;byte select
~3 o) q3 l O8 tSmbStatus db ?
/ o( z8 Q! j1 j4 P' y! @# X) L
. V3 ~5 l9 B( w6 p9 c& L .code
& E0 {, r- {: \7 _$ [* {0 m. e6 l7 [9 z h
/ h. s- N3 C' u: Q0 e) oLF_CR MACRO
, @6 _; [4 n) P7 T; N pusha7 ?. l* T: d$ ]
mov dl,0dh \0 E' l" _6 k* l
mov ah,26 N4 y: n" z! N) J
int 21h4 s% @2 p) h1 v" R5 L- n( G
mov dl,0ah ;next line 0 n* w6 `! Y$ f1 b
mov ah,2
6 o4 W8 b- }: o int 21h7 ^3 a9 G6 c2 e6 _8 j$ t! Z- [
popa
! i' S- G1 Z" |4 l- f. p" t ENDM/ a, D X% [) }+ `( k
8 r# _! [3 C- |7 T
# p# E9 e c9 A N
main proc far
7 u2 |# p1 s# U0 o& T7 I mov ax,@data+ v' L5 \- C& n( i5 O
mov ds,ax- A2 c* O1 J4 U' X% `
1 h; x# [5 A* N3 @; ]' k5 ~ mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
9 d1 c z- L# T; r9 ^! q mov dx,CFG_ADDR4 ?0 m* Q9 I6 m9 W& c
out dx,eax2 m% o1 z1 I, j( N
mov dx,CFG_DATA( G3 K9 k. J1 C- }" a) v7 g h0 l
in eax,dx
( c! f4 R7 A; y4 Y* [8 G
' T3 |! T) V) q% C R; [6 l4 A shr ax,5 ;bit 15-5,the base address
) ]7 c, C4 P% H, o( A, i and ax,0000011111111111b1 [, n/ _* X" {1 v0 Q& ^
mov base,ax
! Y( V! `: _; o0 U) o# [) H # J/ i/ E$ K, M
call ReadSpd! x0 q1 n ~0 v* N
exit:
6 }$ T! \) X) b8 I/ ~! o# v mov ax,4c00h
7 Y3 @" I% x2 a" r% Y int 21h+ \+ L: m+ t/ Z7 s) N) N; [
main endp5 h7 G1 b$ ~8 f, E4 t7 ]
3 Y: G/ i, h3 Q: G7 u8 L7 R0 c3 i5 W( c/ g$ J( |
+ F; J8 L7 S. @/ n
ReadSpd proc
- @! z$ `& V9 i% I; J3 T* h pusha6 K, B, F* C$ E4 O1 W
Again:- T- e5 J% N+ w( w$ S
mov ah,num* z$ O0 _9 [/ v8 u9 T
and ah,00001111b+ F% L4 ?0 ~* C5 ]3 o
.if(ah==15d) ;CR_LF
1 F. R) ^6 ?9 z0 M1 j h LF_CR, Y8 t5 k- V- ?$ l0 q" W" D
.endif+ B5 J% P9 e O5 _/ t6 {
- O; ~. }" ]0 v/ F R4 @& Z .repeat. A% {7 m: A8 K1 n! H
mov dx,base ;reset host,claim host in use
4 i- f+ d/ {6 J, j) F, N add dx,04 W- J8 k) e9 [
mov al,40h
4 d" k# C& u0 u7 M1 \: m R, |* B out dx,al5 O% P4 H. u3 R/ ]$ H+ n
8 j3 E0 `; ?/ S mov dx,base 7 o) N. }% Y+ G; V/ ^
in al,dx
0 v$ b# \/ [" `5 C) @4 J4 r mov SmbStatus,al+ g0 q& y- Z/ q8 {; @
6 J- {6 M3 _$ U/ w) O* I u; \ mov dx,base ;clear all status bits! C. H( x( E: t" d
mov al,1Eh ;host status register
6 T2 |( K A" R0 d- e. x" g8 | out dx,al
; p7 n3 k# ~/ P
% |3 B, x! G% o" b' [. P' J% _; N mov dx,base ;set offset to read
) V8 R+ v4 y# m# { add dx,3 ;host command register
( ~' A" L8 U5 a mov al,num
# a# }" y |' X- I! x out dx,al
! Z6 k2 r" M D. Z+ C6 _
6 C! o2 N/ p7 V" n8 }* M mov dx,base ;Transimit Slave Address register8 h- p4 ~; o9 u/ Z# _, k; E
add dx,4) p. |* f& K7 p& }' \' S G
mov al,0a1h
+ b" X4 ^% c2 t+ [ out dx,al
4 G/ E8 Y6 i- a* _$ e# {3 @6 O8 J
' ~+ }# M8 `9 X$ [! Z% i5 C5 P- q: [ mov dx,base ;set "Read Word" protocol and start bit' ~$ b5 X+ b0 Z5 U2 _5 f! x+ H
add dx,2 ;Host Control register
* L3 ]" p( [3 D; [; k mov al,48h
5 J, d0 m: _# d; ]# i6 j3 }; ~ out dx,al& o& b( m- H0 N+ b& a
+ b5 _! {. [" R! m& R
) _5 {! R+ a& |3 B) R( K4 X: J4 u
0 b* J, M% ?/ w% t mov dx,base: U8 V3 e9 D( x) z; ?( ]
in al,dx2 l/ o. l* B" Y# N. o9 C
mov SmbStatus,al
9 j* X% I! p M+ B' e and al,1Eh
) @% N; c0 K$ |) s6 P8 d8 \ .while (al==0) ;check repeatly until any of
2 P$ R- S: l8 q+ z- @/ A+ A7 D6 S mov dx,base ;FAIL,BERR,DERR,INTR' j3 [! M6 f0 o6 R
in al,dx
0 g4 Z- ?7 y4 _5 ]/ H7 t mov SmbStatus,al2 ]+ _) j% [& v5 y2 |
and al,1Eh
% |/ V; ]: d, b5 G .ENDW
! I4 [ \& |+ {% t$ ~ ' c( K& p" g2 H6 U
mov al,SmbStatus 6 z$ _/ \9 T* I, {' j; F" I
and al,1Ch3 U* B! E9 e. z1 `5 J! f+ V
.if (al!=0) ;check for errors
" Y! k& M) D9 f mov al,SmbStatus
! h3 I3 k: }& n8 @: V0 y' }2 N and al,08h + t* `' N8 n6 K$ V% d+ P
.continue .if (al!=0)
, o3 K! c' s/ N9 L& g jmp @F
' @( F8 f3 M8 ]8 ` .else( r1 [$ m h% I( b3 e
mov dx,base/ p7 Z. J) I' Q
add dx,5h
8 k1 T3 k( K, i. Z in al,dx 2 }1 V! n6 I) h6 [$ z) ^ `
call binhex
& l! s. W( d9 b0 Z3 Y- g .break
8 `8 d* |7 _/ Y9 n .endif' k6 `5 R1 Y( b5 A1 R |
( V8 J/ p5 Q7 v4 H, O .until (0) # S3 g* c n) a, x" ^/ x
* s- D+ {: f7 M2 y8 H8 B/ z
" p9 J+ X, s% w7 w! j* ^* @7 U
! Y/ i' e. G# w* f9 J2 z+ X) u
mov dl,20h ;output a space
$ O# V. O7 b# Z, X/ L& w mov ah,2
9 D/ G$ f- S9 v( \ pusha4 H" o8 ?( @ o% H* d
int 21h
7 S" o0 J/ g2 s popa
* J& J7 s5 b$ D6 _; q* J inc num* j+ F0 B. G( V1 M, Y; d" r
4 }7 A9 K( z/ t: c- M6 |) _ cmp num,80h ;get first spd 128 bytes
% i& s# M% W" W- W( G* B" | jnz Again
$ I# z) m6 ~7 z' p 9 H0 c9 k" y* \5 F" M$ \6 b; g
@@:
5 \1 {2 ]9 w- e1 y: U5 d& f popa
; e6 Y) C5 r6 k ret# a. r. w7 R3 E% c9 S" U8 ]$ x
ReadSpd endp
! t5 C) J# j4 W0 r3 _
9 T. I! r! B. c: ]& {: \4 S) y( A/ E& z a$ v) Q4 W3 }
U$ D( q8 P: n9 T. I$ l/ S+ ~& ~
binhex proc - l0 s) Q! |% a
pusha 7 p* a6 b' g+ @
( I0 `: H2 ~5 r# r6 S- K; O# I, M mov ch,2 ;2 hexadecimal digits to be printed
" ~/ P3 {) q# ~loop3:: c3 @8 B, C. p2 [; M" H
mov cl,4 ;bits to be shifted3 ?6 h* C# l7 b9 W7 i6 b, G; q- c/ W
rol al,cl$ I% M* `$ F, j- h6 m% m. l
mov bl,al0 U! C/ @" {, _( W) P2 u+ V4 A
and bl,0fh ;mask the 4-bit Msb. h/ z( K( u1 X3 F
add bl,30h
) e/ z! F% K L2 _4 b7 H cmp bl,3ah5 Q0 s) r' |' ]! }7 U' `
jl next1 ;number or alpha?
) X* _( K% i! J+ c$ z: F add bl,7 . P! c, I2 ?6 F$ h* F( c
next1:
' c( A/ f6 ^6 z* e2 Z2 {+ c mov ah,2 ;print one hexadecimal digit# [% j5 P- y; ?2 R! b
mov dl,bl
5 z& R3 C$ R$ N" B' G9 s0 }# l- q pusha
1 m7 r9 X& J6 N int 21h8 V$ P' B3 R/ E9 {9 {4 h5 W
popa, B& Z1 ]. }% d$ i T# f( K) w' ^
dec ch; |! _# y) ^9 [7 F7 a2 y( \
jnz loop3
3 `! K p/ l8 N; i2 ? popa' E4 u0 q, Q' \! n, E n& I* u8 ?
ret
! w7 @. n6 O( K$ ~( W j$ dbinhex endp9 G% Y. ]$ ?! a2 ~$ ]
end main |
|