	.IF	LIST6
	.LIST
	.PAGE
	.ELSE
	.NOLIST
	.ENDC
;****************************************************************************
;
;	Console Remote I/O Handler
;
;	File:	SAGE.BIOS6.TEXT
;	Date:	 2-Aug-83
;	Issue:	2A
;
;
;	COPYRIGHT (c) 1982, 1983 SAGE Computer Technology
;	All Rights Reserved;
;
;****************************************************************************
;
;	History:
;
;	1     13-Jun-82 Initial release.
;	1A     7-Jul-82 Fixed XON/XOFF bugs.
;	1B     8-Jul-82 Put in fix for clearing REMCMD bits.  Added
;			protection to only allow user change of DTR & RTS.
;	1C     9-Jul-82 Fixed reset of USART.
;	1D    11-Jul-82 Fixed address error in Status read on remote in.
;	1E    20-Jul-82 Install BRKOUT check into REMIN and REMOUT.
;	1F    13-Aug-82 Allow Break output control.
;	1G    23-Aug-82 Installed event handling into ROTINT & RININT.
;			Had size and address reversed in RDCHAN7 & WTCHAN8.
;	1H    13-Sep-82 Fixed bug with not saving D0.L in RMTTLDY, RMTLOKD,
;			and ROTINT.
;	1I     8-Nov-82 Removed unnecessary code in INCHAN8.
;	1J     6-Dec-82 Fixed problem with USART blotching character when
;			re-enabling transmission.
;	2     23-Mar-83 Initial SAGE IV release.
;	2A     2-Aug-83 Revised variable storage (RMTLOKD & RMTTDLY changes).
;			Fix lockup on Aux channels on error conditions
;			(SETROT 7 CLRROT).
;
;****************************************************************************



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

;	Normal TRAP entry points
REMINT	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT0,A4
	BSR.S	REMIN
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMINT1 MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT1,A4
	BSR.S	REMIN
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMINT2 MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT2,A4
	BSR.S	REMIN
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMINT3 MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT3,A4
	BSR.S	REMIN
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMINT4 MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT4,A4
	BSR.S	REMIN
	MOVEM.L (SP)+,D1/A0/A4
	RTE
	
REMIN	MOVE	#2200H,SR	;Disable remote interrupts
	CLR.W	D1
	MOVE.B	RINGET(A4),D1
	CMP.B	RINPUT(A4),D1	;Check if any characters in queue
	BEQ.S	$30		;Queue is empty
	MOVEA.L RINBUF(A4),A0
	MOVE.B	0(A0,D1.W),D0	;Get a character
	ADDQ.B	#1,RINGET(A4)	;Advance Get pointer
	SUB.B	RINPUT(A4),D1	;Check for buffer partially empty
	CMPI.B	#128.,D1
	BNE.S	$20		;Not at threshold
	BTST	#0,REMTYP(A4)	;Check if using XON/XOFF on input
	BEQ.S	$20		;Not using protocall
	TST.B	RINSTOP(A4)
	BEQ.S	$20		;Far end not stopped
	BSET	#RO_XON,ROTFLGS(A4)
	CLR.B	RINSTOP(A4)
	BSET	#0,REMCMD(A4)	;Enable transmission
	BNE.S	$20		;Already transmitting
	MOVEA.W REMUSC(A4),A0	;Get control register address
	MOVE.B	REMCMD(A4),(A0)
$20	MOVE	#2000H,SR	;Enable interrupts
$25	RTS

;	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	REMIN		;No Break, Look again
	CLR.B	D0		;Return with Null character
	BRA	$25


;	Read Auxillary Channel
RDCHN13
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT1,A4
	BRA.S	RDCHANR
	
RDCHN14
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT2,A4
	BRA.S	RDCHANR

RDCHN15
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT3,A4
	BRA.S	RDCHANR

RDCHN16
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT4,A4
	BRA.S	RDCHANR
	
RDCHAN7
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT0,A4
	
RDCHANR
	MOVEA.L 8(A0),A1	;Get memory address
	MOVE.L	4(A0),D2	;Get size
	BEQ.S	$100		;No characters requested
$10	BSR	REMIN		;Read a character
	MOVE.B	D0,(A1)+	;Store input character
	SUBQ.L	#1,D2		;Check size
	BNE.S	$10		;Back for more
$100	MOVEM.L (SP)+,D1-D2/A0-A1/A4
	RTS


.PAGE
;****************************************************************************
;
;	Remote input interrupt routine
;
;****************************************************************************

RININT1
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	RININT

RININT2
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	RININT

RININT3
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	RININT

RININT4
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT4,A4
	BRA.S	RININT

RININT0
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT0,A4

RININT	MOVEA.W REMUSD(A4),A0	;Get USART data port address
	MOVE.B	(A0),D0		;Get character from USART
	MOVE.B	2(A0),D1	;Get status
	ANDI.B	#38H,D1		;Check for errors
	BNE	$80		;Had an error flag
	CLR.B	RINRUNA(A4)	;Clear remote input runaway count
	CMPI.B	#XON,D0
	BEQ.S	$40		;Found XON character
	CMPI.B	#XOFF,D0
	BEQ.S	$50		;Found XOFF character
$10	CLR.W	D1
	MOVE.B	RINPUT(A4),D1
	SUB.B	RINGET(A4),D1
	CMPI.B	#240.,D1
	BHI.S	$60		;Send XOFF if using protocall
$20	MOVE.B	RINPUT(A4),D1
	ADDQ.B	#1,D1
	CMP.B	RINGET(A4),D1	;Check for overflow
	BEQ	$70		;Buffer was full
	SUBQ.B	#1,D1		;Store at original Put pointer position
	MOVEA.L RINBUF(A4),A0
	MOVE.B	D0,0(A0,D1.W)	;Store character in input buffer
	ADDQ.B	#1,RINPUT(A4)	;Update Put pointer
	LEA	ATCHTBL,A0
	MOVE.W	RINATCH(A4),D0
	TST.B	0(A0,D0.W)	;Check if attached
	BEQ.S	$30		;Not attached
	JSR	SIGEVENT	;Signal the event
$30	MOVEM.L (SP)+,D1/A0/A4	;Restore working registers
	MOVE.W	(SP)+,D0
	RTE

;	Process XON input character
$40	BTST	#1,REMTYP(A4)	;Check if using XON/XOFF on output
	BEQ.S	$10		;Not using protocall
	BCLR	#RO_STOP,ROTFLGS(A4) ;Turn off stop flag
	BSET	#0,REMCMD(A4)	;Enable transmission
	BNE.S	$30		;Already transmitting
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	BRA.S	$30

;	Process XOFF input character
$50	BTST	#1,REMTYP(A4)	;Check if using XON/XOFF on output
	BEQ.S	$10		;Not using protocall
	BSET	#RO_STOP,ROTFLGS(A4) ;Turn on stop flag
	BRA.S	$30

;	Process buffer nearly full
$60	BTST	#0,REMTYP(A4)	;Check if using XON/XOFF on input
	BEQ	$20		;Not using protocall
	BSET	#0,RINSTOP(A4)	;Set stop flag
	BNE	$20		;Was already stopped
	BSET	#RO_XOFF,ROTFLGS(A4) ;Prepare to transmit XOFF
	BSET	#0,REMCMD(A4)	;Enable transmission
	BNE	$20		;Already transmitting
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	BRA	$20

;	Process buffer overflow
$70	BSET	#0,RINERR(A4)	;Set flag for overflow error
	BRA	$30

;	Process USART detected error
$80	BTST	#5,D1		;Check for framing error
	BEQ.S	$90		;No framing error
	ADDQ.B	#1,RINRUNA(A4)	;Check for runaway count
	BEQ.S	$120		;Have a runaway
	ADDQ.W	#1,RIN_FE(A4)	;Count framing errors
	BRA.S	$110

$90	BTST	#3,D1		;Check for parity error
	BEQ.S	$100		;Must have been overrun
	ADDQ.W	#1,RIN_PE(A4)	;Count parity errors
	BRA.S	$110

$100	ADDQ.W	#1,RIN_OE(A4)	;Count overrun errors
$110	BSET	#1,RINERR(A4)	;Set flag for data error
$115	MOVE.W	#10H,D0		;Reset USART error
	BSR	SETROT
	BRA	$30

;	Handle runaway interrupts
$120	ST	RINLKF(A4)	;Set up lockout request flag
	SUBQ.B	#1,RINRUNA(A4)	;Put back to 255
	MOVE.W	#4,D0
	BSR	CLRROT		;Turn off receive
	BSET	#FGRMLD_B,FGTASKS+1 ;Set up for foreground request
	MOVE.B	#5,SI8255	;Set up foreground interrupt
	BRA	$115
	
	
;	Foreground process to set up delay for removing remote lockout
RMTLOKD BCLR	#FGRMLD_B,FGTASKS+1 ;Clear request bit
	MOVE.L	A0,-(SP)	;Save an address register
	LEA	REMDAT0,A0
	MOVE.W	#5-1,D0
$10	TST.B	RINLKF(A0)	;Check for lockout request
	BEQ.S	$20		;No request
	CLR.B	RINLKF(A0)	;Clear request
	MOVE.L	A0,-(SP)
	LEA	RINSCH(A0),A0	;Schedule re-enable of remote receive
	PEA	RINRES		;Set up runaway restore routine address
	MOVE.L	(SP)+,4(A0)
	MOVE.W	#1,8(A0)	;Set up 1 second lockout
	CLR.W	10.(A0)
	BSR	ESCHED		;Enter the schedule
	MOVEA.L (SP)+,A0	;Restore address register
$20	TST.B	REMCHN(A0)
	BNE.S	$30		;Not main board channel
	TST.B	SAGE4
	BEQ.S	$40		;No extra board
	LEA	REMDAT1-REMDATSZ,A0 ;Set up for extra serial ports
$30	ADDA.W	#REMDATSZ,A0
	DBF	D0,$10
$40	MOVEA.L (SP)+,A0	;Restore address register
	BRA	FGEXIT


;	Try to restore the remote input channel after lockout
RINRES	MOVE	#2200H,SR
	MOVE.L	A4,-(SP)
	MOVEA.L A2,A4		;Form base of remote data area
	SUBA.W	#RINSCH,A4
	BCLR	#2,ROTCLRF(A4)	;Make sure still not clearing
	MOVEQ	#4,D0
	BSR	SETROT		;Enable receive
	MOVE	#2000H,SR
	MOVEA.L (SP)+,A4
	RTS

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

;	Normal TRAP entry points
REMOUTT MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT0,A4
	BSR.S	REMOUT
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMOUTT1
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT1,A4
	BSR.S	REMOUT
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMOUTT2
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT2,A4
	BSR.S	REMOUT
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMOUTT3
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT3,A4
	BSR.S	REMOUT
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMOUTT4
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT4,A4
	BSR.S	REMOUT
	MOVEM.L (SP)+,D1/A0/A4
	RTE

REMOUT	MOVE	#2200H,SR	;Disable remote channel interrupts
	CLR.W	D1
	MOVE.B	ROTPUT(A4),D1
	ADDQ.B	#1,D1		;Advance Put pointer
	CMP.B	ROTGET(A4),D1
	BEQ.S	$30		;Output buffer is full
	SUBQ.B	#1,D1		;Store in original Put pointer position
	MOVEA.L ROTBUF(A4),A0
	MOVE.B	D0,0(A0,D1.W)	;Store character in remote out buffer
	ADDQ.B	#1,ROTPUT(A4)	;Update put pointer
	BSET	#0,REMCMD(A4)	;Enable transmission
	BNE.S	$20		;Already transmitting
	TST.B	REMCHN(A4)	;See if extra channel
	BNE.S	$17		;Output control immediately
	CLR.B	BRKOUT		;Make sure break out flag is clear
$15	MOVEA.W REMUSD(A4),A0
	BTST	#2,2(A0)	;Check if still transmitting
	BNE.S	$17		;Transmitter is empty
	MOVE	#2000H,SR
	TST.B	BRKOUT
	BNE.S	$20		;Break is requested
	MOVE	#2200H,SR
	BRA	$15		;Try again
	
$17	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
$20	MOVE	#2000H,SR	;Enable interrupts
$25	RTS

;	Hang and wait for a change
$30	CLR.B	BRKOUT		;Make sure Break Out flag is clear
	STOP	#2000H		;Enable interrupts and stop
	TST.B	BRKOUT		;Check for Break
	BEQ	REMOUT		;No Break, Look again
	BRA	$25		;Throw character away and return


;	Write Auxillary Channel
WTCHN13
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT1,A4
	BRA.S	WTCHANR

WTCHN14
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT2,A4
	BRA.S	WTCHANR

WTCHN15
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT3,A4
	BRA.S	WTCHANR

WTCHN16
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT4,A4
	BRA.S	WTCHANR

WTCHAN8
	MOVEM.L D1-D2/A0-A1/A4,-(SP)  ;Save registers
	LEA	REMDAT0,A4

WTCHANR
	MOVEA.L 8(A0),A1	;Get memory address
	MOVE.L	4(A0),D2	;Get size
	BEQ.S	$100		;No characters requested
	BTST	#5,14.(A0)	;Check for setting control flags
	BNE.S	$300		;Found set control flags request
	BTST	#4,14.(A0)	;Check for clearing control flags
	BNE.S	$400		;Found clear control flags request
$10	MOVE.B	(A1)+,D0	;Get output character
	BSR	REMOUT		;Output character
	SUBQ.L	#1,D2		;Check size
	BNE.S	$10		;Back for more
$100	MOVEM.L (SP)+,D1-D2/A0-A1/A4
	RTS

;	Set control flags
$300	MOVE	#2200H,SR
	MOVE.B	(A1)+,D0
	ANDI.B	#2AH,D0
	BSR	SETROT		;Set control flags
	MOVE	#2000H,SR
	BRA	$100

;	Clear control flags
$400	MOVE	#2200H,SR
	MOVE.B	(A1)+,D0
	ANDI.B	#2AH,D0
	BSR	CLRROT		;Clear control flags
	MOVE	#2000H,SR
	BRA	$100

;	Write out device configuration
WCFCH13
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	WCFCHR

WCFCH14
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	WCFCHR

WCFCH15
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	WCFCHR

WCFCH16
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT4,A4
	BRA.S	WCFCHR

WCFCH7
WCFCH8
	MOVEM.L D1/A0/A4,-(SP)
	LEA	REMDAT0,A4
	
WCFCHR	MOVE.L	(A1)+,RBAUD(A4)
	MOVE.L	(A1),RMTDTM(A4)
	MOVE	#2200H,SR	 ;Disable remote interrupts
	BSR	AUXINIT		;Initialize the USART
	MOVE	#2000H,SR	 ;Enable interrupts
	MOVEM.L (SP)+,D1/A0/A4
	RTS

.PAGE
;****************************************************************************
;
;	Remote output interrupt
;
;****************************************************************************

ROTINT1
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	ROTINT

ROTINT2
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	ROTINT

ROTINT3
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	ROTINT

ROTINT4
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT4,A4
	BRA.S	ROTINT

ROTINT0
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT0,A4

ROTINT	
	MOVEA.W REMUSD(A4),A0	;Get address of USART data port
	TST.B	2(A0)		;Check for DSR signal
	BPL	$80		;No DSR signal
$5	MOVE.B	ROTFLGS(A4),D0	;Check for special flags
	BNE.S	$40		;Had some special flags
$10	CLR.W	D0
	MOVE.B	ROTGET(A4),D0
	CMP.B	ROTPUT(A4),D0	;Check if any characters
	BEQ.S	$25		;Queue is empty
	MOVEA.L ROTBUF(A4),A0
	MOVE.B	0(A0,D0.W),D0	;Output to remote port
	MOVEA.W REMUSD(A4),A0
	MOVE.B	D0,(A0)
	ADDQ.B	#1,ROTGET(A4)	;Advance Get pointer
$20	MOVEM.L (SP)+,A0/A4
	MOVE.W	(SP)+,D0	;Restore working register
	RTE

;	Handle buffer empty
$25	MOVE.W	ROTATCH(A4),D0
	LEA	ATCHTBL,A0
	TST.B	0(A0,D0.W)
	BEQ.S	$30		;Not attached
	JSR	SIGEVENT	;Signal the event

;	Turn off remote out interrupt
$30	BCLR	#0,REMCMD(A4)	;Clear transmit bit
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	BRA	$20

;	Handle special flags
$40	LSR.B	#1,D0		;RO_XOFF bit
	BCS.S	$50		;Found XOFF request bit
	LSR.B	#1,D0		;RO_XON bit
	BCS.S	$60		;Found XON request bit
	LSR.B	#1,D0		;RO_CMDF bit
	BCS.S	$70		;Found RO_CMDF bit
$45	LSR.B	#1,D0		;RO_STOP bit
	BCS	$30		;Found stop flag, turn off interrupt
	ANDI.B	#0FH,ROTFLGS(A4) ;Clear any undefined bits
	BRA	$10		;  and continue processing

;	Send XOFF character
$50	BCLR	#RO_XOFF,ROTFLGS(A4)
	MOVEA.W REMUSD(A4),A0
	MOVE.B	#XOFF,(A0)
	BRA	$20

;	Send XON character
$60	BCLR	#RO_XON,ROTFLGS(A4)
	MOVEA.W REMUSD(A4),A0
	MOVE.B	#XON,(A0)
	BRA	$20

;	Apply flag controls to command register
$70	BCLR	#RO_CMDF,ROTFLGS(A4)
	MOVE.L	D0,-(SP)
	MOVE.B	ROTSETF(A4),D0	;Set on bits
	OR.B	D0,REMCMD(A4)
	CLR.B	ROTSETF(A4)
	MOVE.B	ROTCLRF(A4),D0	;Clear these bits
	NOT.B	D0
	AND.B	D0,REMCMD(A4)
	CLR.B	ROTCLRF(A4)
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	BCLR	#4,REMCMD(A4)	;Make sure error clear bit is one shot
	MOVE.L	(SP)+,D0
	BRA	$45

;	Set up transmit delay
$80	TST.B	ROTDSR(A4)	;Check if using DSR protocall
	BEQ	$5		;Not using DSR protocall
	LEA	ROTSCH+4(A4),A0
	TST.L	(A0)
	BNE	$30		;Already scheduled
	ST	ROTTDF(A4)	;Set transmit delay request
	BSET	#FGRMTD_B,FGTASKS+1 ;Set up for transmit delay task
	MOVE.B	#5,SI8255	;Set up Foreground interrupt
	BRA	$30
	
;	Foreground task for remote transmit delay
RMTTDLY MOVE	#2200H,SR	;Inhibit xmit interrupts
	BCLR	#FGRMTD_B,FGTASKS+1
	MOVEM.L	 A0/A4,-(SP)
	LEA	REMDAT0,A4
	MOVE.W	#5-1,D0
$10	TST.B	ROTTDF(A4)	;Check for lockout request
	BEQ.S	$20		;No request
	CLR.B	ROTTDF(A4)	;Clear request
	LEA	ROTSCH(A4),A0	    ;Set up schedule
	PEA	RMTENAB
	MOVE.L	(SP)+,4(A0)
	CLR.W	8(A0)		;Set up delay time
	MOVE.W	RMTDTM(A4),10.(A0)
	BSR	ESCHED
$20	TST.B	REMCHN(A4)
	BNE.S	$30		;Not main board channel
	TST.B	SAGE4
	BEQ.S	$40		;No extra board
	LEA	REMDAT1-REMDATSZ,A4 ;Set up for extra serial ports
$30	ADDA.W	#REMDATSZ,A4
	DBF	D0,$10
$40	MOVE	#2000H,SR	;Can now enable interrupts
	MOVEM.L (SP)+,A0/A4
	BRA	FGEXIT
	
;	Scheduled task: transmit enable after delay
RMTENAB MOVE	#2200H,SR
	SUBA.W	#ROTSCH,A2
	CLR.L	ROTSCH+4(A2)
	BSET	#0,REMCMD(A2)
	BNE.S	$10		;Was already transmitting
	MOVEA.W REMUSC(A2),A0
	MOVE.B	REMCMD(A2),(A0)
$10	MOVE	#2000H,SR	;Enable interrupts
	RTS


;	Set USART command flags
;	D0 = bits to set
SETROT
	TST.B	REMCHN(A4)
	BNE.S	$5		;Bypass check for Extra channels
	MOVEA.W REMUSD(A4),A0
	BTST	#0,2(A0)	;Check if transmit buffer empty
	BEQ.S	$10		;Buffer register not empty
$5	OR.B	D0,REMCMD(A4)
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	BCLR	#4,REMCMD(A4)	;Don't make clear error permanent
	RTS

;	Set up request to clear flags
$10	OR.B	D0,ROTSETF(A4)
	BSET	#RO_CMDF,ROTFLGS(A4)
	RTS


;	Clear USART command flags
;	D0 = bits to clear
CLRROT
	TST.B	REMCHN(A4)
	BNE.S	$5		;Bypass check on Extra channels
	MOVEA.W REMUSD(A4),A0
	BTST	#0,2(A0)	;Check if transmit buffer empty
	BEQ.S	$10		;Buffer register not empty
$5	NOT.B	D0
	AND.B	D0,REMCMD(A4)
	MOVEA.W REMUSC(A4),A0
	MOVE.B	REMCMD(A4),(A0)
	RTS
	
;	Set up request to clear flags
$10	OR.B	D0,ROTCLRF(A4)
	BSET	#RO_CMDF,ROTFLGS(A4)
	RTS


.PAGE
;****************************************************************************
;
;	Remote Initialization
;
;****************************************************************************

INCHN13
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	INCHANR

INCHN14
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	INCHANR

INCHN15
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	INCHANR

INCHN16
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT4,A4
	BRA.S	INCHANR

INCHAN7
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT0,A4
	
INCHANR
	MOVE	#2200H,SR	;Disable remote interrupts
	CLR.B	ROTFLGS(A4)	;Clear terminal output flags
	MOVE.B	RINPUT(A4),RINGET(A4) ;Clear input buffer
	MOVEQ	#26H,D0		;Make sure receive enabled
	BSR	SETROT
	CLR.B	RINRUNA(A4)	;Clear runaway count
	PEA	REMDAT0
	CMPA.L	(SP)+,A4
	BEQ.S	$10		;Bypass channel 0
	MOVE.B	ROTPUT(A4),ROTGET(A4) ;Clear output buffer
$10	MOVE	#2000H,SR	;Enable interrupts
	MOVEM.L (SP)+,A0/A4
	RTS


INCHAN8
	MOVE.L	A4,-(SP)
	LEA	REMDAT0,A4
	MOVE.B	ROTPUT(A4),ROTGET(A4) ;Clear output buffer
	MOVEA.L (SP)+,A4
	RTS



;****************************************************************************
;
;	Remote Status request
;
;****************************************************************************

;	Auxillary input channel
STCHAN7
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT0,A4
	CLR.W	D0
	MOVE.B	RINPUT(A4),D0	    ;Calculate number of buffered input chars
	SUB.B	RINGET(A4),D0
	MOVE.W	D0,(A1)		;Put in result area
	MOVE.B	C8255+2,D0	;Get Ringing & Carrier detect lines
	AND.B	#0CH,D0
	LEA	52.(A1),A1
	MOVE.B	D0,(A1)+
	MOVEA.W REMUSD(A4),A0
	MOVE.B	2(A0),D0	;Get Data Set Ready
	AND.B	#80H,D0
	MOVE.B	D0,(A1)+
	MOVE.W	RIN_FE(A4),(A1)+ ;Save error counts
	MOVE.W	RIN_PE(A4),(A1)+
	MOVE.W	RIN_OE(A4),(A1)
	MOVEM.L (SP)+,A0/A4
	RTS

;	Auxillary output channel
STCHAN8
	MOVE.L	A4,-(SP)
	LEA	REMDAT0,A4
	CLR.W	D0
	MOVE.B	ROTPUT(A4),D0	 ;Calculate number of buffered output chars
	SUB.B	ROTGET(A4),D0
	MOVE.W	D0,(A1)
	MOVEA.L (SP)+,A4
	RTS

;	Status for extra Remote Channels
STCHN13
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	STCHANR

STCHN14
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	STCHANR

STCHN15
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	STCHANR

STCHN16
	MOVEM.L A0/A4,-(SP)
	LEA	REMDAT4,A4
	
STCHANR
	CLR.W	D0
	BTST	#0,5(A0)	;Check direction in control word
	BEQ.S	$10		;Write direction
	MOVE.B	RINPUT(A4),D0	    ;Calculate number of buffered input chars
	SUB.B	RINGET(A4),D0
	MOVE.W	D0,(A1)		;Put in result area
	LEA	53.(A1),A1
	MOVEA.W REMUSD(A4),A0
	MOVE.B	2(A0),D0	;Get Data Set Ready
	AND.B	#80H,D0
	MOVE.B	D0,(A1)+
	MOVE.W	RIN_FE(A4),(A1)+ ;Save error counts
	MOVE.W	RIN_PE(A4),(A1)+
	MOVE.W	RIN_OE(A4),(A1)
	BRA.S	$20
	
$10	MOVE.B	ROTPUT(A4),D0	 ;Calculate number of buffered output chars
	SUB.B	ROTGET(A4),D0
	MOVE.W	D0,(A1)
$20	MOVEM.L (SP)+,A0/A4
	RTS


;	Read device configuration
RCFCH13
	MOVE.L	A4,-(SP)
	LEA	REMDAT1,A4
	BRA.S	RCFCHR

RCFCH14
	MOVE.L	A4,-(SP)
	LEA	REMDAT2,A4
	BRA.S	RCFCHR

RCFCH15
	MOVE.L	A4,-(SP)
	LEA	REMDAT3,A4
	BRA.S	RCFCHR

RCFCH16
	MOVE.L	A4,-(SP)
	LEA	REMDAT4,A4
	BRA.S	RCFCHR
	
RCFCH7
RCFCH8
	MOVE.L	A4,-(SP)
	LEA	REMDAT0,A4
	
RCFCHR
	MOVE.L	RBAUD(A4),(A1)+
	MOVE.L	RMTDTM(A4),(A1)
	MOVEA.L (SP)+,A4
	RTS


;****************************************************************************
;
;	Remote Channel Initialization
;
;****************************************************************************


;	A4 points to control data area
AUXINIT
	TST.B	REMEQU(A4)	;Check if channel is equipped
	BEQ.S	$50		;No channel
	MOVEM.L D0-D1/A0-A1,-(SP)
	MOVEA.W REMUSC(A4),A0
	TST.B	REMCHN(A4)
	BNE.S	$20		;Is extra serial port
;	Set up remote channel baud rate on main computer board
	MOVE.B	#0B6H,BAUD_C	;Set up for square wave output on 8253
	ROR.B	#8,D0		;Just for delay
	MOVE.W	RBAUD(A4),D1	;Get terminal baud rate parameter
	BNE.S	$10
	MOVE.W	#4,D1		;Default to 9600 baud
$10	MOVE.B	D1,BAUD2_D	;Set up 8253
	LSR.W	#8,D1
	MOVE.B	D1,BAUD2_D
	
	CLR.B	D0
	MOVE.B	D0,(A0)		;Null to 8251
	ROR.B	#8,D0		;Just for delay
	ROR.B	#8,D0		;Just for delay
	MOVE.B	D0,(A0)		;Second null to 8251
	ROR.B	#8,D0		;Just for delay
	ROR.B	#8,D0		;Just for delay
	MOVE.B	D0,(A0)		;Third null to 8251
	ROR.B	#8,D0		;Just for delay
	ROR.B	#8,D0		;Just for delay
	MOVE.B	#40H,(A0)	;USART reset command
	ROR.B	#8,D0		;Just for delay
	MOVE.B	RPARAM(A4),(A0) ;Apply USART control parameter
	ROR.B	#8,D0		;Just for delay
	BRA.S	$40

$20	TST.B	(A0)		;Read command to reset mode pointer
	ROR.B	#8,D0		;Just for delay
	MOVE.B	RPARAM(A4),-2(A0)
	MOVE.W	RBAUD(A4),D1
	BNE.S	$35		;Baud rate was specified
	MOVEQ	#3EH,D1		;Default to 9600 baud
$35	MOVE.B	D1,-2(A0)

$40	MOVE.B	#26H,REMCMD(A4) ;Enable USART receive, also DTR & CTS
	MOVE.B	REMCMD(A4),(A0)
	MOVEM.L (SP)+,D0-D1/A0-A1
$50	RTS


;	Initialization table for fixed Remote channel data
IREMTBL
	.WORD	0C031H		;Data port address
	.WORD	0C033H		;Control port address
	.WORD	32.		;Input attach number
	.WORD	34.		;Output attach number
	
	.WORD	0C4C1H		;Data port address
	.WORD	0C4C7H		;Control port address
	.WORD	40.		;Input attach number
	.WORD	41.		;Output attach number

	.WORD	0C481H		;Data port address
	.WORD	0C487H		;Control port address
	.WORD	42.		;Input attach number
	.WORD	43.		;Output attach number

	.WORD	0C441H		;Data port address
	.WORD	0C447H		;Control port address
	.WORD	44.		;Input attach number
	.WORD	45.		;Output attach number

	.WORD	0C401H		;Data port address
	.WORD	0C407H		;Control port address
	.WORD	46.		;Input attach number
	.WORD	47.		;Output attach number

;****************************************************************************
;
;	Ring detect interrupt
;
;****************************************************************************

;	Dummy routine, just return
RDINT	MOVE.W	(A7)+,D0
	RTE

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