【汇编】模拟电子琴发声(.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

猜你喜欢

转载自blog.csdn.net/Gyangxixi/article/details/113614712
今日推荐