Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.3 Unisoft-Cosmos; site sagan.UUCP Path: utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!vax135!cornell!uw-beaver!tektronix!hplabs!well!micropro!sagan!frank From: frank@sagan.UUCP (Frank Whaley) Newsgroups: net.sources Subject: XON/XOFF Protocol Driver for IBMPC Message-ID: <150@sagan.UUCP> Date: Tue, 1-Oct-85 18:55:07 EDT Article-I.D.: sagan.150 Posted: Tue Oct 1 18:55:07 1985 Date-Received: Fri, 4-Oct-85 06:25:30 EDT Organization: MicroPro Int'l Corp., San Rafael, CA Lines: 230 Keywords: XON/XOFF IBMPC Following is MASM source for a program which installs an XON/XOFF protocol serial printer driver, attached to COM1:. This code is completely useless to most people, but the price is right. Watch for the signature. PAGE 60, 132 TITLE XonXoff 30-Sep-85 XON/XOFF Printer Interface | ;-----------------------------------------------------------------------| ; | ; XON/XOFF Printer Interface | ; Installed as "terminate and stay resident" program | ; | ;-----------------------------------------------------------------------| ; REVISION HISTORY | ; | ; Number DD-MMM-YY WHO WHY | ;-------|---------------|-----------------------|-----------------------| ; 0.0 | 30-Sep-85 | Frank Whaley | Initial Release | ;-----------------------------------------------------------------------| 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 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,0FH ; set DTR, RTS, OUT1, 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 -- frank ... Frank Whaley, MicroPro Product Development {dual,hplabs,glacier,lll-crg}!well!micropro!sagan!frank "The heights by great men reached and kept, were not attained by sudden flight. But they, while their companions slept, were toiling upward in the night." -Longfellow Brought to you by Super Global Mega Corp .com