home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
PRINTING
/
XONXOFF3.ZIP
/
XONXOFF.ASM
next >
Wrap
Assembly Source File
|
1990-03-13
|
5KB
|
228 lines
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