南邮汇编实验2——串口测试
串口测试,实现电脑的自发自收。
发送用查询方式,接收用中断方式。
.586
DATA SEGMENT USE16
OLD0C DD ? ;存放中断向量
FLAG DB 0 ;结束
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CLI ;关中断
CALL I8250 ;8250初始化
CALL I8259 ;开放 设置的屏蔽字
CALL RD0C
CALL WR0C
STI ;开中断
SCANT: CMP FLAG,-1 ;判断结束
JE RETURN
MOV DX,2FDH ;状态端口,查询状态
IN AL,DX
TEST AL,20H ;判断8250有没有准备好
JZ SCANT
MOV AH,1 ;查询键盘缓冲区
INT 16H ;bios功能
JZ SCANT
MOV AH,0 ;读取
INT 16H ;bios功能
AND AL,7FH ;后7位
MOV DX,2F8H ;数据端口
OUT DX,AL
CMP AL,1BH ;判断esc
JNE SCANT
TWAIT: MOV DX,2FDH
IN AL,DX
TEST AL,40H ;测试一帧数据是否发送完
JZ TWAIT
RETURN: CALL RESET
MOV AH,4CH
INT 21H
RECEIVE PROC
PUSH AX ;保护现场
PUSH DX
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,2F8H ;接收数据缓冲寄存器
IN AL,DX ;读取
AND AL,7FH ;最高位置0
CMP AL,1BH
JE NEXT ;FLAG=-1
MOV AH,2 ;显示字符
MOV DL,AL
INT 21H
JMP EXIT
NEXT: MOV FLAG,-1
EXIT: MOV AL,20H ;向主8259发送结束
OUT 20H,AL
POP DS
POP DX
POP AX
IRET
RECEIVE ENDP
I8250 PROC ;8250初始化
MOV DX,2F8H
MOV AL,80H
OUT DX,AL
MOV DX,2F9H
MOV AL,0
OUT DX,AL
MOV DX,2F8H
MOV AL,60H
OUT DX,AL
MOV DX,2F8H
MOV AL,03H
OUT DX,AL
MOV DX,2F9H
MOV AL,01H
OUT DX,AL
MOV DX,2FCH
MOV AL,08H
OUT DX,AL
RET
I8250 ENDP
I8259 PROC
IN AL,21H
AND AL,11110111B ;IR3开放,全0则全开放
OUT 21H,AL
RET ;结束
I8259 ENDP
RD0C PROC
MOV AX,350BH ;辅串口0B,主串口0C
INT 21H
MOV WORD PTR OLD0C,BX ;ES:BX中断程序地址
MOV WORD PTR OLD0C+2,ES
RET
RD0C ENDP
WR0C PROC
PUSH DS
MOV AX,CODE
MOV DS,AX ;段基址
MOV DX,OFFSET RECEIVE ;偏移地址
MOV AX,250BH ;25H功能号,0BH终端类型号
INT 21H
POP DS
RET
WR0C ENDP
RESET PROC
IN AL,21H
OR AL,00001000B ;IR3端口开放
OUT 21H,AL
MOV AX,250BH ;25H功能号,0BH终端类型号
MOV DX,WORD PTR OLD0C ;DX偏移地址
MOV DS,WORD PTR OLD0C+2 ;DS段基址
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG