📄 music1.asm
字号:
;music.asm
;wujian 1.25 2007
;**************************数据段*************************
DATA SEGMENT
INFO1 DB 0DH,0AH,'***************************$'
INFO2 DB 0DH,0AH,'welcome !!$'
INFO4 DB 0DH,0AH,'INPUT ERROR!$'
INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'
MUSLIST DB 0DH,0AH,'The menu : '
DB 0DH,0AH,'1 MUSIC1-----------two tigers'
DB 0DH,0AH,'Q EXIT-------------exit'
db 0dh,0ah,'$'
;*******************音乐
MUS_FREG1 dw 2 dup(262,294,330,262)
dw 2 dup(330,349,392)
dw 2 dup(392,440,392,394,330,262)
dw 2 dup(294,196,262),-1
MUS_TIME1 dw 2 dup(25,25,25,25)
dw 2 dup(25,25,50)
dw 2 dup(12,12,12,12,25,25)
dw 2 dup(25,25,50)
DATA ENDS
;*****************************堆栈段**************************************
STACK SEGMENT
DB 200 DUP('STACK……')
STACK ENDS
;*****************************代码段*************************************
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV aH, 0
MOV AL,00
INT 10H
;********** 用来调用显示字符串的宏
SHOW MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
;**********************音乐地址宏
ADDRESS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;***********************
show INFO1
show INFO2
show MUSLIST
INPUT: MOV AH,01H ;输入1和Q来选择开始和退出
INT 21H
CMP AL,'Q'
JZ retu
CMP AL,'1'
JNZ B0
ADDRESS MUS_FREG1,MUS_TIME1
CALL MUSIC
JMP EXIT1
B0: CMP AL,'2'
JNZ C0
CALL MUSIC
JMP EXIT1
C0: CMP AL,'3'
JNZ exit
CALL MUSIC
EXIT1: show INFO5
JMP INPUT
EXIT:
show INFO4
show INFO5
show INFO1
show INFO2
show MUSLIST
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 ;分两次把ax里
MOV AL,AH ;面的内容
OUT 42H,AL ;输到端口42H
IN AL,61H ;把端口61H的内容送到AL
MOV AH,AL ;保存端口61H的初始内容
OR AL,3 ;
OUT 61H,AL ;turn on the speaker
WAIT1: ;时间延迟
MOV CX,5000
call waitf
DELAY1: DEC BX
JNZ WAIT1
MOV AL,AH ;
OUT 61H,AL ;turn off the speaker
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
;********************************************
waitf proc near
push ax
waitf1:
in al,61h ;p391
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
;*********************************************
MUSIC PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
FREG: MOV DI,[SI];将SI指向的内容传给DI
CMP DI,-1 ;判断是否到了到了最后
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG
END_MUS:
RET
MUSIC ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -