.TITLE COA.
 
/ .... EDIT #2 .... 6 NOV 69
 
/COPYRIGHT 1969, 1970, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
 
/COA. --- BACKGROUND/FOREGROUND MONITOR SYSTEM.
/COA.=CORE TO CORE HANDLER
/TREATED AS A MULTIUNIT DEVICE HANDLER SO THAT
/IT CAN BE SHARED BY THE BGD AND FGD JOBS.
/J.J. MURPHY, JR  3-20-69.
/IT OPERATES COMPLETELY AT THE CAL LEVEL
/AND REQUIRES COMPLEMENTING REQUESTS
/BEFORE IT PERFORMS ANY DATA TRANSFERS.
/
.MED=3
.SCOM=100
	.GLOBL	COA.
COA.	JMS	CRSWAP		/SWAP BACKUP WITH LIVE REGS.
	0			/FOREGROUND BUSY REGISTER.
	0			/BACKGROUND BUSY REGISTER.
	0			/FOREGROUND .CLOSE REGISTER.
	0			/BACKGROUND .CLOSE REGISTER.
CRWD5	XX			/ION OR IOF
CRCNT	0			/TEMPORARY.
CROUT	XX			/RETURN POINTER.
/START OF BACKUP DATA REGISTERS.
CFUNC1	XX			/JMP ENTRY IN FUNCTION TABLE
CMODE1	XX			/0=FGRD, 1=BGRD
	XX
	XX
CDATA1	XX			/DATA MODE
CLBUF1	XX			/LINE BUFFER ADDRESS.
CWCNT1	XX			/LINE BUFFER WORD COUNT.
CREAL1	XX			/0=NOT REAL, PRIORITY/SUBR=REAL
/END OF BACKUP DATA REGISTERS.
/BEGINNING OF FUNCTION DISPATCH TABLE.
	JMP	CRINIT		/.INIT
	JMP	CRIGNR		/.OPER
	JMP	CRIGNR		/.SEEK
	JMP	CRIGNR		/.ENTER
	JMP	CRIGNR		/.CLEAR
	JMP	CRIGNR		/.CLOSE
	JMP	CRIGNR		/.MTAPE
CRIN	JMP	CRPROS		/.READ (.REALR)
	JMP	CRPROS		/.WRITE (.REALW)
CRTMP1	0			/.WAIT-PROCESSED BY CAL
	JMP	CRIGNR		/.TRAN
/END OF FUNCTION DISPATCH TABLE
CRSC35	0			/STORAGE FOR .SCOM+35
CRTMP2=CRSC35
	CSTOPF		/FGRD STOP I/O SUBROUTINE
	CSTOPB		/BGRD STOP I/O SUBROUTINE
	1		/HANDLER CODE
/START OF LIVE DATA REGISTERS.
CFUNC2	XX			/JMP ENTRY IN FUNCTION TABLE.
CMODE2	XX			/0=FGRD, 1=BGRD
	XX
	XX
CDATA2	XX			/DATA MODE
CLBUF2	XX			/LINE BUFFER ADDRESS.
CWCNT2	XX			/LINE BUFFER WORD COUNT.
CREAL2	XX			/0=NOT REAL, PRIORITY/SUBR=REAL
/.INIT PROCESSOR
CRINIT	LAC	(377		/RETURN 255 (10)
	DAC*	CWCNT2		/TO .INIT REGISTER.
/SUBROUTINE TO CLEAR APPROPRIATE BUSY FLAG
/AS A FUNCTION OF THE CONTENTS OF
/CMODE2 (0=FGRD, 1=BGRD)
CRIGNR	LAC	CMODE2		/0-FGRD, 1=BGRD
	TAD	(COA.+1
	DAC	CRTMP1		/ADDRESS OF F OR B BUSY REG.
	DZM*	CRTMP1		/CLEAR BUSY FLAG.
	JMS	CRCHNG		/SWAP BACKUP AND LIVE REGS.
	JMP*	CROUT
/
/.READ(.REALR) AND .WRITE(.REALW) PROCESSOR
/
CRPROS	LAC	CMODE2		/0=FGRD, 1=BGRD
	XOR	(1		/COMPLEMENT IN ORDER
	TAD	(COA.+1		/TO CHECK OTHER
	DAC	CRTMP1		/BUSY FLAG FOR
	LAC*	CRTMP1		/COMPLEMENTING I/O
	SNA
	JMP*	CROUT		/NO COMPLEMENTING I/O YET.
	LAC	CFUNC1
	SAD	CFUNC2
	JMP	CRNOT		/BOTH READS OR BOTH WRITES
	LAC	CDATA1		/COMPLEMENTING I/O
	SAD	CDATA2
	SKP
	JMP	CRNOT		/NOT SAME DATA MODE
	LAC	(JMP CRIN		/.READ(.REALR)
	SAD	CFUNC1
	JMP	CRBK2
CRBK1	LAC*	CLBUF1		/OUTPUT IN BACKUP.
	DAC*	CLBUF2		/INPUT IN FLIVE.
	ISZ	CLBUF1
	ISZ	CLBUF2
	ISZ	CWCNT2		/USE INPUT COUNTER.
	JMP	CRBK1
	JMP	CRDONE
CRBK2	LAC*	CLBUF2		/OUTPUT IN LIVE.
	DAC*	CLBUF1		/INPUT IN BACKUP.
	ISZ	CLBUF1
	ISZ	CLBUF2
	ISZ	CWCNT1		/USE INPUT COUNTER.
	JMP	CRBK2
CRDONE	DZM	COA.+1		/CLEAR FGRD AND
	DZM	COA.+2		/BGRD BUSY REGS.
/IS THIS DEVICE INVOLVED IN I/O BUSY SITUATION.
	LAC*	(.SCOM+52		/ADDRESS OF I/O
	DAC	CRTMP1		/BUSY TESTER.
	LAC	(400200		/PROTECT CALL.
	ISA
	IOF
	LAC	(COA.
	JMS*	CRTMP1
	DBK			/FROM LEVEL 0
	ION
CRREAL	LAC	CREAL1
	SZA
	JMS	CRNXTQ		/REAL TIME REQUEST
	LAC	CREAL2
	SZA
	JMS	CRNXTQ		/REAL TIME REQUEST
	JMP*	CROUT
/BACKGROUND REQUEST IGNORED BECAUSE IT DOES
/NOT COMPLEMENT FOREGROUND REQUEST.
CRNOT	LAC	CMODE2
	SZA
	JMS	CRCHNG		/PUT FGRD IN LIVE REGS.
	DZM	COA.+2		/CLEAR BGRD BUSY FLAG.
	JMP*	CROUT
/THIS SUBROUTINE IS EXECUTED (XCT) BY THE
/CAL HANDLER VIA WORD0 OF THIS HANDLER
/JUST PRIOR TO GIVING CONTROL TO THE
/HANDLER AT THE APPROPRIATE ENTRY IN
/THE FUNCTION DISPATCH TABLE.
CRSWAP	0
	XCT	CRWD5		/CORRECT PROGRAM INTERRUPT.
	DBK			/FROM LEVEL 0
	JMS	CRCHNG		/SWAP BACKUP AND LIVE REGS.
	JMP*	CRSWAP
/SWAP BACKUP AND LIVE DATA REGISTERS.
CRCHNG	0
	LAW	-10
	DAC	CRCNT		/COUNTER SET TO 8(10).
	LAC	(CFUNC1		/START OF BACKUP REGS.
	DAC	CRTMP1
	LAC	(CFUNC2		/START OF LIVE REGS.
	DAC	CRTMP2
CRBACK	LAC*	CRTMP1		/BACKUP TO
	DAC	CRTMP3		/TEMPORARY.
	LAC*	CRTMP2		/LIVE TO
	DAC*	CRTMP1		/BACKUP.
	LAC	CRTMP3		/TEMPORARY TO
	DAC*	CRTMP2		/LIVE.
	ISZ	CRTMP1		/INDEX
	ISZ	CRTMP2		/POINTERS.
	ISZ	CRCNT		/CHECK COUNT.
	JMP	CRBACK		/MORE TO MOVE.
	JMP*	CRCHNG		/ALL DONE.
/SUBROUTINE TO PLACE CONTENTS OF
/AC IN REAL TIME QUEUING SCHEME.
CRNXTQ	0
CRTMP3=CRNXTQ
	DAC	CRTMP1		/SAVE AC.
	LAC*	(.SCOM+51		/REALTP
	DAC	CRTMP2
	LAC	(400200		/RAISE TO API
	ISA			/LEVEL 0
	IOF			/TURN PIC OFF.
	LAC	CRTMP1		/RESTORE AC
	JMS*	CRTMP2		/CALL REAL TIME PROCESSOR
	DBK			/DEBREAK FROM LEVEL 0
	ION			/TURN ON PIC
	JMP*	CRNXTQ
/STOP FGRD I/O SUBROUTINE.
CSTOPF	0
	DZM	COA.+1		/CLEAR FGRD BUSY FLAG.
	JMP*	CSTOPF
/
/
/STOP BGRD I/O SUBROUTINE.
CSTOPB	0
	DZM	COA.+2		/CLEAR BGRD BUSY FLAG.
	JMP*	CSTOPB
	.END