	.IF	LIST5
	.LIST
	.PAGE
	.ELSE
	.NOLIST
	.ENDC
;****************************************************************************
;
;	Console Serial I/O Handler
;
;	File:	SAGE.BIOS5.TEXT
;	Date:	14-Jul-83
;	Issue:	2B
;
;
;	COPYRIGHT (c) 1982, 1983 SAGE Computer Technology
;	All Rights Reserved
;
;****************************************************************************
;
;	History:
;
;	1     13-Jun-82 Initial release.
;	1A    11-Jul-82 Added Data Set Ready to Terminal Status readback.
;	1B    20-Jul-82 Inserted BRKOUT check into KEYIN and TRMOUT.
;	1C     4-Aug-82 Added XON/XOFF to KEYINT routine (KEYXON).
;			Revised local labels in KEYINT.	 Removed DSR
;			readback in STCHAN1.
;	1D    13-Aug-82 Modified BREAK key entry into Debugger for first
;			framing error.
;	1E    14-Aug-82 Modified keypress event.
;	1F    23-Aug-82 Revised event interface for keypress.  Added event
;			for Terminal output empty.  Had size and address
;			reversed in WTCHAN2 & RDCHAN1.
;	1G     1-Sep-82 Added masking of character input.
;	1H     8-Sep-82 Reset USART on lockout recovery.
;	1I    13-Sep-82 Fixed problem with not saving D0.L in KEYLOKD.
;	1J    26-Oct-82 Recognize XON when stop flag is not set, in case
;			it was reinitialized.  Also don't apply data to
;			control port in initialize unless receive has been
;			turned off.  Fixed check for buffer full on parallel
;			printer in routine POLL.
;	1K     6-Dec-82 Prevent USART from blotching character when turning
;			on transmission.
;	2     23-Mar-83 Initial SAGE IV release.
;	2A    12-May-83 Fixed indexing bug in POLL routine.
;	2B    14-Jul-83 Return Break char when break is inhibited.
;
;****************************************************************************



.PAGE
;****************************************************************************
;
;	Console Keyboard interrupt routine
;
;****************************************************************************

KEYINT	MOVEM.L D0-D1/A0,-(A7)	;Save working registers
	MOVE.B	TERM_I,D0	;Get character from USART
	MOVE.B	TERM_S,D1	;Get status
	ANDI.B	#38H,D1		;Check for errors
	BNE	KEYINTE		;Had an error flag
	CLR.B	KEYRUNA		;Clear runaway count
	MOVEA.L SPECCHAR,A0
	AND.B	11.(A0),D0	;Mask the character
	CMP.B	(A0)+,D0	;Check for Flush key
	BEQ	KEYINTF		;Found Flush key
KEYINT2 ADDQ.L	#1,A0
	CMP.B	(A0)+,D0	;Check for Start/Stop key
	BEQ.S	KEYINTS		;Found Start/Stop key
KEYINT3 CMP.B	(A0),D0		;Check for Break key
	BEQ	KEYINTB		;Found Break key
KEYINT1 CMP.B	KEYXON,D0
	BEQ.S	KEYINTS2	;Found XON
KEYINT4 CLR.W	D1
	MOVE.B	KEYPUT,D1
	ADDQ.B	#1,D1		;Check if can advance the Put pointer
	CMP.B	KEYGET,D1	;Check for overflow
	BEQ	KEYINTO		;Buffer was full
	SUBQ.B	#1,D1		;Store at original Put pointer position
	LEA	KEYBUF,A0
	MOVE.B	D0,0(A0,D1.W)	;Store character in keyboard buffer
	ADDQ.B	#1,KEYPUT	;Update Put pointer
	MOVE.B	ATCHTBL+19.,D0	;Check if Attached
	BEQ.S	$10		;Not attached to system event
	MOVEQ	#19.,D0
	JSR	SIGEVENT
$10	MOVE.B	ATCHTBL+61.,D0	;Check user's attachment
	BEQ.S	KEYINTR		;Not attached to user's event
	MOVEQ	#61.,D0
	JSR	SIGEVENT
KEYINTR MOVEM.L (A7)+,D0-D1/A0	;Restore working registers
	RTE

;	Process Start/Stop key (or XOFF)
KEYINTS TST.B	D0
	BEQ.S	KEYINT3		;Don't match on zero
	BTST	#1,TRMTYP	;Check if using XON/XOFF
	BNE.S	KEYINTS1	;Using XON/XOFF protocall
	BCHG	#TRM_STOP,TRMFLGS ;Toggle the Stop flag
	BEQ.S	KEYINTR		;Was previously transmitting

;	Need to turn on transmit
KEYINTG BSET	#0,TRMCMD	;Check if transmit flag is off
	BNE.S	KEYINTR		;Transmit was already on
	MOVE.B	TRMCMD,TERM_C
	BRA.S	KEYINTR

;	Treat as XOFF
KEYINTS1
	BSET	#TRM_STOP,TRMFLGS ;Stop the output
	BRA	KEYINTR
	
;	Process XON
KEYINTS2
	TST.B	D0
	BEQ	KEYINT4		;Don't recognize zero
	BTST	#1,TRMTYP	;Check if using XON/XOFF protocall
	BEQ.S	KEYINT4		;Not using protocall
	BCLR	#TRM_STOP,TRMFLGS
	BRA	KEYINTG

;	Process Flush key
KEYINTF TST.B	D0
	BEQ	KEYINT2		;Don't match on zero
	BCHG	#TRM_FLSH,TRMFLGS ;Toggle the Flush flag
	BNE	KEYINTR		;Flush was previously on
	BCLR	#TRM_STOP,TRMFLGS ;New Flush cancels Stop flag
	BRA	KEYINTR

;	Process Break key
KEYINTB MOVEA.L NOBREAKP,A0	;Check if breaks are being accepted
	BTST	#NOBREAKF,(A0)
	BNE	KEYINT1		;Breaks are inhibited
	BSET	#FGEVNT_B,FGTASKS+1 ;Set up foreground flag
	MOVE.B	#1,KEYBREAK	;Set up break request
	MOVE.B	#5,SI8255	;Start the foreground interrupt
	BRA	KEYINTR

;	Send Bell code
KEYINTO BSET	#TRM_BELL,TRMFLGS ;Request flag for Bell code transmission
	BRA	KEYINTG		;Make sure that transmitting is enabled

;	Process keyboard USART errors
KEYINTE BTST	#5,D1		;Check for framing error
	BEQ.S	$80		;No framing error
	ADDQ.B	#1,KEYRUNA	;Check for runaway count
	BEQ.S	$110		;Have a runaway condition
	BTST	#0,TRMTYP	;Check for BREAK key to Debugger
	BEQ.S	$70		;Not expecting BREAK
	CMPI.B	#1,KEYRUNA	;Check for first framing error
	BEQ.S	$120		;Handle as runaway interrupt
$70	ADDQ.W	#1,KEY_FE	;Count framing errors
	BRA.S	$100

$80	BTST	#3,D1		;Check for parity error
	BEQ.S	$90		;Must have been overrun error
	ADDQ.W	#1,KEY_PE	;Count parity errors
	BRA.S	$100

$90	ADDQ.W	#1,KEY_OE	;Count overrun errors

;	Reset error flags and output bell
$100	BSET	#TRM_BELL,TRMFLGS ;Request Bell code transmission
	BSET	#4,TRMCMD	;Clear errors strobe
	BSET	#0,TRMCMD	;Enable transmission
	;BNE	 $105		 ;Already transmitting
	MOVE.B	TRMCMD,TERM_C
	BCLR	#4,TRMCMD	;Clear errors is one shot
	BRA	KEYINTR

;	Request that command register be output
$105	BSET	#TRM_CMDF,TRMFLGS
	BRA	KEYINTR

;	Handle runaway interrupts
$110	SUBQ.B	#1,KEYRUNA	;Put back to 255
$120	BCLR	#2,TRMCMD	;Turn off USART receive
	BSET	#FGKYLD_B,FGTASKS+1 ;Set up foreground request
	MOVE.B	#5,SI8255	;Set up foreground interrupt
	BRA	$100



;	Foreground process to set up delay for removing keyboard lockout
KEYLOKD BCLR	#FGKYLD_B,FGTASKS+1 ;Clear request bit
	MOVE.L	A0,-(A7)	;Save an address register
	LEA	KEYSCH,A0	;Set up schedule to remove keyboard lockout
	PEA	KEYRES		;Set up restore keyboard routine address
	MOVE.L	(A7)+,4(A0)
	MOVE.W	#2,8(A0)	;Set up 2 second lockout delay
	CLR.W	10.(A0)
	BSR	ESCHED		;Enter the schedule
	MOVEA.L (A7)+,A0	;Restore address register
	BTST	#0,TRMTYP	;Check if should break
	BEQ	FGEXIT		;No break to debugger
	MOVE.W	(A7)+,D0
	MOVE.L	T15_TRAP,-(A7)	;Simulate a TRAP #15.
	MOVE	SR,-(A7)
	MOVE.W	D0,-(A7)
	BRA	FGEXIT

;	Scheduled routine to restore keyboard receive after lockout
KEYRES	
	MOVEM.L A0/D1,-(A7)
	BSR	TERMINIT
	MOVEM.L (A7)+,A0/D1
	RTS


;	Default Break routine
BREAKDF RTS			;Just return

;	Default special characters
SPECCHDF.BYTE	06H		;Flush key (Ctrl F)
	.BYTE	00H		;Filler	 (used as default NoBreak flag
	.BYTE	13H		;Start/Stop key (Ctrl S)
	.BYTE	00H		;Break key (Ctrl @)
	.BLOCK	7		;Filler
	.BYTE	7FH		;Character mask

.PAGE
;****************************************************************************
;
;	Console Keyboard input routine (background)
;
;	Fetches character into D0 (low byte).
;
;	All registers except D0 are preserved.
;
;****************************************************************************

KEYINX	MOVE	SR,-(A7)	;Local BIOS entry point
				;Simulate interrupt

;	Normal TRAP entry point
KEYIN	BCLR	#TRM_FLSH,TRMFLGS ;Clear flush flag on BIOS input
	MOVE.W	D1,-(A7)	;Save working register D1
$10	MOVE	#2500H,SR	;Disable keyboard interrupts
	CLR.W	D1
	MOVE.B	KEYGET,D1
	CMP.B	KEYPUT,D1	;Check if any characters in queue
	BEQ.S	$20		;Queue is empty
	MOVE.L	A0,-(A7)	;Save an address register
	LEA	KEYBUF,A0
	MOVE.B	0(A0,D1.W),D0	;Get a character
	MOVEA.L (A7)+,A0	;Restore address register
	ADDQ.B	#1,KEYGET	;Advance get pointer
	MOVE	#2000H,SR	;Enable interrupts
$15	MOVE.W	(A7)+,D1	;Restore working register
	RTE

;	Hang and wait for an interrupt
$20	CLR.B	BRKOUT		;Make sure Break out flag is clear
	STOP	#2000H		;Enable interrupts and stop
	TST.B	BRKOUT		;Check if Break occured
	BEQ	$10		;No Break, Look again
	CLR.B	D0		;Return a Null character
	BRA	$15


;	Read characters into input buffer
RDCHAN1
	MOVEM.L D1/A1,-(A7)	;Save registers
	MOVEA.L 8(A0),A1	;Get memory address
	MOVE.L	4(A0),D1	;Get size
	BEQ.S	$100		;No characters requested
$10	BSR	KEYINX		;Get keyboard character
	MOVE.B	D0,(A1)+	;Put character in buffer
	SUBQ.L	#1,D1		;Check size
	BNE.S	$10		;Back for more
$100	MOVEM.L (A7)+,D1/A1	;Restore registers D1 & A1
	RTS

.PAGE
;****************************************************************************
;
;	Console Terminal output interrupt
;
;****************************************************************************

TRMINT	MOVE	#2500H,SR	;Disable keyboard interrupts
	MOVE.B	TRMFLGS,D0	;Check for special flags
	BNE.S	$40		;Had some special flags
$10	CLR.W	D0
	MOVE.B	TRMGET,D0
	CMP.B	TRMPUT,D0	;Check if any characters
	BEQ.S	$25		;Queue is empty
	MOVE.L	A0,-(A7)	;Save an address register
	LEA	TRMBUF,A0
	MOVE.B	0(A0,D0.W),TERM_O ;Output the character
	MOVEA.L	 (A7)+,A0	;Restore address register
	ADDQ.B	#1,TRMGET	;Advance the Get pointer
$20	MOVE.W	(A7)+,D0
	RTE

;	Process Flush flag
$60	MOVE.B	TRMPUT,TRMGET	;Make queue empty

;	Handle empty buffer
$25	MOVE.B	ATCHTBL+33.,D0	;Check if attached
	BEQ.S	$30		;Not attached
	MOVE.W	#33.,D0
	JSR	SIGEVENT	;Signal the event

;	Turn off terminal interrupt
$30	BCLR	#0,TRMCMD	;Clear the transmit bit
	MOVE.B	TRMCMD,TERM_C
	BRA	$20

;	Handle special flags
$40	LSR.B	#1,D0		;TRM_BELL bit
	BCS.S	$50		;Found Bell request flag
	LSR.B	#1,D0		;TRM_FLSH bit
	BCS	$60		;Found Flush flag
	LSR.B	#1,D0		;TRM_STOP bit
	BCS	$30		;Found Stop flag, turn off interrupt
	LSR.B	#1,D0		;TRM_CMDF bit
	BCS.S	$70		;Found flag to apply command register
	ANDI.B	#0FH,TRMFLGS	;Clear any undefined bits
	BRA	$10		;  and continue processing

;	Output Bell code
$50	BCLR	#TRM_BELL,TRMFLGS
	MOVE.B	#BELL,TERM_O
	BRA	$20

;	Output command register
$70	BCLR	#TRM_CMDF,TRMFLGS
	MOVE.B	TRMCMD,TERM_C
	BCLR	#4,TRMCMD	;Clear errors is one shot
	BRA	$10


.PAGE
;****************************************************************************
;
;	Console Terminal output routine (background)
;
;	Outputs character from D0 (low byte).
;
;	All registers are preserved.
;
;****************************************************************************

TRMOUTX MOVE	SR,-(A7)	;Local BIOS entry point
				;Simulate TRAP entry

;	Normal TRAP entry point
TRMOUT	MOVE.W	D1,-(A7)	;Save working register D1
$10	BTST	#TRM_FLSH,TRMFLGS ;Check if flushing
	BNE.S	$20		;Throw away character
	MOVE	#2500H,SR	;Disable keyboard & terminal interrupts
	CLR.W	D1
	MOVE.B	TRMPUT,D1
	ADDQ.B	#1,D1		;Check if can advance Put pointer
	CMP.B	TRMGET,D1
	BEQ.S	$30		;Output buffer is full
	SUBQ.B	#1,D1		;Store at original Put pointer position
	MOVE.L	A0,-(A7)	;Save an address register
	LEA	TRMBUF,A0
	MOVE.B	D0,0(A0,D1.W)	;Store character in terminal buffer
	ADDQ.B	#1,TRMPUT	;Update buffer Put pointer
	MOVEA.L (A7)+,A0	;Restore address register
	BTST	#0,TRMCMD	;Check if transmit flag is on
	BNE.S	$20		;Already transmitting
	BTST	#TRM_STOP,TRMFLGS ;Check if transmit stopped
	BNE.S	$20		;Was stopped, don't transmit yet
	BSET	#0,TRMCMD	;Enable transmission
	CLR.B	BRKOUT		;Make sure Break Out flag is clear
$15	BTST	#2,TERM_S	;Check if still transmitting
	BNE.S	$17		;Transmitter is empty
	TST.B	BRKOUT
	BNE.S	$20		;Break is requested
	BRA	$15		;Try again
	
$17	ROR.B	#8,D0		;Just for delay
	MOVE.B	TRMCMD,TERM_C
$20	MOVE.W	(A7)+,D1	;Restore working register
	RTE			;Should re-enable interrupts

;	Hang and wait for an interrupt
$30	CLR.B	BRKOUT		;Make sure Break Out flag is clear
	STOP	#2000H		;Enable interrupts and stop
	TST.B	BRKOUT		;Check if had BREAK
	BEQ	$10		;No Break, Look again
	BRA	$20		;Forget character and return


;	Write characters into output buffer
WTCHAN2
	MOVEM.L D1/A1,-(A7)	;Save registers
	MOVEA.L 8(A0),A1	;Get memory address
	MOVE.L	4(A0),D1	;Get size
	BEQ.S	$100		;No characters requested
$10	MOVE.B	(A1)+,D0	;Get output character
	BSR	TRMOUTX		;Output character
	SUBQ.L	#1,D1		;Check size
	BNE.S	$10		;Back for more
$100	MOVEM.L (A7)+,D1/A1	;Restore registers
	RTS

;	Initialize Terminal channel configuration with new parameters
WCFCH1
WCFCH2
	MOVE.L	(A1),TBAUD	;Get new parameters from data area
	MOVEM.L D1/A0,-(A7)
	MOVE	#2500H,SR	;Disable terminal and keyboard interrupts
	BSR	TERMINIT	;Reinitialize the terminal
	MOVE	#2000H,SR	;Enable interrupts
	MOVEM.L (A7)+,D1/A0
	RTS


.PAGE
;****************************************************************************
;
;	Console Initialization
;
;****************************************************************************

INCHAN1
INCHAN2
	MOVE	#2500H,SR	;Disable terminal and keyboard interrupts
	CLR.B	TRMFLGS		;Clear terminal output flags
	MOVE.B	KEYPUT,KEYGET	;Clear input buffer
	BSET	#2,TRMCMD	;Make sure receive enabled
	BNE.S	$10		;Don't apply if already set
	MOVE.B	TRMCMD,TERM_C
$10	MOVE.L	4(A0),BREAKV	;Establish Break routine address
	MOVE.L	8(A0),SPECCHAR	;Establish special character address
	MOVE.L	12.(A0),NOBREAKP ;Establish NoBreak flag address
	CLR.B	KEYRUNA		;Clear runaway count
	MOVE	#2000H,SR	;Enable interrupts
	RTS


;****************************************************************************
;
;	Console Status request
;
;****************************************************************************

;	Keyboard status
STCHAN1
	CLR.W	D0
	MOVE.B	KEYPUT,D0	;Calculate number of buffered input chars
	SUB.B	KEYGET,D0
	MOVE.W	D0,(A1)		;Put in result area
	MOVE.W	KEY_FE,54.(A1)	;Set up error counters
	MOVE.W	KEY_PE,56.(A1)
	MOVE.W	KEY_OE,58.(A1)
	RTS

;	Terminal output status
STCHAN2
	CLR.W	D0
	MOVE.B	TRMPUT,D0	;Calculate number of buffered output chars
	SUB.B	TRMGET,D0
	MOVE.W	D0,(A1)		;Put in result area
	RTS

;	Read back terminal configuration
RCFCH1
RCFCH2
	MOVE.L	TBAUD,(A1)
	RTS

.PAGE
;****************************************************************************
;
;	Terminal Channel Initialiation
;
;****************************************************************************

TERMINIT
	LEA	TERM_C,A0	;Set up USART address
	CLR.B	D0
	MOVE.B	D0,(A0)		;Null to 8251
	MOVE.B	#76H,BAUD_C	;Set up for square wave output on 8253
	ROR.B	#8,D0		;Instruction is only for generating a delay
	MOVE.B	D0,(A0)		;Second null to 8251
	ROR.B	#8,D0		;Instruction is only for generating a delay
	ROR.B	#8,D0		;Instruction is only for generating a delay
	MOVE.B	D0,(A0)		;Third null to 8251
	MOVE.B	TPARAM,D0	;Get USART parameters
	MOVE.W	TBAUD,D1	;Get terminal baud rate parameter
	BNE.S	$10		;Found baud rate parameter
	MOVE.B	DIPSWT,D1	;Get DIP switch setting for default value
	BTST	#3,D1
	BEQ.S	$5		;No parity check
	BSET	#4,D0		;Set up to check parity
$5	ANDI.W	#7,D1		;Isolate buad rate control bits
	MOVE.B	RATES(D1.W),D1	;Get parameter from rates table
$10	MOVE.B	D1,BAUD1_D	;Set up 8253
	MOVE.B	#40H,(A0)	;USART reset command
	LSR.W	#8,D1
	MOVE.B	D1,BAUD1_D	;High count byte to 8253
	MOVE.B	D0,(A0)		;Apply USART control parameter
	ROR.B	#8,D0		;Instruction is only for generating a delay
	MOVE.B	#4,TRMCMD	;Enable USART receive
	MOVE.B	TRMCMD,(A0)
	CLR.B	D0
	BTST	#1,TRMTYP	;Check if XON/XOFF requested
	BEQ.S	$20		;No XON/XOFF
	MOVEQ	#11H,D0		;Set up XON Character
$20	MOVE.B	D0,KEYXON
	RTS

;	Baud Rate Table
;			Switches 3 2 1
RATES	.BYTE	2.		;U U U Reserved (currently same as 19200 baud)
	.BYTE	128.		;U U D	 300 baud
	.BYTE	64.		;U D U	 600 baud
	.BYTE	32.		;U D D	1200 baud
	.BYTE	16.		;D U U	2400 baud
	.BYTE	8.		;D U D	4800 baud
	.BYTE	4.		;D D U	9600 baud
	.BYTE	2.		;D D D 19200 baud

.PAGE
;****************************************************************************
;
;	BIOS TRAP to Check Queues
;
;****************************************************************************

POLL	MOVEM.L D0/D1/A1,-(SP)
	LEA	BIOSMAP,A1
	SUBQ.B	#1,D0
	BEQ.S	$20		;Found logical keyboard channel
	SUBQ.B	#6,D0
	BEQ.S	$30		;Found logical remote input channel
	ADDQ.B	#1,D0
	BEQ.S	$40		;Found logical printer output
	ADDQ.B	#4,D0
	BEQ.S	$50		;Found logical terminal output
	SUBQ.B	#6,D0
	BEQ.S	$60		;Found logical remote output channel
	

;	Keyboard channel
$20	MOVE.B	3(A1),D0	;Get physical device
	ST	D1		;Indicate input
	BRA.S	$100
	
;	Remote input channel
$30	MOVE.B	15.(A1),D0
	ST	D1		;Indicate input
	BRA.S	$100
	
;	Printer output channel
$40	MOVE.B	13.(A1),D0
	CLR.B	D1		;Indicate output
	BRA.S	$100

;	Terminal channel
$50	MOVE.B	5(A1),D0
	CLR.B	D1		;Indicate output
	BRA.S	$100

;	Remote output
$60	MOVE.B	17.(A1),D0
	CLR.B	D1		;Indicate output
	
;	Process physical channel number
$100	SUBQ.B	#1,D0
	BEQ.S	$120		;Found keyboard channel
	SUBQ.B	#6,D0
	BEQ.S	$130		;Found remote input
	ADDQ.B	#1,D0
	BEQ.S	$140		;Found parallel printer output
	ADDQ.B	#4,D0
	BEQ.S	$150		;Found terminal output
	SUBQ.B	#6,D0
	BEQ.S	$160		;Found remote output
	SUBQ.B	#5,D0
	BEQ.S	$170		;Extra serial channel #1
	SUBQ.B	#1,D0
	BEQ.S	$180		;Extra serial channel #2
	SUBQ.B	#1,D0
	BEQ.S	$190		;Extra serial channel #3
	SUBQ.B	#1,D0
	BEQ.S	$200		;Extra serial channel #4
	BRA	$310


;	Check keyboard input queue
$120	MOVE.B	KEYGET,D0
	CMP.B	KEYPUT,D0
	BRA.S	$300

;	Check Remote serial input queue
$130	LEA	REMDAT0,A1
	MOVE.B	RINGET(A1),D0
	CMP.B	RINPUT(A1),D0
	BRA.S	$300

;	Check printer output queue
$140	MOVE.B	PRTPUT,D0
	ADDQ.B	#1,D0
	CMP.B	PRTGET,D0
	BRA.S	$300

;	Check terminal output queue
$150	MOVE.B	TRMPUT,D0
	ADDQ.B	#1,D0
	CMP.B	TRMGET,D0
	BRA.S	$300

;	Check Remote serial output queue
$160	LEA	REMDAT0,A1
	MOVE.B	ROTPUT(A1),D0
	ADDQ.B	#1,D0
	CMP.B	ROTGET(A1),D0
	BRA.S	$300

;	Extra serial channel #1
$170	LEA	REMDAT1,A1
$175	TST.B	D1
	BNE.S	$176		;Handle input
	MOVE.B	ROTPUT(A1),D0
	ADDQ.B	#1,D0
	CMP.B	ROTGET(A1),D0
	BRA.S	$300
$176	MOVE.B	RINGET(A1),D0
	CMP.B	RINPUT(A1),D0
	BRA.S	$300

;	Extra serial channel #2
$180	LEA	REMDAT2,A1
	BRA	$175
	
;	Extra serial channel #3
$190	LEA	REMDAT3,A1
	BRA	$175
	
;	Extra serial channel #4
$200	LEA	REMDAT4,A1
	BRA	$175


$300	MOVE	SR,D0		;Get condition code
	MOVE.B	D0,13.(A7)	;Save in condition code area on stack
	MOVEM.L (SP)+,D0/D1/A1
	RTE

;	Handle output
$310	CLR.B	D0		;Nothing found, default to EQ condition
	BRA	$300

                                                                                                                                                                                                                                                                                                                                                                         