?? warm.asm
字號:
;*****************************產(chǎn)生滑音***************************************
;****************************************************************************
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 ;設(shè)置圖形方式顯示下的背景色
MOV BH,0
MOV BL,5
INT 10H
MOV AH,0BH ;設(shè)置彩色組
MOV BH,6
MOV BL,2
INT 10H
;***********定義一個宏***********************************
;顯示輸入初始頻率,以及脈沖持續(xù)時間,聲音上滑和下滑的幅度的提示信息
;輸入相關(guān)信息
INPUT macro b,c
lea DX,b
mov AH,09
int 21h
mov AH,0AH
lea DX,c
int 21h
lea SI,c
endm
;宏定義結(jié)束
;********************************************************
LEA DX,OUTMSG ;顯示菜單
MOV AH,09
INT 21H
MOV AH,01H
INT 21H ;等待輸入選擇
CMP AL,'Q'
JE EXIT
CMP AL,'R'
JE RISE ;輸入字符等于'R'執(zhí)行上滑音的過程
CMP AL,'F'
JE FALL ;輸入字符等于'F'執(zhí)行上滑音的過程
lea dx,error
mov ah,09h
int 21h
JMP START
EXIT: MOV AX,4C00H ;返回DOS
INT 21H
MAIN ENDP
;主過程結(jié)束
;********************************************************************
;下滑音過程
FALL :
INPUT inputIf,freq1 ;調(diào)用宏
CALL CHANGE
MOV DI,DX ;設(shè)定頻率初值
CALL CHANGE1
mov Y,Dx ;設(shè)定頻率終止值
INPUT inputT,TIME
CALL CHANGE
MOV X,DX ;設(shè)定脈沖持續(xù)時間
INPUT inputRF,RATE
CALL CHANGE
MOV SI,DX ;設(shè)定頻率下滑的幅度
LOOP1:
PUSH DI
CALL SOUND ;輸出頻率
lea dx,DIS2
mov ah,09h
int 21h
POP DI
sub di,si ;頻率降低
CMP di,Y
JAE LOOP1 ;循環(huán)輸出
JMP START ;循環(huán)結(jié)束無條件跳轉(zhuǎn)到開始過程,等待下一次輸入
;下滑音過程結(jié)束
;********************************************************************
;上滑音過程
RISE:
INPUT inputIF,freq1 ;調(diào)用宏
CALL CHANGE
MOV DI,DX ;設(shè)定頻率初值
CALL CHANGE1
mov Y,Dx ;設(shè)定頻率終止值
INPUT inputT,TIME
CALL CHANGE
MOV X,DX ;設(shè)定脈沖持續(xù)時間
INPUT inputRR,RATE
CALL CHANGE
mov SI,DX ;設(shè)定頻率上滑的幅度
LOOP2:
push DI
CALL SOUND ;輸出頻率
lea DX,DIS1
mov AH,09h
int 21h
pop DI
add DI,SI ;頻率升高
CMP DI,Y ;是否到預(yù)定頻率終止值
JBE LOOP2 ;若未到,循環(huán)輸出
JMP START ;循環(huán)結(jié)束無條件跳轉(zhuǎn)到開始過程,等待下一次輸入
;上滑音過程結(jié)束
;********************************************************************
; 發(fā)聲子程序,利用定時器產(chǎn)生聲音
SOUND proc near
MOV BX,X
mov al,10110110B ;位組合格式:通道2,兩字節(jié)計數(shù),模式3 ,二進(jìn)制碼
out 43h,AL ;幻數(shù)送方式寄存器
mov DX,12h
mov AX,34Dch
div DI ;(DI)=頻率
out 42h,AL ; 頻率計數(shù)值送通道2
mov AL,AH
out 42h,AL
in AL,61h
mov AH,al
or AL,3
out 61h,AL ;接通揚(yáng)聲器
wait1:
mov CX,0FFFFH ;特定音長的計數(shù)值
delay:
loop delay ;延時循環(huán)
dec BX ;(BX)=特定音長的倍數(shù)值
jnz wait1
mov AL,AH
out 61h,AL ;關(guān)閉揚(yáng)聲器
ret
SOUND endp
;發(fā)聲子程序結(jié)束返回到滑音過程相應(yīng)位置
;**************************************************************************
;數(shù)制轉(zhuǎn)換子程序,0~9 ASCII碼轉(zhuǎn)換成十進(jìn)制數(shù)字
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)=十進(jìn)制數(shù)的萬位
PUSH AX
mov AL,[si+3]
SUB AL,30H
mov BL,125
mul BL
MOV BX,AX
MOV CL,3
SHL AX,CL ;(AX)=十進(jìn)制數(shù)的千位
PUSH AX
mov AL,[si+4]
SUB AL,30H
mov BL,100
mul BL ;(AX)=十進(jìn)制數(shù)的百位
PUSH AX
mov AL,[si+5]
SUB AL,30H
mov BL,10
mul BL ;(AX)=十進(jìn)制數(shù)的十位
PUSH AX
mov AL,[si+6]
SUB AL,30H
CBW ;(AX)=十進(jìn)制數(shù)的個位
mov DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX
pop AX
ADD DX,AX ;(DX)=十進(jìn)制數(shù)
RET
CHANGE ENDP
;***************************************************************************
;鍵入終止頻率的值,并轉(zhuǎn)換為十進(jìn)制子程序
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
;子程序結(jié)束
;*****************************
CODE ENDS
END start
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -