|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
* {; F% W G1 ~8 d
% g B- {% r+ i8 O# ~ .model small
$ a. C, i1 ~9 l1 t .386
' _. `( D. b( u5 {, m$ ^3 A0 d* Q CFG_ADDR EQU 0CF8h
; a5 U6 Z! W7 Q5 Y+ ~ c8 S CFG_DATA EQU 0CFCh& g* A$ s7 J6 Q. R
SMBUS_BUS EQU 0
8 F- S3 c0 {5 ^ SMBUS_DEVICE EQU 31
/ j+ g% i2 Q: k7 B4 P j/ Q+ d SMBUS_FUNC EQU 36 x0 v$ s1 F0 m+ @9 @
$ N' Z4 O+ `2 p6 L) h/ Q7 Z .stack 100h
" x6 j6 `+ b. i/ l2 R4 b .data# f9 C) g1 D0 `3 L* I
base dw ? ;smbus I/O space* r- O0 B# j' D# r Z
num db 0 ;byte select4 r8 g) l, u# ]# o4 R h# U
SmbStatus db ?
5 w+ H/ Z# g X* T R3 J1 k! J4 @& Y; \! o8 `) q4 Y
.code
5 z" \: H, \& P2 h6 a0 s / {# ^/ r& G3 s R' g
LF_CR MACRO
. w0 G) Q# g6 Z' T) S pusha: \+ l6 F+ B, d
mov dl,0dh ( h2 u1 b; k0 Z+ N5 V& v! B& U
mov ah,2
* a' S' k0 @' [! Q; | int 21h
, A3 Y' j' q2 c3 s2 @; h mov dl,0ah ;next line
5 X& D; z1 k3 N4 w) I( c7 k5 Z6 g mov ah,2
, u% N6 b. @4 K( d# C; r int 21h1 ~7 ^+ r: I& n- w2 @# A0 B! G0 S
popa
# }! J" t- { z) ?. \- | ENDM/ A& }1 @* h( Z
4 j3 ~& w; U! v. n) |& S
* q7 Q& F3 q9 n0 Lmain proc far
1 T/ s/ {- b2 J$ P! s mov ax,@data
* m$ H$ X, b- d* B4 G9 | mov ds,ax
( V3 m& R3 g& F) ~, @$ c5 v
, ~0 S7 W: S* L9 l mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
1 P4 V3 n, y5 s) b: a* F mov dx,CFG_ADDR
) r: K! J8 [) H7 F* } out dx,eax
3 f1 E7 G% Q5 B j4 ?1 F9 f1 p mov dx,CFG_DATA( D+ e2 _( t6 O/ E
in eax,dx' [. ~7 |% K! y: Q' U2 N
1 Y6 ?+ ]9 ]$ C' w. Y shr ax,5 ;bit 15-5,the base address
" \3 h, {& T9 n and ax,0000011111111111b
( i& D) y. H" X) b5 v mov base,ax8 Z/ |0 p) V% h1 H+ L% e
; z' `4 J; a- F, Y5 R/ Y3 K+ U& R call ReadSpd
7 z3 p* f3 u7 U7 d% y& Jexit:/ y/ r2 h- Y+ d
mov ax,4c00h, p& l2 b; T* I3 ~9 R6 ] P
int 21h
) h0 j: g: O4 y! W- [main endp
! K" A1 E) b4 B% S
; `, @! e& `' V f9 {
3 T6 I$ I: ]4 H! v( w
0 c3 n/ L3 X5 c1 wReadSpd proc" j5 B. m! L; O; `* e; ?1 |8 y
pusha
+ I' j* ~, K9 S! bAgain:
( H, \+ n6 m8 ?5 B$ H( n mov ah,num0 u$ c4 v9 v" J! E
and ah,00001111b
9 T9 g3 U; i' o. m% \* V .if(ah==15d) ;CR_LF2 y; C; n" p6 G8 B, V+ M+ f% J
LF_CR
0 r" o( k ^: k$ _+ e' e9 s2 O .endif
+ [# |5 G& o. r( ]; p
# q& a3 {& z2 J* ?: A .repeat
; X6 U) t3 h+ ~: F% e3 O0 s mov dx,base ;reset host,claim host in use
4 t- ~% r9 j; _; ^ add dx,07 s" w3 p; u- L0 }' E" a
mov al,40h
2 l8 l4 D. g _0 Q! ?: `8 | out dx,al3 [1 G, r+ u+ i8 W0 T" s
2 ~! F. d4 c; s5 d2 `7 w/ L }* P$ _
mov dx,base
) v; e2 c7 {: E& {3 }: ~9 @ in al,dx
! \+ D# h& H- A+ W' A9 j# t. j mov SmbStatus,al- S2 }5 Y/ p5 B7 w- |
2 o4 N% ]7 V1 g& z mov dx,base ;clear all status bits# q$ {. H# l9 @9 ], g
mov al,1Eh ;host status register0 K1 Z$ v( _( O j) j3 M
out dx,al
: c7 s- P* @" F/ J" O1 e & h3 O- Q* d# D. D! {1 o0 b
mov dx,base ;set offset to read 3 {8 ?3 R }5 {# W: J( N
add dx,3 ;host command register
1 X) S* G9 o7 A, J mov al,num
; A' W0 j O. b p4 u' B1 E9 U out dx,al
9 d, K0 O) k4 |& i3 G* v2 g( u - s( }: ?# `1 P! {
mov dx,base ;Transimit Slave Address register
# x3 q# A. U, p add dx,4
! K" @* s7 q% e0 B4 g; n mov al,0a1h
9 j" l* d: L+ o out dx,al k. T( Q5 V" E
+ N2 w1 Z0 R" I6 C
mov dx,base ;set "Read Word" protocol and start bit
F5 e! E' ]" P; X7 P3 D7 k) P add dx,2 ;Host Control register, g, }, U% f6 N2 f e. F
mov al,48h
) A6 t3 h, S$ j2 d2 p# I: T out dx,al
$ y% h* @/ I! h4 D" h 1 c `$ p9 H4 o, G& {
: y Q _* d" H3 _: e8 u ; @; m: S6 W# u1 g1 R L
mov dx,base9 l W, a. R8 c4 H; u, `/ {
in al,dx( Z" e' } I3 r1 ]5 g5 b& \
mov SmbStatus,al
: o. ^" T% b% {+ l and al,1Eh
4 V# l, v4 @& W k& L .while (al==0) ;check repeatly until any of7 i l' v) j+ P- c& K; m
mov dx,base ;FAIL,BERR,DERR,INTR( w% V) }; @- i8 a& S
in al,dx
7 I* s: W- p0 ?+ u3 [% [0 h mov SmbStatus,al, @2 v/ T& Q, u3 x. |$ _
and al,1Eh 1 b7 m0 \) s: y; A
.ENDW2 p3 O! ?& u& p- z& X. `# }
|% O5 Y. y7 w1 A7 [: D: `
mov al,SmbStatus 3 n" w$ m( m j- |) C
and al,1Ch
- t3 Z# X& I" f" ]: y$ |" H _ .if (al!=0) ;check for errors
1 I; k" n( p- w E# Y2 m* D" A mov al,SmbStatus; i8 H2 W0 q0 X5 y; ~ P
and al,08h
2 l2 j y2 k1 {. \ .continue .if (al!=0)
6 \+ Q6 }; _" W( |" g2 W/ X5 J* D jmp @F
" v( }; I/ d$ g, x- S. O; L2 m( S3 p .else
8 s( j L& ^# Y. {# C/ N mov dx,base
; o) H9 p( S( H$ u# U+ M add dx,5h$ ?7 j6 `- ^: k7 H3 C
in al,dx $ C/ W9 ]/ G9 ^( G8 B- k; z( g
call binhex 6 \. B4 u0 E' Q1 U0 G
.break3 ]0 Q2 L: }) K; k6 q5 d. t4 o) r$ x
.endif0 u% [5 U* w% H2 F: h
8 n, p h6 p# Z1 \* Q! P6 O
.until (0)
; H3 n- z+ x/ p4 X2 `
* q& a* r0 i7 f/ Y7 `. J! w- Z 6 W2 O+ B0 [/ E, c) s. S7 r1 k
6 z/ Y/ I) J8 g3 x( G# u
mov dl,20h ;output a space; M! N0 M/ }8 e$ E6 R. D1 Y% N
mov ah,2
% _' B5 v/ Z: S% W( ~/ G pusha
$ |' j, S& p$ r7 w int 21h) e( p; I+ Y' e; s* g% z
popa
$ r! b' Z- d" H% {6 H3 q inc num
2 Y$ `9 y! }# D, H+ P8 |; P( r9 |9 }& X3 L2 h0 {, n. d# \! l7 M
cmp num,80h ;get first spd 128 bytes 6 b' S' N+ J' L, E; O
jnz Again7 ~5 C0 Y# F% z! w2 J
/ F; F$ n; c, @5 K4 J+ o
@@:% R% {4 ]* ^! U1 w* i5 A( S8 o
popa
3 P* W: R. m1 c ret8 V, t% q) O4 n$ F: ?9 Q2 i
ReadSpd endp
% E' s7 o/ r2 w2 L! Z) M% J. I* ^3 k4 {. b3 p) C7 ?. _1 G& }! S. s
9 E: m+ t7 I: c; Z H5 d7 a
" Q# Y4 N5 v* s' u2 Y! M( o! Xbinhex proc
% p$ x: [$ l( Q pusha 6 V* S( B2 R( W
R& q i7 X! \# K, ` mov ch,2 ;2 hexadecimal digits to be printed/ k, t- L; x. V1 p' b
loop3:8 r$ T# o! ]5 u, {& o1 Q3 h
mov cl,4 ;bits to be shifted
% m$ i; v: I* N5 e* f rol al,cl w% g; J1 ~. A" ^1 }! }; c
mov bl,al
, D4 W' d; l s8 j3 @$ ^ and bl,0fh ;mask the 4-bit Msb
, c7 X- V8 l: n. _9 O add bl,30h" d' J% T: a. e) y$ c' t, w
cmp bl,3ah% s, g* v( z' v L
jl next1 ;number or alpha?% C+ T; a4 ~: c9 U4 c
add bl,7 " ^ }! T1 d9 a7 P
next1: ) `, ^( d( N7 s* i
mov ah,2 ;print one hexadecimal digit
# b! a' t7 Q+ c5 N7 f8 P mov dl,bl
& i- d6 `; i' A6 @ pusha
, G/ u1 w% P' ?; T int 21h7 Y# P1 s: k0 F2 R$ n( V
popa
# ^: d8 H/ K) U ^: l# T dec ch8 o, ~0 Z2 H8 [9 P
jnz loop3
0 s4 |/ {6 n" E popa3 u' d' T1 O2 w% {: |6 _2 L
ret* s) M3 m" {* N5 z% {$ M- q3 G/ ~; L" L
binhex endp! \( H& j% t! x% c) p! G" {/ j; d
end main |
|