📄 bb.asm
字号:
DATA SEGMENT
INFO1 DB 0DH,0AH,' WELCOME YOU TO COME HERE!',0DH,0AH,'$'
INFO2 DB 0DH,0AH,' THIS IS A MUSIC PROGRAM!','$'
INFO3 DB 0DH,0AH,' PLEASE SELECT!',0DH,0AH,'$'
INFO4 DB 0DH,0AH,' INPUT ERROR!','$'
INFO5 DB 0DH,0AH,' PLEASE INPUT AGAIN!' ,0DH,0AH,'$'
MUSLIST DB' ****************************************',0DH,0AH
DB' * THE MUSIC MENU IS THAT: * ',0DH,0AH
DB' * 1:CHRISTMAS RING * ',0DH,0AH
DB' * 2:MUSIC2 * ',0DH,0AH
DB' * 3:MUSIC3 * ',0DH,0AH
DB' * 4:JU HUA TAI * ',0DH,0AH
DB' * 5:OPEN FILE * ',0DH,0AH
DB' * 6:EXIT * ',0DH,0AH
DB' ****************************************',0DH,0AH,'$'
DATABUFF DB 1024 DUP(?)
FHANDLE DW ?
FNAME DB 255,30,255 DUP(?)
BIAO1 DB 52,58,66,70,78,88,99
BIAO2 DB 100,200
MUS_FREG1 DW 7 DUP(330),392,262,294,330,4 DUP(349),2 DUP(330),330,294,294,262,294,392
DW 7 DUP(330),392,262,294,330,4 DUP(349),2 DUP(330),392,392,349,294,262,0
MUS_TIME1 DW 2 DUP(25*400,25*400,50*400),4 DUP(25*400),100*400,2 DUP(25*400,25*400,50*400)
DW 4 DUP(25*400),2 DUP(50*400),2 DUP(25*400,25*400,50*400)
DW 4 DUP(25*400),100*400,2 DUP(25*400,25*400,50*400),4 DUP(25*400),100*400
MUS_FREG2 DW 262,262,392,392,440,440,392,349,349,330,330,294,294,262
DW 2 DUP(392,392,349,349,330,330,294)
DW 262,262,392,392,440,440,392,349,349,330,330,294,294,262,0
MUS_TIME2 DW 3 DUP(6 DUP(25*400),50*400,6 DUP(25*400),50*400)
MUS_FREG3 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,0
MUS_TIME3 DW 10000,20000,20000,20000,20000
DW 20000,20000,10000,10000,20000
DW 20000,20000,20000,10000,10000
DW 20000,20000,20000,20000,20000
DW 10000,20000,20000,20000,20000
M4 DW 659,659,578,659,659,784,659,578,659,523,523,578,659,784,659,578,523,578
DW 659,784,659,880,784,880,784,784,659 ,392,0
MT4 DW 20000,15000,10000,25000,10000,10000,10000,10000,25000,15000,4 DUP(10000),15000
DW 10000,2 DUP(10000), 10000,25000
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 200 DUP ('STACK')
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
MAIN PROC FAR
START:
MOV AX,DATA ;数据段段地址送DS
MOV DS,AX
MOV AH, 0 ;BIOS调用设置显示方式640*480 16色图形
MOV AL,12H
INT 10H
MOV AH,0BH ;BIOS调用设置背景颜色
MOV BH,0
MOV BL,5
INT 10H
MOV AH,0BH ;BIOS调用设置调色板
MOV BH,01H
MOV BL,00
INT 10H
SHOW MACRO B ;字符串显示宏
LEA DX,B
MOV AH,9
INT 21H
ENDM
SHOW INFO1
SHOW INFO2
SHOW INFO3
SHOW MUSLIST
INP: MOV AH,01H ;DOS调用从键盘输入字符
INT 21H
CMP AL,'6' ;输入6则退出
JZ RETU
CMP AL,'1' ;输入1则演奏CHRISTMAS RING
JNZ B0
CALL MUSIC1
JMP EXIT1
B0: CMP AL,'2' ;输入2则演奏MUSIC2
JNZ C0
CALL MUSIC2
JMP EXIT1 ;输入3演奏MUSIC3
C0: CMP AL,'3'
JNZ D0
CALL MUSIC3
JMP EXIT1
D0: CMP AL,'4' ;输入4演奏 菊花台
JNZ E0
CALL MUSIC4
JMP EXIT1
E0: CMP AL,'5' ;输入5 则转入文件输入演奏文件音乐
JNZ EXIT
;CALL WEN
JMP EXIT1
EXIT1: SHOW INFO5
JMP INP
EXIT:
;CALL CLEAR
MOV AH, 0 ;BIOS调用设置显示方式640*480 16色图形
MOV AL,12H
INT 10H
MOV AH,0BH ;BIOS调用设置背景颜色
MOV BH,0
MOV BL,5
INT 10H
MOV AH,0BH ;BIOS调用设置调色板
MOV BH,01H
MOV BL,00
INT 10H
SHOW INFO4 ;显示提示字符
SHOW INFO5
SHOW INFO1
SHOW MUSLIST
JMP INP
RETU: MOV AH,4CH ;退出DOS
INT 21H
MAIN ENDP
MUSIC1 PROC NEAR ;音乐1演奏子程序
LEA SI,MUS_FREG1 ;频率首地址装入SI
LEA BP,MUS_TIME1 ;持续时间首地址装入BP
F1: MOV DI,[SI] ;把频率值送DI
CMP DI,0 ; 判断乐谱是否结束0结束退出
JE END_MUS1
MOV BX,DS:[BP] ;把持续时间值送BX
;CALL GENSOUND ;调用发音子程序
ADD SI,2 ;使地址指向下一个频率
ADD BP,2 ;使地址指向下一个时间
JMP F1 ;循环演奏
END_MUS1:
RET ;返回(MUSIC 2 3 4与1相似)
MUSIC1 ENDP
MUSIC2 PROC NEAR
LEA SI,MUS_FREG2
LEA BP,MUS_TIME2
F2: MOV DI,[SI]
CMP DI,0
JE END_MUS2
MOV BX,DS:[BP]
;CALL GENSOUND
ADD SI,2
ADD BP,2
JMP F2
END_MUS2:
RET
MUSIC2 ENDP
MUSIC3 PROC NEAR
LEA SI,MUS_FREG3
LEA BP,MUS_TIME3
F3: MOV DI,[SI]
CMP DI,0
JE END_MUS3
MOV BX,DS:[BP]
;CALL GENSOUND
ADD SI,2
ADD BP,2
JMP F3
END_MUS3:
RET
MUSIC3 ENDP
MUSIC4 PROC NEAR
LEA SI,M4
LEA BP,MT4
F4: MOV DI,[SI]
CMP DI,0
JE END_MUS4
MOV BX,DS:[BP]
;CALL GENSOUND
ADD SI,2
ADD BP,2
JMP F4
END_MUS4:
RET
MUSIC4 ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -