.TITLE  SUPERVISOR
	.IODEV 1,2,3		/ASSIGN TTA TO DAT 1, LT1 TO DAT 2, LT2 TO DAT 3.
	.IODEV	4,5,6,7,-14,-15
	.GLOBL SAVE1,SAVE2,SAVE3,CWCHRC,SAV23,DIRSW
	.GLOBL	PS,SEMA,SUPER,COUNT,STOR1,G.MOVE,SAVE11,SAVE22,SAVE33,SEM1
PS	XX
	DAC	SPOT	/INCREMENT WAIT-LIST SEMAPHORE
	ISZ*	SPOT
	SKP
	JMP*	PS	/SEMAPHORE WAS -1
	ISZ	SPOT	/GET WAIT-LIST ADDRESS
PS1	LAC*	COUNT	/CHECK FOR COMPLETION OF INITIALIZATION
	SZA
	JMP	PS2	/COMPLETE
	XCT*	PS	/NOT COMPLETE GET SAVE ADDRESS
	DAC	SPOT
	JMP	PS3
PS2	LAC	READY	/FIND DEVICE SAVE ADDRESS
	SZA
	JMS	DEC
	JMP	SUPER	/NOTHING READY
PS3	DZM*	SPOT	/MARK END OF CHAIN
	ISZ	SPOT
	LAC	PS	/SAVE RETURN ADDRESS
	DAC*	SPOT
	ISZ	SPOT
	LACQ		/SAVE MQ
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO10	/SAVE AUTOINDEX REGISTERS
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO11
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO12
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO13
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO14
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO15
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO16
	DAC*	SPOT
	ISZ	SPOT
	LAC*	(AUTO17
	DAC*	SPOT
SAVE	ISZ	SPOT	/SAVE BUFFER AREA
	LAW	-1030
	JMS	G.MOVE
	TAD	SEM1	/MOVE FROM THIS ADDRESS
	TAD	SPOT	/TO THIS ADDRESS
	LAC*	COUNT	/CHECK FOR COMPLETION OF INITIALIZATION
	SNA
	JMP	PSINC
	JMP	SUPER
PSINC	ISZ	PS
	ISZ	PS	/FIND RETURN ADDRESS IF COUNT 0
	JMP*	PS
DEC	0		/DECREMENT READY-LIST
	DAC	SPOT
	ISZ	DEC
	LAC*	READY
	DAC	READY
	JMP*	DEC
SUPER	LAC	READY	/CHECK READY-LIST
	SNA
	JMP	SCAN	/READY-LIST EMPTY
	DAC*	(AUTO17	/RESTORE SAVED BUFFER
	LAW	13
	AND	CMASK
	TAD	READY
	DAC	BOX
	LAW	-1040
	JMS	G.MOVE
	TAD	BOX	/MOVE FROM THIS ADDRESS
	TAD	SEM1	/TO THIS ADDRESS
	LAC*	(AUTO17	/RESTORE ROUTINE
	DAC	SPOT
	JMS	INC
	DAC	PS	/RESTORE RETURN ADDRESS,
	RAL		/LINK,
	JMS	INC
	LMQ		/MQ,
	JMS	INC
	DAC*	(AUTO10	/AND AUTOINDEX REGISTERS.
	JMS	INC
	DAC*	(AUTO11
	JMS	INC
	DAC*	(AUTO12
	JMS	INC
	DAC*	(AUTO13
	JMS	INC
	DAC*	(AUTO14
	JMS	INC
	DAC*	(AUTO15
	JMS	INC
	DAC*	(AUTO16
	JMS	INC
	DAC*	(AUTO17
	JMP*	PS	/RETURN
INC	0		/INCREMENT SAVE AREA ROUTINE
	ISZ	SPOT
	LAC*	SPOT
	JMP*	INC
SCAN	LAC	SEMA11	/CHECK SEMAPHORE FOR DEVICE -14
	SPA
	JMP	SCA1	/DEVICE -14 NOT USED
	LAC*	DIRSW	/CHECK I/O DIRECTION
	SPA
	JMP	SC12	/REVERSE DIRECTION
SC11	.WAITR	-14,SC1	/STATUS CHECK DEVICE -14
	LAC*	DIRSW	/CHECK I/O DIRECTION
	SPA
	JMP	SC14	/REVERSE DIRECTION
SC13	LAC	(SEMA11 /GET DEVICE ADDRESS
	JMS	DECRE	/DECREMENT DEVICE SEMAPHORE
	JMP	S1	/DEVICE READY
SCA1	LAC	SEMA12	/CHECK DEVICE -15 SEMAPHORE
	SPA
	JMP	SCAN1	/DEVICE -15 NOT USED
	LAC*	DIRSW	/CHECK I/O DIRECTION
	SPA
	JMP	SC11	/REVERSE DIRECTION
SC12	.WAITR	-15,SC1	/DEVICE -15 STATUS CHECK
	LAC*	DIRSW	/CHECK DIRECTION
	SPA
	JMP	SC13	/REVERSE DIRECTION
SC14	LAC	(SEMA12 /GET SEMAPHORE ADDRESS
	JMS	DECRE	/DECREMENT SEMAPHORE
	JMP	S1	/DEVICE READY
SCAN1	LAC	SEMA1	/CHECK DEVICE 1 SEMAPHORE
	SPA
	JMP	SC1	/DEVICE NOT USED
	.WAITR	1,SC1	/CHECK READY STATUS
	LAC	(SEMA1	/GET SEMAPHORE ADDRESS
	JMS	DECRE
S1	LAC	(SAVE1	/GET SAVE AREA ADDRESS
	JMS	VS
SC1	LAC	SEMA21	/CHECK DEVICE 4 SEMAPHORE
	SPA
	JMP	SCA2
	LAC*	DIRSW
	SPA
	JMP	SC22
SC21	.WAITR	4,SC2	/CHECK STATUS OF DEVICE 4
	LAC*	DIRSW
	SPA
	JMP	SC24
SC23	LAC	(SEMA21
	JMS	DECRE
	JMP	S2	/DEVICE READY
SCA2	LAC	SEMA22	/CHECK DEVICE 5 SEMAPHORE
	SPA
	JMP	SCAN2
	LAC*	DIRSW
	SPA
	JMP	SC21
SC22	.WAITR	5,SC2	/CHECK STATUS OF DEVICE 5
	LAC*	DIRSW
	SPA
	JMP	SC23
SC24	LAC	(SEMA22
	JMS	DECRE
	JMP	S2	/DEVICE READY
SCAN2	LAC	SEMA2	/CHECK DEVICE 2 SEMAPHORE
	SPA
	JMP	SC2
	.WAITR	2,SC2	/CHECK STATUS OF DEVICE 2
	LAC	(SEMA2
	JMS	DECRE
S2	LAC	(SAVE2
	JMS	VS
SC2	LAC	SEMA31	/CHECK DEVICE 6 SEMAPHORE
	SPA
	JMP	SCA3
	LAC*	DIRSW
	SPA
	JMP	SC32
SC31	.WAITR	6,SC3	/STATUS CHECK DEVICE 6
	LAC*	DIRSW
	SPA
	JMP	SC34
SC33	LAC	(SEMA31
	JMS	DECRE
	JMP	S3	/DEVICE READY
SCA3	LAC	SEMA32	/CHECK DEVICE 7 SEMAPHORE
	SPA
	JMP	SCAN3
	LAC*	DIRSW
	SPA
	JMP	SC31
SC32	.WAITR	7,SC3 	/STATUS CHECK DEVICE 7
	LAC*	DIRSW
	SPA
	JMP	SC33
SC34	LAC	(SEMA32
	JMS	DECRE
	JMP	S3	/DEVICE READY
SCAN3	LAC	SEMA3	/CHECK DEVICE 3 SEMAPHORE
	SPA
	JMP	SC3
	.WAITR	3,SC3	/STATUS CHECK DEVICE 3
	LAC	(SEMA3
	JMS	DECRE
S3	LAC	(SAVE3
	JMS	VS	/DEVICE READY
SC3	JMP	SUPER	/RECYCLE SUPERVISOR
DECRE	0		/DECREMENT DEVICE SEMAPHORE ROUTINE
	DAC	SPOT
	LAW	-1
	TAD*	SPOT
	DAC*	SPOT
	JMP*	DECRE
VS	XX
	DAC	BOX1	/GET SAVE AREA
	LAC	(SEMA	/DECREMENT WAIT-LIST SEMAPHORE
	DAC	SPOT
	LAW	-1
	TAD*	SPOT
	DAC*	SPOT
	SPA
	JMP*	VS	/NO DEVICE WAITING
	ISZ	SPOT
	LAC	SPOT
VS1	DAC	BOX	/FIND END OF WAIT-LIST
	LAC*	BOX
	SZA
	JMP	VS1
	LAC	BOX1	/CHAIN WAIT-LIST
	DAC*	BOX
	DZM*	BOX1
	LAC*	SPOT
	DAC	BOX
	LAC*	BOX
	DAC*	SPOT
	LAC	(READY	/GET READY-LIST
VS2	DAC	SPOT
	LAC*	SPOT	/FIND END OF READY-LIST
	SZA
	JMP	VS2
	LAC	BOX	/CHAIN READY-LIST
	DAC*	SPOT
	DZM*	BOX
	JMP*	VS	/RETURN
SPOT	0
BOX	0
BOX1	0
CMASK	007777
SEMA	-1; 0		/WAIT-LIST
READY	0		/READY-LIST
SAVE1	0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0
SEMA1	-1		/DEVICE 1 SEMAPHORE
SEMA11	-1		/DEVICE -14 SEMAPHORE
SEMA12	-1		/DEVICE -15 SEMAPHORE
SAVE11	.BLOCK	40
SAVE16	.BLOCK	765
SAVE13	2001		/DEVICE 1 TELETYPE I/O
SAVE14	3001		/IMAGE MODE
SAVE15	1001		/INITIALIZE DEVICE 1
SAVE17	SAVE11
SAV11	1763		/DEVICE -15
SAV12	0764		/DEVICE -14
SAV13	125		/DAT SLOT ADDRESS -14
SAV14	124		/DAT SLOT ADDRESS -15
SAVE2	0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0
SEMA2	-1		/DEVICE 2 SEMAPHORE
SEMA21	-1		/DEVICE -14 SEMAPHORE
SEMA22	-1		/DEVICE -15 SEMAPHORE
SAVE22	.BLOCK	40
SAVE27	.BLOCK	763
SAV23	2004		/DEVICE 4 FILE I/O
SAV22	2005		/DEVICE 5 FILE I/O
SAVE24	2002		/DEVICE 2 TELETYPE
SAVE25	3002		/IMAGE MODE
SAVE26	1002		/INITIALIZE
SAVE28	SAVE22
SAV20	1005		/DEVICE 5
SAV21	0004		/DEVICE 4
SAV24	145		/DAT SLOT ADDRESS 4
SAV25	146		/DAT SLOT ADDRESS 5
SAVE3	0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0
SEMA3	-1		/DEVICE 3 SEMAPHORE
SEMA31	-1		/DEVICE 6 SEMAPHORE
SEMA32	-1		/DEVICE 7 SEMAPHORE
SAVE33	.BLOCK	40
SAVE38	.BLOCK	763
SAV33	2006		/DEVICE 6
SAV32	2007		/DEVICE 7
SAVE35	2003		/DEVICE 3
SAVE36	3003		/IMAGE MODE
SAVE37	1003		/INITIALIZE
SAVE39	SAVE33
SAV30	1007		/DEVICE 7
SAV31	0006		/DEVICE 6
SAV34	147		/DAT SLOT ADDRESS 6
SAV35	150		/DAT SLOT ADDRESS 7
AUTO10=10
AUTO11=11
AUTO12=12
AUTO13=13
AUTO14=14
AUTO15=15
AUTO16=16
AUTO17=17
G.MOVE	XX		/MOVE ROUTINE
	DAC	MOVES
	LAW	-1
	XCT*	G.MOVE	/WHERE FROM
	DAC*	(AUTO10
	ISZ	G.MOVE
	LAW	-1
	XCT*	G.MOVE	/WHERE TO
	DAC*	(AUTO11
	ISZ	G.MOVE
	LAC*	AUTO10
	DAC*	AUTO11
	ISZ	MOVES
	JMP	.-3
	JMP*	G.MOVE
MOVES	XX
	.END