📄 点歌系统.asm
字号:
DATAS SEGMENT
SRING1 DB 0DH,0AH,'CHOOSE THE MUSIC!$'
SRING2 DB 0DH,0AH,'INPUT ERROR!$'
SRING3 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'
MUSLIST DB 0DH,0AH,'1 MUSIC1'
DB 0DH,0AH,'2 MUSIC2'
DB 0DH,0AH,'3 MUSIC3'
DB 0DH,0AH,'4 MUSIC4'
DB 0DH,0AH,'5 MUSIC5'
DB 0DH,0AH,'Q EXIT'
DB 0dh,0ah,'$'
MUS_FREG1 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),50
DW 2 DUP (25,25,50)
DW 12 DUP (25),100
MUS_FREG2 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
MUS_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
MUS_FREG3 DW 262,294,330,262,394,330
DW 330,294,262,349,330,330,294,262
DW 330,394,392,330,440,392
DW 392,349,330,440,392,392,349,330
DW 6 DUP(262)
DW -1
MUS_TIME3 DW 3 DUP(50,25),3 DUP(25),50,4 DUP(25)
DW 3 DUP(50,25),3 DUP(25),50,4 DUP(25)
DW 100,100,100,100,100,100
MUS_FREG4 DW 330,292,330,394,330,392,330,294,330
DW 330,292,330,394,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,330,262
DW -1
MUS_TIME4 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
MUS_FREG5 DW 330,390,440,294,262,220
DW 390,131,440,392,330
DW 330,390,440,294,262,220
DW 261,294,390,261,220
DW -1
MUS_TIME5 DW 2 DUP(25),50,25,25,50
DW 4 DUP(25),100
DW 2 DUP(25),50,25,25,50
DW 4 DUP(25),100
DATAS ENDS
STACKS SEGMENT
DB 100 DUP ('STACK')
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
MOV AX,DATAS
MOV DS,AX
MOV AH,00H ;设置显示方式
MOV AL,12H
INT 10H
MOV AH,0BH ;设置设置背景颜色
MOV BH,0
MOV BL,41H
INT 10H
SHOW MACRO s ;定义一个执行语句的宏
LEA DX,s
MOV AH,9
INT 21H
ENDM
HUICHE MACRO ;定义一个回车换行的宏
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
SHOW SRING1 ; 调用SHOW显示语句
HUICHE
SHOW MUSLIST
INPUT: MOV AH,01H ;判断输入的字母再进行歌曲的播放
INT 21H
CMP AL,'Q' ;输入大写Q退出程序
JNZ NEXT
JMP ESC1
MONE: CMP AL,'1' ;输入1播放MUSIC1
JNZ MTOW
CALL MUSIC1
JMP EXIT1
MTOW: CMP AL,'2' ;输入2播放MUSIC2
JNZ MTHREE
CALL MUSIC2
JMP EXIT1
MTHREE: CMP AL,'3' ;输入3播放MUSIC3
JNZ MFOUR ;输入不正确时要求重新输入
CALL MUSIC3
JMP EXIT1
MFOUR: CMP AL,'4' ;输入4播放MUSIC4
JNZ MFIVE ;输入不正确时要求重新输入
CALL MUSIC4
JMP EXIT1
MFIVE: CMP AL,'5' ;输入5播放MUSIC5
JNZ EXIT ;输入不正确时要求重新输入
CALL MUSIC5
EXIT1: SHOW SRING3 ;重新输入
JMP INPUT
;*****重新显示列表*****
EXIT:
HUICHE
SHOW SRING2
HUICHE
SHOW SRING3
HUICHE
SHOW SRING1
SHOW MUSLIST
JMP INPUT ;重新调用input进行重新输入操作
;***************************
NEXT: CMP AL,'q' ;输入小写Q退出程序
JNZ MONE
ESC1: MOV AH,4CH ;返回DOS
INT 21H
MAIN ENDP
;********发声程序************
SOUNDF PROC FAR
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
WAITL: MOV CX,663H ;时间延迟设定
CALL WAITF
DELAY: LOOP DELAY
DEC BX
JNZ WAITL
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUNDF 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
;***************************
MUSIC1 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG1;把频率表的地址放在SI
LEA BP,DS:MUS_TIME1;把时间表的地址放在DI
FREG1: MOV DI,[SI] ;读下一个频率
CMP DI,-1;遇到-1就结束
JE END_MUS1
MOV DX,DS:[BP];读下时间表
CALL SOUNDF
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS1:
RET
MUSIC1 ENDP
MUSIC2 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG2
LEA BP,DS:MUS_TIME2
FREG2: MOV DI,[SI]
CMP DI,-1
JE END_MUS2
MOV DX,DS:[BP]
CALL SOUNDF
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS2:
RET
MUSIC2 ENDP
MUSIC3 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG3
LEA BP,DS:MUS_TIME3
FREG3: MOV DI,[SI]
CMP DI,-1
JE END_MUS3
MOV DX,DS:[BP]
CALL SOUNDF
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS3:
RET
MUSIC3 ENDP
MUSIC4 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG4
LEA BP,DS:MUS_TIME4
FREG4: MOV DI,[SI]
CMP DI,-1
JE END_MUS4
MOV DX,DS:[BP]
CALL SOUNDF
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS4:
RET
MUSIC4 ENDP
MUSIC5 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG5
LEA BP,DS:MUS_TIME5
FREG5: MOV DI,[SI]
CMP DI,-1
JE END_MUS5
MOV DX,DS:[BP]
CALL SOUNDF
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS5:
RET
MUSIC5 ENDP
CODES ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -