📄 warm.asm
字号:
;*****************************产生滑音***************************************
;****************************************************************************
DATA SEGMENT
OUTMSG DB 0DH,0AH ;定义菜单
DB '*******THIS IS A GLIDE PROGREAM*******',0DH,0AH
DB 0DH,0AH
DB 0DH,0AH
DB '***********WELCOME TO HEAR!***********',0DH,0AH
DB 0DH,0AH
DB 0DH,0AH
DB 0DH,0AH
DB 'PLEASE SELECET:',0DH,0AH
DB 0DH,0AH
DB 0DH,0AH
DB 'R---RISE',0DH,0AH
DB 0DH,0AH
DB 'F---FALL',0DH,0AH
DB 0DH,0AH
DB 'Q---EXIT',0DH,0AH
DB 0DH,0AH
DB 'Your choice:','$'
freq1 DB 6,?,6 dup(?)
freq2 DB 6,?,6 dup(?)
Y DW ?
X DW ?
time DB 6,?,6 dup(?)
RATE DB 6,?,6 DUP(?)
inputrr DB 0DH,0AH ,'please input RANGE of frequent rising:','$'
inputIF DB 0DH,0AH ,'please input INITIAL frequent :','$'
inputrf DB 0DH,0AH ,'please input RANGE of frequent falling:','$'
inputFF DB 0DH,0AH ,'please input FINAL frequent :','$'
inputT DB 0DH,0AH ,'please input duration time:','$'
error DB 0DH,0AH ,'Input error!Please selecet again:','$'
DIS1 DB 0DH,0AH,'RISE','$'
DIS2 DB 0DH,0AH,'FALL','$'
DATA ENDS
;******************************************************************************
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: mov AX,data
mov DS,AX
MOV AH,0
MOV AL,04
INT 10H
MOV AH,0BH ;设置图形方式显示下的背景色
MOV BH,0
MOV BL,5
INT 10H
MOV AH,0BH ;设置彩色组
MOV BH,6
MOV BL,2
INT 10H
;***********定义一个宏***********************************
;显示输入初始频率,以及脉冲持续时间,声音上滑和下滑的幅度的提示信息
;输入相关信息
INPUT macro b,c
lea DX,b
mov AH,09
int 21h
mov AH,0AH
lea DX,c
int 21h
lea SI,c
endm
;宏定义结束
;********************************************************
LEA DX,OUTMSG ;显示菜单
MOV AH,09
INT 21H
MOV AH,01H
INT 21H ;等待输入选择
CMP AL,'Q'
JE EXIT
CMP AL,'R'
JE RISE ;输入字符等于'R'执行上滑音的过程
CMP AL,'F'
JE FALL ;输入字符等于'F'执行上滑音的过程
lea dx,error
mov ah,09h
int 21h
JMP START
EXIT: MOV AX,4C00H ;返回DOS
INT 21H
MAIN ENDP
;主过程结束
;********************************************************************
;下滑音过程
FALL :
INPUT inputIf,freq1 ;调用宏
CALL CHANGE
MOV DI,DX ;设定频率初值
CALL CHANGE1
mov Y,Dx ;设定频率终止值
INPUT inputT,TIME
CALL CHANGE
MOV X,DX ;设定脉冲持续时间
INPUT inputRF,RATE
CALL CHANGE
MOV SI,DX ;设定频率下滑的幅度
LOOP1:
PUSH DI
CALL SOUND ;输出频率
lea dx,DIS2
mov ah,09h
int 21h
POP DI
sub di,si ;频率降低
CMP di,Y
JAE LOOP1 ;循环输出
JMP START ;循环结束无条件跳转到开始过程,等待下一次输入
;下滑音过程结束
;********************************************************************
;上滑音过程
RISE:
INPUT inputIF,freq1 ;调用宏
CALL CHANGE
MOV DI,DX ;设定频率初值
CALL CHANGE1
mov Y,Dx ;设定频率终止值
INPUT inputT,TIME
CALL CHANGE
MOV X,DX ;设定脉冲持续时间
INPUT inputRR,RATE
CALL CHANGE
mov SI,DX ;设定频率上滑的幅度
LOOP2:
push DI
CALL SOUND ;输出频率
lea DX,DIS1
mov AH,09h
int 21h
pop DI
add DI,SI ;频率升高
CMP DI,Y ;是否到预定频率终止值
JBE LOOP2 ;若未到,循环输出
JMP START ;循环结束无条件跳转到开始过程,等待下一次输入
;上滑音过程结束
;********************************************************************
; 发声子程序,利用定时器产生声音
SOUND proc near
MOV BX,X
mov al,10110110B ;位组合格式:通道2,两字节计数,模式3 ,二进制码
out 43h,AL ;幻数送方式寄存器
mov DX,12h
mov AX,34Dch
div DI ;(DI)=频率
out 42h,AL ; 频率计数值送通道2
mov AL,AH
out 42h,AL
in AL,61h
mov AH,al
or AL,3
out 61h,AL ;接通扬声器
wait1:
mov CX,0FFFFH ;特定音长的计数值
delay:
loop delay ;延时循环
dec BX ;(BX)=特定音长的倍数值
jnz wait1
mov AL,AH
out 61h,AL ;关闭扬声器
ret
SOUND endp
;发声子程序结束返回到滑音过程相应位置
;**************************************************************************
;数制转换子程序,0~9 ASCII码转换成十进制数字
CHANGE PROC
mov AL,[si+2]
SUB AL,30H
mov BL,125
mul BL
MOV BX,AX
MOV CL,6
SHL AX,CL
MOV CL,4
SHL BX,CL
ADD AX,BX ;(AX)=十进制数的万位
PUSH AX
mov AL,[si+3]
SUB AL,30H
mov BL,125
mul BL
MOV BX,AX
MOV CL,3
SHL AX,CL ;(AX)=十进制数的千位
PUSH AX
mov AL,[si+4]
SUB AL,30H
mov BL,100
mul BL ;(AX)=十进制数的百位
PUSH AX
mov AL,[si+5]
SUB AL,30H
mov BL,10
mul BL ;(AX)=十进制数的十位
PUSH AX
mov AL,[si+6]
SUB AL,30H
CBW ;(AX)=十进制数的个位
mov DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX ;(DX)=十进制数
RET
CHANGE ENDP
;***************************************************************************
;键入终止频率的值,并转换为十进制子程序
CHANGE1 proc
lea DX,inputff
mov AH,09
int 21h
mov AH,0Ah
lea DX,freq2
int 21h
lea SI,freq2
call change
ret
change1 endp
;子程序结束
;*****************************
CODE ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -