📄 电子琴+心图.asm
字号:
.486
;-----------------------------------------------------------------------
DATA_ORGATRON SEGMENT
;--------------六类歌曲频率和节拍定义------------------------------------------
mus_freq1 dw 330,294,262,330,294,262,330,294,330,262,330,440,392,330
dw 392,440,440,392,440,392,330,294,262,294,330,294,262,294,-1
mus_time1 dw 40*9,40*9,80*9,40*9,40*9,80*9,40*9,40*9,40*9,40*9,40*9,40*9,80*9,20*9,20*9
dw 40*9,40*9,40*9,40*9,80*9,20*9,20*9,40*9,40*9,40*9,40*9,40*9,80*9
mus_freq2 dw 330,294,262,294,3 dup(330)
dw 3 dup(294),330,392,392
dw 330,294,262,294,4 dup(330)
dw 294,294,330,294,262,-1
mus_time2 dw 6 dup(10*25),10*50
dw 2 dup(10*25,10*25,10*50)
dw 12 dup(10*25),10*100
mus_freq3 dw 330,392,330,294,330,392,330,294,330
dw 330,392,330,294,262,294,330,392,294,-1
mus_time3 dw 3 dup(2*25*10),1*25*10,1*25*10,2*25*10,1*25*10,1*25*10,4*25*10
dw 2 dup(2*25*10,2*25*10,1*25*10,1*25*10),4*10*25
mus_freq4 dw 392,330,330,349,294,294,262,294,330,349,4 dup(392),330,330,349,294,294
dw 262,330,392,392,3 dup(330),5 dup(294),330,349,5 dup(330),349,392
dw 392,330,330,349,294,294,262,330,392,392,262,-1
mus_time4 dw 2 dup(25*10,25*10,50*10),4 dup(25*10),3 dup(25*10,25*10,50*10)
dw 3 dup(6 dup(25*10),50*10)
dw 2 dup(25*10,25*10,50*10),4 dup(25*10),100*10
mus_freq5 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,-1
mus_time5 dw 3 dup(6 dup(25*10),50*10,6 dup(25*10),50*10)
mus_freq6 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,-1
mus_time6 dw 2 dup(25*10,25*10,50*10),4 dup(25*10),100*10,2 dup(25*10,25*10,50*10)
dw 4 dup(25*10),2 dup(50*10),2 dup(25*10,25*10,50*10)
dw 4 dup(25*10),100*10,2 dup(25*10,25*10,50*10),4 dup(25*10),100*10
;---------------高中低音频率表---------------------
LOWD DW 131,147,165,175,196,220,247
MID DW 262,294,330,349,392,440,494
HGH DW 523,587,659,697,783,879,987
;---------------21个琴键----------------------------
ORGATRON_KEY DB 'Q','W','E','R','U','I','O'
DB 'A','S','D','F','J','K','L'
DB 'Z','X','C','V','M',',','.'
;--------------------------------------------------
KEY_FIGURE DB 00H,01H,02H,03H,04H,05H,06H
DB 07H,08H,09H,10D,11D,12D,13D
DB 14D,15D,16D,17D,18D,19D,20D
KEY_PICTURE DB ?
full db 0
buff1 db ' Welcome you to run this programme!'
db ' '
db ' *****Please press any key*****$'
buff2 db ' My heart beats with yours!'
db ' ***** Please q to quit *****$'
DATA_ORGATRON ENDS
;------------------------------------------------------------------------
STACK_ORGATRON SEGMENT
DW 100 DUP(?)
STACK_ORGATRON ENDS
;------------------------------------------------------------------------
CODE_ORGATRON SEGMENT
ASSUME DS:DATA_ORGATRON,CS:CODE_ORGATRON,SS:STACK_ORGATRON
MAIN_ORGATRON PROC FAR
START_ORGATRON:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA_ORGATRON
MOV DS,AX
MAIN_MUSIC:
CALL FAR PTR MUSIC_ORGATRON
CALL FAR PTR MUSIC_YANZOU
CALL FAR PTR MAIN
;------------设置循环模式-----------------------------------
;MOV AH,1H
;INT 16H
;JZ MAIN_MUSIC
;MOV AH,0 ;是否有键按下
;INT 16H
;JZ MAIN_MUSIC
;CMP AL,0DH ;是回车键则退出
;JNE MAIN_MUSIC
;JMP MAIN_RETURN
MOV AH,4CH
INT 21H
;----------------------------------------------------------------------
;-------按T、Y、G、H、B、N键,分别播放六首歌曲,回车键返回!-----------
MUSIC_ORGATRON PROC FAR
PUSH BP
PUSH SI
PUSH AX
PUSH DI
PUSH BX
ms1: ;歌曲类型识别程序
mov ah,1
int 16h
jz ms1
mov ah,0
int 16h
cmp al,'/' ;%%%%%%%%%%%%下划线/,歌曲播放模式结束%%%%%%%%%%%
jnz r_r
JMP RR_RETURN
r_r: cmp al,'T'
jnz ms2
ms11: lea si,mus_freq1
lea bp,ds:mus_time1
jmp freq
ms2:
cmp al,'Y'
jnz ms3
ms21: lea si,mus_freq2
lea bp,ds:mus_time2
jmp freq
ms3:
cmp al,'G'
jnz ms4
ms31: lea si,mus_freq3
lea bp,ds:mus_time3
jmp freq
ms4:
cmp al,'H'
jnz ms5
ms41: lea si,mus_freq4
lea bp,ds:mus_time4
jmp freq
ms5:
cmp al,'B'
jnz ms6
ms51: lea si,mus_freq5
lea bp,ds:mus_time5
jmp freq
ms6:
cmp al,'N'
jnz pan_duan
ms61: lea si,mus_freq6
lea bp,ds:mus_time6
jmp freq
pan_duan:
cmp al,'/'
jnz ms1
JMP RR_RETURN
freq:
mov di,[si]
cmp di,-1
je ms1
mov bx,ds:[bp]
call far ptr soundf
add si,2
add bp,2
mov ah,1h
int 16h
jz rr
mov ah,0
int 16h
cmp al,'T'
jnz r1
call far ptr delay
jmp ms11
r1: cmp al,'Y'
jnz r2
call far ptr delay
jmp ms21
r2: cmp al,'G'
jnz r3
call far ptr delay
jmp ms31
r3: cmp al,'H'
jnz r4
call far ptr delay
jmp ms41
r4: cmp al,'B'
jnz r5
call far ptr delay
jmp ms51
r5: cmp al,'N'
jnz r6
call far ptr delay
jmp ms61
r6: cmp al,'/' ;%%%%%%%%%%%%下划线/,歌曲播放模式结束%%%%%%%%%%%
jnz rr
JMP RR_RETURN
rr: jmp freq
;--------------------------------------------------------
RR_RETURN:
POP BX
POP DI
POP AX
POP SI
POP BP
RET
MUSIC_ORGATRON ENDP
;----------------------------------------------------------------
;--------------------------------------------------------
;------------------演奏模式------------------------------
;--------------------------------------------------------
MUSIC_YANZOU PROC FAR
PUSH AX
PUSH BX
PUSH SI
PUSH DI
PUSH BP
PUSH CX
;------------------小键盘简化模式------------------
NEW: MOV AH,1H
INT 16H
JZ NEW
MOV AH,0 ;是否有键按下
INT 16H
JZ NEW
CMP AL,'*' ;是*键则返回
JNE SLOW
JMP RETURN_R1
SLOW: CMP AL,20H ;查询按键是否为低音键
JNZ SHIGH ;按键是空格键吗?否则转至查询高音键
LEA BX,LOWD
GO: MOV AH,0 ;是空格键则查询下一按键
INT 16H
CMP AL,'1' ;按键范围控制
JB GO
CMP AL,'7'
JA GO
AND AL,0FH ;按键ASCII码处理
MOV AH,0
MOV SI,AX
;%%%%%%%%%%%%%图形返回参数处理%%%%%%%%%%%%%%%%
PUSH BX
MOV BX,AX
ADD BX,13
MOV KEY_PICTURE,BL
POP BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL ;转至频率计算程序段
SHIGH: LEA BX,HGH ;查询是否为高音键
CMP AL,21H
JNZ SH1
MOV SI,1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MOV KEY_PICTURE,0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL
SH1: CMP AL,40H ;是否是SHIFT_2
JNZ SH2
MOV SI,2
;%%%%%%%%%%%%%高音图形返回参数%%%%%%%%%%%%%%%%
MOV KEY_PICTURE,1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL
SH2: CMP AL,23H ;是否是SHIFT_3到;是否是SHIFT_5键
JB SH5
CMP AL,25H
JA SH5
MOV AH,0
MOV SI,AX
SUB SI,20H
;%%%%%%%%%%%%%图形返回参数处理%%%%%%%%%%%%%%%%
PUSH BX
MOV BX,SI
SUB BX,1
MOV KEY_PICTURE,BL
POP BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL
SH5: CMP AL,5EH ;是否是SHIFT_6
JNZ SH6
MOV SI,6
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MOV KEY_PICTURE,5
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL
SH6: CMP AL,26H ;是否是SHIFT_7
JNZ SMID
MOV SI,7
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MOV KEY_PICTURE,6
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JMP JSPL
SMID: LEA BX,MID ;查询是否为中音键
CMP AL,'1' ;按键范围控制
JB RR_KEY
CMP AL,'7'
JA RR_KEY
AND AL,0FH ;按键ASCII码处理
MOV AH,0
MOV SI,AX
;%%%%%%%%%%%%%中音图形返回参数处理%%%%%%%%%%%%%%%%
PUSH BX
MOV BX,0H
MOV BL,6
ADD BL,AL
MOV KEY_PICTURE,BL
POP BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JSPL: SHL SI,1 ;按键对应频率处理
SUB SI,2
MOV DI,[BX][SI]
CALL FAR PTR GEN_ORGATRON ;调用发音子程序
JMP NEW ;接收下一按键
RR_KEY:
CALL FAR PTR KEY_ORGATRON
JMP NEW
RETURN_R1:
POP AX
POP BX
POP SI
POP DI
POP BP
POP CX
RET
MUSIC_YANZOU ENDP
;---------------演奏发音子程序-------------------------
GEN_ORGATRON PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H ;定时器初始化
OUT 43H,AL
MOV DX,12H
MOV AX,34DCH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL ;定时器送初值
IN AL,61H ;开扬声器
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT_1: IN AL,60H
DELAY_1:
TEST AL,80H ;查询键是否开放
JZ WAIT_1 ;未开放继续等待
MOV AL,AH ;键放开则关扬声器
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GEN_ORGATRON ENDP
;------------迷你键盘模式------------------------
KEY_ORGATRON PROC FAR
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH BP
PUSH SI
;CMP AL,'('
;JNZ RR1
;JMP RETURN_3
RR1: LEA SI,ORGATRON_KEY
LEA BP,KEY_FIGURE
CMP AL,[SI]
JZ Q_KEY
INC SI
INC BP
CMP AL,[SI]
JZ W_KEY
INC SI
INC BP
CMP AL,[SI]
JZ E_KEY
INC SI
INC BP
CMP AL,[SI]
JZ R_KEY
INC SI
INC BP
CMP AL,[SI]
JZ U_KEY
INC SI
INC BP
CMP AL,[SI]
JZ I_KEY
INC SI
INC BP
CMP AL,[SI]
JZ O_KEY
INC SI
INC BP
CMP AL,[SI]
JZ A_KEY
INC SI
INC BP
CMP AL,[SI]
JZ S_KEY
INC SI
INC BP
CMP AL,[SI]
JZ D_KEY
INC SI
INC BP
CMP AL,[SI]
JZ F_KEY
INC SI
INC BP
CMP AL,[SI]
JZ J_KEY
INC SI
INC BP
CMP AL,[SI]
JZ K_KEY
INC SI
INC BP
CMP AL,[SI]
JZ L_KEY
INC SI
INC BP
CMP AL,[SI]
JZ Z_KEY
INC SI
INC BP
CMP AL,[SI]
JZ X_KEY
INC SI
INC BP
CMP AL,[SI]
JZ C_KEY
INC SI
INC BP
CMP AL,[SI]
JZ V_KEY
INC SI
INC BP
CMP AL,[SI]
JZ M_KEY
INC SI
INC BP
CMP AL,[SI]
JZ K1_KEY
INC SI
INC BP
CMP AL,[SI]
JZ K2_KEY
INC SI
INC BP
JMP RETURN_ORGATRON
Q_KEY: MOV DI,523
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
W_KEY: MOV DI,587
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
E_KEY: MOV DI,659
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
R_KEY: MOV DI,697
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
U_KEY: MOV DI,783
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
I_KEY: MOV DI,879
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
O_KEY: MOV DI,987
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
A_KEY: MOV DI,262
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
S_KEY: MOV DI,294
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
D_KEY: MOV DI,330
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
F_KEY: MOV DI,349
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
J_KEY: MOV DI,392
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
K_KEY: MOV DI,440
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
L_KEY: MOV DI,494
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
Z_KEY: MOV DI,131
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
X_KEY: MOV DI,147
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
C_KEY: MOV DI,165
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
V_KEY: MOV DI,175
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
M_KEY: MOV DI,196
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
K1_KEY: MOV DI,220
CALL FAR PTR GEN_ORGATRON
JMP RETURN_ORGATRON
K2_KEY: MOV DI,247
CALL FAR PTR GEN_ORGATRON
;JMP RETURN_ORGATRON
RETURN_ORGATRON:
MOV BL,[BP]
MOV KEY_PICTURE,BL ;返回图形输入参数代码
;RETURN_3:
POP SI
POP BP
POP DI
POP DX
POP CX
POP BX
RET
KEY_ORGATRON ENDP
;-----------------------------------------------------------------
;-----------------------------------------------------------------
;通用发声子程序
soundf proc far
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,663
call far ptr waitf
dec bx
jnz wait1
mov al,ah
out 61h,al
pop di
pop dx
pop cx
pop bx
pop ax
ret
soundf endp
;-----------------------------------------------------------------
;(CX)=count of 15.08us 利用硬件产生精确延时
waitf proc far
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
;----------------------------------------------------------------
;去抖动延时程序
delay proc far
PUSH ECX
mov ecx,07000000h
delay1: loopd delay1
POP ECX
ret
delay endp
;----------------------------------------------------------------
;-----------------------------------------------------------------
;MAIN_RETURN:
main proc far
assume cs:CODE_ORGATRON,ds:DATA_ORGATRON
start:
push ds
sub ax,ax
push ax
mov ax,data_ORGATRON
mov ds,ax
mov ah,00
mov al,04
int 10h
mov ah,0bh
mov bh,00
mov bl,1
int 10h
mov ah,0bh
mov bh,1
mov bl,2
int 10h
mov dx,offset buff1 ;显示提示信息
mov ah,09
int 21h
mov ah,08
int 21h
call clear ;cls
sss:
call text ;display the text
mov di,2
mov al,1 ;draw the big box
mov cx,70
mov dx,20
mov bx,160
call box
mov cx,71
mov dx,21
mov bx,158
again:
mov al,1
mov di,0
call box
call delay11
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,94
jnz again
mov di,0 ;draw the 2nd box
mov cx,95
mov dx,45
mov al,1
mov bx,110
call box
mov cx,96
mov dx,46
mov bx,108
again_00:
mov al,1
mov di,0
call box
call delay11
call delay11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -