⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spd.asm

📁 bios开发培训涉及例子。可以给大家参考。请在dos下运行。用masm6.0编译。
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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 + -