首页 > 编程语言 >【汇编】模拟电子琴发声(.asm源码)

【汇编】模拟电子琴发声(.asm源码)

时间:2022-10-17 23:35:44浏览次数:40  
标签:sound mov al 源码 call ax 电子琴 ds asm


项目环境
  • 编译环境:搭建一个nasm2.8的编译环境。
  • 镜像文件:采用winhex_18.2刷入编码。
  • 虚拟机:采用Bochs-2.4.5
项目软件
  • 傻瓜式环境配置。
  • 解压文件到D盘能直接使用。


音频对照表

【汇编】模拟电子琴发声(.asm源码)_环境配置

程序源码(.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


标签:sound,mov,al,源码,call,ax,电子琴,ds,asm
From: https://blog.51cto.com/u_15739363/5764682

相关文章