📄 play_canon.asm
字号:
TITLE MUSIC --A MUSIC OF 'CANON'
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP('STACK...')
STACK ENDS
DSEG SEGMENT
MUS_FREQ DW 392
DW 392,330,349,392,330,349,392,196,220,247,262,294,330,349
DW 330,262,294,330,165,175,196,220,196,175,196,262,247,262
DW 220,262,247,220,196,175,196,175,165,175,196,220,247,262
DW 220,262,247,262,247,220,247,262,294,262,247,262,220,247
DW 262
DW -1
MUS_TIME DW 50,50,2 DUP(25),50,10 DUP(25)
DW 50,2 DUP(25),50,10 DUP(25)
DW 50,2 DUP(25),50,10 DUP(25)
DW 50,2 DUP(25),50,10 DUP(25)
DW 200
DSEG ENDS
CSEG SEGMENT PARA 'CODE'
ASSUME CS:CSEG, SS:STACK, DS:DSEG
MUSIC PROC FAR
MOV AX,DSEG ;INITIALIZE DS
MOV DS,AX
LEA SI,MUS_FREQ ;PUTS THE FREG TABLE OFFSET IN SI
LEA BP,DS:MUS_TIME ;PUTS THE TIME TABLE OFFSET IN BP
FREQ:
MOV DI,[SI] ;READ NEXT FREQUENCY
CMP DI,-1 ;END OF TONE?
JE END_MUS ;IF YES,EXIT
MOV BX,DS:[BP] ;ELSE,FETCH THE DURATION
CALL SOUNDF ;PLAY THE NOTE
ADD SI,2 ;UPDATE THE TABLE POINTER
ADD BP,2
JMP FREQ ;GO PROCESS NEXT NOTE
END_MUS:
MOV AX,4C00H ;RETURN TO DOS
INT 21H
MUSIC ENDP
SOUNDF PROC
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,3663 ;延迟时间
CALL WAITF
DEC BX
JNZ WAIT1
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
CSEG ENDS
END MUSIC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -