?? music.asm
字號:
;********************************樂曲演奏程序*****************************************
;請選擇:1----Mary had a little lamb
; 2----Happy birthday to you
; 3----Ju hua tai
; q----退出
stack segment para stack'stack'
db 64 dup('stack...')
bs1 equ 60
bs2 equ 40
bs3 equ 34
stack ends
;----------------------------------------------------------
dseg segment para'data'
begin_infro db 'Welcom!This is a music program.'
db 0dh,0ah,'Please select the music number you want to play!'
db 0dh,0ah,'1----Mary had a little lamb!'
db 0dh,0ah,'2----Happy birthday to you!'
db 0dh,0ah,'3----Ju hua tai'
db 0dh,0ah,'q----quit',0dh,0ah,'$'
error db 0dh,0ah,'Input error!Please input again!',0dh,0ah,'$'
again db 0dh,0ah,'Please input again!',0dh,0ah,'$'
lyric1 db 0dh,0ah,'Marry had a little lamb!$'
lyric2 db 0dh,0ah,'Happy birthday to you'
db 0dh,0ah,'Happy birthday to you'
db 0dh,0ah,'Happy birthday dear so so'
db 0dh,0ah,'Happy birthday to you$'
lyric3 db 0dh,0ah,'Ju hua tai$'
mus_freq1 dw 330,294,262,294,3 dup(330)
dw 3 dup(294),330,392,392
dw 330,294,262,294,4 dup(330)
dw 294,294,330,294,262,-1
mus_time1 dw 6 dup(25*bs1),50*bs1
dw 2 dup(25*bs1,25*bs1,50*bs1)
dw 12 dup(25*bs1),100*bs1
mus_freq2 DW 262,262,294,262,349,330
DW 262,262,294,262,392,349
DW 262,262,523,440,349,330,294
DW 466,466,440,262,392,349,-1
mus_time2 DW 2 dup(50*bs2),3 dup(100*bs2),200*bs2
DW 2 dup(50*bs2),3 dup(100*bs2),200*bs2
DW 2 dup(50*bs2),4 dup(100*bs2),300*bs2
DW 2 dup(50*bs2),3 dup(100*bs2),200*bs2
mus_freq3 dw 262,330,330,294,330,330,392,330,294,330
dw 262,262,294,330,392,330,294,294,262,294
dw 330,392,330,440,392,440,392,392,330,392,262
dw 330,294,294,392,330,3 dup(294),262,294,-1
mus_time3 dw 400*bs3,100*bs3,2 dup(50*bs3),200*bs3,4 dup(50*bs3),200*bs3
dw 100*bs3,4 dup(50*bs3),100*bs3,100*bs3,50*bs3,50*bs3,200*bs3
dw 150*bs3,25*bs3,25*bs3,50*bs3,150*bs3,4 dup(50*bs3),150*bs3,50*bs3
dw 3 dup(100*bs3,50*bs3,50*bs3),200*bs3
dseg ends
;---------------------------------------------------------
cseg segment para'code'
assume cs:cseg,ss:stack,ds:dseg
;*****定義宏*****
show macro b
lea dx,b
mov ah,09h
int 21h
endm
;**********************
music proc far
mov ax,dseg
mov ds,ax
;
show begin_infro
;
input:
mov ah,01h
int 21h
cmp al,'q'
jz end_mus
cmp al,'Q'
jz end_mus
play_mus1:
cmp al,'1'
jnz play_mus2
show lyric1
lea si,mus_freq1
lea bp,ds:mus_time1
jmp freq
play_mus2:
cmp al,'2'
jnz play_mus3
show lyric2
lea si,mus_freq2
lea bp,ds:mus_time2
jmp freq
play_mus3:
cmp al,'3'
jnz exit
show lyric3
lea si,mus_freq3
lea bp,ds:mus_time3
jmp freq
exit:
show error
jmp input
;-------------------------------------------------
freq:
mov di,[si]
cmp di,-1
je next
mov bx,ds:[bp]
call GENSOUND
add si,2
add bp,2
jmp freq
next:
show again
jmp input
;--------------------------------------------------------
;通用發聲子程序
GENSOUND PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
OUT 43H,AL
MOV DX,12H
MOV AX,533H*896
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1:
MOV CX,8FF0H
DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
;--------------------------------------------------------
end_mus:
mov ax,4c00h
int 21h
music endp
cseg ends
end music
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -