📄 recorder.asm
字号:
;====================================栈段==============================================
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
;======================================================================================
;====================================数据段============================================
DATA SEGMENT
SFILE DB 'SDATA.DAT','$';
BUFFER DB 60000 DUP(?);对应为12s的录音数据
MESS DB 'PLEASE ENTER CHOICE BY LETTER TO INPUT',0DH,0AH,0AH
;------------------------------------菜单内容------------------------------------------
DB 20 DUP(' '),'S-START 12s RECORDING',0DH,0AH
DB 20 DUP(' '),'P-PLAY THE 12s RECORD',0DH,0AH
DB 20 DUP(' '),'B-BEGIN NO TIME LIMIT RECORDING',0DH,0AH
DB 20 DUP(' '),'R-READ NO TIME LIMIT RECORD',0DH,0AH
DB 20 DUP(' '),'I-INTRODUCTION',0DH,0AH
DB 20 DUP(' '),'E-EXIT',0DH,0AH,'$'
;------------------------------------提示信息------------------------------------------
NAMEC DB 'Press Any Key To Start Recording$'
ADDRESS DB 'Press Any Key To Start Playing$'
INTRO DB '2006 All Right Reserved @ By Roger Wong$'
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,67H,77H,7CH,39H,5EH,79H,71H
FILE DB 'DATA.DAT','$';不限时录音所存入的文件名
DATA ENDS
;======================================================================================
;=================================== 代码段 ===========================================
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
;**********************屏幕初始化************************
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0012H;640*480 16色图形(EGA)
INT 10H
;**********************设置中断向量**********************
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET INT7;中断向量
MOV AX,250FH;设置中断向量,中断类型号为0F
INT 21H
MOV AX,DATA
MOV DS,AX
IN AL,21H
;**********************实现菜单**************************
FOLLOW: CALL LCREEN
MOV DH,08;光标所在行
MOV DL,20;光标所在列
CALL POCREEN
MOV DX,OFFSET MESS;显示菜单
MOV AH,9
INT 21H
MOV DH,08;光标所在行
MOV DL,59;光标所在列
CALL POCREEN
INPUT: MOV AH,7;键盘输入(无回显)
INT 21H
CMP AL,'S';限时录音
JNE NOTS
MOV DX,OFFSET NAMEC
CALL DISPLA
CALL RECOR
JMP FOLLOW
NOTS: CMP AL,'P'
JNE NOTP
MOV DX,OFFSET ADDRESS
CALL DISPLA
MOV CX,60000;限时放音
CALL PLAY
JMP FOLLOW
NOTP: CMP AL,'I'
JNE NOTI
MOV DX,OFFSET INTRO;显示说明
CALL DISPLA
JMP FOLLOW
NOTI: CMP AL,'B'
JNE NOTW
MOV DX,OFFSET NAMEC
CALL DISPLA
;**********建立输出文件,将数据循环输出到文件***********
MOV DX,OFFSET FILE ;文件名
MOV AH,3CH
MOV CX,0 ;文件属性
INT 21H
PUSH AX ;文件代号
X: CALL RECOR
MOV BX,CX
MOV CX,60000
SUB CX,BX
;*********************输出数据**************************
MOV DX,OFFSET BUFFER
POP BX ;文件代号
PUSH BX
MOV AH,40H;写文件
INT 21H
CMP CX,60000
JZ X
POP BX
MOV AH,3EH;关闭文件
INT 21H
BACK: JMP FOLLOW
TOINPUT: JMP INPUT
NOTW: CMP AL,'R'
JNE NOTR
MOV DX,OFFSET ADDRESS
CALL DISPLA
;**************打开输入文件,并循环播放*****************
MOV DX,OFFSET FILE ;文件名
MOV AL,0 ;AL=0表示读
MOV AH,3DH ;打开文件
INT 21H
PUSH AX
Y: POP BX;BX中为文件代号
MOV DX,OFFSET BUFFER;数据缓冲区地址
MOV CX,60000;读取的字节数
MOV AH,3FH;读文件
INT 21H
PUSH BX
MOV CX,AX
PUSH AX
CALL PLAY
POP AX
CMP AX,60000
JZ Y
POP BX
MOV AH,3EH;关闭文件
INT 21H
JMP BACK
NOTR: CMP AL,'E'
JNE TOINPUT
CALL LCREEN
MOV DX,0
CALL POCREEN
MOV AX,0003H;80*25彩色方式
INT 10H
MOV AH,4CH
INT 21H
;-------------------------------中断服务程序-------------------------------
INT7: PUSH AX
CMP CX,5000
JB NSUB
SUB CX,5000;快进
ADD SI,5000
NSUB: MOV AL,20H
OUT 20H,AL
POP AX
IRET
;--------------------------------------------------------------------------
;------------------------------显示信息子程序------------------------------
DISPLA PROC
PUSH DX
CALL DELAY
CALL LCREEN
MOV DH,12
MOV DL,20
CALL POCREEN;设置光标位置
POP DX
MOV AH,9
INT 21H
MOV AH,7
INT 21H
RET
DISPLA ENDP
;--------------------------------------------------------------------------
;-----------------------------屏幕初始化程序-------------------------------
LCREEN PROC
MOV AH,06H;屏幕初始化
MOV AL,00H;整个窗口空白
MOV CX,0;左上角行列号均为0
MOV DH,29;右下角行号为29
MOV DL,79;右下角列号为79
MOV BH,00H;卷入行属性
INT 10H
RET
LCREEN ENDP
;--------------------------------------------------------------------------
;-----------------------------置光标程序-----------------------------------
POCREEN PROC
MOV AH,02H;置光标位置
MOV BH,00;BH=页号
INT 10H
RET
POCREEN ENDP
;--------------------------------------------------------------------------
;-----------------------------软件延时子程序-------------------------------
DELAY PROC
PUSH CX
MOV CX,0
DELAY1: LOOP DELAY1
POP CX
RET
DELAY ENDP
;--------------------------------------------------------------------------
;-----------------------------录音程序-------------------------------------
;
RECOR PROC NEAR
CALL LCREEN
MOV CX,0
MOV AL,10
MOV AH,0CH;写像素
;***************在屏幕中间一行画出一条线**********************
MOV DX,240;行
PAINT: INT 10H
INC CX
CMP CX,640
JNZ PAINT
;*********************采集数据********************************
MOV DI,OFFSET BUFFER
MOV CX,60000
CLD
MOV BX,0
REC: MOV DX,2B2H;将采集的模拟量转为数字量
OUT DX,AL
CALL DLAY
IN AL,DX
STOSB
;显示数据波形
CALL DRAWLINE
CALL DISPLED;在LED管上显示剩余时间
MOV AH,1
INT 16H
JNZ R
LOOP REC
R: RET
RECOR ENDP
;--------------------------------------------------------------------------
;--------------------------播放录音程序------------------------------------
PLAY PROC NEAR
PUSH CX
;#####开放中断#####
IN AL,21H
AND AL,7FH
OUT 21H,AL
CALL LCREEN
MOV AX,0C0AH;写像素,像素值为0A
;***************在屏幕中间一行画出一条线**********************
MOV DX,240;行
DRAW: INT 10H
INC CX
CMP CX,640
JNZ DRAW
POP CX
;**********************播放录音*******************************
MOV SI,OFFSET BUFFER
CLD
FANG_YIN: MOV DX,2A0H;将数字量转化为模拟量
LODSB
SUB AL,30H
PUSH AX
OUT DX,AL
CALL DLAY
POP AX
;显示数据波形
CALL DRAWLINE
CALL DISPLED;在LED管上显示剩余时间
MOV AH,1
INT 16H
JZ LLL
JMP RRR
LLL: LOOP FANG_YIN
;#####关闭中断#####
RRR: IN AL,21H
OR AL,80H
OUT 21H,AL
RET
PLAY ENDP
;--------------------------------------------------------------------------
;--------------------------硬件延时子程序----------------------------------
DLAY PROC NEAR
PUSH DX
MOV AL,10H
MOV DX,283H
OUT DX,AL
MOV AL,200;设置采集频率
MOV DX,280H
OUT DX,AL
MOV DX,28BH
MOV AL,9BH
OUT DX,AL
MOV DX,288H
DLAY1: IN AL,DX
AND AL,1
JZ DLAY1
POP DX
RET
DLAY ENDP
;--------------------------------------------------------------------------
;---------------------------显示一点波形子程序-----------------------------
DRAWLINE PROC NEAR
PUSH CX
AND AX,0FH
PUSH BX
MOV BL,13
MUL BL
POP BX
MOV DX,AX
PUSH DX
MOV DX,0
MOV AX,CX
PUSH BX
MOV BX,94
DIV BX
POP BX
MOV CX,AX
MOV AX,640
SUB AX,CX
MOV CX,AX
MOV AX,0C0AH
POP DX
CMP BX,100
JNE NP
MOV BX,0
PUSH DX
ADD DX,241
PP: INT 10H
DEC DX
CMP DX,239
JNE PP
POP DX
PUSH BX
MOV BX,230
SUB BX,DX
MOV DX,BX
POP BX
QQ: INT 10H
INC DX
CMP DX,240
JNE QQ
NP: INC BX
POP CX
RET
DRAWLINE ENDP
;--------------------------------------------------------------------------
;-----------------------------LED管显示剩余时间子程序----------------------
DISPLED PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DX,28BH
MOV AL,90H
OUT DX,AL
MOV BX,5000
MOV AX,CX
MOV DX,0
DIV BX
AND AL,0FH
MOV BX,OFFSET LED
XLAT
MOV DX,28AH
OUT DX,AL
POP AX
POP BX
POP CX
POP DX
RET
DISPLED ENDP
CODE ENDS
;--------------------------------------------------------------------------
=======================================================================================
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -