📄 16550-s.asm
字号:
DATA SEGMENT
MY16550_0 EQU 0E480H
MY16550_1 EQU 0E481H
MY16550_3 EQU 0E483H
MY16550_4 EQU 0E484H
MY16550_5 EQU 0E485H
ERROR_MESSAGE DB 'ERROR!$' ;定义出错时显示的提示
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: ;16500初始化
MOV AX,DATA
MOV DS,AX
MOV DX,MY16550_3
MOV AL,80H
OUT DX,AL ;除数允许寄存器置1
CALL DALLY
MOV DX,MY16550_0 ;初始化波特率为9600b/s
MOV AL,0CH ;除数锁存器低位赋值0CH
OUT DX,AL
CALL DALLY
MOV DX,MY16550_1
MOV AL,00H ;除数锁存器高位赋值00H
OUT DX,AL
CALL DALLY
MOV DX,MY16550_3
MOV AL,1BH ;设置线路控制寄存器的格式:偶数校验,1位停止位,字符长度为8位
OUT DX,AL
CALL DALLY
MOV DX,MY16550_4
MOV AL,03H ;设置MODEM控制寄存器
OUT DX,AL
CALL DALLY
MOV DX,MY16550_1
MOV AL,00H ;所有中断屏蔽
OUT DX,AL
CALL DALLY
READ:
MOV DX,MY16550_5
IN AL,DX
TEST AL,01H ;接收缓冲区满时,最低位为1
JNZ RECEIVE ;接收缓冲区满,接收数据
TEST AL,8EH ;AL与8EH按位与
JNZ ERROR ;结果不全为零,即有错误,跳转到ERROR
TEST AL,20H ;AL与20H按位与
JNZ SEND ;结果不全为零,即发送保持寄存器空,跳转到SEND
JMP READ ;继续循环检测接收缓冲寄存器和发送保持寄存器的状态
ERROR: ;出错处理,显示一个提示
MOV DX , OFFSET ERROR_MESSAGE
MOV AH , 09H
INT 21H
MOV DX,MY16550_0
OUT DX,AL
CALL DALLY
MOV AL,26H
OUT DX,AL
CALL DALLY
JMP EXIT
SEND:
MOV AH,01H ;BIOS功能用以检测是否有字符可读
INT 16H ;BIOS键盘中断
JZ READ ;若无击键则返回循环
MOV AH,00H ;BIOS功能用于取击键码
INT 16H ;击键码现在AL中
CMP AL,03H ;检测CTRL+C
JZ EXIT
CMP AL,0DH ;判断刚才收到的字符是否为回车
JNZ A ;不是回车,跳到A处
MOV AL,20H
;MOV DX,MY16550_0
;OUT DX,AL
;CALL DALLY
;MOV DL,AL
;MOV AH,02H
;INT 21H
;MOV AL,0AH
;MOV DL,AL
;MOV AH,02H
;INT 21H
;JMP READ
A: MOV DL,AL
MOV AH,02H
INT 21H
MOV DX,MY16550_0
OUT DX,AL
CALL DALLY
JMP READ
RECEIVE:
MOV DX,MY16550_0
IN AL,DX
CMP AL,03H ;检测CTRL+C
JZ EXIT ;若是 , 转EXIT处结束程序
CMP AL,20H ;判断刚才收到的字符是否为回车
JNZ B ;不是回车,跳到B处
MOV AL,0DH ;格式设置
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,0AH
MOV DL,AL
MOV AH,02H
INT 21H ;不是,转线路检测循环
CALL SHOW
JMP READ
B:
MOV DL,AL ;准备显示字符
MOV AH,02H ;用于显示字符的DOS中断
INT 21H
JMP READ
SHOW PROC NEAR
MOV DX,MY16550_0
MOV AL,4FH
OUT DX,AL
CALL DALLY
MOV AL,4BH
OUT DX,AL
CALL DALLY
MOV AL,0DH
OUT DX,AL
CALL DALLY
MOV AL,0AH
OUT DX,AL
CALL DALLY
RET
SHOW ENDP
DALLY:
PUSH CX
PUSH AX
MOV CX,0100H
D1:
MOV AX,2000H
D2:
DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
EXIT: ;程序退出
MOV AX , 4C00H
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -