⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.asm

📁 一个汇编方面的程序 可以播放指定的乐曲
💻 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 + -