【彙編】模擬電子琴發聲(.asm源碼)

項目環境
  • 編譯環境:搭建一個nasm2.8的編譯環境。
  • 鏡像文件:採用winhex_18.2刷入編碼。
  • 虛擬機:採用Bochs-2.4.5
項目軟件
音頻對照表

在這裏插入圖片描述

程序源碼(.asm)
org 0x8400  
jmp start  
;*****************************************數據準備區*****************************************  
sound_f:;初始頻率  
    dw 1000  
sound_hz:;赫茲中轉  
    dw 0  
different_f:;不同音階  
    dw 523  
    dw 587  
    dw 659  
    dw 698  
    dw 784  
    dw 880  
    dw 988  
;*****************************************開始*****************************************  
start:  
    mov ax,0xb800                        ;指向文本模式的顯示緩衝區  
    mov es,ax  
  
    mov ax,0  
    mov ds,ax  
  
    cli  
    mov word [ds:0x24],int_key          ;寫入鍵盤中斷9號服務程序地址  
    mov word [ds:0x26],0  
    sti  
  
;設置頻率  
;   mov dx,12H  
;   mov ax,34DEH  
;   mov di,1000  
;   div di  
  
;給定時器頻率  
;   mov al,10110110B  
;   out 43h,al  
;   mov ax,1983  
;   out 42h,al  
;   mov al,ah  
;   out 42h,al  
  
;揚聲器端口打開  
;   in al,61h  
;   or al,00000011B  
;   out 61h,al  
x:  
    jmp $  
  
;*****************************************鍵盤中斷*****************************************  
int_key:;鍵盤  
    mov dx,0x60                         ;讀取鍵盤緩衝區數據  
    in al,dx  
  
    ;1   duo  
    cmp al,0x02  
    je call_1  
  
    ;2   rai  
    cmp al,0x03  
    je call_2  
      
    ;3   mi  
    cmp al,0x04  
    je call_3  
  
    ;4   fa  
    cmp al,0x05  
    je call_4  
  
    ;5   sao  
    cmp al,0x06  
    je call_5  
  
    ;6   la  
    cmp al,0x07  
    je call_6  
  
    ;7   xi  
    cmp al,0x08  
    je call_7  
          
    jmp read_sound  
  
        call_1:  
            mov bx,[ds:different_f]         ;duo  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_2:  
            mov bx,[ds:different_f+2]       ;rai  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_3:  
            mov bx,[ds:different_f+4]       ;mi  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_4:  
            mov bx,[ds:different_f+6]       ;fa  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_5:  
            mov bx,[ds:different_f+8]       ;sao  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_6:  
            mov bx,[ds:different_f+10]      ;la  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
        call_7:  
            mov bx,[ds:different_f+12]      ;xi  
            mov [ds:sound_f],bx  
            call make_sound  
            jmp read_sound  
    read_sound:   
        mov dx,0x20  
        mov al,0x61  
        out dx,al  
iret  
  
  
;*****************************************發聲主程序*****************************************  
make_sound:;發聲  
    call give_f  
    call delay  
    call open_sound  
    call delay  
    call close_sound  
ret  
  
;**********************************************************************************聲音模塊**********************************************************************************  
;*****************************************設置頻率*****************************************  
set_f:;設置頻率  
    push dx  
    push ax  
  
    mov dx,12H  
    mov ax,34DEH  
    mov di,[ds:sound_f]  
    div di  
    mov [ds:sound_hz],ax  
  
    pop ax  
    pop dx  
ret  
;*****************************************給定時器頻率*****************************************  
give_f:;給定時器頻率  
    mov  al,10110110B  
    out  43H,al  
  
    call set_f  
  
    mov  ax,[ds:sound_hz]  
  
    out  42H,al  
    mov  al,ah  
    out  42H,al  
ret  
  
  
;*****************************************揚聲器端口打開*****************************************  
open_sound:;揚聲器端口打開  
    push ax  
  
    in al,61H  
    or al,00000011B;或操作與11111100B  
    out 61H,al  
  
    pop ax  
ret  
;*****************************************揚聲器端口關閉*****************************************  
close_sound:;揚聲器端口關閉  
    push ax  
  
    in al,61H  
    and al,11111100B;與操作與00000011B  
    out 61H,al  
  
    pop ax  
ret  
;*****************************************時延*****************************************  
delay:;時延  
    push cx   
    push dx  
    push ax   
  
    mov  cx,0FH  
    ;mov  dx,4240H              ;延遲  
    mov  dx,1000H               ;延遲  
    mov  ah,86H  
    int  15H  
  
    pop ax   
    pop dx  
    pop cx   
ret

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章