📄 音乐发生器.asm
字号:
.model small
.stack
.data
musicfreq dw 220h,220h,262h,294h,330h,349h,330h,294h,220h,220h,262h,294h,330h,349h,330h
dw 220h,220h,262h,294h,330h,349h,330h,294h,330h,294h,330h,294h,330h,262h
dw 220h,440h,330h,330h,440h,330h,330h,440h ;音乐谱曲
musictimedelay db 8,4,4,8,4,8,16,16,8,4,4,8,4,4,32 ;音乐节拍
db 8,4,4,8,4,8,16,16,8,4,4,8,4,4,32
db 8,4,4,8,4,8,16,16,8,4,4,8,4,4,32
db 8,4,4,8,4,8,16,16,8,4,4,8,4,4,32
db 8,4,4,8,8,16,16,8,4,4,8,8,32
count equ 73
.code
.startup
mov ah,01h
int 21h
mov cx,count
music proc:
mov dx,303
mov al,90h
out dx,al ;初始化8255
mov al,0ch
out dx,al ;置pc6=0 禁止8253通道2的gate引脚
mov al,00h
out dx,al ;置pc0=0 禁止7408
mov dx,307h
mov al,0b6h
out dx,al ;初始化8253
mov si,offset musicfreq ;取歌曲的第一个音频
mov bx,count
mov di,offset musictimedelay ;取歌曲的第一个时延
mov bx,[si]
loopmusic:
out 306h,bl ;先送低字节
mov bl,ah
out 306,bl ;再送高字节
;以上置8253通道2 的计数初值
mov al,01h
out dx,al
mov al,0d
out dx,al ;开扬声器
call delay ;等待延时时间到
mov al,0ch
out dx,al
mov al,00h
out dx,al ;关闭扬声器
inc si
inc si ;获取下一个音频
inc di
inc di ;获取下一个延时
dec cx
loop loopmusic
mov al,0ch
out dx,al
mov al,00h
out dx,al ;再次关闭扬声器
music endp
delay proc ;延时程序
ab: int 1ch
dec [di]
cmp [di],0
jnz ab
ret
delay endp
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -