PAGE 60, 132 TITLE XonXoff 22-Jun-89 XON/XOFF Printer Interface | SUBTTL Original Author: Frank Whaley | ;-----------------------------------------------------------------------| ; | ; XON/XOFF Serial Printer Interface | ; | ; Installs replacement INT 17H printer driver with | ; interrupt-driven serial XON/XOFF communications | ; on COM1. Leaves baud rate and other parameters | ; as found. Contains no provision for de-installing. | ; | ; This source code officially placed in the public | ; domain on 22-Jun-89 by Frank Whaley. | ; | ; To build: | ; MASM XONXOFF; | ; LINK XONXOFF; | ; DEL XONXOFF.OBJ | ; EXE2BIN XONXOFF.EXE XONXOFF.COM | ; DEL XONXOFF.EXE | ;-----------------------------------------------------------------------| IERport EQU 03F9H ; Interrupt Enable Register LSRport EQU 03FDH ; Line Status Register MCRport EQU 03FCH ; Modem Control Register MSRport EQU 03FEH ; Modem Status Register RBRport EQU 03F8H ; Receiver Buffer Register THRport EQU RBRport ; Transmit Holding Register Imask EQU 0EFH ; interrupt enable mask IIRport EQU 03FAH ; Interrupt Identification Register BrkInt EQU 6 ; break interrupt EOI EQU 20H ; End Of Interrupt InpInt EQU 4 ; input interrupt INTA00 EQU 20H INTA01 EQU 21H THRE EQU 20H ; Transmit Holding Register Empty XOFF EQU 'S' - 40H XON EQU 'Q' - 40H ;-----------------------------------------------------------------------| ; The Usual Stuff | ;-----------------------------------------------------------------------| cGroup Group Code Code Segment Public 'Code' Assume CS:Code, DS:Code, ES:Code, SS:Code Org 100H XonXoff: JMP Install ; install traps Ready DB 80H ; ready flag PAGE ;-----------------------------------------------------------------------| ; Printer interrupt handler | ; | ; ENTRY : as for printer interrupt (INT 17H) | ; | ; EXIT : ditto | ; | ;-----------------------------------------------------------------------| Handler Proc Far TEST AH,AH ; output request ?? JNZ Hand3 ; if NZ: return status STI Hand1: TEST CS:Ready,0FFH ; ready ?? JZ Hand1 ; wait until ready CLI PUSH BX ; (+1) save PUSH DX ; (+2) MOV BL,AL ; save char MOV DX,LSRport Hand2: IN AL,DX ; get line status TEST AL,THRE ; transmit holding register empty ?? JZ Hand2 ; if Z: uart not ready yet, loop MOV AL,BL MOV DX,THRport ; transmit port OUT DX,AL ; transmit POP DX ; (+1) restore POP BX ; (+0) Hand3: MOV AH,CS:Ready OR AH,10H ; always selected IRET Handler EndP PAGE ;-----------------------------------------------------------------------| ; Serial interrupt server | ; | ; ENTRY : as from serial interrupt | ; | ; EXIT : all registers preserved | ; | ;-----------------------------------------------------------------------| Server Proc Far PUSH DX ; (+1) all what i use PUSH AX ; (+2) MOV DX,IIRport IN AL,DX AND AL,0FEH ; skip interrupt pending TEST AL,AL ; modem status ?? JZ Serv2 ; if Z: read MSR CMP AL,BrkInt ; break ?? JE Serv3 ; if E: just clear interrupt CMP AL,InpInt ; input data received ?? JE Serv4 ; if E: get and queue input Serv1: MOV AL,EOI ; signal end-of-interrupt OUT INTA00,AL POP AX ; (+1) restore POP DX ; (+0) IRET Serv2: ; read MSR MOV DX,MSRport ; just read port to clear interrupt IN AL,DX JMP SHORT Serv1 Serv3: ; break received MOV DX,LSRport IN AL,DX JMP SHORT Serv1 Serv4: ; look for XON/XOFF MOV DX,RBRport IN AL,DX ; AL = input AND AL,7FH XOR AH,AH ; assume not ready CMP AL,XOFF JE Serv5 ; if E: not ready MOV AH,80H ; assume ready CMP AL,XON JE Serv5 ; if E: is ready JMP SHORT Serv1 ; otherwise no change Serv5: MOV CS:Ready,AH ; set flag JMP SHORT Serv1 Server EndP PAGE ;-----------------------------------------------------------------------| ; XON/XOFF Printer Interface | ; | ; ENTRY : normal COM program entry | ; | ; EXIT : Terminate / Stay Resident | ; | ;-----------------------------------------------------------------------| Install Proc Near MOV ES,DS:2CH ; free our environment MOV AH,49H INT 21H MOV DX,Offset Handler ; first take over INT 17 vector MOV AX,2517H INT 21H MOV DX,Offset Server ; now COM1 vector MOV AX,250CH INT 21H CLI MOV DX,MCRport ; get status of MCR IN AL,DX OR AL,0BH ; set DTR, RTS, OUT2 OUT DX,AL ; init MCR MOV DX,LSRport ; clear pending status IN AL,DX MOV DX,RBRport IN AL,DX MOV DX,IIRport IN AL,DX MOV DX,MSRport IN AL,DX IN AL,INTA01 AND AL,Imask OUT INTA01,AL MOV AL,1 ; select Data Available interrupt MOV DX,IERport OUT DX,AL STI MOV DX,Offset Install ; DS:DX -> end of "keep" area INT 27H ; terminate / stay resident Install EndP Code EndS END XonXoff ; of XonXoff.asm