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

📄 hd.asm

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

delay1  macro
        push    cx
        mov     cx,0ffffh
@@:     out     0ebh,al
        out     0ebh,al
        loop    @b
        pop     cx
endm

delay2  macro
        push    cx
        mov     cx,00ffh
@@:     delay1
        delay1
        loop    @b
        pop     cx
endm


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
                HDBase  dd      0       ;HD base address 
                CAd     db      0 
                index1  db      0
                index2  db      0
                index3  db      0
                sub1    db      'Subsystem ID: $'
                sub2    db      'New Subsystem ID: $'
                errorS  db      'error occurs!$'
                enters  db      10,13,'$'
                bit0    equ     1
                bit1    equ     2
                bit2    equ     4
                bit3    equ     8
                bit4    equ     16
                bit5    equ     32
                bit6    equ     64
                bit7    equ     128
                bit8    equ     256
                bit9    equ     512
                bit10    equ     1024
                bit11    equ     2048
                bit12    equ     4096
                bit13    equ     8192
                bit14    equ     16384
                bit15    equ    32768

.code

.startup	
                mov     ax,0
                mov     es,ax
                
                mov     eax,8000d810h
                mov     dx,0cf8h
                out     dx,eax
                mov     dx,0cfch
                in      eax,dx
                and     eax,0ffffc000h
                mov     HDBase,eax      ;get HDBase address
                call    show_eax
                printstr        enters
                
          ;reset ==========================
                mov     ebx,HDBase
                add     ebx,08h
                mov     eax,es:[ebx] 
                and     eax, 0fffffffeh
                mov     es:[ebx],eax
                delay1
                delay1
                mov     eax,es:[ebx]
                or      eax,bit0
                mov     es:[ebx],eax
@@:                
                mov     eax,es:[ebx]
                test    eax,bit0
                jz      @b
                
           ;check codec ready
                mov     ebx,HDBase 
                add     ebx,0eh
                mov     ax,es:[ebx]
 
                push    ax
                call    show_ax
                printstr        enters
                pop     ax
 
checkCAd:       shr     ax,1
                cmp     ax,0
                je      out1
                inc     CAd     
                jmp     checkCAd

out1:           
                mov     al,CAd
                call    show_al
                printstr        enters
                
             ;; get subsystem ID
                mov     dh,CAd
                mov     dl,01h
                mov     si,0f20h
                mov     cl,0
                call    make_command1
                printstr        sub1
                call    show_eax
                printstr        enters    
                
                
                
        ;;;;;=========  set subsystem
                mov     dh,CAd
                mov     dl,01h
                mov     si,723h
                mov     cl,78h                         
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
                mov     dh,CAd
                mov     dl,01h
                mov     si,722h
                mov     cl,56h                         
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
                mov     dh,CAd
                mov     dl,01h
                mov     si,721h
                mov     cl,34h                         
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
                mov     dh,CAd
                mov     dl,01h
                mov     si,720h
                mov     cl,12h                         
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
             ;; get subsystem ID
                mov     dh,CAd
                mov     dl,01h
                mov     si,0f20h
                mov     cl,0
                call    make_command1
                printstr        sub2
                call    show_eax
                printstr        enters    
                
                
        ;;;=======connect line  0bh
                mov     dh,CAd
                mov     dl,0bh
                mov     si,0f02h
                mov     cl,0 
                call    make_command1            ;eax keep the value
;                mov     eax,00000000h
                mov     cl,0
@@:             cmp     al,1ch
                je      out2
                cmp     cl,4
                jae     tonext1
                inc     index1
                shr     eax,8
                inc     cl
                jmp     @b
                       
                       
tonext1:        mov     dh,CAd
                mov     dl,0bh
                mov     si,0f02h
                mov     cl,4 
                call    make_command1            ;eax keep the value
@@:             cmp     al,1ch
                je      out2
                inc     index1
                shr     eax,8               
                jmp     @b

out2:           mov     al,index1
                call    show_al
;               printstr        enters
                
                mov     dh,CAd
                mov     dl,0bh
                mov     si,701h
                mov     cl,index1                          
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

     ;;;;;;;;;====== connect line 0ch
                mov     dh,CAd
                mov     dl,0ch
                mov     si,0f02h
                mov     cl,0      
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
@@:             cmp     al,0bh
                je      out3
                inc     index2
                shr     eax,8               
                jmp     @b
out3:
                mov     al,index2
                call    show_al
;                printstr        enters
                mov     dh,CAd
                mov     dl,0ch
                mov     si,701h
                mov     cl,index2
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

       ;;;;;;;;=========connetc line 14h
       
                mov     al,index3
                call    show_al
                printstr        enters
                mov     dh,CAd
                mov     dl,14h
                mov     si,701h
                mov     cl,index3
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
       ;;;  set amplifier gain obh
                mov     dh,CAd
                mov     dl,0bh
                mov     si,3h
                mov     al,index1
                mov     ah,0
                mov     di,ax
                shl     di,8
                or      di,bit12+bit13+bit14+bit15+bit0+bit1+bit2+bit3+bit4+bit5+bit6
                mov     ax,di
                call    show_ax
                printstr        enters
                call    make_command2       ;input: dh:CAd, dl:Node ID, si:verb ID,di:payload   output:eax
;        ;;;  set pin widget control
;                mov     dh,CAd
;                mov     dl,0bh
;                mov     si,707h
;                mov     cl,0e0h
;                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

       ;;;  set amplifier gain och
                mov     dh,CAd
                mov     dl,0ch
                mov     si,3h 
                mov     al,index2
                mov     ah,0
                mov     di,ax
                shl     di,8
                or      di,bit12+bit13+bit14+bit15+bit0+bit1+bit2+bit3+bit4+bit5+bit6
                mov     ax,di
                call    show_ax
                printstr        enters
                call    make_command2       ;input: dh:CAd, dl:Node ID, si:verb ID,di:payload   output:eax
;        ;;;  set pin widget control
;                mov     dh,CAd
;                mov     dl,0ch
;                mov     si,707h
;                mov     cl,0e0h
;                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

       ;;;  set amplifier gain 14h
                mov     dh,CAd
                mov     dl,14h
                mov     si,3h 
                mov     al,index3
                mov     ah,0
                mov     di,ax
                shl     di,8
                or      di,bit12+bit13+bit14+bit15+bit0+bit1+bit2+bit3+bit4+bit5+bit6
                mov     ax,di
                call    show_ax
                printstr        enters
                call    make_command2       ;input: dh:CAd, dl:Node ID, si:verb ID,di:payload   output:eax
        ;;;  set pin widget control
                mov     dh,CAd
                mov     dl,14h
                mov     si,707h
                mov     cl,0e0h
                call    make_command1     ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

                
end1:                     
                	
.exit

make_command1   proc    ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax

                call    set_command1
                mov     ebx,hdbase
                add     ebx,60h
                mov     es:[ebx],eax       ;command data
                mov     ebx,hdbase
                add     ebx,68h
                mov     ax,es:[ebx]
                or      ax,bit0+bit1
                mov     es:[ebx],ax
@@:             mov     ax,es:[ebx]
                and     ax,03h
                cmp     ax,2
                jne     @B    
                mov     ebx,hdbase
                add     ebx,64h
                mov     eax,es:[ebx]
                ret
make_command1   endp                

make_command2   proc    ;input: dh:CAd, dl:Node ID, si:verb ID,di:payload   output:eax
                call    set_command2
                push    eax
                call    show_eax
                pop     eax
                printstr        enters
                mov     ebx,hdbase
                add     ebx,60h
                mov     es:[ebx],eax       ;command data
                mov     ebx,hdbase
                add     ebx,68h
                mov     ax,es:[ebx]
                or      ax,bit0+bit1
                mov     es:[ebx],ax
@@:             mov     ax,es:[ebx]
                and     ax,03h
                cmp     ax,2
                jne     @B           
                mov     ebx,hdbase
                add     ebx,64h
                mov     eax,es:[ebx]
                ret
make_command2   endp         

set_command1    proc            ;input: dh:CAd, dl:Node ID, Si:verb ID,cl:payload   output:eax
                mov     ah,dh
                mov     al,dl
                shl     eax,20
                push    ebx
                xor     ebx,ebx
                mov     bx,si
                shl     ebx,8
                or      eax,ebx
                pop     ebx
                mov     al,cl
                ret 
set_command1    endp


set_command2    proc            ;input: dh:CAd, dl:Node ID, si:verb ID,di:payload   output:eax
                mov     ah,dh
                mov     al,dl
                shl     eax,4                
                xor     ax,si
                shl     eax,16                
                mov     ax,di
                ret 
set_command2    endp





show_ax         proc 
                push    ax
                mov     al,ah
                call    show_al
                pop     ax
                call    show_al
                ret
show_ax         endp   

show_eax        proc
                push    eax
                shr     eax,16
                call    show_ax
                pop     eax
                call    show_ax
                ret
show_eax        endp                
                	

	
show_al         proc    far     public

                push    ax
                push    dx
                mov     dh,al
                and     al,0f0h
                shr     al,4
                add     al,30h
                cmp     al,3ah
                jb      doing
                add     al,7
doing:          mov     dl,al
                mov     ah,2
                int     21h                                   
	
	        mov     al,dh
                and     al,0fh
                add     al,30h
                cmp     al,3ah
                jb      doing1
                add     al,7
doing1:         mov     dl,al
                mov     ah,2
                int     21h  	
                pop     dx
                pop     ax
                ret
show_al		endp
              
                
end
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -