|
|
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: , u& K; K! {8 q& y
) q ~, }5 m1 }* y* D
.model small) X8 k0 b' Z! i& u" U3 N
.3864 e$ ~# Y! E4 n# x8 M! s2 G0 a
CFG_ADDR EQU 0CF8h
# M; o9 T. V( h6 c CFG_DATA EQU 0CFCh2 U# B; l, Y) g+ c
SMBUS_BUS EQU 09 K+ x3 k& L* Q* \9 m3 [
SMBUS_DEVICE EQU 31
1 I) r- |8 r. F% s! B y: ]7 [ SMBUS_FUNC EQU 3) [: w, k2 ?& y( o/ ?
: D. T- O& O) y& Q7 k2 j .stack 100h1 O7 c' l/ D0 F) W0 h" o- |
.data4 s9 G' z! }" q' \/ J
base dw ? ;smbus I/O space. u: i: U2 b* m! j Z
num db 0 ;byte select- A/ L! h* x7 S0 J" ~
SmbStatus db ?
6 {+ {& a( h& B
) t1 t9 N. u# R .code
- {4 B1 ?- I H" G+ P5 A6 y
: X+ C7 g8 z+ p& Q: O: ~* kLF_CR MACRO
: R7 K6 p [& r7 h. q0 B6 X pusha
8 ` X9 V: M6 T; }* i mov dl,0dh
5 r$ D" J5 @% D; K2 T+ a# j1 v- t4 k mov ah,26 Y6 W4 n- g" c, i8 y, e! y
int 21h
" d3 F' p b3 `4 C mov dl,0ah ;next line
x( j' J' G% B$ I- F$ T0 X mov ah,2
5 w; C* M( e# N8 G7 M, I2 D! {. N+ C int 21h6 Z' U( q) n3 I1 S* d: k
popa
( u) M |- ]5 t8 t; d9 P" A; [- l ENDM
( d9 B% V D" S! a F6 n% q$ Q" ~1 g0 C' F# G% u+ A& F( y2 q( e) @
% D# u8 w9 D' A9 S, l& ?
main proc far$ q9 L' m, i+ G
mov ax,@data
% Z' p: h7 Z8 D mov ds,ax
+ x5 o4 G6 P8 `
2 t0 e9 t W$ b+ m mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
6 C5 }* A: _' {0 U3 x5 ~$ X, \1 x3 { mov dx,CFG_ADDR
7 e+ G( i# ]5 a4 }) a+ W out dx,eax; Y9 m6 k: p1 p0 I. e; z& }& x
mov dx,CFG_DATA; A3 D; Q1 o$ M' q: @; `9 X
in eax,dx3 d% I8 B9 f+ v, m2 w% S
, m8 p0 V. Q2 c* R* c% ^/ `
shr ax,5 ;bit 15-5,the base address1 M, b) G( X6 d- P
and ax,0000011111111111b
8 ?6 Y+ y8 N4 P9 P mov base,ax
# a( n$ d, u7 Z7 W% Q3 l 0 |" q2 D: S1 K6 u
call ReadSpd, n5 }/ G- r7 B" _/ v5 p
exit:
( C/ y# s' C/ T% B" B9 h mov ax,4c00h1 ~' i1 n2 B8 n7 D& F/ K. \. L$ X, _5 B
int 21h" B5 C; G. y! _1 d# \
main endp
" q: _: E/ e) p; I" F2 b6 Q- h1 C" Z7 E4 K+ n# X
8 V( c8 m/ r( A8 q7 @4 _
! {9 R; K% V* t3 t
ReadSpd proc( O7 V- S/ q7 H4 Q7 q* f: M
pusha# G a; J; z7 s
Again:1 s) \+ l; v5 Y/ x3 Q
mov ah,num
$ m. F; q" R, v r and ah,00001111b
5 N* @ k/ R2 E, A A .if(ah==15d) ;CR_LF' N1 b/ N3 V- b0 B8 [
LF_CR# \" h5 u0 u5 V" B$ G& r: F+ x
.endif
7 X' P% u- W2 X2 [/ p9 ~, \
D- j$ m, M! J .repeat
7 u6 q# Y2 I2 r V5 L$ |( N mov dx,base ;reset host,claim host in use' }8 F8 w" t3 j2 I- k) d
add dx,0
' d' |6 ~4 x- B. Y1 ~6 w" a% r mov al,40h a: o8 ?: T3 R, C: {" G" |! ~
out dx,al2 w0 D9 Z& c6 B5 J. o- m
# F; `: B! r5 z7 b6 x* p
mov dx,base
+ y, [4 Q9 J& W7 ] in al,dx
; L9 j6 V% D: C7 q. R2 @/ R mov SmbStatus,al
2 h5 n5 U0 l+ Y5 V0 B5 N6 q7 ?+ ` 5 i0 u+ U6 v! j: o8 q" |. g2 X
mov dx,base ;clear all status bits
- D. I8 L$ j/ u' z mov al,1Eh ;host status register
4 \+ l$ h6 e: c, _ out dx,al+ q! A( C2 E; a$ K2 m6 }+ i' F
& w) T7 v5 ?: k. Q
mov dx,base ;set offset to read 2 G$ h& l8 H2 `3 J0 l1 p
add dx,3 ;host command register
, C3 @. P( b1 V4 T7 t$ n( O mov al,num
1 {3 Q$ A5 t+ @1 i& r out dx,al
( c. V& _/ l+ A( g3 s/ ?0 L/ o
) G$ e$ @0 |8 @( \ P mov dx,base ;Transimit Slave Address register
4 D* B9 c: m* s+ C6 o* j+ a4 Y add dx,49 N4 N, U" y3 ?3 } s! \8 q, A
mov al,0a1h
, u# U$ X7 M L out dx,al
4 l3 X T8 S8 j$ P# w7 x9 \ $ \& J) }/ z7 E* a7 M# o( Z: j
mov dx,base ;set "Read Word" protocol and start bit
' r% V, Z s- S! g: H# _ add dx,2 ;Host Control register# k6 j# d8 C D7 `/ }
mov al,48h 0 o. E8 V: w& g; f7 h/ d
out dx,al
+ l, h/ ] K$ x5 W
' R9 a A2 K. f& l- N" x* F4 E7 ^, y9 s0 o8 l J0 U `
5 `9 D8 r2 T ^# i2 l mov dx,base- B# E# v5 j- ]+ I* L: W
in al,dx3 _: _5 P4 G# U3 _5 M4 z2 F
mov SmbStatus,al( ]. U9 I& r% G3 O# _8 V0 u
and al,1Eh3 q& b8 o/ ]# ?" v8 @
.while (al==0) ;check repeatly until any of0 y3 v% v/ ?3 s8 l
mov dx,base ;FAIL,BERR,DERR,INTR7 S( Z( O6 w8 H' ~; ?) f0 s
in al,dx5 D8 {/ S2 d$ j. J
mov SmbStatus,al* F0 J. I$ J G8 o. d! v) q- D
and al,1Eh $ s. P6 ?/ G+ P
.ENDW- [0 j) v- d' m K! g
. W% }$ L) c- H, _. h) q+ u2 S: _ mov al,SmbStatus
k) S/ v* {6 A7 @( B' M( G3 U and al,1Ch
( ]3 I, E2 W2 n .if (al!=0) ;check for errors
" J8 b$ r9 a' Z+ \; j8 r mov al,SmbStatus
" x2 A6 g& w6 k4 v and al,08h
+ \' c" x4 U3 ~+ P3 a: d/ s q d. ^ .continue .if (al!=0)
& a2 q' }' ?4 S; ?: }4 } jmp @F
9 O+ m8 c8 A- I3 P/ V .else
4 N% A/ D, T1 I k) @7 @, J mov dx,base- b7 {4 W/ l/ s+ h ]
add dx,5h
5 S# V! F2 t0 y6 v# o/ U5 y in al,dx ' ]. L5 W8 f& U7 M* d2 q! C
call binhex : i, F+ D- h7 G/ d. U, ~2 g# e$ E* i
.break
( F T2 o; H' J+ C1 x .endif
0 W1 c0 h( U1 k' X$ ~# i& y! h
- Y2 u0 g& g" ? .until (0) / | K0 G7 R0 W
2 G! ^8 {0 l D; J
% M( |4 [& ^# a, [/ V. j& g9 E 2 f2 H4 Z% f, B, `: j4 q8 w
mov dl,20h ;output a space( F* n6 M4 }( v" [
mov ah,2' r1 r- p. `" X& L" E
pusha& U- A( C) n. p& k4 X# ?
int 21h
1 A9 H' Q" J* `( s popa' h" r' X4 w& L$ y; t r& _3 S0 l
inc num" Q! l/ Z6 I# B% q8 T
$ l0 u ~' O- Y9 m: i* w/ P cmp num,80h ;get first spd 128 bytes 3 I" m, c) p& q" I
jnz Again: e, Y" Z' ?! {; S9 |
# r4 y* V" l9 i8 M9 ~- Q
@@:
$ D) d# P7 Q1 t popa- I3 F% _0 _' w/ h, W1 Q) v
ret
# _6 B P4 s% i# T) t5 s; F/ Q& I, vReadSpd endp
2 C- U& T0 O% X* B: `' c7 O
1 {) ]% G3 L+ ]" v Q! n8 k* d) Q( _
' U9 d9 v( I6 N1 S7 ~1 f$ obinhex proc % b! T2 F% W6 F+ }
pusha , q; ?9 k/ p0 }: p; v5 o- t( ]+ k. @: K
4 J6 i H! n& ]# T- h9 M; i: C mov ch,2 ;2 hexadecimal digits to be printed
+ ~0 K$ t( d& z! Kloop3:, W- |4 Q d+ _/ b1 X0 Z
mov cl,4 ;bits to be shifted
, W- J" n+ Z% H% `+ R& a3 f' [% U rol al,cl
( W5 P7 z& A/ V' P mov bl,al! H" B! e+ Y. s t e& r
and bl,0fh ;mask the 4-bit Msb
5 e! R w8 Y* G! J add bl,30h
5 g8 ~' }+ v; E& V2 ]8 x cmp bl,3ah% g$ [$ }: x( ]1 `0 H8 A! i$ S% |1 C
jl next1 ;number or alpha?
* d2 i) k- s+ {# F$ `; D add bl,7
8 n- c. L# T9 Q5 u! x/ \next1:
: p1 H G1 d& m& @# Q# Q7 U mov ah,2 ;print one hexadecimal digit
. m+ E% i; F$ _ mov dl,bl
" _1 Y0 n3 f) e+ b( ?* Y pusha. N/ k$ C: V5 [9 [. s
int 21h3 g( V- p. [# G5 y( J# q
popa( V+ r; Y, w/ V
dec ch
& e" H& t& Z3 p! W0 Y7 k! J# F1 v) x jnz loop3) U8 Q! G! I8 u4 O8 m" }
popa
0 W# B, B9 a$ ~3 X5 M* X! N" m ret
: w3 R# ^# `3 t9 Nbinhex endp
% @9 n( _8 [' U' u# ^ end main |
|