发送采用查询方式。接收采用中断方式。
发送的查询模式,要查询两个东西,一个是键盘缓冲区,一个是通信线状态寄存器。当键盘缓冲区有内容,读取出键盘缓冲区ASCII码,然后等待通讯线状态寄存器的D5位为1,即可将数据发送到发送保持寄存器(2F8H)。
接收采用中断方式。一旦接收到字符,即转入中断服务子程序。由于采用辅串口,中断类型码为0BH。进入中断服务子程序后读取接收缓冲寄存器内容,如果不是“Esc”即显示出来,否则设置标志flag为-1,退出。在主程序中检测flag为-1即退出程序。
程序开始的时候,首先初始化串口8250和中断8259A,保存原有中断向量0BH,并写入新的0BH向量入口地址。初始化8250的时候注意在中断允许寄存器开放接受中断,在MODEL控制寄存器使D3为1开放中断。
.586
DATA SEGMENT USE16
OLD0B DD ?
FLAG DB 0
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:MOV AX,DATA
MOV DS,AX
CLI
CALL I8250
CALL I8259A
CALL RD0B
CALL WRITE0B
STI
SCA:CMP FLAG ,-1
JE RETURN
MOV AH,1
INT 16H
JZ SCA
MOV DX,2FDH
IN AL,DX
TEST AL,20H
JZ SCA
MOV AH,0
INT 16H
AND AL,7FH
MOV DX,2F8H
OUT DX,AL
CMP AL,1BH
JNE SCA
TWA:MOV DX,2FDH
IN AL,DX
TEST AL,40H
JZ TWA
RETURN:CALL RESET
MOV AH,4CH
INT 21H
SERVICE PROC
PUSHA
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,2F8H
IN AL,DX
AND AL,7FH
CMP AL,1BH
JE NEXT
MOV AH,2
MOV DL,AL
INT 21H
JMP EXIT
NEXT:MOV FLAG ,-1
EXIT:MOV AL,20H
OUT 20H,AL
POP DS
POPA
IRET
SERVICE ENDP
I8250 PROC
MOV DX,2FBH
MOV AL,80H
OUT DX,AL
MOV DX,2F9H
MOV AL,00H
OUT DX,AL
MOV DX,2F8H
MOV AL,60H
OUT DX,AL
MOV DX,2FBH
MOV AL,03H
OUT DX,AL
MOV DX,2F9H
MOV AL,01H
OUT DX,AL
MOV DX,2FCH
MOV AL,0BH
OUT DX,AL
RET
I8250 ENDP
I8259A PROC
IN AL,21H
AND AL,11110111B
OUT 21H,AL
RET
I8259A ENDP
RD0B PROC
MOV AX,350BH
INT 21H
MOV WORD PTR OLD0B,BX
MOV WORD PTR OLD0B+2,ES
RET
RD0B ENDP
WRITE0B PROC
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET SERVICE
MOV AX,250BH
INT 21H
POP DS
RET
WRITE0B ENDP
RESET PROC
IN AL,21H
OR AL,00001000B
OUT 21H,AL
MOV DX,WORD PTR OLD0B
MOV DS,WORD PTR OLD0B+2
MOV AX,250BH
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG