📄 spd.asm
字号:
PRINTSTR MACRO X
push dx
push ax
LEA DX,X
MOV AH,09H
INT 21H
pop ax
pop dx
ENDM
.model small
.586
.stack 100
.stack
.data
bit0 equ 01h
bit1 equ 02h
bit2 equ 04h
bit3 equ 08h
bit4 equ 10h
bit5 equ 20h
bit6 equ 40h
bit7 equ 80h
; NO db '0','1','2','3','4','5','6','7','8'
tableb dw 0,10,20,30,40,50,60,70,80,90,25,33,66,75
tablec dw 0,25,50,75
dot1 db ', $'
tcl_f db bit7
tcl_v db 7
fvalue dw 0
; fvalue1 db 0
spd_data db 256 dup(0)
spd_addr db 0
spd_index db 0
ddr2_flag db 0
smb_base equ 0400h
count1 equ 0fffh
space1 db ' $'
enters db 10,13,'$'
error1 db 'SMBUS operation failed!!!'
error2 db 'frequence read error!'
ddr2 db 'This DRAM is DDR2 $'
rank1 db ' single rank, $'
rank2 db ' ranks, $'
s128 db '128$'
s256 db '256$'
s512 db '512$'
showM db 'MB$'
showG db 'GB$'
ddrsize db 'DRAM size = $'
size1 dw 0
MHZ db 'MHZ: $'
StCL db 'tCL = $'
StRAS db ', tRAS = $'
StRCD db ', tRCD = $'
StRP db ', tRP = $'
SBL db ', BL = $'
dec_flag db 0
rankvalue db 0
.code
.startup
lea si,spd_data
mov spd_addr,0a1h ;addr
mov spd_index,0
mov bl,00h
@@: call read_spd
mov [si],al
; call show_al
; printstr space1
inc si
inc spd_index
dec bl
cmp bl,0
jnz @b
;=============== show ram info ===================
lea si,spd_data
mov al,[si+02h]
cmp al,08h
jne @f
printstr ddr2
mov ddr2_flag,02h ;show ddr
@@: mov al,[si+09h]
call cal_clock ;ax keep the value of clock
; out 80h,ax
cmp ddr2_flag,02h
jz toDDR2
mov dx,1
mov ax,86a0h
jmp cal_fre1
toDDR2: mov dx,3
mov ax,0d40h
cal_fre1: div fvalue ;ax keep the Frequence
mov cx,fvalue
shr cx,1
cmp dx,cx
jl @f
inc ax
@@: call show_ax_dec
printstr dot1
mov al,[si+5] ;al = banks
call cal_rank ;calculate ranks and show
;====== show ddr size
printstr ddrsize
call cal_ddrsize
out 80h,ax
call show_ax_dec
printstr showM
;;;;;;;;============== first row =============================
next_R: printstr enters
call cal_tcl
mov al,[si+09h]
call cal_clock ;ax keep the value of clock
mov cx,ax
cmp ddr2_flag,02h
jz toDDR21
mov dx,1
mov ax,86a0h
jmp cal_fre2
toDDR21: mov dx,3
mov ax,0d40h
cal_fre2: div cx ;ax keep the Frequence
mov cx,fvalue
shr cx,1
cmp dx,cx
jl @f
inc ax
@@: call show_ax_dec
printstr MHZ
printstr StCL ;==========show tCL
mov al,tcl_v
mov ah,0
call show_ax_dec
shr tcl_f,1
dec tcl_v
printstr StRAS ;==========show tRAS
call cal_tRAS
call show_ax_dec
printstr StRCD ;========== show tRCD
call cal_tRCD
call show_ax_dec
printstr StRP ;========== show tRP
call cal_tRP
call show_ax_dec
printstr SBL ;=========== show BL
call cal_BL
mov ah,0
call show_ax_dec
;;;;;;;;============== second row =============================
printstr enters
call cal_tcl
mov al,[si+23]
call cal_clock ;ax keep the value of clock
mov cx,ax
cmp ddr2_flag,02h
jz toDDR22
mov dx,1
mov ax,86a0h
jmp cal_fre3
toDDR22: mov dx,3
mov ax,0d40h
cal_fre3: div cx ;ax keep the Frequence
mov cx,fvalue
shr cx,1
cmp dx,cx
jl @f
inc ax
@@: call show_ax_dec
printstr MHZ
printstr StCL ;==========show tCL
mov al,tcl_v
mov ah,0
call show_ax_dec
shr tcl_f,1
dec tcl_v
printstr StRAS ;==========show tRAS
call cal_tRAS
call show_ax_dec
printstr StRCD ;========== show tRCD
call cal_tRCD
call show_ax_dec
printstr StRP ;========== show tRP
call cal_tRP
call show_ax_dec
printstr SBL ;=========== show BL
call cal_BL
mov ah,0
call show_ax_dec
;;;;;;;;============== third row =============================
printstr enters
call cal_tcl
mov al,[si+25]
call cal_clock ;ax keep the value of clock
mov cx,ax
cmp ddr2_flag,02h
jz toDDR23
mov dx,1
mov ax,86a0h
jmp cal_fre4
toDDR23: mov dx,3
mov ax,0d40h
cal_fre4: div cx ;ax keep the Frequence
mov cx,fvalue
shr cx,1
cmp dx,cx
jl @f
inc ax
@@: call show_ax_dec
printstr MHZ
printstr StCL ;==========show tCL
mov al,tcl_v
mov ah,0
call show_ax_dec
shr tcl_f,1
dec tcl_v
printstr StRAS ;==========show tRAS
call cal_tRAS
call show_ax_dec
printstr StRCD ;========== show tRCD
call cal_tRCD
call show_ax_dec
printstr StRP ;========== show tRP
call cal_tRP
call show_ax_dec
printstr SBL ;=========== show BL
call cal_BL
mov ah,0
call show_ax_dec
.exit
cal_clock proc
push bx
push si
push dx
xor bx,bx
mov ah,0
mov bl,al
and al,0f0h
shr al,4
mov cl,100
mul cl
and bl,0fh
add bl,bl
lea si,tableb
mov dx,[si+bx]
add ax,dx
mov fvalue,ax
pop dx
pop si
pop bx
ret
cal_clock endp
show_ax_dec proc ;show ax in dec
push cx
push dx
mov dx,0
mov cx,1000
div cx
push dx
cmp ax,0
je @f
mov dec_flag,1
add al,30h
mov dl,al
mov ah,2
int 21h ;show x000
@@: pop dx
mov ax,dx
mov cl,100
div cl
mov dh,ah
cmp al,0
jne @f
cmp dec_flag,0
je to_ff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -