📄 recorder final.asm
字号:
;DIGITAL RECORDER DESIGN
;Use nested procedure to program
;Press 'r' to record.
;Press 'p' to play.
;Press ESC to quit.
;72H is an ASCII of 'r'
;70H is an ASCII of 'p'
;1BH is an ASCII of ESC key
;Set flag BL.When BL=1,it means you can play it which you had recorded before,
;otherwise it'll display a message of WARNING
;11*******************************************************************************
DATA SEGMENT
ioport equ 0dd80h-280h
io8253a equ ioport+280h;8253的A口地址
io8253b equ ioport+283h;8253的控制字
io8255a equ ioport+288h;8255的A口地址
io8255b equ ioport+28bh;8255的控制字
io0832a equ ioport+290h;DAC0832入口地址
io0809a equ ioport+29ah;ADC0809的IN2通道的地址
RECMSG1 DB "Press 'r' to record.",0dh,0ah,'$'
RECMSG2 DB 0dh,0ah,"Record complete!Congratulation!",0dh,0ah,0dh,0ah,'$'
PLYMSG1 DB "Press 'p' to play.",0dh,0ah,'$'
PLYMSG2 DB 0dh,0ah,"Play complete!Congratulation!",0dh,0ah,0dh,0ah,'$'
EXITMSG DB "Press ESC to quit.",0dh,0ah,'$'
WARNMSG DB 0dh,0ah,"Haven't record anything yet!",0dh,0ah,"Or wrong input character!",0dh,0ah,0dh,0ah,'$'
BUF DB 60000 DUP(?)
DATA ENDS
;30*******************************************************************************
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;-------------------------------------------------------------------------------
MAIN PROC FAR
START:
PUSH DS
SUB AX,AX
PUSH AX
SUB BX,BX
PUSH BX
;41
MOV AX,DATA
MOV DS,AX
NOTICE:
MOV DX,OFFSET RECMSG1;显示录音提示"Press 'r' to record."
MOV AH,09H
INT 21H
MOV DX,OFFSET PLYMSG1;显示放音提示"Press 'p' to quit."
MOV AH,09H
INT 21H
MOV DX,OFFSET EXITMSG;显示退出提示"Press ESC to quit."
MOV AH,09H
INT 21H
CONTROL:
MOV AH,1;键盘输入并回显
INT 21H
CMP AL,72H;小写'r'的ASCII码
JE REC;若是'r'则转AD
CMP AL,70H;小写'p'的ASCII码
JE FLAG
CMP AL,1BH;ESC键的ASCII码
JE EXIT;若是ESC键,则退出
JNE WARNING
REC:
CALL RECORDING;调用录音子程序
MOV DX,OFFSET RECMSG2;显示录音完毕提示Record complete!Congratulation!
MOV AH,09H
INT 21H
MOV BL,1;BL=1表明程序已经进行了录音,可以执行放音,否则显示WARNING信息
;MOV AL,0;AL清零
JMP NOTICE
FLAG:
CMP BL,1;判断BL是否为1
JE PLY;若是1,则转PLAY
JNE WARNING
PLY:
CALL PLAY;调用放音子程序
MOV DX,OFFSET PLYMSG2;显示放音完毕提示Play complete!Congratulation!
MOV AH,09H
INT 21H
JMP NOTICE
WARNING:
MOV DX,OFFSET WARNMSG
MOV AH,09H
INT 21H
;显示警告信息Haven't record anything yet!Or wrong input character!
JMP NOTICE
EXIT:
MOV AH,4CH
INT 21H
RET
MAIN ENDP
;94-------------------------------------------------------------------------------
RECORDING PROC NEAR;录音子程序
PUSH SI
PUSH AX
PUSH CX
PUSH DX
MOV SI,OFFSET BUF
MOV CX,60000
AD:
MOV DX,io0809a;ADC0809IN2通道地址29ah
OUT DX,AL;启动一次AD转换
CALL DELAY;调用延时子程序
IN AL,DX
MOV [SI],AL
INC SI
LOOP AD
POP DX
POP CX
POP AX
POP SI
RET
RECORDING ENDP
;118-------------------------------------------------------------------------------
PLAY PROC NEAR;放音子程序
PUSH DI
PUSH AX
PUSH CX
PUSH DX
MOV DI,OFFSET BUF
MOV CX,60000
MOV DX,io0832a;DAC0832的入口地址
DA:
MOV AL,[DI]
OUT DX,AL
CALL DELAY
INC DI
LOOP DA
POP DX
POP CX
POP AX
POP DI
RET
PLAY ENDP
;141-------------------------------------------------------------------------------
DELAY PROC NEAR;延时子程序
PUSH AX
PUSH DX
MOV DX,io8253b;8253的控制字
MOV AL,00010000B;计数器0以方式0工作,二进制计数
OUT DX,AL
MOV DX,io8253a;8253的A口地址
MOV AL,200
OUT DX,AL
MOV DX,io8255b;8255的控制字
MOV AL,10010000B;8255A方式0,A口输入
OUT DX,AL
MOV DX,io8255a;8255的A口地址
CHKPA0:
IN AL,DX
TEST AL,00000001B;检查PA0的状态
JZ CHKPA0
POP DX
POP AX
RET
DELAY ENDP
;166-------------------------------------------------------------------------------
CODE ENDS
;*******************************************************************************
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -