File: OSB.PG of Disk: Disks/PDP8-Net/multos8
(Source file text) 

	FILE	MULTOS-8 USER IOT PROCESSOR
	TITLE	IOT PROCESSOR EDIT NUMBER
*
*	Copyright (C) 1978, 1979 by Computer Methods
*					7822 Oakledge Road
*					Salt Lake City, UT 84121
*					Phone 801-942-2300
*
*	Unauthorized reproduction in whole or in part
*	by any means whatsoever without written authorization
*	from Computer Methods is strictly prohibited by law.
*
	FREE	1		FOR PATCHING
*
*EDIT	EQU	797		14 JUL 1978
*SPLIT THE SOURCE FILE INTO SEVERAL SMALLER FILES.
*OSB CONTAINS THE CODE FOR THE USER MODE IOT PROCESSOR.
*
EDIT2	EQU	386		23 Aug 79
*EDIT3	EQU	1		1 DEC 80
*
*	ADDED CODE TO RETURN TO LINE PRINTER QUEUE TO THE USER
*
*	7-JAN-81
*	ADDED CODE TO PRINTER:CK SUBROUTINE TO ONLY ALLOW THE 
*	LINE PRINTER SPOOLER TO ACCESS THE LINE PRINTER
*
*379	17 Nov 78	Maintenance
*376	 4 Nov 78	Added automatic memory size determination
*	EDIT HISTORY
*
*EDIT	DATE		REASON
*324	 1 OCT 78	MAINTENANCE
*327	 2 OCT 78	ADDED CAPABILITY TO USE NON-CONTIGUOUS MEMORY
*335	 3 OCT 78	ADDED PERTEC DKBO SUPPORT
*341	 3 OCT 78	ADDED 'CAF' TO 'UALONE'
*342	 4 OCT 78	ADDED DATA PRINTER MODEL V132 SUPPORT
*359	 5 OCT 78	ADDED USWAPJ SUBROUTINE
*366	25 OCT 78	MAINTENANCE
*367	 1 NOV 78	MAINTENANCE
*373	 2 NOV 78	MAINTENANCE
*374	 4 Nov 78	Maintenance
*380	23 Nov 78	Maintenance
*381	24 Nov 78	Maintenance
*382	 4 Jan 79	Added '.END' Macro
*384	12 Jul 79	Added extended time quantum for compute-bound jobs.
*384	19 Aug 79	Added support for 6 terminals.
*385	23 Aug 79	Maintenance.
	TITLE	PAGE ZERO
*
	DSEC
*
PCSV	HLT			POWER MIGHT FAIL BEFORE TIMESHARING BEGINS
	JMPI	*+1		INTERRUPT SEQUENCE
	DC	INTERRUPT
	DC	POWER:UP	POWER UP POINTER
*
ODT	DC	EDIT1		FOR ODT USE
	DC	EDIT2		EDIT NUMBERS ESTABLISH IDENTITY
	DC	EDIT3
	DC	EDIT4
*
XR	DC	0		AUTO-INDEX REGISTERS
XR1	DC	0
XR2	DC	0
XR3	DC	0
XR4	DC	0		USED FOR OUTPUTTING MESSAGES
XR5	DC	0		DITTO
XR6	DC	0
	AIF	FLOPPY,.FLOPPY
XR7	DC	0
	AGO	.NO:FLOPPY
.FLOPPY	ANOP
RXQF	DC	RXQB-1		FLOPPY QUEUE BUFFER FILL POINTER
.NO:FLOPPY ANOP
*
UJOB	DC	0		CURRENT JOB
*
*	INITIALIZATION CALLING CODE
*
INITNOR	LDI	1		EXECUTIVE WAS ENTERED NORMALLY
INITCHN	CID	%INITIALIZE
	JMPI	*+1
	DC	INITIALIZE
*
*	USER INTERRUPT REGISTER STORAGE
*
UFLSV	QUT	%*,INITNOR	USER FLAGS
UPCSV	QUT	%*,UFLSV+1	USER PC
UACSV	QUT	%*,UPCSV+1	USER AC
UMQSV	QUT	%*,UACSV+1	USER MQ
UINST	DC	0		USER INSTRUCTION STORED HERE
ULOCK	DC	0		SET TO -1 BY KM8E AND CLEARED BY KM8RET
UTEMP	DC	0		GENERAL PURPOSE TEMPORARIES
UTEMP2	DC	0
UCNTR	DC	0		GENERAL PURPOSE COUNTER
UPNTR1	DC	0		GENERAL PURPOSE POINTERS
UPNTR2	DC	0
UPNTR3	DC	0
PEND:CIF DC	0		BIT 10=1 INDICATES A PENDING FIELD CHANGE
*				BITS 6-8 INDICATE THE NEW RELATIVE FIELD
JMSFLAG	DC	0		 0=PROCESSING A 'JMP' INSTRUCTION
*				-1=PROCESSING A 'JMS' INSTRUCTION
*
*	POINTERS TO FIELD INFORMATION WORDS
*
UFPNTR	DC	0		POINTER TO ONE OF FIELD INFO WORDS
UFPNTR2	DC	0		POINTER TO ONE OF FIELD INFO WORDS
RSFIELD	DC	0		'RECENTLY SWAPPED FIELD' -- POINTS TO FIELD
*				IO WORD OF MOST RECENTLY SWAPPED FIELD
*
	AIF	NO:PTR,.PTR
*
*	PR8-E STATUS REGISTER
*
RBE	DC	RB		READER BUFFER EMPTY POINTER
*
.PTR	ANOP
*
	AIF	NO:PTP,.PTP
*
*	PP8-E STATUS REGISTER
*
PBF	DC	PB		PUNCH BUFFER FILL POINTER
*
.PTP	ANOP
*
*	LA8-E LINE PRINTER STATUS REGISTER
*
LBF	DC	LPB		LINE PRINTER BUFFER FILL POINTER
*
	AIF	NO:SPOOL,.NO:SPOOL
*
*	SPOOL JOB STATUS REGISTERS
*
SPLJOB	DC	0		SPOOL JOB BUSY FLAG:
*				BIT(S)	MEANING
*				0	ABORT PRINTING OF CURRENT SPOOL FILE
*				1	UNUSED
*				2-5	SPOOL DEVICE NUMBER
*				6-8	UNUSED
*				9-11	REQUESTING JOB NUMBER
SPLQF	DC	SPLQ		SPOOL QUEUE BUFFER FILL POINTER
SPLQE	DC	SPLQ-1		SPOOL QUEUE BUFFER EMPTY POINTER
SPLQCTR	DC	0		SPOOL QUEUE ENTRY COUNTER
LPTCNT	DC	0		LINE PRINTER SEQUENCE COUNTER
*
.NO:SPOOL ANOP
*
	AIF	NO:MAGTAPE,.CONT
*
MTQF	DC	MTQB		MAGTAPE QUEUE BUFFER FILL POINTER
*
.CONT	ANOP
*
	AIF	NO:DECTAPE,.DECTAPE
*
DTQF	DC	DTQB		DECTAPE QUEUE BUFFER FILL POINTER
*
.DECTAPE ANOP
*
*	NEW INSTRUCTIONS
*
*	CHANGE 'DF' TO USER 'DF'
*
UUCUDF	DC	0
UCUDF	HLT			WILL BECOME A 'CDF X'
	JMPI	UUCUDF
*
*	CHANGE 'DF' TO USER 'IF'
*
UUCUIF	DC	0
UCUIF	HLT			WILL BECOME A 'CDF X'
	JMPI	UUCUIF
*
UPARAM	EQU	04400+*		GET A UINT JOB PARAMETER
	UUPARAM
*
*	POINTERS AND MISCELLANEOUS
*
USUSP	DC	KM8SUSP		POINTER TO USER SUSPEND ROUTINE
*
UXDISK	DC	UEXDISK		POINTER TO DISK ENQUEUE SUBROUTINE
*	LOCATIONS USED BY UEXDISK
UUFUNC	DC	0		FUNCTION WORD
UADDR	DC	0		CORE ADDRESS
UBLOCK	DC	0		DISK SECTOR ADDRESS
*
MCNTR	DC	0		MESSAGE CHARACTER COUNTER
WAITS	DC	0		WAIT BITS AFTER MESSAGE OUTPUT
*
MEMORY	DC	(TERMS.LS.6)+2	Used by USPR for memory size
*
*	TEMPORARY STORAGE LOCATIONS USED BY 'URAN'
*
RAND	DC	0		COMPUTED RANDOM NUMBER
RMID	DC	0
RLOW	DC	0
RTEMP	DC	0
RTEMP1	DC	0
RTEMP2	DC	0
MOD1	DC	0
MOD2	DC	0
SUBT1	DC	0
SUBT2	DC	0
*
CPU:TEM	EQU	0175		FOR USE ON PDP-8/I NON-EAE SYSTEMS
CPU:AC	EQU	0176
CPU:MQ	EQU	0177
	ISEC	0
	ORG	0200
*
INITN	JMP	INITNOR		NORMAL ENTRY POINT
INITC	JMP	INITCHN		CHAIN ENTRY POINT
*
INTERRUPT DSI	SINT		A USER INTERRUPT ?
	JMP	1F		NO
	JMP	KM8E		YES, MUST HAVE HIGHEST PRIORITY
1H	JMPX	NTRRPT		SERVICE THE HARDWARE INTERRUPT
*
*	USER PARAMETER POINTER FETCH ROUTINE (ION)
*
	PART
UUPARAM	HLT
	CDF	%*
	TAD	UJOB		ALWAYS USE CURRENT JOB
	MULT64
	TAD	=JOB1-USER:ST
	TADI	UUPARAM		GET THE PARAMETER
	INC	UUPARAM		BUMP RETURN
	DCA	UPNTR1
	JMPI	UUPARAM
	TITLE	USER INTERRUPT PROCESSOR
*
	PART
KM8E	DI	CINT		CLEAR USER INTERRUPT
	DCA	UACSV		SAVE HARDWARE REGISTERS
	GTF
	AND	=06177		STRIP OFF UNUSED HARDWARE FLAGS
	DCA	UFLSV
	INC	ULOCK		SET USER INTERRUPT LOCK
	TAD	PCSV		GET ADDRESS OF USER INSTRUCTION
	ION			ALLOW INTERRUPTS
	DCA	UPCSV
	LDI	-1
	TAD	UPCSV
	DCA	UPNTR1		POINT TO CALLING IOT
	AIF	NO:EAE.AN.PDP8I,.CONT
	SWP
	DCA	UMQSV
.CONT	ANOP
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT USER 'IF'
	TAD	=KCDF		FORM A 'CDF X'
	DCA	UCUIF
	.CUIF			'DF' TO USER 'IF'
	TADI	UPNTR1		GET THE USER INSTRUCTION
	CDF	%*
	DCA	UINST		SAVE IT
	DCA	PEND:CIF	CLEAR PENDING 'CIF' FLAG
	TAD	UINST
	RTL			ROTATE BIT 2 TO BIT 0
	SPA CLA			IS THE OP CODE 6 OR 7 ?
	JMP	OPCODE7		IT'S AN OPERATE INSTRUCTION
	TAD	UINST		GET THE USER INSTRUCTION
	AND	=07704
	TAD	=-(KCDF-1)
	SZA CLA			IS IT A 'CIF', 'CDF' OR 'CID' INSTRUCTION ?
	JMP	1F		NO
	LDI	2
	AND	UINST
	SZA CLA			IS IT A 'CIF' OR A 'CDF' INSTRUCTION ?
	TAD	=UCIF-UCDF	A 'CIF'
	TAD	=UCDF
	JMP	3F
*
1H	TAD	=IOT1-1		POINT TO IOT LIST TABLE
	DCA	XR
	TAD	UINST		GET THE USER INSTRUCTION
	CIA
	DCA	IOTBAD		PUT ITS NEGATIVE IN THE IOT LIST TABLE
2H	TADI	XR		GET AN IOT TABLE ENTRY
	TAD	UINST		COMPARE WITH USER INSTRUCTION
	SZA CLA			A MATCH ?
	JMP	2B		NO, TRY NEXT ENTRY
	TAD	XR		YES, GET THE IOT1 TABLE ADDRESS
	TAD	=IOT2-IOT1	COMPUTE ITS IOT2 TABLE ENTRY
	DCA	UPNTR1
	TADI	UPNTR1		GET ITS SERVICE SUBROUTINE ADDRESS
3H	DCA	UPNTR1
	JMSI	UPNTR1		EXECUTE IT
*
	PART
KM8RET	SRQ			IS AN INTERRUPT REQUEST PENDING ?
	JMP	1F		NO
	ION			YES, ALLOW IT TO BE SERVICED
1H	CDF	%JTIME
	IOF			SENSITIVE CODE HERE
	TADI	=JTIME
	SMA CLA			IS THE TIME QUANTUM UP ?
	JMP	2F		YES, SUSPEND
	DCA	ULOCK		NO, RELEASE THE USER LOCK
	AIF	NO:EAE.AN.PDP8I,.CONT
	TAD	UMQSV		GET USER REGISTERS
	MQL
.CONT	ANOP
	TAD	UFLSV
	AIF	PDP8I,.I
	ROOM	7
.I	ANOP
	RTF			ION
	AIF	PDP8I,.I
	AND	=UM		LOOK AT USER MODE BIT
	SNA CLA			IS IT SET ?
	IOF			NO, DISABLE INTERRUPT SYSTEM
.I	ANOP
	TAD	UACSV		GET THE USER AC
	ERM
	JMPI	UPCSV		RE-START THE CURRENT JOB
*
2H	CAM			CLEAR ALL WAIT BITS
*
*	SUSPEND A JOB WHICH JUST EXECUTED A USER INSTRUCTION
*	'.SUSPEND' IS AN EFFECTIVE 'JMP KM8SUSP'
*
	PART
KM8SUSP	SZA			Are any device wait bits set ?
	JMP	3F		Yes, don't bother setting extended quantum bit.
	MQA			No, check for logic waits.
	SNA			Are any logic wait bits set ?
	LDI	1		No, set the extended time quantum bit.
	MQL			New logic wait bits back to MQ.
3H	DCA	UTEMP		STORE DEVICE WAIT BIT(S) (IF ANY)
	CDF	%FLSV
	AIF	PDP8E.OR.EAE,.MQ
	MQA			GET THE MQ
	DCAI	=CPU:MQ
.MQ	TAD	UFLSV
	IOF
	DCAI	=FLSV
	TAD	UPCSV
	DCAI	=QPCSV
	TAD	UACSV
	DCAI	=ACSV
	TAD	UMQSV
	DCAI	=MQSV
	DCA	ULOCK		CLEAR USER LOCK
	TAD	UTEMP		GET WAIT BIT(S)
	JMPX	SCHEDULER	CALL THE SCHEDULER
*
*	THIS IS THE OP CODE 7 HANDLER.  SINCE A USER INTERRUPT
*	CAUSED THIS, ONLY A GROUP II OPERATE INSTRUCTION IS
*	POSSIBLE.
*
OPCODE7	JMS	OPCODE72	EXECUTE THE MICROINSTRUCTION
	JMP	KM8RET
*
*	EXECUTE AN OP CODE 7 GROUP II MICROINSTRUCTION
*
	PART
OPCODE72 SUB
	TAD	UINST		GET USER INSTRUCTION
	AND	=07770		THROW AWAY 'OSR' AND/OR 'HLT' BITS
	DCA	OPCODE7INST	PUT IN CODING SEQUENCE
	TAD	UFLSV		GET USER FLAGS
	CLL RAL			USER LINK TO MACHINE LINK
	DCA	UFLSV
	TAD	UACSV		GET USER AC
OPCODE7INST HLT			EXECUTE THE INSTRUCTION
	JMP	*+3		TAKES CARE OF SKIP INSTRUCTIONS
	ISZ	UPCSV		A SKIP -- BUMP USER PC
	NOP			SAFETY
	DCA	UACSV		SAVE NEW USER AC
	TAD	UFLSV
	RAR
	DCA	UFLSV		SAVE NEW USER FLAGS
	LDI	4
	AND	UINST		LOOK AT 'OSR' BIT
	SNA CLA			IS IT SET ?
	JMP	3F		NO, FORGET IT
	.PARAM	SR
	TADI	UPNTR1		GET THE USER SWITCH REGISTER FLAG
	SNA CLA			WHICH SWITCH REGISTER IS DESIRED ?
	JMP	1F		THE HARDWARE SWITCH REGISTER
	INC	UPNTR1		THE USER SWITCH REGISTER
	TADI	UPNTR1		GET IT
	MQL
	TAD	UACSV		GET USER AC
	MQOR			'OR' THE USER SWITCH REGISTER
	JMP	2F
1H	TAD	UACSV		GET USER AC
	OSR			GET THE HARDWARE SWITCH REGISTER
2H	DCA	UACSV
3H	LDI	2
	AND	UINST		LOOK AT 'HLT' BIT
	SNA CLA			IS IT SET ?
	RET	OPCODE72	NO, FORGET IT
*
*	OUTPUT A HALT MESSAGE
*
OP7HLT	LDI	-TERMS		THIS JOB EXECUTED A 'HLT' INSTRUCTION
	TAD	UJOB
	SMA SZA CLA		IS THIS AN EXECUTIVE TASK ?
	JMS	UIHLT		YES, JUST SUSPEND WITH 'HALTW' BIT SET
	TAD	=HALTW+ISUSPW	SET 'HALT' AND 'INDEFINITE SUSPEND' WAIT BITS
	DCA	WAITS
	TAD	=HALT		HALT MESSAGE ADDRESS
*
	PART
MESOUT	CDF	%*
	DCA	MESPTR		SAVE MESSAGE ADDRESS
	.PARAM	OUTIOT
	TADI	UPNTR1		GET OUTPUT IOT
	MQL
	INC	UPNTR1		BUMP TO MF
	IOF			THINGS GET TOUCHY IN HERE !
	TADI	UPNTR1		LOOK AT MOTION FLAG
	SNA CLA			WAS THE TTY IN MOTION ?
	MQA			NO, GET ITS OUTPUT IOT
	ROOM	4
	DCA	*+1
	HLT			WILL BE EITHER AN IOT OR ALL ZEROES
	INC	UPNTR1		BUMP TO OBF
	TADI	UPNTR1		GET OBF POINTER
	AND	=07600		SAVE ONLY PAGE BITS
	DCAI	UPNTR1		RESET OBF POINTER
	LDI	1
	TAD	UPNTR1
	DCA	UPNTR2		POINT TO OBE
	TADI	UPNTR1
	DCAI	UPNTR2		RESET OBE POINTER
	LDI	-1		BACK UP POINTER FOR INDEX
	TADI	UPNTR1
	ROOM	4
	JMS	MESSAGE		OUTPUT THE MESSAGE
MESPTR	DC	HALT
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT USER PHYSICAL 'IF'
	CLL RAR			ROTATE TO BITS 9-11
	RTR
	TAD	=FIELD0
	DCA	UFPNTR
	CDF	%FIELD2
	TADI	UFPNTR		GET THE FIELD INFO WORD
	AND	=070		EXTRACT USER DATA FIELD NUMBER
	CLL RAR
	RTR
	TAD	='0.AN.0177	ADD ASCII BIAS
	DCAI	XR5		INSTRUCTION FIELD DIGIT SENT
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT USER PHYSICAL 'DF'
	TAD	=FIELD0
	DCA	UFPNTR
	TADI	UFPNTR		GET FIELD INFO WORD
	AND	=070		EXTRACT USER DATA FIELD NUMBER
	CLL RAR
	RTR
	TAD	='0.AN.0177	ADD ASCII BIAS
	DCAI	XR5		DATA FIELD DIGIT SENT
	TAD	=' .AN.0177
	DCAI	XR5		OUTPUT A SPACE
	TAD	=-4
	DCA	UCNTR		SET PC DIGIT COUNTER
	LDI	-1		BACK UP USER PC TO ERROR CAUSING INSTRUCTION
	TAD	UPCSV		GET USER PC
	CLL RAL
	SKP
4H	TAD	UTEMP		GET SHIFTED USER PC
	RAL
	RTL
	DCA	UTEMP
	TAD	UTEMP
	AND	=07
	TAD	='0.AN.0177
	DCAI	XR5		SEND A USER PC DIGIT
	ISZ	UCNTR		FINISHED OUTPUTTING 3 PC DIGITS ?
	JMP	4B		NO
	TAD	=CR
	DCAI	XR5
	TAD	=LF
	DCAI	XR5
	CDF	%TABLES
	TAD	MCNTR		GET THE MESSAGE COUNT
	TAD	=9-128		COUNT THE CHARACTERS: E.G. '34 0123' + CR/LF
	INC	UPNTR2		POINT TO OBC
	DCAI	UPNTR2		BUFFER COUNT SET
	LDI	1
	TAD	XR5		COMPUTE NEW BUFFER ADDRESS
	DCAI	UPNTR1		SET OBF
	TAD	WAITS		SET LOGIC WAIT BITS (IF ANY)
	MQL
	.SUSPEND
*
*	OUTPUT A MESSAGE TO THE USER
*
	PART
	ROOM	6
MESSAGE	SUB
	DCA	XR5		SAVE BUFFER ADDRESS
	CDF	%*		ALL CALLS ARE IN THIS FIELD
	TADI	MESSAGE		GET MESSAGE ADDRESS
	INC	MESSAGE		BUMP RETURN
	DCA	XR4
	DCA	MCNTR		CLEAR MESSAGE CHARACTER COUNTER
1H	TADI	XR4		GET A WORD OF THE MESSAGE
	MQL
	MQA
	RAR6			LEFT BYTE TO RIGHT BYTE
	JMS	SEP		SEND A CHARACTER
	MQA
	JMS	SEP		DITTO
	JMP	1B
*
*	SEPARATE A SINGLE CHARACTER AND TRANSMIT IT
*
	PART
SEP	SUB
	AND	=077
	SNA			END OF MESSAGE ?
	RET	MESSAGE		YES
	TAD	=-('_.AN.077)
	CDF	%BUFFERS
	SNA			OUTPUT A CR/LF COMBO ?
	JMP	2F		YES
	TAD	=('_.AN.077)-(' .AN.077)
	SPA			ALPHABETIC OR NUMERIC ?
	TAD	=0100		ALPHABETIC
	TAD	=040
1H	DCAI	XR5		TRANSMIT THE CHARACTER TO BUFFER
	CDF	%*
	INC	MCNTR		COUNT THE CHARACTER
	RET	SEP
*
2H	TAD	=CR		SEND A CR/LF COMBO
	DCAI	XR5
	INC	MCNTR		COUNT THE CHARACTER
	TAD	=LF
	JMP	1B
	TITLE	IOT SIMULATIONS FOR 'SGT' AND 'CAF'
*
	PART
	AIF	NO:EAE.OR.PDP8I,.EAE
*
*	'SGT' SIMULATION - IOT 6006
*
USGT	SUB			SKIP ON 'GREATER THAN' FLAG
	LDI	02000
	AND	UFLSV
	ROOM	6
	SZA CLA			WAS USER 'GT' FLAG SET ?
	ISZ	UPCSV		YES, BUMP USER PC
	RET	USGT
	RET	USGT		SAFETY
*
.EAE	ANOP
*
*	'CAF' SIMULATION - IOT 6007
*
UCAF	SUB			CLEAR ALL FLAGS
	TAD	=0177		CLEAR LINK, GT FLAG, AND AC
	AND	UFLSV
	DCA	UFLSV
	DCA	UACSV
	AIF	NO:EAE.OR.PDP8I,.EAE
	SWBA			SET EAE TO MODE A
.EAE	ANOP
	JMS	RELEASE		RELEASE ALL ASSIGNABLE DEVICES
	RET	UCAF
	AIF	NO:PTR,.PTR
	TITLE	IOT SIMULATIONS FOR PC8E PAPER TAPE READER
*
	PART
*
*	'RSF' SIMULATION - IOT 6011
*
URSF	SUB			SKIP ON READER FLAG
	ROOM	4
	JMS	READER:CK	IS THE READER ASSIGNED TO THIS JOB ?
	ERM
	RET	URSF		NO, TREAT AS A 'NOP'
	TADI	RBE		LOOK IN THE READER BUFFER
	ROOM	4
	SZA CLA			ANYTHING THERE ?
	ISZ	UPCSV		YES, BUMP USER PC
	ERM
	RET	URSF
	RET	URSF		SAFETY
*
*	READER CHECK SUBROUTINE
*	CHECK READER ASSIGNMENT.  IF READER IS AVAILABLE,
*	IT IS ASSIGNED TO THIS JOB.
*
	PART
	ROOM	13
READER:CK SUB
	CDF	%READER
	TADI	=READER
	SNA			IS READER ASSIGNED ?
	JMP	2F		NO, ASSIGN IT TO THIS JOB
	TAD	UJOB		YES
	SNA CLA			IS READER ASSIGNED TO THIS JOB ?
	ERM
1H	INC	READER:CK	YES, BUMP RETURN POINTER
	RET	READER:CK
*
2H	TAD	UJOB		ASSIGN READER TO THIS JOB
	CIA
	DCAI	=READER
	JMP	1B
*
*	'RRB' SIMULATION - IOT 6012
*
	PART
URRB	SUB			READ READER BUFFER
	ROOM	4
	JMS	READER:CK	IS THE READER ASSIGNED TO THIS JOB ?
	RET	URRB		NO, TREAT AS A 'NOP'
	TADI	RBE		CHECK THE BUFFER
	SNA			ANYTHING IN THE BUFFER ?
	RET	URRB		NO, TREAT AS A 'NOP'
	CLL RAL			YES, STRIP OFF 'NON-ZERO' FLAG
	CLL RAR
	MQL
	TAD	UACSV		GET USER AC
	MQOR			BRING UP THE READER CHARACTER
	DCA	UACSV		NEW USER AC
	RET	URRB
*
*	'RFC' SIMULATION - IOT 6014
*
	PART
URFC	SUB			FETCH READER CHARACTER
	ROOM	4
	JMS	READER:CK	IS READER ASSIGNED TO THIS JOB ?
	RET	URFC		NO, TREAT AS A 'NOP'
	IOF			NO INTERRUPTS
	TAD	RBE		RESET THE BUFFER POINTERS
	CDF	%RBF
	DCAI	=RBF
	TAD	=-128
	MQL
	MQA
	DCAI	=RCNTR
	TAD	=RB-1
	.CLEAR			CLEAR THE READER BUFFER
	IOT	PR8,RFC		START THE HARDWARE
	RET	URFC
*
*	'RRC' SIMULATION - IOT 6016
*
	PART
URRC	SUB			READ READER CHARACTER
	ROOM	4
	JMS	READER:CK	IS READER ASSIGNED TO THIS JOB ?
	RET	URRC		NO, TREAT AS A 'NOP'
	TADI	RBE		GET A CHARACTER FROM THE READER BUFFER
	SNA			ANYTHING THERE ?
	RET	URRC		NO
	CLL RAL			YES, STRIP OFF 'NON-ZERO' FLAG
	CLL RAR
	MQL
	DCAI	RBE		CLEAR BUFFER POSITION
	TAD	UACSV
	MQOR
	DCA	UACSV		NEW USER AC
	LDI	1		UPDATE THE READER BUFFER EMPTY POINTER
	TAD	RBE
	AND	=0177
	TAD	=RB
	DCA	RBE
	TADI	=RCNTR		GET THE BUFFER COUNT
	SNA			WAS THE BUFFER PREVIOUSLY FULL ?
	IOT	PR8,RFC		YES, RESTART THE READER
	TAD	=-1		BACK UP THE BUFFER COUNT
	DCAI	=RCNTR
	RET	URRC
*
.PTR	ANOP
	AIF	NO:PTP,.PTP
	TITLE	IOT SIMULATION FOR PAPER TAPE PUNCH
*
*	'PSF' SIMULATION - IOT 6021
*
	PART
UPSF	SUB			SKIP ON PUNCH FLAG
	ROOM	4
	JMS	PUNCH:CK	IS PUNCH ASSIGNED TO THIS JOB ?
	RET	UPSF		NO, TREAT AS A 'NOP'
	JMS	UTSF		JUST AN UNCONDITIONAL SKIP
	RET	UPSF
*
*	PUNCH CHECK SUBROUTINE
*	CHECK PUNCH ASSIGNMENT.  IF PUNCH IS
*	AVAILABLE, IT IS ASSIGNED TO THIS JOB.
*
	PART
	ROOM	13
PUNCH:CK SUB
	CDF	%PUNCH
	TADI	=PUNCH
	SNA			IS PUNCH ASSIGNED ?
	JMP	2F		NO, ASSIGN IT TO THIS JOB
	TAD	UJOB		YES
	SNA CLA			IS IT ASSIGNED TO THIS JOB ?
	ERM
1H	INC	PUNCH:CK	YES, BUMP RETURN POINTER
	RET	PUNCH:CK
*
2H	TAD	UJOB		ASSIGN PUNCH TO THIS JOB
	CIA
	DCAI	=PUNCH
	JMP	1B
*
*	'PPC' SIMULATION - IOT 6024
*	'PLS' SIMULATION - IOT 6026
*
	PART
UPLS	SUB			PUNCH LOAD SEQUENCE
	ROOM	4
	JMS	PUNCH:CK	IS PUNCH ASSIGNED TO THIS JOB ?
	RET	UPLS		NO, TREAT AS A 'NOP'
	IOF			SENSITIVE CODE HERE
	TADI	=PMF		GET PUNCH MOTION FLAG
	SZA CLA			IS PUNCH IN MOTION ?
	JMP	UPLS2		YES
	TAD	UACSV		GET USER AC
	SNA			IS CHARACTER ZERO ?
	LDI	04000		YES, MAKE IT NON-ZERO
	IOT	PP8,LS		PUNCH THE CHARACTER
	DCAI	=PMF		AND SET MOTION FLAG
	RET	UPLS
*
UPLS2	TAD	UACSV		GET THE CHARACTER TO BE PUNCHED
	SNA			IS IT ZERO ?
	LDI	04000		YES, MAKE IT NON-ZERO
	DCAI	PBF		STORE CHARACTER IN PUNCH BUFFER
	LDI	1		UPDATE PUNCH BUFFER FILL POINTER
	TAD	PBF
	AND	=0177
	TAD	=PB
	DCA	PBF
	ISZI	=PCNTR		PUNCH BUFFER FULL ?
	RET	UPLS		NO
	MQL			CLEAR LOGIC WAIT BITS
	LDI	PUNW		SET PUNCH WAIT BIT
	.SUSPEND
*
.PTP	ANOP
	TITLE	IOT SIMULATIONS FOR TTY KEYBOARD
*
*	'KSF' SIMULATION - IOT 6031
*
	PART
UKSF	SUB			SKIP ON KEYBOARD FLAG
	JMS	UKIN		LOOK IN THE INPUT BUFFER
	SNA CLA			ANYTHING THERE ?
	JMP	UKSF2		NO
	ISZ	UPCSV		YES, BUMP USER PC
	RET	UKSF
	RET	UKSF		SAFETY
*
UKSF2	LDI	-1		SEE IF NEXT USER INST IS 'JMP *-1'
	TAD	UPCSV
	AND	=0177		KEEP ONLY RELATIVE PAGE BITS
	TAD	=05200		'JMP CURRENT PAGE'
	CIA			NEGATE
	.CUIF			'DF' TO USER 'IF'
	TADI	UPCSV		ADD IN NEXT USER INSTRUCTION
	SZA CLA			WAS IT 'JMP *-1' ?
	RET	UKSF		NO, CONTINUE PROGRAM EXECUTION
	ISZ	UPCSV		YES, DON'T EXECUTE THAT IOT AGAIN !
	NOP
	MQL			CLEAR LOGIC WAIT BITS
	TAD	=KEYW		SET KEYBOARD WAIT
	.SUSPEND
*
*	'KCC' SIMULATION - IOT 6032
*
UKCC	SUB			CLEAR AC AND KEYBOARD FLAG
	DCA	UACSV		CLEAR USER AC
	JMS	UKIN		LOOK IN THE INPUT BUFFER
	SZA CLA			ANYTHING THERE ?
	JMS	UKBUMP		YES, THROW IT AWAY AND BUMP POINTER
	RET	UKCC
*
*	'KRS' SIMULATION - IOT 6034
*
	PART
UKRS	SUB			READ KEYBOARD STATIC
	JMS	UKIN		LOOK IN THE INPUT BUFFER
	SNA			ANYTHING THERE ?
	RET	UKRS		NO, FORGET IT
	CLL RAL			YES, STRIP THE 'NON-ZERO' FLAG
	CLL RAR
	MQL
	TAD	UACSV		GET USER AC
	MQOR			'OR' IN KEYBOARD CHARACTER
	DCA	UACSV		NEW USER AC
	RET	UKRS
*
*	'KRB' SIMULATION - IOT 6036
*
	PART
UKRB	SUB			READ KEYBOARD DYNAMIC
	JMS	UKIN		LOOK IN THE INPUT BUFFER
	SNA			ANYTHING THERE ?
	JMP	UKRB2		NO
	CLL RAL			YES, DELETE NON-ZERO FLAG
	CLL RAR
	DCA	UACSV		LOAD USER AC
	JMS	UKBUMP		BUMP THE INPUT BUFFER EMPTY POINTER
	RET	UKRB
*
UKRB2	LDI	-1		BACK UP USER PC TO CATCH THIS IOT NEXT TIME
	TAD	UPCSV
	DCA	UPCSV
	MQL			CLEAR LOGIC WAIT BITS
	TAD	=KEYW		SET KEYBOARD WAIT FLAG
	.SUSPEND
*
*	KEYBOARD SUBROUTINE TO LOOK INTO THE INPUT BUFFER
*
	PART
UKIN	SUB
	.PARAM	IBE		GET INPUT BUFFER EMPTY POINTER
	TADI	UPNTR1
	DCA	UPNTR2
	CDF	%BUFFERS
	TADI	UPNTR2		LOOK IN THE BUFFER
	RET	UKIN
*
*	KEYBOARD SUBROUTINE TO BUMP THE INPUT BUFFER POINTER
*
	PART
UKBUMP	SUB
	DCAI	UPNTR2		THROW AWAY THE LAST CHARACTER READ
	CDF	%TABLES
	TADI	UPNTR1		GET THE INPUT BUFFER EMPTY POINTER
	AND	=07740		UPDATE IT
	MQL
	LDI	1
	TADI	UPNTR1
	AND	=037
	MQA
	DCAI	UPNTR1		STORE NEW INPUT BUFFER EMPTY POINTER
	RET	UKBUMP
	TITLE	IOT SIMULATIONS FOR TTY PRINTER
*
*	'TSF' SIMULATION - IOT 6041
*
	PART
UTSF	SUB			SKIP ON TTY FLAG
	LDI	-1
	TAD	UPCSV
	DCA	UPNTR1
	TAD	=KSKP		CHANGE 'TSF' TO 'SKP'
	.CUIF
	DCAI	UPNTR1
	ISZ	UPCSV		UNCONDITIONAL SKIP
	RET	UTSF
	RET	UTSF		SAFETY
*
*	'TPC' SIMULATION - IOT 6044
*	'TLS' SIMULATION - IOT 6046
*
	PART
UTLS	SUB			TTY LOAD SEQUENCE
	.PARAM	MF		GET MOTION FLAG POINTER
	IOF			SENSITIVE CODE HERE
	TADI	UPNTR1		GET MOTION FLAG
	SZA CLA			IS TTY IN MOTION ?
	JMP	UTLS2		YES, PUT CHARACTER IN OUTPUT BUFFER
	LDI	OUTIOT-MF
	TAD	UPNTR1
	DCA	UPNTR2
	TADI	UPNTR2		GET OUTPUT IOT
	DCA	1F
	TAD	UACSV		GET USER CHARACTER TO PRINT
	SNA			ANYTHING THERE ?
	LDI	04000		NO, JUST SET NON-ZERO FLAG
1H	HLT			PRINT IT AND
	DCAI	UPNTR1			SET MOTION FLAG
	RET	UTLS
*
UTLS2	INC	UPNTR1
2H	TADI	UPNTR1		GET OBF POINTER
	DCA	UPNTR2		SAVE IT
	CDF	%BUFFERS
	TAD	UACSV		GET USER AC
	SNA			IS IT ZERO ?
	LDI	04000		YES, MAKE IT NON-ZERO
	DCAI	UPNTR2		STORE CHARACTER IN OUTPUT BUFFER
	CDF	%TABLES
	TAD	UPNTR2		UPDATE THE OUTPUT BUFFER POINTER
	AND	=07600
	MQL
	LDI	1
	TAD	UPNTR2
	AND	=0177
	MQA
	DCAI	UPNTR1		STORE THE NEW POINTER
	INC	UPNTR1		BUMP TO OBE
	INC	UPNTR1		BUMP TO OBC
	ISZI	UPNTR1		IS THE BUFFER FULL ?
	RET	UTLS		NO
	MQL			CLEAR LOGIC WAIT BITS
	LDI	TTYW		YES, SET TTY OUTPUT WAIT BIT
	.SUSPEND			AND SUSPEND
	TITLE	EXECUTIVE REQUESTS
*
*	'TSS' SIMULATION - IOT 6107
*
UTSSS	EQU	UTSF		SKIP IF TIMESHARING (UNCONDITIONAL SKIP)
	TITLE	FILE STRUCTURED DEVICE HANDLERS
*
*	'FSD' SIMULATION - IOT 6110
*
	PART
UFSD	SUB			FILE STRUCTURED DEVICE HANDLER IOT
	CAL
	DCA	UACSV		CLEAR USER AC
	.CUIF			'DF' TO USER 'IF'
	TADI	UPCSV		GET DEVICE NUMBER
	AND	=017		INSURE IT IS A DEVICE NUMBER
	SNA			WAS A DEVICE SPECIFIED ?
	JMP	UFSD3		NO, TAKE ERROR EXIT
	DCA	UTEMP		SAVE DEVICE NUMBER
	TAD	UTEMP
	TAD	=DEV:TAB-1
	DCA	UPNTR1
	ISZ	UPCSV		POINT TO POINTER TO CALLING ADDRESS
	NOP
	TADI	UPCSV		GET POINTER TO CALLING ADDRESS
	DCA	UPCSV
	TAD	UFLSV		GET USER FLAGS
	MQL
	MQA
	AND	=070		EXTRACT USER PHYSICAL 'IF'
	CLL RAR			COMPUTE FIELD INFO WORD ADDRESS
	RTR
	TAD	=FIELD0
	DCA	UFPNTR
	CDF	%FIELD2
	LDI	-(IF+1)		REMOVE 'IF' RESIDENCY BIT
	ANDI	UFPNTR
	DCAI	UFPNTR
	MQA			GET USER FLAGS AGAIN
	AND	=07		EXTRACT USER PHYSICAL 'DF'
	TAD	=FIELD0		COMPUTE FIELD INFO WORD ADDRESS
	DCA	UFPNTR
	LDI	IF		SET 'IF' RESIDENCY BIT
	TADI	UFPNTR
	DCAI	UFPNTR
	MQA			GET USER FLAGS
	AND	=07		KEEP ONLY USER 'DF'
	CLL RAL
	RTL
	MQL
	MQA			GET THE CALLING FIELD
	TAD	=KCDF		FORM A 'CDF' INST
	DCA	UCUIF
	TAD	UFLSV		GET USER FLAGS
	AND	=07707		THROW AWAY 'IF'
	MQA			'OR' IN CALLING FIELD TO BE NEW 'IF'
	DCA	UFLSV		NEW USER FLAGS
	CDF	%TABLES
	TADI	UPNTR1		LOOK IN VALID DEVICE TABLE
	SZA			IS A DEVICE HANDLER AVAILABLE ?
	JMP	UFSD5		YES
UFSD3	LDI	3		BUMP USER PC TO ERROR RETURN
	SKP
UFSD4	LDI	-1			AND TAKE ERROR RETURN
	TAD	UPCSV
	DCA	UPCSV
	LDI	04000
	DCA	UACSV
	RET	UFSD
*
UFSD5	DCA	UPNTR1		SAVE HANDLER ADDRESS
	.CUIF			'DF' TO CALLING 'IF'
	TADI	UPCSV		GET FUNCTION WORD
	AND	=07770		EXTRACT READ/WRITE, PAGE AND FIELD BITS
	DCA	UUFUNC
	ISZ	UPCSV		BUMP TO CORE ADDRESS
	NOP
	TADI	UPCSV		GET CORE ADDRESS
	DCA	UADDR
	ISZ	UPCSV		BUMP TO BLOCK NUMBER
	NOP
	TADI	UPCSV		GET USER BLOCK NUMBER
	DCA	UBLOCK
	LDI	2
	TAD	UPCSV
	DCA	UPCSV		USER PC POINTING TO NORMAL RETURN
	CDF	%*
	JMPI	UPNTR1		JUMP TO DEVICE HANDLER ROUTINE
*
	AIF	NO:DECTAPE,.DECTAPE
	TITLE	DECTAPE HANDLER
*
*	DEVICE HANDLERS FOR DTA0 - DTA7
*
DTA7	INC	UUFUNC		DTA7 ENTRY
DTA6	INC	UUFUNC		DTA6 ENTRY
DTA5	INC	UUFUNC		DTA5 ENTRY
DTA4	INC	UUFUNC		DTA4 ENTRY
DTA3	INC	UUFUNC		DTA3 ENTRY
DTA2	INC	UUFUNC		DTA2 ENTRY
DTA1	INC	UUFUNC		DTA1 ENTRY
DTA0	TAD	UBLOCK		DTA0 ENTRY
	TAD	=-737
	SMA CLA			IS IT A LEGAL DECTAPE BLOCK NUMBER ?
	JMP	UFSD4		NO, TAKE ERROR EXIT
*
	AIF	TD8E,.TD8E
*
UTC08	HLT			TC08 DECTAPE HANDLER
*
	AGO	.DECTAPE
*
.TD8E	ANOP
*
UTD8E	TAD	UUFUNC		GET THE FUNCTION WORD
	SMA CLA			READ OR WRITE ?
	JMP	2F		READ
	CDF	%*
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=07		EXTRACT THE DECTAPE UNIT NUMBER
	TAD	=DT:A0
	DCA	UPNTR1
	TADI	UPNTR1		GET JOB ASSIGNMENT FOR THIS DRIVE
	SZA			IS THE DRIVE ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			IS IT ALREADY ASSIGNED TO THIS JOB ?
	JMP	UFSD4		NO, TAKE ERROR RETURN
	TAD	UJOB		ASSIGN/REASSIGN THE DRIVE TO THIS JOB
	CIA
	DCAI	UPNTR1
2H	TAD	UJOB		GET THE JOB NUMBER
	CDF	%DTQB
	DCAI	DTQF		PUT THE REQUEST ON THE DECTAPE QUEUE
	INC	DTQF		BUMP THE POINTER
	TAD	UUFUNC
	DCAI	DTQF
	INC	DTQF
	TAD	UADDR
	DCAI	DTQF
	INC	DTQF
	TAD	UBLOCK		CONVERT OS/8 BLOCK TO DECTAPE LOGICAL BLOCK
	CLL RAL
	DCAI	DTQF
	LDI	1		UPDATE THE DECTAPE QUEUE FILL POINTER
	TAD	DTQF
	AND	=017
	TAD	=DTQB
	DCA	DTQF
	IOF			SENSITIVE CODE HERE !
	TADI	=DTJOB
	SZA CLA			IS THE DECTAPE CURRENTLY BUSY ?
	JMP	3F		YES
	LDI	-1		NO, SET THE TD8E DECTAPE INTERRUPT FLAG
	DCAI	=DTFLAG
3H	.FINDM
	SNA CLA			ANY MEMORY AVAILABLE ?
	LDI	NRESW		NO, SWAP OUT THE JOB
	MQL			SET/CLEAR LOGIC WAIT BITS
	LDI	DTAW		SET DECTAPE WAIT BIT
	.SUSPEND
*
.DECTAPE ANOP
*
	AIF	NO:RKO5,.RKO5
	TITLE	RK05 DISK HANDLER
*
*	DEVICE HANDLERS FOR RK05 DRIVES 1-3
*
	PART
RKB3	INC	UUFUNC		RKB3 ENTRY POINT
RKA3	INC	UUFUNC		RKA3 ENTRY POINT
RKB2	INC	UUFUNC		RKB2 ENTRY POINT
RKA2	INC	UUFUNC		RKA2 ENTRY POINT
RKB1	INC	UUFUNC		RKB1 ENTRY POINT
RKA1	INC	UUFUNC		RKA1 ENTRY POINT
	INC	UUFUNC		DRIVE NUMBER IS IN BITS 9-10
	LDI	0100		BUMP THE PAGE COUNT BY 1
	TAD	UUFUNC		ADD IN THE FUNCTION WORD
	AND	=03600		EXTRACT PAGE COUNT
	SNA			AN ENTIRE FIELD ?
	LDI	04000		YES, SET PAGES TO 40(8)
	RAR6			CONVERT TO A BLOCK COUNT
	CLL RAR
	TAD	UBLOCK
	TAD	=-(RK:BIAS+1)
	SZL CLA			OVERFLOW INTO NEXT LOGICAL DEVICE ?
	JMP	UFSD4		YES, TAKE ERROR RETURN
	AIF	SYS:DISK.NE.PERTEC,.CONT
	TAD	UBLOCK		GET THE BLOCK NUMBER
	TAD	=06240		ADD CUC OS/8 OFFSET
	DCA	UBLOCK
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=07772		REMOVE ALL BUT HIGH ORDER HEAD BIT
	DCA	UUFUNC
.CONT	TAD	=077		SET SEARCH MASK
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT USER RELATIVE TRANSFER FIELD
	TAD	UJOB		ADD THE JOB NUMBER
	.FINDF
	SNA			IS THE FIELD RESIDENT ?
	JMP	RKNRES		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
RKRES	TAD	UFPNTR
	TAD	=-FIELD0	COMPUTE THE PHYSICAL FIELD
	CLL RAL
	RTL
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=07707		REMOVE USER RELATIVE FIELD
	MQA			BRING UP PHYSICAL FIELD
	DCA	UUFUNC
	TAD	UUFUNC		GET THE FUNCTION WORD
	SMA			A READ OR WRITE REQUEST ?
	JMP	1F		READ -- DON'T ASSIGN THE DEVICE
	AND	=07		EXTRACT LOGICAL DEVICE NUMBER
	TAD	=RK:A1-2	FORM POINTER TO DEVICE ASSIGNMENT
	DCA	UPNTR1		SAVE IT
	TADI	UPNTR1
	SZA			IS THE DEVICE ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			TO THIS JOB ?
	JMP	UFSD4		NO, TREAT AS AN ERROR
	TAD	UJOB		GET THE CURRENT JOB NUMBER
	CIA
	DCAI	UPNTR1		ASSIGN THIS DEVICE TO THIS JOB
	TAD	UUFUNC		GET THE FUNCTION WORD
1H	CLL RAR
	SNL			IS THE HIGH ORDER BIT SET ?
	JMP	2F		NO
	CLL RAL			CLEAR HIGH ORDER DISK ADDRESS BIT
	DCA	UUFUNC
	TAD	UBLOCK		GET THE BLOCK NUMBER
	TAD	=RK:BIAS	ADD THE DISK OFFSET
	AIF	SYS:DISK.NE.PERTEC,.CONT
	TAD	=-020		ADD PERTEC DKB0 OFFSET
.CONT	DCA	UBLOCK		LOW ORDER PHYSICAL BLOCK COMPUTED
	SZL			SET HIGH ORDER DISK ADDRESS BIT ?
	INC	UUFUNC		YES
2H	CAL
	.EXDISK			QUEUE THE DISK REQUEST
	MQL			CLEAR LOGIC WAIT BITS
	.SUSPEND
*
RKNRES	.FINDM
	SZA			IS ANY MEMORY AVAILABLE ?
	JMP	3F		YES
	TAD	=06007		NO, SET FIELD SEARCH MASK
	MQL
	TAD	UJOB		FIND A FIELD OTHER THAN USER'S CALLING FIELD
	.FINDF
	SNA			IS ONE RESIDENT ?
	JMP	4F		NO
	DCA	UFPNTR		YES, SAVE IT'S FIELD INFO WORD ADDRESS
	LDI	04000		WRITE IT TO SWAP TRACKS
	.SWAPF
	SKP
3H	DCA	UFPNTR		SAVE ADDRESS OF FIELD INFO WORD
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT USER RELATIVE TRANSFER FIELD
	TAD	UJOB
	CDF	%FIELD2
	DCAI	UFPNTR		CLAIM OWNERSHIP
	.SWAPF
	JMS	UJMS,RKRES,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0
*
4H	LDI	NRESW		JUST SWAP OUT THE JOB
	JMS	UJMS,RKNRES,UCUIF,UUFUNC,UADDR,UBLOCK,0
*
.RKO5	ANOP
	TITLE	SYSTEM DEVICE HANDLER
*
*	DEVICE HANDLER FOR SYS
*
	PART
SYS	LDI	0100		BUMP PAGE COUNT BY 1
	TAD	UUFUNC		ADD THE FUNCTION WORD
	AND	=03600		EXTRACT PAGE COUNT (EXCEPT L O BIT)
	SNA			A FULL FIELD TRANSFER ?
	LDI	04000		YES
	RAR6			CONVERT TO A BLOCK COUNT
	CLL RAR
	TAD	UBLOCK		ADD THE REQUESTED BLOCK NUMBER
	TAD	=-(SWAP+1)
	SZL CLA			IS IT WITHIN THE SYSTEM DEVICE AREA ?
	JMP	UFSD4		NO, AN ERROR
	TAD	=077		SET SEARCH MASK
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT THE USER RELATIVE TRANSFER FIELD
	TAD	UJOB		ADD THE JOB NUMBER
	.FINDF
	SNA			IS THE FIELD RESIDENT ?
	JMP	SYSNRES		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
SYSRES	TAD	UFPNTR		COMPUTE PHYSICAL FIELD
	TAD	=-FIELD0
	CLL RAL
	RTL
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD AGAIN
	AND	=07700		EXTRACT READ/WRITE AND PAGE BITS
	MQA			BRING UP PHYSICAL FIELD
	DCA	UUFUNC
	TAD	UUFUNC		GET THE FUNCTION WORD AGAIN
	SMA CLA			IS THIS A WRITE REQUEST ?
	JMP	0F		NO
	TAD	UJOB		YES, GET THE JOB NUMBER
	TAD	=JSYS-1
	DCA	UPNTR1		POINT TO 'J' ASSIGNMENT TABLE
	TADI	UPNTR1		GET THE ASSIGNED JOB NUMBER
	SZA			IS THIS 'J' ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			IS IT ASSIGNED TO THIS JOB ?
	JMP	UFSD4		NO, TREAT AS AN ERROR
	TAD	UJOB		ASSIGN/RE-ASSIGN IT TO THIS JOB
	CIA
	DCAI	UPNTR1
0H	TAD	UBLOCK
	TAD	=-KBM:DA
	SNA			IS THE KEYBOARD MONITOR REQUESTED ?
	JMP	SYS:OK		YES, RELEASE DEVICES
	TAD	=KBM:DA-CD:DA
	SNA CLA			IS THE COMMAND DECODER REQUESTED ?
SYS:OK	JMS	RELEASE		RELEASE ALL ASSIGNED DEVICES
	LDI	-TERMS
	TAD	UJOB
	SPA SNA CLA		IS THIS AN EXECUTIVE JOB ?
	JMP	4F		NO
	.PARAM	CURJOB
	TADI	UPNTR1		YES, GET THE ACTUAL JOB NUMBER
	SKP
4H	TAD	UJOB
	TAD	=-1
	SNA			IS IT JOB 1 ?
	JMP	3F		YES
	CLL CIA			FORM -(JOB-1)
	DCA	UCNTR
1H	TAD	=SWAP		COMPUTE START OF JOB SYSTEM DEVICE
	ISZ	UCNTR		FINISHED ?
	JMP	1B		NO
	TAD	=JOBS*128	SWAP+(16*(7*TERMS+JOBS))	qqx
	TAD	UBLOCK
	DCA	UBLOCK		HARDWARE BLOCK COMPUTED
	SZL			A CARRY BIT ?
	INC	UUFUNC		YES, SET H.O. DISK SECTOR ADDRESS BIT
3H	CAL
	.EXDISK			ENQUEUE THE DISK REQUEST
	MQL			CLEAR LOGIC WAIT BITS
	.SUSPEND
*
SYSNRES	.FINDM
	SZA			ANY MEMORY AVAILABLE ?
	JMP	4F		YES
	TAD	=06007		NO, SET FIELD SEARCH MASK
	MQL
	TAD	UJOB		FIND A FIELD OTHER THAN CALLING FIELD
	.FINDF
	SNA			IS ONE RESIDENT ?
	JMP	5F		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
	LDI	04000		WRITE IT TO SWAP TRACKS
	.SWAPF
	SKP
4H	DCA	UFPNTR		SAVE ADDRESS OF FIELD INFO WORD
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT USER RELATIVE TRANSFER FIELD
	TAD	UJOB
	CDF	%FIELD2
	DCAI	UFPNTR		CLAIM OWNERSHIP
	.SWAPF
	JMS	UJMS,SYSRES,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0
*
5H	LDI	NRESW		JUST SWAP OUT THE JOB
	JMS	UJMS,SYSNRES,UCUIF,UUFUNC,UADDR,UBLOCK,0
	TITLE	'J' DEVICE HANDLERS
*
*	DEVICE HANDLERS FOR J1 - J4
*
	PART
J6	IAC			J6 ENTRY
J5	IAC			J5 ENTRY
J4	IAC			J4 ENTRY
J3	IAC			J3 ENTRY
J2	IAC			J2 ENTRY
J1	DCA	UTEMP2		J1 ENTRY
	TAD	UBLOCK		GET THE REQUESTED BLOCK NUMBER
	TAD	=-SWAP
	SZL CLA			IS IT A VALID BLOCK NUMBER ?
	JMP	UFSD4		NO, TAKE ERROR RETURN
	LDI	0100		ROUND UP THE PAGE COUNT
	TAD	UUFUNC
	AND	=03600		EXTRACT ONLY THE TOTAL BLOCK COUNT
	SNA			A FULL FIELD TRANSFER ?
	LDI	04000		YES
	CLL RAR			MOVE TO LSB'S
	RAR6
	TAD	UBLOCK		GET THE HIGHEST BLOCK NUMBER
	TAD	=-(SWAP+1)
	SZL CLA			IS IT A VALID BLOCK NUMBER ?
	JMP	UFSD4		NO, TAKE ERROR RETURN
	TAD	=077		SET FIELD SEARCH MASK
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT USER RELATIVE TRANSFER FIELD
	TAD	UJOB		ADD THE JOB NUMBER
	.FINDF
	SNA			IS THE FIELD RESIDENT ?
	JMP	JNRES		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
JRES	TAD	UFPNTR		COMPUTE PHYSICAL FIELD
	TAD	=-FIELD0
	CLL RAL
	RTL
	MQL
	TAD	UUFUNC		GET THE FUNCTION WORD AGAIN
	AND	=07700		EXTRACT READ/WRITE AND PAGE BITS
	MQA			BRING UP THE PHYSICAL FIELD
	DCA	UUFUNC
	TAD	UUFUNC		GET THE FUNCTION WORD
	SMA CLA			IS THIS A WRITE REQUEST ?
	JMP	1F		NO, DON'T BOTHER WITH ASSIGNMENT
	TAD	=JSYS
	TAD	UTEMP2		ADD OFFSET
	DCA	UPNTR1		POINT TO 'JSYS' ASSIGNMENT TABLE
	TADI	UPNTR1
	SZA			IS IT CURRENTLY ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			IS IT ASSIGNED TO THIS JOB ?
	JMP	UFSD4		NO, TREAT IT AS AN ERROR
	TAD	UJOB		ASSIGN/RE-ASSIGN IT TO THIS JOB
	CIA
	DCAI	UPNTR1
1H	TAD	UTEMP2		GET THE 'J' HANDLER NUMBER
	SNA			'J1' HANDLER ?
	JMP	3F		YES
	CLL CIA			NO, MUST COMPUTE DISK OFFSET
	DCA	UCNTR
2H	TAD	=SWAP		COMPUTE THE DISK OFFSET
	ISZ	UCNTR		FINISHED ?
	JMP	2B		NO
	TAD	=JOBS*128	16*(7*TERMS+JOBS)	qqx
	TAD	UBLOCK		LINK WILL BE CLEAR HERE
	DCA	UBLOCK		ABSOLUTE DISK BLOCK COMPUTED
	SZL			SET THE H O DISK ADDRESS BIT ?
	INC	UUFUNC		YES
3H	.EXDISK			QUEUE THE DISK REQUEST
	MQL			CLEAR LOGIC WAIT BITS
	.SUSPEND
*
JNRES	.FINDM
	SZA			ANY MEMORY AVAILABLE ?
	JMP	4F		YES
	TAD	=06007		NO, SET FIELD SEARCH MASK
	MQL
	TAD	UJOB		FIND A FIELD OTHER THAN CALLING FIELD
	.FINDF
	SNA			IS ONE RESIDENT ?
	JMP	5F		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
	LDI	04000		WRITE IT TO SWAP TRACKS
	.SWAPF
	SKP
4H	DCA	UFPNTR		SAVE ADDDRESS OF FIELD INFO WORD
	TAD	UUFUNC		GET THE FUNCTION WORD
	AND	=070		EXTRACT USER RELATIVE TRANSFER FIELD
	TAD	UJOB
	CDF	%FIELD2
	DCAI	UFPNTR		CLAIM OWNERSHIP
	.SWAPF
	JMS	UJMS,JRES,UTEMP2,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0
*
5H	LDI	NRESW		JUST SWAP OUT THE JOB
	JMS	UJMS,JNRES,UTEMP2,UCUIF,UUFUNC,UADDR,UBLOCK,0
*
	AIF	NO:FLOPPY,.FLOPPY
	TITLE	FLOPPY DISK HANDLER
*
*	FLOPPY DISK HANDLERS RXA0, RXA1, R0 & R1
*
*	THE FORMAT ON THE FLOPPY DISK QUEUE IS AS FOLLOWS:
*	WORD	BIT(S)	DESCRIPTION
*	1	0-8	UNUSED (MUST BE ZERO)
*		9-11	JOB NUMBER
*	2	0	R/W:	0 = READ; 1 = WRITE
*		1-5	PAGES TO TRANSFER
*		6-8	RELATIVE MEMORY FIELD
*		9	UNUSED
*		10	MODE:	0 = 12-BIT; 1 = 8-BIT
*		11	DRIVE:	0 = DRIVE 0: 1 = DRIVE 1
*	3	0-11	TRANSFER MEMORY ADDRESS
*	4	0-11	FLOPPY LOGICAL BLOCK NUMBER
*
	PART
R1	INC	UUFUNC		R1 ENTRY
R0	INC	UUFUNC		R0 ENTRY
RXA1	INC	UUFUNC		RXA1 ENTRY
RXA0	LDI	2		RXA0 ENTRY
	AND	UUFUNC		GET THE MODE
	SZA CLA			WHICH MODE ?
	TAD	=494-667	8-BIT MODE
	TAD	=-494
	TAD	UBLOCK
	SMA CLA			IS IT A VALID FLOPPY BLOCK NUMBER ?
	JMP	UFSD4		NO, TAKE ERROR RETURN
	TAD	UUFUNC		GET THE FUNCTION WORD
	SMA CLA			READ OR WRITE ?
	JMP	2F		READ
	CDF	%*
	LDI	1
	AND	UUFUNC
	TAD	=RX:A0
	DCA	UPNTR1
	TADI	UPNTR1		GET JOB ASSIGNMENT FOR THIS DRIVE
	SZA			IS THE DRIVE ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			IS IT ALREADY ASSIGNED TO THIS JOB ?
	JMP	UFSD4		NO, TAKE ERROR RETURN
	TAD	UJOB		ASSIGN/REASSIGN THE DRIVE TO THIS JOB
	CIA
	DCAI	UPNTR1
2H	TAD	UJOB		ADD THE JOB NUMBER
	CDF	%RXQB
	DCAI	RXQF		PUT THE REQUEST ON THE FLOPPY QUEUE
	TAD	UUFUNC
	DCAI	RXQF
	TAD	UADDR
	DCAI	RXQF
	LDI	2
	AND	UUFUNC		GET MODE BIT
	CLL RTR			ROTATE IT TO LINK
	TAD	UBLOCK		CONVERT OS/8 BLOCK TO RX8E LOGICAL BLOCK
	TAD	UBLOCK
	TAD	UBLOCK
	SNL			WHICH MODE ?
	TAD	UBLOCK		12-BIT
	DCAI	RXQF
	LDI	1		CHECK THE FLOPPY QUEUE FILL POINTER
	TAD	RXQF
	TAD	=-(RXQB+020)
	SZA CLA			TIME TO UPDATE IT ?
	JMP	3F		NO
	TAD	=RXQB-1		YES, RESET THE INDEX
	DCA	RXQF
3H	IOF			SENSITIVE CODE HERE !
	TADI	=RXJOB
	SZA CLA			IS THE FLOPPY CURRENTLY BUSY ?
	JMP	4F		YES
	TAD	=0130		A FAKE COMMAND TO FORCE DONE FLAG
	IOT	RX8,LCD
4H	.FINDM
	SNA CLA			ANY MEMORY AVAILABLE ?
	LDI	NRESW		NO, SWAP OUT THE JOB
	MQL			SET/CLEAR LOGIC WAIT BITS
	TAD	=FLOPW		SET FLOPPY WAIT
	.SUSPEND
*
.FLOPPY	ANOP
	TITLE	EXECUTIVE REQUESTS
*
*	'TSS' SIMULATION - IOT 6111
*
UTSS	EQU	UTSF		SKIP IF TIMESHARING (UNCONDITIONAL SKIP)
*
*	'SSR' SIMULATION - IOT 6112
*	SET SWITCH REGISTER FLAG AND/OR SWITCH REGISTER
*
USSR	SUB
	.PARAM	SR
	LDI	04000
	AND	UFLSV		GET THE USER LINK
	DCAI	UPNTR1		STORE IT AS SWITCH REGISTER FLAG
	INC	UPNTR1
	TAD	UACSV		GET USER AC
	DCAI	UPNTR1		STORE IT AS USER SWITCH REGISTER
	DCA	UACSV		CLEAR USER AC
	RET	USSR
*
*	'RCR' SIMULATION - IOT 6113
*
URCR	SUB			RETURN CLOCK RATE IN TICKS PER SECOND
	TAD	=TICKS
	DCA	UACSV
	RET	URCR
*
*	'TOD' SIMULATION - IOT 6114
*	USER AC(0):	0= RETURN H O TIME IN AC, L O TIME IN MQ
*			1= RETURN TIME TO 'DF' LOCATION SPECIFIED BY
*				CONTENTS OF NEXT LOCATION
*	USER AC(11):	0= RETURN CLOCK TICKS SINCE MIDNIGHT
*			1= RETURN NEGATED TICKS UNTIL MIDNIGHT
*
	PART
UTOD	SUB			RETURN TIME OF DAY
	CDF	%TIME
	TADI	=TIME		GET NEGATED H O TICKS UNTIL MIDNIGHT
	DCA	UTEMP
	TADI	=TIME+1		GET NEGATED L O TICKS UNTIL MIDNIGHT
	DCA	UTEMP2
	LDI	1
	AND	UACSV
	SZA CLA			WHICH TIME IS DESIRED ?
	JMP	1F		NEGATED TICKS UNTIL MIDNIGHT
	TAD	=MIDNLO		TICKS SINCE LAST MIDNIGHT
	TAD	UTEMP2
	DCA	UTEMP2
	RAL
	TAD	=MIDNHO
	TAD	UTEMP
	DCA	UTEMP
1H	TAD	UACSV
	SPA CLA			WHERE IS TIME TO BE STORED ?
	JMP	2F		IN LOCATION POINTED TO BY NEXT USER LOCATION
	TAD	UTEMP		IN USER AC,MQ
	DCA	UACSV
	TAD	UTEMP2
	DCA	UMQSV
	RET	UTOD
2H	.CUIF
	LDI	-1		GET DESIRED TIME STORAGE LOCATION -1
	TADI	UPCSV
	DCA	XR
	JMS	SETDF
	.CUDF
	TAD	UTEMP		GET AND STORE THE TIME
	DCAI	XR
	TAD	UTEMP2
	DCAI	XR
	DCA	UACSV		CLEAR USER AC
	ISZ	UPCSV		BUMP USER PC PAST TIME POINTER
	RET	UTOD
	RET	UTOD		SAFETY
*
*	'DATE' SIMULATION - IOT 6115
*	USER AC = 0:	AC(0-11)  <-- L O SYSTEM DATE WORD
*	USER AC = 1:	AC(0-2)   <-- 0
*			AC(3-4)   <-- H O YEAR BITS
*			AC(5-11)  <-- 0
*	USER AC = 2:	AC(0-11)  <-- L O SYSTEM DATE WORD
*			MQ(0-2)   <-- 0
*			MQ(3-4)   <-- H O YEAR BITS
*			MQ(5-11)  <-- 0
*	USER AC = 3:	AC(0-5)   <-- DAY
*			AC(6-11)  <-- MONTH
*			MQ(0-11)  <-- YEAR
*
	PART
UDATE	SUB			RETURN THE DATE
	TAD	OSDATEH		GET H O DATE WORD
	AND	=0600		EXTRACT H O YEAR BITS
	MQL
	CDF	%OSDATEL
	TADI	=OSDATEL	GET L O DATE WORD
	DCA	UTEMP
	LDI	-2
	TAD	UACSV
	SMA			DETERMINE REQUESTED FORMAT
	JMP	2F
	IAC
	SNA CLA
	JMP	1F
	TAD	UTEMP		GET L O SYSTEM DATE WORD
	JMP	4F
1H	MQA			GET H O YEAR BITS
	JMP	4F
2H	SZA CLA
	JMP	3F
	MQA			GET H O YEAR BITS
	DCA	UMQSV
	TAD	UTEMP		GET L O DATE WORD
	JMP	4F
3H	MQA			GET THE H O YEAR BITS
	CLL RTR			ROTATE TO BITS 8-9
	RTR
	MQL
	TAD	UTEMP		GET THE L O DATE WORD
	AND	=7		EXTRACT L O YEAR BITS
	MQA			BRING UP H O YEAR BITS
	TAD	=1970		ADD IN BASE YEAR
	DCA	UMQSV
	TAD	UTEMP		GET L O DATE WORD
	AND	=0370		EXTRACT THE DAY
	CLL RAL			ROTATE TO BITS 0-5
	RTL
	MQL
	TAD	UTEMP		GET L O DATE WORD
	AND	=07400		EXTRACT THE MONTH
	CLL RAL			ROTATE TO BITS 6-11
	RTL
	RTL
	MQA			BRING UP THE DAY BITS
4H	DCA	UACSV
	RET	UDATE
*
*	'TASK' SIMULATION - IOT 6116
*
	PART
UTASK	SUB			RETURN TASK NUMBER IN USER AC
	LDI	-TERMS
	TAD	UJOB		GET THE CURRENT JOB NUMBER
	SPA SNA	CLA		IS THIS AN EXECUTIVE TASK ?
	JMP	2F		NO
	TAD	UACSV		YES, GET THE EXEC TASK AC
	SNA CLA			WHAT TASK NUMBER DOES IT WANT ?
	JMP	2F		ITS OWN
	.PARAM	CURJOB
	TAD	UACSV		GET EXEC TASK AC AGAIN
	SMA			A REQUEST TO STORE OR RETRIEVE A JOB NUMBER ?
	JMP	1F		RETRIEVE
	AND	=07		EXTRACT JOB NUMBER
	DCAI	UPNTR1
	JMP	3F		CLEAR EXEC TASK AC
*
1H	CAL			RETRIEVE A JOB NUMBER
	TADI	UPNTR1
	SKP
2H	TAD	UJOB		GET THE CURRENT JOB'S TASK NUMBER
3H	DCA	UACSV
	RET	UTASK
*
*	'IHLT' SIMULATION - IOT 6117
*
	PART
UIHLT	HLT			HALT WITHOUT SENDING A MESSAGE
	AIF	NO:SPOOL,.SPOOL
	LDI	-TERMS
	TAD	UJOB
	IOF			SENSITIVE CODE HERE !
	SPA SNA CLA		IS THIS AN EXEC TASK ?
	JMP	1F		NO
	TAD	SPLJOB		CHECK TO SEE WHETHER TO DISMISS FROM MEMORY
	SZA CLA			OK TO DISMISS ?
	JMP	3F		NO
.SPOOL	ANOP
1H	TAD	=-6
	DCA	UCNTR
	TAD	=FIELD2
	DCA	UFPNTR
	TAD	UJOB
	CIA
	DCA	UTEMP
	CDF	%FPNTR
2H	TADI	UFPNTR		RELEASE THIS JOB'S MEMORY
	AND	=07
	TAD	UTEMP
	SNA CLA			THIS FIELD ASSIGNED TO THIS JOB ?
	DCAI	UFPNTR		YES, RELEASE IT
	INC	UFPNTR		BUMP THE POINTER
	ISZ	UCNTR		CHECKED ALL FIELDS YET ?
	JMP	2B		NO
3H	.PARAM	LWAIT
	LDI	HALTW		JUST SET HALT WAIT BIT
	MQL
	DCAI	UPNTR1			AND CLEAR REMAINDER
	.SUSPEND
*
*	'SYN' SIMULATION - IOT 6120
*
USYN	HLT
	MQL			CLEAR LOGIC WAITS
	.SUSPEND
*
*	'STM' SIMULATION - IOT 6121
*	RESTART USER JOB WHEN CLOCK HAS TICKED THE NUMBER OF
*	TIMES SPECIFIED BY THE CONTENTS OF A DOUBLE PRECISION
*	LOCATION IN THE USER'S DF POINTED TO BY THE CONTENTS
*	OF THE LOCATION FOLLOWING THE 'STM' INSTRUCTION.
*	THE H O DELAY TICK COUNT IS CONTAINED IN THE L O MEMORY
*	ADDRESS.
*
	PART
USTM	HLT			SUSPEND UNTIL SPECIFIED TIME
	.CUIF
	TADI	UPCSV		GET THE DELAY TICK COUNT POINTER
	ISZ	UPCSV		BUMP USER PC
	NOP			SAFETY
	DCA	UPNTR1		POINTER TO H O DELAY TICK COUNT
	TAD	UPNTR1		POINTER -1 TO L O DELAY TICK COUNT
	DCA	XR
	JMS	SETDF
	.CUDF
	TADI	XR		GET L O DELAY TICK COUNT
	CLL CIA
	MQL
	CML RAL			GET THE CARRY BIT
	TADI	UPNTR1		GET H O DELAY TICK COUNT
	CIA
	DCA	UTEMP
	.PARAM	RESTART
	MQA			SAVE L O DELAY TICK COUNT
	DCAI	UPNTR1
	INC	UPNTR1
	TAD	UTEMP		SAVE H O DELAY TICK COUNT
	DCAI	UPNTR1
	LDI	NRESW+REALW	SET NON-RESIDENT AND REAL TIME WAIT BITS
	MQL
	.SUSPEND
*
*	'RAN' SIMULATION - IOT 6122
*
	PART
URAN	SUB			RANDOM NUMBER GENERATOR (DECUS 5-25)
	CDF	%TIME			BY P T BRADY
	TADI	=TIME+1		GET THE L O TIME
	RAR			L O BIT TO LINK
	CLA
	TAD	RLOW
	RAL
	AND	=07400
	DCA	RTEMP2
	TAD	RMID
	AND	=0177
	TAD	RTEMP2
	RTL
	RTL
	RAL
	DCA	RTEMP
	TAD	RLOW
	AND	=0177
	RTL
	RTL
	RAL
	TAD	RMID
	DCA	RTEMP1
	ROOM	4
	SNL
	ISZ	RTEMP
	ERM
	NOP
	TAD	RLOW
	CLL RAL
	ROOM	6
	SNL
	ISZ	RTEMP1
	SKP
	ISZ	RTEMP
	ERM
	NOP
	CLL
	TAD	RLOW
	DCA	RLOW
	TAD	RMID
	RAL
	ROOM	4
	SNL
	ISZ	RTEMP
	ERM
	NOP
	CLL
	TAD	RTEMP1
	DCA	RMID
	TAD	RAND
	RAL
	TAD	RAND
	TAD	RTEMP
	DCA	RAND
	TAD	RAND		GET THE GENERATED RANDOM NUMBER
	DCA	UACSV		LOAD THE USER AC
	RET	URAN
*
*	'ALONE' SIMULATION - IOT 6123
*
	PART
UALONE	SUB			RETURN TO STANDALONE OS/8
	LDI	-1
	TAD	UJOB
	SZA CLA			IS JOB 1 REQUESTING STANDALONE OS/8 ?
	RET	UALONE		NO, TREAT AS A 'NOP'
	IOF			YES, ALLOW I/O TIME TO SETTLE
	TAD	=-25
	DCA	UPNTR1
	DCA	UPNTR2
1H	ISZ	UPNTR2
	JMP	1B
	ISZ	UPNTR1
	JMP	1B
	CAF			CLEAR ALL HARDWARE FLAGS
	JMP	$07605		START STANDALONE OS/8
*
*	'TALK' SIMULATION - IOT 6124
*
	PART
UTALK	SUB			SEND A CHARACTER TO ANOTHER TERMINAL
	TAD	UACSV		GET USER AC
	AND	=07000		EXTRACT DESTINATION TERMINAL NUMBER
	SNA			TERMINAL # 0 REQUESTED ?
	RET	UTALK		YES, TREAT AS A 'NOP'
	TAD	=-(TERMS.LS.9)
	SMA SZA CLA		IS DESTINATION A VALID TERMINAL NUMBER ?
	RET	UTALK		NO, TREAT AS A 'NOP'
	TAD	UACSV		YES, GET USER AC
	AND	=07000		EXTRACT DESTINATION TERMINAL NUMBER
	CLL RAR
	RTR
	TAD	=JOB1-USER:ST+OUTIOT
	DCA	UPNTR1		POINT TO OUTPUT IOT
	TADI	UPNTR1		GET IT
	DCA	1F		PUT IT IN CODING LINE
	INC	UPNTR1		POINT TO MOTION FLAG
	IOF			SENSITIVE CODE HERE
	TADI	UPNTR1		GET IT
	SZA CLA			IS DESTINATION TERMINAL IN MOTION ?
	JMP	2F		YES
	TAD	UACSV		NO, GET THE CHARACTER
1H	HLT			TRANSMIT IT TO DESTINATION TERMINAL
	DCAI	UPNTR1		AND SET MOTION FLAG
	JMP	3F
*
2H	INC	UPNTR1		POINT TO OUTPUT BUFFER FILL POINTER
	TADI	UPNTR1		GET IT
	DCA	UPNTR2
	CDF	%BUFFERS
	TADI	UPNTR2		LOOK IN DESTINATION TERMINAL OUTPUT BUFFER
	SZA CLA			IS IT FULL ?
	RET	UTALK		YES, TREAT AS A 'NOP'
	TAD	UACSV		GET THE CHARACTER
	DCAI	UPNTR2		STORE IT IN OUTPUT BUFFER
	CDF	%*
	TAD	UPNTR2		UPDATE BUFFER POINTER
	AND	=07600
	MQL
	LDI	1
	TAD	UPNTR2
	AND	=0177
	MQA
	DCAI	UPNTR1
	INC	UPNTR1
	INC	UPNTR1		POINT TO OUTPUT BUFFER CHARACTER COUNTER
	ISZI	UPNTR1		BUMP THE CHARACTER COUNT
	NOP
3H	ISZ	UPCSV		BUMP USER PC
	RET	UTALK
	RET	UTALK		SAFETY
*
*	'SPR' SIMULATION - IOT 6125
*	RETURN SYSTEM PARAMETERS TO A BLOCK IN THE USER'S DATA FIELD:
*	WORD	CONTENTS
*	0	USER'S TASK NUMBER
*	1	NUMBER OF ENTRIES ON PRINT SPOOLER QUEUE
*	2	BITS SET INDICATE CORRESPONDING TASKS LOGGED ON
*	3	BITS SET INDICATE CORRESPONDING TASKS OUTPUTTING
*			TO THEIR OWN TERMINALS
*	4	BITS 3-5	NUMBER OF TERMINALS ON THE SYSTEM
*		     6-8	NUMBER OF AVAILABLE MEMORY FIELDS
*		     9-11	NUMBER OF PHYSICAL SWAP MEMORY FIELDS
*	5	STATUS OF JOB 1
*	6	PC OF JOB 1
*	7	STATUS OF JOB 2
*	10	PC OF JOB 2
*	.	.
*	.	.
*	.	.
*	4+(2*N)	WHAT'S IN FIELD 2.
*	5+(2*N)	WHAT'S IN FIELD 3.
*	.	.
*	.	.
*	.	.
*
	PART
USPR	SUB			RETURN SYSTEM PARAMETERS
	.CUIF
	LDI	-1
	TADI	UPCSV		GET ADDRESS OF BUFFER
	DCA	XR
	JMS	SETDF
	.CUDF
	TAD	UJOB		GET THE JOB NUMBER
	DCAI	XR		SEND IT
	AIF	NO:SPOOL,.SPOOL
	TAD	SPLQCTR		GET THE NUMBER OF ENTRIES ON THE SPOOLER QUEUE
.SPOOL	DCAI	XR		SEND IT
	CDF	%*
	TAD	=JOB1+LWAIT	SET BITS INDICATING LOGGED-ON TASK NUMBERS
	DCA	UPNTR1
	LDI	-JOBS
	DCA	UCNTR
	LDI	02000
	DCA	UTEMP2
	DCA	UTEMP
1H	TADI	UPNTR1		GET A WAIT WORD
	SPA CLA			IS THIS JOB ACTIVE ?
	JMP	2F		NO
	TAD	UTEMP2		YES, GET THE CORRESPONDING BIT
	TAD	UTEMP
	DCA	UTEMP
2H	TAD	UTEMP2		MOVE THE BIT TO NEXT TASK
	CLL RAR
	DCA	UTEMP2
	TAD	UPNTR1		UPDATE POINTER TO NEXT TASK WAIT WORD
	TAD	=USER:ST
	DCA	UPNTR1
	ISZ	UCNTR		CHECKED ALL JOBS ?
	JMP	1B		NO
	.CUDF
	TAD	UTEMP		GET THE ACTIVE JOB BITS WORD
	DCAI	XR		SEND IT
	CDF	%*
	LDI	-JOBS		SET BITS INDICATING TASKS WHICH ARE
	DCA	UCNTR			OUTPUTTING TO THEIR OWN TERMINALS
	TAD	=JOB1+MF	POINT TO MOTION FLAG
	DCA	UPNTR1
	LDI	02000
	DCA	UTEMP2
	DCA	UTEMP
3H	TADI	UPNTR1		GET A MOTION FLAG
	SNA CLA			IS THE TERMINAL RECEIVING OUTPUT ?
	JMP	4F		NO
	TAD	UTEMP2		YES, SET ITS CORRESPONDING BIT
	TAD	UTEMP
	DCA	UTEMP
4H	TAD	UTEMP2		MOVE THE TASK BIT
	CLL RAR
	DCA	UTEMP2
	TAD	UPNTR1		UPDATE POINTER TO NEXT TASK MOTION FLAG
	TAD	=USER:ST
	DCA	UPNTR1
	ISZ	UCNTR		CHECKED ALL TASKS ?
	JMP	3B		NO
	.CUDF
	TAD	UTEMP		YES, GET THE SET BITS WORD
	DCAI	XR		SEND IT
	TAD	=FIELD2-1
	DCA	XR1
	TAD	=-6
	DCA	UCNTR
	DCA	UTEMP
	CDF	%FIELD2
2H	TADI	XR1		CHECK THE AVAILABLE MEMORY
	SNA CLA			IS THIS FIELD AVAILABLE ?
	INC	UTEMP		YES, COUNT IT
	ISZ	UCNTR		CHECKED ALL MEMORY FIELDS ?
	JMP	2B		NO
	.CUDF
	TAD	UTEMP		GET THE AVAILABLE FIELD COUNT
	CLL RAL			ROTATE TO BITS 6-8
	RTL
	TAD	MEMORY		Add terminal and memory size information
	DCAI	XR		SEND IT

	CDF	%*		RESET THE DATA FIELD
	TAD	=JOB1+DWAIT
	.CUDF			SET TO USER DATA FIELD
	DCAI	XR		SEND THE INFORMATION
	CDF	%*
	TAD	=JOB1+PC	SEND THE CURRENT PC LOCATION
	.CUDF
	DCAI	XR		SEND IT

	CDF	%*		RESET THE DATA FIELD
	TAD	=JOB2+DWAIT
	.CUDF			SET TO USER DATA FIELD
	DCAI	XR		SEND THE INFORMATION
	CDF	%*
	TAD	=JOB2+PC	SEND THE CURRENT PC LOCATION
	.CUDF
	DCAI	XR		SEND IT

	AIF	TERMS.LT.3,.OKX

	CDF	%*		RESET THE DATA FIELD
	TAD	=JOB3+DWAIT
	.CUDF			SET TO USER DATA FIELD
	DCAI	XR		SEND THE INFORMATION
	CDF	%*
	TAD	=JOB3+PC	SEND THE CURRENT PC LOCATION
	.CUDF
	DCAI	XR		SEND IT

	AIF	TERMS.LT.4,.OKX

	CDF	%*
	TAD	=JOB4+DWAIT
	.CUDF
	DCAI	XR
	CDF	%*
	TAD	=JOB4+PC
	.CUDF
	DCAI	XR

	AIF	TERMS.LT.5,.OKX

	CDF	%*
	TAD	=JOB5+DWAIT
	.CUDF
	DCAI	XR
	CDF	%*
	TAD	=JOB5+PC
	.CUDF
	DCAI	XR

	AIF	TERMS.LT.6,.OKX

	CDF	%*
	TAD	=JOB6+DWAIT
	.CUDF
	DCAI	XR
	CDF	%*
	TAD	=JOB6+PC
	.CUDF
	DCAI	XR

.OKX	ANOP
	AIF	NO:SPOOL,.OKY

	CDF	%*
	TAD	=JOBSPL+DWAIT
	.CUDF
	DCAI	XR
	CDF	%*
	TAD	=JOBSPL+PC
	.CUDF
	DCAI	XR

.OKY	ANOP

	TAD	=FIELD2-1
	DCA	XR1
	TAD	=-6
	DCA	UCNTR
	DCA	UTEMP
3H	CDF	%FIELD2
	TADI	XR1		CHECK THE AVAILABLE MEMORY
	.CUDF
	DCAI	XR
	ISZ	UCNTR
	JMP	3B
	ISZ	UPCSV		BUMP USER PC
	RET	USPR
	RET	USPR		SAFETY
	TITLE	IOT SIMULATION FOR 'CDF X'
*
*	'CDF' SIMULATION - IOT 62X1
*
	PART
UCDF	SUB			CHANGE TO DATA FIELD X
	TAD	=077		SET MASK FOR QFINDF
	MQL
	TAD	UINST		GET THE USER INSTRUCTION
	AND	=070		EXTRACT DESIRED 'DF'
	TAD	UJOB
	.FINDF			FIND THE FIELD
	SNA			IS IT RESIDENT ?
	JMP	UCDFNR		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT PHYSICCAL 'DF'
	TAD	=FIELD0		COMPUTE ADDRESS OF FIELD INFO WORD
	DCA	UPNTR1
	CDF	%FIELD2
	LDI	-(DF+1)
	ANDI	UPNTR1		CLEAR OLD 'DF' RESIDENCY BIT
	DCAI	UPNTR1
	LDI	DF
	TADI	UFPNTR		SET NEW 'DF' RESIDENCY BIT
	DCAI	UFPNTR
	TAD	UFPNTR
	TAD	=-FIELD0	COMPUTE THE PHYSICAL FIELD
	MQL
	TAD	UFLSV		GET USER FLAGS
	AND	=07770		DELETE OLD PHYSICAL 'DF'
	MQA			BRING UP NEW PHYSICAL 'DF'
	DCA	UFLSV		NEW USER FLAGS
	RET	UCDF
*
*	COME HERE IF DESIRED FIELD IS NON-RESIDENT.  IF MEMORY IS
*	AVAILABLE, SWAP IN THE NEW FIELD.  IF NO MEMORY IS AVAILABLE,
*	GO TO UCDFNR2.
*
	PART
UCDFNR	.FINDM			COME HERE IF FIELD IS NON-RESIDENT
	SNA			IS ANY MEMORY AVAILABLE ?
	JMP	UCDFNR2		NO
	DCA	UFPNTR		SAVE ADDRESS OF NEW FIELD INFO WORD
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT OLD RELATIVE USER DF
	TAD	=FIELD0
	DCA	UFPNTR2		POINT TO OLD DF FIELD INFO WORD
	CDF	%FIELD2
	LDI	-(DF+1)
	ANDI	UFPNTR2		CLEAR DF RESIDENCY BIT
	DCAI	UFPNTR2
	TAD	UINST		GET THE USER INSTRUCTION
	AND	=DF+070		EXTRACT NEW RELATIVE USER DF +
	TAD	UJOB			'DF' RESIDENCY BIT
	DCAI	UFPNTR		STORE THE NEW FIELD INFO WORD
	.SWAPF			SWAP IN THE NEW FIELD
	TAD	UFPNTR		COMPUTE PHYSICAL FIELD
	TAD	=-FIELD0
	MQL
	TAD	UFLSV		GET USER FLAGS
	AND	=07770		MASK OUT OLD PHYSICAL DF
	MQA			BRING UP NEW PHYSICAL DF
	DCA	UFLSV		NEW USER FLAGS
	JMP	UCDFNR4
*
*	IF SUFFICIENT TIME TO SWAP IN NEW FIELD IS NOT AVAILABLE, THEN
*	JUST SUSPEND THE CURRENT JOB.  IF SUFFICIENT TIME IS AVAILABLE,
*	THEN SWAP OUT AN UNUSED FIELD (ONE WITH 'IF', 'DF' AND 'LOCK'
*	BITS CLEARED).  IF MEMORY IS NOW AVAILABLE, SWAP IN THE DESIRED
*	FIELD.  OTHERWISE, COMPARE USER'S 'IF' AND 'DF'.  IF THEY ARE
*	DIFFERENT, SWAP OUT THE USER'S 'DF' AND SWAP IN THE DESIRED
*	'DF'.  IF THEY ARE THE SAME, JUST SWAP OUT THE CURRENT JOB.
*
	PART
UCDFNR2	TAD	=QUANTUM/2
	CDF	%JTIME
	TADI	=JTIME
	SMA SZA CLA		IS THERE TIME TO SWAP IN DESIRED FIELD ?
	JMP	UCDFNR5		NO, JUST SUSPEND THE CURRENT JOB
	TAD	=-6
	DCA	UCNTR
	TAD	RSFIELD		GET FIELD INFO WORD ADDRESS OF MOST RECENTLY
	SNA				SWAPPED FIELD -- DOES ONE EXIST ?
	TAD	=FIELD1		NO, JUST START WITH FIELD 2
	IAC
	DCA	UFPNTR
1H	TAD	UFPNTR
	TAD	=-(FIELD2+6)
	SZA CLA			IS THIS THE TOP FIELD'S INFO WORD ?
	JMP	2F		NO
	TAD	=FIELD2		YES, START OVER AT FIELD 2
	DCA	UFPNTR
2H	TAD	UFPNTR
	CIA
	TAD	RSFIELD
	SNA CLA			IS THIS THE MOST RECENTLY SWAPPED FIELD ?
	JMP	3F		YES, LEAVE IT ALONE
	TADI	UFPNTR		NO, GET THE FIELD INFO WORD AGAIN
	AND	=IF+DF+LOCK+N:EXIST
	SNA CLA			IS IT SWAPPABLE ?
	JMP	UCDFNR3		NO, IT CAN BE SWAPPED OUT
3H	INC	UFPNTR		BUMP THE FIELD INFO WORD POINTER
	ISZ	UCNTR		LOOKED AT ALL FIELD INFO WORDS YET ?
	JMP	1B		NO
	DCA	RSFIELD		CLEAR RECENTLY SWAPPED FIELD FLAG
	TAD	UFLSV		GET THE USER FLAGS
	AND	=07		EXTRACT USER PHYSICAL 'DF'
	TAD	=FIELD0		COMPUTE FIELD INFO WORD
	DCA	UFPNTR
	TADI	UFPNTR		GET THE FIELD INFO WORD
	SMA CLA			IS IT ALSO THE USER 'IF' ?
	JMP	UCDFNR3		NO, SWAP IT OUT
	.SWAPJ			SWAP OUT ALL OTHER JOBS
	JMP	UCDFNR			AND TRY AGAIN
	LDI	-1		NO SWAP OCCURRED--BACK UP PC AND SUSPEND
	TAD	UPCSV
	DCA	UPCSV
	LDI	NRESW		SET NON-RESIDENT WAIT
	MQL
	TAD	PEND:CIF
	SNA CLA			IS A 'CIF' PENDING ?
	.SUSPEND		NO
	LDI	NRESW		YES, SET NON-RESIDENT WAIT
	RET	UCDF
	PART
UCDFNR3	TAD	UFLSV		GET THE USER FLAGS
	AND	=07		EXTRACT PHYSICAL DATA FIELD
	TAD	=FIELD0
	DCA	UFPNTR2
	LDI	-(DF+1)
	ANDI	UFPNTR2		REMOVE 'DF' RESIDENCY BIT
	DCAI	UFPNTR2
	LDI	04000		AT LAST, A FIELD CAN BE SWAPPED OUT !
	.SWAPF
	CDF	%FIELD2
	TAD	UINST		GET THE USER INSTRUCTION
	AND	=DF+070		EXTRACT DESIRED FIELD
	TAD	UJOB			PLUS 'DF' RESIDENCY BIT
	DCAI	UFPNTR
	.SWAPF			GET THE NEW DF
	TAD	UFPNTR		COMPUTE THE PHYSICAL FIELD
	TAD	=-FIELD0
	MQL
	TAD	UFLSV		GET USER FLAGS
	AND	=07770		REMOVE OLD PHYSICAL 'DF'
	MQA			BRING UP NEW PHYSICAL 'DF'
	DCA	UFLSV		NEW USER FLAGS
	TAD	UFPNTR		SET 'RECENTLY SWAPPED FIELD' FLAG
	DCA	RSFIELD
UCDFNR4	CAM			CLEAR ALL WAIT BITS
	TAD	PEND:CIF
	SNA CLA			IS A 'CIF' PENDING ?
	.SUSPEND		NO
	LDI	-1		YES, BACK UP USER PC SO 'CIF' WILL BE
	TAD	UPCSV			CAUGHT AT NEXT TIME QUANTUM
	DCA	UPCSV
	JMP	UCDFNR6		YES
*
UCDFNR5	CAM			CLEAR ALL WAIT BITS
	LDI	-1		BACK UP THE USER PC
	TAD	UPCSV
	DCA	UPCSV
	TAD	PEND:CIF
	SNA CLA			IS A 'CIF' PENDING ?
	.SUSPEND		NO
UCDFNR6	TAD	=EXECW		YES, RETURN WITH A WAIT BIT SET
	RET	UCDF
	TITLE	IOT SIMULATION FOR 'CIF X'
*
*	'CIF' SIMULATION - IOT 62X2
*
	PART
UCIF	SUB			CHANGE TO INSTRUCTION FIELD X
UCIF2	TAD	UINST
	AND	=072		EXTRACT DESIRED 'IF' & USE BIT 10 AS FLAG
	DCA	PEND:CIF	SAVE THE NEW FIELD
	LDI	1
	AND	UINST
	SZA CLA			IS THIS A 'CID' INSTRUCTION ?
	JMS	UCDF		YES, EXECUTE THE 'CDF' FIRST
	MQL			STORE RETURN AC IN MQ
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT USER PHYSICAL 'IF'
	CLL RAR
	RTR
	TAD	=FIELD0
	DCA	UFPNTR
	CDF	%FIELD2
	TADI	UFPNTR		GET FIELD INFO WORD
	AND	=070		EXTRACT USER RELATIVE 'IF'
	CIA
	TAD	UINST		COMPARE WITH 'CIF' JUST ISSUED
	AND	=070		LOOK ONLY AT FIELD BITS
	SZA CLA			A 'CIF' TO THE SAME FIELD ?
	JMP	1F		NO
	SWP			YES, GET THE 'CDF' RETURN AC, CLEAR MQ
	SZA CLA			WAS A FIELD SWAP INITIATED ?
	.SUSPEND		YES, JUST SUSPEND; PC IS OK
	RET	UCIF		NO, AVOID INSTRUCTION SIMULATION
*
1H	JMS	SETDF
	MQA			RETURN AC FROM 'CDF' SIMULATION
*
*	THIS IS THE MAIN SIMULATION LOOP
*
	PART
X:INST	ION			SERVICE ANY PENDING INTERRUPTS
	ROOM	2
	SZA			WAS A FIELD TRANSFER INITIATED ?
	JMP	1F		YES
	CDF	%JTIME
	TADI	=JTIME		GET THE JOB TIME
	SPA CLA			HAS THE TIME QUANTUM EXPIRED ?
	JMP	X:INST2		NO
1H	JMS	UJMS,X:INST,UCUIF,UCUDF,PEND:CIF,0
*
	PART
X:INST2	.CUIF			'DF' TO USER 'IF'
	TADI	UPCSV		GET NEXT INSTRUCTION
	DCA	UINST		SAVE IT
	ISZ	UPCSV		BUMP USER PC
	NOP			SAFETY
	TAD	UINST
	SMA			IS IT A MEMORY REFERENCE INSTRUCTION ?
	JMP	X:MRI		YES
	CLL RTL
	SNL			IS IT A 'JMS' OR 'JMP' ?
	JMP	X:JMS:JMP	YES
	CDF	%*
	SPA CLA			IS IT AN IOT ?
	JMP	X:OPR		NO, AN OPERATE INSTRUCTION
*
*	SIMULATE AN IOT INSTRUCTION
*
	PART
X:IOT	TAD	UINST		GET THE IOT
	AND	=07706
	TAD	=-KCIF
	SNA CLA			ANOTHER 'CIF' INSTRUCTION ?
	JMP	UCIF2		YES, MUST CHANGE 'PEND:CIF'
	TAD	UINST		GET THE USER INSTRUCTION
	AND	=07707
	TAD	=-KCDF
	SZA CLA			IS IT A 'CDF' INSTRUCTION ?
	JMP	1F		NO
	JMS	UCDF		EXECUTE IT
	MQL			SAVE AC STATUS
	JMS	SETDF		SET UCUDF
	MQA			GET UCDF AC STATUS
	JMP	X:INST		NO, GET NEXT USER INSTRUCTION
*
1H	TAD	=IOT1-1		POINT TO IOT LIST TABLE
	DCA	XR
	TAD	UINST		GET THE USER INSTRUCTION
	CIA
	DCA	IOTBAD		PUT ITS NEGATIVE IN THE IOT LIST TABLE
2H	TADI	XR		GET AN IOT TABLE ENTRY
	TAD	UINST		COMPARE WITH USER INSTRUCTION
	SZA CLA			A MATCH ?
	JMP	2B		NO, TRY NEXT ENTRY
	TAD	XR		YES, GET THE IOT1 TABLE ADDRESS
	TAD	=IOT2-IOT1	COMPUTE ITS IOT2 TABLE ENTRY
	DCA	UPNTR1
	TADI	UPNTR1		GET ITS SERVICE SUBROUTINE ADDRESS
	DCA	UPNTR1
	JMSI	UPNTR1		EXECUTE IT
	JMP	X:INST		GET NEXT INSTRUCTION
*
*	SIMULATE AN OPERATE INSTRUCTION
*
	PART
X:OPR	TAD	UINST		SIMULATE AN OPERATE INSTRUCTION
	AND	=0401		LOOK AT BITS 3 AND 11
	CLL RAR			BIT 11 TO LINK
	SZA			A GROUP I OPERATE MICROINSTRUCTION ?
	JMP	1F		NO
X:OPR1	TAD	UINST		YES, GET THE INSTRUCTION
	JMS	EM:INST		SIMULATE THE INSTRUCTION
	JMP	X:INST		GET NEXT INSTRUCTION
*
1H	SZL CLA			A GROUP II OPERATE MICROINSTRUCTION ?
	JMP	X:OPR3		NO, A GROUP III
X:OPR2	JMS	OPCODE72	SIMULATE THE INSTRUCTION
	JMP	X:INST		GET NEXT INSTRUCTION
*
X:OPR3	TAD	UINST		GET THE USER INSTRUCTION AGAIN
	AND	=056		EXTRACT 'STRICTLY EAE' BITS
	SZA CLA			IS THIS A 'STRICTLY EAE' INSTRUCTION ?
	JMP	2F		YES, IT CANNOT BE HANDLED PROPERLY
	TAD	UMQSV		GET USER MQ
	MQL
	TAD	UINST		GET THE INSTRUCTION
	DCA	*+2		PUT IT IN CODING LINE
	TAD	UACSV		GET USER AC
	HLT			EXECUTE THE INSTRUCTION
	DCA	UACSV		SAVE RESULTING AC
	MQA
	DCA	UMQSV			AND MQ
	JMP	X:INST		GET NEXT INSTRUCTION
*
2H	LDI	HALTW+NRESW	NO EAE INSTRUCTIONS ALLOWED
	DCA	WAITS		SEND ERROR MESSAGE AND HALT JOB
	TAD	=OP7EAE		'EAE INST BETWEEN CIF & JMS OR JMP'
	JMP	MESOUT
*
*	SIMULATE A MEMORY REFERENCE INSTRUCTION
*
	PART
X:MRI	AND	=07000		EXTRACT ONLY OP CODE
	TAD	=0400+UPNTR2	FORM AN INDIRECT REFERENCE
	MQL
	JMS	GET:ADR		GET THE EFFECTIVE ADDRESS
	TAD	UINST		GET THE SIMULATED INSTRUCTION
	AND	=0400		EXTRACT INDIRECT BIT
	SZA CLA			AN INDIRECT REFERENCE ?
	.CUDF			'DF' TO USER 'DF'
	MQA			GET THE INSTRUCTION
	JMS	EM:INST		PERFORM THE SIMULATION
	JMP	X:INST		GET NEXT INSTRUCTION
*
*	SIMULATE A 'JMS' OR 'JMP' INSTRUCTION
*
	PART
X:JMS:JMP SMA CLA		A 'JMS' OR 'JMP' INSTRUCTION ?
	LDI	-1		A 'JMS' -- SET THE 'JMS' FLAG
	DCA	JMSFLAG
	JMS	GET:ADR		GET ACTUAL JUMP ADDRESS
	TAD	=077		MASK FOR FIELD SEARCH
	MQL
	LDI	-2		REMOVE THE NON-ZERO FLAG
	TAD	PEND:CIF		FROM PEND:CIF
	TAD	UJOB
	.FINDF
	SNA			IS THE NEW FIELD RESIDENT ?
	JMP	X:JNRES		NO
	DCA	UFPNTR		YES, SAVE ADDRESS OF FIELD INFO WORD
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT CURRENT PHYSICAL 'IF'
	CLL RAR
	RTR
	TAD	=FIELD0		COMPUTE ADDRESS OF FIELD INFO WORD
	DCA	UFPNTR2
	CDF	%FIELD2
	LDI	-(IF+1)
	ANDI	UFPNTR2		CLEAR OLD 'IF' FLAG
	DCAI	UFPNTR2
	LDI	IF
	TADI	UFPNTR		SET NEW 'IF' FLAG
	DCAI	UFPNTR
	TAD	UFPNTR		COMPUTE NEW PHYSICAL FIELD
	TAD	=-FIELD0
	CLL RAL
	RTL
	MQL			SAVE IN THE MQ
	TAD	UFLSV		GET USER FLAGS
	AND	=07707		SAVE ALL EXCEPT OLD 'IF'
	MQA			BRING UP NEW PHYSICAL 'IF'
	DCA	UFLSV		NEW USER FLAGS
	ISZ	JMSFLAG		IS THIS A 'JMS' OR 'JMP' INSTRUCTION ?
	JMP	X:JUMP		A 'JMP'
	MQA			GET NEW PHYSICAL FIELD
	TAD	=KCDF		FORM A 'CDF' TO IT
	ROOM	3
	DCA	1F
	ERM
1H	HLT
	TAD	UPCSV		GET RETURN PC
	DCAI	UPNTR2		RETURN PC SAVED IN SUBROUTINE FIRST ADDR
	LDI	1		NEW PC IS OLD PC +1
X:JUMP	TAD	UPNTR2		NEW PC
	DCA	UPCSV
	RET	UCIF
*
*	DESIRED NEW 'IF' IS NON-RESIDENT
*		THIS ROUTINE IS ENTERED ONLY AS A RESULT OF A
*		NON-RESIDENT INSTRUCTION FIELD.  IF A 'CID' HAD
*		BEEN ISSUED, THE DATA FIELD WOULD ALREADY HAVE BEEN
*		LOADED.  SO JUST SET THE USER FLAGS TO THE NEW
*		RELATIVE 'IF' AND THE OLD RELATIVE 'DF' AND SWAP
*		OUT THE JOB TO DISK.
*
	PART
X:JNRES	TAD	JMSFLAG
	SMA CLA			A 'JMS' OR 'JMP' INSTRUCTION ?
	JMP	1F		A 'JMP'
	.PARAM	JMSPC
	TAD	UPCSV		SAVE THE RETURN PC
	DCAI	UPNTR1
1H	TAD	UPNTR2		GET THE NEW PC
	DCA	UPCSV
	.FINDM
	CDF	%FIELD2
	SNA			ANY MEMORY AVAILABLE ?
	JMP	X:JSWAP		NO, JUST SWAP OUT THE CURRENT JOB
	DCA	UFPNTR		YES, SAVE THE FIELD INFO WORD ADDRESS
	TAD	UFPNTR		COMPUTE ITS PHYSICAL FIELD NUMBER
	TAD	=-FIELD0
	CLL RAL
	RTL
	MQL
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT CURRENT PHYSICAL 'IF'
	CLL RAR
	RTR
	TAD	=FIELD0
	DCA	UFPNTR2		POINT TO ITS FIELD INFO WORD
	LDI	-(IF+1)
	ANDI	UFPNTR2		REMOVE 'IF' RESIDENCY BIT
	DCAI	UFPNTR2
	TAD	UFLSV		SET THE USER FLAGS
	AND	=07707		REMOVE OLD 'IF'
	MQA			BRING UP NEW 'IF'
	DCA	UFLSV
	TAD	=IF-2		SET UP THE FIELD INFO WORD
	TAD	PEND:CIF	GET THE RELATIVE FIELD NUMBER
	TAD	UJOB		INDICATE OWNERSHIP
	DCAI	UFPNTR
	.SWAPF			SWAP IN THE NEW FIELD
	MQL			CLEAR LOGIC WAIT BITS
	ISZ	JMSFLAG		A 'JMS' INSTRUCTION ?
	.SUSPEND		NO
	TAD	=JMSW		YES, SET THE 'JMS' WAIT BIT
	MQL
	.SUSPEND
*
	PART
X:JSWAP	LDI	-2		REMOVE THE PENDING 'CIF' FLAG BIT
	TAD	PEND:CIF	GET THE NEW USER RELATIVE 'IF'
	MQL
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT PHYSICAL 'DF'
	TAD	=FIELD0
	DCA	UFPNTR
	TADI	UFPNTR
	AND	=070		EXTRACT USER RELATIVE 'DF'
	CLL RAR
	RTR
	MQA
	TAD	=RELBIT		SET RELATIVE BIT SO SCHEDULER WON'T
	MQL				SET THE RELATIVE FLAGS
	TAD	UFLSV		GET USER PHYSICAL FLAGS
	AND	=07700		REMOVE 'IF' AND 'DF' INFO
	MQA			BRING UP RELATIVE 'IF' AND 'DF' BITS
	DCA	UFLSV
	TAD	=-6		THROW OUT ALL UNUSED FIELDS
	DCA	UCNTR
	TAD	=FIELD2
	DCA	UFPNTR
1H	TADI	UFPNTR		GET A FIELD INFO WORD
	SNA			IS THIS FIELD IN USE ?
	JMP	2F		NO
	AND	=IF+DF+LOCK+N:EXIST
	SZA CLA			IS IT NON-SWAPPABLE ?
	JMP	2F		YES
	LDI	04000		NO, SWAP IT OUT
	.SWAPF
	CDF	%FIELD2
	DCAI	UFPNTR		RELEASE MEMORY
2H	INC	UFPNTR		BUMP FIELD INFO WORD POINTER
	ISZ	UCNTR		CHECKED ALL FIELD INFO WORDS YET ?
	JMP	1B		NO
	LDI	NRESW		THIS JOB WILL BE SWAPPED OUT
	ISZ	JMSFLAG		'JMS' OR 'JMP' INSTRUCTION ?
	JMP	3F		A 'JMP'
	TAD	=JMSW		SET 'JMS' WAIT BIT
3H	MQL
	.SUSPEND
*
*	GET EFFECTIVE ADDRESS FOR X:MRI OR X:JMS:JMP
*	ENTER WITH 'DF' SET TO USER 'IF'
*	EXITING 'DF' = ENTERING 'DF'
*
	PART
GET:ADR	SUB
	TAD	UINST		GET USER INSTRUCTION
	AND	=0177		EXTRACT RELATIVE PAGE BITS
	DCA	UPNTR2
	TAD	UINST		GET USER INSTRUCTION
	AND	=0200		EXTRACT PAGE BIT
	CIA			AC = 0000 (PAGE ZERO) OR 7600 (ANY OTHER PAGE)
	AND	UPCSV		PICK UP ABSOLUTE PAGE BITS
	TAD	UPNTR2		ADD IN RELATIVE PAGE BITS
	DCA	UPNTR2
	TAD	UINST		GET USER INSTRUCTION
	AND	=0400		EXTRACT INDIRECT BIT
	SNA CLA			AN INDIRECTLY REFERENCED INSTRUCTION ?
	RET	GET:ADR		NO
	TAD	UPNTR2		YES, CHECK FOR AUTO-INDEX
	AND	=07770
	TAD	=-010
	SZA CLA			AN AUTO-INDEXED INDIRECT REFERENCE ?
	JMP	1F		NO
	ISZI	UPNTR2		YES, BUMP THE USER AUTO-INDEX
	NOP			SAFETY
1H	TADI	UPNTR2		GET THE ABSOLUTE MEMORY ADDRESS
	DCA	UPNTR2
	RET	GET:ADR
*
*	THIS SUBROUTINE SIMULATES THE USER INSTRUCTION
*
	PART
EM:INST	SUB			SIMULATE A PDP-8 INSTRUCTION
	ROOM	7
	DCA	INST		PUT THE INSTRUCTION IN CODING LINE
	TAD	UFLSV		GET USER FLAGS
	CLL RAL			USER LINK TO MACHINE LINK
	MQL			STORE USER FLAGS IN MQ
	TAD	UACSV		GET USER AC
	ERM
INST	HLT			USER INSTRUCTION GOES HERE
	JMP	1F		NO SKIP
	ISZ	UPCSV		A SKIP OCCURRED
	NOP			SAFETY
1H	DCA	UACSV		NEW USER AC
	MQA			GET USER FLAGS
	RAR
	DCA	UFLSV		NEW USER FLAGS
	RET	EM:INST
	TITLE	IOT SIMULATIONS FOR 'RDF' AND 'RIF'
*
*	'RDF' SIMULATION - IOT 6214
*
	PART
URDF	SUB
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT PHYSICAL FIELD NUMBER
	TAD	=FIELD0		FORM POINTER TO FIELD INFO WORD
	DCA	UFPNTR
	CDF	%FIELD2
	TADI	UFPNTR		GET THE FIELD INFO WORD
	AND	=070		EXTRACT USER FIELD NUMBER
	MQL
	TAD	UACSV		GET USER AC
	MQA			OR IN USER 'DF'
	DCA	UACSV		NEW USER AC
	RET	URDF
*
*	'RIF' SIMULATION - IOT 6224
*
URIF	SUB
	TAD	UFLSV		GET USER FLAGS
	AND	=070		EXTRACT PHYSICAL 'IF'
	CLL RAR
	RTR
	TAD	=FIELD0		FORM POINTER TO FIELD INFO WORD
	DCA	UFPNTR
	CDF	%FIELD2
	TADI	UFPNTR		GET THE FIELD INFO WORD
	AND	=070		EXTRACT USER 'IF'
	MQL
	TAD	UACSV		GET USER AC
	MQA			OR IN USER 'IF'
	DCA	UACSV		NEW USER AC
	RET	URIF
	TITLE	IOT SIMULATION FOR 'CUF'
*
*	'CUF' SIMULATION - IOT 6264
*	THIS IOT WILL WORK ONLY FOR PROGRAMS WHICH ARE
*	EXECUTIVE TASKS (WITH JOB NUMBERS HIGHER THAN 'TERMS').
*
UCUF	SUB			CLEAR USER MODE
	LDI	-TERMS
	TAD	UJOB
	SPA SNA CLA		IS THIS AN EXECUTIVE JOB ?
	RET	UCUF		NO, TREAT IT AS A 'NOP'
	TAD	UFLSV		YES, CLEAR THE USER MODE BIT
	AND	=07677
	DCA	UFLSV
	RET	UCUF
	TITLE	IOT SIMULATIONS FOR LINE PRINTER
*
	AIF	NO:SPOOL,.NO:SPOOL
*
*	'SPOOL' SIMULATION - IOT 6660
*	THE CALLING SEQUENCE IS:
*		TAD	=PRINT		'PRINT' IS IN USER DATA FIELD
*		DI	06660
*		JMP	NO:SPOOL	SPOOL REQUEST REJECTED --
*					AC CONTAINS ERROR CODE:
*					1 = SPOOL QUEUE FULL
*					2 = DEVICE ZERO SELECTED
*					    PRINTER QUEUE RETURNED TO USER
*		(NORMAL RETURN)		AC CLEARED
*		...
*	PRINT	(CONTROL WORD)		BIT(S)	MEANING
*					0	0=QUEUE; 1=DE-QUEUE
*					1 - 6	UNUSED
*					7	FOLD LOWER CASE TO UPPER CASE
*					8 - 11	DEVICE NUMBER
*		TEXT	\PRINT1LS\	FILE NAME (8 STRIPPED ASCII CHARACTERS)
*
*
	PART
USPOOL	SUB			SPOOL A PRINT FILE
	LDI	-1		GET THE ARGUMENT ADDRESS
	TAD	UACSV
	DCA	XR
	DCA	UACSV		CLEAR USER AC
	JMS	SETDF
	.CUDF			ARGUMENTS ARE IN USER DATA FIELD
	LDI	04000
	TADI	XR		QUEUE/DE-QUEUE BIT TO LINK
	AND	=017		EXTRACT THE DEVICE NUMBER
	SNA			WAS A DEVICE SPECIFIED ?
	JMP	USPLE2		NO, ERROR # 2
	SNL			QUEUE OR DE-QUEUE REQUEST ?
	JMP	ENSPOOL		A QUEUE REQUEST
DESPOOL	MULT64			A DE-QUEUE REQUEST -- PUT DEV # IN LEFT BYTE
	TAD	UJOB		ADD THE JOB NUMBER
	CIA
	DCA	UACSV
	TADI	XR		GET THE FIRST TWO CHARACTERS OF FILE NAME
	CIA
	DCA	UPNTR1
	TADI	XR		NEXT 2
	CIA
	DCA	UPNTR2
	TADI	XR		NEXT 2
	CIA
	DCA	UPNTR3
	TADI	XR		LAST 2
	CIA
	DCA	UTEMP2
	TAD	SPLQE		SET INDEX TO THE END POINTER
	DCA	XR
	TAD	XR		CHECK THE POSITION OF THE POINTER
	TAD	=-(SPLQ+(32*5)+1)
	SPA CLA			IF ZERO RESET POINTER
	JMP	5F		CONTINUE
	TAD	=(SPLQ-1)	RESET THE POINTER
	DCA	XR
5H	TAD	=-32
	DCA	UCNTR
	CDF	%SPLQ
	IOF			TOUCHY CODE HERE
	TAD	SPLJOB		GET THE SPOOL BUSY FLAG
	SNA CLA			IS IT BUSY ?
	JMP	1F		NO
	TAD	=077		SET SEARCH MASK
	MQL
	LDI	TERMS+1
	.FINDF			FIND THE SPOOLER FIELD
	SNA			Is the spooler resident ?
	JMP	1F		No, just check the spooler queue
	TAD	=-FIELD0	COMPUTE ITS PHYSICAL FIELD
	CLL RAL
	RTL
	TAD	=KCDF		FORM A 'CDF' TO IT
	DCA	UCUDF
	.CUDF
	TAD	SPLJOB		GET THE SPOOL BUSY FLAG
	SPA			IF POSITIVE THE FILE HAS NOT BEEN KILLED
	JMP	1F		GO ON AND CHECK THE QUE....THIS JOB KILLED !
	AND	=01717		REMOVE 'FOLD' OPTION BIT
	TAD	UACSV		COMPARE WITH USER AC
	SZA CLA			IS THE SPOOLER OUTPUTTING THIS USER'S FILE ?
	JMP	1F		NO
	TAD	=ZFILE-1	YES, POINT TO THE FILE NAME
	DCA	XR1
	TADI	XR1		GET THE FILE NAME
	TAD	UPNTR1
	SZA CLA			A MATCH ?
	JMP	1F		NO
	TADI	XR1		NEXT 2
	TAD	UPNTR2
	SZA CLA			A MATCH ?
	JMP	1F		NO
	TADI	XR1		NEXT 2
	TAD	UPNTR3
	SZA CLA			A MATCH ?
	JMP	1F		NO
	TADI	XR1		NEXT 2
	TAD	UTEMP2
	SZA CLA			A MATCH ?
	JMP	1F		NO
	LDI	04000		YES, SET THE ABORT FLAG
	TAD	SPLJOB
	DCA	SPLJOB
	JMP	2F
*
1H	CDF 	%SPLQ		SET TO THE FIELD OF THE QUEUE
	TADI	XR		GET A QUEUE ENTRY
	SPA			CONTINUE CHECKING UNLESS ALREADY KILLED
	JMP	3F		GET THE NEXT ENTRY
	AND	=01717		REMOVE 'FOLD' OPTION BIT
	TAD	UACSV
	SZA CLA			A MATCH ?
	JMP	3F		NO
	TADI	XR		YES, NOW COMPARE THE FILE NAMES
	TAD	UPNTR1
	SZA CLA			A MATCH ?
	JMP	4F		NO
	TADI	XR		YES, NEXT
	TAD	UPNTR2
	SZA CLA			A MATCH ?
	JMP	5F		NO
	TADI	XR		YES, NEXT
	TAD	UPNTR3
	SZA CLA			A MATCH ?
	JMP	6F		NO
	TADI	XR		YES, LAST
	TAD	UTEMP2
	SZA CLA			A MATCH ?
	JMP	7F		NO
	TAD	XR
	TAD	=-4
	DCA	UPNTR1		BACK UP TO FIRST WORD OF ENTRY
	TADI	UPNTR1		GET THE ENTRY
	CLL RAL
	STL RAR			SET THE ABORT FLAG
	DCAI	UPNTR1
	CDF	%*		RESET THE DATA FIELD
2H	ION			WE CAN BREATHE NOW !
	DCA	UACSV		CLEAR USER AC
	ISZ	UPCSV			AND BUMP USER PC
	RET	USPOOL
	RET	USPOOL		SAFETY
*
3H	INC	XR		BUMP THE QUEUE POINTER
4H	INC	XR
5H	INC	XR
6H	INC	XR
7H	TAD	XR		CHECK FOR THE END OF THE QUEUE
	TAD	=-(SPLQ+(32*5)-1)
	SPA CLA			IF ZERO  AT END ...RESET
	JMP	8F		CONTINUE
	TAD	=SPLQ-1		SET TO THE BEGINING OF THE QUEUE
	DCA	XR
8H	ISZ	UCNTR		CHECKED ALL QUEUE ENTRIES ?
	JMP	1B		NO
	JMP	2B		YES, FAKE A NORMAL RETURN
*
*	ORGINAL CODE WAS THE NEXT LINE
*USPLE2	INC	UACSV		DEVICE # 0 SPECIFIED
*
*	NEW CODE ADDED HERE TO RETURN TO THE USER THE LINE PRINTER QUEUE
*
USPLE2	CAL
	JMS	SETDF		SET THE DATA FIELD
	.CUIF
	LDI	-1		SET AC = -1
	TADI	UPCSV		GET THE AREA POINTED AT BY PC+1
	DCA	XR		SAVE IN AUTO INDEX REG
	CDF	%*		RESET THE DATA FIELD TO FIELD 0
	TADI	=SPLQCTR	GET THE SPOLL QUE ENTRY COUNTER
	SNA			MUST BE NON ZERO TO READ OUT
	JMP 	5F		ZERO SO EXIT THE QUE
	CIA			NEGATE FOR THE NO OF ENTRIES TO MOVE
	DCA	UTEMP
	CDF	%SPLQE		SET THE DATA FIELD TO THAT OF THE QUE
	TAD	=-5		MUST RESET THE START BY 5 LOCATIONS
	TADI	=SPLQE		GET THE POINTER TO THE START OF THE QUE
	DCA	XR6		SAVE IT IN REG 6
	TAD	XR6		CHECK THE STARTING POINT
	TAD	=-(SPLQ-1)	IS IT LESS THAN THE START ?
	SMA CLA			IF NEGITIVE THAN RESET
	JMP 1F
	TAD	=(SPLQ-1)
	DCA	XR6		RESET TO START OF QUE !
1H	TAD	XR6		CHECK TO SEE IF TOP EXCEEDED
	TAD	=-(SPLQ+(32*5)+1)
	SPA CLA
	JMP	9F
	TAD	=(SPLQ-1)
	DCA	XR6		RESET POINTER
9H	TAD	=-5
	DCA	UCNTR
	INC	XR6		BUMP AS WE ARE GOING AROUND
	TAD	SPLJOB		GET THE CURRENT STATUS OF THE JOB
	JMP 	6F
2H	TAD	=-5		SET AC = -5
	DCA	UCNTR
3H	CDF 	%SPLQ		SET THE DATA FIELD TO THAT OF THE QUE
	TADI	XR6
6H	.CUDF			SET THE USER DATA FIELD
	DCAI	XR		STASH IT
	CDF	%*		RESET THE DATA FIELD
	ISZ	UCNTR		MOVED ALL THE ENTRIES YET ?
	JMP	3B
*
*	NOW CHECK FOR ALL THE ENTRIES IN THE QUE
*
	ISZ	UTEMP		GOT ALL THE ENTRIES YET ?
	JMP	4F
	JMP	5F		EXIT
*
*	NOW CHECK IF THE END OF THE QUEUE HAS BEEN REACHED
*
4H	TAD	XR6
	TAD	=-(SPLQ+(32*5)+1)
	SPA CLA
	JMP	2B
	TAD	=(SPLQ-1)	RESET THE POINTER TO THE START
	TAD	XR6		GET THE CURRNT POINTER POSITION
	DCA	XR6
	JMP	2B
*
*	BUMP THE PC FOR A NORMAL RETURN
*
5H	ISZ	UPCSV		INCREMENT FOR A NORMAL RETURN
	RET	USPOOL
	RET	USPOOL		SAFETY
*
*	ERROR EXIT
*
USPLE1	INC	UACSV		SPOOL QUEUE IS FULL
	RET	USPOOL
*
*	ENQUEUE A SPOOL REQUEST
*
	PART
ENSPOOL	CAL
	TAD	XR
	DCA	UPNTR1
	TADI	UPNTR1		GET THE DEVICE WORD AGAIN
	AND	=037		EXTRACT FOLD FLAG AND DEVICE NUMBER
	MULT64			MOVE TO LEFT BYTE
	TAD	UJOB		UJOB NUMBER TO RIGHT BYTE
	DCA	UTEMP
	CDF	%SPLQ
	TAD	SPLQCTR		GET THE SPOOL QUEUE ENTRY COUNTER
	TAD	=-32
	SNA CLA			IS THE SPOOL QUEUE FULL ?
	JMP	USPLE1		YES, RETURN AN ERROR CODE IN AC
	TAD	SPLQF		GET THE SPOOL QUEUE FILL POINTER
	TAD	=-(SPLQ+(32*5))
	SPA CLA			TIME TO RESET THE POINTER ?
	JMP	2F		NO
	TAD	=SPLQ		YES, RESET TO BOTTOM OF BUFFER
	DCA	SPLQF
2H	IOF			TOUCHY CODE HERE
	INC	SPLQCTR		BUMP THE QUEUE COUNTER
	TAD	UTEMP		GET THE QUEUE ENTRY
	DCAI	SPLQF
	INC	SPLQF		BUMP THE POINTER
	TAD	=-4
	DCA	UCNTR
1H	.CUDF
	TADI	XR		GET 2 CHARACTERS OF FILE NAME
	CDF	%SPLQ
	DCAI	SPLQF
	INC	SPLQF		BUMP THE POINTER
	ISZ	UCNTR		FINISHED STORING FILE NAME ?
	JMP	1B		NO
	ISZ	UPCSV		BUMP USER PC TO INDICATE SPOOL ACCEPTED
	NOP			SAFETY
	TAD	SPLJOB		GET THE SPOOL BUSY FLAG
	SZA CLA			IS A SPOOL OPERATION IN PROGRESS ?
	RET	USPOOL		YES
	INC	SPLJOB		NO, BUMP BUSY FLAG TO PREVENT ANOTHER REQUEST
	CDF	%TABLES
	TAD	=JOBSPL-1	FROM SCHEDULING IT ALSO
	DCA	XR
	DCAI	XR		CLEAR ITS DEVICE WAIT BITS
	LDI	NRESW		MAKE IT NON-RESIDENT, BUT RUNNABLE
	DCAI	XR
	LDI	UM		CLEAR LINK, SET USER MODE, 'IF' = 'DF' = 0
	DCAI	XR
	DCAI	XR		SET STARTING ADDRESS = 0000
	RET	USPOOL
*
.NO:SPOOL ANOP
*
*	'LSF' SIMULATION - IOT 6661
*
	PART
ULSF	SUB			SKIP ON LINE PRINTER FLAG
	ROOM	4
	JMS	UTSF		JUST AN UNCONDITIONAL SKIP
	RET	ULSF
*
*	'LSE' SIMULATION - IOT 6663
*
	PART
ULSE	SUB			SKIP ON LINE PRINTER ERROR FLAG
	ROOM	4
	JMS	PRINTER:CK	IS PRINTER ASSIGNED TO THIS JOB ?
	RET	ULSE		NO, TREAT AS A 'NOP'
	IOS	LA8,SE		IS THE HARDWARE ERROR FLAG SET ?
	RET	ULSE		NO
	ISZ	UPCSV		YES, BUMP USER PC
	RET	ULSE
	RET	ULSE		SAFETY
*
*	PRINTER CHECK SUBROUTINE
*	CHECK PRINTER ASSIGNMENT.  IF PRINTER IS
*	AVAILABLE, IT IS ASSIGNED TO THIS JOB.
*
	PART
	ROOM	13
PRINTER:CK SUB
	CDF	%PRINTER
	TADI	=PRINTER
	SNA			IS PRINTER ASSIGNED ?
	JMP	2F		NO, ASSIGN IT TO THIS JOB
	TAD	UJOB		YES, GET ITS JOB NUMBER
	SNA CLA			IS IT ASSIGNED TO THIS JOB ?
	ERM
1H	INC	PRINTER:CK	YES, BUMP RETURN POINTER
3H	RET	PRINTER:CK
*
2H	TAD	=JOBS		ALLOW ONLY LPTSPL JOB TO BE ASSIGNED
	CIA
	TAD	UJOB		ASSIGN PRINTER TO THIS JOB
	SZA CLA			ONLY IF UJOB = LPTSPL CAN ASSIGNMENT BE MADE
	JMP 3B			RETURN AND TREAT INSTRUCTION AS A NOP
	TAD	UJOB
	CIA
	DCAI	=PRINTER
	JMP	1B
	AIF	V132,.V132
*
*	'LPC' SIMULATION - IOT 6664
*	'LLS' SIMULATION - IOT 6666
*
	PART
ULLS	SUB			LINE PRINTER LOAD SEQUENCE
	ROOM	4
	JMS	PRINTER:CK	IS PRINTER ASSIGNED TO THIS JOB ?
	RET	ULLS		NO, TREAT AS A 'NOP'
	IOF			SENSITIVE CODE HERE
	TADI	=LMF		GET LINE PRINTER MOTION FLAG
	SZA CLA			IS PRINTER IN MOTION ?
	JMP	ULLS2		YES, STORE CHARACTER
	IOS	LA8,SE		IS THE HARDWARE ERROR FLAG SET ?
	JMP	1F		NO
	LDI	04000		YES, SET MOTION FLAG SO PRINTER
	DCAI	=LMF			CAN BE STARTED LATER
	JMP	ULLS2		STORE THE CHARACTER IN BUFFER
*
1H	TAD	UACSV		NO, GET USER CHARACTER,
	SNA			IS CHARACTER ZERO ?
	LDI	04000		YES, MAKE IT NON-ZERO
	IOT	LA8,LS		Print it,
	LDI	1		and set printer motion flag
	DCAI	=LMF
	RET	ULLS
*
ULLS2	TAD	UACSV		GET USER CHARACTER
	SNA			IS CHARACTER ZERO ?
	LDI	04000		YES, MAKE IT NON-ZERO
	DCAI	LBF		STORE IT IN LINE PRINTER BUFFER
	LDI	1		UPDATE BUFFER POINTER
	TAD	LBF
	AND	=0177
	TAD	=LPB
	DCA	LBF
	ISZI	=LCNTR		BUFFER FULL ?
	RET	ULLS		NO
	MQL			CLEAR LOGIC WAIT BITS
	LDI	LPTW		YES, SET PRINTER WAIT
	.SUSPEND
*
	AGO	.PRINT
*
.V132	ANOP
*
*	'LLS' SIMULATION - IOT 6666
*
	PART
ULLS	SUB			LINE PRINTER LOAD SEQUENCE
	ROOM	4
	JMS	PRINTER:CK	IS PRINTER ASSIGNED TO THIS JOB ?
	RET	ULLS		NO, TREAT AS A 'NOP'
	TAD	UACSV		GET USER AC
	AND	=0177		STRIP PARITY
	TAD	=-0140
	SMA			IS CHARACTER GREATER THAN 0137 ?
	JMP	ULLS3		YES, IGNORE IT
	TAD	=0140-FF
	SNA			IS IT A FORM FEED ?
	JMP	UFF		YES
	IAC
	IAC
	SNA			IS IT A LINE FEED ?
	JMP	ULF		YES
	TAD	=LF-040
	SPA			IS IT LESS THAN 040 ?
	JMP	ULLS3		YES, IGNORE IT
	TAD	=040+02000	RESTORE AND INSURE NON-ZERO
	JMP	1F
*
UFF	LDI	0100		FORM FEED CONTROL CODE = 0101
ULF	IAC RAL			LINE FEED CONTROL CODE = 1
	STL RAR			SET CONTROL CODE BIT FLAG
1H	MQL
	IOF			SENSITIVE CODE HERE
	TADI	=LMF		CHECK PRINTER MOTION FLAG
	SZA CLA			IS PRINTER IN MOTION ?
	JMP	ULLS2		YES
	DSI	LSRF		IS THE RUN FLAG TRUE ?
	JMP	ULLS2		NO
	MQA			YES, GET THE CHARACTER
	SPA			IS IT A CONTROL CHARACTER ?
	JMP	2F		YES
	DI	LPBC		LOAD THE PRINTER BUFFER
	RET	ULLS
*
2H	DI	LIP		INITIATE PRINTING
	DCAI	=LMF			AND SET MOTION FLAG
	DI	LRLC		REQUEST LOAD CYCLE
	RET	ULLS
*
ULLS2	MQA			GET THE CHARACTER
	DCAI	LBF		STORE IT IN THE PRINTER BUFFER
	LDI	1		UPDATE PRINTER BUFFER FILL POINTER
	TAD	LBF
	AND	=0177
	TAD	=LPB
	DCA	LBF
	ISZI	=LCNTR		IS THE BUFFER FULL ?
	RET	ULLS		NO
	MQL			YES, CLEAR LOGIC WAIT BITS
	LDI	LPTW		SET LINE PRINTER WAIT
	.SUSPEND
*
ULLS3	CAL			THROW THE CHARACTER AWAY
	RET	ULLS
*
.PRINT	ANOP
*
	AIF	NO:MAGTAPE,.CONT
*
*	'LWCR' SIMULATION - IOT 6701
*
	PART
ULWCR	SUB			LOAD WORD COUNT REGISTER
	.PARAM	MTWC		POINT TO MAGTAPE WORD COUNT
	TAD	UACSV		GET THE WORD COUNT FROM THE USER AC
	DCAI	UPNTR1		SAVE IT
	DCA	UACSV		CLEAR THE USER AC
	RET	ULWCR
*
*	'CWCR' SIMULATION - IOT 6702
*
	PART
UCWCR	SUB			CLEAR THE WORD COUNT REGISTER
	.PARAM	MTWC
	DCAI	UPNTR1
	RET	UCWCR
*
*	'LCAR' SIMULATION - IOT 6703
*
	PART
ULCAR	SUB			LOAD CURRENT ADDRESS REGISTER
	.PARAM	MTCA		POINT TO MAGTAPE CURRENT ADDRESS
	TAD	UACSV		GET THE CURRENT ADDRESS FROM USER AC
	DCAI	UPNTR1		SAVE IT
	DCA	UACSV		CLEAR THE USER AC
	RET	ULCAR
*
*	'CCAR' SIMULATION - IOT 6704
*
	PART
UCCAR	SUB			CLEAR CURRENT ADDRESS REGISTER
	.PARAM	MTCA
	DCAI	UPNTR1
	RET	UCCAR
*
*	'LCMR' SIMULATION - IOT 6705
*
	PART
ULCMR	SUB			LOAD COMMAND REGISTER
	.PARAM	MTCM		POINT TO MAGTAPE COMMAND
	TAD	UACSV		GET THE COMMAND FROM USER AC
	DCAI	UPNTR1		SAVE IT
	DCA	UACSV		CLEAR THE USER AC
	RET	ULCMR
*
*	'LFGR' SIMULATION - IOT 6706
*		IN THIS SIMULATION, WHEN THE FUNCTION AND GO
*		COMMAND HAS BEEN GIVEN TO THE HARDWARE, OR IF THE
*		MAGTAPE REQUEST HAS BEEN PLACED ON THE MAGTAPE
*		QUEUE, THE MTA WAIT BIT IS SET AND THE JOB IS
*		SUSPENDED.
*
	PART
ULFGR	SUB			LOAD 'FUNCTION AND GO' REGISTER
	.PARAM	MTCM		POINT TO THE COMMAND
	TADI	UPNTR1		GET THE COMMAND
	AND	=07000		EXTRACT THE TRANSPORT NUMBER
	CLL RTL			ROTATE TO L O BITS
	RTL
	TAD	=MT:A0
	DCA	UPNTR2
	TADI	UPNTR2		CHECK ASSIGNMENT
	SZA			IS THE TRANSPORT ASSIGNED ?
	TAD	UJOB		YES
	SZA CLA			IS IT ASSIGNED TO THIS JOB ?
	JMP	ULFGR2		NO, TREAT THIS AS A CONTROLLER BUSY
	TAD	UJOB		THIS TRANSPORT IS AVAILABLE TO THIS JOB
	CIA
	DCAI	UPNTR2		ASSIGN/RE-ASSIGN IT TO THIS JOB
	CDF	%MTJOB
	IOF			SENSITIVE CODE HERE !
	TADI	=MTJOB		LOOK AT THE MAGTAPE BUSY FLAG
	SNA CLA			IS THE CONTROLLER BUSY ?
	JMP	1F		NO
	TAD	UJOB		YES, GET THE CURRENT JOB NUMBER
	DCAI	MTQF		PUT IT ON THE MAGTAPE QUEUE
	LDI	1		UPDATE THE QUEUE FILL POINTER
	TAD	MTQF
	AND	=3
	TAD	=MTQB
	DCA	MTQF
	MQL			CLEAR LOGIC WAIT BITS
	LDI	MTAW		SET THE MAGTAPE WAIT BIT
	.SUSPEND
*
ULFGR2	TAD	=MTMSR-MTCM
	TAD	UPNTR1
	DCA	UPNTR1		POINT TO MAGTAPE MAIN STATUS
	TAD	=04001		SET ERROR AND CONTROLLER BUSY BITS
	DCAI	UPNTR1
	DCA	UACSV		CLEAR USER AC
	RET	ULFGR
*
1H	DI	CLT		CLEAR THE TRANSPORT
	TAD	UJOB		NOTE THE MAGTAPE JOB NUMBER
	DCAI	=MTJOB
	CDF	%TABLES
	TAD	UACSV		GET THE MAGTAPE FUNCTION/GO WORD
	AND	=07000		EXTRACT THE FUNCTION
	CLL RTL			ROTATE TO BITS 9 - 11
	RTL
	TAD	=-4
	SNA			IS IT A WRITE FUNCTION ?
	JMP	2F		YES
	IAC
	SNA			IS IT A READ/COMPARE FUNCTION ?
	JMP	2F		YES
	IAC
	SZA CLA			IS IT A READ FUNCTION ?
	JMP	3F		NO, THERE IS NO NEED TO SWAP IN A FIELD
2H	TAD	=077		SET SEARCH MASK
	MQL
	TADI	UPNTR1		GET THE COMMAND AGAIN
	AND	=070		EXTRACT DESIRED TRANSFER FIELD
	TAD	UJOB		ADD JOB NUMBER
	.FINDF			FIND THE FIELD
	SNA			IS THE TRANSFER FIELD RESIDENT ?
	JMP	ULFGR3		NO
	TAD	=-FIELD0	YES, COMPUTE ITS PHYSICAL FIELD NUMBER
	CLL RAL			ROTATE TO BITS 6 - 8
	RTL
3H	MQL
	DSI	SKTR		IS THE TRANSPORT READY ?
	JMP	ULFGR4		NO, BACK UP USER PC AND TRY AGAIN LATER
	TADI	UPNTR1		GET THE COMMAND AGAIN
	INC	UPNTR1		BUMP TO POINT TO WORD COUNT
	AND	=07407		EXTRACT TRANSPORT, PARITY AND BPI
	TAD	=0300		ADD INTERRUPT ENABLE BITS
	MQA			BRING UP THE PHYSICAL TRANSFER FIELD
	DI	LCMR		LOAD THE COMMAND INTO THE HARDWARE
	TADI	UPNTR1		GET THE WORD COUNT
	INC	UPNTR1		BUMP TO POINT TO CURRENT ADDRESS
	DI	LWCR
	TADI	UPNTR1		GET THE CURRENT ADDRESS
	DI	LCAR
	TAD	UACSV		GET THE FUNCTION/GO WORD
	AND	=07700		DELETE THE EMA INCREMENT BIT, IF PRESENT
	DI	LFGR		START THE TRANSPORT
	DCA	UACSV		CLEAR THE USER AC
	MQL			CLEAR LOGIC WAIT BITS
	LDI	MTAW		SET THE MAGTAPE WAIT BIT
	.SUSPEND
*
*	MAGTAPE NON-RESIDENT TRANSFER FIELD HANDLER
*
ULFGR3	TADI	UPNTR1		GET THE COMMAND WORD AGAIN
	MQL
	.FINDM
	SNA			ANY MEMORY AVAILABLE ?
	JMP	ULFGR4		NO, BACK UP USER PC AND TRY AGAIN LATER
	DCA	UFPNTR		YES, SAVE ITS FIELD INFO WORD ADDRESS
	MQA			GET THE COMMAND WORD
	AND	=070		EXTRACT DESIRED TRANSFER FIELD
	TAD	=LOCK		ADD THE FIELD 'LOCK' BIT
	CDF	%MTJOB
	TADI	=MTJOB		ADD THE JOB NUMBER
	DCAI	UFPNTR
	.SWAPF
	LDI	-1		BACK UP USER PC AND WAIT FOR NEXT EXECUTION
	TAD	UPCSV
	DCA	UPCSV
	CDF	%MTJOB
	DCAI	=MTJOB		CLEAR MT JOB
	MQL			CLEAR LOGIC WAIT BITS
	.SUSPEND
*
ULFGR4	LDI	-1		SWAP OUT THIS JOB AND TRY AGAIN LATER
	TAD	UPCSV
	DCA	UPCSV
	CDF	%MTJOB
	DCAI	=MTJOB		CLEAR MT JOB
	LDI	NRESW		SWAPPING OUT WILL KILL TIME
	MQL
	.SUSPEND
*
*	'RWCR' SIMULATION - IOT 6711
*
	PART
URWCR	SUB			CLEAR AC AND READ WORD COUNT
	.PARAM	MTWC
	TADI	UPNTR1		GET THE USER'S WORD COUNT REGISTER
	DCA	UACSV
	RET	URWCR
*
*	'CLT' SIMULATION - IOT 6712
*
	PART
UCLT	SUB			CLEAR TRANSPORT'S MASTER REGISTERS
	.PARAM	MTCM-1
	TAD	UPNTR1		USE AUTO-INDEX
	DCA	XR
	DCAI	XR		CLEAR MAGTAPE COMMAND
	DCAI	XR		CLEAR MAGTAPE WORD COUNT
	DCAI	XR		CLEAR MAGTAPE CURRENT ADDRESS
	DCAI	XR		CLEAR MAGTAPE MAIN STATUS
	DCAI	XR		CLEAR MAGTAPE FUNCTION
	RET	UCLT
*
*	'RCAR' SIMULATION - IOT 6713
*
	PART
URCAR	SUB			CLEAR AC AND READ THE CURRENT ADDRESS
	.PARAM	MTCA
	TADI	UPNTR1		GET THE USER'S MT CURRENT ADDRESS
	DCA	UACSV
	RET	URCAR
*
*	'RMSR' SIMULATION - IOT 6714
*
	PART
URMSR	SUB			CLEAR AC AND READ MAIN STATUS REGISTER
	.PARAM	MTMSR		POINT TO THE USER'S MAIN STATUS REGISTER
	TADI	UPNTR1		GET THE LAST STATUS
	DCA	UACSV		LOAD IT INTO THE USER AC
	RET	URMSR
*
*	'RCMR' SIMULATION - IOT 6715
*
	PART
URCMR	SUB			CLEAR AC AND READ COMMAND REGISTER
	.PARAM	MTCM
	TADI	UPNTR1
	DCA	UACSV
	RET	URCMR
*
*	'RFSR' SIMULATION - IOT 6716
*
	PART
URFSR	SUB			CLEAR AC AND READ RUNCTION AND
	.PARAM	MTFN			2ND STATUS REGISTER
	TADI	UPNTR1
	DCA	UACSV
	RET	URFSR
*
*	'SKEF' SIMULATION - IOT 6721
*
	PART
USKEF	SUB			SKIP IF ERROR FLAG IS SET
	.PARAM	MTMSR		POINT TO THE USER'S MAIN STATUS REGISTER
	TADI	UPNTR1		GET THE LAST MAIN STATUS
	ROOM	6
	SPA CLA			IS THE ERROR FLAG SET ?
	ISZ	UPCSV		YES, BUMP USER PC
	RET	USKEF
	RET	USKEF		SAFETY
*
*	'SKJD' SIMULATION - IOT 6723
*
USKJD	EQU	UTSF		SKIP WHEN JOB DONE
*				UNCONDITIONAL SKIP DUE TO THE FACT THE
*				USER IS SUSPENDED UNTIL THE JOB IS DONE
*
*	'SKTR' SIMULATION - IOT 6724
*
USKTR	EQU	UTSF		SKIP IF TAPE UNIT READY
*				UNCONDITIONAL SKIP DUE TO THE FACT THAT
*				ULFGR INSURES TAPE UNIT READY
*
*	'CLF' SIMULATION - IOT 6725
*
UCLF	EQU	UCLT		CLEAR TRANSPORT CONTROLLER AND
*					MASTER REGISTERS
*
.CONT	ANOP
*
*	SIMULATION FOR AN ILLEGAL IOT
*
	PART
UBAD	SUB			JUST TREAT AS A 'NOP'
	RET	UBAD
	TITLE	USER IOT PROCESSOR SUBROUTINES
*
*	SET 'CUDF' SUBROUTINE TO USER 'DF'
*
SETDF	SUB
	TAD	UFLSV		GET USER FLAGS
	AND	=07		EXTRACT USER PHYSICAL 'DF'
	CLL RAL
	RTL
	TAD	=KCDF
	DCA	UCUDF
	RET	SETDF
*
*	SAVE VITAL REGISTERS AND RETURN ADDRESS FOR EXEC SPECIAL WAIT
*	ONE RETURN ADDRESS PLUS SIX (MAX) ITEMS MAY BE SAVED.  TO
*	INCREASE ITEM CAPACITY, INCREASE VALUE OF 'JMSAVE' BY 2 FOR
*	EACH ADDITIONAL ITEM TO BE ADDED.  ANY ITEM MAY BE SAVED
*	EXCEPT XR, XR1 AND UPNTR3 WHICH ARE USED IN THIS SUBROUTINE.
*
	PART
UJMS	HLT
	CDF	%*
	MQL			SAVE THE LOGIC WAIT BIT(S)
	LDI	-1
	TAD	UJMS
	DCA	XR
	TAD	UJOB		GET THE JOB NUMBER
	MULT64
	TAD	=JOB1-USER:ST+JMSAVE-1
	DCA	XR1
	TADI	XR		GET THE RETURN ADDRESS
	DCAI	XR1		SAVE IT
1H	TADI	XR		GET THE VITAL REGISTER LOCATIONS
	SNA			END OF LIST ?
	JMP	2F		YES
	DCA	UPNTR3
	TAD	UPNTR3
	DCAI	XR1		SAVE THE LOCATION
	TADI	UPNTR3
	DCAI	XR1		SAVE THE CONTENTS OF THE LOCATION
	JMP	1B
*
2H	TAD	=EXECW
	MQOR			BRING UP ANY OTHER LOGIC WAIT BITS
	MQL
	.SUSPEND
*
*	RELEASE ALL ASSIGNED DEVICES
*
*	     --	ENTERING --	     --	EXITING --
*	(INT)	UNDEFINED		OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNDEFINED
*	(AC)	0000			000
*	(MQ)	ANYTHING		UNCHANGED
*
	PART
RELEASE	SUB
	IOF			NO INTERRUPTS WHILE CHECKING ASSIGNMENTS
	TAD	=JSYS		POINT TO ASSIGNMENT TABLE
	DCA	UPNTR1
	LDI	-TERMS
	DCA	UCNTR
	CDF	%TABLES
1H	TADI	UPNTR1		GET A JSYS ASSIGNMENT
	TAD	UJOB
	SNA CLA			WAS IT ASSIGNED TO THIS JOB ?
	DCAI	UPNTR1		YES, RELEASE IT
	INC	UPNTR1		BUMP TO NEXT JSYS ASSIGNMENT LOCATION
	ISZ	UCNTR		CHECKED THE WHOLE TABLE ?
	JMP	1B		NO
	CDF	%PRINTER
	AIF	NO:PTR,.PTR
	TAD	UJOB		RELEASE DEVICES ASSIGNED TO THIS JOB
	TADI	=READER
	SNA CLA			READER ASSIGNED ?
	DCAI	=READER		YES, RELEASE IT
.PTR	ANOP
	AIF	NO:PTP,.PTP
	TAD	UJOB
	TADI	=PUNCH
	SNA CLA			PUNCH ASSIGNED ?
	DCAI	=PUNCH		YES, RELEASE IT
.PTP	ANOP
	TAD	UJOB
	TADI	=PRINTER
	SNA CLA			PRINTER ASSIGNED ?
	DCAI	=PRINTER		YES, RELEASE IT
	CDF	%TABLES
	AIF	NO:RKO5,.RK05
	TAD	=-6		INITIALIZE TO CHECK ON RK05 LOGICAL
	DCA	UCNTR			DEVICE ASSIGNMENTS
	TAD	=RK:A1
	DCA	UPNTR1
	SKP
2H	INC	UPNTR1		BUMP TO POINT TO NEXT LOGICAL DEVICE
	TADI	UPNTR1
	TAD	UJOB
	SNA CLA			ASSIGNED TO THIS JOB ?
	DCAI	UPNTR1		YES, RELEASE IT
	ISZ	UCNTR		CHECK ALL RK05'S ?
	JMP	2B		NO
.RK05	ANOP
	AIF	NO:DECTAPE,.DECTAPE
	TAD	=-8		INITIALIZE TO CHECK DECTAPE ASSIGNMENTS
	DCA	UCNTR
	TAD	=DT:A0
	DCA	UPNTR1
	SKP
3H	INC	UPNTR1		BUMP TO POINT TO NEXT LOGICAL DEVICE
	TADI	UPNTR1
	TAD	UJOB
	SNA CLA			ASSIGNED TO THIS JOB ?
	DCAI	UPNTR1		YES, RELEASE IT
	ISZ	UCNTR		CHECK ALL TC08 DECTAPES ?
	JMP	3B		NO
.DECTAPE ANOP
	AIF	NO:MAGTAPE,.MAGTAPE
	TAD	=-8		INITIALIZE TO CHECK MAGTAPE ASSIGNMENTS
	DCA	UCNTR
	TAD	=MT:A0
	DCA	UPNTR1
	SKP
4H	INC	UPNTR1		BUMP TO POINT TO NEXT LOGICAL DEVICE
	TADI	UPNTR1
	TAD	UJOB
	SNA CLA			ASSIGNED TO THIS JOB ?
	DCAI	UPNTR1		YES, RELEASE IT
	ISZ	UCNTR		CHECKED ALL TM8E MAGTAPES ?
	JMP	4B		NO
.MAGTAPE ANOP
	RET	RELEASE
*
*	.CLEAR
*	CLEAR A FIELD 1 BUFFER
*
*	     -- ENTERING --	     -- EXITING --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNCHANGED
*	(AC)	BUFFER ADDRESS -1	0000
*	(MQ)	-(BUFFER SIZE)		UNCHANGED
*	MODIFIED: XR2, UCNTR
*
	PART
UCLEAR	SUB			CLEAR A FIELD 1 BUFFER
	DCA	XR2
	CDF	%BUFFERS
	MQA			GET THE WORD COUNT
	DCA	UCNTR
	IOF
1H	DCAI	XR2		CLEAR THE BUFFER
	ISZ	UCNTR		FINISHED ?
	JMP	1B		NO
	RET	UCLEAR
*
*	.FINDM
*	FIND AN AVAILABLE MEMORY FIELD
*
*	     -- ENTERING --	     -- EXITING --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNCHANGED
*	(AC)	0000			0000 IF NO MEMORY AVAILABLE
*					ADDR OF FIELD INFO IF MEMORY AVAILABLE
*	(MQ)	ANYTHING		UNCHANGED
*	MODIFIED: XR2, UCNTR
*
	PART
UFINDM	SUB
	TAD	=FIELD1		INITIALIZE
	DCA	XR2
	TAD	=-6
	DCA	UCNTR
	CDF	%FIELD2
	IOF
1H	TADI	XR2		LOOK FOR AN AVAILABLE FIELD
	SNA CLA			FOUND ONE YET ?
	JMP	2F		YES
	ISZ	UCNTR		LOOKED AT ALL FIELDS YET ?
	JMP	1B		NO
	SKP
2H	TAD	XR2		GET THE ADDRESS OF THE FIELD INFO WORD
	CDF	%*
	RET	UFINDM
*
*	.FINDF
*	FIND A FIELD FROM INFO CONTAINED IN THE AC AND MQ
*
*	     -- ENTERING --	     -- EXITING --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNDEFINED
*	(AC)	MATCH BIT PATTERN	0000 IF NO MATCH FOUND
*					ADDR OF FIELD INFO IF MATCH FOUND
*	(MQ)	MATCH MASK		UNCHANGED
*	MODIFIED: XR2, UTEMP, UCNTR
*
	PART
UFINDF	SUB
	CIA
	DCA	UTEMP		SAVE NEGATED MATCH BIT PATTERN
	TAD	=FIELD1
	DCA	XR2
	TAD	=-6
	DCA	UCNTR
	CDF	%FIELD2
	IOF
1H	MQA			GET THE MASK
	ANDI	XR2		MASK THE FIELD INFO WORD
	TAD	UTEMP
	SNA CLA			A MATCH ?
	JMP	2F		YES
	ISZ	UCNTR		CHECKED ALL FIELD INFO WORDS ?
	JMP	1B		NO
	SKP
2H	TAD	XR2		GET THE ADDR OF THE FIELD INFO WORD
	CDF	%*
	RET	UFINDF
*
*	.SWAPF
*	SWAP A FIELD TO/FROM DISK SWAP BLOCKS
*
*	     -- ENTERING --	     -- EXITING  --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNDEFINED
*	(AC)	0000 IF READ		0000
*		4000 IF WRITE
*	(MQ)	ANYTHING		QUEUE JOB NUMBER
*	FPNTR	ADDR OF AFFECTED
*		    FIELD INFO WORD
*	MODIFIED: FPNTR
*
	PART
USWAPF	SUB
	CLL RAL			READ/WRITE BIT TO LINK
	TAD	UFPNTR		GET THE FIELD INFO WORD ADDRESS
	CDF	%FPNTR
	IOF			SENSITIVE CODE HERE
	DCAI	=FPNTR
	CDF	%*
	RAR			GET THE READ/WRITE BIT
	JMSX	QSWAPF
	RET	USWAPF
*
*	.EXDISK
*	ENQUEUE A DISK REQUEST
*
*	     -- ENTERING --	     -- EXITING  --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNDEFINED
*	(AC)	0000			0000
*	(MQ)	ANYTHING		QUEUE JOB NUMBER
*
*	MODIFIED: XR, QFUNC, QADDR, QBLOCK
*
	PART
UEXDISK	SUB
	CDF	%QFUNC
	TAD	=QFUNC-1
	DCA	XR
	TAD	UUFUNC		GET THE FUNCTION WORD
	IOF			SENSITIVE CODE
	DCAI	XR		STORE IT
	TAD	UADDR		GET THE MEMORY ADDRESS
	DCAI	XR		STORE IT
	TAD	UBLOCK		GET THE DISK BLOCK NUMBER
	DCAI	XR		STORE IT
	CDF	%*
	JMSX	QEXDISK		QUEUE THE DISK REQUEST
	RET	UEXDISK
*
*	.SWAPJ
*	SWAP OUT ALL JOBS EXCEPT THE CURRENT JOB
*
*	     --	ENTERING --	     --	EXITING --
*	(INT)	OFF/ON			OFF
*	(DF)	ANYTHING		%*
*	(L)	ANYTHING		UNDEFINED
*	(AC)	0000			0000
*	(MQ)	ANYTHING		UNDEFINED
*
*	MODIFIED: UCNTR, UFPNTR, UTEMP, UPNTR1
*
	PART
USWAPJ	SUB
	TAD	=-6		INITIALIZE TO CHECK ALL INFO WORD
	DCA	UCNTR
	TAD	=FIELD2
	DCA	UFPNTR
	DCA	UTEMP
	IOF
1H	CDF	%FIELD2
	TADI	UFPNTR		GET A FIELD INFO WORD
	AND	=LOCK+N:EXIST
	SZA CLA			IS IT LOCKED OR NON-EXISTANT ?
	JMP	4F		YES, IGNORE IT
	TADI	UFPNTR		NO, GET IT AGAIN
	AND	=07		EXTRACT THE JOB NUMBER
	CIA
	TAD	UJOB
	SNA CLA			IS IT THE CURRENT JOB ?
	JMP	4F		YES, IGNORE IT
	LDI	04000
	.SWAPF
	INC	UTEMP		BUMP 'SWAPPED A FIELD' FLAG
	CDF	%FIELD2
	TADI	UFPNTR		GET THE FIELD INFO WORD AGAIN
	AND	=07		EXTRACT THE JOB NUMBER
	MULT64
	TAD	=JOB1-USER:ST+LWAIT
	DCA	UPNTR1
	TAD	=NRESW+REALW	SET NON-RESIDENT AND REAL TIME WAITS
	MQL
	CDF	%TABLES
	TADI	UPNTR1		GET CURRENT WAITS, IF ANY
	MQOR
	DCAI	UPNTR1
	INC	UPNTR1		BUMP POINTER TO JOB FLAGS
	CDF	%FPNTR2
	TADI	UFPNTR		GET THE FIELD INFO WORD
	SMA CLA			IS IT AN INSTRUCTION FIELD ?
	JMP	2F		NO
	AND	=070		EXTRACT THE USER RELATIVE FIELD
	MQL
	CDF	%TABLES
	TADI	UPNTR1		GET THE JOB FLAGS
	AND	=07707		REMOVE PHYSICAL FIELD NUMBER
	MQA			BRING UP RELATIVE FIELD
	DCAI	UPNTR1		REPLACE THE JOB FLAGS
	CDF	%FIELD2
2H	LDI	DF
	ANDI	UFPNTR		LOOK AT THE FIELD INFO WORD DF BIT
	SNA CLA			IS IT SET ?
	JMP	3F		NO
	TADI	UFPNTR		YES, GET THE FIELD INFO WORD
	AND	=070		EXTRACT THE RELATIVE FIELD
	CLL RAR
	RTR
	MQL
	CDF	%TABLES
	TADI	UPNTR1		GET THE JOB FLAGS WORD
	AND	=07770		REMOVE THE PHYSICAL DF VALUE
	MQA			BRING UP THE RELATIVE DF
	DCAI	UPNTR1		SAVE THE NEW JOB FLAGS
3H	CDF	%TABLES
	LDI	RESTART-FLAGS-1
	TAD	UPNTR1
	DCA	XR		SET INDEX
	TAD	=-QUANTUM*JOBS*2
	DCAI	XR		Allow plenty of time for many accesses
	LDI	-1
	DCAI	XR
	CDF	%FIELD2
	DCAI	UFPNTR		RELEASE THE PHYSICAL MEMORY FIELD
4H	INC	UFPNTR		BUMP THE FIELD INFO WORD POINTER
	ISZ	UCNTR		CHECKED ALL FIELDS YET ?
	JMP	1B		NO
	CDF	%*
	TAD	UTEMP		YES, GET 'SWAPPED A FIELD' FLAG
	SNA CLA			WAS AT LEAST ONE FIELD SWAPPED OUT ?
	INC	USWAPJ		NO, BUMP RETURN POINTER
	RET	USWAPJ
	AIF	PDP8E.OR.(PDP8I.AN.EAE),.MQ
*
*	SOFTWARE SIMULATION OF CERTAIN 'MQ' FUNCTIONS
*
UMQOR	SUB			'OR' AC WITH 'MQ'
	DCA	CPU:TEM		STORE AC TEMPORARILY
	TAD	CPU:MQ
	CMA
	AND	CPU:TEM
	TAD	CPU:MQ
	RET	UMQOR
*
UCAM	SUB			CLEAR AC AND 'MQ'
	CLA
	DCA	CPU:MQ
	RET	UCAM
*
USWP	SUB			'SWP' AND AND 'MQ'
	DCA	CPU:TEM		SAVE AC TEMPORARILY
	TAD	CPU:MQ
	DCA	CPU:AC
	TAD	CPU:TEM
	DCA	CPU:MQ
	TAD	CPU:AC
	RET	USWP
*
.MQ	ANOP
	TITLE	TIMESHARE RESIDENT OS/8
*
	DSEC
*
	PART
OS8RES	JMPI	(*+1).AN.0177	GET THE PASSWORD FIRST
	DC	GETPW-OS8RES
ICLEAR	DCAI	CLPNTR.AN.0177	DESTROY OS/8 INITIALIZATION CODE
	ISZ	CLCNTR.AN.0177		AND CLEAR USER FIELD ZERO
	JMP	(*-2).AN.0177
	DCA	CLPNTR.AN.0177	BOMB THE AUTO-INDEX
	JMPI	(*+1).AN.0177	START OS/8
	DC	07605		DESTRUCTIVE ENTRY
CLCNTR	DC	-(07600-((*+2).AN.0177))
CLPNTR	DC	*.AN.0177	AUTO-INDEX 011
	DC	0177		INDEX CONSTANT FOR START OF FIELD 0 RES
	DC	07577		INDEX CONSTANT FOR START OF FIELD 1 RES
	DC	(DHRTAB-1).AN.0177
	DC	((DHRTAB-1).AN.0177)+07600	FIELD 1 LOADING ADDRESS
	AS	3,KHLT
OS8L	DI	DATE		GET THE OS/8 DATE
	DCA	OS8D.AN.0177	STORE IT
OS8LC	TADI	$012		MOVE THE CODE
	DCAI	$013
	TADI	$014
	CDF	1
	DCAI	$015
	CDF	0
	TAD	$013
	SZA CLA			FINISHED ?
	JMP	OS8LC.AN.0177	NO, CONTINUE LOADING
	JMP	ICLEAR.AN.0177	YES, NOW CLEAR USER FIELD ZERO
	AS	10,07402
*
*	DEVICE HANDLER RESIDENCY TABLE
*
DHRTAB	DC	07607		SYS
	DC	07607		DSK
	AS	015
*
OS8D	AS	1		DATE WORD
*
*	LOAD THE KEYBOARD MONITOR
*
	DC	06202,04207,01000,0,7,07746
	DC	06203,05677,0400
*
*	USR CALL AND RETURN AREA
*
	DC	0,03340,06214,01275,03336,06201,01674,07010
	DC	06211,07630,05321,06202,04207,05010,0,027
	DC	07402,06202,04207,0610,0,013,07402,05020
	DC	06202,04207,01010,0,027,07402,0,05700,0
*
*	USER DEVICE NAME TABLE
*
	AS	15
*
*	DEVICE CONTROL WORD TABLE
*
DCWTAB	DC	04570		SYS
	DC	04570		DSK
	AS	13
*
*	LAST WORD RESERVED FOR FUTURE OS/8 EXPANSION
*
	AS	1
*
*	END OF TIMESHARE FIELD 1 RESIDENT OS/8
*
*	FIELD 0 RESIDENT OS/8
*
*	OS/8 NON-DESTRUCTIVE ENTRY
*
OS80	DC	04207,05000,0,033,07602
*
*	OS/8 DESTRUCTIVE ENTRY
*
	DC	06213,05267
*
OS8ENTRY INC	DEVNUM		DEV # 1 ENTRY
	INC	DEVNUM		DEV # 2
	INC	DEVNUM		DEV # 3
	INC	DEVNUM		DEV # 4
	INC	DEVNUM		DEV # 5
	INC	DEVNUM		DEV # 6
	INC	DEVNUM		DEV # 7
	INC	DEVNUM		DEV # 10
	INC	DEVNUM		DEV # 11
	INC	DEVNUM		DEV # 12
	INC	DEVNUM		DEV # 13
	INC	DEVNUM		DEV # 14
	INC	DEVNUM		DEV # 15
	INC	DEVNUM		DEV # 16
	INC	DEVNUM		DEV # 17
	CLA
	TAD	DEVNUM
	CIA			RELATIVE ADDRESS 0030
	TAD	K15
	DCA	3F		SAVE DEVICE NUMBER
	TAD	3F
	TAD	TAD:ENTRY
	DCA	1F		TO ENABLE GETTING RETURN ADDRESS
	LDI	02000
	TAD	1F
	DCA	2F		TO REPLACE 'INC DEVNUM' INST
1H	HLT
	DCA	4F		SAVE CALLING ADDRESS
	TAD	INC:DEVNUM	REPLACE 'INC DEVNUM' INST
2H	HLT
	DCA	DEVNUM		CLEAR FOR NEXT CALL
	DC	FSD		FILE STRUCTURED DEVICE HANDLER IOT
3H	HLT			DEVICE NUMBER STORED HERE
4H	DC	0		CALLING ADDRESS STORED HERE
*
DEVNUM	DC	0
K15	DC	15
INC:DEVNUM INC	DEVNUM
TAD:ENTRY TAD	OS8ENTRY-1	RELATIVE ADDRESS 0054
*
	AS	OS80+0144-*,07402
*
*	CURRENT STARTING ADDRESS
*
	DC	06203
	DC	0200
*
*	JOB STATUS WORD
*
	AS	1
*
*	LAST BLOCK ACCESSED BY SYSTEM DEVICE HANDLER
*
	AS	1
*
*	DATA BREAK LOCATIONS
*
	AS	6,07402
*
*	PROGRAM SET UP AREA
*
	DC	07607,04756,03700,0,0222,07402,05372
	DC	04207,0300,07000,035,07402,06203,06042,05775,0200,0
*
*	HIGH ORDER DATE AND CORE INFORMATION WORD
*
CORINFO	DC	0		H O DATE AND NUMBER OF FIELDS
*
*	PASSWORD PROCESSING CONSTANTS
*
PW:CR	DC	CR
PW:LF	DC	LF-CR
PW:ANG	DC	('>.AN.0177)-LF
PW:PO1	DC	PASSPNTR-OS8RES-1
PW:177	DC	0177
PW:MCR	DC	-CR
*
*	PASSWORD PROCESSING TEMPORARIES
*
PWPNTR	HLT			POINTER TO THIS JOB'S PASSWORD
PWTEMP	HLT			TEMPORARY FOR HOLDING USER'S RESPONSE
*	ADDED CODE TO OUTPUT A SHORT MESSAGE INSTEAD OF THE ANGLE
*	ON LOGIN
OTXT	SUB
1H	TADI	OTXT
	SNA
	RET	OTXT	EXIT
	INC	OTXT
	JMS	WRTTY
	JMP 	1B
*
WRTTY	SUB
	IOS	TTY1,SF
	JMP	*-1
	IOT	TTY1,LS
	CLA
	RET	WRTTY
*
*
*
*	PASSWORD SEQUENCE
*	GET THE PASSWORD FROM THE USER.  IF IT IS CORRECT, CLEAR
*	USER FIELD 0 AND START OS/8.  IF IT IS INCORRECT, LOG-OFF
*	WITHOUT GIVING A MESSAGE.  THE PASSWORD IS NOT ECHOED.
*
	PART
GETPW	CAL
	TAD	PW:CR
	IOT	TTY1,LS
	TAD	PW:LF
	IOT	TTY1,LS
	IOT	TTY1,LS
*	TAD	PW:ANG
*	IOT	TTY1,LS
	CLL CLA
	.OTXT <PLEASE LOGON>
	DI	TASK		GET THE JOB NUMBER
	TAD	PW:PO1
	DCA	PWPNTR
	TADI	PWPNTR		GET THE PASSWORD ADDRESS
	DCA	PWPNTR
1H	IOT	KEY1,LS		GET A USER RESPONSE CHARACTER
	AND	PW:177		STRIP PARITY
	DCA	PWTEMP
	TADI	PWPNTR		GET A CHARACTER OF PASSWORD
	INC	PWPNTR		BUMP THE POINTER
	SNA			END OF PASSWORD
	JMP	3F		YES
	CIA
	TAD	PWTEMP		COMPARE WITH USER RESPONSE CHARACTER
	SNA CLA			A MATCH ?
	JMP	1B		YES, GET NEXT CHARACTER
2H	DI	IHLT		NO, JUST HALT WITH NO MESSAGE
*
3H	TAD	PWTEMP		END OF PASSWORD -- CHECK FOR USER CR
	TAD	PW:MCR
	SZA CLA			DID USER TYPE A CR ?
	JMP	2B		NO, JUST HALT
	JMP	OS8L.AN.0177	YES, NOW LOAD RESIDENT TIMESHARE OS/8
*
*	PASSWORD POINTER LIST
*
PASSPNTR AS	TERMS,PASSWORDS-OS8RES	PASSWORD POINTER LIST
*
*	PASSWORD'S STORAGE AREA
*
PASSWORDS DC	0		THIS AREA IS SET UP BY 'INITIALIZE'
*
	AS	((*+0400).AN.07400)-*,KHLT
	TITLE	LEGAL IOT LIST TABLE
*
*	THESE IOT'S ARE (HOPEFULLY) ARRANGED IN ORDER OF THEIR
*	FREQUENCY OF USE WITH THE MOST USED IOT'S AT THE START
*	OF THE LIST.
*
IOT1	.IOT	06034,UKRS		IOT	KEY,KRS
	.IOT	06666,ULLS		IOT	LA8,LLS
	.IOT	06031,UKSF		IOS	KEY,KSF
	.IOT	06036,UKRB		IOT	KEY,KRB
	.IOT	06046,UTLS		IOT	TTY,TLS
	.IOT	06032,UKCC		IOT	KEY,KCC
	AIF	NO:PTR,.PTR
	.IOT	06011,URSF		IOS	PR8,RSF
	.IOT	06016,URRC		IOT	PR8,RRC
	.IOT	06012,URRB		IOT	PR8,RRB
	.IOT	06014,URFC		IOT	PR8,RFC
.PTR	ANOP
	.IOT	06214,URDF		RDF
	AIF	NO:PTP,.PTP
	.IOT	06026,UPLS		IOT	PP8,PLS
.PTP	ANOP
	.IOT	06110,UFSD		DI	FSD
	.IOT	06224,URIF		RIF
	AIF	NO:MAGTAPE,.MAG
	.IOT	06701,ULWCR		LWCR
	.IOT	06703,ULCAR		LCAR
	.IOT	06705,ULCMR		LCMR
	.IOT	06706,ULFGR		LFGR
	.IOT	06712,UCLT		CLT
	.IOT	06721,USKEF		SKEF
	.IOT	06723,USKJD		SKJD
	.IOT	06724,USKTR		SKTR
	.IOT	06714,URMSR		RMSR
.MAG	ANOP
	.IOT	06663,ULSE		IOS	LA8,LSE
	AIF	NO:SPOOL,.SPOOL
	.IOT	06660,USPOOL		IOT	LA8,SPOOL
.SPOOL	ANOP
	.IOT	06007,UCAF		CAF
	AIF	NO:EAE.OR.PDP8I,.EAE
	.IOT	06006,USGT		SGT
.EAE	ANOP
	AIF	NO:PTP,.PTP
	.IOT	06021,UPSF		IOS	PP8,PSF
	.IOT	06024,UPLS		IOT	PP8,PPC
.PTP	ANOP
	.IOT	06041,UTSF		IOS	TTY,TSF
	.IOT	06044,UTLS		IOT	TTY,TPC
	.IOT	06107,UTSSS		DSI	TSSS
	.IOT	06111,UTSS		DSI	TSS
	.IOT	06112,USSR		DI	SSR
	.IOT	06113,URCR		DI	RCR
	.IOT	06114,UTOD		DI	TOD
	.IOT	06115,UDATE		DI	DATE
	.IOT	06116,UTASK		DI	TASK
	.IOT	06117,UIHLT		DI	IHLT
	.IOT	06120,USYN		DI	SYN
	.IOT	06121,USTM		DI	STM
	.IOT	06122,URAN		DI	RAN
	.IOT	06123,UALONE		DI	ALONE
	.IOT	06124,UTALK		DSI	TALK
	.IOT	06125,USPR		DI	SPR
	.IOT	06661,ULSF		IOS	LA8,LSF
	.IOT	06664,ULLS		IOT	LA8,LPC
	.IOT	06264,UCUF		CUF
	AIF	NO:MAGTAPE,.MAG
	.IOT	06702,UCWCR		CWCR
	.IOT	06704,UCCAR		CCAR
	.IOT	06711,URWCR		RWCR
	.IOT	06713,URCAR		RCAR
	.IOT	06715,URCMR		RCMR
	.IOT	06716,URFSR		RFSR
	.IOT	06725,UCLF		CLF
.MAG	ANOP
IOTBAD	.IOT	0,UBAD			ILLEGAL IOT
*
*	IOT SERVICE SUBROUTINE POINTER TABLE
*
IOT2	.GEN
	TITLE	EXECUTIVE TABLES
*
TABLES	QUT	%*,*
*
*	FILE STRUCTURED HANDLERS TABLE OF DEVICES
*
DEV:TAB	DC	SYS		DEVICE: SYS
	DC	SYS		DEVICE: DSK
	AS	13		THE REMAINDER OF THE TABLE IS
*					FILLED DURING INITIALIZATION
*					THE FINAL NULL IS A SENTINEL
*
*	SYSTEM DEVICE ASSIGNMENT TABLE
*
JSYS	AS	TERMS
*
	AIF	NO:MAGTAPE,.MAGTAPE
*
*	TM8-E MAGTAPE TRANSPORT ASSIGNMENT LOCATIONS
*
MT:A0	AS	8		INITIALLY NONE ASSIGNED
*
.MAGTAPE ANOP
*
	AIF	NO:DECTAPE,.DECTAPE
*
*	DECTAPE UNIT ASSIGNMENT LOCATIONS
*
DT:A0	AS	8		INITIALLY NONE ASSIGNED
*
*	DECTAPE TRANSPORT CURRENT BLOCK TABLE
*
DTBTAB	AS	8		INITIALLY BLOCK 0 ON ALL TRANSPORTS
*
.DECTAPE AIF	NO:FLOPPY,.FLOPPY
*
*	RX01 FLOPPY DISK ASSIGNMENT LOCATIONS
*	RXA0 AND R0 ARE PHYSICALLY THE SAME FLOPPY DISK DRIVE.
*	THE SAME IS TRUE FOR RXA1 AND R1.  THE UNITS ARE ASSIGNED
*	BY PHYSICAL DRIVE NUMBER AND NOT BY DEVICE NAME.
*
RX:A0	AS	2		INITIALLY NONE ASSIGNED
*
.FLOPPY	ANOP
*
	AIF	NO:RKO5,.RK05
*
*	RK05 LOGICAL DEVICE ASSIGNMENT LOCATIONS
*
RK:A1	AS	2*3		INITIALLY NONE ASSIGNED
*
.RK05	ANOP
*
*	MAX DAYS PER MONTH TABLE
*
DAYTAB	QUT	%*,*-1
	DC	-(31.LS.3)	JANUARY
	DC	-(28.LS.3)	FEBRUARY
	DC	-(31.LS.3)	MARCH
	DC	-(30.LS.3)	APRIL
	DC	-(31.LS.3)	MAY
	DC	-(30.LS.3)	JUNE
	DC	-(31.LS.3)	JULY
	DC	-(31.LS.3)	AUGUST
	DC	-(30.LS.3)	SEPTEMBER
	DC	-(31.LS.3)	OCTOBER
	DC	-(30.LS.3)	NOVEMBER
	DC	-(31.LS.3)	DECEMBER
	AS	2		SAFETY
	TITLE	EXECUTIVE TEXT MESSAGES
*
*	TEXT MESSAGES
*	A LEFT ARROW '_' WILL OUTPUT A CR/LF COMBO
*
HALT	EQU	*-1
	TEXT	\_HALT AT  @\
*
OP7EAE	EQU	*-1
	TEXT	\_EAE INST BETWEEN CIF & JMS OR JMP.  PROGRAM STOPPED AT  @\
	TITLE	JOB STATUS AREAS
*
*	USER STATUS AREAS
*
*	JOB 1 STATUS AREA
*
JOB1	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB1IB		IBF
	DC	JOB1IB		IBE
	IOT	4,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB1OB		OBF
	DC	JOB1OB		OBE
	DC	-128		OBC
	AS	JOB1+USER:ST-*
*
*	JOB 2 STATUS AREA
*
JOB2	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB2IB		IBF
	DC	JOB2IB		IBE
	IOT	TTY2,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB2OB		OBF
	DC	JOB2OB		OBE
	DC	-128		OBC
	AS	JOB2+USER:ST-*
*
	AIF	TERMS.LT.3,.CONT
*
*	JOB 3 STATUS AREA
*
JOB3	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB3IB		IBF
	DC	JOB3IB		IBE
	IOT	TTY3,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB3OB		OBF
	DC	JOB3OB		OBE
	DC	-128		OBC
	AS	JOB3+USER:ST-*
*
	AIF	TERMS.LT.4,.CONT
*
*	JOB 4 STATUS AREA
*
JOB4	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB4IB		IBF
	DC	JOB4IB		IBE
	IOT	TTY4,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB4OB		OBF
	DC	JOB4OB		OBE
	DC	-128		OBC
	AS	JOB4+USER:ST-*
*
	AIF	TERMS.LT.5,.CONT
*
*	JOB 5 STATUS AREA
*
JOB5	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB5IB		IBF
	DC	JOB5IB		IBE
	IOT	TTY5,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB5OB		OBF
	DC	JOB5OB		OBE
	DC	-128		OBC
	AS	JOB5+USER:ST-*
*
	AIF	TERMS.LT.6,.CONT
*
*	JOB 6 STATUS AREA
*
JOB6	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	DC	0		SC
	AS	2		SR FLAG AND SR
	AS	2		RESTART TIME
	DC	JOB6IB		IBF
	DC	JOB6IB		IBE
	IOT	TTY6,6		OUTPUT IOT
	DC	0		MOTION FLAG
	DC	JOB6OB		OBF
	DC	JOB6OB		OBE
	DC	-128		OBC
	AS	JOB6+USER:ST-*
*
.CONT	ANOP
	AIF	NO:SPOOL,.SPOOL
*
*	SPOOL JOB STATUS AREA
*
JOBSPL	DC	0		DEVICE WAIT BITS
	DC	HALTW		LOGIC WAIT BITS
	DC	0		FLAGS
	DC	0		PC
	DC	0		AC
	DC	0		MQ
	AS	JOBSPL+USER:ST-*
*
.SPOOL	ANOP
*
*	Compute highest address used in this field.
*
	.END
*
*	Compute highest address used in this field.
*
	.END