DATAS SEGMENT
string db ' *************************',13,10
db ' *please choose the music',13,10
db ' *A. music 1',13,10
db ' *B. music 2',13,10
db ' *C. music 3',13,10
db ' *esc.tuichu',13,10
db ' *************************',13,10 ,'$'
pla1 db ' music 1 playing',13,10
db ' You can press esc to end','$'
;*************************************************************
MUS_FREG3 DW 262,294,330,262
DW 262,294,330,262
DW 330,349,392
DW 330,349,392
DW 392,440,392,349,330,262
DW 392,440,392,349,330,262
DW 294,196,262
DW 294,196,262,-1
MUS_TIME3 DW 50,50,100,100,100
DW 100,100,50,50,100,100
DW 100,100,100,50,50,100
DW 100,100,100,100,100,50
DW 50,100,100,100,100,100
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;*******************************显示
lea dx,string
mov ah,09
int 21h
;******************************
MUS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;*******************************
input:
mov ah,01
int 21h
cmp al,'a'and'A'
call clear
lea dx,pla1
mov ah,09
int 21h
MUS MUS_FREG3,MUS_TIME3
CALL MUSIC
;**********************************
MUSIC PROC NEAR
MOV AX,DATAS
MOV DS,AX
LEA SI,MUS_FREG3
LEA BP,DS:MUS_TIME3
FREG:
MOV DI,[SI]
CMP DI,-1
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG
END_MUS:
MUSIC ENDP
;*********************************
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
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1:
MOV CX,3314
call waitf
DELAY1:
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND 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
;****************************
clear proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
CODES ENDS
END START
这个程序 我该怎么在键盘上按下ESC键时结束演奏并退出系统
string db ' *************************',13,10
db ' *please choose the music',13,10
db ' *A. music 1',13,10
db ' *B. music 2',13,10
db ' *C. music 3',13,10
db ' *esc.tuichu',13,10
db ' *************************',13,10 ,'$'
pla1 db ' music 1 playing',13,10
db ' You can press esc to end','$'
;*************************************************************
MUS_FREG3 DW 262,294,330,262
DW 262,294,330,262
DW 330,349,392
DW 330,349,392
DW 392,440,392,349,330,262
DW 392,440,392,349,330,262
DW 294,196,262
DW 294,196,262,-1
MUS_TIME3 DW 50,50,100,100,100
DW 100,100,50,50,100,100
DW 100,100,100,50,50,100
DW 100,100,100,100,100,50
DW 50,100,100,100,100,100
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;*******************************显示
lea dx,string
mov ah,09
int 21h
;******************************
MUS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;*******************************
input:
mov ah,01
int 21h
cmp al,'a'and'A'
call clear
lea dx,pla1
mov ah,09
int 21h
MUS MUS_FREG3,MUS_TIME3
CALL MUSIC
;**********************************
MUSIC PROC NEAR
MOV AX,DATAS
MOV DS,AX
LEA SI,MUS_FREG3
LEA BP,DS:MUS_TIME3
FREG:
MOV DI,[SI]
CMP DI,-1
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG
END_MUS:
MUSIC ENDP
;*********************************
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
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1:
MOV CX,3314
call waitf
DELAY1:
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND 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
;****************************
clear proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
CODES ENDS
END START
这个程序 我该怎么在键盘上按下ESC键时结束演奏并退出系统