📄 mymusic.asm
字号:
STACK SEGMENT PARA STACK 'STACK'
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
BK DB'Push Esc to end up.$'
CHOOSE1 DB '1,hair like snow 2,three point five miles flower 3,the song of nankai $'
CHOOSE2 DB '4,the quite summer 5,the birthday song 6,the red star 7,wash and brush$'
SIGN DB 'There is not the song!$'
FREQ1 DW 22000,392,588,660,660,588,660,784,880,784
DW 523,588,660,880,784,660,784
DW 784,880,1045,880,784,660,784,660
DW 524,440,660,588,523,523,440,523,588,588,523
DW 0
TIME1 DW 25,50,50,25,50,25,50,50,50,50
DW 50,50,50,50,50,25,175
DW 25,25,100,50,50,100,50,100
DW 50,50,50,100,50,50,50,50,50,100,100
FREQ2 DW 300,392,523,523,523,523,523
DW 494,440,392,494,523,588,523,523
DW 392,523,523,523,523,523
DW 494,440,392,588,660,698,660,660
DW 392,523,523,523,523,523
DW 494,440,392,588,523,588,698,660,524
DW 524,524,660,588,524,524,494,588,523,523
DW 0
TIME2 DW 1,50,100,100,600,100,100
DW 100,100,100,100,100,100,50,200
DW 100,100,100,600,100,100
DW 50,100,100,100,100,100,50,200
DW 100,100,100,600,100,100
DW 50,100,100,100,100,100,50,150,200
DW 100,100,100,100,100,100,100,100,50,500
FREQ3 DW 22222,392,523,523,523,588,660,660,660
DW 588,660,698,494,588,523,523
DW 392,523,523,523,588,660,660,660
DW 588,660,698,494,588,523,523
DW 784,784,880,880,784,784,698,698
DW 698,698,784,784,698,698,660,660
DW 392,523,523,523,588,660,660,660
DW 588,660,698,494,588,523,523
DW 0
TIME3 DW 50,50,50,25,50,50,50,25,125
DW 25,25,50,50,50,25,50
DW 50,50,25,50,50,50,25,125
DW 25,25,50,50,50,25,100
DW 50,50,25,100,50,50,25,50
DW 25,50,25,75,50,50,25,50
DW 50,50,25,50,50,50,25,125
DW 25,25,50,50,50,25,100
FREQ4 DW 22222,660,392,440,523,523
DW 660,660,660,660,588,523,523
DW 392,392,330,392,440,523,523
DW 440,440,523,440,392,784
DW 660,660,588,523,588,660,440,392
DW 392,440,524,524,440,588
DW 392,440,523,588,660,784,784,880,660,588,588,440,524
DW 0
TIME4 DW 50,100,100,50,50,100
DW 50,50,50,50,50,50,100
DW 25,50,50,50,50,50,100
DW 25,50,25,50,50,450
DW 50,50,50,50,50,50,50,150
DW 50,50,50,50,50,200
DW 50,50,50,50,50,50,50,50,50,250,50,50,200
FREQ5 DW 262,262,294,262,349,330
DW 262,262,294,262,392,349
DW 262,262,523,440,349,330,294
DW 466,466,440,262,392,349
DW 0
TIME5 DW 50,50,100,100,100,200
DW 50,50,100,100,100,200
DW 50,50,100,100,100,100,300
DW 50,50,100,100,100,200
FREQ6 DW 392,392,392,440,392,440
DW 330,294,262,262,262,440
DW 440,523,440,392,349,330,294
DW 0
TIME6 DW 50,50,50,50,200,100
DW 50,50,200,50,50,100
DW 100,50,50,50,50,50,200
FREQ7 DW 22222,294,294,330,392,440,524,440,392,294,330,294
DW 262,294,330,392,330,294,262,294,262
DW 330,392,440,523,440,392,294,330,294
DW 262,294,330,392
DW 330,392,440,524,440,392,294,330,294
DW 262,294,330,392,330,294,262,294,262
DW 330,392,440,523,440,392,294,330,294
DW 330,294,262,294,262
DW 0
TIME7 DW 50,50,50,50,50,25,25,25,25,50,50,100
DW 50,50,25,25,25,25,50,50,100
DW 50,50,25,25,25,25,50,50,100
DW 50,50,100,200
DW 50,50,25,25,25,25,50,50,25
DW 50,50,25,25,25,25,50,50,100
DW 50,50,25,25,25,25,50,50,100
DW 25,25,25,25,100
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START PROC FAR
MOV AX,DATA
MOV DS,AX
LEA DX,BK
MOV AH,9
INT 21H
MOV DL,10
MOV AH,2
INT 21H
MOV DL,13
INT 21H
LEA DX,CHOOSE1
MOV AH,9
INT 21H
MOV DL,10
MOV AH,2
INT 21H
MOV DL,13
INT 21H
LEA DX,CHOOSE2
MOV AH,9
INT 21H
AGAIN: MOV AH,0
INT 16H
CMP AL,'1'
JE M1
CMP AL,'2'
JE M2
CMP AL,'3'
JE M3
CMP AL,'4'
JE M4
CMP AL,'5'
JE M5
CMP AL,'6'
JE M6
CMP AL,'7'
JE M7
CMP AL,27
JE QUIT
MOV DL,10
MOV AH,2
INT 21H
MOV DL,13
MOV AH,2
INT 21H
LEA DX,SIGN
MOV AH,9
INT 21H
JMP AGAIN
PLAY1:
M1:LEA SI,DS:FREQ1
LEA BP,DS:TIME1
JMP PLAY
M2:LEA SI,DS:FREQ2
LEA BP,DS:TIME2
JMP PLAY
M3:LEA SI,DS:FREQ3
LEA BP,DS:TIME3
JMP PLAY
M4:LEA SI,DS:FREQ4
LEA BP,DS:TIME4
JMP PLAY
M5:LEA SI,DS:FREQ5
LEA BP,DS:TIME5
JMP PLAY
M6:LEA SI,DS:FREQ6
LEA BP,DS:TIME6
JMP PLAY
M7: LEA SI,DS:FREQ7
LEA BP,DS:TIME7
JMP PLAY
PLAY: MOV DI,[SI]
CMP DI,0
JE AGAIN
MOV BX,DS:[BP] ;bl中为音符音长/10ms的值
SOUND:
MOV AL,0B6H ;计数器2,模式3,二进数
OUT 43H,AL ;送控制寄存器
MOV DX,12H ;8253/54时钟端的输入频率1193100Hz=12384CH
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL ;在计数器2中装入ax中的控制字
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL ;把输出端口61H的0,1两位置置1,发出声音
_WAIT: MOV CX,5800 ;延时 1658*15.08=25ms
PUSH AX
LOOP1: IN AL,61H
AND AH,10H
CMP AL,AH ;置8255A监控端口的PB4为1,使其每15.08us触发一次
JE LOOP1
MOV AH,AL
LOOP LOOP1
POP AX
DEC BL
JNZ _WAIT
MOV AL,AH
OUT 61H,AL ;恢复原8255A中监控端口的值
ADD SI,2
ADD BP,2
JMP PLAY
QUIT: MOV AX,4C00H
INT 21H
START ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -