📄 melody.asm
字号:
.MODEL SMALL
.STACK 200H
.DATA
MESS1 DB 0DH,0AH,' ---------------------------',0DH,0AH,'$'
MESS2 DB 0DH,0AH,' --Play Melody by Hardware--',0DH,0AH,'$'
MESS3 DB 0DH,0AH,' -------------by Edison-----$'
MESS4 DB 0DH,0AH,'$'
MESS5 DB 0DH,0AH,' Using the assembly language!',0DH,0AH,'$'
MESS6 DB 0DH,0AH,' List of melody:$'
MESS7 DB 0DH,0AH,' ---------------------------$'
MESS8 DB 0DH,0AH,' --WARNING : INPUT ERROR !--',0DH,0AH,' ---------------------------$'
MESS9 DB 0DH,0AH,' --Just "A,B,C,Q" Allowed!--',0DH,0AH,' ---Please select again !---$'
MESS0 DB 0DH,0AH,' ---------------------------',0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,'$'
MELODYLIST DB 0DH,0AH,' A : MELODY1'
DB 0DH,0AH,' B : MELODY2'
DB 0DH,0AH,' C : MELODY3'
DB 0DH,0AH,' Q : EXIT'
DB 0DH,0AH,' Your choose(A,B,C,Q):$'
;*********************** 音乐一 ***********************
Melody_FREQUENCY1 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
Melody_TIME1 DW 6 DUP (25),50
DW 2 DUP (25,25,50)
DW 12 DUP (25),100
;*********************** 音乐二 ***********************
Melody_FREQUENCY2 DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,332,262,-1
Melody_TIME2 DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
;*********************** 音乐三 ***********************
Melody_FREQUENCY3 DW 262,262,294,262,349
DW 330,262,262,294,262
DW 392,349,262,262,523
DW 440,349,262,262,466
DW 466,440,262,392,349,-1
Melody_TIME3 DW 50,50,100,100,100
DW 100,100,50,50,100,100
DW 100,100,100,50,50,100
DW 100,100,100,100,100,50
DW 50,100,100,100,100,100
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV aH, 0
MOV AL,00
INT 10H
;*********************** VIEW ***********************
VIEW MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
;*********************** ADDRESS ***********************
ADDRESS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;**********************************************
VIEW MESS1
VIEW MESS2
VIEW MESS3
VIEW MESS4
VIEW MESS5
VIEW MESS6
VIEW MELODYLIST
INPUT:
MOV AH,01H
INT 21H
CMP AL,'Q'
JZ retu
CMP AL,'q'
JZ retu
CMP AL,'A'
JNZ B0
ADDRESS Melody_FREQUENCY1,Melody_TIME1
CALL MELODY
JMP EXIT1
B0:
CMP AL,'a'
JNZ C0
ADDRESS Melody_FREQUENCY1,Melody_TIME1
CALL MELODY
JMP EXIT1
C0:
CMP AL,'B'
JNZ D0
ADDRESS Melody_FREQUENCY2,Melody_TIME2
CALL MELODY
JMP EXIT1
D0:
CMP AL,'b'
JNZ E0
ADDRESS Melody_FREQUENCY2,Melody_TIME2
CALL MELODY
JMP EXIT1
E0:
CMP AL,'C'
JNZ F0
ADDRESS Melody_FREQUENCY2,Melody_TIME2
CALL MELODY
JMP EXIT1
F0:
CMP AL,'c'
JNZ exit
ADDRESS Melody_FREQUENCY3,Melody_TIME3
CALL MELODY
EXIT1:
JMP INPUT
EXIT:
call ERROR
VIEW MESS7
VIEW MESS8
VIEW MESS9
VIEW MESS0
VIEW MESS1
VIEW MESS2
VIEW MESS3
VIEW MESS4
VIEW MESS5
VIEW MESS6
VIEW MELODYLIST
jmp input
RETU:
MOV AH,4CH
INT 21H
;*********************** 发声 ***********************
GENSOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
OUT 43H,AL
MOV DX,12H
MOV AX,348ch
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,3314
call waitf
DELAY1: DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
;**********************************************
WAITF PROC NEAR
PUSH AX
WAITF1:
IN AL,61H
AND AL,10H
CMP AL,AH
JE WAITF1
MOV AH,AL
LOOP WAITF1
POP AX
RET
WAITF ENDP
;**********************************************
MELODY PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
FREQUENCY:
MOV DI,[SI]
CMP DI,-1
JE END_MELODY
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREQUENCY
END_MELODY:
RET
MELODY ENDP
;*********************** ERROR ***********************
ERROR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,6
MOV AL,0
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
MOV BH,7
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
ERROR endp
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -