📄 电子琴+电子钟.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 ?
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
ts1 DB 0
quitbuf DB 'welcome you to run this programme. '
quitbuf2 DB 'C: change color; B:extend the colck; S:reduce the clock '
quitbuf3 DB 'press e to sound; Press q to quit ! '
sigle DB 80h
absx DW 0
absy DW 0
sut DW 0
erroybz DB 0
r0 DW 90
x0 DW 320
y0 DW 245
count0 db 0
count_hour DB 11
count_minute DB 11
yuanxinx DW 0
yuanxiny DW 0
s DB 0
s2 DB 0
s3 DB 0
hour DW 0
hour2 DW 0
minute DW 0
minute2 DW 0
second DB 0
second2 DB 0
sin_x DW 0
sin_xx DW 0
x DW 0
y DW 0
x1 DW 0
xminy DW 0
yminx DW 0
xmax DW 0
ymax DW 0
ymin DW 0
xmin DW 0
sjx_xminy DW 0
sjx_yminx DW 0
sjx_xmax DW 0
sjx_ymax DW 0
sjx_ymin DW 0
sjx_xmin DW 0
yuanx DW 0
yuany DW 0
y1 DW 0
x2 DW 0
y2 DW 0
x3 DW 0
y3 DW 0
DIancolor DB 0
color DB 2
color_hour DB 2
color_min DB 6
color_second DB 9
color4 DB 10
color5 DB 11
color6 DB 12
backgroundcolor DB 1
page1 DB 0
y2y1 DW 0
x2x1 DW 0
sjx_y2y1 DW 0
sjx_x2x1 DW 0
;------------------------------------------------------
DATA_ORGATRON ENDS
;------------------------------------------------------------------------
STACK_ORGATRON SEGMENT
STACK_BUF DW 120 DUP(?)
TOP EQU $-STACK_BUF
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
;----------------------------------------------------------------------
;-------按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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -