📄 complex.asm
字号:
DATA SEGMENT
ioport equ 0c000h-280h ;实验箱驱动默认中断地址为C000H,此处设置偏移量
;8255A
ioport1 equ ioport+288h
ioport2 equ ioport+28bh
;8253
ioport3 equ ioport+280h
ioport4 equ ioport+283h
;ADC0809
ioport5 equ ioport+29ah
;DAC0832
ioport6 equ ioport+290h
ORG 1000H
REC DB 13,10,"Press any key to record.",13,10,'$'
PLY DB 13,10,"Press any key to play, SPACE to play again, else to exit.",13,10,'$'
DAT DB 60000 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,DATA
MOV DS,AX
LEA DX,REC ;打印录音提示
MOV AH,09H
INT 21H
MOV AL,0
CHK:MOV AH,0BH ;检测键盘按键
INT 21H
CMP AL,0FFH
JE NEXT
JMP CHK
NEXT:CALL MYRECORD ;调用录音子程序
LEA DX,PLY ;打印放音提示
MOV AH,09H
INT 21H
MOV AL,0
CHK1:MOV AH,0BH ;检测键盘按键
INT 21H
CMP AL,0FFH
JE NEXT1
JMP CHK1
NEXT1:CALL PLAY ;调用放音子程序
MOV AL,0
CHK2:MOV AH,0BH ;检测键盘按键
INT 21H
CMP AL,0FFH
JE NEXT2
JMP CHK2
NEXT2:MOV AH,07H ;检测空格键
INT 21H
CMP AL,20H
JE NEXT1
MOV AH,4CH
INT 21H
;==============================
RET
START ENDP
DELAY PROC NEAR
;延时子程序
PUSH DX
PUSH AX
MOV DX,ioport4
MOV AL,00010000B
OUT DX,AL
MOV DX,ioport3
MOV AL,200
OUT DX,AL
MOV DX,ioport2
MOV AL,10010000B
OUT DX,AL
MOV DX,ioport1
MOV AL,0
CHKPA0:IN AL,DX
AND AL,1
CMP AL,1
JNE CHKPA0
POP AX
POP DX
RET
DELAY ENDP
MYRECORD PROC NEAR
;录音子程序
PUSH DI
PUSH CX
PUSH DX
PUSH AX
MOV DI,OFFSET DAT
MOV CX,60000
AD: MOV DX,ioport5
OUT DX,AL
CALL DELAY
IN AL,DX
MOV [DI],AL
INC DI
LOOP AD
POP AX
POP DX
POP CX
POP DI
RET
MYRECORD ENDP
PLAY PROC NEAR
;放音子程序
PUSH SI
PUSH CX
PUSH DX
PUSH AX
MOV SI,OFFSET DAT
MOV CX,60000
MOV DX,ioport6
DA: MOV AL,[SI]
OUT DX,AL
INC SI
CALL DELAY
LOOP DA
POP AX
POP DX
POP CX
POP SI
RET
PLAY ENDP
CODE ENDS
END STT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -