	.TITLE +++ XVM/RSX EXECUTIVE VERSION 1B (PART 1) +++
/
/ COPYRIGHT (C) 1976
/ DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/ THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS
/ SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/ VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/ EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/ THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/ SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/ WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/ MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/ DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/ OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY
/ DEC.
/
	.EJECT
P1EDTN=100214	/PART ONE [OF SOURCE FILE] EDIT NUMBER
/ 161	26-FEB-76 (RCHM)	BEGINNING OF MULTIACCESS	/(161)
/				CODING. FIRST EDIT SETS UP MA	/(161)
/				CONTROL WORDS IN SCOM, DEFINES	/(161)
/				THE NO MULTIACCESS CONDITIONAL	/(161)
/				AND CONDITIONALIZES TDV AND	/(161)
/				XFRCMD. THIS EDIT INSTALLS	/(161)
/				THE REQUEST MAPPED DIRECTIVE,	/(161)
/				THE QIO CHANGES NECESSARY TO	/(161)
/				USE LUN MAPPING, IMPLEMENT NEW	/(161)
/				IDLE STATUS FOR ODT, MAKE DTC	/(161)
/				EXTRACT TASK INFORMATION FROM	/(161)
/				PBDL, MAKE STATE 1 PROCESSING	/(161)
/				INITIALIZE PBDL FROM REQUEST	/(161)
/				NODE, CHANGE SHORT PARTITION	/(161)
/				BLOCK TO INCLUDE FLAG WORD FOR	/(161)
/				NEW DTC PROCESSING, ALSO CHANGE	/(161)
/				ALL TASKS USING THE SHORT PAR-	/(161)
/				TITION BLOCK, MODIFY IORD, EXIT	/(161)
/				VARIOUS TNTERM MESSAGE GENERATING/(161)
/				THINGS TO PLACE NODES ON TDV.EQ,/(161)
/				CONDITIONALIZE XFRCMD, INSTALL	/(161)
/				THE SINGLE UNIT ABORT CODE,	/(161)
/				MODIFY THE TTY HANDLER FOR TEST-/(161)
/				ING IT, MAKE THE NUMBER OF MA	/(161)
/				AND ASSEMBLY PARAMETER,		/(161)
/				INSTALL MCR TIMEOUT AS AN	/(161)
/				ASSEMBLY PARAMETER.		/(161)
/				MOVE MCR TO PAGE 1. MAKE SURE	/(161)
/				THAT THE RSX BOOTSTRAP CODE IS	/(161)
/				MODIFIED TO JMP INDIRECT THROUGH/(161)
/				R1.				/(161)
/ 162 	12-MAR-76 (RCHM)	MODIFY THE XQT DIRECTIVE FOR LUN/(162)
/				MAPPING. ALSO RESTRICT THE 	/(162)
/				SINGLE UNIT ABORT TO EXEC MODE 	/(162)
/				TASKS.				/(162)
/ 163	16-MAR-76 (RCHM)	DIDN'T GET THE SINGLE UNIT ABORT/(163)
/				RESTRICTION QUITE RIGHT.	/(163)
/ 164	16-MAR-76 (RCHM)	HAVE REQUEST CHECK THE RANGE OF	/(164)
/				THE LUN OFFSET IN THE MAPPED	/(164)
/				REQUEST. ALSO CHANGE DTC SO THAT/(164)
/				IT PROPERLY DECREMENTS THE LUN	/(164)
/				OFFSET SO THAT VIRTUAL LUN 2 	/(164)
/				GETS MAPPED INTO THE LUN	/(164)
/				REPRESENTED BY THE LUN OFFSET.	/(164)
/ 165	17-MAR-76 (RCHM)	FIX DMTQ SO THAT IT WILL NOT	/(165)
/				CHANGE THE TRANSFER PENDING	/(165)
/				IF IT IS CALLED FOR AN EXEC MODE/(165)
/				TASK.				/(165)
/ 166	18-MAR-76 (SCR)		MODIFY SKIP CHAIN LINKAGE TO TTY/(166)
/								/EAG:167
/ 167	19-MAR-76 (EAG)		ASSORTED MODIFICATIONS TO SPEED	/EAG:167
/				UP/SHORTEN/IMPROVE NADD, NDEL,	/EAG:167
/				PENP, PICK, ALAD, DLAD, SPRI,	/EAG:167
/				SNAM, AND IOCD.			/EAG:167
/				ADD NDELXR AND DQAB RE-ENTRANT	/EAG:167
/				ROUTINES.			/EAG:167
/				MODIFY CAL DISPATCH TO HANDLE	/EAG:167
/				INDIRECT AND/OR INDEXED CAL'S.	/EAG:167
/				MODIFY QUEUE I/O FOR REVISED	/EAG:167
/				SINGLE LUN ABORT AND TO NOT	/EAG:167
/				DECLARE A SIGNIFICANT EVENT	/EAG:167
/				IF HANDLER'S TRIGGER EVENT	/EAG:167
/				VARIABLE IS ALREADY NON-ZERO.	/EAG:167
/				REWRITE DQRQ, DQAB, AND DMTQ	/EAG:167
/				TO NOT CLOBBER SO MANY REGIS-	/EAG:167
/				TERS AND TO HANDLE MOST ABORT	/EAG:167
/				FUNCTIONS AUTOMATICALLY.	/EAG:167
/ 170	26-MAR-76 (SCR)		MINOR BUG FIX FOR 167		/(170)
/ 171	27-MAR-76 (SCR)		MINOR BUG FIX FOR 170		/(171)
/ 172	29-MAR-76 (RCHM)	TWO PROBLEMS WITH MULTIACCESS	/(172)
/				CODE.				/(172)
/				1. CLOCK MUST 0 LAST WORD OF REQ/(172)
/				   NODE TO AVOID SCREWING UP 	/(172)
/				   MAPPING.			/(172)
/				2. XFRCMD FORGOT TO ADD IN BASE	/(172)
/				   OF THE UCA AREA.		/(172)
/ 173	30-MAR-76 (RCHM)	EXEC MODE I/O RUNDOWN CHANGES.	/(173)
/				CHANGE S2 SO THAT IT WILL NOT	/(173)
/				HANG ON THE TASK ATTEMPTING TO	/(173)
/				CONSTRUCT AN I/O REQUEST TO THE	/(173)
/				DISK.				/(173)
/				CHANGE THE DEFINITION OF PENP	/(173)
/				SO THAT THE NODE ADDRESS IS	/(173)
/				IS RETURNED IN THE AC, R1, AND	/(173)
/				R2. THIS REMOVES A LOT OF CODE.	/(173)
/ 174	01-APR-76 (RCHM)	MAKE S2 TASK LOADING LOOK LIKE	/(174)
/				IT IS HAPPENING AT INTERRUPT	/(174)
/				LEVEL TO AVOID THE PROBLEMS WITH/(174)
/				VAJEX.				/(174)
/ 175	06-APR-76 (RCHM)	1. CHECK FOR INTERRUPT LEVEL I/O/(175)
/				   BEFORE ALLOWING LUN MAPPING	/(175)
/				   TO OCCUR.			/(175)
/				2. MODIFY UNMARK SCAN LOOP FOR	/(175)
/				   BETTER EFFICIENCY.		/(175)
/				3. MODIFY SOME COMMENTS TO	/(175)
/				   INCLUDE SOME OF THE NEW STUFF/(175)
/ 176	14-APR-76 (RCHM)	A BUG HAS APPEARED INVOLVING THE/(176)
/				MULTIPLE EXISTANCE OF A SMALL	/(176)
/				NODE. INCLUDE AN INTELLIGENT	/(176)
/				NODE SCANNER ON USER COMMAND	/(176)
/ 177	16-APR-76 (RCHM)	BUG IN THE XQT DIRECTIVE.	/(177)
/ 200	20-APR-76 (RCHM)	MORE OF 177.			/(200)
/ 201	27-APR-76 (RCHM)	CLEAN UP THE REST OF THE SCF	/(201)
/				INTERFACE BY NOT ALLOWING	/(201)
/				ASSEMBLY TIME NODE GENERATION IN/(201)
/				PAGE 1.				/(201)
/				ALSO TAKE OUT THE USRTAB	/(201)
/				ASSEMBLY PARAMETER.		/(201)
/								/EAG:202
/ 202	6-MAY-76 (EAG)		MODIFY QJOB DIRECTIVE FOR	/EAG:202
/				MULTIACCESS BATCH.  IN THE	/EAG:202
/				PROCESS, ADD SUBROUTINE		/EAG:202
/				"MAPLUN" AND MAKE Q I/O AND	/EAG:202
/				EXECUTE USE IT.			/EAG:202
/				ALSO ADD "L.ALL" SELECTIVE	/EAG:202
/				LISTING PARAMETER.		/EAG:202
/				ALSO FIX THE CONDITIONALS	/EAG:202
/				WHICH VERIFY THE LEGALITY OF	/EAG:202
/				VARIOUS CONDITIONAL ASSEMBLY	/EAG:202
/				PARAMETERS.			/EAG:202
/								/EAG:202
/ 203	13-MAY-76 (EAG)		TYPE IN SOME FIXES REQUESTED	/EAG:203
/				BY OTHER PEOPLE.  FIXES ARE TO	/EAG:203
/				EXECUTE AND REQUEST MAPPED	/EAG:203
/				DIRECTIVES.  ALSO DEFINE	/EAG:203
/				LOCATION "DEBUG" IN SCOM.	/EAG:203
/								/EAG:203
/ 204	14-MAY-76 (MJH)		CHANGE TIME SLICING ROUTINE AND
/				ASSOCIATED SCOM (320). ALSO FIX
/				BUG IN S.R. SCHINT AND TUNE
/				CONTEXT SWITCHING FOR NRM TASKS..
/ 205	17-MAY-76 (RCHM)	FIX A POSSIBLE BUG IN FIX	/(205)
/				AND A DEFINITE BUG IN XQT	/(205)
/				DIRECTIVES.			/(205)
/ 206	19-MAY-76 (RCHM)	INSTALL THE RSX LIGHT SHOW.	/(206)
/				ALSO MODIFY THE WAY QJOB KNOWS	/(206)
/				ABOUT THE MAXIMUM NUMBER OF	/(206)
/				JOBS IN THE QUE.		/(206)
/ 207	14-MAY-76 (RCHM)	THERE IS A SUBTLE PROBLEM WHICH	/(207)
/				EXISTS IF A JOB HAVING MORE THAN/(207)
/				ONE LUN ATTACHED TO THE SAME	/(207)
/				DEVICE. THE REVISION OF ATDT	/(207)
/				ALLOWS ONLY ONE LUN/DEVICE TO BE/(207)
/				ATTACHED TO EACH DEVICE.	/(207)
/ 210	30-JUL-76 (RCHM)	FIX COMMENTS IN QUEUOB DIRECTIVE/(210)
/				AND PROBLEM WITH VAJX.		/(210)
/ 211	09-AUG-76 (RCHM)	FIX RACE CONDITION BETWEEN	/(211)
/				TIME SLICER AND THE EXIT PROC-	/(211)
/				ESSER.				/(211)
/ 212 	12-AUG-76 (RCHM)	FIX ASSEMBLY PROBLEM WITH THE 	/(212)
/				"NOMAC" VERSION OF RSX.		/(212)
/ 213	27 APR 77 (JMW)		SAVE GUARD BIT WITH FP15 REG'S	/(213)
/	23 NOV 77 (PDH)		MAKE CHANGES TO ALLOW FOR I/O	/(213)
/				COUNT IN ACCOUNTING ROUTINES.	/(213)
/				READ ACSW'S AT SIGNIFICANT EVENT/(213)
/	19 DEC 77 (PDH)		HAVE TASK TIMING ROUTINE SAVE	/(214)
/				UIC AS WELL AS OTHER THINGS.	/(214)
/				ALSO LOOKS LIKE A GOOD IDEA TO	/(214)
/				ZERO THE I/O COUNT WHEN WE	/(214)
/				INITIATE A NEW TASK		/(214)
/ XVM/RSX		30-DEC-75		S. REESE
/                                               D. BREVIK
/						B. LACROUTE
/						R. MCLEAN
/						C. PROTEAU
/                                               H. KREJCI
/						B. DESIMONE
/          		         		D. VELTEN
/			         		M. HEBENSTREIT
/			       			S. ROOT
/						R. MUNROE
/
/ NOTE: ASSEMBLING RSX.P1 160 WITH RSX.P2 161 DEFINES
/	VERSION 1A OF THE XVM/RSX EXECUTIVE.
/ 
	.ABSP	NLD
/
/ CONDITIONAL ASSEMBLY PARAMETERS
/
	.IFUND L.ALL						/EAG:202
	.NOLST							/EAG:202
	.ENDC							/EAG:202
/								/EAG:202
	.DEC
	.IFUND .PASSN						/(161)
.PASSN=-1							/(161)
	.ENDC							/(161)
.PASSN=.PASSN+1							/(161)
	.IFUND MCRTMO						/(161)
MCRTMO=30		/ DEFAULT IS 30 SECOND MCR TIMEOUT	/(175)
	.ENDC							/(161)
	.IFPNZ MCRTMO						/(161)
	.IFNEG MCRTMO-15					/(161)
	.LST							/EAG:202
	.END MCR TIMEOUT INTERVAL MUST BE >= 15 SECONDS.	/(175)
	.ENDC							/(161)
	.ENDC							/(161)
	.IFZER .PASSN						/(161)
MCRTMO=MCRTMO*4		/ TIME OUT INTERVAL IN 1/4 SECONDS.	/(161)
	.ENDC							/(161)
	.IFUND MA.NLU						/(161)
MA.NLU=25		/ DEFAULT NUMBER OF MULTIACCESS LUNS.	/(161)
	.ENDC							/(161)
	.IFNEG MA.NLU-25					/(161)
	.LST							/EAG:202
	.END MA.NLU MUST BE >= 25 (DECIMAL)			/EAG:202
	.ENDC							/(161)
	.IFPOZ MA.LUN-512					/(161)
	.LST							/EAG:202
	.END MA.NLU MUST BE < 512 (DECIMAL)			/EAG:202
	.ENDC							/(161)
/
	.IFUND	NLU	/NUMBER OF LOGICAL (I/O) UNITS
NLU=64			/DEFAULT: 64
	.ENDC
	.IFNEG	NLU-22
	.LST							/EAG:202
	.END NLU MUST BE >= 22 (DECIMAL)			/EAG:202
	.ENDC
	.IFPNZ MA.NLU-NLU					/(161)
	.LST							/EAG:202
	.END NLU MUST BE >= MA.NLU				/EAG:202
	.ENDC							/(161)
/
	.IFUND	TTYS	/MAX NUMBER OF TTY'S
TTYS=6			/DEFAULT: 6
	.ENDC
	.IFNEG	TTYS-1
	.LST							/EAG:202
	.END TTYS MUST BE >= 1					/EAG:202
	.ENDC
	.IFPNZ	TTYS-17
	.LST							/EAG:202
	.END TTYS MUST BE <= 17 (DECIMAL)			/EAG:202
	.ENDC
/
	.IFUND	NDSZ	/LIST NODE SIZE
NDSZ=10
	.ENDC
	.IFNEG	NDSZ-10
	.LST							/EAG:202
	.END NDSZ MUST BE >= 10 (DECIMAL)			/EAG:202
	.ENDC
/
	.IFUND	DSKMA	/MAX NUMBER OF DSK I/O ATTEMPTS (IN CASE OF ERR)
DSKMA=8
	.ENDC
/
	.IFUND QJBLMT	/ MAXIMUM NUMBER OF JOBS QUEUE TO BATCH	/EAG:202
	.IFUND NOMAC	/ ONLY DEFINE IF MULTIACCESS.		/EAG:202
QJBLMT=15							/EAG:202
	.ENDC							/EAG:202
	.ENDC							/EAG:202
/								/EAG:202
	.IFDEF NOMAC						/EAG:202
	.IFDEF QJBLMT						/EAG:202
	.LST							/EAG:202
	.END QJBLMT IS INAPPLICABLE WITHOUT MULTIACCESS		/EAG:202
	.ENDC							/EAG:202
	.ENDC							/EAG:202
/								/EAG:202
	.OCT
/								/EAG:202
	.IFUND L.ALL						/EAG:202
	.LST							/EAG:202
	.ENDC							/EAG:202
/
/ DEFINING 'NOXM' PRODUCES A VERSION IN WHICH THE CODE
/ OCCUPIED BY THE SHARE DIRECTIVE AND TASK TIMING ROUTINE
/ IS REPLACED BY SMALL NODES.
/
/ DEFINING 'NOMAC' PRODUCES A VERSION OF THE EXECUTIVE WHICH	/(161)
/ WILL HAVE THE OLD TDV AND XFRCMD PROCESSORS. THE LUN MAPPING	/(161)
/ FACILITY WILL STILL BE IN EXISTENCE BUT THE USER NUMBER	/(161)
/ PROCESSING WILL BE DISABLED.					/(161)
/								/(161)
/								/(161)
/ THE PARAMETER "MCRTMO" IS SET TO 0 TO CONDITIONILIZE OUT THE	/(161)
/ MCR TIMEOUT CODE. IF IT IS SET TO ANY POSITIVE NON-ZERO NUMBER/(161)
/ GREATER THAN 15 IT IS THEN THE NUMBER OF SECONDS BETWEEN	/(161)
/ CHARACTERS THAT THE USER IS ALLOWED BEFORE MCR TIME OUT OCCURS/(161)
/								/(176)
/ THE PARAMETER %QDBG WILL CAUSE EACH REFERENCE NADD, SPRI, AND	/(176)
/ THE CLOCK QUEUE ROUTINES TO VERIFY THAT THE NODE TO BE ADDED	/(176)
/ DOES NOT ALREADY EXIST IN ANY NODE POOL. IF IT DOES, THE	/(176)
/ DEBUGGING CODE WILL HALT. THIS CODE WILL DEGRADE THE 		/(176)
/ PERFORMANCE OF RSX CONSIDERABLY AND MAY NOT BE EFFECTIVE IN	/(176)
/ THE DISCOVERY OF TIMING HACKS. IT IS BEING INCLUDED AS A	/(176)
/ IN HOUSE TESTING MECHANISM AND IS NOT RECOMMENDED FOR GENERAL	/(176)
/ USE.								/(176)
/								/(161)
/ THE PARAMETER "QJBLMT" SPECIFIES THE MAXIMUM NUMBER OF BATCH	/EAG:202
/ JOBS WHICH MAY BE QUEUED AT ANY ONE TIME.  THIS PARAMETER	/EAG:202
/ IS APPLICABLE ONLY TO MULTIACCESS BATCH, AND MUST NOT		/EAG:202
/ BE DEFINED WHEN NOMAC IS DEFINED.  ITS DEFAULT VALUE IS	/EAG:202
/ 15 (DECIMAL), WHICH IMPLIES THAT 15 JOBS MAY BE IN THE	/EAG:202
/ QUEUE AT ANY ONE TIME.  EACH JOB REQUIRES 2 SMALL NODES	/EAG:202
/ WHILE IT IS QUEUED.  IF THIS PARAMETER IS SET ZERO OR		/EAG:202
/ NEGATIVE IT IMPLIES THAT NO JOBS MAY BE QUEUED, SO BATCH	/EAG:202
/ WILL BE EXCLUDED FROM THE EXECUTIVE.				/EAG:202
/								/EAG:202
/								/(206)
/ DEFINING THE PARAMETER "LIGHTS" WILL REPLACE THE EXISTING	/(206)
/ IDLE LOOP WITH A LIGHT SHOW WHICH DISPLAYS IN THE AC, MQ,	/(206)
/ XR, AND LR. THIS LIGHT SHOW IS MODIFIABBLE BY APPROPRIATE	/(206)
/ USE OF THE SCOM LOCATIONS "PATRN", "CENTR", "LMAGIC", "RIGHT"	/(206)
/ AND "LEFT". THE LIGHT SHOW ALGORITHM IS A COLLABRATION OF	/(206)
/ STEVE ROOT, DICK MUNROE, AND ED GARDNER.			/(206)
/								/(206)
 .TITLE *** SELECTIVE LISTING PARAMETERS
/
/ TO LIST ONLY SELECTIVE PORTION, DEFINE "L.SEL" AND ONE OR MORE OF THE
/ FOLLOWING PARAMETERS TO INDICATE DESIRED LISTING SECTIONS.
/
/	L.SCOM	SYSTEM COMMUNICATIONS AND INTERRUPT DISPATCH
/	L.DIR	SYSTEM DIRECTIVES
/	L.SER	SIGNIFICANT EVENT RECOGNITION AND SAVE & RESTORE
/	L.RER	RE-ENTRANT SYSTEM ROUTINES
/	L.MAC	MEMORY PROTECT, CLOCK INTERRUPT SERVICE,  
/		I/O RUNDOWN TASK, & TIME SLICING SUBROUTINE
/	L.MCR	MCR AND TDV DISPATCH ROUTINES
/	L.DSK	DISK DRIVER
/	L.TTY	MULTI-TTY HANDLER
/	L.LUN	LUN & ATTACH TABLES
/	L.SCF	SYSTEM COMFIGURATION ROUTINE
/
/ DEFINE "L.ALL" TO HAVE ENTIRE ASSEMBLY LISTED, INCLUDING	/EAG:202
/ CRUFT WHICH IS NORMALLY LEFT OUT.  DEFINING L.ALL OVERRIDES	/EAG:202
/ THE CONDITIONAL LISTING STUFF DESCRIBED ABOVE.		/EAG:202
/								/EAG:202
/ NORMALLY, CODE WHICH IS OF LITTLE OR NO INTEREST WILL NOT	/EAG:202
/ BE LISTED.  THIS CODE INCLUDES LITERALS, NODE POOLS, AND	/EAG:202
/ SOME CONDITIONALIZED CODE WHICH IS NOT BEING ASSEMBLED.	/EAG:202
/ IF THIS CODE IS TO BE LISTED, DEFINE THE PARAMETER "L.ALL".	/EAG:202
/ DEFINING THIS PARAMETER ALSO INHIBITS SELECTIVE LISTING --	/EAG:202
/ I.E., IT INHIBITS THE ACTION OF L.SEL DESCRIBED ABOVE.	/EAG:202
/								/EAG:202
	.IFUND	L.SEL
L.SCOM=0
L.DIR=0
L.SER=0
L.RER=0
L.MAC=0
L.MCR=0
L.DSK=0
L.TTY=0
L.LUN=0
L.SCF=0
	.ENDC
/
	.IFDEF L.ALL						/EAG:202
L.SCOM=0							/EAG:202
L.DIR=0								/EAG:202
L.SER=0								/EAG:202
L.RER=0								/EAG:202
L.MAC=0								/EAG:202
L.MCR=0								/EAG:202
L.DSK=0								/EAG:202
L.TTY=0								/EAG:202
L.LUN=0								/EAG:202
L.SCF=0								/EAG:202
	.ENDC							/EAG:202
/								/EAG:202
	.IFUND	L.SCOM
	.NOLST
	.ENDC
 .TITLE *** GLOSSARY
/
/   ATL		ACTIVE TASK LIST (DEQUE)
/   CPB		CAL PARAMETER BLOCK
/   EV		EVENT VARIABLE
/   EV ADR	ADDRESS OF EVENT VARIABLE
/   LUN		LOGICAL UNIT NUMBER
/   PBDL	PARTITION BLOCK DEFINITIONS (DEQUE)
/   PDVL	PHYSICAL DEVICE LIST (DEQUE)
/   SCDL	SYSTEM COMMON BLOCK DEFINITIONS (DEQUE)
/   SCOM	SYSTEM COMMUNICATIONS AREA
/   SCF		SYSTEM CONFIGURATION ROUTINE
/   STL		SYSTEM TASK LIST (DEQUE)
/   TDV.EQ	TASK DEVELOPMENT EXIT QUE (DEQUE)		/(161)
/   UCA		MULTIACCESS USER CONTEXT AREA			/(161)
	.TITLE *** API LEVEL USAGE
/
/ 1.  API INTERRUPTS FROM LEVELS 0-3 ORIGINATE FROM HARDWARE ONLY. THE TTY
/     HANDLER CHECKS FOR SERVICEABLE KEYBOARD AND PRINTER INTERRUPTS AT API
/     LEVEL 3 TO PREVENT GETTING INTERRUPTED IN THE MIDDLE OF THE TEST.
/     SIMILARLY, THE SYNCRONIZE,RUN,SCHEDULE,CANCEL,MARK, AND UNMARK CALS
/     ACTIVATE API LEVEL 3 TEMPORARILY DURING THEIR EXECUTION.
/
/ 2.  API LEVEL 4 IS ACTIVATED BY HARDWARE WHENEVER A CAL IS ISSUED
/     PROVIDED THAT NO HARDWARE API LEVELS ARE ACTIVE, I.E. API LEVELS 0-3.
/     HENCE, API LEVEL 4 IS ACTIVATED WHENEVER A TASK ISSUES A CAL.
/
/ 3.  API LEVEL 5 IS ACTIVE ONLY WHEN SCF IS CHECKING FOR THE RE-ENTRANT
/     ECO PACKAGE.
/
/ 4.  API LEVEL 6 IS USED TO DECLARE A SIGNIFICANT EVENT. WHEN NO TASK IS 
/     RUNNING (I.E. SYSTEM IS IDLE OR THE EXEC IS WORKING IN A RESTARTABLE
/     MODE, VIZ. SCANNING THE ATL) AND A SIGNIFICANT EVENT IS DECLARED BY
/     AN INTERRUPT SERVICE ROUTINE, THE EXEC DROPS TO API LEVEL 7 AND SCANS
/     THE ATL FROM THE TOP. WHEN A TASK IS RUNNING AND A SIGNIFICANT EVENT
/     IS DECLARED, THE TASK'S REGISTERS ARE SAVED AT API LEVEL 6, THEN THE
/     EXEC DROPS TO API LEVEL 7 AND SCANS THE ATL FROM THE TOP. DURING THE
/     ATL SCAN LEVEL 6 IS ACTIVATED AT S2, WHEN A NODE IS INSERTED INTO THE ATL,
/     AND AT S4 AND S5, WHEN A TASK IS DECLARED TO BE CURRENT. A TASK'S
/     REGISTERS ARE RESTORED AT API LEVEL 6 WHENEVER THE TASK RESUMES
/     EXECUTION.
/
/ 5.  API LEVEL 7 IS ACTIVE WHEN THE EXEC IS SCANNING THE ATL OR WHEN A
/     TASK IS RUNNING.
/
/ 6.  NO API LEVELS ARE ACTIVE (MAINSTREAM) WHEN THE SYSTEM IS IDLE.
/
 .TITLE *** FORMAT & CONVENTION DESCRIPTIONS
  
  
/ SYSTEM TASK LIST
/
/ THE SYSTEM TASK LIST (STL) IS A DIRECTORY OF TASKS IN THE SYSTEM.
/
/ THE SYSTEM TASK LIST IS MAINTAINED BY THE MCR (MONITOR
/ CONSOLE ROUTINE).  "INSTALL" ADDS ENTRIES, "REMOVE" REMOVES THEM.
/
/ THE STL IS SCANNED (FOR TASK NAME) BY THE "INSTALL" MCR FUNCTION,
/ AND BY THE "REQUEST" DIRECTIVE.  SINCE "INSTALL" AND "REMOVE" ARE
/ BOTH MCR FUNCTIONS AND RUN AT THE SAME PRIORITY LEVEL (AND NORMALLY
/ WITHIN THE SAME CORE PARTITION), THERE IS NO DANGER OF "REMOVE" 
/ REMOVING A NODE DURING AN STL SCAN BY "INSTALL".  ALSO, SINCE
/ "REQUEST" IS A DIRECTIVE (RUNS @ API-4) AND CANNOT BE INTERRUPTED
/ FOR TASK EXECUTION, THERE IS NO DANGER OF "REMOVE" REMOVING A
/ NODE DURING AN STL SCAN BY "REQUEST".
/
/ NOTE -- THE "DANGER" OF A SCAN BEING INTERRUPTED AND A NODE BEING
/ REMOVED IS THAT THE NODE THAT IS REMOVED COULD ALSO BE THE NODE
/ UNDER EXAMINATION IN THE SCAN.  NOT ONLY MIGHT THE NODE CONTENTS
/ BE ALTERED (THUS AFFECTING THE SCAN), BUT THE NODE MAY ALSO BE
/ ADDED TO ANOTHER DEQUE (VIZ., RETURNED TO THE POOL) AND THE SCAN
/ WOULD THEN CONTINUE THRU THE WRONG DEQUE!
/
/ EACH STL ENTRY CONSISTS OF A DEQUE NODE OF THE FOLLOWING FORMAT:
/
/ WORD	 CONTENTS
/
S.FP=0	/FORWARD LINKAGE
S.BP=1	/BACKWARD LINKAGE
S.N1=2	/TASK NAME (FIRST HALF)
S.N2=3	/TASK NAME (SECOND HALF)
S.DP=4	/FLAGS & DEFAULT PRIORITY
S.PB=5	/PARTITION BLOCK ADDRESS
S.DA=6	/DISK ADDRESS & UNIT (SEE NOTE BELOW)
S.DB=7	/SIZE OF RESIDENT CODE (DISK TRANSFER LENGTH)
S.TS=10	/TASK SIZE (SEE NOTE BELOW)
S.EP=11	/TASK ENTRY POINT
/
/ NOTES --
/
/ TASK NAME IS IN .SIXBT FORMAT (RIGHT FILLED WITH ZEROS)
/
/ FLAGS & DEFAULT PRIORITY WORD FORMAT
/   BIT-0  SET TO INDICATE "TASK IS ACTIVE"
/   BIT-1  SET TO INDICATE "REMOVE ON EXIT" 
/   BIT-2  SET TO INDICATE "TASK DISABLED"
/   BIT-3  SET TO INDICATE "TASK FIXED IN CORE"
/   BIT-4  SET TO INDICATE "PARTITION LOST IN RECONFIGURATION"
/   BIT-5  SET TO INDICATE "RECONFIGURATION IN PROGRESS"
/   BIT-6  SET TO INDICATE "TASK HAS EXITTED"
/   BIT-7  (UNUSED FLAG)
/   BITS 8-17  DEFAULT PRIORITY
/
/ THE "DISK ADDRESS" POINTS TO THE BEGINNING OF THE TASK'S 
/ IMAGE AS RECORDED ON THE DISK.
/ THE DISK UNIT (PLATTER) NUMBER IS OR'ED INTO THE LOW ORDER THREE
/ BITS OF THE ACTUAL DISK ADDRESS.
/
/ THE TASK SIZE REPRESENTS THE CORE REQUIRED TO RUN THE TASK.  FOR
/ AN EXEC MODE TASK WITH NO OVERLAYS THIS IS THE SAME AS WORD 'S.DB'.
/ FOR A NORMAL MODE TASK, DUE TO THE MEMORY PROTECT INCREMENT, THE
/ SIZE IS A MULTIPLE OF 400 OCTAL.
/ FOR NORMAL MODE TASKS BITS 10-13 OF 'S.TS', WHICH WOULD
/ ORDINARILY BE ZERO, ARE USED TO STORE THE MM REGISTER DATA.
/ THIS WORD WILL HAVE THE FOLLOWING FORMAT FOR NORMAL MODE TASKS:
/
/   BITS 0-9 -- TASK SIZE
/   BIT-10   -- RESERVED FOR RELOCATE DISABLE (NOT IMPLEMENTED)
/   BITS 11-12 -- SET IF TASK RUNS IN XVM MODE (WIDE INDIRECT ADDRESS)
/   BIT-13     -- SET IF TASK HAS IOT PERMISSION
/   BITS 14-17 -- UNUSED
/
/ THE ENTRY POINT WORD IS OF THE FOLLOWING FORMAT:
/   BIT-0 -- INITIAL LINK CONTENTS (ZERO IF THE TASK WAS BUILT NOT
/	     REQUIRING THE FLOATING POINT HARDWARE; 1 IF THE TASK
/	     REQUIRES THE EXISTENCE OF THE FP15)
/   BIT-1 -- PAGE/BANK MODE INDICATOR (0/1)
/   BIT-2 -- EXEC/NORMAL MODE INDICATOR (0/1)
/   BITS 3-17 -- TASK ENTRY POINT (ABSOLUTE ADDRESS IF EXEC MODE,
/                RELATIVE TO PARTITION BASE IF NORMAL MODE).
/
	.EJECT
/ ACTIVE TASK LIST
/
/ THE ACTIVE TASK LIST (ATL) IS A PRIORITY ORDERED LIST OF ACTIVE
/ TASKS.  AN ACTIVE TASK IS A TASK THAT HAS BEEN REQUESTED.
/ (AN ACTIVE TASK MIGHT NOT BE RUNNING BECAUSE:  IT IS NOT YET IN CORE,
/ A HIGHER PRIORITY TASK IS RUNNING, IT HAS ISSUED A "SUSPEND" OR "WAIT")
/ A TASK IS REQUESTED VIA THE "REQUEST" DIRECTIVE, OR IT IS SCHEDULED
/ (RUN, SCHEDULE, OR SYNC, DIRECTIVES) AND IS REQUESTED WHEN IT BECOMES DUE.
/
/ "REQUEST" INSERTS ATL NODES (PER PRIORITY), AND "EXIT" REMOVES ATL
/ NODES.
/
/ THE ATL IS SCANNED BY THE "REQUEST" DIRECTIVE (FOR PRIORITY), BY THE
/ "RESUME" DIRECTIVE (FOR TASK NAME), AND BY THE "EXECUTIVE" (TO EXAMINE 
/ TASK STATUS).  "EXIT" IS A DIRECTIVE WHICH MAY ONLY
/ BE ISSUED FROM A TASK (RUNS @ API-7).  I.E., AN "EXIT" CANNOT BE
/ ISSUED WHILE A "REQUEST" OR "RESUME" DIRECTIVE, OR THE "EXECUTIVE"
/ IS RUNNING.  THEREFORE, THERE IS NO DANGER OF "EXIT" REMOVING A NODE
/ DURING AN ATL SCAN BY "REQUEST", "RESUME", OR "EXECUTIVE".
/
/ EACH ATL ENTRY CONSISTS OF A DEQUE NODE OF THE FOLLOWING FORMAT:
/
/ THE FOLLOWING ATL NODE FORMAT IS ASSUMED BY:
/   THE 'REQUEST' CAL SERVICE ROUTINE AND THE CLOCK INTERRUPT SERVICE ROUTINE
/
/ WORD	 CONTENTS
/
A.FP=0	/FORWARD LINKAGE
A.BP=1	/BACKWARD LINKAGE
A.N1=2	/TASK NAME (FIRST HALF)
A.N2=3	/TASK NAME (SECOND HALF)
A.TP=4	/TASK PRIORITY
A.PB=5	/PARTITION BLOCK ADDRESS
A.SN=6	/STL NODE ADDRESS
A.TS=7	/FLAGS & TASK STATUS
A.RA=10	/START OR RESUMPTION ADDRESS
A.EV=11	/EVENT VARIABLE ADDRESS (TASK LOADING OR 'WAITFOR' DIRECTIVE)
	/ OR LUN OFFSET AND USER NUMBER.			/(161)
/
/ NOTES --
/
/ FLAGS (BITS 0-8)
/   BIT-0  TASK LOADING FLAG
/   BITS 1-8  (UNUSED)
/
/ TASK STATUS DEFINITIONS (BITS 9-17)
/   0 -- NOT TO BE RESCHEDULED
/   1 -- TASK IS DISK RESIDENT AND NEEDS PARTITION
/   2 -- PARTITION IS AVAILABLE, SETUP DISK READ REQUEST
/   3 -- WAITING FOR EVENT VARIABLE
/   4 -- TASK IS READY TO BE STARTED OR RESUMED (WAIT OR SUSPEND)
/   5 -- TASK IS RUNNING, IF INTERRUPTED ITS REGISTERS MUST BE RESTORED
/   6 -- TASK HAS BEEN [SELF] SUSPENDED
/   7 -- TASK EXECUTION HAS BEEN STOPPED FOR TIME SLICING
/
/ THE START OR RESUMPTION ADDRESS CONTAINS THE TASK ENTRY POINT FOR:
/ INITIAL ENTRY, RESTART AFTER WAIT, OR RESUME AFTER SUSPEND, AND
/ IS OF THE FOLLOWING FORMAT:
/   BIT-0 -- LINK CONTENTS
/   BIT-1 -- PAGE/BANK MODE INDICATOR (0/1)
/   BIT-2 -- EXEC/NORMAL MODE INDICATOR (0/1)
/   BITS 3-17 -- START OR RESUMPTION ADDRESS (ABSOLUTE IF EXEC MODE,
/                RELATIVE TO PARTITION BASE IF NORMAL MODE).
/
/ IF THE TASK IS IN STATE 1, I.E. WAITING FOR A PARTITION, THEN	/(161)
/ A.EV WILL CONTAIN THE LUN OFFSET (BITS 0-8) AND THE USER	/(161)
/ NUMBER (BITS 9-13) AS INITIALIZED BY A REQUEST MAPPED. FIX	/(161)
/ AND NORMAL REQUEST WILL ZERO THIS WORD.			/(161)
	.EJECT
/ CLOCK QUEUE
/
/ WHENEVER SOMETHING IS TO BE SCHEDULED AT SOME TIME IN THE
/ FUTURE (SCHEDULE, RUN, SYNC & MARK DIRECTIVES), AN ENTRY IS
/ MADE IN THE CLOCK QUEUE.  THE CLOCK QUEUE IS A STANDARD
/ DEQUE WITH ENTRIES CHRONOLOGICALLY MADE.  THE SCHEDULE
/ TIME IN ALL NODES, EXCEPT THE FIRST NODE, IS RELATIVE TO
/ THE PREVIOUS NODE.  THE SCHEDULE TIME IN THE FIRST NODE
/ IS RELATIVE TO "NOW" AND IS DECREMENTED AND EXAMINED
/ AT EACH CLOCK TICK.
/
/ CLOCK QUEUE NODES ARE OF THE FOLLOWING FORMAT:
/
C.FP=0	/FORWARD LINKAGE
C.BP=1	/BACKWARD LINKAGE
C.TI=2	/TYPE INDICATOR [TS,MT]
C.MD=3	/ UNUSED.						/(175)
C.PE=4	/PRIORITY [TS] OR EVENT VAR ADR [MT]
C.SP=5	/STL NODE ADR [TS] OR PARTITION BLOCK ADR [MT]
C.SS=6	/SCHEDULE INTERVAL SECONDS [TS,MT]
C.ST=7	/SCHEDULE INTERVAL TICKS [TS,MT]
C.RS=10	/RESCHEDULE INTERVAL SECONDS [TS]
C.RT=11	/RESCHEDULE INTERVAL TICKS [TS]
/
/		TS -- TASK SCHEDULING USAGE
/		MT -- MARK TIME USAGE
/
/ THE TYPE INDICATOR IS SET TO INDICATE THE FOLLOWING
/   0 -- TASK SCHEDULING WITH NO RESCHEDULING
/   1 -- TASK SCHEDULING WITH RESCHEDULING
/   5 -- MARK TIME
/   6 -- NULL NODE (RESULT OF CANCELLATION)
/
/ MODE INDICATOR (C.MD):					/(175)
/   FORMERLY 0 = EXEC MODE; NON-0 = NORMAL MODE			/(175)
/   CURRENTLY UNUSED.						/(175)
/
/ THE "SCHEDULE TICKS" IS ONLY ZERO WHEN A NODE IS TO "COME DUE"
/ AT THE SAME TIME AS THE PREVIOUS NODE.  IT IS NEVER GREATER
/ THAN THE NUMBER OF TICKS PER SECOND.  WHEN AN INTERVAL OF
/ MORE THAN ONE SECOND IS REPRESENTED, THE "SCHEDULE SECONDS"
/ INDICATES THE NUMBER OF ADDITIONAL SECONDS.  BOTH THE SCHEDULE
/ TICKS AND SECONDS ARE RECORDED AS TWO'S COMP NEGATIVE NUMBERS.
/ THIS FORMAT HAS BEEN ESTABLISHED FOR THE CONVENIENCE OF THE CLOCK
/ INTERRUPT SERVICE ROUTINE.
/
/ THE RESCHEDULE SECONDS & TICKS ARE THE SCHEDULE RESET VALUES
/ WHEN PERIODIC TASK RESCHEDULING HAS BEEN REQUESTED.  BOTH ARE
/ RECORDED AS POSITIVE NUMBERS.
/
/ NOTE: THE UNMARK AND CANCEL DIRECTIVES DO NOT REMOVE ENTRIES
/ FROM THE CLOCK QUEUE. ENTRIES ARE REMOVED ONLY BY THE CLOCK
/ INTERRUPT SERVICE ROUTINE WHEN A REQUEST COMES DUE.  THESE
/ DIRECTIVES ONLY NULLIFY CKQ ENTRIES.
/
	.EJECT
/ PARTITION BLOCK DESCRIPTION LIST
/
/ FOR EACH PARTITION IN THE SYSTEM, THERE IS A NODE (PBSZ WORDS LONG)
/ CONTAINING INFORMATION ABOUT THE PARTITION, THE TASK CURRENTLY RUNNING
/ IN THE PARTITION, AND A SAVE AREA FOR THAT TASK'S REGISTER CONTENTS
/ WHENEVER THE EXECUTIVE INTERRUPTS THE TASK.
/
/ THESE NODES ARE LINKED TOGETHER AS THE PARTITIONS BLOCK DESCRIPTION
/ LIST (PBDL) WITH LISTHEAD IN THE SYSTEM COMMUNICATION AREA.
/
/ ***************************************************************
/								*
/ NOTE -- ANY CHANGES TO THE FORMAT OF THE PARTITION BLOCK NODE *
/ MUST BE REFLECTED IN THE CODE IN "SCF" FOLLOWING SCF101	*
/ WHERE THE NODES ARE SET UP, AND IN THE RECONFIGURATOR.        *
/								*
/ ***************************************************************
/
/ THE FORMAT OF A PARTITION BLOCK IS AS FOLLOWS:
/
/ WORD	 	CONTENTS
/
P.FP=0		/FORWARD LINKAGE
		/BACKWARD LINKAGE
P.N1=2		/PARTITION NAME (FIRST HALF)
P.N2=3		/PARTITION NAME (SECOND HALF)
P.BA=4		/PARTITION BASE (ADDRESS)
P.SZ=5		/PARTITION SIZE
P.TS=6		/TASK SIZE
P.TP=7		/COUNT OF PENDING TRANSFERS TO THE PARTITION
P.FW=10		/FLAGS WORD
P.VS=11		/PARTITION'S VIRTUAL SIZE
P.BP=12		/0 OR 17-BIT ADDRESS OF 1ST I/O BUFFER IN THE PARTITION
		/ADDRESS OF 'SAV'
P.IC=14		/INTERRUPT 'CONNECT' LOCATION
		/'DBA' INSTRUCTION
		/JMS TO 'SAV' (JMS* .-3)
P.AC=17		/AC BUFFER
P.XR=P.AC+1	/XR BUFFER
P.LR=P.XR+1	/LR BUFFER  	**
P.MQ=P.LR+1	/MQ BUFFER  	**
P.SC=P.MQ+1	/SC BUFFER  	**
P.R1=P.SC+1	/R1 BUFFER	**
P.R2=P.R1+1	/R2 BUFFER	**
P.R3=P.R2+1	/R3 BUFFER	***
P.R4=P.R3+1	/R4 BUFFER	***
P.R5=P.R4+1	/R5 BUFFER
P.R6=P.R5+1	/R6 BUFFER
P.10=P.R6+1	/X10 BUFFER
P.11=P.10+1	/X11 BUFFER
P.12=P.11+1	/X12 BUFFER
P.13=P.12+1	/X13 BUFFER
P.14=P.13+1	/X14 BUFFER
P.15=P.14+1	/X15 BUFFER
P.16=P.15+1	/X16 BUFFER
P.17=P.16+1	/X17 BUFFER
P.20=P.17+1	/L20 BUFFER
P.SW=P.20+1	/SWITCH		****
P.MM=P.SW+1	/MM BUFFER
P.C1=P.MM+1	/XM CLOCK OVERFLOWS
P.C2=P.C1+1	/XM CLOCK TICKS
P.TC=P.C2+1	/TASK USE COUNT (POSITION RELIED ON BY REMOVE)	/(161)
P.UP=P.TC+1	/TASK USE COUNT POINTER
P.FB=P.UP+1	/EPA		******
		/FMA1		******
		/FMA2		******
P.FM=P.FB+3	/FMQ1		******
		/FMQ2		******
P.JE=P.FB+5	/JEA		******
P.IO=P.JE+1	/I/O COUNT LOCATION				/(213)
P.FE=P.FB+5
/
/ ** THIS AREA OF PARTITION BLOCK IS USED FOR AN EVENT VARIABLE AND
/    A DISK GET CONTROL TABLE WHEN LOADING A DISK RESIDENT TASK INTO
/    THE CORRESPONDING PARTITION.
/
P.EV=P.LR	/EVENT VARIABLE
P.DU=P.EV+1	/DISK UNIT
P.DA=P.DU+1	/DISK ADDRESS
P.CA=P.DA+1	/CORE ADDRESS
P.WC=P.CA+1	/WORD COUNT
/
/ *** THIS AREA OF PARTITION BLOCK IS USED TO ZERO THE TASK'S
/     PARTITION EXCEPT THE DISK LOAD AREA PRIOR TO TASK EXECUTION.
/
P.Z1=P.R3	/ZEROING POINTER (ALSO USED AS A FLAG)
P.Z2=P.Z1+1	/COUNTER FOR WORDS ZEROED
/
/ ****  THIS WORD IS A 'SKP' FOR PARTITION BLOCKS AND A 'NOP' FOR
/       INTERRUPT SERVICE ROUTINES.  IF AN INTERRUPT SERVICE ROUTINE
/       IS TO USE THE REGISTER SAVE ROUTINE, IT MUST HAVE AN ENTRY
/       AND A BUFFER IDENTICAL TO A PARTITION BLOCK BETWEEN THE
/       WORDS 'P.IC' AND 'P.SW'.  AFTER REGISTERS ARE SAVED FOR AN
/       INTERRUPT SERVICE ROUTINE, CONTROL IS TRANSFERRED TO THE WORD
/       FOLLOWING 'P.SW'.
/
P.IS=P.SW+1	/INTERRUPT SERVICE ROUTINE
/
/ ****** THIS BUFFER FOR THE FLOATING POINT UNIT EXISTS ONLY IN PARTITION
/        BLOCKS WHEN THE FLOATING POINT HARDWARE EXISTS.  THE JEA IS
/	 SET  UP INITIALLY (VIA THE 'SETJEA' DIRECTIVE).
/
PBSZ=P.IO-P.FP+1	/TOTAL SIZE OF PARTITION BLOCK (INC FP BUFFER) /(213)
PBFP=P.FE-P.FB+1	/SIZE OF FLOATING POINT REGISTER BUFFER
PBIB=P.20-P.AC+1	/SIZE OF REGISTER SAVE AREA FOR INTERRUPT SERVICE ROUTINES
PBMM=P.UP-P.MM+1	/SIZE OF XVM REGISTER AREA
/
/ NOTES --
/
/ THE TASK SIZE (WORD P.TS) IS THE AMOUNT OF A PARTITION AVAILABLE TO 
/ A TASK.  IT IS DETERMINED BY THE POSITION OF THE MEMORY PROTECT
/ BOUND REGISTER, AND MAY BE INCREASED BY THE 'RAISE BOUND' DIRECTIVE.
/
/ THE PARTITION'S VIRTUAL SIZE (WORD P.VS) IS SET EQUAL TO ITS ACTUAL
/ SIZE WHEN A TASK IS INITIALLY MADE ACTIVE. IT IS DECREASED WHENEVER
/ THE TASK ISSUES AN I/O DIRECTIVE TO PREALLOCATE I/O BUFFER SPACE TO
/ AN I/O HANDLER THAT USES BUFFERS FROM THE TOP OF A TASK'S PARTITION.
/ IT IS ALSO DECREASED WHENEVER SUCH A HANDLER ALLOCATES BUFFER SPACE
/ BEYOND THAT WHICH HAS ALREADY BEEN PREALLOCATED.
/ AFTER THE TASK HAS PREALLOCATED ALL THE LUNS IT INTENDS TO USE, IT
/ CAN INCREASE THE TASK SIZE (WORD P.TS), BY USE OF THE 'RAISE BOUND'
/ DIRECTIVE, NOT TO EXCEED THE PARTITION'S VIRTUAL SIZE.
/
/ THE WORDS P.C1 AND P.C2 ARE USED TO STORE THE XM CLOCK TICKS
/ FOR WHICH A TASK HAS RUN.  P.C1 GIVES THE NUMBER OF XM CLOCK
/ OVERFLOWS (1 UNIT REPRESENTS 2.62 SECONDS). P.C2 GIVES THE NUMBER
/ OF XM CLOCK TICKS BEYOND THOSE INDICATED BY P.C1.  EACH XM CLOCK
/ TICK REPRESENTS 10 MICROSECONDS.  THESE WORDS ARE MANIPULATED
/ IN SIGNIFICANT EVENT RECOGNITION AND WHEN THE TASK EXITS.
/
/ THE TASK USE COUNT (P.TC) GIVES THE NUMBER OF TASKS REFERENCING
/ THE PARTITITION.
/ THE TASK USE COUNT
/ IS INCREMENTED WHENEVER A TASK IS LOADED INTO THE PARTITION	/(161)
/ OR A SHARE DIRECTIVE IS INVOKED FOR THE PARTITION.
/ IT IS DECREMENTED BY UNFIX AND EXIT, AS WELL AS, SHARE.  WHENEVER
/ P.TC IS NON-ZERO TASKS WILL NOT BE ABLE TO LOAD INTO THE PARTITION.
/ HENCE THE LOW ORDER BITS OF P.TC CAN BE CONSIDERED THE 	/(161)
/ 'PARTITION OCCUPIED' FLAG.					/(161)
/ WHENEVER A TASK IS RUNNING IN THE PARTITION AND IS SHARING SOME
/ BLOCK OF MEMORY, THE TASK USE COUNT POINTER (P.UP) POINTS TO THE
/ TASK USE COUNT WORD OF THE BLOCK OF MEMORY BEING SHARED.
/
/ FLAG WORD BIT DESIGNATIONS:
/   BIT 0-8 -- SET TO THE LUN OFFSET FOR THE TASK USING THIS	/(161)
/	       PARTITION.					/(161)
/   BIT 9-13 -- SET TO THE USER NUMBER OF THE TASK USING THIS	/(161)
/		PARTITION.					/(161)
/   BIT 15 -- SET WHEN RECONFIGURATION IS IN PROGRESS
/   BITS 16-17 -- SET TO INDICATE:
/		NO SHARING ALLOWED (00)
/		READ ONLY SHARING ALLOWED (01)
/		SHARING ALLOWED WITHOUT RESTRICTION (10)
/
/
	.EJECT
/ PHYSICAL DEVICE NODES LIST
/
/ WHEN A LOGICAL I/O UNIT IS ASSIGNED TO A PHYSICAL UNIT, THE ADDRESS
/ OF A NODE DESCRIBING THE PHYSICAL DEVICE IS SET IN A LOGICAL UNIT
/ TABLE ENTRY CORRESPONDING TO THE LOGICAL "UNIT NUMBER" (LUN).
/ THESE NODES ARE LINKED TOGETHER AS THE PHYSICAL DEVICE LIST (PDVL)
/ WITH LISTHEAD IN THE SYSTEM COMMUNICATIONS AREA.
/
/ PHYSICAL DEVICE NODE FORMAT:
/
/ WORD	 CONTENTS
/
D.FP=0	/FORWARD LINKAGE
D.BP=1	/BACKWARD LINKAGE
D.N1=2	/DEVICE NAME (FIRST HALF)
D.N2=3	/DEVICE NAME (SECOND HALF) -- ALWAYS ZERO
D.AF=4	/DEVICE ATTACH FLAG
D.UN=5	/UNIT NUMBER
D.QF=6	/DEVICE REQUEST QUEUE (DEQUE LIST HEAD) FORWARD LINKAGE
D.QB=7	/DEVICE REQUEST QUEUE (DEQUE LIST HEAD) BACKWARD LINKAGE
D.TG=10	/TRIGGER EVENT VARIABLE ADDRESS
D.AI=11	/ASSIGN INHIBIT FLAG
/
/ NOTES --
/
/ THE DEVICE-ATTACH-FLAG IS SET NON-ZERO WHENEVER THIS DEVICE-UNIT IS
/ ATTACHED TO A TASK.  WHEN THE UNIT IS NOT ATTACHED, THIS WORD IS ZERO.
/ WHEN NON-ZERO, THIS FLAG POINTS TO A WORD IN THE ATTACH-FLAG-TABLE
/ WHICH CONTAINS THE ADDRESS OF THE TASK'S STL NODE. THE DEVICE-ATTACH-FLAG
/ IS SET BY THE 'ALAD' SUBROUTINE, AND CLEARED BY THE 'DLAD' SUBROUTINE,
/ BY THE 'DMTQ' SUBROUTINE, OR BY THE REASSIGN MCR FUNCTION TASK.
/
/ THE ASSIGN INHIBIT FLAG BIT 0 IS SET BY THE "REASSIGN" MCR FUNCTION
/ TO INDICATE THAT IT HAS REMOVED THE TRIGGER ADDRESS FROM
/ THE PHYSICAL DEVICE NODE AND HAS REQUESTED THE HANDLER TASK
/ TO EXIT.  THIS REQUEST IS AN I/O REQUEST NODE WITH AN
/ I/O FUNCTION CODE OF 777. BIT 1 MAY BE SET BY I/O HANDLER TASKS,
/ NOTABLY THE DISK FILE HANDLERS, TO SIGNAL "REASSIGN" THAT FILES ARE
/ OPEN. THIS FLAG IS CLEARED BY THE HANDLER TASK WHEN IT EXITS.
/ AFTER THE FLAG IS CLEARED, THE HANDLER MAY BE ASSIGNED (AND THE
/ HANDLER TASK MAY BE REQUESTED BY "REASSIGN".)
/
	.EJECT
/ SYSTEM COMMON BLOCK DEFINITIONS
/
/ THE NAME, BASE ADDRESS, AND SIZE, OF EACH SYSTEM COMMON BLOCK
/ IS DESCRIBED IN A NODE, AND THESE NODES ARE LINKED TOGETHER AS THE
/ SYSTEM COMMON BLOCK DESCRIPTIONS LIST (SCDL) WITH LISTHEAD IN THE
/ SYSTEM COMMUNICATIONS AREA.  THIS INFORMATION IS SET BY SCF FOR
/ USE BY 'INSTALL' (AND ANY OTHER TASK), BUT IS NOT NEEDED BY
/ THE EXECUTIVE.
/
/ NODE FORMAT:
/
/ WORD	 CONTENTS
/
B.FP=0	/FORWARD LINKAGE
B.BP=1	/BACKWARD LINKAGE
B.N1=2	/COMMON BLOCK NAME (FIRST HALF)
B.N2=3	/COMMON BLOCK NAME (SECOND HALF)
/	(UNUSED WORD)
B.BA=5	/BASE ADDRESS OF COMMON BLOCK
B.SZ=6	/SIZE OF COMMON BLOCK
/	(UNUSED WORD)
B.FW=10	/FLAGS WORD
B.TC=11	/TASK USE COUNT
/
/ B.FW AND B.TC HAVE THE SAME SIGNIFICANCE AS THE CORRESPONDING
/ WORDS FOR THE PBDL LIST.  THE BIT DESIGNATIONS ARE IDENTICAL.
/
	.EJECT
/ TASK ABORT NOTICE
/
/ WHEN A TASK IS ABORTED, A REQUEST TO LOG THE TASK NAME,
/ CAUSE OF TERMINATION, PC, AC, AND XR, IS QUEUED IN A DEQUE
/ TERMINATION NOTICE REQUEST LIST (TNRL) WITH LISTHEAD IN
/ THE SYSTEM COMMUNICATIONS AREA, AND A LOGGING TASK IS
/ REQUESTED. MESSAGES ARE ALSO QUEUED WHEN I/O RUNDOWN IS PERFORMED
/ BUT THE "TRANSFERS PENDING" COUNT NEVER REACHES ZERO.
/
/ NODE FORMAT:
/
	/FORWARD LINKAGE
	/BACKWARD LINKAGE
	/TASK NAME (FIRST HALF)
	/TASK NAME (SECOND HALF)
	/TERMINATION INDICATOR
	/PC AT TERMINATION; OR TRANSFERS PENDING COUNT
	/AC AT TERMINATION; OR NOTHING
	/XR AT TERMINATION; OR NOTHING
	/(UNUSED WORD)
	/(UNUSED WORD)
/
/ NOTES:
/
/ WORD 'T.TI' INDICATES THE CAUSE OF TERMINATION AS FOLLOWS:
/   1 -- MEMORY PROTECT ERR
/   2 -- NONEXISTENT MEMORY REF
/   3 -- BAD CAL
/   4 -- NON-0 TRANSFERS PENDING COUNT
/
	.EJECT
/ I/O RUNDOWN QUEUE
/
/ WHENEVER A TASK EXITS OR IS ABORTED AND ITS "TRANSFERS	/(176)
/ PENDING" COUNT IS NON-ZERO, THE TASK'S ATL (ACTIVE TASK LIST) NODE
/ IS INSERTED IN THIS QUEUE IN ORDER OF TASK PRIORITY AND THE SYSTEM'S
/ I/O RUNDOWN TASK, 'IORD', IS TRIGGERED TO SERVICE THE REQUEST. THE
/ QUEUE (IORDQ) HAS ITS LISTHEAD IN THE SYSTEM COMMUNICATIONS AREA.
/
/ NODE FORMAT IS IDENTICAL TO THAT FOR THE ACTIVE TASK LIST.
/
	.EJECT
/ POOL OF EMPTY LARGE NODES (LPOOL)
/ 
/ THIS DEQUE CONTAINS NODES FROM WHICH PBDL NODES CAN BE CONSTRUCTED
/ BY THE MCR RECONFIGURATOR. NO DATA IS STORED IN ANY OF THESE NODES.
/ ONLY WORDS 0 AND 1 (THE LINKAGE) HAVE ANY SIGNIFICANCE.
/ 
	.EJECT
/ SMALL NODE DESCRIPTOR LIST (SNDL)
/ 
/ THIS LIST INDICATES THOSE AREAS OF CORE DEDICATED TO SMALL
/ (10 DECIMAL WORD) NODES.
/
/	WORD 0  -- FORWARD LINKAGE
/	     1  -- BACKWARD LINKAGE
/	     2  -- NAME OF NODE 'PARTITION' (FIRST HALF)
/	     3  -- NAME OF NODE 'PARTITION' (SECOND HALF)
/	     4  -- BASE ADDRESS OF 'PARTITION'
/	     5  -- SIZE OF 'PARTITION'
/	     6  -- UNUSED
/	     7  -- UNUSED
/	     10 -- UNUSED
/	     11 -- UNUSED
/
	.EJECT
/ LARGE NODE DESCIPTOR LIST (LNDL)
/ 
/ THIS LIST IS USED TO INDICATE THOSE AREAS OF CORE USED TO STORE
/ LARGE NODES I.E. NODES FOR PARTITION DESCRIPTION.
/ 
/ THE FORMAT OF NODES IN THIS LIST IS IDENTICAL TO NODES IN THE SNDL.
/ 
	.EJECT
/ THE BATCH JOB LIST
/
/ REVISED FOR MULTIACCESS, 11-MAY-76 BY ED GARDNER
/
/ THE JOB QUEUE OR BATCH JOB LIST MAY HAVE ONE OF TWO FORMATS,
/ DEPENDING UPON WHETHER THIS IS A MULTIACCESS SYSTEM OR NOT.
/ BATCH HAS BEEN EXTENSIVELY REVISED FOR USE WITH MULTIACCESS.
/ HOWEVER, A NON-MULTIACCESS SYSTEM USES THE OLD BATCH UNALTERED.
/
	.IFUND L.ALL
	.NOLST
	.IFDEF L.SCOM
	.IFUND NOMAC
	.LST
/
/ THE FOLLOWING DESCRIPTION IS FOR MULTIACCESS SYSTEMS ONLY.
/
/ THE ENTRY INSERTED IN THE JOB QUEUE IS ACTUALLY COMPOSED OF
/ TWO SMALL NODES.  THE PRIMARY NODE IS THREADED INTO THE JOB
/ QUEUE PROPER, AND POINTS TO THE SECONDARY NODE.  THE FORMAT
/ OF THE PRIMARY NODE IS AS FOLLOWS:
/
/	(0)  FORWARD LINK
/	(1)  BACKWARD LINK
/	(2)  FILE
/	(3)  NAME
/	(4)  ADDRESS OF SECONDARY NODE
/	(5)  JOB ID OR SEQUENCE NUMBER
/	(6)  JOB INFO
/	(7)  JOB INFO
/	(10) DATE WHEN JOB WAS SUBMITTED (FORM:  YYMMDD)
/	(11) SSM (SECONDS-SINCE-MIDNIGHT) WHEN JOB WAS SUBMITTED
/
/ THE FORMAT OF THE SECONDARY NODE IS AS FOLLOWS:
/
/	(0)  COMMAND INPUT DEVICE AND UNIT
/	(1)  COMMAND INPUT UFD
/	(2)  LISTING OUTPUT DEVICE AND UNIT
/	(3)  LISTING OUTPUT UFD
/	(4)  LOGIN DEVICE AND UNIT
/	(5)  LOGIN UFD
/	(6)  UNUSED
/	(7)  UNUSED
/	(10) UNUSED
/	(11) UNUSED
/
/ FOR MORE DETAILS SEE THE 'QUEUE JOB' DIRECTIVE CODING.
/
	.NOLST
	.ENDC
	.IFDEF NOMAC
	.LST
/
/ THE FOLLOWING APPLIES ONLY TO NON-MULTIACCESS SYSTEMS.
/ 
/ THE JOB LIST IS USED TO QUEUE A BATCH JOB TO THE BATCH HANDLER.
/ NODES IN THIS LIST HAVE THE FOLLOWING FORMAT:
/ 
/	WORD  0 -- FORWARD LINKAGE
/	      1 -- BACKWARD LINKAGE
/	      2 -- FILE NAME (FIRST HALF)
/	      3 -- FILE NAME (SECOND HALF)
/	      4 -- PRIORITY
/	      5 -- LUNS
/	      6 -- JOB INFORMATION
/	      7 -- SPECIAL WORD 1
/	     10 -- SPECIAL WORD 2
/	     11 -- TIME IN SECONDS FROM MIDNIGHT
/
	.NOLST
	.ENDC
	.LST
	.ENDC
	.ENDC
/
	.EJECT
/ THE EXECUTE LIST
/
/ THIS LIST CONTAINS INFORMATION ON A TASK WHICH SHOULD BE INSTALLED
/ BY 'FININS' AND THEN REQUESTED. THIS LIST IS NEEDED TO IMPLEMENT THE
/ 'EXECUTE' FEATURE.
/ 
/ NODES IN THIS LIST HAVE THE FOLLOWING FORMAT:
/ 
/	WORD  0 -- FORWARD LINKAGE
/	      1 -- BACKWARD LINKAGE
/	      2 -- TASK NAME (FIRST HALF)
/	      3 -- TASK NAME (SECOND HALF)
/	      4 -- PRIORITY OR 0 IF NO DEFAULT PRIORITY
/	      5 -- LUN (ON WHICH THE CREATED FILE RESIDES)
/	      6 -- PARTITION NAME (FIRST HALF) OR 0 IF NONE GIVEN
/	      7 -- PARTITION NAME (SECOND HALF) OR 0 IF NONE GIVEN
/	     10 -- UNUSED
/	     11 -- UNUSED
/
	.EJECT
/ THE WTL LIST (FOR RASP)
/
/ THIS LIST IS USED BY RASP FOR JOB SWAPPING. NODES IN THIS LIST
/ ARE GENERATED WHEN RASP ORIENTED USER TASKS SWAP OUT OF MEMORY
/ AND ARE DELETED AUTOMATICALLY ON SUCCESSFUL TASK COMPLETION.
/ THE WTL LIST IS NOT EFFECTED BY ANY MCR FUNCTION OR SYSTEM
/ DIRECTIVE. NODES IN THIS LIST HAVE THE FOLLOWING FORMAT:
/
/	WORD  0 -- FORWARD LINKAGE
/	      1 -- BACKWARD LINKAGE
/	      2 -- LOGICAL TASK NAME (FIRST HALF IN ASCII)
/	      3 -- LOGICAL TASK NAME (SECOND HALF IN ASCII)
/	      4 -- DISK ADDRESS (HIGH BITS OR PLATTER)
/	      5 -- DISK ADDRESS (LOW 18 BITS)
/	      6 -- CORE ADDRESS
/	      7 -- CORE IMAGE LENGTH
/	     10 -- UNUSED
/	     11 -- UNUSED
/
	.EJECT
/ INPUT/OUTPUT REQUESTS
/
/ LISTS OF INPUT/OUTPUT REQUESTS USE WORDS 6 AND 7 OF A DEVICE'S PDVL
/ NODES AS LISTHEADS. THE Q-I/O DIRECTIVE INSERTS NODES INTO THE
/ APPROPRIATE LIST. THE I/O HANDLER IS RESPONSIBLE FOR REMOVING THE
/ NODES WHEN IT PROCESSES REQUESTS. THESE NODES HAVE THE FOLLOWING FORMAT:
/
/	WORD  0 -- FORWARD LINKAGE
/	      1 -- BACKWARD LINKAGE
/	      2 -- REQUESTOR'S STL NODE ADDRESS
/	      3 -- NORMAL/EXEC MODE INDICATOR
/	      4 -- TASK PRIORITY
/	      5 -- I/O FUNCTION CODE IN BITS 9-17 AND
/	           LUN IN BITS 0-8
/	      6 -- CPB WD 1 (EVENT VARIABLE ADDRESS)
/	      7 -- CPB WD 3 (UNIQUE TO CAL)
/	     10 -- CPB WD 4 (UNIQUE TO CAL)
/	     11 -- CPB WD 5 (UNIQUE TO CAL)
/
	.EJECT
/ TDV EXIT QUE NODES						/(161)
/								/(161)
/ IF A TASK IS BEING EXECUTED BY MULTIACCESS THEN UPON TASK	/(161)
/ TERMINATION, EITHER NORMAL OR ABNORMAL, A NODE WILL BE PLACED	/(161)
/ UPON TDV.EQ. THESE NODES ARE ONE OF TWO TYPES WHICH HAVE 	/(161)
/ BEEN DEFINED ABOVE. THEY ARE EITHER TNTERM NOTICES OR THE 	/(161)
/ TASK'S ATL ENTRY WITH THE FOLLOWING EXCEPTION. IF THE NODE	/(161)
/ IS AN ATL ENTRY THEN WORD 11 (8) OF THE NODE IS ZERO. IF THE	/(161)
/ NODE IS A TNTERM NOTICE THEN WORD 11 (8) IF THE NODE IS ONE.	/(161)
								/(161)
T.EC=11			/ TDV.EQ EXIT CODE.			/(161)
	.EJECT							/(161)
/ MULTIACCESS USER CONTEXT AREA					/(161)
/								/(161)
/ THE UCA IS A MECHANISM BY WHICH INFORMATIONIS PASSED BETWEEN	/(161)
/ PROCESSES IN TDV. THE EXECUTIVE MUST KNOW ABOUT CERTAIN	/(161)
/ OFFSETS INTO THIS AREA FOR THE PURPOSES OF XFRCMD.		/(161)
								/(161)
UC.LEN=100		/ LENGTH OF THE UCA.			/(161)
UC.UFD=6		/ OFFSET TO UFD NAME (UIC)		/(214)
UC.TB=16		/ OFFSET TO THE TERMINAL BUFFER.	/(161)
	.EJECT							/(161)
/ EVENT VARIABLE CONVENTIONS
/
/ THE FOLLOWING CONVENTIONS APPLY TO EVENT VARIABLES SET IN TASKS
/ BY THE SYSTEM:
/
/ POSITIVE VALUES SIGNAL SUCCESSFUL COMPLETION
/
/ ZERO INDICATES A REQUEST IS STILL PENDING
/
/ NEGATIVE VALUES INDICATE REJECTION OR UNSUCCESSFUL COMPLETION
/
/   -1	NO FLOATING POINT HARDWARE ON THIS MACHINE (SJ.)
/   -2	I/O REQUEST ABORTED					/EAG:167
/   -5	ILLEGAL HEADER WORD READ FROM DEVICE (DATA MODE
/	INCORRECT OR DATA VALIDITY BITS IMPROPERLY SET)  (DVH)
/   -6	UNIMPLEMENTED OR ILLEGAL FUNCTION (DVH)
/   -7	ILLEGAL DATA MODE (DVH)
/  -10	SOME FILE STILL OPEN BY SAME TASK ON SAME LUN (DVH)
/  -11	FILE NOT OPEN (DVH)
/  -12	DECTAPE ERROR (DVH)
/  -13	FILE NOT FOUND (DVH)
/  -14	DIRECTORY FULL (DVH)
/  -15	MEDIUM FULL (DVH)
/  -16	OUTPUT WORD-PAIR-COUNT OR INPUT-BUFFER-SIZE ERROR (DVH, TC.)
/  -17	READ/COMPARE ERROR (DVH)
/  -20	BACKSPACE ILLEGAL AT BEGINNING OF TAPE (DVH)
/  -21	END-OF-TAPE REACHED (DVH)
/  -23	INPUT WORD-PAIR-COUNT ERROR (DVH)
/  -24	LUN HAS BEEN REASSIGNED WHILE AN ATTACH OR
/	DETACH REQUEST WAS IN AN I/O REQUEST QUEUE (DVH)
/  -25	BUFFER PREALLOCATION UNSUCCESSFUL (DVH)
/  -26	ILLEGAL FUNCTION FOR A NORMAL MODE TASK (DVH, CI., DI.)
/  -27	NONEXISTENT DISK (RS09) UNIT NUMBER (DVH)
/  -30	AN OUT-OF-PARTITION I/O PARAMETER HAS BEEN SPECIFIED BY
/	A NORMAL MODE TASK (SJ., RS., DVH)
/  -31	I/O PARAMETER EXCEEDS COMMON BLOCK BOUNDS (DVH)
/  -32	NON-EXISTENT SYSTEM  COMMON OR PARTITION BLOCK (DVH, SHR.)
/  -33  UNIT DISMOUNTED OR DIRECTORY NOT INITIALIZED (DVH)
/  -34  DATA MISSED (DVH)
/  -35  ILLEGAL DEVICE CODE OR NON-EXISTENT DISK TYPE (DSK & DSA)
/  -36  NON-EXISTENT BLOCK NUMBER (DSK)
/  -50	RENAME ERROR -- FILE ALREADY EXISTS IN UFD (DVH)
/  -51	ILLEGAL TO READ A TRUNCATED FILE (DVH)
/  -52	INPUT FILE HAS NO END-OF-FILE RECORD (DVH)
/  -53	ILLEGAL (NULL) FILE NAME OR EXTENSION (DVH)
/  -54	THIS FILE IS ALREADY OPEN (DVH)
/  -55	THIS FILE IS ALREADY OPEN FOR MODIFICATION (DVH)
/  -56	NO I/O BUFFER AVAILABLE (DVH)
/  -57	SEQUENTIAL/RANDOM ACCESS FILE NAME CONFLICT (DVH)
/  -60	RANDOM ACCESS FILE SIZE ERROR (DVH)
/  -61	RANDOM ACCESS FILE ACCOUNTING INFORMATION ERROR (DVH)
/  -62	RANDOM ACCESS FILE SIZE ERROR. SIZE REQUESTED FOR THE RF DISK
/	IS NEGATIVE OR IS GREATER THAN 777 OCTAL BLOCKS (DVH)
/  -70	I/O PARAMETER ERROR (DVH)
/  -71	BUFFER CONNECT OR DISCONNECT ERROR (DVH)
/  -72	STOP I/O OR START I/O ERROR (DVH)
/  -73	ADD-TO-MEMORY OVERFLOW (DVH)
/   -77	VIOLATION OF RESTRICTED	(TC., SHR. SPYST. RC.)		/(161)
/	USAGE OF DIRECTIVE.					/(161)
/ -101	OUT OF RANGE LOGICAL UNIT NUMBER (IO. RC.)		/(161)
/ -102	UN-ASSIGNED LOGICAL UNIT NUMBER (IO. RC.)		/(161)
/ -103	NON-RESIDENT DEVICE HANDLER (IO. RC.)			/(161)
/ -104	CONTROL TABLE ARGUMENT ERROR (DVH SHR. SY. RN. SC. MT. SPY. & SPYST.)
/ -105	UNIT NUMBER OUT OF RANGE ( > 77 )	(QJOB.)		/EAG:202
/ -106	BATCH JOB QUEUE OVERFLOW		(QJOB.)		/EAG:202
/ -201	TASK NOT IN SYSTEM	(RQ. RQ.M XE. SC. RN. SY. DA.	/(161)
/				EA. FX. UF. CN. UM.)		/(161)
/ -202	TASK IS ACTIVE (RQ., RQ.M,XE., FX.) OR NOT ACTIVE (RS.)	/(161)
/ -203	CAL NOT TASK ISSUED (SC. RN. SY. MT. DVH SJ. PI. SPY. SPYST. QJOB.
/			     TC. TN. RB. SHR.)
/ -204	TASK IS DISABLED (RQ., RQ.M, XE., SC., RN., SY., FX.)	/(161)
/ -205	TASK NOT SUSPENDED (RS.)
/ -206	ILLEGAL TASK PRIORITY (RQ. RQ.M XE. SC. RN. SY.)	/(161)
/ -207	TASK ALREADY FIXED (FX.) OR NOT FIXED (UF.)
/ -210	PARTITION OCCUPIED (FX.)
/ -211	PARTITION NOT IN SYSTEM (.PI)
/ -212	STL NODE LOST PARTITION	(RQ. RQ.M RN. SY. XE. SC. FX.	/(161)
/	THRU RECONFIGURATION	EA.)				/(161)
/ -213	PARTITION OR SYSTEM	(RQ. RQ.M RN. SY. XE. SC. FX.	/(161)
/	COMMON IN PROCESS OF	EA. SHR.)			/(161)
/	RECONFIGURATION.					/(161)
/ -301	LINE NUMBER REJECTED (CI. DI.)
/ -302	LINE IS CONNECTED (CI.) OR NOT CONNECTED (DI.)
/  NNN	I/O HRDWR ERR, WHERE NNN IS THE DEV STATUS WORD (DVH)
/	[THE ERR FLAG IS REPRESENTED BY BIT-0, THEREFORE NNN<0]
/ -777	POOL IS EMPTY
/
/	DVH -- DEVICE HANDLER
/	IO. -- 'QUEUE I/O' DIRECTIVE
/	RC. -- 'SINGLE UNIT ABORT' DIRECTIVE			/(161)
/	RQ. -- 'REQUEST' DIRECTIVE
/	RQ.M-- 'REQUEST MAPPED' DIRECTIVE			/(161)
/	SC. -- 'SCHEDULE' DIRECTIVE
/	RN. -- 'RUN' DIRECTIVE
/	SY. -- 'SYNC' DIRECTIVE
/	CN. -- 'CANCEL' DIRECTIVE
/	MT. -- 'MARK' DIRECTIVE
/	RS. -- 'RESUME' DIRECTIVE
/	CI. -- 'CONNECT' DIRECTIVE
/	DI. -- 'DISCONNECT' DIRECTIVE
/	FX. -- 'FIX IN CORE' DIRECTIVE
/	UF. -- 'UNFIX' DIRECTIVE
/	DA. -- 'DISABLE' DIRECTIVE
/	EA. -- 'ENABLE' DIRECTIVE
/	PI. -- 'PARTITION INFORMATION' DIRECTIVE
/	TC. -- 'TRANSFER COMMAND' RESTRICTED DIRECTIVE
/	SJ. -- 'SET JEA REGISTER' DIRECTIVE
/	UM. -- 'UNMARK' DIRECTIVE
/	SPY. -- 'SPY' DIRECTIVE
/	SPYST. -- 'SPYSET' DIRECTIVE
/	QJOB. -- 'QUEUE JOB' DIRECTIVE
/	XE. -- 'EXECUTE' DIRECTIVE
/	RB. -- 'RAISE BOUND' DIRECTIVE
/	TN. -- 'TASK NAME' DIRECTIVE
/	SHR. -- 'SHARE' DIRECTIVE
/
	.EJECT
/ "SIGNIFICANT" EVENTS
/
/ THE FOLLOWING EVENTS ARE CONSIDERED "SIGNIFICANT EVENTS" AND
/ RESULT IN AN ACTIVE TASK LIST SCAN FROM-THE-TOP.
/
/   I/O REQUEST QUEUING
/
/   NORMAL I/O REQUEST COMPLETION (DEPENDENT UPON I/O HANDLER TASK)
/
/   A TASK REQUEST
/
/   A SCHEDULE REQUEST (SCHEDULE, RUN, OR SYNC) COMING DUE
/
/   A MARK TIME EXPIRATION
/
/   A TASK RESUMPTION (RESUME DIRECTIVE)
/
/   A TASK EXIT
/
 .TITLE *** MACRO DEFINITIONS
/
/ .RTL3 -- RAISE TO LEVEL THREE
/
	.DEFIN	.RTL3
	  LAC (400020)
	  ISA
	.ENDM
/
/ .RTL6 -- RAISE TO LEVEL SIX
/
	.DEFIN	.RTL6
	  LAC (400002)
	  ISA
	.ENDM
/
/ .SET6 -- TO DECLARE A "SIGNIFICANT EVENT" (REQUEST API-6 WHICH
/          WILL CAUSE AN ACTIVE TASK LIST SCAN "FROM THE TOP")
/
	.DEFIN	.SET6
	  LAC (401000)
	  ISA
	.ENDM
/
/ INTERRUPT [SERVICE ROUTINE] ENTRY -- "CONNECT LABEL"
/
	.IFUND L.ALL						/EAG:202
								/EAG:202
	.DEFINE	INTENTRY,I,LST
I	  0		/INTERRUPT "CONNECT" LOCATION
	  DBA
	  JMS SAVE	/IF FROM WITHOUT PAGE ZERO:  JMS* (SAV)
	  .NOLST						/EAG:202
	  .REPT PBIB
	  0
	  NOP		/INDICATES TRANSFER TO 'NOP+1' AFTER REG SAVE
	  ..FUDG LST						/EAG:202
	  ..DOIT						/EAG:202
	.ENDM
								/EAG:202
	.NOLST							/EAG:202
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.ALL						/EAG:202
								/EAG:202
	.DEFINE	INTENTRY,I,LST
I	  0		/INTERRUPT "CONNECT" LOCATION
	  DBA
	  JMS SAVE	/IF FROM WITHOUT PAGE ZERO:  JMS* (SAV)
	  .REPT	PBIB
	  0
	  NOP		/INDICATES TRANSFER TO 'NOP+1' AFTER REG SAVE
	.ENDM
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.SCOM						/EAG:202
	.LST							/EAG:202
	.ENDC							/EAG:202
/
/ INTERRUPT [SERVICE ROUTINE] EXIT -- "CONNECT LABEL"
/
	.DEFIN	INTEXIT,I
	  LAC (I)
	  JMP RSR	/IF FROM WITHOUT PAGE ZERO:  JMP* (REST)
	.ENDM
/
/ SHORT PARTITION BLOCK (FOR TASKS THAT ARE ASSEMBLED AS A PART OF SYSTEM.)
/ AN EXPANDED 'SHPB' IS USED IN THE SYSTEM CONFIGURATION ROUTINE.
/ AN ABBREVIATED 'SHPB' IS USED IN THE TTY HANDLER		/(213)
/
	.IFUND L.ALL						/EAG:202
								/EAG:202
	.DEFIN	SHPB,LST
	  .NOLST						/EAG:202
	  0		/ WORD FOR TRANSFER PENDING COUNT.	/(173)
	  0		/ FLAG WORD FOR CONTEXT SWITCH.		/(161)
	  0		/ FILL WORD 1				/(161)
	  0		/ FILL WORD 2				/(161)
	  0		/ FILL WORD 3				/(161)
	  0		/INTERRUPT CONNECT LOCATION
	  DBA		/ENTER INDEX MODE
	  .IFPNZ	10000-.
	  JMS	SAVE
	  .ENDC
	  .IFNEG	7777-.
	  JMS*	(SAVE)
	  .ENDC
	  .REPT	PBIB
	  0
	  SKP		/INDICATES TRANSFER TO 'M1' AFTER REG SAVE
	  .REPT	PBMM
	  0
	  .REPT	PBFP
	  0
	0		/ WORD FOR I/O COUNT			/(213)
	  ..FUDG LST						/EAG:202
	  ..DOIT						/EAG:202
	.ENDM
								/EAG:202
	.NOLST							/EAG:202
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.ALL						/EAG:202
								/EAG:202
	.DEFIN	SHPB,LST
	  0		/ WORD FOR TRANSFER PENDING COUNT.	/(173)
	  0		/ FLAG WORD FOR CONTEXT SWITCH.		/(161)
	  0		/ FILL WORD 1				/(161)
	  0		/ FILL WORD 2				/(161)
	  0		/ FILL WORD 3				/(161)
	  0		/INTERRUPT CONNECT LOCATION
	  DBA		/ENTER INDEX MODE
	  .IFPNZ	10000-.
	  JMS	SAVE
	  .ENDC
	  .IFNEG	7777-.
	  JMS*	(SAVE)
	  .ENDC
	  .REPT	PBIB
	  0
	  SKP		/INDICATES TRANSFER TO 'M1' AFTER REG SAVE
	  .REPT	PBMM
	  0
	  .REPT	PBFP
	  0
	0		/ WORD FOR I/O COUNT			/(213)
	.ENDM
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.SCOM						/EAG:202
	.LST							/EAG:202
	.ENDC							/EAG:202
/
/ ASCII TEXT LINE WITH HEADER
/
	.IFUND L.ALL						/EAG:202
								/EAG:202
	.DEFIN	TEXT,N,B,T,LST					/EAG:202
	  .NOLST						/EAG:202
MES@N	  .DSA M..@N-MES@N/2*1000+2
	  0
	  .ASCII :B:<T>
M..@N=.
	  ..FUDG  LST						/EAG:202
	  ..DOIT						/EAG:202
	.ENDM							/EAG:202
								/EAG:202
	.NOLST							/EAG:202
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.ALL						/EAG:202
								/EAG:202
	.DEFIN	TEXT,N,B,T,LST
MES@N	  .DSA M..@N-MES@N/2*1000+2
	  0
	  .ASCII :B:<T>
M..@N=.
	.ENDM
								/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.IFDEF L.SCOM						/EAG:202
	.LST							/EAG:202
	.ENDC							/EAG:202
/								/EAG:202
/ MACROS TO CONTROL LISTING OF SOME OF THE ABOVE		/EAG:202
/								/EAG:202
	.DEFIN	..FUDG,SYM					/EAG:202
								/EAG:202
	  .DEFIN ..DOIT						/EAG:202
	  .ENDM							/EAG:202
								/EAG:202
	.IFDEF SYM						/EAG:202
	  .DEFIN ..DOIT						/EAG:202
	  .LST							/EAG:202
	  .ENDM							/EAG:202
	.ENDC							/EAG:202
								/EAG:202
	.ENDM							/EAG:202
 .TITLE *** SYMBOLIC CONSTANT DEFINITIONS
/
	.DEC
LUN12=12
LUN13=13
D13=13
D24=24
D29=29
D31=31
D59=59
D60=60
D86400=86400
/
NDSZM2=NDSZ-2
NDSZMT=NDSZ-10
/
	.OCT
/
L1=1
L21=21
L41=41
/
CLON=700044	/CLOCK ON
LDMM=700024	/LOAD MM REGISTER FROM AC
RDMM=700032	/READ MM REGISTER INTO AC
RDCLK=701762	/READ XM CLOCK INTO AC AND RESET CLOCK REGISTER TO ZERO
MPSK=701701	/SKIP ON MEMORY PROTECT VIOLATION
MPSNE=701741	/SKIP ON NONEXISTENT MEMORY VIOLATION
MPCV=701702	/CLEAR PROTECT VIOLATION FLAG
MPCNE=701744	/CLEAR NONEXISTENT MEMORY REF FLAG
MPLR=701724	/LOAD RELOCATION REGISTER
MPLD=701704	/LOAD CORE ALLOCATION (SIZE) REGISTER
MPEU=701742	/ENTER USER (PROTECTED/RELOCATED) MODE
KSF=700301	/SKIP IF CONSOLE KYBD INT
TSF=700401	/SKIP IF CONSOLE TELEPRINTER INT
KRB=700312	/READ CONSOLE KYBD
KRS=700332	/READ FULL DUPLEX & SELECT READER
TLS=700406	/LOAD TTY PRINT BUF
TCF=700402	/CLEAR TTY PRINT FLAG
PSF=700201	/SKIP IF PAPER PUNCH INT
.INH=705522	/INHIBIT INTERRUPTS
.ENB=705521	/ENABLE INTERRUPTS
ECLA=641000	/EAE CLA INSTRUCTION
I=400000	/ FPP INDIRECT ADDRESS BIT			/(213)
UNDLD=713170	/UNNORM DOUBLE PRECISION FLOAT LOAD
UNSWQ=715270	/UNNORM SWAP FMA/FMQ
EST=713700	/EXTENDED INTEGER STORE
SJE=715600	/STORE JEA REGISTER
LJE=715400	/LOAD JEA REGISTER
ELQ=715100	/EXTENDED INTEGER LOAD FMQ
UNDST=713770	/UNNORM DOUBLE PRECISION FLOAT STORE
FPT=710314	/SKIP IF FLOATING POINT HARDWARE EXISTS
OAC=642000	/OR AC TO MQ
/
/ BECAUSE THE MACRO-15 ASSEMBLER CANNOT HANDLE "INST* (ADR),X" , THE
/ FOLLOWING "INDIRECT-INDEXED" MNEMONICS ARE DEFINED.
/
LACIX=LAC!030000
DACIX=DAC!030000
DZMIX=DZM!030000
SADIX=SAD!030000						/(207)
 .TITLE *** HARDWARE DEFINED REGISTERS
/
/ 00000 -- PI INTERRUPT RETURN PARAMETER STORAGE
/ 00004 -- AC SWITCH VALUE STORED AT SIGNIFICANT EVENT		/(213)
/ 00001 -- PI INTERRUPT TRANSFER (SET UP DURING BOOTSTRAPPING)
/ 00007 -- CLOCK REGISTER (INCREMENTED EACH TICK, INTERRUPT WHEN OVERFLOW)
/ 00010 -- AUTO-INCREMENT REGISTER X10
/ 00011 -- AUTO-INCREMENT REGISTER X11
/ 00012 -- AUTO-INCREMENT REGISTER X12
/ 00013 -- AUTO-INCREMENT REGISTER X13
/ 00015 -- AUTO-INCREMENT REGISTER X15
/ 00016 -- AUTO-INCREMENT REGISTER X16
/ 00017 -- AUTO-INCREMENT REGISTER X17
/ 00020 -- CAL RETURN PARAMETER STORAGE
/ 00021 -- CAL TRANSFER (SETUP DURING BOOTSTRAPPING)
/ 00022 -- DB99 TRANSMIT WC (2'S COMP WORD COUNT)
/ 00023 -- DB99 TRANSMIT CA (CURRENT WORD ADDRESS MINUS ONE)
/ 00024 -- DB99 RECEIVE WC
/ 00025 -- DB99 RECEIVE CA
/ 00026 -- UNASSIGNED DEVICE WC
/ 00027 -- UNASSIGNED DEVICE CA
/
ACSW=4		/ ACSW LOCATION					/(213)
/
	.LOC	00030
	740031	/DECTAPE WC
	000031	/DECTAPE CA
	740033	/MAGTAPE WC
	000033	/MAGTAPE CA
	0	/LINE PRINTER WC (NOT USED)
	0	/LINE PRINTER CA
	720037	/WORD COUNT FOR 24K OR GREATER (SCF AT 50000)
	000037	/RF DISK CA
/
/ THE WC & CA FOR DECTAPE, MAGTAPE, AND FIXED HEAD DISK ARE
/ SETUP FOR BOOTSTRAPPING.  A COLD START IMAGE READIN IS STARTED
/ AT LOC 30, AND THESE WC & CA'S CAUSE THE TRANSFER TO CONTINUE 
/ THRU THE SIXTH PAGE (24K) .
/
	.EJECT
	.LOC	040	/INTERRUPT TRAP LOCATIONS
/
	DBK			/SOFTWARE LEVEL 4
	JMP*	ITVTB+1		/SOFTWARE LEVEL 5   ****
	JMS*	L6TV		/SOFTWARE LEVEL 6
	DBK			/SOFTWARE LEVEL 7
	JMS*	ITVTB+4		/LINE 4 - DECTAPE
	JMS*	ITVTB+5		/LINE 5 - MAGTAPE
	JMS*	ITVTB+6		/LINE 6 -
	JMS*	ITVTB+7		/LINE 7 - UC15 UNICHANNEL DISK
	JMS*	ITVTB+10	/LINE 10- PAPER TAPE READER
	JMS*	ITVTB+11	/LINE 11- CLOCK OVERFLOW
	JMS*	ITVTB+12	/LINE 12- POWER FAIL
	JMS*	ITVTB+13	/LINE 13- PARITY ERR
	JMS*	ITVTB+14	/LINE 14- VP15 & VT15
	JMS*	ITVTB+15	/LINE 15- CARD READER
	JMS*	ITVTB+16	/LINE 16- LINE PRINTER
	JMS*	ITVTB+17	/LINE 17- A-D CONVERTER
	JMS*	ITVTB+20	/LINE 20- DB99A-DB98A
	JMS*	ITVTB+21	/LINE 21-
	JMS*	ITVTB+22	/LINE 22- DATAPHONE
	JMS*	ITVTB+23	/LINE 23- RS09  DISK
	JMS*	ITVTB+24	/LINE 24- RP02 DISK PACK
	JMS*	ITVTB+25	/LINE 25- PLOTTER
	JMS*	ITVTB+26	/LINE 26-
	JMS*	ITVTB+27	/LINE 27-
	JMS*	ITVTB+30	/LINE 30-
	JMS*	ITVTB+31	/LINE 31-
	JMS*	ITVTB+32	/LINE 32-
	JMS*	ITVTB+33	/LINE 33-
	JMS*	ITVTB+34	/LINE 34- LT19 OUTPUT
	JMS*	ITVTB+35	/LINE 35- LT19 INPUT
	JMS*	ITVTB+36	/LINE 36- DECTAPE (ADDITIONAL)
	JMS*	ITVTB+37	/LINE 37- DATAPHONE (ADDITIONAL)
/
/	**** AN API-5 INTERRUPT IS USED BY THE SYSTEM CONFIGURATION TASK
/	     TO TEST FOR THE "RE-ENTRANT ECO PACKAGE" -- THIS LOCATION
/	     IS SET TO A 'DBK' INSTRUCTION BY THE SYSTEM CONFIGURATION
/	     ROUTINE AFTER MAKING THE TEST.
 .TITLE *** SYSTEM COMMUNICATIONS AREA
/
/ SYSTEM COMMUNICATIONS AREA -- ABSOLUTELY REFERENCED SYSTEM
/ POINTERS AND PARAMETERS
/
	.LOC	100
/
	P1EDTN		/EDIT NUMBER
/
/ RE-ENTRANT SYSTEM CELLS
/
R1	FACLB		/R1, R2, R3, R4, R5, R6, X10, X11, X12, X13, X14, X15,
R2	JMP SAPI	/X16, X17, & LOC 20 ARE REGISTERS USED BY RE-ENTRANT
R3	JMP CALDSP	/ROUTINES, AND ARE REGISTERS ARE SAVED AND RESTORED BY
R4	L20		/THE SYSTEM'S SAVE & RESTORE FACILITY.	/EAG:167
R5	0		/(R1, R2, R3, & R4, ARE SETUP FOR BOOTSTRAP LOADING)
R6	0
X10=10
X11=11
X12=12
X13=13
X14=14
X15=15
X16=16
X17=17
L20=20
/
/ ENTRY TO RE-ENTRANT SYSTEM ROUTINES (VIA JMS)
/
/ SEE ALSO ENTRY POINT TO NDELXR, FOLLOWING DISK		/EAG:167
/ ALLOCATE/DEALLOCATE CONTROL TABLES.				/EAG:167
/								/EAG:167
NADD	0		/// ADD NODE TO DEQUE
	.INH		///					/EAG:167
	JMP	NADDE	///
/
NDEL	0		/// DELETE NODE FROM DEQUE
	.INH		///					/EAG:167
	JMP	NDELE	///
/
PENP	0		/// PICK EMPTY NODE FROM POOL
	.INH		///					/EAG:167
	JMP	PENPE	///
/
PICK	0		/// PICK NODE FROM A DEQUE
	.INH		///					/EAG:167
	JMP	PICKE	///
/
SNAM	0		/// SEARCH DEQUE FOR NAME
	LAC	.-1	///
	JMP	SNAME
/
SPRI	0		/// SEARCH DEQUE FOR PRIORITY AND INSERT
	LAC	.-1	/// NODE
	JMP	SPRIE
/
SAVE	0		/// SAVE REGISTERS OF INTERRUPTED PROGRAM
	.INH		///
	JMP	SAVV	///
/
REST	JMP	RSR	/ RESTORE REGISTERS AND RETURN TO
			/ INTERRUPTED PROGRAM (SCOM ENTRY
			/ IS PROVIDED FOR TASKS -- SYSTEM USES
			/ 'RSR'.)
/
/ CURRENT TASK POINTER
/
CURTSK	ATKL		/WHEN A TASK IS CURRENT (RUNNING), 'CURTSK' CONTAINS
			/THE ADDRESS OF THE ATL NODE FOR THE TASK.
/
/ SYSTEM PARAMETERS
/
CSIZE	57777		/MAX CORE ADDRESS (SCF SET)
DSIZE	-1		/MAX RF DISK UNIT NUMBER (SCF SET)  NEGATIVE NUMBER
			/INDICATES "COLD START IMAGE" (FOR "RSX RESTORE").
TPS	D60		/CLOCK TICKS PER SECOND (SCF SET)
CTPS	-D60		/2'S COMP TPS (SCF SET)
LUTP1	LUT		/POINTER TO BEGINNING OF LOGICAL UNIT TABLE
LUTP2	LUT+NLU-1	/POINTER TO END OF LOGICAL UNIT TABLE
AFTP1	AFT		/POINTER TO BEGINNING OF ATTACH-FLAG-TABLE
AFTP2	AFT+NLU-1	/POINTER TO END OF ATTACH-FLAG-TABLE
NTSCSE	D60		/NUMBER OF TICKS SEPARATING CLOCK-GENERATED
			/SIGNIFICANT EVENTS (SCF SET).
/
/ BATCH FLAGS WORD
/
BATWD	0		/ THIS WORD IS USED BY RSX BATCH	/EAG:202
			/ WHEN ZERO, BATCH IS NOT RUNNING.	/EAG:202
			/ WHEN NON-ZERO, BATCH IS RUNNING.	/EAG:202
			/ FURTHERMORE, WHEN NON-ZERO THIS	/EAG:202
			/ IS THE ADDRESS OF THE BATCH		/EAG:202
			/ CONTROL TABLE WITHIN THE BATCH	/EAG:202
			/ HANDLER.  FOR MORE INFORMATION,	/EAG:202
			/ SEE THE BATCH HANDLER.		/EAG:202
/
/ SYSTEM ERROR LOG
/
SE.EP	0		/REQUEST'S (CAL'S) REJECTED DUE TO EMPTY POOL
	0		/(UNUSED)
SE.DR	0		/DISK RE-TRIES
SE.DF	0		/DISK FAILURES
SE.AD	0		/TASK LOADING ABORTS DUE TO DISK FAILURE
SE.AP	0		/TASK SCHEDULE ABORTS DUE TO EMPTY POOL
/
/ END OF SYSTEM ERROR LOG
/
								/EAG:203
								/EAG:203
								/EAG:203
/								/EAG:203
/ DEBUG/NORMAL MODE SWITCH.  THE FOLLOWING LOCATION IS		/EAG:203
/ NORMALLY A NOP.  IT MAY BE MANUALLY CHANGED TO A SKP		/EAG:203
/ TO PUT THE SYSTEM IN "DEBUG" STATE.  EXEC MODE TASKS		/EAG:203
/ USE THIS LOCATION TO DETERMINE WHETHER THEY SHOULD		/EAG:203
/ OUTPUT MESSAGES DESCRIBING PECULAR (I.E., VERY UNUSUAL	/EAG:203
/ IN NORMAL OPERATION) CONDITIONS WHICH ARE NOT NECESSARILY	/EAG:203
/ ERRORS.  THIS FEATURE WILL NORMALLY BE USED ONLY BE		/EAG:203
/ DEC PERSONNEL OR OTHER ADVANCED SYSTEMS PROGRAMMERS.		/EAG:203
/								/EAG:203
								/EAG:203
DEBUG	NOP		/ DEBUG VS. NORMAL NODE SWITCH.		/EAG:203
								/EAG:203
/
								/(212)
	.IFUND QJBLMT						/(212)
	0		/ RESERVED.				/(212)
	.ENDC							/(212)
	.IFDEF QJBLMT						/(212)
MAXJOB	QJBLMT		/ MAXIMUM NUMBER OF JOBS ALLOWABLE IN	/(206)
			/ THE BATCH JOB QUEUE.			/(206)
	.ENDC							/(212)
								/(212)
/
/ TIME VALUES
/
SSM	0		/SECONDS SINCE MIDNITE
DSR	0		/DAYS RUNNING COUNT
/
TT	0		/TIME OF DAY -- TICKS,
SS	0		/   SECONDS, MINUTES, AND
MM	0		/   HOURS. (MUST BE IN THAT
HH	0		/   ORDER AND CONSECUTIVE)
/
MO	1		/DATE
DA	1		/    MONTH, DAY, YEAR
YR	106 
/
/ MCR COMMUNICATIONS
/
MCRRI	1		/MCR REQUEST INHIBIT FLAG --
			/ 0 -- ^C TYPEIN SHOULD RESULT IN AN MCR REQUEST
			/+1 -- ^C TYPEIN SHOULD NOT RESULT IN AN MCR REQUEST,
			/      AND HAS NOT BEEN ATTEMPTED.
			/-1 -- ^C TYPEIN SHOULD NOT RESULT IN AN MCR REQUEST,
			/      AND AT LEAST ONE TYPE IN HAS BEEN MADE.  THIS IS
			/      FOR MCR FUNCTIONS THAT ABORT ON ^C TYPEIN.
IFAC	0		/ENTRY TO: READ A LINE & INIT FAC SUBROUTINE
	JMP* (IFACE)						/(161)
FAC	0		/ENTRY TO: FETCH A CHARACTER
	JMP* (FACE)						/(161)
/
/ TTY HANDLER PARAMETERS
/
TTYNUM	1		/NUMBER OF TTY'S ON THE MACHINE (SCF SET)
TTYRQT	TTWD07		/REQUEST QUEUES TABLE ADDRESS (FOR SCF)
TTMCTT	0		/UNIT NUMBER OF TTY FROM WHICH A ^C TYPEIN 
			/CAN ESTABLISH MCR DIALOGUE.
TTTDTT	0		/UNIT NUMBER OF TTY FROM WHICH A ^T TYPEIN
			/CAN ESTABLISH TDV DIALOGUE.
	TTWD00		/TTY UNIT 0 STATUS REGISTER
	TTWD06		/TTY UNIT 0 OUTPUT REGISTER
	TTK.EV		/TTY UNIT 0 KEYBOARD EVENT VARIABLE
	TTYS		/MAXIMUM NUMBER OF TTYS
	TTTGEV		/TTY TRIGGER EVENT VARIABLE ADDRESS
/
/ DISK PARAMETERS
/
WARMFL	0		/WARM START FLAG -- SET TO 777777 BY "...SAV" PRIOR TO
			/SAVING SYSTEM IMAGE ON DISK. BIT 0 IS USED BY THE RF15
			/DISK I/O DRIVER. BIT 1 IS RESERVED FOR THE RP02 DISK
			/PACK. THE REMAINDER OF THE WORD IS UNUSED.
/
/ CONTROL TABLE USED BY RF DISK FILE HANDLER
/ TO ALLOCATE STORAGE ON THE RS09 DECDISK.
/ STORAGE IS DEALLOCATED BY THE MCR FUNCTION "SAV" (WHENEVER CALLED)
/ SO THAT THE SAVED IMAGE DOES NOT INDICATE ALLOCATED
/ BLOCKS WHICH COULD BE REUSED.
/
RFACTB	0		/NUMBER OF WORDS DESIRED & ACTUALLY GRANTED.
	0		/DISK PLATTER NUMBER.
	0		/DISK ADDRESS.
/
/ RASP SCOM REGISTERS.  COMMUNICATION FOR UFG TASK.
/
GRLINK	0		/PTR. TO 'BEGIN' BLOCK.
GRSDFL	0		/SHUT DOWN FLG. (0=SHUT DOWN).
GRQPTR	0		/PTR. TO RPLQ IN RASP'S 'UFG' TASK.
GRQFLG	0
/
/ END OF RASP SCOMS
/
/								/(161)
/ MULTIACCESS CONTROL REGISTERS.
/								/(161)
/ THE FOLLOWING 12 (8) WORDS CONTROL THE MULTIUSER TASK		/(161)
/ DEVELOPMENT FACILITY OF RSX. THEY BY IMPLICATION ALSO CONTROL	/(161)
/ THE LUN MAPPING FACILITY WHICH IS AVAILABLE AS A STANDARD	/(161)
/ FEATURE FOR RSX.						/(161)
/								/(161)
	.IFUND NOMAC						/(161)
TDV.EQ	.			/ DEQUE USED FOR NOTIFYING THE	/(161)
	.-1			/ TDV POLLER THAT A TASK HAS	/(161)
				/ TERMINATED, EITHER NORMALLY OR/(161)
				/ ABNORMALLY.			/(161)
								/(161)
MA.UCA	0			/ POINTER TO THE BEGINNING OF	/(161)
				/ THE USER CONTEXT AREA IN TDV.	/(161)
								/(161)
MA.LOF	0			/ LUN OFFSET. THIS CONSTANT IS	/(161)
				/ ADDED TO THE LUN SPECIFIED IN	/(161)
				/ EACH QIO DIRECTIVE.		/(161)
								/(161)
MA.UN	0			/ MULTIACCESS USER NUMBER USED	/(161)
				/ AN INDEX INTO THE UCA.	/(161)
								/(161)
MA.BLU	0			/ BEGINNING OF THE MULTIACCESS	/(161)
				/ RESERVED LUN SPACE.		/(161)
								/(161)
MA.ELU	0			/ END OF THE MULTIACCESS	/(161)
				/ RESERVED LUN SPACE		/(161)
								/(161)
MA.CT	0			/ MULTIACCESS CONTROL T FLAG	/(161)
				/ REGISTER.			/(161)
								/(161)
MA.CY	0			/ MULTIACCESS CONTROL Y FLAG	/(161)
				/ REGISTER.			/(161)
								/(161)
MA.CST	0			/ POINTER TO THE MULTIACCESS	/(172)
				/ CONTROL AND STATUS TABLE. THE	/(172)
				/ FORMAT OF THE TABLE IS	/(172)
				/ DETAILED IN THE RSX MANUAL.	/(172)
	.ENDC							/(161)
	.IFDEF NOMAC						/(161)
	.BLOCK 3		/ PUT MA.LOF IN SAME PLACE	/(161)
MA.LOF	0							/(161)
	.BLOCK 6		/ SIX SPARE WORDS		/(161)
	.ENDC							/(161)
XSIZE	0		/INDICATES TOP OF THE EXEC (SCF SET)
/								/(206)
/ PARAMETERS FOR THE RSX LIGHT SHOW.				/(206)
/								/(206)
PATRN	0		/ INITIAL SEED FOR THE LIGHT SHOW.	/(206)
CENTR	20		/ BIT SOURCE FOR CENTER OF PATTERN.	/(206)
LMAGIC	SWHA		/ INSTRUCTION NEEDED TO GENERATE MOST 	/(206)
			/ PATTERNS.				/(206)
/
/ HARDWARE EXISTENCE FLAGS
/
PRHDWE	NOP		/SET (SKP) IF PROTECT & RELOCATE HARDWARE EXIST (BY SCF)
FPHDWE	NOP		/SET (SKP) IF FLOATING POINT ARITHMETIC HARDWARE EXISTS (BY SCF)
/
/ POOL SIZE
/
PLSZ	0		/POOL SIZE (SCF SET, NOT USED)
/
/ DEQUE LIST HEADS
/
POOL	BPL		/POOL OF EMPTY NODES
	EPL
/
STKL	MCR		/SYSTEM TASK LIST
	SCF
/
ATKL	DSK		/ACTIVE TASK LIST
	SFG
/
CKQ	.		/CLOCK QUEUE
	.-1
/
PBDL	.		/PARTITION BLOCK DEFINITIONS LIST
	.-1
/
PDVL	DSK0		/PHYSICAL DEVICE LIST
	TT00
/
SCDL	.		/SYSTEM COMMON BLOCK DEFINITIONS LIST
	.-1
/
TNRL	.		/TERMINATION NOTICE REQUEST LIST
	.-1
/
IORDQ	.		/I/O RUNDOWN QUEUE
	.-1
/
WTL	.		/RASP-15'S "WAIT TASK LIST" USED FOR TASK SWAPPING.
	.-1
/
LPOOL	.		/POOL OF EMPTY LARGE NODES
	.-1
/
SNDL	.		/DEQUE OF SMALL NODE PARTITIONS
	.-1
/
LNDL	.		/DEQUE OF LARGE NODE PARTITIONS
	.-1
/
/ BEGIN EXECUTE AREA OF SCOM
/
EXECT	1		/EXECUTE CONTROL TABLE
	0
	.SIXBT "FIN"
	.SIXBT "INS"
EXELH	.		/EXECUTE LIST HEAD
	.-1
/
/ ABORT TASK
/
RETX	CAL	(10)	/"RE-ENTRANT TASK" -- USED TO EXIT ACTIVE TASKS
/
/ DISK EXISTANCE WORDS
/
SYSDSK	3		/SYSTEM DISK TYPE
RKDISK	-1		/POSITIVE IF UNICHANNEL DISK PRESENT
RPDISK	1		/POSITIVE IF RP02 DISK PACK PRESENT
			/(RKDISK AND RPDISK ARE EQUAL TO MAXIMUM UNIT #).
/
/ MISCELLANEOUS POINTERS AND PARAMETERS
/
LUFD1	LUNUFD		/POINTER TO BEGINNING OF LUN/UFD TABLE
LUFD2	LUNUFD+NLU-1	/POINTER TO END OF LUN/UFD TABLE
DUFD1	UFDDSK		/POINTER TO BEGINNING OF UFD/DISK TABLE
DUFD2	UFDDSK+20	/POINTER TO END OF UFD/DISK TABLE
DSAFLG	DSACPL		/ADDRESS OF FLAG FOR DSA, TO SHOW IF A BIT MAP'S IN CORE
REMBLK	0		/STARTING BLOCK FOR 'REMOVE' CHAIN OF DISK BLOCKS
TIMFLG	0		/FLAG SET TO ADDR OF TASK TIMING CONTROL
			/TABLE TO TURN TASK TIMING ON. ZEROED IF
			/TASK TIMING IS OFF.
/								/(206)
/ PARAMETERS FOR THE RSX LIGHT SHOW.				/(206)
/								/(206)
RIGHT	37700		/ MASK FOR BITS SHIFTED RIGHT.		/(206)
LEFT	760017		/ MASK FOR BITS SHIFTED LEFT.		/(206)
SLITIM	0		/2'S COMPLEMENT OF THE NUMBER OF TICKS A TIME
			/TIME SLICED TASK SHOULD BE ALLOWED TO RUN.
SLIHR	0		/HIGHEST SLICING PRIORITY
SLILR	0		/2'S COMPLEMENT OF LOWEST SLICING PRIORITY
SLICNT	0		/TICKS PER QUANTUM ISZ COUNTER (#204)
/
SPY1	SPY1			/ START OF THE SPY AREA (A	/(161)
				/ POINTER).			/(161)
SPY2	SPY2			/ END OF THE SPY AREA (A	/(161)
				/ POINTER)			/(161)
JOB1	.		/HEADER OF THE QUEUE JOB DEQUE
JOB2	.-1		/BACK POINTER TO THE QUEUE JOB DEQUE
/
/ RE-ENTRANT ROUTINES FOR I/O HANDLER TASKS
/
/ SEE ALSO ENTRY POINT TO DQAB, FOLLOWING DISK			/EAG:167
/ ALLOCATE/DEALLOCATE CONTROL TABLES.				/EAG:167
/								/EAG:167
ALAD	0		/// ATTACH LUN & DEVICE-UNIT TO INDICATED TASK
	LAC	.-1	///
	CLL			/ LINK=0 ==> ATTACH FUNCTION	/EAG:167
	JMP	ATDT
/								/EAG:167
	.BLOCK 1		/ FREE WORD			/EAG:167
/
DLAD	0		/// DETACH LUN & DEVICE FROM TASK
	LAC	.-1	///
	STL			/ LINK=1 ==> DETACH FUNCTION	/EAG:167
	JMP	ATDT
/								/EAG:167
	.BLOCK 1		/ FREE WORD			/EAG:167
/
DQRQ	0		/// DE-QUEUE AN I/O REQUEST
	LAC	.-1	///
	JMP	DQRQ1
/
VAJX	0		/// VERIFY AND ADJUST (TO 17-BITS) I/O TRANSFER
	LAC	.-1	/// PARAMETERS
	JMP	VAJX1
/
IOCD	0		/// TO DECLARE I/O REQUEST COMPLETED (DECREMENT TRANSFERS
	.INH		/// PENDING COUNT.			/EAG:167
	JMP	IOCD1	///
/
PABF	0		/// TO PREALLOCATE AN I/O BUFFER
	LAC	.-1	///
	JMP	PABF1
/
ALBF	0		/// TO ALLOCATE AN I/O BUFFER
	LAC	.-1	///
	JMP	ALBF1
/
DABF	0		/// TO DEALLOCATE AN I/O BUFFER
	LAC	.-1	///
	JMP	DABF1
/
DMTQ	0		/// TO DETACH A DEVICE AND TO
	LAC	.-1	/// EMPTY AN I/O REQUEST QUEUE
	JMP	DMTQ1	/OF ALL OF A TASK'S REQUESTS
/
/ ALLOCATE/DEALLOCATE CONTROL TABLES FOR DISK FILES HANDLERS
/ EXCEPT THE RF HANDLER. (THESE TABLES CORRESPOND TO RFACTB)
/
RPACT0	0		/ALLOCATE/DEALLOCATE CONTROL TABLES FOR:
	0		/UNIT 0 RP DISK PACK HANDLER.
	0
RPACT1	0		/UNIT 1 DISK PACK HANDLER
	0
	0
RPACT2	0		/UNIT 2 DISK PACK HANDLER
	0
	0
RPACT3	0		/UNIT 3 DISK PACK HANDLER
	0
	0
RPACT4	0		/UNIT 4 DISK PACK HANDLER
	0
	0
RPACT5	0		/UNIT 5 DISK PACK HANDLER
	0
	0
RPACT6	0		/UNIT 6 DISK PACK HANDLER
	0
	0
RPACT7	0		/UNIT 7 DISK PACK HANDLER
	0
	0
/
RKACT0	0		/ALLOCATE/DEALLOCATE CONTROL TABLES FOR:
	0		/UNIT 0 RK DISK FILE HANDLER
	0
RKACT1	0		/UNIT 1 RK DISK FILE HANDLER
	0
	0
RKACT2	0		/UNIT 2 RK DISK FILE HANDLER
	0
	0
RKACT3	0		/UNIT 3 RK DISK FILE HANDLER
	0
	0
RKACT4	0		/UNIT 4 RK DISK FILE HANDLER
	0
	0
RKACT5	0		/UNIT 5 RK DISK FILE HANDLER
	0
	0
RKACT6	0		/UNIT 6 RK DISK FILE HANDLER
	0
	0
RKACT7	0		/UNIT 7 RK DISK FILE HANDLER
	0
	0
/
/ ADDITIONAL RE-ENTRANT ROUTINE ENTRY POINTS			/EAG:167
/								/EAG:167
NDELXR	0			/// DELETE NODE TO WHICH XR	/EAG:167
	.INH			/// POINTS			/EAG:167
	JMP NDLXRE		///				/EAG:167
/								/EAG:167
DQAB	0			/// DE-QUEUE AN I/O REQUEST IF	/EAG:167
	.INH			/// AND ONLY IF IT IS AN ABORT	/EAG:167
	JMP DQAB1		///				/EAG:167
/								/EAG:167
 .TITLE *** API TRAP TRANSFER VECTOR TABLE
/
/ TABLE ENTRIES ARE MADE BY THE 'CONNECT' & 'DISCONNECT' DIRECTIVES.
/ THE LINE NUMBER (DECIMAL) USED WITH THESE DIRECTIVES IS INDICATED
/ IN SQUARE BRACKETS. 
/
ITVTB	0	/[--] SOFTWARE LEVEL 4
	SCF1	/[--] SOFTWARE LEVEL 5
L6TV	M0	/[--] SOFTWARE LEVEL 6
	0	/[--] SOFTWARE LEVEL 7
	EMGINT	/[04] DECTAPE
	EMGINT	/[05] MAGTAPE
	EMGINT	/[06]
	DSKRKI	/[07] UC15 UNICHANNEL DISK
	EMGINT	/[10] PAPER TAPE READER
	CLKINT	/[--] CLOCK OVERFLOW
	EMGINT	/[12] POWER FAIL
	EMGINT	/[13] MEMORY PARITY ERR
	EMGINT	/[14] VP15 & VT15
	EMGINT	/[15] CARD READER
	EMGINT	/[16] LINE PRINTER
	EMGINT	/[17] A-D CONVERTER
	EMGINT	/[20] DB99A-DB98A
	EMGINT	/[21]
	EMGINT	/[22] DATAPHONE
	DSKRFI	/[23] RF15 DISK
	DSKRPI	/[24] RP15  DISK PACK
	EMGINT	/[25] PLOTTER
	EMGINT	/[26]
	EMGINT	/[27]
	EMGINT	/[30] 
	EMGINT	/[31]
	EMGINT	/[32]
	EMGINT	/[33]
	TTYPI	/[--] LT19 OUTPUT
	TTYKI	/[--] LT19 INPUT
	EMGINT	/[36] DECTAPE (ADDITIONAL)
	EMGINT	/[37] DATAPHONE (ADDITIONAL)
	TTYPCT	/(166)[--] CONSOLE TTY PRINTER **
	TTYKCT	/(166[--] CONSOLE TTY KEYBOARD **
	EMGINT	/[42] PAPER TAPE PUNCH **
	MPKINT	/[--] MEMORY PROTECT VIOLATION **
ETVTB=.		/END OF TABLE
/
/ ** SIMULATED API INTERRUPTS.  PI INTERRUPTS RESULT IN API-3
/ INTERRUPTS, USE SKIP CHAIN TO DETERMINE INTERRUPTING DEVICE, AND
/ SIMULATE A 'JMS* TV'.
/
/ ENTRY FROM LOC 001 @ API-3
/
SAPI	DBA		/SET INDEX MODE
	ION		/(166)PI ENABLED AGAIN
	TSF		/(166)SKIP IF CONSOLE TTY PRINTER
	SKP		/(166) NOPE
	JMP*	ITVTB+40 /(166)TO INTRUPT SERVICE DIRECTLY
	KSF		/(166)CONSOLE TTY KEYBOARD?
	SKP		/(166) NO
	JMP*	ITVTB+41 /(166)GO DIRECTLY THERE
	DAC	SAPIB1	/SAVE AC
	MPSK		/MEMORY PROTECT VIOLATION?
	JMP	.+3
	LAC	ITVTB+43 /YES -- SELECT TV ADR
	JMP	SAPCC
	PSF		/NO -- PAPER TAPE PUNCH?
	JMP	.+3
	LAC	ITVTB+42 /YES -- SELECT TV ADR
	JMP	SAPCC
/
	NOP		/NO -- SPURIOUS PI INTERRUPT
	LAC	000	/TRY TO CLEAR VIA EMERGENCY 
	DAC	EMGINT	/INTERRUPT SERVICE ROUTINE
	LAC	SAPIB1
	JMP	EMGINT+1
/
SAPCC	DAC	SAPIB2	/COMMON CODE FOR SIMULATING API INTERRUPT
	LAC	000	/SIMULATE 'JMS TV'
	DAC*	SAPIB2
	ISZ	SAPIB2
	LAC	SAPIB1
	JMP*	SAPIB2
/
SAPIB1	0		/AC BUFFER
SAPIB2	0		/WORKING CELL
/
/ EMERGENCY INTERRUPT SERVICE ROUTINE FOR AN INTERRUPT ON A LINE
/ THAT HAS NOT BEEN "CONNECTED".  THIS ROUTINE SHOULD BE ABLE TO 
/ HANDLE INTERRUPTS FROM ALL DEVICES WHOSE INTERRUPTS CANNOT
/ BE CONTROLLED.  E.G., THOSE WHO INTERRUPT WHENEVER POWER IS
/ TURNED ON, OR A BUTTON IS PRESSED.
/
EMGINT	0
	700521		/CLEAR VP15A DISPLAY DONE FLAG IF SET
	SKP
	700722
/
	706721		/CLEAR CARD READER FLAG IF SET
	SKP
	706704
/
	NOP; SKP; NOP
	NOP; SKP; NOP
	NOP; SKP; NOP
	NOP; SKP; NOP
/
	DBR		/HOPEFULLY THE OFFENDING FLAG WAS CLEARED, EXIT
	JMP*	EMGINT	/EMERGENCY INTERRUPT SERVICE ROUTINE
/
	.LST
	.IFUND	L.DIR
	.NOLST
	.ENDC
 .TITLE *** CAL DISPATCH & RETURN
/
/ ALL CAL'S RESULT IN A TRANSFER TO 'CALDSP', REGARDLESS	/EAG:167
/ OF WHETHER THE CAL IS A NORMAL CAL OR AN INDIRECT CAL		/EAG:167
/ (CAL*).  THE TRANSFER IS VIA LOCATIONS 20 AND 21.		/EAG:167
/ LOCATION 20 IS INITIALIZED TO POINT TO ITSELF, SO THAT	/EAG:167
/ BOTH DIRECT AND INDIRECT (CAL*) CAL'S WILL TRAP THROUGH	/EAG:167
/ LOCATION 20.  THE CAL OPERAND IS EXPECTED TO BE A		/EAG:167
/ CAL PARAMETER BLOCK (CPB), AND SHOULD BE ADDRESSED BY THE	/EAG:167
/ CAL.  INDIRECT AND/OR INDEXED ADDRESSING IS ALLOWED AND WILL	/EAG:167
/ BE HANDLED CORRECTLY.  NOTE, HOWEVER, THAT INDIRECT CAL'S	/EAG:167
/ MUST BE TASK ISSUED -- THEY MAY NOT BE USED BY INTERRUPT	/EAG:167
/ ROUTINES.  THE FIRST WORD OF THE CAL PARAMETER BLOCK IS	/EAG:167
/ EXPECTED TO CONTAIN A CAL FUNCTION CODE IN BITS 12-17.	/EAG:167
/
/ CONTROL IS TRANSFERRED TO A "CAL SERVICE ROUTINE" WITH THE INDEX
/ REG (XR) AND THE AUTO INCREMENT REG X10 POINTING TO THE CAL PARAMETER BLOCK.
/ THE CAL SERVICE ROUTINE IS SELECTED BY THE DISPATCH TABLE 'CALDT' AND
/ THE FUNCTION CODE.
/
/ X11 IS SET ZERO IF CAL WAS ISSUED BY A TASK (AT API-7).  BITS 10-16
/ ARE SET TO INDICATE ACTIVE API LEVELS 0-6 (EXCLUDING API-4).
/
/ THE CAL EXIT ROUTINE 'CXDAC' EXPECTS X14 TO CONTAIN AN EVENT VARIABLE
/ ADDRESS, OR A ZERO IF AN EVENT VARIABLE WAS NOT SPECIFIED.  X14 IS SET
/ BY THE 'CPBRX' SUBROUTINE, WHICH IS CALLED BY ALL CAL'S THAT MAY RETURN
/ AN EVENT VARIABLE (ALL EXCEPT 'WAIT', SUSPEND' & 'EXIT').
/
/ THE CAL DISPATCH ROUTINE IS RE-ENTRANT, THUS CAL SERVICE ROUTINES
/ MAY BE REENTRANTLY CALLED. IT IS REENTRANT, HOWEVER, ONLY BY
/ VIRTUE OF THE FACT THAT INTERRUPT SERVICE ROUTINES WHICH MIGHT CAL
/ MUST SAVE AND RESTORE THE CONTENTS OF LOCATION 20.
/
/ EXIT FROM A CAL SERVICE ROUTINE IS VIA THE CAL EXIT ROUTINE 'CALEXT',
/ EXCEPT 'WAIT', 'SUSPEND', 'EXIT', AND SOMETIMES 'WAITFOR'.  (EACH OF
/ THESE RESET 'L20' TO HANDLE INDIRECT CAL'S CORRECTLY.)	/EAG:167
/
/ REGISTER USAGE: R1, R2, R3, R4, R5, X10, X11, L20, XR & AC	/EAG:167
/
/ "NORMAL MODE" CAL'S WITH ILLEGAL CPB OR EVENT VARIABLE	/EAG:167
/ ADDRESSES RESULT IN TASK TERMINATION.  A CAL INDIRECT		/EAG:167
/ FROM AN INTERRUPT SERVICE ROUTINE IS ILLEGAL, YET WILL	/EAG:167
/ NOT BE DETECTED.						/EAG:167
/
								/EAG:167
								/EAG:167
CALDSP	DBA		/SET INDEX MODE
	RPL		/SET X11 BITS 10-16 TO INDICATE ACTIVE
	AND	(366)	/API LEVELS 0-6.
	DAC	X11
/
	PXA			/ SAVE XR IN R3 IN CASE WE	/EAG:167
	DAC R3			/ HAVE AN INDEXED CAL.		/EAG:167
/								/EAG:167
	LAC L20			/ CONSTRUCT AN ADDRESS FIELD	/EAG:167
	RTL			/ MASK IN R2 -- 007777 IF IN	/EAG:167
	SZL!RAL			/ PAGE MODE, 017777 IF IN BANK	/EAG:167
	CLA!CMA!SKP		/ MODE.  ALSO LEAVE STATE	/EAG:167
	LAW 767777		/ OF USER/EXEC MODE BIT		/EAG:167
	AND (017777)		/ IN LINK.			/EAG:167
	DAC R2							/EAG:167
/								/EAG:167
	XOR (077777)		/ EXTRACT HIGH ORDER BITS (PAGE	/EAG:167
	AND L20			/ OR BANK BITS) FROM CAL RETURN	/EAG:167
	DAC R1			/ ADDRESS AND SAVE IN R1.	/EAG:167
/								/EAG:167
	LAC L20			/ COMPUTE THE 15-BIT CAL	/EAG:167
	AAC -1			/ INSTRUCTION VIRTUAL ADDRESS,	/EAG:167
	AND R2			/ CORRECTLY ADJUSTING FOR	/EAG:167
	XOR R1			/ BANK/PAGE WRAP AROUND.	/EAG:167
	SZL			/ SKIP IF EXEC MODE.		/EAG:167
	TAD CTBIAS		/ SET XR TO THE 17-BIT CAL	/EAG:167
	PAX			/ INSTRUCTION REAL (ABSOLUTE)	/EAG:167
				/ ADDRESS.			/EAG:167
/								/EAG:167
	LAC 0,X			/ TERMINATE TASK IF CAL INSTR.	/EAG:167
	AND (37777)		/ WAS OBJECT OF AN XCT INSTR.,	/EAG:167
	SAD 0,X			/ OR IF TASK EXECUTED A ZERO.	/EAG:167
	SNA!CLA!CMA		/ SKIP IF OK, LEAVE AC = -1.	/EAG:167
	JMP CALTT		/ JMP IF EITHER ERROR CHECK	/EAG:167
				/ FAILED.			/EAG:167
/								/EAG:167
	DAC R4			/ ASSUME CAL* (INDIRECT CAL).	/EAG:167
				/ SET INDIRECT FLAG (-1 ==>	/EAG:167
				/ INDIRECT CAL); NOTE THAT -1	/EAG:167
				/ HAS BEEN LEFT IN AC.		/EAG:167
	LAC 0,X			/ PICK UP CAL INSTRUCTION.	/EAG:167
	AND (17777)		/ MASK OUT INDIRECT BIT.	/EAG:167
	SAD 0,X			/ SKIP IF INDIRECT BIT WAS SET.	/EAG:167
	DZM R4			/ INDIRECT BIT CLEAR ==> DIRECT	/EAG:167
				/ CAL -- CLEAR INDIRECT FLAG.	/EAG:167
	DAC R5			/ SET R5 TO CAL INSTRUCTION	/EAG:167
				/ WITH INDIRECT BIT MASKED OUT.	/EAG:167
/								/EAG:167
/			NOTE:	THE NEXT TWO INSTRUCTIONS	/EAG:167
/				ARE EFFECTIVELY NOP'S WHEN	/EAG:167
/				THE TASK IS IN BANK MODE.	/EAG:167
/				THIS IS BECAUSE R2 WILL		/EAG:167
/				CONTAIN 17777.  THEREFORE,	/EAG:167
/				WHEN THE TASK IS IN BANK MODE,	/EAG:167
/				R3 WILL ALWAYS BE CLEARED.	/EAG:167
/								/EAG:167
	AND R2			/ MASK OUT INDEX BIT.		/EAG:167
	SAD R5			/ SKIP IF INDEX BIT SET.	/EAG:167
	DZM R3			/ INDEX BIT CLEAR -- ZERO	/EAG:167
				/ SAVED XR VALUE SO NO		/EAG:167
				/ INDEXING WILL BE DONE.	/EAG:167
	XOR R1			/ MERGE IN HIGH ORDER		/EAG:167
				/ ADDRESS BITS.			/EAG:167
	ISZ R4			/ INDIRECT CAL?  SKIP IF YES.	/EAG:167
	JMP CALD.0		/ JMP IF DIRECT CAL.		/EAG:167
	JMS CACAJ		/ CHECK ADDRESS AND RETURN	/EAG:167
				/ 17-BIT INDIRECT WORD ADDRESS	/EAG:167
				/ IN AC.			/EAG:167
	PAX			/ PICK UP CONTENTS OF INDIRECT	/EAG:167
	LAC 0,X			/ WORD (PERFORM INDIRECTION).	/EAG:167
CALD.0	TAD R3			/ PERFORM INDEXING.		/EAG:167
	JMS CACAJ		/ CHECK ADDRESS AND RETURN	/EAG:167
				/ 17-BIT CPB ADDRESS IN AC.	/EAG:167
	PAX			/ PUT THE CPB ADDRESS IN	/EAG:167
	DAC X10			/ XR AND X10.			/EAG:167
/								/EAG:167
	LAC 0,X			/ VERIFY THAT THE FIRST CPB	/EAG:167
	SNA			/ WORD IS NON-ZERO		/EAG:167
	JMP CALTT		/ JMP IF FIRST CPB WORD ZERO	/EAG:167
	AND (77)		/ EXTRACT CAL FUNCTION CODE	/EAG:167
	SNA!CLL			/ AND CHECK FOR QUEUE I/O	/EAG:167
				/ (ZERO) FUNCTION CODE.  ALSO	/EAG:167
				/ INITIALIZE LINK FOR FUNCTION	/EAG:167
				/ CODE RANGE CHECK BELOW.	/EAG:167
	JMP IO.			/ JMP IF CPB IS QUEUE I/O	/EAG:167
	TAD (-CALDTN+CALDT-1)	/ CPB FUNCTION CODE RANGE CHECK	/EAG:167
				/ SET LINK IF FUNCTION CODE IS	/EAG:167
				/ TOO LARGE.			/EAG:167
	AAC +CALDTN-CALDT+1	/ RESTORE CPB FUNCTION CODE IN	/EAG:167
				/ AC WITHOUT MODIFYING LINK.	/EAG:167
	SAD 0,X			/ VERIFY THAT CPB WORD ONE	/EAG:167
				/ CONTAINS ONLY THE FUNCTION	/EAG:167
				/ CODE, WITH NO HIGH ORDER BITS	/EAG:167
				/ SET.				/EAG:167
	SZL			/ COME HERE IF NO HIGH ORDER	/EAG:167
				/ BITS SET.  VERIFY CPB FUNC-	/EAG:167
				/ TION CODE WAS IN RANGE.	/EAG:167
	JMP CALTT		/ JMP IF CPB WORD ONE HAS HIGH	/EAG:167
				/ ORDER BITS SET OR IF CPB	/EAG:167
				/ FUNCTION CODE IS OUT OF RANGE	/EAG:167
	TAD (CALDT-1)		/ TRANSFER CONTROL THROUGH	/EAG:167
	DAC R2			/ DISPATCH TABLE TO DIRECTIVE	/EAG:167
	JMP* R2			/ PROCESSING ROUTINE WITH XR &	/EAG:167
				/ X10 POINTING TO THE CPB.	/EAG:167
/
/ CAL DISPATCH TABLE
/
/      DISPATCH INST   CODE    FUNCTION
/
			/00	QUEUE I/O REQUEST
CALDT	JMP	RQ.	/01	REQUEST TASK EXECUTION
	JMP	SC.	/02	SCHEDULE TASK EXECUTION
	JMP	RN.	/03	RUN TASK
	JMP	CN.	/04	CANCEL TASK SCHEDULING
	JMP	WT.	/05	WAIT FOR NEXT SIGNIFICANT EVENT
	JMP	SP.	/06	SUSPEND TASK EXECUTION
	JMP	RS.	/07	RESUME TASK EXECUTION
	JMP	EX.	/10	EXIT TASK
	JMP	CI.	/11	CONNECT INTERRUPT LINE
	JMP	DI.	/12	DISCONNECT INTERRUPT LINE
	JMP	MT.	/13	MARK TIME
	JMP	SY.	/14	SYNCHRONIZE TASK
	JMP	FX.	/15	FIX IN CORE
	JMP	UF.	/16	UN-FIX
	JMP	SJ.	/17	SET JEA REGISTER
	JMP	WF.	/20	WAIT FOR EVENT VARIABLE
	JMP	DA.	/21	DISABLE
	JMP	EA.	/22	ENABLE
	JMP	UM.	/23	UNMARK
	JMP	DT.	/24	DATE & TIME INFORMATION
	JMP	TN.	/25	TASK NAME INFORMATION
	JMP	PI.	/26	PARTITION INFORMATION
	JMP	RB.	/27	RAISE MEMORY PROTECT BOUND
	JMP	RASP.1	/30	CAL USED FOR RASP-15
	JMP	SPY.	/31	SPY
	JMP	SPYST.	/32	SPYSET
	JMP	QJOB.	/33	QUEUE JOB
	JMP	XE.	/34	EXECUTE
	.IFDEF	NOXM
	JMP	CALTT	/35
	.ENDC
	.IFUND	NOXM
	JMP	SHR.	/35	SHARE
	.ENDC
	JMP RQ.M	/36	REQUEST MAPPED TASK		/(161)
	JMP	TC.	/37	TRANSFER COMMAND [STRING] TO TDV FUNCTION
CALDTN=.			/ ALL OTHER FUNCTION CODES	/EAG:167
				/ FLAGGED ILLEGAL IN TEST	/EAG:167
				/ PRIOR TO DISPATCH.		/EAG:167
/
/ ROUTINES TO SET THE REQUESTOR'S EVENT VARIABLE AND EXIT FROM
/ A CAL.  AUTO INCREMENT REGISTER X10 IS EXPECTED TO CONTAIN
/ THE ADDRESS OF THE CAL PARAMETER BLOCK.  (X10 IS INCREMENTED.)
/
CX001	LAW	-1	/CAL ERR 01
	JMP	CXDAC
CX026	LAW	-26	/CAL ERR 26
	JMP	CXDAC
CX030	LAW	-30	/CAL ERR 30
	JMP	CXDAC
CX032	LAW	-32	/CAL ERR 32
	JMP	CXDAC
CX077	LAW	-77	/CAL ERR 77
	JMP	CXDAC
CX101	LAW	-101	/CAL ERR 101
	JMP	CXDAC
CX102	LAW	-102	/CAL ERR 102
	JMP	CXDAC
CX103	LAW	-103	/CAL ERR 103
	JMP	CXDAC
CX104	LAW	-104	/CAL ERR 104
	JMP	CXDAC
CX105	LAW	-105	/CAL ERR 105				/EAG:202
	JMP	CXDAC						/EAG:202
CX106	LAW	-106	/CAL ERR 106				/EAG:202
	JMP	CXDAC						/EAG:202
CX201	LAW	-201	/CAL ERR 201
	JMP	CXDAC
CX202	LAW	-202	/CAL ERR 202
	JMP	CXDAC
CX203	LAW	-203	/CAL ERR 203
	JMP	CXDAC
CX204	LAW	-204	/CAL ERR 204
	JMP	CXDAC
CX205	LAW	-205	/CAL ERR 205
	JMP	CXDAC
CX206	LAW	-206	/CAL ERR 206
	JMP	CXDAC
CX207	LAW	-207	/CAL ERR 207
	JMP	CXDAC
CX210	LAW	-210	/CAL ERR 210
	JMP	CXDAC
CX211	LAW	-211	/CAL ERR 211
	JMP	CXDAC
CX212	LAW	-212	/CAL ERR 212
	JMP	CXDAC
CX213	LAW	-213	/CAL ERR 213
	JMP	CXDAC
CX301	LAW	-301	/CAL ERR 301
	JMP	CXDAC
CX302	LAW	-302	/CAL ERR 302
	JMP	CXDAC
CX777	LAW	-777	/CAL ERR 777 -- OUT OF POOL,
	ISZ	SE.EP	/INCREMENT EMPTY POOL COUNT
	NOP
	JMP	CXDAC
CXPND	CLA!SKP		/REQUEST PENDING CAL EXIT
CXSUC	LAC	(+1)	/SUCCESSFUL COMPLETION CAL EXIT
CXDAC	DAC	R1	/CAL SERVICE EXIT -- SET EVENT VARIABLE (WHOSE ADR
	LAC	X14	/IS IN X14) TO THE CONTENTS OF AC.
	SNA		/ZERO EVENT VARIABLE ADDRESS IMPLIES NO ADDRESS
	JMP	CALEXT	/SPECIFIED
	PAX
	LAC	R1
	DAC	0,X
/
/ IF A CAL IS EXECUTED AT API LEVELS 7, 6, OR 5, API-4 IS SET
/ ACTIVE, AND A DEBREAK IS NECESSARY AT CAL EXIT.
/
CALEXT	RPL		/IS API LEVEL 3,2,1,OR 0 ACTIVE?
	AND	(360)
	SNA
	JMP	CALEX2	/NO -- EXIT A TASK ISSUED CAL
	RES		/YES -- EXIT AN INTERRUPT SERVICE ROUTINE ISSUED CAL
	JMP*	L20
/
CALEX2	LAC	L20	/SETUP 'L20' TO HANDLE A CAL INDIRECT.
	DAC	R1
	LAC	(L20)						/EAG:167
	DAC	L20
	DBR
	JMP*	R1
 .TITLE *** COMMON ROUTINES FOR CAL SERVICE
/
/ CACAJ -- RE-ENTRANT SUBROUTINE TO CHECK AND ADJUST (TO 17 BITS)
/ AN ADDRESS IN AC. 
/
/ IF AN ADDRESS FROM A "NORMAL MODE" TASK IS OUT OF RANGE,
/ THE TASK IS ABORTED.
/
/ R1, R2, & AC ARE ALTERED.
/
CACAJ	0		///
	.INH		///SAVE TEST ADDRESS IN R1 & RETURN ADDRESS IN R2
	DAC	R1	///
	.ENB		///
	LAC	CACAJ	///
	DAC	R2
/
	LAC	L20	/"NORMAL (USER) MODE"?
	RTL
	SMA
	JMP	CACAJ2	/NO -- DO NOT CHECK OR ADJUST
	LAC	CTSIZE	/YES -- COMPARE ADDRESS WITH MAX. TASK SIZE
	TCA		/AVAILABLE TO CURRENT (ISSUING) TASK.
	TAD	R1
	SMA		/TOO LARGE?
	JMP	CALTT	/YES -- ABORT TASK
	LAC	R1	/NO -- TOO SMALL?
	SPA
	JMP	CALTT	/YES -- ABORT TASK
	TAD	CTBIAS	/NO -- ADD RELOCATION BIAS TO ADDRESS
	JMP*	R2	/AND RETURN WITH ADJUSTED ADDRESS IN AC.
/
CACAJ2	LAC	R1	/CAL HAS BEEN ISSUED BY EITHER AN "EXEC
	JMP*	R2	/MODE" TASK, OR BY AN INTERRUPT SERVICE
			/ROUTINE (I.E., 'CTBIAS' HAS NO MEANING),
			/RETURN WITH ADDRESS IN AC.
/
/ CPBRX -- RE-ENTRANT SUBROUTINE TO CHECK THE RANGE OF A "NORMAL MODE"
/ TASK'S CAL PARAMETER BLOCKS.  IF A CPB EXTENDS BEYOND THE UPPER 
/ BOUND OF A TASK, THE TASK IS TERMINATED, AND CONTROL IS NOT 
/ RETURNED FROM 'CPBRX'.
/
/ IF CONTROL IS RETURNED FROM 'CBPRX', X14 & AC CONTAIN THE ADDRESS
/ (17-BITS) OF A REQUESTOR'S EVENT VARIABLE, OR ZERO IF AN EVENT
/ VARIABLE HAS NOT BEEN SPECIFIED.
/
/ THIS SUBROUTINE IS USED BY ALL CAL SERVICE ROUTINES FOR CAL'S
/ WITH CPB'S OF TWO OR MORE WORDS, BOTH TO VERIFY THE CPB RANGE,
/ AND TO PREPARE 'X14' FOR THE 'CXDAC' CAL EXIT.
/
/ THIS ROUTINE EXPECTS BOTH X10 & XR TO CONTAIN A 17-BIT CPB ADDRESS,
/ AND AC TO CONTAIN THE 2'S COMPLEMENT OF THE CPB SIZE.
/
/ R1, R2, R3, X14, & AC ARE ALTERED.
/
CPBRX	0		///
	.INH		///SAVE CPB SIZE IN R2 & RETURN ADDRESS IN R3
	DAC	R2	///
	.ENB		///
	LAC	CPBRX	///
	DAC	R3
/
	LAC	L20	/CAL ISSUED BY "EXEC MODE" TASK?
	RTL
	SPA
	JMP	CPBRX2
	LAC	1,X	/YES -- ASSUME CPB TO BE CORRECT AND SET X14
	DAC	X14
	JMP*	R3	/EXIT
/
CPBRX2	LAC	X10	/NO -- IS ENTIRE CPB WITHIN PARTITION?
	TCA
	TAD	R2
	TAD	CTBIAS
	TAD	CTSIZE
	SPA!SNA
	JMP	CALTT	/NO -- TERMINATE TASK
	LAC	1,X	/YES -- WAS AN EVENT VARIABLE SPECIFIED?
	SZA		/NO -- DO NOT ALTER OR CHECK EVENT VARIABLE "ADDRESS"
	JMS	CACAJ	/YES -- CHECK AND ADJUST (TO 17-BITS) EVENT VARIABLE
	DAC	X14	/SET X14 TO EVENT VARIABLE ADDRESS, OR TO ZERO IF
			/AN EVENT VARIABLE HAS NOT BEEN SPECIFIED.
	JMP*	R3	/EXIT
/
/ BAD CAL -- CREATE TASK TERMINATION NOTICE REQUEST AND EXIT TASK
/
CALTT	JMS	PENP	/PICK A NODE FROM THE POOL
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	CALTTX	/YES -- CAN'T PRINT MESSAGE.
	IAC		/SETUP X13 TO FILL NODE WITH TERMINATION 
	DAC	X13	/NOTICE INFORMATION.
	LAC	CURTSK	/SET TASK NAME
	PAX
	LAC	A.N1,X
	DAC*	X13
	LAC	A.N2,X
	DAC*	X13
	LAC	(3)	/SET TERMINATION INDICATOR (3 FOR CAL ADR)
	DAC*	X13
	LAC	L20	/SET ADDRESS OF CAL CAUSING VIOLATION (ACTUALLY
	DAC*	X13	/LINK, ADR MODE, PROTECT MODE, AND ADR
			/OF WORD FOLLOWING BAD CAL.
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ CHECK FOR CURRENT TASK BEING MULTI	/(161)
	SNA		/ ACCESS JOB. AC >< 0 IF SO.		/(161)
	JMP CALTT1	/ NOT MULTIACCESS, GO GET TNTERM.	/(161)
	LAC R2		/ FETCH NODE ADDRESS.			/(161)
	PAX		/ PREPARE TO SET TNTERM NOTICE SWITCH	/(161)
	CLA!IAC		/ TNTERM FLAG IS 1.			/(161)
	DAC T.EC,X	/ SET EXIT CODE IN TNTERM NODE.		/(161)
	LAC (TDV.EQ)	/ FETCH LIST ADDRESS.			/(161)
	JMP CALTT2	/ GO JOIN COMMON CODE.			/(161)
CALTT1=.							/(161)
	.ENDC							/(161)
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST
CALTT2	DAC R1		/ SET UP PROPER LIST ADDRESS FOR NADD	/(161)
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ SKIP REQUEST TO TNTERM IF TASK IS RUN	/(161)
	SNA		/ BY MULTIACCESS.			/(161)
	.ENDC							/(161)
	CAL	RQTTN	/REQUEST THE TASK TERMINATION NOTICE TASK.
/
CALTTX	LAC	(RETX)	/EXIT TASK
	DAC	L20
/
	JMP	CALEXT	/EXIT CAL SERVICE
/
/ SSTL -- RE-ENTRANT SUBROUTINE TO SCAN THE SYSTEM TASK
/ LIST FOR A TASK-NAME IN A CAL PARAMETER BLOCK.  THIS
/ SUBROUTINE IS TO BE CALLED FROM A CAL SERVICE ROUTINE,
/ WHERE X10 CONTAINS THE CPB ADDRESS (SET BY CAL DISPATCH).
/
/ IF THE TASK-NAME IS FOUND, CONTROL IS RETURNED AT JMS+1
/ WITH THE STL NODE ADDRESS IN AC.
/
/ IF THE TASK-NAME IS NOT FOUND, CONTROL IS RETURNED AT
/ 'CX201' WHICH SETS THE REQUESTOR'S EVENT VARIABLE TO -201
/ AND EXITS FROM THE CAL SERVICE ROUTINE.
/
/ REGISTERS ALTERED:
/    R1, R2, R3, R6, X17, XR, & AC
/
SSTL	0		///SAVE RETURN ADDRESS
	LAC	.-1	///
	DAC	R3
	LAC	X10	/SET NAME-DOUBLE-WORD ADR IN R2
	AAC	+2	/AND STL LISTHEAD ADR IN R1
	DAC	R2
	LAC	(STKL)
	DAC	R1
	JMS	SNAM	/SCAN STL FOR NAME
			/(R1, R2, R6, X17, XR, & AC ARE ALTERED)
			/NAME FOUND?
	JMP	CX201	/NO -- SET EVENT VAR TO -201 & EXIT CAL SERVICE
	JMP*	R3	/YES -- RETURN WITH STL NODE ADR IN AC
	.TITLE     MAPLUN -- CONVERT VIRTUAL LUN TO ABSOLUTE LUN
 
 
 
 
/
/ WRITTEN 6-MAY-76 BY ED GARDNER
/
/ THIS ROUTINE ACCEPTS A VIRTUAL LUN IN THE LOW 9 BITS OF THE
/ AC.  THE HIGH 9 BITS OF THE AC ARE IGNORED.  THE STATUS OF LUN
/ MAPPING IS CHECKED, AND THE LUN CONVERTED AS APPROPRIATE.
/ APPROPRIATE LUN RANGE CHECKS ARE MADE.
/
/ THIS ROUTINE IS REENTRANT BY VIRTUE OF BEING
/ NON-INTERRUPTABLE.
/
/ CALLING SEQUENCE:
/	LAC < VIRTUAL LUN >
/	JMS MAPLUN
/
/ RETURN AT JMS+1 IF SUCCESSFUL WITH ABSOLUTE LUN IN AC, XR, AND X16.
/ TRANSFER TO CX101 IF LUN IS OUT OF RANGE.
/
/ REGISTERS ALTERED:
/	AC, X16, XR, LINK
/
 
 
MAPLUN	0
	.INH			/// MAKES US REENTRANT.
	AND (777)		/// MASK OUT LUN.
	AAC -1			/// ADJUST TO ZERO ORIGIN.
	SNA!CLL			/// CHECK FOR LUN 1.
	JMP MPLN.B		/// JMP IF LUN 1.
	DAC X16			/// TEMPORARY SAVE.
	LAC X11			/// CHECK IF LUN MAPPING IN
	SNA!CLA!CLL		/// EFFECT.  INT. CAL => NO.
	SAD MA.LOF		/// MA.LOF = 0 => NO.
	JMP MPLN.A		/// JMP IF MAPPING DISABLED.
	LAW -MA.NLU		/// VERIFY VIRTUAL LUN IS
	TAD X16			/// WITHIN MAPPED LUN SPACE.
	SZL!CLL			/// SKIP IF OK.
	JMP MPLN.X		/// JMP IF LUN OUT OF RANGE.
	LAC MA.LOF		/// PICK UP MAPPING FACTOR.
MPLN.A	TAD X16			/// FORM ABSOLUTE LUN.
MPLN.B	TAD (-NLU)		/// VERIFY WITHIN RANGE.
	SZL!IAC			/// SKIP IF OK AND RESTORE
				/// ONE AS ORIGIN.
	JMP MPLN.X		/// JMP IF LUN OUT OF RANGE.
	TAD (NLU)		/// RESTORE LUN.
	PAX			/// PUT IN XR.
	DAC X16			/// SAVE IN X16
	.ENB			///
	JMP* MAPLUN		///
				///
				///
/ COME HERE IF LUN OUT OF RANGE	///
				///
MPLN.X	.ENB			/// SET EVENT VARIABLE TO -101.
	JMP CX101		///
	.TITLE *** 'QUEUE I/O' DIRECTIVE
/
/ THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PLACE AN I/O REQUEST
/ FOR AN INDICATED DEVICE IN A QUEUE OF REQUESTS FOR THAT
/ DEVICE UNIT.  A SIX WORD CAL PARAMETER BLOCK (CPB) OF THE
/ FOLLOWING FORMAT IS USED.
/
/	CPB	(0) I/O FUNCTION CODE IN BITS 3-11 AND
/		    CAL FUNCTION CODE (00) IN BITS 12-17.
/		(1) EVENT VARIABLE ADDRESS
/		(2) LOGICAL UNIT NUMBER
/		(3) ---
/		(4) ---
/		(5) ---
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-101	OUT OF RANGE LUN
/	-102	UNASSIGNED LUN
/	-103	HANDLER NOT RESIDENT
/	-777	EMPTY POOL
/
/ IF THE DIRECTIVE IS ACCEPTED, THE EVENT VARIABLE, IF SPECIFIED,
/ IS CLEARED (ZEROED) AND LEFT FOR THE HANDLER TASK TO SET NON-
/ ZERO, A REQUEST NODE IS FORMED AND ENTERED INTO THE UNIT'S
/ REQUEST QUEUE PER REQUESTOR PRIORITY, AND THE HANDLER TASK
/ IS "TRIGGERED" TO SIGNAL THE FACT THAT A REQUEST HAS BEEN MADE.
/ THE DEVICE QUEUE (DEQUE) LISTHEAD AND THE TRIGGER EVENT VARIABLE
/ ADDRESS ARE IN THE PHYSICAL DEVICE NODE FOR THE DEVICE UNIT
/ TO WHICH THE INDICATED LOGICAL UNIT NUMBER IS ASSIGNED.
/ THE FORMAT OF THE REQUEST NODE IS AS FOLLOWS:
/
/	(0)  FORWARD LINKAGE
/	(1)  BACKWARD LINKAGE
/	(2)  REQUESTOR'S STL NODE ADDRESS
/	(3)  NORMAL/EXEC MODE INDICATOR
/	(4)  TASK PRIORITY (TO BE CHANGED!)
/	(5)  I/O FUNCTION CODE IN BITS 9-17, AND
/	     LUN IN BITS 0-8.
/	(6)  CPB WD 1 -- EVENT VARIABLE ADDRESS
/	(7)  CPB WD 3 -- (UNIQUE TO CAL)
/	(10) CPB WD 4 -- (UNIQUE TO CAL)
/	(11) CPB WD 5 -- (UNIQUE TO CAL)
/
/ IF AN I/O REQUEST IS QUEUED BY AN INTERRUPT SERVICE ROUTINE, ZERO IS
/ USED IN PLACE OF AN STL NODE ADDRESS.
/
/ IF AN I/O REQUEST IS QUEUED BY A "NORMAL MODE" TASK, ITS PARTITION
/ BLOCK ADDRESS IS SET IN THE MODE INDICATOR.  FOR AN "EXEC" MODE TASK,
/ THE MODE INDICATOR IS SET ZERO.
/								/EAG:167
/ IF THE I/O REQUEST IS AN ABORT REQUEST (I/O FUNCTION CODE	/EAG:167
/ 17), THREE VARIATIONS ARE EMPLOYED IN ITS HANDLING:		/EAG:167
/								/EAG:167
/   1.	THE REQUEST IS QUEUED IN THE PDVL NODE FOR UNIT ZERO	/EAG:167
/	(THE FIRST PDVL NODE FOR THIS DEVICE) RATHER THAN	/EAG:167
/	THE PDVL NODE ASSOCIATED WITH THE UNIT BEING ABORTED.	/EAG:167
/								/EAG:167
/   2.	THE REQUEST IS QUEUED WITH A PRIORITY OF ZERO,		/EAG:167
/	REGARDLESS OF THE ISSUEING TASK'S PRIORITY.		/EAG:167
/								/EAG:167
/   3.	BOTH BIT 3 AND BIT 0 (=440000) OF THE TRIGGER EVENT	/EAG:167
/	VARIABLE ARE SET.  BIT 0 ONLY (=400000) IS THE		/EAG:167
/	NORMAL CASE.						/EAG:167
/								/EAG:167
/ ABORTS ISSUED VIA THIS, THE NORMAL QUEUE I/O MECHANISM, ARE	/EAG:167
/ ABORTS FOR A SINGLE UNIT ONLY.  THE I/O RUNDOWN TASK ISSUES	/EAG:167
/ AN ABORT FOR ALL UNITS DIRECTLY; I.E., IT QUEUES THE REQUEST	/EAG:167
/ NODE ITSELF USING SPRI.  THE ABORT ALL UNITS REQUEST IS	/EAG:167
/ DISTINGUISHED FROM THE (TASK-ISSUED) ABORT SINGLE UNIT	/EAG:167
/ IN TWO WAYS:  1) THE I/O REQUEST NODE LUN FIELD CONTAINS	/EAG:167
/ ZERO RATHER THAN A LUN NUMBER, AND 2) BIT 2 ONLY (=100000)	/EAG:167
/ OF THE TRIGGER EVENT VARIABLE IS SET, RATHER THAN EITHER	/EAG:167
/ BIT 3 OR BIT 0 (=440000).  NOTE ALSO THAT ALL I/O		/EAG:167
/ HANDLERS MUST ACCEPT THE ABORT ALL UNITS VARIATION, WHEREAS	/EAG:167
/ THE ABORT SINGLE UNIT VARIATION IS OPTIONAL.			/EAG:167
/								/EAG:167
/								/EAG:167
/								/EAG:167
/ BEFORE THE APPROPRIATE BITS ARE SET IN THE HANDLER'S TRIGGER	/EAG:167
/ EVENT VARIABLE, A CHECK IS MADE TO SEE IF THE TRIGGER EVENT	/EAG:167
/ VARIABLE IS ZERO OR NOT.  IF THE TRIGGER EVENT VARIABLE IS	/EAG:167
/ ZERO, THE BITS ARE SET IN IT AND A SIGNIFICANT EVENT IS	/EAG:167
/ DECLARED.  IF THE TRIGGER EVENT VARIABLE IS ALREADY NON-ZERO,	/EAG:167
/ THE BITS ARE STILL SET BUT NO SIGNIFICANT EVENT IS DECLARED.	/EAG:167
								/EAG:167
								/EAG:167
/ CONTROL IS TRANSFERRED HERE BY THE CAL DISPATCH ROUTINE.
/ XR & X10 CONTAIN THE ADDRESS OF THE CAL PARAMETER BLOCK.
/
IO.	LAW -6		/ CHECK RANGE OF CPB AND SET UP X14	/(161)
	JMS CPBRX	/ WITH THE 17 BIT EV VARIABLE ADDRESS.	/(161)
/
	LAC 2,X		/ FETCH THE LUN NUMBER FROM THE CPB	/(161)
	JMS MAPLUN	/ MAP VIRTUAL LUN TO ABSOLUTE LUN AND	/EAG:202
			/ VERIFY LUN IS IN RANGE.  LEAVES	/EAG:202
			/ ABSOLUTE LUN IN AC, XR, AND X16.	/EAG:202
	LACIX (LUT-1)	/ IS LUN ASSIGNED -- I.E., DOES THE	/EAG:202
	SNA		/ LUT ENTRY CONTAIN A PDVL NODE ADDR.?	/EAG:202
	JMP	CX102	/NO -- SET EVENT VAR TO -102
	DAC	X12	/YES -- SAVE PHYSICAL DEVICE NODE ADR IN X12
	PAX		/IS HANDLER RESIDENT?
	LAC	D.TG,X
	SNA		/YES -- QUEUE I/O REQUEST
	JMP	CX103	/NO -- SET EVENT VARIABLE TO -103
/
/ VALID I/O CAL -- X10 CONTAINS THE CPB ADDRESS AND X12
/ CONTAINS THE PHYSICAL DEVICE ADDRESS NODE
/
	JMS PENP	/ PICK AN EMPTY NODE FROM THE POOL.	/(161)
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	CX777	/YES -- SET EVENT VARIABLE TO -777
	IAC		/ SETUP X13 TO FILL NODE.		/(173)
	DAC	X13
/
	LAC X10			/ SETUP XR TO ACCESS CPB, SO	/EAG:167
	PAX			/ WE CAN CHECK FOR ABORT (FUNC-	/EAG:167
	LAC (1700)		/ TION CODE 17).  THEN SET X15	/EAG:167
	SAD 0,X			/ TO APPROPRIATE TRIGGER EVENT	/EAG:167
	CLA!CMA!CLL!SKP		/ BITS -- 440000 IF ABORT,	/EAG:167
	SWHA!STL		/ 400000 OTHERWISE.		/EAG:167
	AND (440000)		/ ALSO, SETUP LINK AS ABORT	/EAG:167
	DAC X15			/ FLAG -- CLEAR LINK IF ABORT,	/EAG:167
	SZL			/ SET LINK OTHERWISE.		/EAG:167
	JMP IO.1C		/ JMP IF NOT ABORT		/EAG:167
/								/EAG:167
/			IMPORTANT NOTE:				/EAG:167
/								/EAG:167
/	A FLAG HAS BEEN PUT IN THE LINK WHICH IS CHECKED	/EAG:167
/	ABOUT 30 LINES BELOW.  INTERVENING INSTRUCTIONS		/EAG:167
/	MUST NOT MODIFY THE LINK!				/EAG:167
/								/EAG:167
	ISZ X12			/ THE I/O REQUEST IS AN ABORT	/EAG:167
	LAC* X12		/ SINGLE UNIT REQUEST -- SETUP	/EAG:167
	DAC R1			/ R1 TO DEVICE HANDLER NAME,	/EAG:167
	LAC PDVL		/ THEN SCAN PDVL FOR THE FIRST	/EAG:167
IO.1B	PAX			/ PDVL NODE FOR THIS DEVICE --	/EAG:167
	DAC X12			/ I.E. THE NODE FOR UNIT ZERO.	/EAG:167
	LAC D.N1,X		/ STORE THE ADDRESS OF EACH	/EAG:167
	SAD R1			/ NODE IN X12, SO THAT WHEN	/EAG:167
	JMP IO.1C		/ A MATCH IS FOUND X12 WILL	/EAG:167
	LAC D.FP,X		/ CONTAIN THE PDVL NODE		/EAG:167
	JMP IO.1B		/ ADDRESS			/EAG:167
								/EAG:167
								/EAG:167
IO.1C	LAC CURTSK	/ SET UP TO ACCESS CORRECT ATL NODE FOR	/(173)
	PAX		/ QI/O PARAMETERS.			/(173)
	LAC X11		/ WAS CAL ISSUED FROM A TASK?		/(173)
	SNA
	JMP	IO.2
	LAC (DUMA.TP-A.TP) / FETCH DUMMY STL NODE ADDRESS FOR	/(173)
	PAX		/ DUMMY PARAMETERS.			/(173)
IO.2	LAC	A.SN,X	/ FETCH THE STL NODE ADDRESS.		/(173)
	DAC*	X13	/(WD 2)
	LAC A.PB,X		/ FETCH PART. BLOCK ADR. FOR	/(173)
	DAC* X13		/ MODE IND. IN REQUEST		/(173)
	AAC +P.TP		/ USER MODE TASK -- INCREMENT	/EAG:167
	DAC R1			/ TRANSFERS PENDING COUNT	/EAG:167
	ISZ* R1							/EAG:167
	AAC	P.IO-P.TP	/ POINT TO I/O COUNT LOCATION	/(213)
	XCT	FPHDWE		/ SKIPS IF FP HARDWARE EXISTS	/(214)
	AAC	-PBFP		/ THIS NEVER HAPPENS AT UOW	/(214)
	DAC	R1						/(213)
	ISZ*	R1		/ INCREMENT I/O COUNT		/(213)
	NOP			/ IN CASE IT SKIPS (SHOULDN'T)	/(213)
/								/EAG:167
/			IMPORTANT NOTE:				/EAG:167
/								/EAG:167
/	THE NEXT LINE OF CODE CHECKS A FLAG WHICH WAS SAVED	/EAG:167
/	IN THE LINK ABOUT 30 LINES PREVIOUSLY.  INTERVENING	/EAG:167
/	INSTRUCTIONS MUST NOT MODIFY THE LINK!			/EAG:167
/								/EAG:167
	SZL!CLL!CLA	/ IS THIS AN ABORT FUNCTION?		/(173)
	LAC A.TP,X	/ NO, FETCH TASK PRIORITY.		/(173)
	DAC* X13	/ STORE TASK PRIORITY IN REQUEST BLOCK.	/(173)
	LAC	X10	/SETUP XR TO ACCESS CPB
	PAX
	LAC	0,X	/SET LUN & I/O FUNCTION CODE
	AND (077700)	/ MASK OUT I/O FUNCTION CODE		/EAG:202
	CLL!RAL		/ SHIFT TO HIGH 9 BITS OF AC.		/EAG:202
	RTL							/EAG:202
	XOR X16		/ MERGE LUN INTO LOW 9 BITS OF AC.	/EAG:202
			/ (LUN LEFT IN X16 BY CALL TO MAPLUN.)	/EAG:202
	SWHA		/ POSITION LUN AND FNC. CORRECTLY, THEN	/EAG:202
	DAC* X13	/ STORE IN WD 5 OF REQUEST NODE.	/EAG:202
/
	LAC	X14	/SET REQUESTOR'S EVENT VARIABLE ADDRESS
	DAC*	X13	/(WD 6)
/
	LAC	3,X	/SET CPB WORD 3
	DAC*	X13	/(WD 7)
/
	LAC	4,X	/SET CPB WORD 4
	DAC*	X13	/(WD 10)
/
	LAC	5,X	/SET CPB WORD 5
	DAC*	X13	/(WD 11)
/
	LAC X12		/ ADD NODE TO DEQ (LIST HEAD IN PHYSICAL/(161)
	AAC	D.QF	/DEVICE NODE) ORDERED BY PRIORITY.
	DAC	R1	/(R1, R2, R3, R6, XR, & AC ARE ALTERED)
	JMS	SPRI
/
	LAC	X12	/SET "TRIGGER" EVENT VARIABLE IN
	PAX		/HANDLER (ADDRESS IN PHYSICAL DEVICE
	LAC	D.TG,X	/NODE)
	PAX			/ POINT XR TO T. E. V.		/EAG:167
	.INH			/ GUARD AGAINST INTERRUPTS	/EAG:167
	LAC 0,X			/// PICK UP PREVIOUS TEV VALUE	/EAG:167
	CMA!CLL!SNA		/// COMPLEMENT TEV, AND SET	/EAG:167
	STL			/// LINK IF TEV WAS PREVIOUSLY	/EAG:167
				/// ZERO -- I.E. IF SIGNIFICANT	/EAG:167
				/// EVENT SHOULD BE DECLARED.	/EAG:167
				/// CLEAR LINK IF TEV IS	/EAG:167
				/// ALREADY NON-ZERO.		/EAG:167
	AND X15			/// FINISH PROCESS OF SETTING	/EAG:167
	XOR 0,X			/// APPROPRIATE BIT (FROM X15)	/EAG:167
	.ENB			/// IN THE TEV (TRIGGER EVENT	/EAG:167
	DAC 0,X			/// VARIABLE).			/EAG:167
	LAC (401000)		/ PREPARE TO DECLARE SIG. EVENT	/EAG:167
	SZL			/ DECLARE SIGNIFICANT EVENT IFF	/EAG:167
	ISA			/ LINK IS SET -- I.E. IF TEV	/EAG:167
				/ WAS PREVIOUSLY ZERO.		/EAG:167
	JMP	CXPND	/CLEAR EVENT VARIABLE AND EXIT CAL SERVICE ROUTINE 
 
/								/(173)
/ THE FOLLOWING WORDS MUST BE LEFT IN THE EXISTING ORDER. THEY	/(173)
/ ARE A DUMMY SET OF ATL NODE PARAMETERS WHICH EXIST ONLY TO	/(173)
/ MAKE THE EXEC AND NON-TASK I/O RUNDOWN SOLUTION COME OUT 	/(173)
/ CLEANLY.							/(173)
/								/(173)
 
DUMA.TP	1		/ DUMMY TASK PRIORITY FOR NON-TASK I/O	/(173)
DUMA.PB	DUMP.TP-P.TP	/ POINTER TO A DUMMY TRANSFER PENDING	/(173)
			/ WORD IN A PSUEDO PARTITION BLOCK.	/(173)
DUMA.SN	0		/ STL NODE FOR NON-TASK I/O.		/(173)
 
/ THE FOLLOWING WORD IS USED BY ALL NON-TASK I/O REQUESTS AS A	/(173)
/ COMMON TRANSFER PENDING COUNTER. EACH REQUEST WILL INCREMENT	/(173)
/ AND THE TERMINATION OF EACH TRANSFER WILL DECREMENT THIS WORD./(173)
 
DUMP.TP	0		/ DUMMY TRANSFER PENDING WORD.		/(173)
 .TITLE *** 'REQUEST' 'FIX' & 'REQUEST MAPPED' DIRECTIVES	/(161)
/
/ THE REQUEST DIRECTIVE INSTRUCTS THE SYSTEM TO MAKE A TASK ACTIVE
/ AT AN INDICATED SOFTWARE PRIORITY LEVEL.  A FIVE WORD CAL PARAMETER
/ BLOCK OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (01)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/		(4) PRIORITY (ZERO FOR DEFAULT PRIORITY)
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-201  TASK NOT IN SYSTEM
/	-202  TASK ALREADY (OR STILL) ACTIVE
/	-204  TASK IS DISABLED
/	-206  ILLEGAL TASK PRIORITY
/	-777  POOL EMPTY
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/								/(161)
/ THE REQUEST MAPPED DIRECTIVE INSTRUCTS THE SYSTEM TO MAKE A	/(161)
/ TASK ACTIVE AND INSERT LUN MAPPING AND USER NUMBER INFORMATION/(161)
/ INTO THE ATL IN ADDITION TO THE SAME INFORMATION AS REQUEST	/(161)
/ A SIX WORD CAL PARAMETER BLOCK OF THE FOLLOWING FORMAT IS	/(161)
/ USED:								/(161)
/								/(161)
/	CPB	(0) FUNCTION CODE (36)				/(161)
/		(1) EVENT VARIABLE ADDRESS			/(161)
/		(2) TASK NAME (FIRST HALF)			/(161)
/		(3) TASK NAME (SECOND HALF)			/(161)
/		(4) PRIORITY (ZERO FOR DEFAULT PRIORITY)	/(161)
/		(5) LUN OFFSET AND USER NUMBER IN THE FORM	/(161)
/		    OOOUUX BITS 0 - 8 FOR OOO AND 9 - 13 FOR UU	/(161)
/								/(161)
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED)/(161)
/ IS SET TO ONE OF THE SAME VALUES AS PER REQUEST (SEE ABOVE)	/(161)
/								/(161)
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT	/(161)
/ VARIABLE (IF SPECIFIED) IS SET TO POSITIVE ONE (+1)		/(161)
/
/ THE FIX DIRECTIVE INSTRUCTS THE SYSTEM TO FIX A TASK IN CORE.
/ A FOUR WORD CAL PARAMETER BLOCK OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (15)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-201	TASK NOT IN SYSTEM
/	-202	TASK IS ACTIVE
/	-204	TASK IS DISABLED
/	-207	TASK ALREADY FIXED
/	-210	PARTITION IS OCCUPIED
/	-777	EMPTY POOL
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).  THE TASK
/ IS LOADED AS IF REQUESTED, EXCEPT THAT THE ENTRY POINT IS
/ AN EXIT DIRECTIVE IN THE EXECUTIVE.  HENCE, THE TASK IS LOADED
/ INTO CORE AND EXITS WITHOUT ALTERING ITS IMAGE, AND IS READY FOR
/ EXECUTION WITHOUT LOADING FROM THE DISK.
/
/ THE FOLLOWING REGISTER CONVENTIONS APPLY TO BOTH DIRECTIVES:
/
/	X10 -- CPB ADDRESS (SET BY CAL DISPATCH ROUTINE)
/	X11 -- INDICATOR, 0-REQUEST, 1-REQUEST MAPPED, 2-FIX	/(161)
/	X12 -- SPECIFIED PRIORITY OR ZERO (FROM CPB)
/	X13 -- GENERAL AUTO INCREMENT REGISTER
/	X15 -- LUN OFFSET & USER # (REQ. & REQ. MAPPED ONLY)	/(203)
/	R2 -- ADDRESS OF ACTIVE TASK LIST NODE.			/(173)
/	R3 -- ADDRESS OF SYSTEM TASK LIST ENTRY
/
/ REQUEST -- ENTRY FROM CAL DISPATCH, XR & X10 CONTAIN CPB ADR
/
RQ.	LAW	-5	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	4,X	/SAVE SPECIFIED PRIORITY (OR ZERO) IN X12
	JMS	RQ.PRI	/SAVE PRIORITY AND TEST IT FOR LEGALITY
RQ.1	DZM	X11	/INDICATE "REQUEST"
	DZM	X15	/CLEAR LUN OFFSET & USER #		/(203)
RQ.1A	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?	/(161)
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE
	DAC	R3	/YES -- SAVE STL NODE ADR IN R3
	PAX		/(XR POINTS TO STL NODE)
/
	.INH		///TASK ACTIVE, DISABLED,OR PARTITION TROUBLE
	LAC	S.DP,X	///
	AND	(530000)///
	SZA		///
	JMP	RF.E1	///YES - ERR  202,204,212,213
	LAC	S.DP,X	///NO -- FLAG TASK ACTIVE
	XOR	(400000)///
	.ENB		///
	DAC	S.DP,X	///
	JMS	PENP	/PICK AN EMPTY NODE FROM THE POOL
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	RF.E7	/YES -- CLEAR ACTIVE TASK FLAG
	JMP	RF.2	/NO -- TO COMMON CODE WITH NODE ADDRESS IN AC
/								/(161)
/ REQUEST MAPPED -- ENTRY FROM CAL DISPATCH, XR AND X10 CONTAIN	/(161)
/		    CPB ADDRESS.				/(161)
/								/(161)
RQ.M	LAW -6			/ CHECK RANGE OF CPB (NORMAL	/(161)
	JMS CPBRX		/ MODE) AND SET X14 TO 17 BIT	/(161)
				/ EVENT VARIABLE ADDRESS.	/(161)
	LAC 4,X			/ FETCH PRIORITY.		/(161)
	JMS RQ.PRI		/ SAVE IN X12 AND TEST FOR	/(161)
				/ VALIDITY.			/(161)
	LAW 777760		/ FETCH LUN OFFSET & USER #	/(203)
	AND 5,X							/(203)
	DAC X15			/ SAVE IN APPROPRIATE PLACE.	/(203)
	TAD (-2000)		/ NOW CHECK THAT LUN OFFSET IS	/(203)
				/ LEGITIMATE.  -2000 IS FUDGE	/(203)
	CLL			/ FACTOR TO MAKE 0 & 1 ILLEGAL.	/(203)
	TAD (MA.NLU-NLU-1*1000)	/ SET LINK IF LUN OFFSET OUT	/(203)
				/ OF RANGE.  THERE MUST BE ROOM	/(203)
				/ FOR A FULL MULTIACCESS		/(103)
				/ LUN SET.			/(203)
	SZL!CLA!IAC		/ SKIP IF OK & 1 ==> AC		/(203)
	JMP CX101		/ JMP IF OFFSET OUT OF RANGE	/(203)
	DAC X11			/ SET RQST MAPPED CODE IN X11.	/(203)
	JMP RQ.1A		/ GO REJOIN COMMON REQUEST CODE./(161)
/
/ FIX -- ENTRY FROM CAL DISPATCH, XR & X10 CONTAIN CPB ADR
/
FX.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	DZM	X12	/INDICATE DISK READ AT DEFAULT PRIORITY
	DZM X15		/ INDICATE NO MAP AND NO USER TO AVOID	/(205)
			/ SPURIOUS TASK TERMINATION INTO TDV.	/(205)
	LAC	(002)	/INDICATE "FIX"
	DAC	X11
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE
	DAC	R3	/YES -- SAVE STL NODE ADDRESS IN R3
	PAX		/(XR POINTS TO STL NODE)
/
	LAC	S.PB,X	/SET ADDRESS OF PARTITION BLOCK
	PAL		/NODE INTO LR AND SET THE ADDRESS
	AAC	+P.TC	/OF THE TASK USE COUNT WORD INTO R6
	DAC	R6
/
	.INH		///IS TASK ACTIVE, DISABLED, OR
	LAC	S.DP,X	///FIXED-IN-CORE OR PARTITION TROUBLE?
	AND	(570000)///
	SZA		///
	JMP	RF.E1	///YES - ERR 202,204,207,212,213
	LAC*	R6	///NO -- IS PARTITION AVAILABLE
	SZA		///
	JMP	RF.E2	///NO -- ERR 210
	ISZ* R6		///INCREMENT PARTITION OCCUPIED FLAG.	/(161)
	LAC	S.DP,X	///FIXED-IN-CORE.
	XOR	(440000)///
	DAC	S.DP,X	///
	PLX		///SET UP XR TO ACCESS PBDL
	.ENB		///ENABLE INTERRUPTS
	DZM	P.Z1,X	///INDICATE PARTITION NOT YET ZEROED
	DZM	P.C1,X	/ZERO TASK'S CLOCK VALUES
	DZM	P.C2,X
	DZM	P.IO,X		/ INITIALIZE I/O COUNT TO ZERO	/(214)
	JMS	PENP	/PICK AN EMPTY NODE FROM THE POOL
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	RF.E6	/YES -- CLEAR ACTIVE TASK FLAG AND
			/PARTITION OCCUPIED FLAG
			/NO -- TO COMMON CODE WITH NODE ADDRESS IN AC
/
/ COMMON CODE FOR REQUEST & FIX
/
RF.2	IAC		/ SETUP AUTO-INCREMENT REGISTER X13	/(173)
	DAC	X13	/TO FILL ATL NODE.
/
/ SETUP NODE FOR ENTRY IN ACTIVE TASK LIST
/
	LAC	R3	/(XR POINTS TO STL NODE)
	PAX
	LAC	S.N1,X	/TASK NAME (2 WORDS)
	DAC*	X13
	LAC	S.N2,X
	DAC*	X13
	LAC	X12	/PRIORITY INDICATED IN REQUEST?
	SNA		/YES -- USE REQUESTED PRIORITY
	LAC	S.DP,X	/NO -- USE DEFAULT PRIORITY
	AND	(001777)
	DAC*	X13
	LAC	S.PB,X	/MOVE PARTITION BLOCK ADDRESS
	DAC*	X13
	PXA		/SET STL NODE ADR
	DAC*	X13
/
	LAC X11		/ REQUEST, REQUEST MAPPED, OR		/(161)
	AAC -1		/ FIX?					/(161)
	SMA!SZA!IAC	/ AC <= 0 IF REQUEST OF MAPPED		/(161)
			/ REQUEST.				/(161)
	JMP	RF.F2
/
/ CODE FOR REQUEST
/
	LAC	S.DP,X	/IS TASK FIXED-IN-CORE?
	AND	(040000)
	SNA!CLA!IAC
	JMP	RF.2A	/NO -- SET TASK STATUS TO 1 (NEEDS PARTITION)
/
	LAC	S.EP,X	/YES -- IS TASK NORMAL MODE?
	RTL
	SPA!CLA!CMA
	LAW	-400	/YES -- AND OFF LOW ORDER BITS TO GET TASK SIZE
	AND	S.TS,X	/GET TASK SIZE
	PAL
	LAC	S.PB,X	/SET XR TO POINT TO PARTITION NODE
	PAX
	PLA
	DAC	P.TS,X	/SAVE TASK SIZE
	LAC	P.SZ,X	/INITIALIZE PARTITION'S VIRTUAL SIZE
	DAC	P.VS,X	/EQUAL TO ITS ACTUAL SIZE
	DZM	P.BP,X	/INDICATE NO BUFFERS YET IN PARTITION
	DZM	P.C1,X	/ZERO XM CLOCK VALUES HERE SINCE THE
	DZM	P.C2,X	/THE TASK WILL BE AT STATUS 4 AFTER REQ IS DONE
	DZM	P.IO,X		/ ALSO ZERO I/O COUNT HERE	/(214)
	LAC P.FW,X	/ MERGE LUN OFFSET AND USER # INTO	/(203)
	XOR X15		/ FLAGS WORD (P.FW) OF PBDL.  NORMALLY	/(203)
	DAC P.FW,X	/ DONE BY STATE ONE PROCESSING.		/(203)
	LAC	R3	/(XR POINTS TO STL NODE)
	PAX
	LAC	(4)	/SET TASK STATUS TO 4 (READY TO RUN)
/
RF.2A	DAC* X13	/ SET TASK STATUS WORD			/(161)
	LAC	S.EP,X	/SET ENTRY ADDRESS
	DAC*	X13
	JMP	RF.3	/TO COMMON CODE
/
/ CODE FOR FIX
/
RF.F2	DAC*	X13	/SET STATUS TO 2 (READY TO FIX)
	LAC	(RETX)	/SET "ENTRY ADDRESS" TO CAUSE EXIT
	DAC*	X13	/WITHOUT EXECUTION OF TASK
/
/ COMMON CODE FOR REQUEST & FIX
/
RF.3	LAC X15		/ FETCH LUN OFFSET & USER # IF REQUEST,	/(203)
			/ FETCH GARBAGE IF FIX.			/(203)
	DAC* X13	/ SET UP ATL WITH LUN OFFSET AND USER	/(161)
	LAC (ATKL)	/ ADD NODE TO ATL PER PRIORITY		/(161)
	DAC	R1	/(R1, R2, R3, R6, XR, & AC ARE ALTERED)
	JMS	SPRI
/
	.SET6		/DECLARE A SIGNIFICANT EVENT
/
	JMP	CXSUC	/SET EVENT VARIABLE TO +1 AND
			/EXIT CAL SERVICE ROUTINE
/
/ ***	CAL SERVICE EXIT WITH R4 CONTAINING THE ATL NODE ADDRESS
/	IS REQUIRED BY THE TDV DISPATCH TASK "TDV...".
/
/	TOP SIX BITS ARE CONVERTED, IN ORDER, TO ERRORS
/	202,201,204,207,212,213. NOTE BOTH 212,213 IS 213.
/
RF.E10	DBK
RF.E1	.ENB
	SPA!RTL
	JMP	CX202
	SZL!RAL
	JMP	CX201
	SZL!RAL
	JMP	CX204
	SZL!RAL
	JMP	CX207
	SPA
	JMP	CX213
	JMP	CX212
/
RF.E2	.ENB		///ERR 210
	JMP	CX210	///
/
RF.E6	LAC	R3	/ERR 777 -- OUT OF POOL (TASK HAS BEEN FLAGGED
	PAX		/ACTIVE & FIXED IN CORE, AND THE PARTITION
	LAC	S.DP,X	/HAS BEEN FLAGGED OCCUPIED)
	AND	(337777)
	DAC	S.DP,X
	LAC	S.PB,X
	PAX
	LAC	P.TC,X
	AAC	-1
	DAC	P.TC,X
	JMP	CX777
/
RF.E7	LAC	R3	/ERR 777 -- OUT OF POOL (TASK HAS BEEN
	PAX		/FLAGGED ACTIVE, CLEAR THIS FLAG)
	LAC	S.DP,X
	AND	(377777)
	DAC	S.DP,X
	JMP	CX777
/
/ SUBROUTINE RQ.PRI -- SAVE PRIORITY IN X12 AND TEST IT FOR LEGALITY
/
/	ENTER ROUTINE WITH AC=PRIORITY
/	RETURN AT JMS+1 IF OK, OTHERWISE JMP TO CX206 TO DECLARE ERROR
/
/	THIS SUBROUTINE IS ALSO USED BY SYNC, RUN, AND SCHEDULE.
/
/	AC IS MODIFIED
/
RQ.PRI	0
	DAC	X12	/SAVE THE PRIORITY IN X12
	SPA		/IS IT GREATER THAN ZERO?
	JMP	CX206	/NO -- SET E.V. TO -206
	TAD	(-1001	/YES -- IS IT GREATER THAN 512 DECIMAL?
	SMA
	JMP	CX206	/NO -- SET E.V. TO -206
	JMP*	RQ.PRI	/YES -- RETURN WITH AC ALTERED
 .TITLE *** 'TASK SCHEDULE' DIRECTIVES
/
/ THREE DIRECTIVES -- 'SCHEDULE', 'RUN', & 'SYNC' PROVIDE A MEANS OF
/ SCHEDULING A TASK TO RUN AT SOME TIME IN THE FUTURE, AT AN INDICATED
/ PRIORITY, AND WITH PERIODIC RESCHEDULING.  THEY DIFFER ONLY IN THE
/ WAY THE INITIAL "SCHEDULE INTERVAL" IS SPECIFIED.  A ZERO PRIORITY
/ MEANS DEFAULT PRIORITY.  A ZERO "RE-SCHEDULE INTERVAL" MEANS NO
/ RE-SCHEDULING.
/
/ THESE SCHEDULE DIRECTIVES MAY ONLY BE ISSUED BY A TASK (@ API-7).
/
/ THESE DIRECTIVES CONSTRUCT A CLOCK QUEUE NODE TO MAKE THE INDICATED
/ TASK ACTIVE, AND INSERT IT IN THE CLOCK QUEUE TO COME DUE AT THE
/ APPROPRIATE TIME.
/
/ THE "SCHEDULE" DIRECTIVE ALLOWS THE "SCHEDULE INTERVAL" TO BE
/ SPECIFIED BY INDICATING THE "TIME-OF-DAY" AT WHICH THE TASK IS
/ TO BE RUN.  A TEN WORD CAL PARAMETER BLOCK OF THE FOLLOWING
/ FORMAT IS USED:
/
/	CPB	(0)  FUNCTION CODE (02)
/		(1)  EVENT VARIABLE ADDRESS
/		(2)  TASK NAME (FIRST HALF)
/		(3)  TASK NAME (SECOND HALF)
/		(4)  HOURS (SCHEDULE TIME)
/		(5)  MINUTES
/		(6)  SECONDS
/		(7)  RE-SCHEDULE INTERVAL
/		(10) INTERVAL UNITS
/		(11) PRIORITY
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-104  CONTROL TABLE ERROR
/	-201  TASK NOT IN SYSTEM
/	-203  DIRECTIVE NOT TASK ISSUED
/	-204  TASK IS DISABLED
/	-206  ILLEGAL TASK PRIORITY
/	-777  EMPTY POOL
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
SC.	LAW	-12	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203
	PXA		/YES -- SET X11 TO FETCH  RESCHEDULE
	AAC	+6	/INTERVAL (FROM CPB).
	DAC	X11
	DAC	X16	/SET UP X16 TO CHECK INTERVAL UNITS
	JMS	SCHINT	/GO CHECK INTERVAL UNITS
	LAC	11,X	/SET X12 TO PRIORITY (FROM CPB)
	JMS	RQ.PRI	/PUT PRIORITY IN X12 AND CHECK IT FOR LEGALITY
	LAC	4,X	/COMPUTE SECONDS FROM MIDNITE IN WHICH
	JMS	MX60	/TO SCHEDULE.
	TAD	5,X
	JMS	MX60
	TAD	6,X
	DAC	SCHDS
/
	.RTL3		/RAISE TO API-3
/
	LAC	SSM	//DETERMINE DELTA SECONDS FROM NOW
	TCA		//
	TAD	SCHDS	//
	SPA!SNA		//POSITIVE NON-ZERO DELTA?
	TAD	(D86400)//NO -- SCHEDULE TOMORROW
			//YES -- SCHEDULE TODAY
	AAC	-1	//NORMALIZE 'CQIDS' & 'CQIDT' FOR NON-ZERO
	DAC	SCHDS	//DELTA-TICKS, AND ADJUST SCHEDULE-DELTA FOR
	LAC	TT	//ELAPSED TIME SINCE LAST SECOND BOUNDARY.
	TCA		//
	TAD	TPS	//
	DAC	SCHDT	//
	JMP	SCH	//TO COMMON CODE
/
/ THE "RUN" DIRECTIVE ALLOWS THE SCHEDULE INTERVAL TO BE SPECIFIED
/ AS A "TIME FROM NOW".  A NINE WORD CAL PARAMETER BLOCK OF THE FOLLOWING
/ FORMAT IS USED:
/
/	CPB	(0)  FUNCTION CODE (03)
/		(1)  EVENT VARIABLE ADDRESS
/		(2)  TASK NAME (FIRST HALF)
/		(3)  TASK NAME (SECOND HALF)
/		(4)  SCHEDULE DELTA TIME
/		(5)  SCHEDULE UNITS
/		(6)  RE-SCHEDULE INTERVAL
/		(7)  INTERVAL UNITS
/		(10) PRIORITY
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-104  CONTROL TABLE ERROR
/	-201  TASK NOT IN SYSTEM
/ 	-203  DIRECTIVE NOT TASK ISSUED
/	-204  TASK IS DISABLED
/	-206  ILLEGAL TASK PRIORITY
/	-777  EMPTY POOL
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
RN.	LAW	-11	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203
	PXA		/YES -- SET 'X15' TO FETCH SCHEDULE DELTA
	AAC	+3	/AND 'X11' TO PO	NT T RESCHEFUE(INTERVAL
	DAC	X15
	DQc	\1&	/SET UP X16 TO CHECK INTERVAL UNITS
	AAC	+2
	DAC	X11
	JMS	SCHINT	/CHECK SCHEDULE UNITS
	JMS	SCHINT	/CHECK RE-SCHEDULE UNITS
	LAC	10,X	/SET PRIORITY (FROM CPB) IN X12
	JMS	RQ.PRI	/SET PRIORITY INTO X12 AND CHECK IT FOR LEGALITY
	JMS	CTP	/CONVERT TIME PARAMETER (SET 'SCHDS' & 'SCHDT'
			/PER SCHEDULE DELTA)
	SNA		/IF SCHEDULE DELTA IS ZERO, SCHEDULE AT
	ISZ	SCHDT	/NEXT TICK BOUNDARY.
	.RTL3		/RAISE TO API-3
	JMP	SCH	//TO COMMON CODE
/
/ THE "SYNC" DIRECTIVE ALLOWS THE SCHEDULE INTERVAL TO BE INDICATED
/ BY SPECIFYING A CLOCK INTERVAL (HOURS, MINUTES, SECONDS, OR TICKS)
/ ON WHICH TO SYNCHRONIZE, AND A TIME INTERVAL FROM CLOCK UNIT
/ SYNCHRONIZATION.  A TEN WORD CAL PARAMETER BLOCK OF THE FOLLOWING 
/ FORMAT IS USED:
/
/	CPB	(0)  FUNCTION CODE (14)
/		(1)  EVENT VARIABLE ADDRESS
/		(2)  TASK NAME (FIRST HALF)
/		(3)  TASK NAME (SECOND HALF)
/		(4)  SYNCHRONIZATION UNITS
/		(5)  SCHEDULE DELTA TIME
/		(6)  DELTA UNITS
/		(7)  RE-SCHEDULE INTERVAL
/		(10) INTERVAL UNITS
/		(11) PRIORITY
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-104  CONTROL TABLE ERROR
/	-201  TASK NOT IN SYSTEM
/	-203  DIRECTIVE NOT TASK ISSUED
/	-204  TASK IS DISABLED
/	-206  ILLEGAL TASK PRIORITY
/	-777  EMPTY POOL
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
SY.	LAW	-12	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203
	PXA		/YES -- SET 'X15' TO POINT TO SCHEDULE DELTA
	AAC	+4	/AND 'X11' TO POINT TO RESCHEDULE DELTA (IN CPB).
	DAC	X15
	DAC	X16	/SET UP X16 TO CHECK INTERVAL UNITS
	AAC	+2
	DAC	X11
	JMS	SCHINT	/CHECK DELTA UNITS
	JMS	SCHINT	/CHECK RE-SCHEDULE UNITS
	LAC	11,X	/SET X1" TO PRIORITY (FROM CPB)
	JMS	RQ.PRI	/SET PRIORITY INTO X12 AND CHECK IT FOR LEGALITY
	JMS	CTP	/CONVERT TIME PARAMETER (SET 'SCHDS' & 'SCHDT'
			/PER SCHEDULE DELTA)
	LAC	4,X	/SETUP R1 TO POINT TO APPROPRIATE CLOCK PARAMETER
	TAD	(TT-2)
	DAC	R1
/
	DZM	R2	/SETUP R2 TO ACCUMULATE THE SCHEDULE DELTA IN TICKS
/
	LAC	4,X	/SETUP TO DISPATCH PER SYNC UNITS
	JMS	SCHIN1	/CHECK LEGALITY OF SYNC UNITS
	TAD	(JMP SY.D)
	DAC	SY.D
/
	.RTL3		/RAISE TO API-3
SY.D	XX		//DISPATCH PER SYNC UNITS
	JMP	SY.T	//
	JMP	SY.S	//
	JMP	SY.M	//
	JMP	SY.H	//
/
/ SYNC ON HOUR -- SET R2 TO SCHEDULE DELTA TICKS
/     TICKS = (59-MM)*TPS*60 + (59-SS)*TPS + (TPS-TT)
/
SY.H	JMS	SY.S1	//R2 = R2 + (59-MM)*TPS*60
	JMS	MX60	//
	JMS	SY.S2	//
/
/ SYNC ON MINUTE -- SET R2 TO SCHEDULE DELTA TICKS
/     TICKS = (59-SS)*TPS + (TPS-TT)
/
SY.M	JMS	SY.S1	//R2 = R2 + (59-SS)*TPS
	JMS	SY.S2	//
/
/ SYNC ON SECOND -- SET R2 TO SCHEDULE DELTA TICKS
/     TICKS = (TPS-TT)
/
SY.S	LAC*	R1	//R2 = R2 + (TPS-TT)
	TCA		//
	TAD	TPS	//
	TAD	R2	//
	DAC	R2	//
/
SY.T=.	/SYNC ON TICK -- LEAVE R2 (SCHED DELTA TICKS) ZERO
/
/ R2 CONTAINS THE NUMBER OF TICKS TILL THE INDICATED SYNCHRONIZATION
/ TIME.  'SCHDS' & 'SCHDT' CONTAIN THE SCHEDULE DELTA TIME FROM THE
/ SYNCHRONIZATION TIME.
/
	LAC	SCHDT	//COMBINE THE DELTA TO SYNCHRONIZATION WITH THE
	TAD	R2	//DELTA FROM SYNCHRONIZATION
	LMQ		//
	CLA!CLL		//
	DIV		//
TPX1	D60		//SET TO CLOCK FREQ. BY SCF
	DAC	SCHDT	//
	LACQ		//
	TAD	SCHDS	//
	DAC	SCHDS	//
/
	LAC	SCHDT	//ZERO DELTA TICKS?
	SZA		//
	JMP	SCH	//NO -- TO COMMON CODE
	LAC	TPS	//YES -- "NORMALIZE" DELTA TICKS & SECONDS
	DAC	SCHDT	//
	LAW	-1	//
	TAD	SCHDS	//
	DAC	SCHDS	//
/
	JMP	SCH	//TO COMMON CODE
/
SY.S1	0
	.DEC
	LAW	-59
	.OCT
	TAD*	R1
	TCA
	CLL
	MUL
TPX2	D60		/SET TO CLOCK FREQ. BY SCF
	LACQ
	JMP*	SY.S1
/
SY.S2	0
	TAD	R2
	DAC	R2
	LAW	-1
	TAD	R1
	DAC	R1
	JMP*	SY.S2
/
/ SUBROUTINE SCHINT -- CHECK THE SCHEDULE OR RE-SCHEDULE UNITS
/                      THEY MUST BE BETWEEN 1 AND 4.
/
/	ON ENTRY X16 POINTS ONE LOCATION BEFORE THE NUMBER OF UNITS
/	RETURN AT JMS+1 IF OK, OTHERWISE JMP TO CX104 TO DECLARE ERROR
/
/	THIS ROUTINE IS USED BY SYNC, RUN, AND SCHEDULE
/
/	AC AND X16 ARE MODIFIED
/
SCHINT	0
	LAC*	X16	/GET THE NUMBER OF UNITS
	SNA		/ARE THERE ANY?
	JMP	SCHINX	/NO -- RETURN AFTER INCREMENTING X16 (#204)
	LAC*	X16	/YES -- GET THE UNITS
	JMS	SCHIN1	/GO CHECK TO SEE IF BETWEEN 1 AND 4
	JMP*	SCHINT	/RETURN
SCHINX	LAC*	X16	/INCREMENT X16 (#204)
	JMP*	SCHINT	/RETURN (#204)
/
/ SUBROUTINE SCHIN1 -- CHECK THAT AC IS BETWEEN 1 AND 4
/
/	ENTER WITH UNITS IN AC
/	RETURN AT JMS+1 IF OK, OTHERWISE JMP TO CX104 TO DECLARE ERROR
/
/	NO REGISTERS ARE MODIFIED
/
SCHIN1	0
	SPA!SNA		/IS AC (UNITS) >0?
	JMP	CX104	/NO -- SET E.V. TO -104
	AAC	-5	/YES -- SUBTRACT 5 SO LEGAL VALUES GO NEGATIVE
	SMA		/IS IT NEGATIVE?
	JMP	CX104	/NO -- SET E.V. TO -104
	AAC	5	/YES -- RESTORE AC TO INITIAL VALUE
	JMP*	SCHIN1	/RETURN
/
/
/ COMMON CODE FOR 'SCHEDULE', 'RUN' & 'SYNC' DIRECTIVES
/ ENTER AT API-3 WITH SCHEDULE DELTA REPRESENTED IN
/ 'SCHDS' & 'SCHDT', PRIORITY (FROM CPB) IN X12, AND X11
/ SETUP TO FETCH RESCHEDULE INTERVAL (FROM CPB).
/
SCH	LAC	X11	//SET 'X15' TO POINT TO RESCHEDULE INTERVAL
	DAC	X15	//
	LAC	(STKL)	//SCAN STL FOR TASK NAME -- FOUND?
	DAC	R1	//
	LAC	X10	//
	AAC	+2	//
	DAC	R2	//
	JMS	SNAM	//(R1, R2, R6, X17, XR, & AC ARE ALTERED)
	JMP	SCH201	//NO -- SET EVENT VARIABLE TO -201
	DAC	X13	//YES -- SAVE STL NODE ADR IN X13
	PAX		//SETUP XR TO ACCESS STL NODE
	LAC	S.DP,X	//IS TASK DISABLED OR FLAGGED TO BE REMOVED ON EXIT?
	AND	(330000	//OR IN PARTITION TROUBLE?
	SZA		//SKIP ON NONE OF ABOVE
	JMP	RF.E10	//DBK AND SORT OUT WHICH ERROR
/
SCH0	LAC	X12	//WAS A PRIORITY SPECIFIED?		/(173)
	SZA		//
	JMP	SCH1	//YES -- USE SPECIFIED PRIORITY
	LAC	S.DP,X	//NO -- USE DEFAULT PRIORITY
	AND	(001777)//
	DAC	X12	//
/
SCH1	JMS	PENP	//PICK AN EMPTY NODE FROM POOL
			//(R1, R6, XR, & AC ARE ALTERED)
			//POOL EMPTY?
	JMP	SCH777	//YES -- SET EVENT VARIABLE TO -777
	PAX		//SETUP XR TO FILL NODE FOR CLOCK QUEUE
/
	DZM	C.TI,X	//SET TYPE INDICATOR FOR "NO RESCHEDULING"
	LAC	X12	//SET PRIORITY LEVEL
	DAC	C.PE,X	//
	LAC	X13	//SET STL NODE ADDRESS
	DAC	C.SP,X	//
	LAC	SCHDS	//SET SCHEDULE DELTA SECONDS (FOR 'CQI')
	DAC	CQIDS	//
	LAC	SCHDT	//SET SCHEDULE DELTA TICKS (FOR 'CQI')
	DAC	CQIDT	//
	LAC*	X11	//RESCHEDULING SPECIFIED?
	SNA		//
	JMP	SCH2	//NO -- CLOCK QUEUE NODE IS FILLED
	ISZ	C.TI,X	//YES -- CHANGE TYPE TO "RESCHEDULING"
	JMS	CTP	//DETERMINE AND SET RESCHEDULE SECONDS
	LAC	SCHDS	//AND RESCHEDULE TICKS
	DAC	C.RS,X	//
	LAC	SCHDT	//
	DAC	C.RT,X	//
/
SCH2	JMS	CQI	//INSERT NODE IN CLOCK QUEUE
/
	DBK		//DROP FROM API-3 TO API-4, SET
	JMP	CXSUC	//EVENT VARIABLE TO +1 AND EXIT
			/CAL SERVICE ROUTINE
/
/ ERROR RETURNS -- DROP TO API-4 AND SET EVENT VARIABLE NEGATIVE
/
SCH201	DBK		//
	JMP	CX201	//
/
SCH777	DBK		//
	ISZ	SE.AP	//
	NOP
	JMP	CX777
 .TITLE *** 'MARK TIME' DIRECTIVE
/
/ THE MARK DIRECTIVE INSTRUCTS THE SYSTEM TO CLEAR (ZERO) AN EVENT
/ VARIABLE AND THEN TO SET IT AND DECLARE A SIGNIFICANT EVENT
/ IN AN INDICATED TIME INTERVAL.  A FOUR WORD CAL PARAMETER BLOCK OF
/ THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (13)
/		(1) EVENT VARIABLE ADDRESS
/		(2) DELTA (MAGNITUDE)
/		(3) DELTA (UNITS)
/
/ IF THE DIRECTIVE IS REJECTED THE EVENT VARIABLE IS SET TO ONE OF
/ THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION AND THE REASON:
/
/	-104 -- CONTROL TABLE ERROR
/	-203 -- REQUEST NOT TASK ISSUED
/	-777 -- REQUEST NOT ACCEPTED (OUT OF POOL)
/
/ IF THE DIRECTIVE IS ACCEPTED, THE EVENT VARIABLE IS CLEARED AND
/ A REQUEST TO SET IT IS PLACED IN THE CLOCK QUEUE TO COME DUE AT THE
/ APPROPRIATE TIME.
/
/ ENTRY FROM CAL DISPATCH -- XR & X10 CONTAIN CPB ADDRESS
/
MT.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203
	PXA		/SET UP TO CHECK LIMITS ON UNIT VALUE
	AAC	+1	/X16 POINTS TO TIME PAIR -1
	DAC	X16
	JMS	SCHINT	/RETURNS IF INTERVAL OK, ELSE ERRORS OUT
	JMS	PENP	/YES -- PICK AN EMPTY NODE FROM POOL
			/(R1, R6, XR & AC ARE ALTERED)
			/POOL EMPTY?
	JMP	CX777	/YES -- SET EVENT VARIABLE TO -777
	PAL	 	/SAVE IN LR FOR NODE FILL.		/(173)
/
	LAC	CURTSK	/"EXEC" OR "NORMAL" MODE REQUESTOR?
	PAX
	LAC	A.PB,X	/"NORMAL" -- INCREMENT TRANSFERS PENDING
	PAX		/COUNT (IN PARTITION BLOCK).
	ISZ	P.TP,X
	NOP
/
	PLX		/SETUP XR TO FILL NODE
	DAC C.SP,X	/ SET UP PARTITION BLOCK ADDRESS.	/(173)
/
	LAC	(+5)	/SET CLOCK NODE TYPE INDICATOR
	DAC	C.TI,X
/
	LAC	X14	/SET EVENT VARIABLE ADR (17 BIT) IN NODE, AND
	DAC	C.PE,X	/CLEAR EVENT VARIABLE.
	AAC	-1
	DAC	X14
	DZM*	X14
/
	LAC	X10	/DETERMINE DELTA-SECONDS & DELTA-TICKS
	IAC
	DAC	X15
	JMS	CTP
	SNA		/IF ZERO DELTA-TIME, SET MARK AT NEXT
	ISZ	SCHDT	/TICK BOUNDARY.
	.RTL3		/RAISE TO API-3
	LAC	SCHDS	//SET 'CQIDS' & 'CQIDT' FOR CLOCK QUEUE INSERTION
	DAC	CQIDS	//
	LAC	SCHDT	//
	DAC	CQIDT	//
/
	JMS	CQI	//INSERT NODE IN CLOCK QUEUE
/
	DBK		//DROP FROM API-3 TO API-4
/
	JMP	CALEXT	/EXIT CAL SERVICE ROUTINE
  .TITLE *** SUBROUTINES FOR CLOCK QUEUE ENTRY
/
/ MX60 -- NON-RE-ENTRANT SUBROUTINE TO MULTIPLY AC BY SIXTY (DECIMAL).
/
MX60	0
	CLL
	MUL
	.DEC
	60
	.OCT
	LACQ
	JMP*	MX60
/
/ CTP -- NON-RE-ENTRANT SUBROUTINE TO CONVERT TIME PARAMETERS.  'X15' POINTS
/ TO THE WORD PRECEDING A WORD-PAIR CONTAINING A DELTA TIME & DELTA UNITS.
/ THIS DELTA TIME IS CONVERTED INTO DELTA TICKS & DELTA SECONDS APPROPRIATE
/ FOR CLOCK QUEUE NODE TIME PARAMETERS (DELTA-TICKS IS NON-ZERO UNLESS
/ DELTA-TIME IS ZERO).  THE OUTPUT IS STORED IN 'SCHDS' & 'SCHDT'.  AC
/ CONTAINS 'SCHDT' UPON EXIT.
/
CTP	0
	LAC*	X15	/FETCH DELTA-TIME
	SZA		/ZERO?
	JMP	CTP1
	CLA		/YES -- SET 'SCHDS' & 'SCHDT' TO ZERO AND
	DAC	SCHDS	/EXIT WITH AC=SCHDT
	DAC	SCHDT
	JMP*	CTP
CTP1	DAC	SCHDT	/NO -- SAVE TEMP IN 'SCHDT'
	LAW	-1	/FETCH DELTA UNITS AND USE 'SCHDS' AS A  
	TAD*	X15	/COUNTER SET TO: -3 FOR HOURS, -2 FOR MINUTES,
			/OR -1 FOR SECONDS.
	SNA		/TICKS?
	JMP	CTP2	/YES -- CONVERT DELTA TIME INTO TICKS & SECONDS
	TCA		/NO -- CONVERT DELTA TIME INTO SECONDS
	DAC	SCHDS
	LAC	SCHDT
	JMP	.+2
	JMS	MX60
	ISZ	SCHDS
	JMP	.-2
	AAC	-1	/NORMALIZE FOR NON-ZERO DELTA TICKS
	DAC	SCHDS
	LAC	TPS
	DAC	SCHDT
	JMP*	CTP	/EXIT WITH AC=SCHDT
/
CTP2	LAC	SCHDT	/CONVERT DELTA TIME INTO TICKS & SECONDS
	LMQ
	CLA!CLL
	DIV
TPX3	D60		/SET TO CLOCK FREQ. BY SCF
	DAC	SCHDT
	LACQ
	DAC	SCHDS
	LAC	SCHDT	/ZERO DELTA-TICKS?
	SZA
	JMP*	CTP	/NO -- EXIT WITH AC=SCHDT
	LAW	-1	/YES "NORMALIZE" FOR NON-ZERO DELTA-TICKS
	TAD	SCHDS
	DAC	SCHDS
	LAC	TPS
	DAC	SCHDT
	JMP*	CTP	/EXIT WITH AC=SCHDT
/
SCHDS	0		/SCHEDULE DELTA SECONDS
SCHDT	0		/SCHEDULE DELTA TICKS
/
/ CQI -- CLOCK QUEUE INSERTION ROUTINE -- NON-RE-ENTRANT SUBROUTINE
/ CALLED @ API-3 BY THE SCHEDULE, RUN, SYNC, AND MARK DIRECTIVES,
/ AND BY THE CLOCK INTERRUPT SERVICE ROUTINE.  BEFORE CALLING,
/ R2 MUST BE SET TO THE ADDRESS OF THE NODE TO BE INSERTED,
/ AND 'CQIDS' & 'CQIDT' MUST BE SET TO THE TIME FROM NOW
/ THAT THE NODE IS TO "COME DUE".  'CQIDT' (DELTA TICKS) SPECIFIES
/ AN INTERVAL UP TO ONE SECOND, AND 'CQIDS' (DELTA SECONDS)
/ INDICATES ADDITIONAL WHOLE SECONDS.  ('CQIDT' IS NEVER ZERO.)
/
/ "DELTA" REFERS TO THE TIME FROM NOW A NODE IS TO COME DUE.
/ "SCHEDULE" REFERS TO THE INTERVAL OF A NODE UNDER EXAMINATION.
/
CQI	0
	LAC	(CKQ)	/SETUP XR TO SCAN CLOCK QUEUE FROM LISTHEAD
	PAX
/
CQINN	LAC	C.FP,X	/END OF (OR EMPTY) DEQUE?
	SAD	(CKQ)
	JMP	CQIAN	/YES -- INSERT NODE
	PAX		/NO -- EXAMINE DEQUE NODE
	LAC	CQIDS	/IS DELTA SECONDS LESS THAN SCHEDULE SECONDS?
	TAD	C.SS,X
	SPA
	JMP	CQIAS	/YES -- ADJUST SCHEDULE INTERVAL AND INSERT
			/NODE BEFORE NODE UNDER EXAMINATION.
	SZA		/NO -- IS DELTA SECONDS GREATER THAN SCHEDULE SECONDS?
	JMP	CQIAD	/YES -- ADJUST DELTA (SECS & TICKS) AND EXAMINE
			/NEXT NODE.
	LAC	CQIDT	/NO -- DELTA & SCHEDULE SECONDS ARE EQUAL, IS
	TAD	C.ST,X	/DELTA TICKS LESS THAN SCHEDULE TICKS?
	SPA
	JMP	CQIAS	/YES -- ADJUST SCHEDULE INTERVAL AND INSERT
			/NODE BEFORE NODE UNDER EXAMINATION.
	DAC	CQIDT	/NO -- ADJUST DELTA (SECS & TICKS) AND EXAMINE
	DZM	CQIDS	/NEXT NODE.
	JMP	CQINN
/
CQIAD	DAC	CQIDS	/ADJUST DELTA (SECS & TICKS) PER SCHEDULE
	LAC	CQIDT	/INTERVAL, KEEPING DELTA TICKS POSITIVE
	TAD	C.ST,X	/AND NON-ZERO, AND EXAMINE NEXT NODE.
	DAC	CQIDT
	SMA!SZA
	JMP	CQINN
	TAD	TPS
	DAC	CQIDT
	LAW	-1
	TAD	CQIDS
	DAC	CQIDS
	JMP	CQINN
/
CQIAS	LAC	C.SS,X	/NODE IS TO BE INSERTED BEFORE NODE
	TAD	CQIDS	/UNDER EXAMINATION.  ADJUST SCHEDULE
	DAC	C.SS,X	/INTERVAL PER DELTA (SECS & TICKS), KEEPING
	LAC	C.ST,X	/SCHEDULE TICKS POSITIVE AND NON-ZERO, AND
	TAD	CQIDT	/BACKUP XR TO POINT TO THE PREVIOUS
	DAC	C.ST,X	/NODE (OR THE LIST HEAD).
	SPA
	JMP	CQIPB
	TAD	CTPS
	DAC	C.ST,X
	ISZ	C.SS,X
	NOP
CQIPB	LAC	C.BP,X
	PAX
/
CQIAN	PXA		/SET SCHEDULE SECONDS AND TICKS, AND
	DAC	R1	/INSERT NODE WHOSE ADDRESS IS IN
	LAC	R2	/R2 FOLLOWING THE NODE (OR LIST HEAD)
	PAX		/WHOSE ADDRESS IS IN XR.
	LAC	CQIDS
	TCA
	DAC	C.SS,X
	LAC	CQIDT
	TCA
	DAC	C.ST,X
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
/
	JMP*	CQI	/SUBROUTINE EXIT
/
CQIDS	0		/DELTA SECONDS
CQIDT	0		/DELTA TICKS
 .TITLE *** 'CANCEL' AND 'UNMARK' DIRECTIVES
/
/ THE CANCEL DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ANY SCHEDULE
/ REQUESTS (CLOCK QUEUE ENTRIES MADE BY SCHEDULE, RUN, OR SYNC
/ FOR AN INDICATED TASK.  A FOUR WORD CAL PARAMETER BLOCK OF THE
/ FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (04)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/
/ IF THE INDICATED TASK DOESN'T EXIST IN THE SYSTEM AND AN EVENT VARIABLE
/ HAS BEEN SPECIFIED, IT IS SET TO -201 TO INDICATE REJECTION OF THE
/ DIRECTIVE.  IF THE TASK IS IN THE SYSTEM, ALL SCHEDULING (NOT MARK
/ TIME) NODES IN THE CLOCK QUEUE FOR THE TASK ARE NULLIFIED, AND
/ THE EVENT VARIABLE IS SET TO POSITIVE ONE (+1).
/
/ ENTRY FROM CAL DISPATCH -- XR & X10 CONTAIN CPB ADDRESS
/
CN.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE 
	DAC	X13	/YES -- SAVE STL NODE ADDRESS IN X13.
	LAC	(NOP)	/TASK SCHEDULE INDICATOR.
	JMP	CU.C	/TO COMMON CODE.
/
/ THE UNMARK DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ANY MARK TIME RE-
/ QUESTS FOR AN INDICATED TASK. A FOUR-WORD CAL PARAMETER BLOCK OF THE
/ FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (23)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/
/ IF THE INDICATED TASK DOESN'T EXIST IN THE SYSTEM AND AN EVENT VARIABLE
/ HAS BEEN SPECIFIED, IT IS SET TO -201 TO INDICATE REJECTION OF THE
/ DIRECTIVE. IF THE TASK IS IN THE SYSTEM, ALL MARK TIME (NOT SCHEDULING)
/ NODES IN THE CLOCK QUEUE FOR THE TASK ARE NULLIFIED, AND THE EVENT
/ VARIABLE IS SET TO ONE (+1).
/
/ ENTRY FROM CAL DISPATCH -- XR & X10 CONTAIN CPB ADDRESS.
/
UM.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14 TO
	JMS	CPBRX	/THE 17-BIT EVENT VARIABLE ADDRESS.
/
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE.
	PAX		/YES -- GET PARTITION BLOCK ADDRESS AND
	LAC	S.PB,X	/SAVE IN X13.
	DAC	X13
	LAC	(SKP)	/MARK TIME INDICATOR.
/
/ COMMON CODE FOR 'CANCEL' AND 'UNMARK'.
/
CU.C	DAC	R1	/SAVE MARK VS. SCHEDULE INDICATOR.
/
	LAC	X11	/RAISE TO API-3 IF DIRECTIVE WAS TASK ISSUED
	SZA
	JMP	CU.1
	.RTL3
/
CU.1	LAC	(CKQ)	/SETUP TO SCAN CLOCK QUEUE
	PAX
/
CU.2	LAC	C.FP,X	/END OF DEQUE?
	SAD	(CKQ)
	JMP	CU.4	/YES -- DONE
	PAX		/NO -- SETUP TO EXAMINE NODE.
	LAC	C.SP,X	/DO STL OR PBDL NODE ADDRESSES MATCH?
	SAD	X13
	SKP		/ YES -- NULLIFY THE CLOCK Q NODE.	/(175)
	JMP	CU.2	/NO -- EXAMINE NEXT NODE
/
	XCT R1		/ SHOULD WE NULLIFY A MARK TIME?	/(175)
	JMP CU.3	/ NO.					/(175)
	PXL		/ SAVE CLOCK Q INDEX REGISTER.		/(175)
	PAX		/ SET UP TO ACCESS PBDL NODE.		/(175)
	LAC P.TP,X	/ FETCH TRANSFER PENDING COUNT.		/(175)
	SZA		/ WATCH OUT FOR SPURIOUS COUNTS.	/(175)
	AAC -1		/ DECREMENT FOR THE MARK TIME.		/(175)
	DAC P.TP,X	/ UPDATE THE TRANSFER PENDING COUNT.	/(175)
	PLX		/ RESTORE XR TO CLOCK Q.		/(175)
CU.3	LAC (6)		/ NULLIFY NODE.				/(175)
	DAC C.TI,X						/(175)
	JMP	CU.2	/EXAMINE NEXT NODE
/
CU.4	LAC	X11	/DROP FROM API-3 TO API-4 IF DIRECTIVE WAS TASK ISSUED
	SNA
	DBK
/
	JMP	CXSUC	/SET EVENT VAR +1 AND EXIT CAL SERVICE ROUTINE
/
 .TITLE *** 'WAIT', 'WAITFOR' & 'SUSPEND' DIRECTIVES
/
/ THREE SYSTEM DIRECTIVES FACILITATE SUSPENDING EXECUTION (TO ALLOW
/ LOWER PRIORITY TASKS TO RUN) AND RESUMING AT SOME FUTURE TIME.
/
/ THE 'WAITFOR' DIRECTIVE RELEASES PRIORITY UNTIL AN EVENT VARIABLE
/ IS SET AND A SIGNIFICANT EVENT IS DECLARED.
/ THE 'WAIT' DIRECTIVE RELEASES PRIORITY UNTIL THE NEXT SIGNIFICANT EVENT.
/ THE 'SUSPEND' DIRECTIVE RELEASES PRIORITY UNTIL A 'RESUME' DIRECTIVE.
/
/ THE 'WAITFOR' DIRECTIVE HAS A TWO WORD CPB OF THE FOLLOWING FORMAT:
/
/	CPB	FUNCTION CODE (20)
/		EVENT VARIABLE ADDRESS
/
/ BOTH 'WAIT' & 'SUSPEND' HAVE SINGLE WORD CPB'S:
/ 
/ 	CAL (5)   /WAIT
/
/ 	CAL (6)   /SUSPEND
/
/ ENTRIES FROM CAL DISPATCH -- XR & X10 CONTAIN CPB ADDRESS
/
WF.	LAW	-2	/CHECK RANGE OF CPB (NORMAL MODE) AND SET
	JMS	CPBRX	/XR & X14 TO THE 17-BIT EVENT VARIABLE
	PAX		/ADDRESS.
/
	LAC	0,X	/EXAMINE EVENT VARIABLE
	SZA		/CLEARED?
	JMP	CALEXT	/YES -- RETURN TO REQUESTOR
	LAC	(3)	/NO -- SET STATUS TO THREE
	JMP	WSCC	/TO COMMON CODE WITH STATUS IN AC
/
WT.	LAC	(4)	/'WAIT' -- STATUS FOUR
	JMP	WSCC	/TO COMMON CODE WITH STATUS IN AC
/
SP.	LAC	(6)	/'SUSPEND' -- STATUS SIX
			/TO COMMON CODE WITH STATUS IN AC
/
WSCC	DAC	R1	/COMMON CODE -- SAVE STATUS IN R1.
	LAC	X11	/WAS CALL ISSUED FROM A TASK?
	SZA		/YES -- SUSPEND EXECUTION
	JMP	CALEXT	/NO -- IGNORE CAL
	.INH
	LAC	CURTSK	///SETUP XR TO ACCESS ATL NODE
	PAX		///
	LAC	R1	///SET STATUS WORD IN ATL NODE
	DAC	A.TS,X	///
	LAC	X14	///SET EVENT VARIABLE ADDRESS
	DAC	A.EV,X	///
	LAC	L20	///SET RESUMPTION ADDRESS IN ATL
	DAC	A.RA,X	///
	LAC	(L20)	///RESET 'L20' TO EFFECT CAL INDIRECT	/EAG:167
	DAC	L20	///
	LAC	(M0)	///SET API-6 TRANSFER VECTOR TO INDICATE
	DAC	L6TV	///NO TASK RUNNING (NO REG SAVE).
	LAC	A.PB,X	///SET XR TO ACCESS PBDL NODE
	PAX		///
	CLL!CLA		///CLEAR LINK SO OVERFLOWS ARE DETECTED AND
			///CLEAR AC BECAUSE CLOCK REG. IS OR'D INTO AC
	RDCLK		///READ XM CLOCK REGISTER
	TAD	P.C2,X	///ADD TICKS TO RECORDED TICKS
	DAC	P.C2,X	///SAVE RESULT
	SZL		///WAS THERE AN OVERFLOW?
	ISZ	P.C1,X	///YES -- RECORD IT
	NOP		///NO -- CONTINUE
	.ENB		///
	DBK		///DROP FROM API-4 TO API-7 (CAL WAS TASK ISSUED)
	JMP	M2	///RESUME ACTIVE TASK LIST SCAN.
/
 .TITLE *** 'RESUME' DIRECTIVE
/
/ THE RESUME DIRECTIVE INSTRUCTS THE SYSTEM TO RESUME EXECUTION OF
/ A SUPEND'ED TASK.  A FIVE WORD CAL PARAMETER BLOCK OF THE FOLLOWING
/ FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (07)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/		(4) RESUMPTION ADDRESS (BITS 0-2 IGNORED)
/
/ IF THE 'RESUMPTION ADDRESS' IS ZERO, THE TASK IS RESUMED
/ AT THE WORD FOLLOWING THE 'SUSPEND' CAL.
/
/ IF THE 'RESUMPTION ADDRESS' IS NON-ZERO AND THE TASK TO BE RESUMED IS
/ A NORMAL MODE TASK, THE RESUMPTION ADDRESS IS ASSUMED TO BE RELATIVE
/ TO THE PARTITION BASE.
/
/ A NORMAL MODE TASK IS NOT ALLOWED TO REQUEST THAT ANOTHER TASK BE
/ RESUMED AT AN ADDRESS OTHER THAN THE ONE FOLLOWING THE 'SUSPEND'.
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-30	OUT-OF-PARTITION PARAMETER (NORMAL MODE)
/	-202	TASK NOT ACTIVE
/	-205	TASK NOT SUSPENDED
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
/ ENTRY WITH CPB ADDRESS IN XR & X10
/
RS.	LAW	-5	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	4,X	/SAVE RESUMPTION ADDRESS (OR ZERO) IN X11
	DAC	X11
	LAC	X10	/SCAN ACTIVE TASK LIST FOR TASK NAME -
	AAC	+2	/(R1, R2, R6, X17, XR, & AC ARE ALTERED)
	DAC	R2
	LAC	(ATKL)
	DAC	R1
	JMS	SNAM	/TASK NAME FOUND IN ATL?
	JMP	CX202	/NO -- SET EVENT VARIABLE TO -202
	PAX		/YES -- ATL NODE ADDRESS TO XR
/
	LAC	X11	/WAS A RESUMPTION ADDRESS SPECIFIED?
	SNA
	JMP	RS.1	/NO.
/
	LAC	L20	/YES -- WAS THE REQUEST ISSUED FROM A NORMAL
	RTL		/MODE TASK?
	SPA
	JMP	CX030	/YES -- SET E.V. TO -30.
/
	LAC	X11	/MASK OFF THE MODE BITS.
	AND	(77777)
	DAC	X11
	LAC	A.RA,X	/ADD MODE BITS IN FORCE AT THE TIME THE 'SUSPEND'
	AND	(700000)/DIRECTIVE WAS EXECUTED.
	XOR	X11
	DAC	X11
/
RS.1	LAC	(6)
	.INH		/IS TASK SUSPENDED (STATUS=6)?
	SAD	A.TS,X	///
	JMP	RS.2	///YES.
	.ENB		///NO -- SET EVENT VARIABLE TO -205
	JMP	CX205	///
RS.2	LAC	X11	///WAS A RESUMPTION ADDRESS SPECIFIED?
	SZA		///NO -- RESUME AT WORD FOLLOWING 'SUSPEND' CAL
	DAC	A.RA,X	///YES -- SET RESUMPTION ADDRESS
	LAC	(4)	///SET TASK STATUS TO FOUR (4)
	.ENB		///ENABLE INTERRUPTS.
	DAC	A.TS,X	///
	.SET6		/DECLARE A SIGNIFICANT EVENT
	JMP	CXSUC	/SET EVENT VARIABLE TO +1, AND
			/EXIT CAL SERVICE ROUTINE
 .TITLE *** 'EXIT' DIRECTIVE
/
/ THE 'EXIT' DIRECTIVE MAY ONLY BE ISSUED FROM A TASK.
/
/ TASK IS REMOVED FROM THE ACTIVE TASK LIST. IF IT IS A NORMAL MODE TASK
/ AND IF THE "TRANSFERS PENDING" COUNT IN ITS PARTITION BLOCK IS NON-ZERO,
/ PUT THE ATL NODE IN THE I/O RUNDOWN DEQUE AND TRIGGER THE I/O RUNDOWN
/ TASK "IORD". IF NO TRANSFERS ARE PENDING OR IF IT IS AN EXEC MODE TASK
/ (FOR WHICH NO CHECKS ARE MADE), THE TASK IS IMMEDIATELY FLAGGED INACTIVE
/ IN THE SYSTEM TASK LIST AND, IF THE TASK IS NOT FIXED IN CORE, THE
/ PARTITION IS FREED. THEN, IN EITHER CASE, A SIGNIFICANT EVENT IS DECLARED
/ TO CAUSE A SCAN OF THE ACTIVE TASK LIST FROM THE TOP.
/
/ THIS DIRECTIVE ALSO CAN BE USED TO STORE TASK TIMING DATA
/ REFER TO THE TASK TIMING ROUTINE'S DESCRIPTION FOR MORE INFO.
/
EX.	LAC	X11	/WAS CAL ISSUED FROM A TASK?
	SZA		/YES -- EXIT TASK
	JMP	CALEXT	/NO -- IGNORE CAL
/
	LAC	(L20)	/RESET L20 TO EFFECT CAL INDIRECT	/EAG:167
	DAC	L20
/
	LAC	CURTSK	/DELETE NODE FROM ACTIVE TASK LIST.
	DAC	R1	/('R1' POINTS TO ACTIVE TASK LIST NODE)	/(211)
	DAC R2		/ SAVE POINTER TO ACTIVE NODE.		/(211)
	LAC* R1		/ FETCH FORWARD POINTER.		/(211)
	DAC CURTSK	/ MOVE CURTSK TO NEXT ENTRY IN LIST.	/(211)
			/ TO AVOID THE RACE WITH THE TIME SLICER/(211)
	JMS NDEL	/ NO REGISTERS ARE ALTERED. REMOVE THE	/(211)
			/ EXITTED TASK'S ATL NODE FROM THE ATL.	/(211)
/
	LAC R2		/ FETCH OLD CURTSK VALUE FROM R2.	/(211)
	.IFDEF NOMAC						/(161)
	SAD	TDVCTF	/CURRENT TDV FUNCTION?
	JMP	EX.5	/YES -- TDV FLAG MIGHT NEED TO BE CLEARED.
	.ENDC							/(161)
EX.2	PAX		/NO.
	LAC	A.SN,X	/STL NODE ADR
	PAX
	PXL		/SAVE STL NODE ADR FOR EX.3
	LAC	S.DP,X	/SET THE 'DONE' BIT
	AND	(773777
	XOR	(004000
	DAC	S.DP,X
	.IFUND	NOXM
	LAC	TIMFLG	/IS TASK TIMING ON?
	SZA
	JMP	EX.T0	/YES -- GO DO IT!
	.ENDC
EX.CON	LAC	S.PB,X	/PARTITION BLOCK ADR			/(173)
	PAX
	LAC	P.UP,X	/WAS THE EXITTING TASK SHARING CORE?
	SNA
	JMP	EX.7	/NO -- PROCEED
	DAC	R1	/YES -- SAVE ADDR OF SHARED BLOCK'S TASK USE COUNT
	.INH		///INHIBIT INTERRUPTS
	LAC*	R1	///GET THE TASK USE COUNT OF SHARED BLOCK'S NODE
	AAC	-1	///DECREMENT IT
	.ENB		///ENABLE INTERRUPTS
	DAC*	R1	///RESET THE VALUE
EX.7	LAC	P.TP,X	/TRANSFERS PENDING COUNT
	SNA
	JMP	EX.3	/NONE
/
	LAC	(IORDQ)	/I/O RUNDOWN DEQUE LISTHEAD
	DAC	R1
/ R2 IS ALREADY SE UP WITH THE CORRECT VALUE FROM ABOVE.	/(211)
	JMS	SPRI	/(R1, R2, R3, R6, XR & AC ARE ALTERED)
/
	CLC		/SET "IORD'S" TRIGGER EVENT VARIABLE.
	DAC	IORDTG
	JMP	EX.4
/
EX.3=.								/(161)
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ IS THE CURRENT TASK A MULTIACCESS JOB?/(161)
	SNA		/ AC >< 0 IF YES.			/(161)
	JMP EX.3A	/ NO, TAKE NORMAL EXIT PROCESS.		/(161)
	LAC R2		/ FETCH ATL NODE ADDRESS.		/(211)
	PAX		/ SET UP TO ACCESS ATL NODE		/(161)
	DZM T.EC,X	/ SET EXIT NODE CODE FOR MULTIACCESS.	/(161)
	LAC (TDV.EQ)	/ FETCH PROPER LIST ADDRESS.		/(161)
	JMP EX.3B	/ REJOIN COMMON CODE.			/(161)
EX.3A=.								/(161)
	.ENDC							/(161)
	LAC	(POOL)	/RETURN ATL NODE TO POOL
EX.3B	DAC R1		/ SET UP PROPER POOL ADDRESS.		/(161)
/ R2 CONTAINS THE CORRECT VALUE FOR NADD FROM ABOVE.		/(211)
	PLX		/ SET STL NODE ADDR INTO XR.		/(161)
	JMS FREEUP	/ SUBROUTINE, USED ALSO BY "IORD" TO	/(161)
			/ FREE PARTITION IF TASK NOT FIXED IN	/(161)
			/ CORE AND TO SET TASK INACTIVE IN STL	/(161)
			/ NODE (AC XR LR ARE ALTERED)		/(161)
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
/
EX.4	JMP	M1	/DECLARE NO TASK CURRENT, DEBREAK OUT
			/OF CAL LEVEL (API-4), AND SCAN ACTIVE TASK LIST
			/FROM THE TOP.  (NO CAL EXIT)
	.IFDEF NOMAC						/(161)
EX.5	LAC	TDVTAC	/IS TDV DISPATCHER WAITING TO SEND ANOTHER
	SZA		/COMMAND LINE TO THIS SAME TDV TASK?
	JMP	EX.6	/YES.
	DZM	TDVCTF	/NO -- CLEAR 'CURRENT TDV FUNCTION'. THIS TASK FORGOT
	CLA!IAC		/TO EXECUTE THE 'XFRCMD' DIRECTIVE.
	DAC	TDVEV2	/SET 'LINE MOVED' EV.
EX.6	LAC	R2						/(211)
	JMP	EX.2
	.ENDC							/(161)
/
/ REENTRANT SUBROUTINE "FREEUP" -- COMMON TO "EXIT" DIRECTIVE AND TO
/ "IORD" I/O RUNDOWN TASK. FREE'S A TASK'S PARTITION IF TASK NOT FIXED
/ IN CORE AND SETS TASK INACTIVE IN ITS STL NODE.
/
/ LINKAGE:
/   XR -- STL NODE ADDRESS
/   JMS FREEUP
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   XR, AC & LR							/(161)
/
FREEUP	0
	.INH		/ INHIBIT INTERRUPTS.
	LAC S.PB,X	///FETCH PARTITION BLOCK ADDRDSS.	/(161)
	PAL		///SALT IT AWAY IN LIMIT REGISTER.	/(161)
	LAC	S.DP,X	///FLAG TASK INACTIVE IN STL NODE
	AND	(377777)///
	DAC	S.DP,X	///
	AND	(040000)///FIXED IN CORE?
	PLX		///SET UP XR FOR CLEARING LUN MAPPING.	/(161)
	SZA		///
	JMP	FREEEX	///YES -- DON'T FREE PARTITION
	LAC	P.TC,X	///
	AAC	-1	///
	DAC	P.TC,X	///
FREEEX	LAC P.FW,X	///FETCH FLAGS WORD FROM PBDL		/(161)
	AND (7)		///CLEAR LUN MAPPING AND USER NUMBER.	/(161)
	DAC P.FW,X	///STORE NEW FLAG WORD IN PBDL		/(161)
	.ENB		///ENABLE INTERRUPTS.			/(161)
	JMP*	FREEUP	///
	.TITLE *** TASK TIMING ROUTINE ***
/
/ THIS ROUTINE ALLOWS USERS TO TIME THE TASKS IN THEIR SYSTEM.  TO USE
/ THIS FEATURE THE USER MUST INITIALIZE THE DATA BUFFERS, THE TASK TIMING
/ CONTROL TABLE, AND SET LOCATION 312 (HEREAFTER REFERRED TO AS
/ TIMFLG) TO POINT AT THE FIRST WORD OF THE CONTROL TABLE.  THE CONTROL
/ TABLE MUST HAVE THE FOLLOWING FORMAT:
/
/	WORD	NAME	CONTENTS
/	0	EV	TASK TIMING EVENT VARIABLE (ZERO INITIALLY)
/	1	START1	POINTER TO 1ST WORD OF BUFFER 1
/	2	END1	POINTER TO LAST WORD IN BUFFER 1
/	3	START2	POINTER TO 1ST WORD OF BUFFER 2
/	4	END2	POINTER TO LAST WORD IN BUFFER 2
/	5	PTR	POINTER TO NEXT FREE BUFFER ENTRY (MUST BE
/			EQUAL TO START1 INITIALLY)
/
/ WHEN TIMFLG IS SET, A TASK EXITS, AND THERE IS SUFFICINT ROOM IN A BUFFER
/ EXIT WILL FILL THE APPROPRIATE BUFFER ENTY WITH THE FOLLOWING DATA:
/
/	WORD	DATA
/	6*N	TASK NAME FIRST HALF				/(214)
/	6*N+1	TASK NAME SECOND HALF				/(214)
/	6*N+2	XM CLOCK OVERFLOWS				/(214)
/	6*N+3	XM CLOCK TICKS ABOVE OVERFLOW COUNT		/(214)
/	6*N+4	I/O COUNT					/(214)
/	6*N+5	UIC						/(214)
/
/ EXIT WILL TYPICALLY SET THE EVENT VARIABLE TO +1 WHEN BUFFER 1 IS FULL
/ AND +2 WHEN BUFFER 2 IS FULL. HOWEVER, EXIT EXPECTS THAT WHEN THE USER-
/ WRITTEN BUFFER DUMPING TASK HAS WRITTEN THE BUFFER'S CONTENTS TO
/ A MASS STORAGE DEVICE, IT WILL INDICATE THAT THE BUFFER HAS BEEN EMPTIED
/ BY ZEROING THE EVENT VARIABLE.  IF EXIT DECIDES A BUFFER IS FULL AND
/ THE OTHER BUFFER HAS NOT BEEN EMPTIED, IT WILL SET THE EVENT VARIABLE TO
/ -1.  IF ANOTHER TASK EXITS BEFORE THE BUFFER DUMPING TASK CAN DUMP THE
/ BUFFERS AND ZERO THE EVENT VARIABLE, EXIT WILL DECREMENT THE NEGATIVE
/ EVENT VARIABLE VALUE.  NOTE THAT EACH TIME EXIT MAKES A BUFFER ENTRY
/ IT WILL INCREMENT PTR BY 4 AND CHECK TO SEE IF THE BUFFER IS FULL. IF THE
/ BUFFER HAS BEEN FILLED AND THE EVENT VARIABLE IS ZERO, EXIT WILL SET
/ THE EVENT VARIABLE ACCORDING TO WHICH BUFFER WAS FILLED AND MAKE PTR
/ POINT TO THE FIRST WORD OF THE OTHER BUFFER.
/
	.IFUND	NOXM
EX.T0	PAX			/SET UP XR TO ACCESS CONTROL TABLE
	LAC	0,X		/GET THE EV
	SMA			/ALREADY MINUS?
	JMP	EX.T1		/NO -- PROCEED
	AAC	-1		/YES -- DECREMENT IT AGAIN (DATA LOST)
	DAC	0,X
	JMP	EX.TQ		/LEAVE TASK TIMING
/
/  EDIT #156
/
/  ASSUME THAT THE POINTER IS OUR PROPERTY; THEN IT
/  IS ALREADY SET UP CORRECTLY
/
EX.T1	LAW	-1		/SET UP X12 TO PUSH DATA
	TAD	5,X		/POINTER
	DAC	X12
EX.T3	PLX			/ROOM -- SET XR UP TO ACCESS STL
	LAC	S.N1,X		/STORE 1ST HALF OF TASK NAME
	DAC*	X12
	LAC	S.N2,X		/STORE 2ND HALF OF TASK NAME
	DAC*	X12
	LAC	S.PB,X		/GET ADDR OF PBDL NODE
	PAX			/SET UP XR TO ACCESS PBDL NODE
	CLL!CLA			/CLEAR LINK SO OVERFLOWS ARE DETECTED AND
				/CLEAR AC BECAUSE CLOCK IS OR'D INTO AC
	RDCLK			/READ XM CLOCK
	TAD	P.C2,X		/ADD TICK COUNT
	DAC	P.C2,X		/SAVE RESULT
	SZL			/WAS THER AN OVERFLOW?
	ISZ	P.C1,X		/YES -- BUMP OVERFLOW COUNT
	NOP			/NO
	LAC	P.C1,X		/STORE THE OVERFLOW COUNT
	DAC*	X12
	LAC	P.C2,X		/STORE THE XM TICK COUNT
	DAC*	X12
	LAC	P.IO,X		/ STORE I/O COUNT		/(213)
	DAC*	X12						/(213)
	LAC	MA.UN		/ GET MULTIACCESS USER NUMBER	/(214)
	SNA!CLL							/(214)
	JMP	EX.T4		/ ZERO MEANS NOT MULTIACCESS	/(214)
				/ TASK; SET UFD=0		/(214)
	AAC	-1		/ MAKE IN RANGE 0 TO N-1	/(214)
	MUL;	UC.LEN		/ CALCULATE OFFSET TO CURRENT UCA /(214)
	LACQ							/(214)
	TAD	MA.UCA		/ ADD IN BASE OF UCA		/(214)
	AAC	UC.UFD		/ THEN THE INTERNAL OFFSET	/(214)
	PAX			/ NO XR ADJUST FOR PAGE 0	/(214)
	LAC	0,X		/ GET UIC			/(214)
EX.T4	DAC*	X12		/ AND STORE IN TIMING BUFFER	/(214)
	LAC	TIMFLG		/GET ADDR OF CONTROL TABLE
	PAX			/SET UP XR TO ACCESS CONTROL TABLE
	LAC	X12		/EFFECTIVELY INCREMENT THE PTR
	IAC
	DAC	5,X
/
	LAC	2,X		/IS BUFFER 1 FULL?
	CLL!CMA			/IT IS IF X12 0-5 FROM END	/(213)
	TAD	X12		/MAKE COMBINED TEST ON 0-5	/(213)
	AAC	6						/(213)
	SNL!SMA!CLL		/SKIP IF NOT 0-5 FROM END	/(213)
	JMP	EX.T7		/DECLARE #1 FULL (LINK=0 FLAG)
	LAC	4,X		/IS BUFFER 2 FULL?
	CLL!CMA			/SAME TEST SEQUENCE
	TAD	X12
	AAC	6						/(213)
	SZL!SPA			/XCPT SKIP ON FULL HERE
	JMP	EX.TQ		/NONE FILLED, JUST EXIT
	LAC	1,X		/#2 FULL, RESTART ON #1
	SKP!CLL!CML		/SET LINK TO SHOW #2 FILLED
EX.T7	LAC	3,X		/#1 FULL, RESTART ON #2
	DAC	5,X		/NEW POINTER
	LAC	0,X		/CHECK IF OTHER BUFFER AVAILABLE
	SZA!RAL			/SKIP IF YES TO SET UP 1 OR 2 EV
	SKP!CLA!CMA		/OTHER BUFFER NOT READY, SET EV TO -1
	IAC			/MAKES 1 OR 2 FOR EV AS REQUIRED
	DAC	0,X		/SET EV
EX.TQ	PLX			/EXIT CODE, REESTABLISH XR
	JMP	EX.CON		/REJOIN MAIN EXIT CODE
/
	.ENDC
 .TITLE *** 'UNFIX' DIRECTIVE
/
/ THE UNFIX DIRECTIVE INSTRUCTS THE SYSTEM TO NULLIFY A FIX DIRECTIVE.
/ I.E., TO FREE A PARTITION.  IF A FIXED TASK IS ACTIVE WHEN AN 
/ UNFIX DIRECTIVE IS ISSUED, THE PARTITION WILL BE FREED WHEN THE 
/ TASK EXITS.  A FOUR WORD CAL PARAMETER BLOCK OF THE FOLLOWING
/ FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (16)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	  -201	TASK NOT IN SYSTEM
/	  -207	TASK NOT FIXED
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
/ ENTRY FROM CAL DISPATCH -- XR & X10 CONTAIN CPB ADDRESS
/
UF.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE
	PAX		/YES -- SETUP XR TO ACCESS STL NODE
	.INH		///
	LAC	S.DP,X	///IS TASK FIXED-IN-CORE?
	AND	(737777)///
	SAD	S.DP,X	///
	JMP	UN.E1	///NO -- ERR 207
	DAC	S.DP,X	///YES -- CLEAR FIXED-IN-CORE INDICATOR
	SPA		///IS TASK ACTIVE?
	JMP	UN.1	///YES -- PARTITION WILL BE FREED UPON EXIT
	LAC	S.PB,X	///NO -- FREE PARTITION
	PAX		///
	LAC	P.TC,X	///
	AAC	-1	///
	DAC	P.TC,X	///
UN.1	.ENB		///SUCCESSFUL COMPLETION SET EVENT
	JMP	CXSUC	///VARIABLE TO +1 AND EXIT CAL
			/  SERVICE ROUTINE.
/
UN.E1	.ENB		///
	JMP	CX207	///
 .TITLE *** 'DISABLE' & 'ENABLE' DIRECTIVES
/
/ THE DISABLE DIRECTIVE INSTRUCTS THE SYSTEM TO REJECT FURTHER
/ REQUEST, SCHEDULE, RUN, SYNC, OR FIX DIRECTIVES FOR AN INDICATED
/ TASK.
/ THE ENABLE DIRECTIVE INSTRUCTS THE SYSTEM TO NULLIFY A
/ DISABLE DIRECTIVE.
/ REDUNDANT DISABLE OR ENABLE DIRECTIVES HAVE NO EFFECT.  A FOUR
/ WORD CAL PARAMETER BLOCK OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) CAL FUNCTION CODE (21) FOR DISABLE (22) FOR ENABLE
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/
/ IF THE INDICATED TASK DOES NOT EXIST IN THE SYSTEM, THE
/ EVENT VARIABLE, IF SPECIFIED, IS SET TO -201; OTHERWISE,
/ THE DIRECTIVE IS EXECUTED AND THE EVENT VARIABLE (IF SPECIFIED)
/ IS SET TO POSITIVE ONE (+1).
/
/ CONTROL IS TRANSFERRED TO 'EA.' OR 'DA.' BY THE CAL DISPATCH ROUTINE
/ WITH THE CPB ADDRESS IN XR & X10.
/
EA.	CLA!SKP		/ENABLE -- SETUP TO CLEAR BIT-2 OF STL NODE FLAGS WORD
DA.	LAC	(100000)/DISABLE -- SETUP TO SET BIT-2 OF STL NODE FLAGS WORD
/
	DAC	X11	/SAVE BIT-2 XOR WORD IN X11
/
	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/NO -- SET E.V. TO -201 & EXIT CAL SERVICE
	PAX		/YES -- SETUP XR TO ACCESS STL NODE
	LAC	X11	/SET UP DISABLE BIT IN LINK FOR LATER
	RAL
	RTL
	.INH		///
	LAC	S.DP,X	///
	AND	(677777)///
	XOR	X11	///
	.ENB		///
	DAC	S.DP,X	///
/
/	DESIGN DECISION, ON ENABLE, IF TASK IS STILL SUFFEREING
/	FROM A PARTITION TROUBLE, SEND EVENT VARIABLE 212,213
/	SO ENABLER DOES NOT THINK TASK CAN RUN!!
/
	AND	(30000	/TWO BITS PARTITION GONE, AND RECONF. IN PROGRESS
	SNA!SPA!SZL	/TOUGH!SKIPS WHEN PARTITION TROUBLE AND ENABLE
	JMP	CXSUC	/NONE OR ONE OF ABOVE, OK!
	JMP	RF.E1	/BOTH, NOT OK, ERROR EV.
 .TITLE *** 'CONNECT' & 'DISCONNECT' DIRECTIVES
/
/ THE CONNECT DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER CONTROL
/ TO AN INDICATED LOCATION WHENEVER AN INTERRUPT OCCURS ON AN INDICATED
/ LINE.  A FOUR WORD CAL PARAMETER BLOCK OF THE FOLLOWING FORMAT IS
/ USED:
/
/	CPB	(0) FUNCTION CODE (11)
/		(1) EVENT VARIABLE ADDRESS
/		(2) INTERRUPT LINE NUMBER
/		(3) INTERRUPT TRANSFER ADDRESS
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-26	ILLEGAL FUNCTION FOR A NORMAL MODE TASK
/	-301	LINE NUMBER REJECTED
/	-302	LINE ALREADY CONNECTED
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
/ ENTER WITH CPB ADDRESS IN XR & X10
/
CI.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
	LAC	(EMGINT)/OLD CONNECT (R1) SHOULD BE 'EMGINT'
	DAC	R1
	LAC	3,X	/NEW CONNECT (R2) SHOULD BE CPB WD 3
	DAC	R2
	JMP	DI.C	/TO COMMON CODE
/
/ THE DISCONNECT DIRECTIVE INSTRUCTS THE SYSTEM THAT CONTROL IS
/ NO LONGER TO BE TRANSFERRED TO AN INDICATED LOCATION WHEN AN 
/ INTERRUPT OCCURS ON AN INDICATED LINE.  A FOUR WORD CAL
/ PARAMETER BLOCK OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (12)
/		(1) EVENT VARIABLE ADDRESS
/		(2) INTERRUPT LINE NUMBER
/		(3) PRESENT INTERRUPT TRANSFER ADDRESS
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS
/ SET TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE REJECTION
/ AND THE REASON:
/
/	-26	ILLEGAL FUNCTION FOR A NORMAL MODE TASK
/	-301	LINE NUMBER REJECTED
/	-302	LINE NOT CONNECTED AS INDICATED
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO POSITIVE ONE (+1).
/
/ ENTRY WITH CPB ADDRESS IN XR & X10
/
DI.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	3,X	/OLD CONNECT (R1) SHOULD BE CPB WD 3
	DAC	R1
	LAC	(EMGINT)/NEW CONNECT (R2) SHOULD BE 'EMGINT'
	DAC	R2
/
/ COMMON CODE FOR 'CONNECT' & 'DISCONNECT'
/
DI.C	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	DI.CL	/NO -- MUST BE EXEC MODE.
	LAC	CURTSK	/YES -- CHECK RESTART ADDRESS TO SEE IF IT'S
	PAX		/NORMAL MODE.
	LAC	A.RA,X
	RTL
	SPA
	JMP	CX026	/YES -- SET EV TO -26.
	LAC	X10	/NO -- RESTORE CPB POINTER IN XR.
	PAX
DI.CL	LAW	-4	/IS LINE NUMBER < 04 ?
	TAD	2,X
	SPA
	JMP	CX301	/YES -- ERR 301
	LAW	ITVTB-ETVTB /NO -- IS LINE NUMBER TOO LARGE?
	TAD	2,X
	SMA
	JMP	CX301	/YES -- ERR 301
	LAC	2,X
	SAD	(40)	/NO -- CONSOLE TTY PRINTER?
	JMP	CX301	/YES -- ERR 301
	SAD	(41)	/NO -- CONSOLE TTY KEYBOARD?
	JMP	CX301	/YES -- ERR 301
	SAD	(11)	/NO -- CLOCK OVERFLOW?
	JMP	CX301	/YES -- ERR 301
	SAD	(7)	/RK DISK?
	JMP	CX301	/YES -- ERR 301
	SAD	(23)	/NO, RF DISK?
	JMP	CX301	/YES -- ERR 301
	SAD	(24)	/NO, RP DISK?
	JMP	CX301	/YES -- ERR 301
	SAD	(34)	/NO -- LT19 PRINTERS LINE?
	JMP	CX301	/YES -- ERR 301
	SAD	(35)	/NO -- LT19 KEYBOARDS LINE?
	JMP	CX301	/YES -- ERR 301
	TAD	(ITVTB)	/NO -- SET R3 TO THE TRANSFER VECTOR ADDRESS
	DAC	R3
/
	.INH		/IS OLD CONNECT OKAY?
	LAC	R1	///
	SAD*	R3	///
	JMP	DT.C1	///
	.ENB		/NO -- SET EVENT VARIABLE TO -302
	JMP	CX302	/AND EXIT CAL SERVICE ROUTINE
/
DT.C1	LAC	R2	/YES -- SET NEW CONNECT, SET EVENT
	DAC*	R3	/VARIABLE TO +1, AND EXIT CAL
	.ENB		/SERVICE ROUTINE
	JMP	CXSUC
 .TITLE *** 'DATE & TIME INFORMATION' DIRECTIVE
/
/ THE DATE & TIME DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE
/ THE CURRENT TIME & DATE.  AN EIGHT WORD CAL PARAMETER BLOCK
/ OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (24)
/		(1) EVENT VARIABLE ADDRESS
/		(2) MONTH BUFFER
/		(3) DAY BUFFER
/		(4) YEAR BUFFER
/		(5) HOURS BUFFER
/		(6) MINUTES BUFFER
/		(7) SECONDS BUFFER
/
/ THE EVENT VARIABLE (IF SPECIFIED) IS SET TO ONE (+1) AND
/ THE TIME AND DATE ARE SET IN THE THIRD THRU EIGHTH CPB WORDS.
/
DT.	LAW	-10	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	MO	/SET DATE & TIME IN CPB
	DAC	2,X
	LAC	DA
	DAC	3,X
	LAC	YR
	DAC	4,X
	LAC	HH
	DAC	5,X
	LAC	MM
	DAC	6,X
	LAC	SS
	DAC	7,X
/
	JMP	CXSUC	/SET EVENT VARIABLE TO ONE (+1) AND EXIT
			/CAL SERVICE ROUTINE.
 .TITLE *** 'TASK NAME INFORMATION' DIRECTIVE
/
/ THE TASK NAME DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE NAME
/ OF THE ISSUING TASK.  A FOUR WORD CAL PARAMETER BLOCK OF THE
/ FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (25)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TASK NAME BUFFER (FIRST HALF)
/		(3) TASK NAME BUFFER (SECOND HALF)
/
/ IF THE DIRECTIVE IS ISSUED FROM AN INTERRUPT SERVICE ROUTINE,
/ THE TASK NAME IS NOT AVAILABLE AND THE EVENT VARIABLE (IF
/ SPECIFIED) IS SET TO -203.  IF THE DIRECTIVE IS ISSUED FROM
/ A TASK, THE EVENT VARIABLE (IF SPECIFIED) IS SET AS SHOWN BELOW
/ AND THE TASK NAME IS SET IN CPB WORDS THREE & FOUR.
/
/ EVENT VARIABLE SETTINGS FOR SUCCESSFUL COMPLETION:
/
/	BIT 0 -- ZERO
/	BIT 1 -- SET IF FPP REQUIRED TO RUN TASK
/	BIT 2 -- SET IF TASK RUNS IN BANK MODE
/	BIT 3 -- SET IF TASK RUNS IN NORMAL MODE
/	BIT 4 -- ZERO (RESERVED FOR RELOCATE DISABLE)
/	BITS 5+6 -- SET IF TASK IS NORMAL MODE AND RUNS IN XVM MODE
/	            (ZERO IF TASK IS EXEC MODE)
/	BIT 7 -- SET IF TASK IS NORMAL MODE AND HAS IOT PERMISSION
/	         (ZERO IF TASK IS EXEC MODE)
/	BITS 8-17 -- TASK PRIORITY
/
TN.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203
	LAC	CURTSK	/YES -- SET NAME IN CPB
	AAC	+A.N1-1
	DAC	X12
	LAC*	X12
	DAC	2,X
	LAC*	X12
	DAC	3,X
/
	LAC	CURTSK	/GET THE ADDR OF TASK'S ATL NODE
	PAX		/SET UP XR TO ACCESS NODE
	LAC	A.SN,X	/GET ADDR OF STL NODE
	PAX		/SET UP TO ACCESS STL NODE
	LAC	S.DP,X	/GET PRIORITY AND OTHER DATA
	AND	(1777	/AND OFF OTHER DATA
	LMQ		/SAVE TASK PRIORITY IN MQ
	LAC	S.EP,X	/GET FLAGS AND START ADDR
	AND	(700000	/KEEP ONLY THE FLAGS
	CLL!RAR		/POSITION THE FLAGS
	OAC		/OR AC AND MQ AND PUT RESULT INTO MQ
	AND	(040000	/IS TASK NORMAL MODE?
	SNA
	JMP	TN.1	/NO -- IT'S EXEC MODE
	LAC	S.TS,X	/YES -- OBTAIN TASK SIZE AND MM DATA
	AND	(000360	/KEEP MM DATA
	ALS	6	/SHIFT INTO POSITION
TN.1	OMQ		/CONSTRUCT FINAL EV
/
	JMP	CXDAC	/SET EVENT VARIABLE AND EXIT
			/CAL SERVICE ROUTINE
 .TITLE *** 'PARTITION INFORMATION' DIRECTIVE
/
/ THE PARTITION INFORMATION DIRECTIVE INSTRUCTS THE SYSTEM TO
/ RETURN THE BASE ADDRESS AND PARTITION SIZE AS 17-BIT ABSOLUTE
/ ADDRESSES.
/
/ A FIVE WORD CPB OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (26)
/		(1) EVENT VARIABLE ADDRESS
/		(2) PARTITION NAME (FIRST HALF)
/		(3) PARTITION NAME (SECOND HALF)
/		(4) ADDRESS OF DOUBLE WORD AT WHICH TO RETURN BASE & SIZE
/
/ IF A PARTITION NAME IS NOT SPECIFIED (ZERO CPB WD 2), THE REQUESTOR'S
/ PARTITION NAME IS SET IN THE CPB.
/
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/     +1 -- DEFINITION RETURNED
/   -203 -- CAL NOT TASK-ISSUED
/   -211 -- NAMED PARTITION NOT IN SYSTEM
/
/ ENTER FROM CAL DISPATCH WITH CPB ADDRESS IN XR & X10
/
PI.	LAW	-5	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK-ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203.
/
	LAC	4,X	/CHECK BASE & SIZE BUFFER ADDRESSES, ADJUST
	PAL		/TO 17-BIT ADDRESSES, AND SETUP X15 TO STORE
	JMS	CACAJ	/THEM.
	AAC	-1
	DAC	X15
	PLA
	IAC
	JMS	CACAJ
/
	LAC	2,X	/WAS A PARTITION NAME SPECIFIED?
	SNA
	JMP	PI.2	/NO -- REQUESTOR'S PARTITION NAME IS IMPLIED
	LAC	(PBDL)	/YES -- SCAN PBDL FOR NAME MATCH
	DAC	R1
	PXA
	AAC	+2
	DAC	R2
	JMS	SNAM	/(R1, R2, R6, X17, XR, & AC ARE ALTERED)
			/PARTITION NAME MATCH FOUND?
	JMP	CX211	/NO -- SET REQUESTOR'S EVENT VARIABLE TO -211
	PAX		/YES -- RETURN PARTITION BASE & SIZE (VIA COMMON 
	JMP	PI.3	/WITH PBDL NODE ADDRESS IN XR).
/
PI.2	LAC	X10	/PARTITION NAME NOT SPECIFIED -- FETCH NAME
	IAC		/FROM PARTITION BLOCK AND SET IN CPB AND TRANSFER 
	DAC	X13	/TO COMMON CODE WITH PBDL NODE ADDRESS IN XR.
	LAC	CURTSK
	PAX
	LAC	A.PB,X
	PAX
	LAC	P.N1,X
	DAC*	X13
	LAC	P.N2,X
	DAC*	X13
/
PI.3	LAC	P.BA,X	/COMMON CODE TO RETURN PARTITION BASE & SIZE
	DAC*	X15	/(XR CONTAINS THE PBDL NODE ADDRESS).
	LAC	P.SZ,X
	DAC*	X15
	JMP	CXSUC	/SET EV TO +1 AND EXIT CAL SERVICE
 .TITLE *** 'SETJEA' DIRECTIVE
/
/ THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET UP THE JEA (JMS EXIT ADDRESS)
/ REGISTER IN THE FLOATING POINT HARDWARE AND TO SAVE THE ADDRESS IN
/ THE TASK'S PARTITION BLOCK NODE. THE JEA REGISTER,
/ CAN BE ALTERED IF THE TASK GIVES UP CONTROL VIA A 'CAL' (SUCH AS
/ WAITFOR). HOWEVER, ONE EXPECTS TO SET UP THE JEA ONLY ONCE; CONSE-
/ QUENTLY, 'SETJEA' IS A POSITIVE WAY TO SAVE THE JEA'S VALUE. THIS
/ DIRECTIVE IS USED BY THE FORTRAN OTS FLOATING POINT ERROR SUBROUTINE.
/ A THREE WORD CAL PARAMETER BLOCK (CPB) OF THE FOLLOWING FORMAT IS USED.
/
/	CPB	(0) FUNCTION CODE (17)
/		(1) EVENT VARIABLE ADDRESS
/		(2) JEA ADDRESS
/
/ IF THE DIRECTIVE IS REJECTED, THE EVENT VARIABLE (IF SPECIFIED) IS SET
/ TO ONE OF THE FOLLOWING NEGATIVE VALUES TO INDICATE THE REASON FOR
/ REJECTION:
/
/	-1	NO FP15 HARDWARE ON THIS MACHINE
/	-30	JEA ADDRESS OUTSIDE OF TASK PARTITION
/	-203	CAL NOT TASK-ISSUED
/
/ IF THE DIRECTIVE IS ACCEPTED, IT IS EXECUTED AND THE EVENT VARIABLE
/ (IF SPECIFIED) IS SET TO ONE (+1).
/
/ ENTRY FROM CAL DISPATCH WITH THE CPB ADDRESS IN XR & X10.
/
SJ.	LAW	-3	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/WAS CAL TASK-ISSUED?
	SZA
	JMP	CX203	/NO -- SET EVENT VARIABLE TO -203.
/
	XCT	FPHDWE	/SKIP IF FP HARDWARE EXISTS.
	JMP	CX001	/NO -- SET EVENT VARIABLE TO -1.
/
	LAC	2,X	/SAVE UNRELOCATED JEA ADDRESS.
	DAC	R3
	LAC	CURTSK	/ATL NODE ADDRESS.
	PAX
	LAC	A.RA,X	/EXAMINE THE RESTART ADDRESS TO SEE IF THIS IS
	RTL		/AN EXEC MODE TASK.
	SMA
	JMP	SJ.1	/YES.
	LAC	A.PB,X	/NO -- PARTITION BLOCK ADDRESS.
	PAX
	LAC	R3	/UNRELOCATED JEA ADDRESS.
	TCA
	TAD	P.TS,X	/TASK SIZE.
	SPA
	JMP	CX030	/ERROR -- ADDRESS EXCEEDS TASK LIMITS.
	JMP	SJ.2
/
SJ.1	LAC	A.PB,X	/PARTITION BLOCK ADDRESS.
	PAX
SJ.2	LAC	R3
	DAC	P.JE,X	/SAVE JEA ADDRESS IN PARTITION BLOCK NODE.
	DAC	R1
	LJE		/LOAD THE JEA REGISTER.
	R1
	JMP	CXSUC	/EXIT CAL SERVICE ROUTINE.
  .TITLE *** 'RAISE BOUND' DIRECTIVE
/
/ THE RAISE BOUND DIRECTIVE INSTRUCTS THE SYSTEM TO RAISE THE
/ MEMORY PROTECT BOUND (IF NORMAL MODE) AS FAR AS POSSIBLE
/ (EITHER TO PARTITION TOP, OR BELOW THE LOWEST I/O
/ BUFFER), AND TO RETURN THE HIGHEST USABLE ADDRESS IN THE
/ REQUESTOR'S EVENT VARIABLE.  (IF IN NORMAL MODE, THE ADDRESS
/ RETURNED IS RELATIVE TO THE PARTITION BASE.)
/
/ A TWO WORD CPB OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0)  FUNCTION CODE (27)
/		(1)  EVENT VARIABLE ADDRESS
/
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/	+N -- THE HIGHEST USABLE TASK ADDRESS (RELATIVE
/	      TO THE PARTITION BASE, IF NORMAL MODE)
/	-203 -- CAL NOT TASK-ISSUED
/
/ ENTRY FROM CAL DISPATCH WITH CPB ADDRESS IN XR & X10
/
RB.	LAW	-2	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/SET REQUESTOR'S EVENT VARIABLE TO -203
	SZA		/IF CAL WAS NOT TASK ISSUED.
	JMP	CX203
/
	LAC	CURTSK	/SET XR TO ADDRESS OF CURRENT TASK'S ATL NODE.
	PAX
/
/  START OF EDIT #157
/
	LAC	A.PB,X	/ADDRESS OF PARTITION BLOCK NODE
	PAL		/SAVE FOR LATER USE
	LAC	A.RA,X	/SET LINK FROM RESUMPTION ADDRESS TO INDICATE
	RTL		/EXEC OR NORMAL MODE TASK
	SMA!CLL!CLA!CMA	/SKIP IF NORMAL;CLEAR LLINK TO SHOW EXEC.
	JMP	RB.EX	/-1 SO AND,DAC WORKS LIKE LAC,DAC
	LAC	A.SN,X	/GET POINTER TO SYSTEM TASK SIZE
	PAX
	LAC	S.TS,X	/WHICH CONTAINS XVM FLAG IN LOW BITS
	AND	(140	/XVM BITS
	SZA!CLL!CML	/SKIP IF NOT XVM, LINK=1 FOR XVM JMP
	JMP	RB.XV	/XVM JUST AND OFF LOW BITS VIRT. ADDR.
	PLX		/XR POINT TO PARTITION BLOCK NODE
	LAC	(700000	/NON-XVM, LIMIT RAISE BOUND TO 32K!!!!
	TAD	P.VS,X	/CARRIES LINK TO 0 IF >=32K
	LAC	(100000	/32K DEFAULT IN CASE PARTITION TOO BIG
	SNL!CLL!CML	/SKIP IF SIZE OK, LINK=1 FOR NORM MODE
	JMP	RB.SZ	/SIZE TOO BIG, FORCE TO 32K
RB.XV	777400		/MASK TO FORCE TO 400 OCTAL BOUNDARY
RB.EX	PLX		/POINT XR TO PARTITION BLOCK NODE
	AND	P.VS,X	/MASK VIRTUAL SIZE TO PARTITION SIZE
RB.SZ	DAC	P.TS,X	/IN PLACE, LEAVING AC WITH SIZE; LINK
/			/0 IF EXEC MODE, 1 IF NORMAL. END OF #157
	SNL		/SKIP IF NORMAL MODE TASK.
	TAD	P.BA,X	/ADD PARTITION'S BASE ADDRESS.
	AAC	-1	/SIZE-1 = HIGHEST TASK ADDRESS.
/
	JMP	CXDAC
 .TITLE *** 'RASP-15' SPECIAL DIRECTIVE
/
/ THE RASP CAL ALLOWS VARIOUS USER TASKS TO ASK THE RASP SHARIBLE
/ LIBRARY MODULE (UFG) TO PROVIDE SERVICE.
/ 
/ THE CPB FOR THE CAL IS:
/ 
/	30	/CAL CODE 30
/	EVA	/EVENT VARIABLE ADDRESS
/ CODW	0	/FUNCTION CODE*512+NO. OF ARG.
/ ARG	0	/CONTAINS ADDR. OF LIST OF ARGS. IN .DA
/	0	/TEMP WORK
/	0	/AREA USED 
/	0	/BY UFG
/	0
/	0
/	0
/ 
/ THE EXEC CONTAINS TWO SIGNIFICANT INDICATORS.
/ GRSDFL WILL BE 0 IF RASP IS NOT RUNNING, HENCE THE RASP CAL IS ILLEGAL.
/ GRQPTR IS A POINTER TO A STACK OF 2 WORD ENTRIES IN UFG. EACH RASP
/ CAL PUTS TWO WORDS ON THIS LIST. THE END OF THE LIST IS DENOTED BY
/ A ZERO. IF EITHER CASE IS TRUE AN EV OF -103 IS RETURNED.
/ 
/ RASP PUTS CURTSK AND X10 ON THE RPLQ, THEN IT DECLARES A SIGNIFICANT
/ EVENT AND EXITS WITH A ZERO EV.
/ 
RASP.1	LAW	-12		/CHECK RANGE OF CPB
	JMS	CPBRX
	LAC	GRSDFL		/TEST FOR RASP RUNNING AND QUEUE NOT FULL
	SZA
	LAC*	GRQPTR
	SNA
	JMP	CX103		/RASP NOT RUNNING OR RPLQ OVERFLOW
	LAC	CURTSK		/PUT CURTSK AND X10 IN TABLE
	DAC*	GRQPTR
	IDX	GRQPTR
	LAC	X10
	DAC*	GRQPTR
	IDX	GRQPTR
	IDX	GRQFLG		/SET FLAG FOR UFG
	.SET6			/DECLARE A SIGN. EVENT
	JMP	CXPND		/ZERO EV AND RETURN
 .TITLE *** 'TRANSFER COMMAND' RESTRICTED DIRECTIVE
/
/ THE TRANSFER COMMAND DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER
/ A LINE OF COMMAND INPUT FROM THE TDV DISPATCH ROUTINE'S LINE BUFFER
/ 'TDVLB' TO A TDV FUNCTION TASK'S BUFFER, AND SET 'TDVEV2' TO INDICATE
/ THAT THE TDV LINE BUFFER IS AVAILABLE.  THIS DIRECTIVE IS RESTRICTED
/ TO ONE ISSUANCE PER REQUESTED TDV FUNCTION TASK, AND ONLY TO THE TDV
/ FUNCTION TASK LAST REQUESTED.
/
/ A FOUR WORD CPB OF THE FOLLOWING FORMAT IS USED:
/
/	CPB	(0) FUNCTION CODE (37)
/		(1) EVENT VARIABLE ADDRESS
/		(2) TDV TASK BUFFER ADDRESS
/		(3) TDV TASK BUFFER SIZE
/
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/   +1 -- ALTMODE TERMINATED COMMAND STRING TRANSFERRED
/   +2 -- CAR RTN TERMINATED COMMAND STRING TRANSFERRED
/  -77 -- VIOLATION OF RESTRICTIVE USE
/  -16 -- BUFFER IN TDV FUNCTION TASK TOO SMALL
/ -203 -- DIRECTIVE NOT TASK ISSUED
/
/ ENTER FROM CAL DISPATCH WITH CPB ADDRESS IN XR & X10
/
TC.	LAW	-4	/CHECK RANGE OF CPB (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAC	X11	/SET REQUESTOR'S EVENT VARIABLE TO -203
	SZA		/IF CAL WAS NOT TASK ISSUED.
	JMP	CX203
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ IS THIS TASK FROM MULTIACCESS?	/(161)
	SNA!CLL		/ AC >< 0 IF YES.			/(161)
	.ENDC							/(161)
	.IFDEF NOMAC						/(161)
	LAC	TDVCTF	/IF REQUESTOR IS NOT THE "CURRENT TDV FUNCTION"
	SAD	CURTSK	/OR IF THE "CURRENT TDV FUNCTION" HAS ALREADY 
	SKP		/RECEIVED ITS COMMAND LINE, SET THE REQUESTOR'S
	.ENDC							/(161)
	JMP	CX077	/EVENT VARIABLE TO -77
/
	.IFUND NOMAC						/(161)
	AAC -1		/ DECREMENT FOR RANGE 0 TO N-1		/(161)
	MUL		/ CALCULATE THE NUMBER OF WORDS IN	/(161)
	UC.LEN		/ UCA TO THE CURRENT UCA.		/(161)
	LACQ		/ FETCH RESULT FROM MQ.			/(161)
	TAD MA.UCA	/ ADD IN BASE OF UCA AREA.		/(172)
	AAC UC.TB-1	/ SET UP X15 AND X16 FOR ACCESS TO BUFF	/(161)
	DAC X15		/					/(161)
	DAC X16		/					/(161)
	LAC* X16	/ FETCH WORD FROM BUFFER.		/(161)
	.ENDC							/(161)
	.IFDEF NOMAC						/(161)
	LAC	TDVLB+0	/SETUP X17 AS A 2'S COMPL LOOP COUNTER TO MOVE
	.ENDC							/(161)
	SWHA		/LINE TO FUNCTION TASK BUFFER. 
	RAL
	AND	(776)
	TCA
	DAC	X17
	TAD	3,X	/IS BUFFER LARGE ENOUGH?
	SMA
	JMP	TC.2	/YES -- CHECK RANGE OF BUFFER
	LAW	-16	/NO -- SET REQUESTOR'S EVENT VARIABLE TO -16
	DAC	TC.EV
	JMP	TC.3
/
TC.2	LAC	2,X	/CHECK BEGINNING OF FUNCTION TASK BUFFER (NORMAL
	JMS	CACAJ	/MODE), ADJUST TO 17-BIT ADDRESS, AND SETUP X16 AS 
	AAC	-1	/DESTINATION INDEX TO MOVE LINE.
	DAC	X16
/
	LAW	-1	/CHECK END OF BUFFER
	TAD	2,X
	TAD	3,X
	JMS	CACAJ
/
	.IFDEF NOMAC						/(161)
	LAC	(TDVLB-1) /SETUP X15 AS SOURCE INDEX FOR MOVE
	DAC	X15
	.ENDC							/(161)
/
	LAC*	X15
	DAC*	X16
	ISZ	X17
	JMP	.-3
	.IFUND NOMAC						/(161)
	CLA!IAC		/ SET REQUESTERS EV TO 1.		/(161)
	DAC TC.EV	/ UPON EXIT.				/(161)
	.ENDC							/(161)
/
	.IFUND NOMAC						/(161)
TC.3	.SET6		/ DECLARE A SIGNIFICANT EVENT.		/(161)
	.ENDC							/(161)
	.IFDEF NOMAC						/(161)
TC.3	DZM	TDVCTF	/CLEAR 'CURRENT TDV FUNCTION'
	ISZ	TDVEV2	/SET 'LINE MOVED' EVENT VARIABLE, AND DECLARE A
	.SET6		/SIGNIFICANT EVENT.
	.ENDC							/(161)
	LAC	TC.EV	/SET REQUESTOR'S EVENT VARIABLE PER 'TC.EV'
	JMP	CXDAC	/AND EXIT CAL SERVICE.
/
TC.EV	0		/EVENT VARIABLE TO BE RETURNED.  NORMALLY SET TO +1 OR +2
			/BY THE TDV DISPATCH TASK "TDV..." (+1 IF COMMAND STRING
			/IS ALTMODE TERMINATED, OR +2 IF CARRIAGE RETURN TERMINATED).
	.TITLE *** 'SPY' DIRECTIVE
/ 
/ THE 'SPY' DIRECTIVE ALLOWS A NORMAL MODE TASK TO EXAMINE CORE
/ MEMORY ANYWHERE.
/ 
/ A FOUR WORD CPB OF THE FOLLOWING FORMAT IS USED:
/ 	CPB	(0) FUNCTION CODE (31)
/		(1) EVENT VARIABLE ADDRESS
/		(2) ABSOLUTE ADDRESS OF WORD TO BE EXAMINED
/ 		(3) VALUE OF WORD ON ERROR FREE RETURN
/ 
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/ 
/   +1 -- OPERATION COMPLETED SUCCESSFULLY
/ -104 -- PARAMETER ERROR
/ -203 -- DIRECTIVE NOT TASK ISSUED
/ 
/ ENTER FROM CAL DISPATCH WITH CPB ADDRESS IN XR AND X10
/ 
SPY.	JMS	SPY.A	/CHECK FOR LEGALITY IN SPY AND SPYSET S.R.
	LAC	2,X	/IS THE ADDRESS POSITIVE?
	SPA
	JMP	CX104	/NO -- CONTROL TABLE ERROR
	TCA		/YES -- IS THE ADDRESS WITHIN CORE BOUNDS?
	TAD	CSIZE
	SPA
	JMP	CX104	/NO -- CONTROL TABLE ERROR
	LAC	2,X	/YES -- GET THE VALUE
	PAX
	LAC	0,X
	PAL		/SAVE THE VALUE IN LR TEMPORARILY
SPY.B	LAC	SPY.1	/RESTORE THE XR
	PAX
	PLA		/PUT VALUE INTO CPB
	DAC	3,X
	JMP	CXSUC	/RETURN EV +1
	.TITLE *** 'SPYSET' DIRECTIVE
/ 
/ THE 'SPYSET' DIRECTIVE ALLOWS NORMAL MODE TASKS TO MODIFY CORE
/ WITHIN THE BOUNDS SPECIFIED BY SPY1 AND SPY2.
/ 
/ A FOUR WORD CPB OF THE FOLLOWING FORM IS USED:
/ 
/ 	CPB	(0) FUNCTION CODE (32)
/		(1) EVENT VARIABLE
/		(2) ADDRESS RELATIVE TO SPY1
/		(3) VALUE TO BE DEPOSITTED
/ 
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/ 
/   +1 -- OPERATION COMPLETED SUCCESSFULLY
/  -77 -- VIOLATION OF RESTRICTIVE USEAGE OF DIRECTIVE
/         (SPY AREA ILL DEFINED)
/ -104 -- CONTROL TABLE ERROR
/ -203 -- DIRECTIVE NOT TASK ISSUED
/ 
/ ENTER FROM CAL DISPATCH WITH CPB ADDRESS IN XR AND X10
/
SPYST.	JMS	SPY.A	/CHECK LEGALITY IN SPY AND SPYSET S.R.
	LAC	SPY1	/CHECK THE DEFINITION OF THE SPY AREA
	SPA
	JMP	CX077
	TCA
	DAC	SPY.A
	LAC	SPY2	/CHECK THAT THE SPY AREA IS DEFINED
	SNA!SPA
	JMP	CX077	/IT'S NOT -- ERROR
	TAD	SPY.A
	SPA
	JMP	CX077
	LAC	3,X	/SAVE THE VALUE TO BE DEPOSITTED
	PAL
	LAC	2,X	/GET THE REAL ADDRESS
	SPA
	JMP	CX104	/ERROR IF RELATIVE ADDRESS IS NEGATIVE
	TAD	SPY1
	LMQ		/SAVE THE ABSOLUTE ADDRESS
	TCA
	TAD	SPY2	/ADDRESS MUST BE <=SPY2
	SPA
	JMP	CX104	/IT'S NOT -- ERROR
	LACQ		/GET THE ADDRESS BACK
	PAX		/DEPOSIT THE VALUE
	PLA
	DAC	0,X
	JMP	SPY.B	/RESTORE XR AND RETURN EV +1
/ 
/ SPY.A IS A SUBROUTINE USED IN SPY AND SPYSET.
/ THE RANGE OF THE CPB IS CHECKED AND THE XR IS
/ SAVED IN SPY.1, ALSO, CHECK THAT THE DIRECTIVE
/ WAS ISSUED BY A TASK.
/ RETURN IS AT JMS+1 IF NO ERROR IS DETECTED.
/ 
SPY.A	0
	LAW	-4	/CHECK THE RANGE OF THE CPB (NORMAL MODE)
	JMS	CPBRX
	LAC	X11	/WAS THE CAL TASK ISSUED?
	SZA
	JMP	CX203	/NO -- ERROR
	PXA		/SAVE THE XR IN SPY.1
	DAC	SPY.1
	JMP*	SPY.A
SPY.1	0		/TEMP STORAGE FOR XR DURING SPY AND SPYSET
 
 
 
	.IFUND L.ALL
	.NOLST
	.ENDC
	.IFUND NOMAC
	.IFDEF L.DIR
	.LST
	.ENDC
	.TITLE *** 'QUEUE JOB' DIRECTIVE (MULTIACCESS VARIATION)
 
 
 
 
/
/ REWRITTEN FOR MULTIACCESS, 6-MAY-76 BY ED GARDNER
/ 
/ THE QUEUE JOB DIRECTIVE PERMITS TASKS TO SUBMIT JOBS FOR
/ BATCH PROCESSING WHETHER OR NOT THE BATCH HANDLER IS
/ IN CORE. THIS DIRECTIVE ADDS A NODE TO THE JOB QUEUE WHICH
/ CONTAINS APPROPRIATE FIELDS FROM THE CPB PLUS OTHER
/ PERTINENT INFORMATION.
/ 
/ AN NINE WORD CPB OF THE FOLLOWING FORMAT IS USED:
/ 
/	(0)  FUNCTION CODE (33)
/	(1)  EVENT VARIABLE ADDRESS
/	(2)  FILE	( FILE NAME OF INPUT FILE )
/	(3)  NAME	( CONTAINING THE BATCH COMMANDS )
/	(4)  LUNS	( CMD INPUT LUN / LST OUTPUT LUN )
/	(5)  JOB INFO	( FLAGS AND TIME ESTIMATE )
/	(6)  JOB INFO	( CLASS AND MEMORY SIZE )
/	(7)  LOGIN DEVICE AND UNIT
/	(10) LOGIN UFD
/
/ THE NODE INSERTED IN THE JOB QUEUE IS ACTUALLY COMPOSED OF
/ TWO SMALL NODES.  THE PRIMARY NODE IS THREADED INTO THE JOB
/ QUEUE PROPER, AND POINTS TO THE SECONDARY NODE.  THE FORMAT
/ OF THE PRIMARY NODE IS AS FOLLOWS:
/
/	(0)  FORWARD LINK
/	(1)  BACKWARD LINK
/	(2)  FILE	( COPIED FROM CPB WORD 2 )
/	(3)  NAME	( COPIED FROM CPB WORD 3 )
/	(4)  ADDRESS OF SECONDARY NODE
/	(5)  JOB ID OR SEQUENCE NUMBER
/	(6)  JOB INFO	( COPIED FROM CPB WORD 5 )
/	(7)  JOB INFO	( COPIED FROM CPB WORD 6 )
/	(10) DATE WHEN JOB WAS SUBMITTED (FORMAT BELOW)
/	(11) SSM (SECONDS-SINCE-MIDNIGHT) WHEN JOB WAS SUBMITTED
/
/ THE FORMAT OF THE SECONDARY JOB QUEUE NODE IS AS FOLLOWS:
/
/	(0)  COMMAND INPUT DEVICE AND UNIT
/	(1)  COMMAND INPUT UFD
/	(2)  LISTING OUTPUT DEVICE AND UNIT
/	(3)  LISTING OUTPUT UFD
/	(4)  LOGIN DEVICE AND UNIT	( COPIED FROM CPB WORD 7 )
/	(5)  LOGIN UFD			( COPIED FFROM CPB WORD 10 )
/	(6)  UNUSED
/	(7)  UNUSED
/	(10) UNUSED
/	(11) UNUSED
/
/ THE FORMAT OF THE DATE (PRIMARY NODE, WORD 10) IS AS FOLLOWS:
/
/	YEAR (ZERO=1900)	BITS 0 - 8  (9 BITS)		/(210)
/	MONTH			BITS 9 - 12  (4 BITS)
/	DAY			BITS 13 - 17  (5 BITS)
/
/ THE NUMERICAL ENCODINGS OF YEAR, MONTH, AND DAY ARE IDENTICAL
/ TO THAT USED IN SCOM LOCATIONS YR, MO, AND DA.
/
/ THE DEVICE AND UNIT ARE ENCODED INTO A SINGLE WORD AS FOLLOWS.
/ THE TWO LETTER DEVICE NAME IS .SIXBT ENCODED INTO BITS 0 - 11.
/ THE UNIT NUMBER, WHOSE RANGE IS 0 TO 77 (OCTAL), IS IN BITS
/ 12 TO 17 (BINARY REPRESENTATION).  THE UFD IS ENCODED AS THREE
/ .SIXBT CHARACTERS, WHICH IS THE STANDARD REPRESENTATION.  IF
/ THE DEVICE FIELD OF THE DEVICE/UNIT WORD IS ZERO, THE DEVICE,
/ UNIT, AND UFD WORDS ARE IGNORED AND THE DEFAULT (WHATEVER THAT
/ MAY BE) IS USED.  NOTE THAT THE UFD WORD IS IGNORED.  IF THE
/ DEVICE IS PRESENT, BUT THE UFD WORD IS ZERO, THE DEFAULT UFD
/ WILL BE USED.
/
/ THE TWO JOB INFO WORDS ARE MERELY COPIED FROM THE CPB TO
/ THE JOB NODE.  THEIR MEANING IS DETERMINED BY THE OTHER
/ COMPONENTS OF BATCH.  SEE THE BATCH HANDLER AND THE QUEUE
/ TDV FUNCTION FOR MORE INFORMATION.
/
/ JOB'S ARE SEQUENTIALLY NUMBERED ON ANY GIVEN DAY, AND THIS
/ SEQUENCE NUMBER USED FOR THE JOB ID.  THE FIRST JOB QUEUED
/ ON ANY GIVEN DATE IS ASSIGNED JOB ID 1.  SUBSEQUENT JOBS
/ ARE ASSIGNED SEQUENTIAL NUMBERS.  WHENEVER THE DATE CHANGES,
/ THE JOB ID IS RESET TO 1.  THUS, THE JOB ID IS ONLY UNIQUE
/ WHEN USED IN CONJUNCTION WITH THE DATE OF SUBMITTAL.
/
/ THE MAXIMUM SIZE OF THE JOB QUEUE IS SPECIFIED BY THE
/ ASSEMBLY PARAMETER QJBLMT.  IF THAT NUMBER OF JOBS IS
/ ALREADY QUEUED, THIS DIRECTIVE WILL RETURN AN ERROR.
/ NOTE THAT IF QJBLMT IS NEGATIVE OR ZERO, NO JOBS MAY
/ BE QUEUED; THUS, THIS DIRECTIVE WILL NOT BE ASSEMBLED.
/
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/   >0 -- JOB SUCCESSFULLY QUEUED. EV VALUE IS JOB ID
/		OR SEQUENCE NUMBER.
/ -101 -- LUN OUT OF RANGE
/ -102 -- LUN NOT ASSIGNED
/ -105 -- DEVICE UNIT NUMBER OUT OF RANGE ( > 77 )
/ -106 -- JOB QUEUE OVERFLOW (TOO MANY JOBS QUEUED)
/ -777 -- POOL EMPTY
/
/ ENTER FROM CAL DISPATCH WITH THE XR AND X10 POINTING TO CPB
/
 
 
	.IFNOZ QJBLMT		/ IF NO JOBS MAY BE QUEUED,
 
QJOB.	LAW -11			/ VERIFY RANGE OR CPB,
	JMS CPBRX		/ GET EV ADDRESS, AND
	JMP CX106		/ GIVE ERROR UNCONDITIONALLY.
 
	.ENDC
 
 
 
	.IFPNZ QJBLMT
 
QJOB.	LAW -11			/ VERIFY RANGE OF CPB AND
	JMS CPBRX		/ SET X14 TO EV ADDRESS.
/
	LAC (R3-1)		/ SET UP POINTER TO R3,R4,R5,R6
	DAC X12			/ TO STORE DEVICES, UNITS, & UFDS.
/
	DZM R6			/ DEFAULT LST DEVICE = ZERO
/
	LAC 4,X			/ PICK UP LUN WORD.
	DAC X13			/ SAVE FOR LATER.
	SWHA			/ GET INPUT LUN IN POSITION.
/
QJOB.A	JMS MAPLUN		/ MAP AND RANGE CHECK LUN.
				/ LEAVES LUN IN AC, XR, X16.
/
	LACIX (LUNUFD-1)	/ PICK UP LUN'S UFD AND
	DAC* X12		/ SAVE IT IN R3 OR R5.
/
	LACIX (LUT-1)		/ PICK UP PDVL NODE ADDR.
	SNA			/ VERIFY LUN IS ASSIGNED.
	JMP CX102		/ JMP IF LUN NOT ASSIGNED.
	PAX			/ POINT XR TO PDVL NODE.
/
	LAW 777700		/ VERIFY DEVICE UNIT IS IN
	AND D.UN,X		/ RANGE -- I.E. THAT IT WILL
	SZA			/ FIT IN 6 BITS.
	JMP CX105		/ JMP IF UNIT OUT OF RANGE.
/
	LAW 777700		/ MASK OUT TWO LETTER DEVICE
	AND D.N1,X		/ NAME,
	XOR D.UN,X		/ AND MERGE IN UNIT NUMBER.
	DAC* X12		/ SAVE IN R4 OR R6.
/
	LAC X13			/ PICK UP SAVED LUN WORD.
	AND (777)		/ MASK OUT LST OUTPUT LUN.
	DZM X13			/ ZERO LUN FOR NEXT TIME.
	SZA			/ IF LUN IS ZERO, USE DEFAULT.
	JMP QJOB.A		/ JMP IF NOT DEFAULT LST LUN.
/
	LAC MAXJOB		/ FETCH MAXIMUM NUMBER OF	/(206)
	SNA!TCA			/ JOBS ALLOWABLE IN THE BATCH	/(206)
	JMP CX106		/ JOB QUE. IF ANY.		/(206)
				/ JOB LIMIT IS IN AC, PREPARE	/(206)
				/ TO SCAN THE JOB QUEUE		/(206)
	DAC X13			/ TO ENSURE LIMIT ISN'T
	LAC JOB1		/ EXCEEDED.
/
QJOB.B	SAD (JOB1)		/ REACHED END OF JOB QUEUE YET?
	JMP QJOB.C		/ JMP IF YES -- LIMIT NOT REACHED
	PAX			/ SCAN TO NEXT ENTRY IN QUEUE.
	LAC 0,X
	ISZ X13			/ COUNT # OF ENTRIES.
	JMP QJOB.B		/ JMP IF LIMIT NOT REACHED YET.
	JMP CX106		/ JMP IF LIMIT REACHED -- RETURN
				/ ERROR.
 
 
QJOB.C	JMS PENP		/ FETCH SECONDARY JOB QUEUE NODE.
	JMP CX777		/ JMP IF NONE AVAILABLE.
	AAC -1			/ SET UP X12 TO FILL IT.
	DAC X12
/
	LAC R4			/ FILL FIRST WORD OF SEC. NODE,
	DAC* X12		/ SO THAT X12 WILL CONTAIN
				/ NODE ADDRESS.
/
	JMS PENP		/ FETCH PRIMARY JOB QUEUE NODE.
	JMP QJOB.E		/ JMP IF NONE AVAILABLE.
	PAX			/ POINT XR TO PRI. NODE.
/
	ISZ X10			/ USE X10 TO FETCH CPB.
/
	LAC* X10		/ COPY FILE NAME TO PRI. NODE.
	DAC 2,X
	LAC* X10
	DAC 3,X
/
	ISZ X10			/ BUMP PAST LUN WORD.
/
	LAC* X10		/ COPY JOB INFO WORDS TO PRI. NODE.
	DAC 6,X
	LAC* X10
	DAC 7,X
/
	LAC X12			/ PUT SECONDARY NODE POINTER
	DAC 4,X			/ INTO PRIMARY NODE.
/
	LAC R3			/ COPY INPUT UFD INTO SEC. NODE.
	DAC* X12		/ (DEVICE & UNIT ALREADY THERE)
/
	LAC R6			/ COPY LISTING DEVICE, UNIT, AND UFD
	DAC* X12		/ INTO SECONDARY NODE.
	LAC R5
	DAC* X12
/
	LAC* X10		/ COPY LOGIN DEVICE, UNIT, AND UFD
	DAC* X12		/ INTO SECONDARY NODE.
	LAC* X10
	DAC* X12
/
	DZM* X12		/ ZERO UNUSED WORDS IN SEC. NODE.
	DZM* X12
	DZM* X12
	DZM* X12
/
	.INH			/// INHIBIT INTERRUPTS, SO TIME
				/// DOESN'T CHANGE WHILE WE'RE
				/// LOOKING AT IT.
/				///
	LAC SSM			/// STORE SSM INTO PRIMARY NODE.
	DAC 11,X		///
/				///
	LAC YR			/// CALCULATE TODAY'S DATE IN FORM
	CLL!RTL			/// YYMMDD.  YY IS YEAR IN
	RTL			/// NINE BITS, MM IS MONTH
	XOR MO			/// IN FOUR BITS, AND DD IS
	RTL			/// DAY IN 5 BITS.
	RTL			///
	RAL			///
	XOR DA			///
/				///
	DAC 10,X		/// SAVE DATE IN PRIMARY NODE.
/
	SAD QJOB.0		/// HAS DATE CHANGED SINCE LAST
	SKP			/// JOB WAS QUEUED?
	DZM QJOB.1		/// YES -- ZERO SEQUENCE #.
/				///
	DAC QJOB.0		/// UPDATE DATE LAST JOB WAS
				/// QUEUED.
/				///
	LAC QJOB.1		/// INCREMENT JOB SEQUENCE NO.
	ADD (400001)		/// WRAP AROUND FROM 377777 TO 1.
	AND (377777)		/// ENSURE ITS POSITIVE.
	.ENB			///
	DAC QJOB.1		/// AND UPDATE PERM. VALUE.
/
	DAC 5,X			/ STORE SEQ. NUMBER IN NODE
	DAC X10			/ ALSO SAVE FOR EV. VALUE.
/
	LAC (JOB1)		/ ENTER JOB INTO JOB QUEUE.
	DAC R1
	JMS NADD
/
	LAC X10			/ PICK UP JOB ID,
	JMP CXDAC		/ AND RETURN IT AS EV VALUE.
 
 
/ COME HERE IF WE CANNOT ALLOCATE A PRIMARY JOB QUEUE NODE.
/ WE RETURN THE SECONDARY NODE TO THE FREE POOL, THEN
/ RETURN AN EV VALUE OF -777.
 
QJOB.E	LAC X12			/ COPY SEC. NODE ADDR. TO R2.
	DAC R2
	LAC (POOL)		/ AND POINT R1 TO FREE POOL
	DAC R1			/ LISTHEAD.
	JMS NADD		/ RETURN NODE TO FREE POOL.
	JMP CX777		/ RETURN WITH ERROR -777.
 
 
 
QJOB.0	0			/ DATE LAST JOB WAS SUBMITTED.
				/ FORMAT IDENTICAL TO DATE STORED
				/ IN PRIMARY JOB QUEUE NODE, WORD
				/ 10.  DETAILED DESCRIPTION GIVEN
				/ ABOVE IN MODULE PREFACE.
 
QJOB.1	0			/ JOB ID OR SEQUENCE NUMBER FOR
				/ THE CURRENT DATE.
				/ SEE DISCUSSION IN MODULE PREFACE
				/ FOR DETAILS OF JUST WHAT THIS IS.
 
	.ENDC
 
 
	.IFUND L.ALL
	.NOLST
	.ENDC
	.ENDC
	.IFDEF NOMAC
	.IFDEF L.DIR
	.LST
	.ENDC
	.TITLE *** 'QUEUE JOB' DIRECTIVE (NON-MULTIACCESS VAR.)
/ 
/ THE QUEUE JOB DIRECTIVE PERMITS TASKS TO SUBMIT JOBS FOR
/ BATCH PROCESSING WHETHER OR NOT THE BATCH HANDLER IS
/ IN CORE. THIS DIRECTIVE ADDS A NODE TO THE JOB DEQUE WHICH
/ CONTAINS WORDS TWO THROUGH SEVEN OF THE CPB AS WELL AS
/ THE TIME IN SECONDS SINCE MIDNITE AND TASK PRIORITY
/ WHICH ISSUED THE DIRECTIVE.
/ 
/ AN EIGHT WORD CPB OF THE FOLLOWING FORMAT IS USED:
/ 
/	CPB	(0) FUNCTION CODE (33)
/		(1) EVENT VARIABLE
/		(2) FIL (INPUT FILE OF
/		(3) NAM BATCH COMMANDS)
/		(4) LUNS (INPUT LUN/OUTPUT LUN)
/ 		(5) JOB INFO (JOB CLASS/JOB TIME)
/		(6) SPECIAL WORD 1
/		(7) SPECIAL WORD 2
/
/ THE NODE INSERTED IN THE JOB DEQUE HAS THE FOLLOWING FORM:
/ 
/		(0) FORWARD LINK
/		(1) BACKWARD LINK
/		(2) FIL
/		(3) NAM
/		(4) PRIORITY OF TASK ISSUING DIRECTIVE
/			[TO BE CHANGED IN FUTURE]
/		(5) LUNS
/		(6) JOB INFO
/		(7) SPECIAL WORD 1
/		(10) SPECIAL WORD 2
/		(11) TIME IN SECONDS SINCE MIDNITE
/ 
/ IF AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/   +N -- OPERATION SUCCESSFULLY COMPLETED (N IS SSM)
/ -203 -- DIRECTIVE NOT TASK ISSUED
/ -777 -- POOL EMPTY
/
/ ENTER FROM CAL DISPATCH WITH THE XR AND X10 POINTING TO CPB
/
QJOB.	LAW	-10	/CHECK THE RANGE OF THE CPB (NORMAL MODE)
	JMS	CPBRX
	LAC	X11	/WAS THE DIRECTIVE TASK ISSUED?
	SZA
	JMP	CX203	/NO -- ERROR
	PXA		/SAVE THE XR
	DAC	QJOB.1
	LAC	CURTSK	/GET THE ISSUING TASK'S PRIORITY
	PAX
	LAC	4,X
	LMQ		/SAVE PRIO.
	JMS	PENP	/GET A NODE FROM THE POOL
	JMP	CX777	/POOL EMPTY -- ERROR
	IAC		/INIT. X13 SO IT ACCESSES NODE
	DAC	X13
	LAC	QJOB.1	/RESTORE THE XR
	PAX
	LAC	2,X	/FIL
	DAC*	X13
	LAC	3,X	/NAM
	DAC*	X13
	LACQ		/PRIO.
	DAC*	X13
	LAC	4,X	/LUNS
	DAC*	X13
	LAC	5,X	/JOB INFO
	DAC*	X13
	LAC	6,X	/SPECIAL 1
	DAC*	X13
	LAC	7,X	/SPECIAL 2
	DAC*	X13
	LAC	SSM	/SECONDS SINCE MIDNITE.
	DAC*	X13
	DAC	QJOB.1
	LAC	(JOB1	/INSERT NODE
	DAC	R1
	JMS	NADD
	LAC	QJOB.1
	JMP	CXDAC	/RETURN EV OF +SSM
QJOB.1	0
 
 
 
	.IFUND L.ALL
	.NOLST
	.ENDC
	.ENDC
	.IFDEF L.DIR
	.LST
	.ENDC
	.TITLE *** 'EXECUTE' DIRECTIVE
/
/ THIS DIRECTIVE ALLOWS USERS TO STORE INFREQUENTLY USED TASK
/ IMAGES ON A USER DISK IN A CREATED FILE. THIS DIRECTIVE DIFFERS
/ FROM REQUEST IN THAT THE TASK NAMED IN THE CPB IS NOT REQUESTED
/ AT THE DIRECTIVE LEVEL. INSTEAD A NODE WITH MOST OF THE CPB
/ IS INSERTED INTO THE EXECUTE DEQUE AND A TASK CALLED 'FININS'
/ IS REQUESTED. FININS THEN FINISHES THE INSTALLATION AND
/ REQUESTS THE TASK. THE EV RETURNED TO THE TASK ISSUING
/ THIS DIRECTIVE INDICATES ONLY IF FININS CAN RUN. NO EV
/ IS RETURNED WHEN THE TASK NAMED IN THE CPB IS REQUESTED.
/ 
/ THE FORMAT FOR THE CPB IS AS FOLLOWS:
/ 
/	CPB	(0) FUNCTION CODE (34)
/		(1) EVENT VARIABLE
/		(2) TASK NAME (FIRST HALF)
/		(3) TASK NAME (SECOND HALF)
/		(4) PRIORITY 
/		(5) LUN
/		(6) PARTITION NAME (FIRST HALF) OR 0
/		(7) PARTITON NAME (SECOND HALF) OR 0
/
/
/ THE POSSIBLE EVENT VARIABLE VALUES ARE THE SAME AS FOR THE 'REQUEST'
/ DIRECTIVE.
/ 
/ 
/
XE.	LAW	-10		/CHECK THE RANGE OF THE CPB (NORMAL MODE)
	JMS	CPBRX
	DZM	X12		/ZERO THE PRIORITY GIVEN IN CPB
/								/EAG:202
	PXL		/ SAVE THE XR SINCE MAPLUN CLOBBERS IT.	/(205)
	LAC 5,X			/ FETCH LUN, MAP IF APPRO.,	/EAG:202
	JMS MAPLUN		/ RANGE CHECK, AND SAVE IN X16.	/EAG:202
				/ (MAPLUN MODIFIES AC,XR,X16)	/EAG:202
/								/EAG:202
	PLX		/ RESTORE THE XR.			/(205)
	LAW 17000	/ AND SET THE DEFER AND ALIAS BITS INTO	/(206)
			/ X16.					/(205)
	AND 5,X		/ FETCH FUNCTION BITS.			/(205)
	XOR X16		/ SET UP REAL LUN PLUS MAGIC BITS.	/(205)
	DAC X16		/ SAVE FOR LOADING THE NODE A LITTLE	/(205)
			/ LATER.				/(205)
								/(205)
	RTL		/ SHIFT DEFER BIT INTO LINK.		/(200)
	CML		/ SET UP FOR !'ED CONDITION IN SKIP.	/(200)
/								/(203)
	LAC 6,X			/ FETCH POSSIBLE EV ADDRESS.	/(203)
	SZL!SNA			/ SKIP IF IS EV ADDRESS.	/(203)
	JMP XE.A		/ JMP IF NOT EV ADDRESS.	/(203)
	JMS CACAJ		/ ADJUST EV ADDRESS.		/(203)
	PAX			/ CLEAR THE EV.			/(203)
	DZM 0,X							/(203)
XE.A	DAC X15			/ AND SAVE WHATEVER IT IS.	/(203)
/								/(203)
	JMS	PENP		/GET A NODE FROM THE POOL
	JMP	CX777		/RETURN HERE IF POOL EMPTY
	IAC
	DAC	X13		/SET UP X13 TO PUT DATA INTO NODE
	LAC X10			/ POINT XR TO CPB.		/(203)
	PAX							/(203)
	LAC	2,X		/GET THE TASK NAME
	DAC*	X13
	LAC	3,X
	DAC*	X13
	LAC	4,X		/GET THE PRIORITY
	DAC*	X13
/								/EAG:202
	LAC X16			/ GET THE LUN			/EAG:202
	DAC* X13		/ STORE INTO NODE.		/EAG:202
/								/EAG:202
	LAC X15		/ FETCH ADJUSTED EVENT VARIABLE ADDRESS	/(200)
			/ OR FIRST HALF OF PARTITION NAME.	/(200)
	DAC*	X13
	LAC	7,X
	DAC*	X13
	LAC	10,X		/STORE THE SECONDARY TASK NAME
	DAC*	X13
	LAC	11,X
	DAC*	X13
	LAC	(EXECT		/SET UP X10 SO REQUEST THINKS THAT
	DAC	X10		/THE TASK IS 'FININS'
	LAC	(EXELH		/PREPARE TO INSERT THE NODE
	DAC	R1
	JMS	SPRI		/INSERT THE NODE BY PRIORITY
	JMP	RQ.1		/GO INTO THE REQUEST CODE.
	.TITLE *** 'SHARE' DIRECTIVE ***
/
/ THE SHARE DIRECTIVE INITIALIZES THE MM REGISTER FOR A USER MODE TASK SO
/ THAT IT CAN SHARE CORE VIA XVM MEMORY MAPPING HARDWARE. IT CAN ALSO BE
/ USED TO STOP MEMORY SHARING IF AN ESAS LENGHT OF ZERO IS SPECIFIED.
/ THIS DIRECTIVE HAS NO EFFECT ON EXECUTIVE MODE TASKS.
/
/ THE CPB FOR THIS DIRECTIVE IS:
/
/	CPB	(0)	35	/CAL CODE (35)
/		(1)	EVA	/EVENT VARIABLE ADDRESS
/		(2)	NAME1	/1ST HALF OF NAME OF MEMORY BLOCK
/		(3)	NAME2	/2ND HALF OF NAME OF MEMORY BLOCK
/		(4)	OFFSET	/OFFSET FROM BASE  OF MEMORY BLOCK
/		(5)	LENGTH	/LEGNTH OF ESAS (BITS 1-17)  AND ACCESS
/				/TYPE DESIRED (BIT 0, SET IF WRITES DESIRED)
/
/ IF  AN EVENT VARIABLE IS SPECIFIED, IT IS SET AS FOLLOWS:
/
/	+1 -- OPERATION COMPLETED SUCCESSFULLY
/	-32 -- MEMORY BLOCK NOT IN PBDL OR SCDL OR DOES NOT ALLOW SHARING
/	-77 -- ACCESS TYPE DESIRED NOT CONSISTANT WITH THAT PERMITTED
/	-104 -- CONTROL TABLE ERROR
/	-203 -- CAL NOT TASK ISSUED
/	-213 -- RECONFIGURATION IN PROGRESS
/
/ ENTER FROM CAL DISPATCH WITH CPB ADDRESS IN XR AND X10
/
	.IFUND	NOXM
SHR.	LAW	-6		/CHECK THE RANGE OF THE CPB (NORMAL MODE)
	JMS	CPBRX		/AND SET X14 TO POINT AT EV
	LAC	X11		/WAS THE CAL TASK ISSUED?
	SZA
	JMP	CX203		/NO -- SET EV TO -203
	LAC	5,X		/YES -- SET ACCESS TYPE BIT INTO LINK
	RAL
	PXL			/SAVE THE XR
/
/ SCAN THE LIST OF PARTITIONS FOR NAMED MEMORY BLOCK
/
	LAC	(PBDL		/SET R1 TO LISTHEAD OF PBDL
	DAC	R1
	LAC	X10		/SET R2 TO POINT AT NAME GIVEN
	AAC	2
	DAC	R2
	JMS	SNAM		/SCAN THE LIST
	SKP			/RETURN HERE IF NOT FOUND
	JMP	SHR.PF		/RETURN HERE IF FOUND
/
/ SCAN THE LIST OF SYSTEM COMMONS FOR NAMED BLOCK OF MEMORY
/
	LAC	(SCDL		/SET R1 TO LISTHEAD OF SCDL
	DAC	R1
	LAC	X10		/SET R2 TO POINT AT NAME GIVEN
	AAC	2
	DAC	R2
	JMS	SNAM		/SCAN THE LIST
	JMP	CX032		/RETURN HERE IF NOT FOUND -- SET EV TO -32
/
/ SYSTEM COMMON FOUND -- SAVE PARAMETERS
/
	PAX			/SET UP XR TO ACCESS NODE
	AAC	B.TC		/GET ADDR OF TASK USE COUNT
	DAC	SHR.TC
	LAC	B.BA,X		/GET BASE ADDR
	DAC	SHR.BA
	LAC	B.SZ,X		/GET SIZE
	DAC	SHR.SZ
	LAC	B.FW,X		/GET FLAGS
	JMP	SHR.F		/GO REJOIN PARTITION CODE
/
/ PARTITION FOUND -- SAVE PARAMETERS
/
SHR.PF	PAX			/SET UP XR TO ACCESS NODE
	AAC	P.TC		/GET ADDR OF TASK USE COUNT
	DAC	SHR.TC
	LAC	P.BA,X		/GET BASE ADDR
	DAC	SHR.BA
	LAC	P.SZ,X		/GET SIZE
	DAC	SHR.SZ
	LAC	P.FW,X		/GET FLAGS
/
/ SAVE FLAGS AND CHECK SPECIFIED SIZE OF ESAS
/
SHR.F	AND	(7		/KEEP ONLY RELEVANT FLAGS
	LMQ			/SAVE IN MQ
	PLX			/RESTORE XR TO POINT AT CPB
	LAC	5,X		/GET SIZE OF ESAS
	AND	(377777
	SNA			/IS IT ZERO?
	JMP	SHR.OF		/YES -- TURN OFF SHARING
	SAD	(400		/NO -- CHECK LEGALITY OF SIZE
	JMP	SHR.00
	SAD	(1400
	JMP	SHR.01
	SAD	(7400
	JMP	SHR.10
	SAD	(17400
	SKP
	JMP	CX104		/NOT LEGAL -- SET EV TO -104
/
/ IF SHARING IS TO BE ENABLED, SET UP MM REGISTER BITS TO INDICATE:
/ SIZE OF ESAS, SHARING ON, AND READ/WRITE PRIVILAGES (IF APPLICABLE)
/
SHR.11	LAC	(16000		/SET SHARE AND ESAS=17400
	SKP
SHR.10	LAC	(14000		/SET SHARE AND ESAS=7400
	SKP
SHR.01	LAC	(12000		/SET SHARE AND ESAS=1400
	SKP
SHR.00	LAC	(10000		/SET SHARE AND ESAS=400
	SNL			/DOES TASK WISH TO WRITE INTO ESAS?
	XOR	(20000		/NO -- SET WRITE PROTECT
	DAC	SHR.MM		/YES -- SAVE IMAGE OF MM REGISTER
/
/ IF SHARING IS TO BE ENABLED, CHECK THE DESIRED ACCESS TYPE (DAT) WITH THE
/ ALLOWED ACCESS TYPE (AAT)
/
	LACQ			/GET THE FLAGS SHOWING AAT
	AND	(4		/EXTRACT THE RCF IN PROGRESS BIT
	SZA			/IS THIS MEMORY BLOCK BEING RCF'D?
	JMP	CX213		/YES -- SET THE EV TO -213
	LACQ			/NO -- RESTORE THE FLAGS WORD
	SNA			/ANY SHARING ALLOWED?
	JMP	CX032		/NO -- SET EV TO -32
	SAD	(2		/YES -- IS RD/WT OK?
	JMP	SHR.OK		/YES -- PROCEED
	SZL			/NO -- DOES TASK WANT TO WRITE INTO ESAS?
	JMP	CX077		/YES -- SET EV TO -77
/
/ CHECK LEGALITY OF OFFSET AND SIZE OF ESAS AGAINST SIZE AND BASE OF BLOCK,
/ THEN SET UP THE SHARED ADDRESS PART OF THE MM REGISTER IMAGE
/
SHR.OK	LAW	-400		/IS OFFSET AN INTEGRAL MULTIPLE OF 400?
	AND	4,X
	SAD	4,X
	SKP
	JMP	CX104		/NO -- SET EV TO -104
	LAC	5,X		/YES -- DOES SIZE OF ESAS + OFFSET EXCEED
	AND	(377777		/THE SIZE OF THE MEMORY BLOCK?
	TAD	4,X
	TCA
	TAD	SHR.SZ
	SPA
	JMP	CX104		/YES -- SET EV TO -104
	LAW	-400		/NO -- CALCULATE THE SHARED ADDRESS
	TAD	SHR.BA		/SUBTRACT 400 (FOR ISAS) FROM BASE OF BLOCK
	TAD	4,X		/ADD OFFSET
	CLL!RAL			/SHIFT ADDRESS INTO POSITION
	SWHA
	XOR	SHR.MM		/XOR IN OTHER DATA
	DAC	SHR.MM		/SAVE THE IMAGE OF THE MM REGISTER
	JMP	SHR.LD		/GO LOAD THE REGISTER
/
/ SPECIAL CASE -- TURN OFF SHARING
/
SHR.OF	DZM	SHR.MM		/SET UP MM REG. IMAGE 
	DZM	SHR.TC		/ZERO TASK USE COUNT POINTER
/
/ LOAD MM REGISTER AND SAVE THE IMAGE IN THE PBDL NODE
/
SHR.LD	LAC	CURTSK		/ACCESS TASK'S ATL NODE
	PAX
	LAC	A.PB,X		/ACCESS TASK'S PBDL NODE
	PAX
	LAC	P.MM,X		/GET OLD MM REGISTER IMAGE
	AND	(740000		/SAVE REL. DIS., IOT PERMISSION AND XVM MODE
	XOR	SHR.MM		/XOR IN NEW SHARE DATA
	LDMM			/LOAD THE REGISTER
	DAC	P.MM,X		/SAVE REGISTER IMAGE IN THE TASK'S PBDL NODE
/
/ IF TASK WAS SHARING DECREMENT THE TASK USE COUNT; IF TASK WILL BE SHARING
/ INCREMENT THE NEW TASK USE COUNT AND ENTER THE TASK USE COUNT POINTER
/
	LAC	SHR.TC		/IS SHARING GOING OFF?
	SNA
	JMP	SHR.NN		/YES
	ISZ*	SHR.TC		/NO -- BUMP THE TASK USE COUNT
	NOP
SHR.NN	LAC	P.UP,X		/GET OLD TASK USE COUNT POINTER
	DAC	R1		/SAVE IT
	LAC	SHR.TC		/ENTER THE NEW ONE
	DAC	P.UP,X
	LAC	R1		/WAS THE TASK SHARING?
	SNA
	JMP	CXSUC		/NO -- SET EV TO +1 AND EXIT
	LAW	-1		/YES -- DECREMENT THE TASK USE COUNT
	TAD*	R1
	DAC*	R1
	JMP	CXSUC		/SET EV TO +1 AND EXIT
/
SHR.MM	0			/MM REGISTER IMAGE
SHR.SZ	0			/SIZE OF SHARED MEMORY BLOCK
SHR.BA	0			/BASE OF SHARED MEMORY BLOCK
SHR.TC	0			/ADDR OF TASK USE COUNT FOR SHARED BLOCK
	.ENDC
/
	.LST
	.IFUND	L.SER
	.NOLST
	.ENDC
 .TITLE *** SIGNIFICANT EVENT RECOGNITION
/
/ WHENEVER A TASK IS NOT RUNNING, THE LEVEL SIX TRANSFER VECTOR ('L6TV')
/ CONTAINS THE ADDRESS OF 'M0'.
/
/ HENCE, WHEN A SIGNIFICANT EVENT IS DECLARED AND A TASK IS NOT
/ RUNNING (SYSTEM IS EITHER 'IDLE', OR EXECUTIVE IS WORKING IN A
/ RE-STARTABLE MODE. VIZ., SCANNING THE ACTIVE TASK LIST), CONTROL
/ IS TRANSFERRED TO 'M0+1' @ API-6.
/
/ WHENEVER A TASK IS RUNNING, THE LEVEL SIX TRANSFER VECTOR ('L6TV')
/ CONTAINS THE ADDRESS OF THE "INTERRUPT CONNECT LOCATION" IN THE
/ PARTITION BLOCK FOR THE CURRENT TASK'S PARTITION.
/
/ HENCE, WHEN A RUNNING TASK IS INTERRUPTED BY THE EXECUTIVE (BECAUSE
/ A SIGNIFICANT EVENT HAS BEEN DECLARED (VIA .SET6)), THE TASK'S
/ REGISTERS ARE SAVED IN THE TASK'S PARTITION'S PARTITION BLOCK
/ AND CONTROL IS TRANSFERRED TO 'M1' @ API-6 BY THE REGISTER
/ SAVE ROUTINE.
/
/ SPECIAL CASE -- WHEN A TASK EXIT'S, ITS NODE IS REMOVED FROM THE
/ ACTIVE TASK LIST, AND CONTROL IS TRANSFERRED DIRECTLY TO 'M1' @ API-4  
/ (REGISTERS ARE NOT SAVED).
/
M0	0		/A SIGNIFICANT EVENT HAS BEEN DECLARED
	JMP	M6	/AND NO TASK IS CURRENTLY RUNNING -- SCAN
			/ACTIVE TASK LIST FROM TOP.
/
M1	LAC	(M0)	/A SIGNIFICANT EVENT HAS BEEN DECLARED,
	DAC	L6TV	/AND A TASK HAS BEEN INTERRUPTED AND
			/ITS REGISTERS HAVE BEEN SAVED, OR A
			/TASK HAS EXIT'ED -- CHANGE THE LEVEL
			/SIX TRANSFER VECTOR TO INDICATE NO 
			/CURRENT TASK.
/
M6	DBK		/DROP TO API-7
	LAC	(400001)
	ISA
	LAS			/ READ AC SWITCHES AND		/(213)
	DAC	ACSW		/ SAVE FOR USER MODE 'SPY'	/(213)
/
/ SETUP TO SCAN ACTIVE TASK LIST FROM TOP (AT API-7)
/
	LAC	(ATKL)	/SET XR TO POINT TO FIRST NODE
	JMP	M4
/
/ M2 -- SCAN ACTIVE TASK LIST FROM CURRENT TASK DOWN.  THE SCAN
/ IS MADE AT LEVEL SEVEN SO THAT IT MAY BE RESTARTED BY A
/ SIGNIFICANT EVENT DECLARATION (.SET6).  
/
M2	LAC	CURTSK	/SET XR TO ACCESS NEXT NODE
M4	PAX
	LAC	A.FP,X
	SAD	(ATKL)	/END OF LIST?
	JMP	IDLE	/YES -- SYSTEM IS IDLE
	DAC	CURTSK	/NO -- RECORD NODE ADDRESS AS 'CURTSK'
	PAX
	LAC	A.TS,X	/DISPATCH ON TASK STATUS WITH
	AND	(777)	/XR POINTING TO ATL NODE
	TAD	(TSD)
	DAC	TSD
	JMP*	TSD
TSD	XX		/ATL NODE STATUS & ACTION TO BE TAKEN:
	JMP S1		/ 1 -- WAIT FOR PARTITION TO BECOME AVAILABLE
	JMP S2		/ 2 -- SET UP & EXECUTE DISK READ REQUEST
	JMP S3		/ 3 -- WAIT FOR NON-ZERO EVENT VARIABLE (PER ATL NODE)
	JMP S4		/ 4 -- START OR RESUME TASK
	JMP S5		/ 5 -- RESTORE TASK'S REGISTERS AND CONTINUE EXECUTION
	JMP M2		/ 6 -- CONTINUE ACTIVE TASK LIST SCAN
	JMP M2  	/ 7 -- CONTINUE ACTIVE TASK LIST SCAN
	JMP M2		/ 10 -- CONTINUE ACTIVE TASK LIST CAAN	/(161)
/
/ M5 -- ENABLE INTERRUPTS AND CONTINUE ACTIVE TASK LIST SCAN
/
M5	.ENB		///
	JMP	M2	///
/
/ IDLE -- LOOP WITH NO ACTIVE API LEVELS (CONSOLE API LIGHTS OUT)
/
IDLE	DBK		//
	.IFDEF LIGHTS						/(206)
IDLE.1	LAC (750000)	/ LOOP COUNT FOR DEFAULT NUMBER		/(206)
	DAC R1		/ OF CHANGES IN IDLE STATE.		/(206)
	LAC PATRN	/ FETCH THE PATTERN SEED.		/(206)
	CLL!CMA		/ INVERT THE PATTERN FOR THE BIT	/(206)
	AND CENTR	/ SOURCE CHECK.				/(206)
	XCT LMAGIC	/ USE THE MAGIC INSTRUCTION TO BUILD	/(206)
			/ THE NEXT STATE OF THE PATTERN.	/(206)
	DAC R2		/ SAVE THE NEW STATE OF THE SOURCE	/(206)
			/ FOR LATER.				/(206)
	LAC PATRN						/(206)
	AND RIGHT	/ CIRCULAR SHIFT RIGHT.			/(206)
	LMQ!LLS 21	/ PERFORM CIRCULAR RIGHT SHIFT.		/(206)
	XOR R2		/ CHANGE SOURCE.			/(206)
	DAC R2		/ SAVE FOR SOURCE OF LEFT HAND CHANGE.	/(206)
	LAC PATRN						/(206)
	AND LEFT	/ SET UP FOR LEFT CIRCULAR SHIFT.	/(206)
	LMQ!LLS 1						/(206)
	XOR R2		/ SORT OUT THE NEW SOURCE.		/(206)
	DAC PATRN	/ SAVE IT FOR NEXT ITERATION.		/(206)
	LMQ		/ STORE PATTERN IN DATA REGISTERS.	/(206)
	PAX							/(206)
	PAL							/(206)
	ISZ R1		/ LOOP FOR A WHILE UNTIL NEXT CHANGE.	/(206)
	JMP .-1							/(206)
	JMP IDLE.1	/ GO GENERATE NEXT STATE.		/(206)
	.ENDC							/(206)
	.IFUND LIGHTS						/(206)
	JMP	.
	.ENDC							/(206)
/
/ DTC -- DECLARE-TASK-CURRENT SUBROUTINE
/
/ ENTRY CONDITIONS:
/   XR -- ATL NODE ADDRESS
/
/ EXIT CONDITIONS:
/   RUNNING @ API-6
/   L6TV -- "CONNECT" LOCATION OF PARTITION BLOCK
/   AC -- "CONNECT LOCATION OF PARTITION BLOCK
/
DTC	0
	.RTL6		/RAISE TO API-6
	LAC	A.PB,X	//
	PXL		//SAVE ATL POINTER IN LIMIT REGISTER	/(161)
	PAX		//PUT PBDL POINTER INTO XR.		/(161)
	AAC +P.IC	//					/(161)
	DAC L6TV	//					/(161)
	LAW 17000	//FETCH AND MASK FOR LUN OFFSET		/(161)
	AND P.FW,X	//FETCH LUN OFFSET FROM FLAG WORD.	/(161)
	SWHA		//PUT LUN OFFSET INTO LOW 9 BITS.	/(161)
	SZA		//IS THERE A LUN OFFSET?		/(164)
	AAC -2		//YES, DECREMENT FOR PROPER LUN USAGE.	/(164)
	DAC MA.LOF	//SET UP SCOM WITH VALUE OF LUN OFFSET	/(161)
								/(161)
/ NOTE THAT IF THE USER ELECTS TO RUN WITHOUT MULTIACCESS, THE	/(161)
/ USER NUMBER FIELD OF THE FLAG WORD IS IGNORED.		/(161)
								/(161)
	.IFUND NOMAC						/(161)
	LAC P.FW,X	//FETCH FLAGWORD			/(161)
	AND (760)	//EXTRACT USER NUMBER			/(161)
	CLL!RTR		//SHIFT USER NUMBER INTO		/(161)
	RTR		//LOW BITS.				/(161)
	DAC MA.UN	//SET UP SCOM WITH USER NUMBER		/(161)
	.ENDC							/(161)
	LAC L6TV	//RESTORE VALUE OF AC FOR THE REST	/(161)
	PLX		//OF RSX, SAME FOR XR.			/(161)
	JMP*	DTC	//
/
	.EJECT
/ STATUS ONE -- A DISK RESIDENT TASK NEEDS ITS CORE PARTITION.
/
/ ENTRY AT API-7 WITH ATL NODE ADR IN XR
/
S1	LAC A.EV,X	/ FETCH THE LUN OFFSET AND USER NUMBER	/(161)
	LMQ		/ SAVE IT IN THE MQ FOR LATER.		/(161)
	LAC A.PB,X	/ SAVE XR IN LR AND POINT XR TO PBDL	/(161)
	PXL		/TO ACCESS PARTITION BLOCK
	PAX
	.INH		/(INHIBIT BECAUSE .SET6 WOULD RESTART ATL SCAN)
	LAC	P.TC,X	///IS PARTITION FREE  ?
	SZA!IAC		///SET UP USE COUNT, JUST IN CASE.	/(161)
	JMP	M5	///NO -- ENABLE INTERRUPTS & CONTINUE ATL SCAN
	DAC	P.TC,X	///
	DZM	P.Z1,X	///SHOW THAT PARTITION NOT YET ZEROED
	DZM	P.C1,X	///ZERO TASK TIMING CLOCK VALUE
	DZM	P.C2,X	///
	DZM	P.IO,X	///ZERO THE TASK I/O COUNT		/(214)
	DZM	P.UP,X	///ZERO THE TASK USE COUNT POINTER
	LAC P.FW,X	///FETCH THE FLAG WORD.			/(161)
	OMQ		///SET THE USER NUMBER AN LUN OFFSET IN	/(161)
	DAC P.FW,X	///THE FLAG WORD AND INITIALIZE PBDL.	/(161)
	PLX		///RESTORE XR TO POINT TO ATL NODE
	.ENB		///
	ISZ	A.TS,X	///CHANGE STATUS FROM ONE TO TWO
			/(.SET6 CAN NOW RESTART SCAN IF NECESSARY)
/
	.EJECT
/ STATUS TWO -- PARTITION IS AVAILABLE, SETUP & EXECUTE DISK READ REQUEST.
/
/ ENTRY AT API-7 WITH ATL NODE ADR IN XR
/
S2	PXL		/SAVE XR IN LR
	LAC	A.PB,X	/GET ADDRESS OF PBDL NODE
	PAX		/SET UP XR TO ACCESS PBDL
	LAC	P.Z1,X	/HAS THE ZEROING PROCESS BEGUN?
	SZA
	JMP	S2.F	/YES -- GO CONTINUE
	.RTL6		/NO -- RAISE TO API-6
	JMS	PENP	//PICK A NODE FROM POOL OF EMPTY NODES
			//(R1, R6, XR, AND AC ARE ALTERED)
	JMP	S2.E	//STAY AT STATUS TWO IF POOL IS EMPTY
/
	IAC		//SETUP X10 TO FILL EMPTY NODE
	DAC	X10	//
	PLX		//
								/(174)
/ MAKE THE LOADING OF TASKS LOOK LIKE IT IS BEING DONE BY AN	/(174)
/ INTERRUPT PROCESSOR. THIS ALLOWS THE CONTROL BLOCK FOR THE GET/(174)
/ TO BE ANYWHERE IN CORE REGARDLESS OF THE TASK MODE (EXEC/USER)/(174)
								/(174)
	DZM* X10	/ CLEAR THE STL NODE ADDRESS IN THE QIO	/(174)
	LAC DUMA.PB	/ REQUEST BEING GENERATED. SET UP DUMMY	/(174)
	DAC* X10	/ PBDL NODE ADDRESS FOR IOCD AND IT'S	/(174)
			/ FRIENDS.				/(174)
/								/(174)
	LAC	A.TP,X	//TASK PRIORITY
	DAC*	X10	//
	LAC	(30)	//'GET' FUNCTION CODE
	DAC*	X10	//
/
/ EVENT VARIABLE AND CONTROL TABLE ARE IN THE PARTITION BLOCK
/
	LAC	A.PB,X	//SET EVENT VARIABLE ADDRESS
	AAC	+P.EV	//
	DAC	A.EV,X	//
	DAC*	X10	//
	IAC		//
	DAC*	X10	//SET CONTROL TABLE ADDRESS
	LAC	A.SN,X	//GET DISK PARAMETERS FROM THE STL NODE
	PAX		//AND SAVE IN X11 & X12
	LAC	S.DA,X	//
	DAC	X11	//
	LAC	S.DB,X	//
	DAC	X12	//
	LAC	S.EP,X	// IS TASK EXEC MODE?
	RTL		//
	SMA!CLA		// IF SO CLEAR MM REGISTER
	JMP	S2.MM	// YES
	LAC	S.TS,X	//YES --GET MM REGISTER FLAGS AND
	AND	(360	//SAVE IMAGE OF MM REGISTER IN
	SWHA!CLL	//X13 FOR FUTURE USE
	RAL		//
S2.MM	DAC	X13	//
	LAC	S.PB,X	//SETUP TO ACCESS PARTITION BLOCK
	PAX		//
	DZM	P.EV,X	//CLEAR DISK READ EVENT VARIABLE
	LAC	X11	//SET DISK UNIT IN C.T.
	AND	(000377)//
	DAC	P.DU,X	//
	LAC	X11	//SET DISK ADDRESS IN C.T.
	AND	(777400)//
	DAC	P.DA,X	//
	LAC	P.BA,X	//SET CORE ADDRESS IN C.T.
	DAC	P.CA,X	//
	LAC	X12	//SET WORD COUNT IN C.T
	DAC	P.WC,X	//
	LAC	X13	//ENTER MM REGISTER IMAGE IN PBDL
	DAC	P.MM,X	//
/
	LAC	(DSKRQ) //INSERT NODE IN DISK REQUEST QUEUE
	DAC	R1
	JMS	SPRI	//(R1, R2, R6, XR, & AC ARE ALTERED)
/
	.INH		//INHIBIT INTERRUPTS.
	LAC*	(DSKTG	///TRIGGER DISK HANDLER TASK BY
	AND	(377777)///SETTING BIT 0 OF TRIGGER.
	TAD	(400000)///
	.ENB		///ENABLE INTERRUPTS.
	DAC*	(DSKTG	///
/
	PLX		//RESTORE XR FOR ACCESSING ATL NODE
	LAC	A.PB,X	//GET ADDR OF TASK'S PBDL NODE
	PAX		//SET UP XR TO ACCESS PBDL NODE
	LAC	P.SZ,X	//CALCULATE 2'S COMPLEMENT OF
	TCA		//NUMBER OF WORDS TO ZERO BY
	TAD	P.WC,X	//ADDING -PARTITION SIZE TO
	DAC	P.Z2,X	//WORD COUNT. SAVE IN P.Z2
	LAW	-1	//SET FLAG TO SHOW ZEROING IS
	TAD	P.BA,X	//OCCURRING
	TAD	P.SZ,X	//
	DAC	P.Z1,X	//
/
	PLX		//RESTORE XR
/			/(#160) REMOVE DBK HERE
	JMP	M6	/A SIGNIFICANT EVENT HAS OCCURRED -- WE JUST MADE
			/AN IO REQUEST
/
S2.E	DBK		//CONTINUE WITH SCAN.			/(173)
	JMP M2		//					/(173)
/
S2.F	LAC	P.Z2,X	/IS PARTITION ZEROING COMPLETE?
	SNA
	JMP	S2.DON	/YES
	TAD	P.Z1,X	/NO -- POINT X10 AT WORD TO ZERO
	DAC	X10
S2.FLP	DZM*	X10	/ZERO THE WORD
	ISZ	P.Z2,X	/IS ZEROING COMPLETE?
	JMP	S2.FLP	/NO -- GO ZERO ANOTHER WORD
S2.DON	PLX		/YES -- RESTORE THE XR
	LAC	(400003	/SET STATUS THREE WITH TASK LOAD FLAG
	DAC	A.TS,X	/PROCEED TO S3
/
	.EJECT
/ STATUS THREE -- WAIT FOR EVENT VARIABLE (LOADING OF DISK RES
/ TASKS, OR 'WAITFOR' DIRECTIVE)
/
/ ENTER AT API-7 WITH ATL NODE ADR IN XR
/
S3	.INH
	LAW	-1	///EVENT VARIABLE SET
	TAD	A.EV,X	///
	DAC	X10	///
	LAC*	X10	///
	DAC	X11	///SAVE EV IN X11 IN CASE IT IS DISK STATUS
	SNA		///
	JMP	M5	///NO -- ENABLE INTERRUPTS & CONTINUE ATL SCAN
	LAC	A.TS,X	///YES -- IS EXECUTIVE WAITING FOR A
	SMA		///TASK LOAD FROM DISK?
	JMP	S3.B	///NO -- SET STATUS FOUR
	LAC	X11	///YES -- DISK READ OKAY?
	SMA		///
	JMP	S3.A	///YES -- SET STATUS FOUR
	ISZ	SE.AD	///NO -- INCREMENT COUNT OF TASK LOAD ABORTS
	NOP		///DUE TO DISK READ ERRORS
	LAC	(RETX)	///AND ABORT TASK LOADING BY CHANGING
	DAC	A.RA,X	///START ADDRESS TO "RE-ENTRANT EXIT TASK".
S3.A	PXL		///SAVE ATL NODE ADR
	LAC	A.SN,X	///SET XR TO POINT TO STL NODE
	PAX		///
	LAC	S.EP,X	///IS THIS TASK NORMAL MODE?
	RTL		///(NEED TO FIND OUT IF MM BITS IN S.TS
	SPA!CLA!CMA	///SHOULD BE REMOVED BEFORE GETTING TASK SIZE)
	LAW	-400	///YES -- AND OFF MM BITS
	AND	S.TS,X	///NO -- GET TASK SIZE
	LMQ		///
	LAC	S.PB,X	///SET XR TO ADDRESS OF PARTITION BLOCK NODE
	PAX		///
	LACQ		///SAVE TASK SIZE IN PARTITION BLOCK NODE
	DAC	P.TS,X	///
	LAC	P.SZ,X	///SET PARTITION'S VIRTUAL SIZE EQUAL TO
	DAC	P.VS,X	///ITS ACTUAL SIZE
	DZM	P.BP,X	///INDICATE NO BUFFERS YET IN PARTITION
	PLX		///SET XR TO ATL NODE ADR
S3.B	LAC	(4)	///SET STATUS FOUR
	.ENB		///
	DAC	A.TS,X	///
	JMP	S4	/AND PROCESS STATUS FOUR
/
	.EJECT
/ STATUS FOUR -- TASK IS IN CORE AND READY FOR START OR RESUMPTION.
/
/ ENTRY AT API-7 WITH ATL ADR IN XR.
/
S4	JMS	DTC	/ DECLARE TASK CURRENT 
	ISZ	A.TS,X	//CHANGE STATUS FROM FOUR TO FIVE
			//
	LAC	A.RA,X	//FETCH ENTRY (OR RESUMPTION) ADDRESS FROM 
	DAC	R1	//ATL NODE, AND SAVE IN R1
			//
	LAC	A.PB,X	//SETUP 'CTBIAS' & 'CTSIZE' AND RELOCATION &
	PAX		//BOUNDARY REGISTERS.  THIS SETUP IS DONE UNCONDITIONALLY,
	LAC	P.BA,X	//BUT ONLY HAS MEANING FOR NORMAL MODE TASKS.
	DAC	CTBIAS	//
	MPLR		//
	LAC	P.TS,X	//
	DAC	CTSIZE	//
	AAC	-1	//
	MPLD		//
	XCT	FPHDWE	//SKIP IF FP HARDWARE EXISTS
	JMP	S4EX	//
	LAC	P.JE,X	//YES -- LOAD THE JEA REGISTER.
	DAC	R2	//
	LJE		//
	R2		//
S4EX	LAC	P.MM,X	//SET UP MM REGISTER
	LDMM		//
	RDCLK		//RESET XM CLOCK
	DBR		//ESTABLISH MODES (ADDRESSING & PROTECTION)
	JMP*	R1	//DROP FROM API-6 TO API-7, AND TRANSFER CONTROL
/
CTBIAS	0		/RELOCATION BIAS OF CURRENT TASK IF IN "NORMAL MODE"
			/UNDEFINED IF "EXECUTIVE MODE"
CTSIZE	0		/SIZE OF CORE AVAILABLE TO CURRENT TASK IN "NORMAL MODE"
			/UNDEFINED IF "EXECUTIVE MODE"
	.EJECT
/ STATUS FIVE -- RUNNING TASK HAS BEEN INTERRUPTED (BY .SET6)
/
/ ENTRY AT API-7, ATL NODE ADR IN XR, AND REGISTERS
/ SAVED IN PARTITION BLOCK.
/
S5	JMS	DTC	/ DECLARE TASK CURRENT
			//AC CONTAINS THE "CONNECT" LOCATION OF THE
			//PARTITION BLOCK.
			// RUNNING AT API-6 (LEFT BY 'DTC') -- EFFECTIVELY
			// EXIT API-6 INTERRUPT ROUTINE.
	JMP	RSR	//RESTORE REGISTERS & RETURN TO INTERRUPTED PROGRAM
			//TASK EXECUTION.
/
 .TITLE *** REGISTER SAVE AND RESTORE ROUTINES
/
/ IF AN INTERRUPT SERVICE ROUTINE IS TO USE THE SYSTEM'S REGISTER
/ SAVE AND RESTORE ROUTINES, IT MUST PROVIDE THE FOLLOWING LINKAGE
/ AND BUFFER.  WHEN THE EXECUTIVE USES SAVE & RESTORE (TASK SWITCH-
/ ING), THE LINKAGE AND BUFFER IS CONTAINED IN THE PARTITION BLOCK
/ OF THE INTERRUPTED TASK'S PARTITION.
/
/  INT	0	/INTERRUPT CONNECT LOCATION
/  	DBA
/  	JMS* (SAV)
/
/  	---	/AC BUFFER
/  	---	/XR BUFFER
/  	---	/LR BUFFER
/  	---	/MQ BUFFER
/  	---	/SC BUFFER
/ 	---	/R1 BUFFER
/ 	---	/R2 BUFFER
/ 	---	/R3 BUFFER
/ 	---	/R4 BUFFER
/ 	---	/R5 BUFFER
/ 	---	/R6 BUFFER
/ 	---	/X10 BUFFER
/ 	---	/X11 BUFFER
/ 	---	/X12 BUFFER
/ 	---	/X13 BUFFER
/ 	---	/X14 BUFFER
/ 	---	/X15 BUFFER
/ 	---	/X16 BUFFER
/ 	---	/X17 BUFFER
/ 	---	/L20 BUFFER
/
/ 	NOP:SKP	/TASK:EXECUTIVE INDICATOR
/		/  NOP -- INTERRUPT SERVICE ROUTINE
/		/  SKP -- PARTITION BLOCK
/	IF AN INTERRUPT SERVICE ROUTINE, CONTROL IS
/	TRANSFERRED TO THE WORD FOLLOWING THE 'NOP' 
/	AFTER THE REGISTERS HAVE BEEN SAVED.  
/
/	IF A PARTITION BLOCK, ADDITIONAL BUFFER AREA FOLLOWS
/	THE 'SKP' INSTRUCTION.
/
/	---	/MM REGISTER BUFFER
/	---	/XM CLOCK OVERFLOWS
/	---	/XM CLOCK TICKS
/	---	/TASK USE COUNT
/	---	/TASK USE COUNT POINTER
/
/	AND IF FLOATING POINT HARDWARE EXISTS, THE FOLLOWING
/	BUFFER AREA IS ALSO PRESENT.
/
/	---	/EPA BUFFER
/ 	---	/FMA1 BUFFER
/ 	---	/FMA2 BUFFER
/	---	/FMQ1 BUFFER
/	---	/FMQ2 BUFFER
/	---	/JEA BUFFER
/
/ --------
/
/ TO EXIT AN INTERRUPT SERVICE ROUTINE WHERE REGISTERS HAVE
/ BEEN SAVED BY 'SAV',
/	LAC	(INT)
/	JMP*	(RES)
/
	.EJECT
  
  
/ REGISTER SAVE ROUTINE
/
/ LINKAGE VIA 'JMS* (SAV)' WITH ALL REGISTERS CONTENTS OF AN
/ INTERRUPTED PROGRAM.  INTERRUPTS ARE INHIBITED THRU THE
/ INSTRUCTION FOLLOWING THE JMS.
/
/ ENTRY IS IN SCOM WHERE INTERRUPTS ARE INHIBITED AND CONTROL
/ IS TRANSFERRED TO 'SAVV'
/
SAVV	DAC*	SAVE	///SAVE AC
	PXA		///SAVE XR
	ISZ	SAVE	///
	DAC*	SAVE	///
	.ENB		///SETUP XR TO SAVE REMAINDER OF REGISTERS
	LAC	SAVE	///
	AND	(077777)
	AAC	P.FP-P.XR
	PAX
	XCT	P.SW,X	/SKIP IF  EXEC
	JMP	SAVV1	/INTERRUPT SERVICE ROUTINE -- IGNORE MM DATA
	CLA		/CLEAR AC BECAUSE CLOCK REGISTER IS OR'D INTO IT
	RDCLK		/READ THE XM CLOCK
	AAC	-2	/SUBTRACT 2 UNITS BECAUSE THESE WERE USED GETTING HERE
	CLL		/CLEAR LINK SO OVERFLOWS CAN BE DETECTED
	TAD	P.C2,X	/ADD CLOCK VALUES
	DAC	P.C2,X	/SAVE RESULT
	SZL		/WERE THERE ANY OVERFLOWS?
	ISZ	P.C1,X	/YES -- RECORD IT
	NOP		/NO
	RDMM		/READ THE MM REGISTER AND 
	DAC	P.MM,X	/SAVE IN THE PBDL NODE
SAVV1	PLA		/SAVE LR
	DAC	P.LR,X
/
	LACQ		/SAVE MQ
	DAC	P.MQ,X
	LACS		/SAVE SC (THE 2'S COMPLEMENT OF THE
	TCA		/SC IN THE LOW ORDER SIX BITS OF A
	AND	(000077)/NORMALIZE INSTRUCTION)
	XOR	(640400)
	DAC	P.SC,X
/
	LAC	P.IC,X	/GET RESTART ADDR FROM PBDL (#204)
	RTL		/SEE IF TASK IS NRM. (#204)
	SPA		/IS IT NRM? (#204)
	JMP	SAVV2	/YES -- DON"T SAVE ALL REGISTERS (#204)
			/NO -- ITS EXEC MODE, SAVE ALL (#204)
/
	LAC	R1	/SAVE R1
	DAC	P.R1,X
	LAC	R2	/SAVE R2
	DAC	P.R2,X
	LAC	R3	/SAVE R3
	DAC	P.R3,X
	LAC	R4	/SAVE R4
	DAC	P.R4,X
	LAC	R5	/SAVE R5
	DAC	P.R5,X
	LAC	R6	/SAVE R6
	DAC	P.R6,X
/
	LAC	X10	/SAVE X10
	DAC	P.10,X
	LAC	X11	/SAVE X11
	DAC	P.11,X
	LAC	X12	/SAVE X12
	DAC	P.12,X
	LAC	X13	/SAVE X13
	DAC	P.13,X
	LAC	X14	/SAVE X14
	DAC	P.14,X
	LAC	X15	/SAVE X15
	DAC	P.15,X
	LAC	X16	/SAVE X16
	DAC	P.16,X
	LAC	X17	/SAVE X17
	DAC	P.17,X
/
SAVV2	LAC	L20	/SAVE L20 (#204)
	DAC	P.20,X
/
/ IF REGISTERS HAVE BEEN SAVED BY AN INTERRUPT SERVICE ROUTINE
/ (SAVE AREA TERMINATED WITH A 'NOP'), CONTROL IS TRANSFERRED TO THE 
/ SERVICE ROUTINE AT THE WORD FOLLOWING THE 'NOP'.
/
/ IF REGISTERS HAVE BEEN SAVED FOR THE EXECUTIVE IN A TASK'S
/ PARTITION'S PARTITION BLOCK (SAVE AREA TERMINATED BY A 'SKP'),
/ ADDITIONAL REGISTERS ARE TO BE SAVED.
/
	XCT	P.SW,X	/EXEC OR TASK?
	JMP	P.IS,X	/TASK -- TRANSFER CONTROL TO INTERRUPT
			/SERVICE ROUTINE AT WORD FOLLOWING SAVE 
			/AREA (FOLLOWING 'NOP').
	XCT	FPHDWE	/EXEC -- FLOATING POINT HARDWARE?
	JMP	M1	/NO -- TRANSFER CONTROL TO EXECUTIVE
			/YES -- SAVE REGISTERS & TRANSFER TO EXEC
	PXA		/SETUP R1 AS TRANSFER VECTOR FOR
	AAC	P.JE	/SAVING FP15'S REGISTERS		/(213)
	DAC	R1
	SJE;	I+R1	/ SAVE JEA FIRST TO PRESERVE GUARD BIT	/(213)
	AAC	P.FB-P.JE					/(213)
	DAC	R1						/(213)
	UNDST		/STORE EPA, FMA1 AND FMA2.
	R1+400000
	AAC	+P.FM-P.FB
	DAC	R1
	UNSWQ		/SWAP FMA AND FMQ.
	0
	EST		/STORE FMQ1 AND FMQ2.
	R1+400000
	JMP	M1
/
	.EJECT
/ RESTORE (REGISTERS) AND RETURN (CONTROL) ROUTINE
/
/ LINKAGE VIA 'JMP* (RSR)' WITH AC CONTAINING THE "CONNECT" ADDRESS
/
/ ENTRY EITHER VIA SCOM ('RES') OR DIRECTLY TO 'RSR'.
/
RSR	AAC P.FP-P.IC /SETUP XR TO FETCH SAVED REGISTER CONTENTS
	PAX
/
	XCT	P.SW,X	/INTERRUPT SERVICE OR TASK?
	JMP	RSR2	/INT SERVICE -- DON'T SETUP 'CTBIAS' & 'CTSIZE', RELOCATION
			/AND BOUNDARY REGISTERS, OR FP15'S REGISTERS.
	LAC	P.BA,X	/TASK (TASK SWITCHING) -- SETUP 'CTBIAS' & 'CTSIZE'
	DAC	CTBIAS	/AND RELOCATION & BOUNDARY REGISTERS.
	MPLR
	LAC	P.TS,X
	DAC	CTSIZE
	AAC	-1
	MPLD
	LAC	P.MM,X	/RESTORE THE MM REGISTER
	LDMM
	XCT	FPHDWE	/FLOATING POINT HARDWARE?
	JMP	RSR2	/NO -- DO NOT RESTORE FP15'S REGISTERS
	PXA		/YES -- USE R1 TO RESTORE FP15 REGISTERS
	AAC	+P.FM
	DAC	R1
	ELQ
	R1+400000
	AAC	P.FB-P.FM					/(213)
	DAC	R1
	UNDLD
	R1+400000
	AAC	P.JE-P.FB					/(213)
	DAC	R1						/(213)
	LJE;	I+R1	/ RESTORE JEA LAST TO PRESERVE GUARD BIT /(213)
/
RSR2	LAC	P.LR,X	/RESTORE LR
	PAL
	LAC	P.MQ,X	/RESTORE MQ
	LMQ
	LAC	(400000)/RESTORE SC (AC-MQ IS NORMALIZED, THEREFORE
	XCT	P.SC,X	/THE NORM INSTRUCTION FORMED DURING
			/REGISTER SAVE, WILL JUST SET THE SC
			/TO THE 2'S COMPLEMENT OF THE LOW
			/ORDER SIX BITS OF THE INSTRUCTION.
/
	LAC	P.IC,X	/GET RESTART ADDR FROM PBDL (#204)
	RTL		/SEE IF TASK IS NRM. (#204)
	SPA		/IS IT NRM? (#204)
	JMP	RSR3	/YES -- DON"T RESTORE ALL REGISTERS (#204)
			/NO -- EXEC MODE, RESTORE THE WORLD (#204)
/
	LAC	P.R1,X	/RESTORE R1
	DAC	R1
	LAC	P.R2,X	/RESTORE R2
	DAC	R2
	LAC	P.R3,X	/RESTORE R3
	DAC	R3
	LAC	P.R4,X	/RESTORE R4
	DAC	R4
	LAC	P.R5,X	/RESTORE R5
	DAC	R5
	LAC	P.R6,X	/RESTORE R6
	DAC	R6
/
	LAC	P.10,X	/RESTORE X10
	DAC	X10
	LAC	P.11,X	/RESTORE X11
	DAC	X11
	LAC	P.12,X	/RESTORE X12
	DAC	X12
	LAC	P.13,X	/RESTORE X13
	DAC	X13
	LAC	P.14,X	/RESTORE X14
	DAC	X14
	LAC	P.15,X	/RESTORE X15
	DAC	X15
	LAC	P.16,X	/RESTORE X16
	DAC	X16
	LAC	P.17,X	/RESTORE X17
	DAC	X17
/
RSR3	LAC	P.20,X	/RESTORE L20 (#204)
	DAC	L20
/
	.INH		/(IMPURE CODE NECESSARY FOR AC, XR, & PC RESTORATION.)
	LAC	P.AC,X	///FETCH AC AND PC (RETURN PARAMETERS)
	DAC	RARACB	///WHILE XR STILL POINTS TO SAVE AREA.
	LAC	P.IC,X	///
	DAC	RARPCB	///
	XCT	P.SW,X	///SKIP IF EXEC
	SKP		///INTERRUPT SERVICE -- DON'T CLEAR XM CLOCK
	RDCLK		///CLEAR XM CLOCK BY READING IT
	LAC	P.XR,X	///RESTORE XR
	PAX		///
	LAC	RARACB	///RESTORE AC
	.ENB		///
	DBR		///DEBREAK, RESTORE, & RETURN TO INTERRUPTED
	JMP*	RARPCB	///PROGRAM
/
RARACB	0		/AC BUFFER
RARPCB	0		/RESTART ADDRESS BUFFER
/
	.LST
	.IFUND	L.RER
	.NOLST
	.ENDC
 .TITLE *** RE-ENTRANT SYSTEM ROUTINES
/
/ *************************************************************
/
/ IN GENERAL, ALL THE RE-ENTRANT SYSTEM ROUTINES ASSUME THAT
/ THEY ARE CALLED IN PAGE MODE.
/
/ *************************************************************
/
/ NADD -- ADD NODE TO DEQUE
/
/ LINKAGE:
/   R1 -- ADDRESS OF LIST HEAD (OR PRECEDING NODE)
/   R2 -- ADDRESS OF NODE TO BE ADDED
/   JMS  NADD
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   XR & AC							/EAG:167
/
/ ENTRY FROM SCOM OR SPRI WITH INTERRUPTS INHIBITED.		/EAG:167
/
								/EAG:167
								/EAG:167
	.IFDEF %QDBG						/(176)
NADDE	JMS QDBG		///				/(176)
	LAC R2			///NODE ADDRESS TO BE ADDED.	/(176)
	LAC* R1			///				/(176)
	.ENDC							/(176)
	.IFUND %QDBG						/(176)
NADDE	LAC* R1			///				/(176)
	.ENDC							/(176)
	DAC* R2			///				/EAG:167
	PAX			///				/EAG:167
	LAC R2			///				/EAG:167
	DAC 1,X			///				/EAG:167
	DAC* R1			///				/EAG:167
	PAX			///				/EAG:167
	LAC R1			///				/EAG:167
	DAC 1,X			///				/EAG:167
	.ENB			///				/EAG:167
	JMP* NADD		///				/EAG:167
								/EAG:167
	.EJECT							/EAG:167
/ NDEL, NDELXR -- DELETE NODE FROM THREAD			/EAG:167
/
/ NDEL CALLING SEQUENCE:					/EAG:167
/   R1 -- ADDRESS OF NODE TO BE DELETED
/   JMS  NDEL
/								/EAG:167
/ NDELXR CALLING SEQUENCE:					/EAG:167
/   XR -- ADDRESS OF NODE TO BE DELETED				/EAG:167
/   JMS NDELXR							/EAG:167
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   XR & AC							/EAG:167
/
/ ENTRY FROM SCOM WITH WITH INTERRUPTS INHIBITED		/EAG:167
/
								/EAG:167
								/EAG:167
NDELE	LAC NDEL		///				/EAG:167
	DAC NDELXR		///				/EAG:167
	LAC R1			///				/EAG:167
	PAX			///				/EAG:167
NDLXRE	LAC 1,X			///				/EAG:167
	DAC NDEL.0		///				/EAG:167
	LAC 0,X			///				/EAG:167
	DAC* NDEL.0		///				/EAG:167
	PAX			///				/EAG:167
	LAC NDEL.0		///				/EAG:167
	DAC 1,X			///				/EAG:167
	.ENB			///				/EAG:167
	JMP* NDELXR		///				/EAG:167
				///				/EAG:167
				///				/EAG:167
NDEL.0				///				/EAG:167
								/EAG:167
	.EJECT							/EAG:167
/ PENP -- PICK AN EMPTY NODE FROM POOL
/
/ CALLING SEQUENCE:
/   JMS  PENP
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 IF POOL IS EMPTY
/   RETURN AT JMS+2 WITH PICKED NODE ADDRESS IN THE AC, R1 AND	/(173)
/   R2 IF THE POOL IS NOT EMPTY.				/(173)
/
/ REGISTERS ALTERED:
/   R1, R2, XR, & AC						/EAG:202
/
/ ENTRY FROM SCOM WITH INTERRUPTS INHIBITED			/EAG:167
/
PENPE	LAC	POOL	/// EMPTY POOL?
	SAD	(POOL)	///
	JMP	PENP1	/// YES -- RETURN AT JMS+1
	DAC	R1	/// NO -- SAVE NODE ADR IN R1
	LAC*	POOL	/// PICK FIRST NODE FROM POOL
	PAX		///
	DAC	POOL	///					/EAG:167
	LAC	(POOL)	///
	DAC	1,X	///
	LAC	R1	///RETURN AT JMS+2 WITH PICKED NODE ADR IN AC
	DAC R2		///AND R2.				/(173)
	ISZ	PENP	///					/EAG:167
PENP1	.ENB		///
	JMP*	PENP	///					/EAG:167
/
	.EJECT
/
/ PICK -- PICK A NODE FROM A DEQUE
/
/ LINKAGE:
/   R1 -- ADDRESS OF LIST HEAD (OR PRECEDING NODE)
/   JMS  PICK
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 IF DEQUE IS EMPTY
/   RETURN AT JMS+2 WITH PICKED NODE ADDRESS IN AC & R2		/EAG:167
/
/ REGISTERS ALTERED:
/   R2, XR, & AC						/EAG:167
/
/ ENTRY FROM SCOM WITH INTERRUPTS INHIBITED			/EAG:167
/
PICKE	LAC*	R1	///EMPTY DEQUE?
	SAD	R1	///
	JMP	PICK1	///YES -- RETURN AT JMS+1
	DAC	R2	///NO -- PICK NODE
	LAC*	R2	///					/EAG:167
	DAC*	R1	///					/EAG:167
	PAX		///
	LAC	R1	///
	DAC	1,X	///
	LAC	R2	///RETURN AT JMS+1 WITH PICKED NODE ADR IN AC
	ISZ	PICK	///					/EAG:167
PICK1	.ENB		///
	JMP*	PICK	///					/EAG:167
/
	.EJECT
/ SNAM -- SEARCH DEQUE FOR NAME
/
/ CALLING SEQUENCE:
/   R1 -- DEQUE LIST HEAD
/   R2 -- POINTER TO NAME DOUBLEWORD
/   JMS  SNAM
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 IF NAME NOT FOUND
/   RETURN AT JMS+2 WITH NODE ADR IN AC & R2 IF NAME FOUND	/EAG:167
/
/ REGISTERS ALTERED:
/   R1, R2, R6, X17, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN AC
/
SNAME	DAC	R6	/SAVE RETURN ADR IN R6
	LAC	R2	/SETUP XR TO EXAMINE NAME DOUBLEWORD
	PAX
/
	LAC*	R1	/START SCAN AT LISTHEAD
/
SNAM1	SAD	R1	/FORWARD LINKAGE TO LISTHEAD?
	JMP*	R6	/YES -- END OF SCAN, NAME NOT FOUND, RETURN AT JMS+1
	DAC	R2	/SAVE FORWARD LINKAGE IN R2 AND
	IAC		/SETUP X17 TO EXAMINE NAME WORDS IN NODE
	DAC	X17	/IN NODE.
	LAC*	X17	/EXAMINE FIRST NAME HALF
	SAD	0,X	/NAME MATCH?
	SKP
	JMP	SNAM2	/NO -- NEXT NODE (IF ANY)
	LAC*	X17	/MAYBE -- CHECK SECOND HALF
	SAD	1,X	/NAME MATCH?
	JMP	SNAM3	/YES -- RETURN AT JMS+2 WITH NODE ADDRESS IN AC
SNAM2	LAC*	R2	/NO -- NEXT NODE (IF ANY)
	JMP	SNAM1
/
SNAM3	LAC	R2	/MATCH FOUND -- SET NODE ADDRESS IN AC
	ISZ	R6	/AT RETURN AT JMS+2
	JMP*	R6
/
	.EJECT
/ SPRI -- SEARCH DEQUE FOR PRIORITY AND INSERT NODE
/
/ CALLING SEQUENCE:
/   R1 -- DEQUE LIST HEAD
/   R2 -- ADDRESS OF NODE TO BE INSERTED
/   JMS  SPRI
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   R1, R3, R6, XR, & AC					/EAG:167
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN AC
/
SPRIE	DAC	R6	/SAVE RETURN ADR IN R6
	LAC	R2	/SET NODE PRIORITY IN R3
	PAX
	LAC	4,X
	DAC	R3
	LAC	R1	/SET XR TO ACCESS LIST HEAD
	PAX
PR3	.INH
	LAC	0,X	/// END OF DEQUE?
	PAX		///					/EAG:167
	SAD	R1	///
	JMP	PR2	/// YES -- ADD NODE AT END OF DEQUE
			/// NO -- EXAMINE PRIORITY OF DEQUE NODE
	LAC	4,X	/// IS PRIORITY OF NODE TO BE ADDED HIGHER
	TCA		/// (LOWER NUMBER) THAN NODE UNDER EXAMINATION?
	TAD	R3	///
	SMA		///
	JMP	PR4	/// NO -- EXAMINE NEXT NODE
PR2	LAC	1,X	/// YES -- SETUP R1 FOR 'NADD' AND ADD NODE 
	DAC	R1	///
	LAC	R6	/// COPY RETURN ADDRESS FOR NADD	/EAG:167
	DAC	NADD	///					/EAG:167
	JMP	NADDE	/// AND USE NADD TO INSERT NODE		/EAG:167
/
PR4	.ENB		///
	JMP	PR3	///
 .TITLE *** RE-ENTRANT ROUTINES FOR I/O HANDLER TASKS
/
/ *************************************************************
/
/ IN GENERAL, ALL THE RE-ENTRANT SYSTEM ROUTINES ASSUME THAT
/ THEY ARE CALLED IN PAGE MODE.
/
/ *************************************************************
/
/ THE FOLLOWING TWO RE-ENTRANT SUBROUTINES ALLOW I/O HANDLER
/ TASKS TO PERFORM ATTACH & DETACH FUNCTIONS SUCH THAT I/O REQUESTS
/ ARE DE-QUEUED PER TASK OR PER PRIORITY, AND THAT THE REASSIGN MCR
/ FUNCTION TASK CAN ACT APPROPRIATELY WHEN AN ATTEMPT IS MADE TO 
/ REASSIGN A LUN WHEN IT HAS BEEN ATTACHED TO A TASK.
/
/ REDUNDANT ATTACH AND DETACH REQUESTS ARE IGNORED.
/
/ AN ATTACH-DETACH PAIR IS CONSIDERED A PENDING TRANSFER FOR I/O
/ RUNDOWN PURPOSES, AND FOR NORMAL MODE REQUESTORS, THEIR TRANSFERS
/ PENDING COUNT IS INCREMENTED WHEN AN ATTACH (NON-REDUNDANT) IS MADE
/ AND DECREMENTED WHEN A DETACH (NON-REDUNDANT) IS MADE.
/
/ ALAD -- ATTACH INDICATED LUN [AND DEVICE] TO INDICATED TASK
/
/ DLAD -- DETACH INDICATED LUN [AND DEVICE] FROM INDICATED TASK
/
/ A LUN IS ATTACHED TO A TASK BY SETTING ITS STL NODE ADDRESS
/ IN THE ATTACH-FLAG-TABLE SLOT CORRESPONDING TO THE LUN, AND SETTING
/ THE ADDRESS OF THE ATTACH-FLAG-TABLE SLOT IN THE 'ATTACH FLAG' WORD
/ THE PHYSICAL DEVICE NODE.
/
/ A LUN IS DETACHED FROM A TASK BY ZEROING THE ATTACH-FLAG-TABLE
/ SLOT, AND THE PDVL 'ATTACH FLAG' WORD.
/
/ CALLING SEQUENCE:
/   R1 -- ADDRESS OF PHYSICAL DEVICE NODE
/   R2 -- ADDRESS OF PICKED I/O REQUEST NODE
/   JMS* (ALAD)     OR     JMS* (DLAD)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 WITH -24 IN AC IF ASSIGNMENT HAS CHANGED
/   WHILE REQUEST WAS QUEUED OR WITH -203 IF THE REQUEST WAS MADE OTHER
/   THAN AT TASK LEVEL.
/   RETURN AT JMS+2 IF ATTACH OR DETACH IS PERFORMED.
/
/ REGISTERS ALTERED:
/   R3, R6, X10, X11, XR, & AC					/EAG:167
/
/ COMMON CODE -- ENTRY FROM SCOM WITH RETURN ADDRESS IN AC AND	/EAG:167
/ THE LINK INDICATING WHETHER THIS IS AN ATTACH OR DETACH.	/EAG:167
/								/EAG:167
/	LINK = 0 ==> ATTACH					/EAG:167
/								/EAG:167
/	LINK = 1 ==> DETACH					/EAG:167
/								/EAG:167
/
ATDT	DAC R6		/ SAVE THE RETURN ADDRESS.		/(207)
	LAC R2		/ FETCH THE I/O REQUEST NODE ADDRESS.	/(207)
	PAX		/ AND SET UP ACCESS TO IT.		/(207)
 
	LAC 2,X		/ FETCH THE STL NODE ADDRESS OF THE TASK	/(207)
			/ ISSUING THE ATTACH.			/(207)
	SNA		/ WAS THE ATTACH TASK ISSUED?		/(207)
	JMP ATDTNT	/ NO, ATTEMPT TO ATTACH FROM AN INT.	/(207)
			/ HANDLER IS ILLEGAL.			/(207)
	DAC X10		/ SAVE THE STL NODE ADDRESS FOR THE	/(207)
			/ AFT.					/(207)
 
	LAC 3,X		/ FETCH THE PBDL ADDRESS.		/(207)
	AAC P.TP	/ CALCULATE THE ADDRESS OF THE XFR	/(207)
			/ PENDING COUNT.			/(207)
	DAC R3		/ AND SAVE IT FOR LATER.		/(207)
 
	LAW 17000	/ FETCH THE LUN TO BE ATTACHED.		/(207)
	AND 5,X		/ LUN IS IN THE HIGH ORDER BITS.	/(207)
	SWHA		/ LUN IS NOW IN THE LOW ORDER BITS.	/(207)
	PAX		/ SET UP THE XR TO ACCESS THE LUT.	/(207)
	TAD (AFT-2)	/ CALCULATE THE ADDRESS - 1 OF THE RIGHT/(207)
			/ AFT ENTRY.				/(207)
	DAC X11		/ AND SET UP TO ACCESS IT VIA X11.	/(207)
 
	LAC R1		/ FETCH THE PDVL NODE ADDRESS OF THE	/(207)
			/ DEVICE TO BE ATTACHED/DETACHED.	/(207)
	.INH							/(207)
	SADIX (LUT-1)	/// IS THE DEVICE STILL ASSIGNED TO THE	/(207)
			/// SAME LUN?				/(207)
	JMP ATDT.1	/// YES, CONTINUE WITH PDVL NODE ADDRESS/(207)
			/// IN THE AC.				/(207)
	.ENB							/(207)
 
	LAW -24		/ ERROR - DEVICE ASSIGNMENT HAS CHANGED	/(207)
	JMP* R6		/ TAKE ERROR EXIT FROM ATDT.		/(207)
 
ATDTNT	LAW -203	/ ERROR - ATTACH/DETACH NOT TASK ISSUED	/(207)
	JMP* R6							/(207)
 
ATDT.1	PAX		/// SET UP TO ACCESS THE PDVL NODE.	/(207)
	LAC D.AF,X	/// FETCH THE DEVICE ATTACH FLAG	/(207)
	SZL		/// ATTACH OR DETACH?			/(207)
	JMP DLAD1	/// DETACH.				/(207)
	SZA		/// IS THE DEVICE ALREADY ATTACHED?	/(207)
	JMP ALAD2	/// YES. ALLOW ONLY ONE LUN/TASK TO 	/(207)
			/// ATTACH TO A DEVICE.			/(207)
 
	LAC X10		/// FETCH STL NODE ADDRESS.		/(207)
	DAC* X11	/// AND STORE IT IN THE AFT.		/(207)
 
	LAC X11		/// FETCH THE AFT ENTRY ADDRESS		/(207)
	DAC D.AF,X	/// AND FLAG THE DEVICE AS ATTACHED.	/(207)
 
	ISZ* R3		/// INCREMENT THE XFR PENDING COUNT.	/(207)
 
ALAD2	.ENB							/(207)
	ISZ R6		/// SET UP NON-ERROR RETURN FROM ATDT	/(207)
	JMP* R6		/ RETURN.				/(207)
 
DLAD1	SNA		/// IS THE DEVICE ALREADY ATTACHED?	/(207)
	JMP ALAD2	/// NO, TAKE NORMAL RETURN FROM ATDT.	/(207)
	DZM D.AF,X	/// CLEAR ATTACH FLAG.			/(207)
	PAX		/// SET UP TO ACCESS THE AFT.		/(207)
	DZM 0,X		/// CLEAR THE AFT ENTRY.			/(207)
	CLA!CMA!CLL	/// DECREMENT THE XFR PENDING COUNT.	/(207)
	TAD* R3							/(207)
	SZL		/// DID WE ADD IN 0 FROM THE XFR PENDING	/(207)
			/// COUNT.				/(207)
	DAC* R3		/// NO, UPDATE THE NEW XFR PENDING COUNT/(207)
	JMP ALAD2	/// TAKE THE NORMAL RETURN FROM ATDT.	/(207)
	.EJECT							/EAG:167
/
/ DQRQ -- DE-QUEUE AN I/O REQUEST. IF AN "ABORT" REQUEST IS AT THE HEAD
/ OF THE QUEUE, RETURN IT EVEN IF THE DEVICE-UNIT IS ATTACHED TO
/ ANOTHER TASK.  OTHERWISE, IF THE DEVICE-UNIT IS ATTACHED
/ TO A TASK, ONLY REQUESTS FROM THE ATTACHED TASK ARE DE-QUEUED (THE
/ PRIORITY ORDERED QUEUE IS SCANNED FOR STL NODE ADR).  IF THE DEVICE-
/ UNIT IS NOT ATTACHED TO A TASK, REQUESTS ARE DE-QUEUED FROM THE TOP
/ OF THE QUEUE (DE-QUEUED BY REQUESTOR PRIORITY).
/								/EAG:167
/ NOTE THAT ABORT REQUESTS ARE DISTINGUISHED NOT BY EXAMINING	/EAG:167
/ THE I/O FUNCTION CODE, BUT RATHER BY THE I/O REQUEST		/EAG:167
/ PRIORITY, WHICH IS ZERO.					/EAG:167
/
/ CALLING SEQUENCE:
/   R1 -- PHYSICAL DEVICE NODE ADDRESS
/   JMS*  (DQRQ)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 WITH ATTACH FLAG IN AC IF NO REQUEST TO SERVICE
/   RETURN AT JMS+2 WITH REQUEST NODE IN AC & R2		/EAG:167
/
/ REGISTERS ALTERED:
/   R2, R5, R6, XR, & AC					/EAG:167
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN AC
/
								/EAG:167
								/EAG:167
DQRQ1	DAC R6			/ SAVE RETURN ADDRESS IN R6	/EAG:167
/								/EAG:167
	LAC R1			/ POINT XR TO PDVL NODE.	/EAG:167
	PAX			/				/EAG:167
/								/EAG:167
	AAC +D.QF		/(171) POINT R5 TO I/O REQUEST	/EAG:167
	DAC R5			/ QUEUE LISTHEAD.		/EAG:167
/								/EAG:167
	LAC D.AF,X		/ PUT DEVICE ATTACH FLAG (AFT	/EAG:167
	DAC R2			/ TABLE ENTRY POINTER) IN R2.	/EAG:167
/								/EAG:167
	CLL!TCA			/ CLEAR LINK IF DEVICE IS	/EAG:167
				/ ATTACHED; SET LINK OTHERWISE.	/EAG:167
/								/EAG:167
	AXR +D.QF		/(171) POINT XR TO I/O REQUEST	/EAG:167
				/ QUEUE LISTHEAD.		/EAG:167
/								/EAG:167
DQRQ.2	LAC 0,X			/ POINT XR TO NEXT NODE IN	/EAG:167
	PAX			/ REQUEST QUEUE, OR TO REQUEST	/EAG:167
				/ QUEUE LISTHEAD IF SCAN DONE.	/EAG:167
	SAD R5			/ SCANNED ENTIRE REQUEST QUEUE?	/EAG:167
	JMP DQRQ.4		/ JMP IF YES -- RETURN ATTACH	/EAG:167
				/ FLAG (CURRENTLY IN R2).	/EAG:167
	LAC* R2			/ PICK UP STL OF ATTACHED TASK	/EAG:167
	SAD 2,X			/ MATCH STL OF REQUEST?		/EAG:167
	JMP DQRQ.3		/ STL'S MATCH -- DEQUEUE RQST.	/EAG:167
	LAC 4,X			/ CHECK REQUEST PRIORITY.	/EAG:167
	SZA!SNL			/ SKIP IF REQUEST PRIORITY IS	/EAG:167
				/ ZERO (I.E. AN ABORT REQUEST)	/EAG:167
				/ OR IF DEVICE IS NOT ATTACHED.	/EAG:167
	JMP DQRQ.2		/ CAN'T DEQUEUE THIS REQUEST --	/EAG:167
				/ GO CONTINUE SCAN.		/EAG:167
/								/EAG:167
DQRQ.3	PXA			/ XR POINTS TO NODE TO DEQUEUE	/EAG:167
	DAC R2			/ SAVE IT IN R2, AND DELETE	/EAG:167
	JMS NDELXR		/ NODE FROM THE REQUEST QUEUE.	/EAG:167
	ISZ R6			/ RETURN TO JMS+2		/EAG:167
/								/EAG:167
DQRQ.4	LAC R2			/ PICK UP RETURN VALUE,		/EAG:167
	JMP* R6			/ AND RETURN.			/EAG:167
								/EAG:167
	.EJECT							/EAG:167
/
/ VAJX -- TO VERIFY & ADJUST (TO 17-BITS) I/O TRANSFER PARAMETERS.
/
/ CALLING SEQUENCE:
/   R2 -- I/O REQUEST NODE ADDRESS
/   R3 -- STARTING ADR OF TRANSFER
/   R4 -- LENGTH OF TRANSFER IN WORDS.
/   JMS* (VAJX)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 IF INVALID TRANSFER
/   RETURN AT JMS+2, WITH R3 ADJUSTED TO 17-BITS, IF VALID TRANSFER
/
/ REGISTERS ALTERED:
/   R3, R5, XR, & AC
/
VAJX1	DAC	R5	/SAVE RETURN ADDRESS IN R5
/
	LAC	R2	/FETCH PARTITION BLOCK ADDRESS FROM REQUEST NODE
	PAX
	LAC 2,X		/ FETCH STL NODE ADDRESS.		/(173)
	PAX		/ SET UP XR IN CASE I/O WAS TASK ISSUED	/(210)
	SZA!CLA		/ WAS THE I/O REQUEST TASK ISSUED?	/(210)
			/ CLEAR THE NORMAL/EXEC MODE INDICATOR	/(210)
			/ IN CASE THE I/O WASN'T TASK ISSUED.	/(210)
	LAC S.EP,X	/ YES, FETCH THE NORMAL/EXEC MODE 	/(210)
			/ INDICATOR FROM THE STL NODE.		/(210)
	RTL		/ IS IT EXEC MODE?			/(173)
	SMA		/ AC SIGN BIT = 1 IF NO.		/(173)
	JMP VAJX2	/ EXEC MODE, LEAVE WITHOUT CHECKING.	/(173)
	LAC S.PB,X	/ FETCH THE PBDL NODE ADDRESS.		/(210)
	PAX		/ SET UP TO ACCESS THE PBDL.		/(210)
/
	LAC	R4	/WILL I/O OVERFLOW OR UNDERFLOW PARTITION?
	SPA
	JMP*	R5	/YES -- (UNDERFLOW) RETURN AT JMS+1
	TAD	R3	/(R3 IS RELATIVE TO PARTITION BASE)
	TCA
	TAD	P.TS,X
	SPA
	JMP*	R5	/YES -- (OVERFLOW) RETURN AT JMS+1
	LAC	R3	/NO -- VALID REQUEST, ADJUST R3 TO 17-BITS
	TAD	P.BA,X
	DAC	R3
/
VAJX2	ISZ	R5	/RETURN AT JMS+2
	JMP*	R5
								/EAG:167
	.EJECT							/EAG:167
/
/ IOCD -- TO DECLARE I/O REQUEST COMPLETED (DECREMENT TRANSFERS PENDING COUNT)
/
/ CALLING SEQUENCE:
/   R2 -- I/O REQUEST NODE ADDRESS
/   JMS* (IOCD)
/
/ EXIT AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   XR & AC							/EAG:167
/
IOCD1	LAC	R2	///SETUP XR TO ACCESS I/O REQUEST NODE
	PAX		///
	LAC 3,X		///FETCH PBDL NODE ADDRESS.		/(173)
	PAX		///SETUP XR TO ACCESS PARTITION BLOCK	/(173)
	LAC	P.TP,X	///AND DECREMENT TRANSFERS PENDING COUNT.
	SZA		///
	AAC	-1	///
	DAC	P.TP,X	///
	.ENB		///					/(173)
	JMP*	IOCD	///					/EAG:167
								/EAG:167
	.EJECT							/EAG:167
/
/ PABF -- PREALLOCATE I/O BUFFER
/
/ DECREASE THE VIRTUAL PARTITION SIZE BY THE SIZE OF AN I/O BUFFER,
/ UNLESS THIS WOULD CAUSE THE TASK SIZE TO BE GREATER.
/
/ LINKAGE:
/   R2 -- I/O REQUEST NODE ADDRESS
/   R4 -- I/O BUFFER SIZE
/   JMS* (PABF)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 ON ERROR
/   RETURN AT JMS+2 IF SUCCESSFUL
/
/ REGISTERS ALTERED:
/   R4, R5, XR & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN THE AC
/
PABF1	DAC	R5	/SAVE RETURN ADDRESS IN R5
/
	LAC	R2	/I/O REQUEST NODE ADDRESS
	PAX
	LAC	2,X	/STL NODE ADDRESS
	PAX
	LAC	S.PB,X	/PARTITION BLOCK NODE ADDRESS
	PAX
	LAC	R4	/I/O BUFFER SIZE
	SPA!SNA
	JMP*	R5	/SIZE ERROR
	AAC	+2	/ADD 2 FOR HEADER
	SPA!TCA
	JMP*	R5	/SIZE ERROR
	.INH		/INHIBIT INTERRUPTS
	TAD	P.VS,X	///DECREASE VIRTUAL PARTITION SIZE
	DAC	R4	///TEMP. SAVE
	TCA		///
	TAD	P.TS,X	///COMPARE WITH TASK SIZE
	SMA!SZA		///
	JMP	PABF2	///WOULD MAKE TASK TOO LARGE
	LAC	R4	///
	DAC	P.VS,X	///
	IDX	R5	///
/
PABF2	.ENB		///ENABLE INTERRUPTS
	JMP*	R5	///
								/EAG:167
	.EJECT							/EAG:167
/
/ ALBF -- ALLOCATE I/O BUFFER
/
/ PARTITION IS EXAMINED FOR AN EXISTING CHAIN OF I/O BUFFERS. IF ONE IS
/ FOUND THAT IS FREE AND EXACTLY THE REQUESTED SIZE, IT IS USED. IF ONE
/ IS NOT FOUND OF THE EXACT SIZE AND IF SUFFICIENT ROOM TO CREATE ONE IN
/ THE PARTITION EXISTS, A NEW BUFFER IS CREATED AND ADDED TO THE CHAIN.
/ IF THAT FAILS, AN EXISTING FREE BUFFER WHOSE SIZE IS LARGER THAN AND
/ MOST CLOSELY MATCHES THE DESIRED SIZE IS USED.
/ THE CALLER ASKS FOR AN "N" WORD BUFFER AND AN "N+2" WORD BUFFER
/ IS USED. WORD 0 BIT 0 IS A FREE(0)/BUSY(1) BIT. THE REST OF WORD 0 IS A
/ POINTER TO THE NEXT BUFFER IN THE CHAIN OR 0 IF NONE. WORD 1 CONTAINS
/ THE BUFFER SIZE "N+2". THE CALLER IS GIVEN THE ADDRESS OF WORD 2 OF THE
/ BUFFER.
/
/ A NEW BUFFER IS NOT CREATED IF IT WOULD OVERFLOW INTO THE TASK AREA. THE
/ LOWEST BUFFER (OR PREALLOCATED BUFFER -- SEE PABF) DETERMINES THE VIRTUAL
/ PARTITION SIZE WHICH LIMITS HOW FAR THE TASK MAY INCREASE ITS SIZE BY
/ THE 'RAISE BOUND' DIRECTIVE.
/
/ LINKAGE:
/   R2 -- I/O REQUEST NODE ADDRESS
/   R4 -- DESIRED BUFFER SIZE
/   JMS* (ALBF)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 IF ERROR
/   RETURN AT JMS+2 IF SUCCESSFUL WITH BUFFER ADDRESS IN AC
/
/ REGISTERS ALTERED:
/   R1, R3, R4, R5, R6, X10, X11, X12, XR & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN THE AC
/
ALBF1	DAC	R5	/SAVE RETURN ADDRESS IN R5
/
	LAC	R4	/BUFFER SIZE
	SPA!SNA
	JMP*	R5	/SIZE ERROR
	AAC	+2	/ADD 2 TO THE DESIRED BUFFER SIZE (TO ACCOUNT
	SPA!TCA		/FOR LINKAGE WORDS) AND VALIDATE.
	JMP*	R5	/ERROR RETURN
	DAC	R4	/STORE ADJUSTED BUFFER SIZE IN 2'S COMPLEMENT
/
ALBF2	LAC	R2	/SET XR TO POINT TO I/O REQUEST NODE
	PAX
	LAC	2,X	/SET XR TO POINT TO STL NODE
	PAX
	LAC	S.PB,X	/SET XR TO POINT TO PARTITION BLOCK NODE
	PAX
	DAC	R1	/SAVE NODE'S ADDRESS
	LAC	P.BA,X	/COMPUTE FOR LATER USE THE 2'S COMPLEMENT OF
	TAD	P.TS,X	/ADDRESS JUST ABOVE THE HIGHEST TASK ADDRESS
	TCA
	DAC	R3
	DZM	X10	/INIT. ADDRESS OF "BUFFER CLOSEST IN SIZE".
	LAC	(377777) /INIT. CLOSEST SIZE = VERY LARGE.
	DAC	X11
/
	.INH		/INHIBIT INTERRUPTS.
	LAC	P.BP,X	///IS THIS THE 1ST BUFFER TO BE ALLOCATED?
	SNA		///
	JMP	ALBF5	///YES.
	.ENB		///ENABLE INTERRUPTS.
/
ALBF3	PAX		/NO -- SET XR TO ADDRESS OF NEXT BUFFER
	LAC	0,X	/IS THE BUFFER IN USE?
	SPA
	JMP	ALBF4	/YES.
	LAC	1,X	/IS THE BUFFER SIZE EXACTLY WHAT IS WANTED?
	TCA
	SAD	R4	/(R4 CONTAINS NEGATIVE OF DESIRED SIZE)
	JMP	ALBF7	/YES.
	TAD	X11	/IS THIS SIZE CLOSER THAN ALL THE PREVIOUS ONES?
	SPA!SNA
	JMP	ALBF4	/NO.
	LAC	1,X	/YES -- IS IT LARGER THAN THE DESIRED SIZE?
	TAD	R4
	SPA
	JMP	ALBF4	/NO -- IGNORE IT.
	LAC	0,X	/YES -- SAVE THE BUFFER'S ADDRESS IN X10 AND ITS
	AND	(377777) /SIZE IN X11 FOR POSSIBLE FUTURE USE.
	DAC	X10
	LAC	1,X
	DAC	X11
/
ALBF4	.INH		/INHIBIT INTERRUPTS.
	LAC	0,X	///ARE THERE ANY MORE BUFFERS IN THE CHAIN?
	AND	(377777) ///
	SNA		///
	JMP	.+3	///
	.ENB		///YES -- ENABLE INTERRUPTS AND
	JMP	ALBF3	///CHECK THEM OUT.
	PXA		///SAVE THE LAST BUFFER'S ADDRESS.
	DAC	R6	///THIS IS ALSO THE ADDRESS IMMEDIATELY ABOVE THE
	JMP	ALBF6	///AREA WHERE A NEW BUFFER MAY BE ADDED.
ALBF5	PXA		///SAVE THE ADDRESS OF THE BUFFER POINTER WITHIN
	AAC	+P.BP	///THE PARTITION BLOCK NODE.
	DAC	R6	///
	LAC	P.BA,X	///COMPUTE THE ADDRESS OF THE TOP OF THE PARTITION
	TAD	P.SZ,X	///+1. THIS IS THE ADDRESS IMMEDIATELY ABOVE THE
			///AREA WHERE A NEW BUFFER MAY BE ADDED.
ALBF6	TAD	R4	///SUBTRACT THE ADJUSTED DESIRED SIZE.
	DAC	X12	///SAVE THE NEW BUFFER ADDRESS.
	TAD	R3	///COMPARE THIS WITH THE ADDRESS IMMEDIATELY
	SMA		///ABOVE THE TASK.
	JMP	ALBF8	///ROOM ENOUGH FOR BUFFER.
	LAC	X10	///WAS A FREE BUFFER FOUND ALBEIT THE SIZE WAS
	SNA		///LARGER?
	JMP	ALBF11	///NO -- ERROR RETURN.
	PAX		///SET BUFFER'S ADDRESS IN THE XR.
ALBF7	.INH		///INHIBIT INTERRUPTS.
	LAC	0,X	///IS THE BUFFER STILL FREE?
	SMA		///
	JMP	ALBF9	///YES.
	.ENB		///NO -- ENABLE INTERRUPTS AND START ALL OVER AGAIN.
	JMP	ALBF2	///
ALBF8	LAC	X12	///SET XR TO POINT TO NEW BUFFER.
	PAX		///
	LAC	(400000) ///SET BUFFER BUSY AND INDICATE NO OTHER
	DAC	0,X	///BUFFERS IN CHAIN.
	LAC	R4	///STORE BUFFER SIZE (+2 FOR HEADER).
	TCA		///
	DAC	1,X	///
	LAC	R6	///SET XR TO POINT TO WHAT WAS FORMERLY THE LAST
	PAX		///BUFFER IN THE CHAIN.
	LAC	0,X	///SAVE FREE/BUSY STATUS AND ADD POINTER TO THE
	AND	(400000) ///NEW BUFFER.
	TAD	X12	///
	.ENB		///ENABLE INTERRUPTS.
	DAC	0,X	///
/
	LAC	R1	/SET XR TO POINT TO THE PARTITION BLOCK NODE.
	PAX
	LAC	P.BA,X
/
	.INH		/INHIBIT INTERRUPTS.
	TAD	P.VS,X	///COMPARE MAX. TASK ADDRESS+1 (PARTITION BASE +
	TCA		///VIRTUAL SIZE) TO THE NEW BUFFER ADDRESS.
	TAD	X12	///
	SMA		///
	CLA		///BUFFER NOT LOWER.
	TAD	P.VS,X	///DECREASE THE VIRTUAL PARTITION SIZE.
	DAC	P.VS,X	///
	LAC	X12	///RETURN BUFFER ADDRESS (+2) IN THE AC.
	JMP	ALBF10	///
ALBF9	TAD	(400000) ///SET THE BUFFER BUSY.
	DAC	0,X	///
	PXA		///RETURN TO THE CALLER THE BUFFER ADDRESS+2 IN THE AC.
ALBF10	AAC	+2	///
	IDX	R5	///
ALBF11	.ENB		///ENABLE INTERRUPTS.
	JMP*	R5	///EXIT.
								/EAG:167
	.EJECT							/EAG:167
/
/ DABF -- DEALLOCATE I/O BUFFER
/
/ THE BUSY BIT FOR AN I/O BUFFER IN A PARTITION IS CLEARED. THE BUFFER,
/ HOWEVER, REMAINS DEFINED EVEN IF IT HAPPENS TO BE THE LOWEST ONE IN
/ THE PARTITION. THUS, ONCE BUFFERS ARE CREATED, THEY CANNOT BE REMOVED
/ UNTIL THE TASK EXITS.
/
/ LINKAGE:
/   R4 -- I/O BUFFER ADDRESS
/   JMS* (DABF)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   R4, R5, XR & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN THE AC
/
DABF1	DAC	R5	/SAVE RETURN ADDRESS.
	LAC	R4	/SET BUFFER ADDRESS IN THE XR.
	AAC	-2	/(USER WAS ACTUALLY GIVEN BUFFER ADDRESS+2).
	PAX
	LAC	0,X	/CLEAR THE BUFFER'S BUSY BIT.
	AND	(377777)
	DAC	0,X
	JMP*	R5
								/EAG:167
	.EJECT							/EAG:167
/								/EAG:167
/ DQAB -- DEQUEUE AN I/O REQUEST IF AND ONLY IF IT IS AN	/EAG:167
/	  ABORT REQUEST.					/EAG:167
/								/EAG:167
/ CALLING SEQUENCE:						/EAG:167
/   R1 -- ADDRESS OF THE PHYSICAL DEVICE NODE			/EAG:167
/								/EAG:167
/ NOTE THAT THE DEVICE NODE SHOULD BE FOR UNIT ZERO (ON MULTI-	/EAG:167
/ UNIT DEVICES), AS ALL ABORT REQUESTS ARE QUEUED IN UNIT	/EAG:167
/ ZERO'S DEVICE NODE REGARDLESS OF FOR WHICH UNIT THEY ARE	/EAG:167
/ ACTUALLY INTENDED.						/EAG:167
/								/EAG:167
/ EXIT CONDITIONS:						/EAG:167
/	RETURN AT JMS+1 IF NO ABORT REQUEST TO SERVICE, WITH	/EAG:167
/		BITS 2 AND 3 (=140000) OF THE TRIGGER EVENT	/EAG:167
/		VARIABLE (ADDRESS IN THE PDVL NODE) CLEARED.	/EAG:167
/	RETURN AT JMS+2 WITH ADDRESS OF ABORT REQUEST NODE	/EAG:167
/		IN R2.						/EAG:167
/								/EAG:167
/ REGISTERS ALTERED:						/EAG:1&7
/	R2, XR, & AC						/EAG:167
/								/EAG:167
/ ENTRY FROM SCOM WITH INTERRUPTS INHIBITED.			/EAG:167
/								/EAG:167
								/EAG:167
								/EAG:167
DQAB1	LAC R1			/// POINT AC AND XR TO I/O	/EAG:167
	AAC +D.QF		/// REQUEST QUEUE LISTHEAD.	/EAG:167
	PAX			///				/EAG:167
	SAD 0,X			/// REQUEST QUEUE EMPTY?	/EAG:167
	JMP DQAB.2		/// JMP IF QUEUE EMPTY.		/EAG:167
	LAC 0,X			/// POINT R2 AND XR TO GIRSTEAG:167
	DQc!R:		/// SEQUEST IN THE REQUEST	/EAG:167
	PAX			/// QUEUE.			/EAG:167
	LAC 5,X			/// CHECK IF THE REQUEST IS	/EAG:167
	AND (777)		/// AN ABORT REQUEST.		/EAG:167
	SAD (17)		///				/EAG:167
	JMP DQAB.3		/// JMP IF IT'S AN ABORT.	/EAG:167
DQAB.2	LAC R1			/// POINT XR TO TRIGGER EVENT	/EAG:167
	PAX			/// VARIABLE, OBTAINING ITS	/EAG:167
	LAC D.TG,X		/// ADDRESS FROM THE PDVL NODE.	/EAG:167
	PAX			///				/EAG:167
	LAC 0,X			/// PICK UP EVENT VARIABLE,	/EAG:167
	AND (637777)		/// AND MASK OUT ABORT FLAG	/EAG:167
	DAC 0,X			/// BITS.			/EAG:167
	.ENB			/// AND RETURN TO JMS+1.	/EAG:167
	JMP* DQAB		///				/EAG:167
				///				/EAG:167
				///				/EAG:167
DQAB.3	LAC DQAB		/// ARRANGE FOR NDELXR TO	/EAG:167
	IAC			/// RETURN TO JMS+2,		/EAG:167
	DAC NDELXR		///				/EAG:167
	JMP NDLXRE		/// AND GO DELETE REQUEST NODE.	/EAG:167
								/EAG:167
	.EJECT							/EAG:167
/								/EAG:167
/ DMTQ -- PROCESS ABORT I/O REQUEST				/EAG:167
/								/EAG:167
/ THIS SUBROUTINE PROCESSES THE ABORT I/O FUNCTION FOR		/EAG:167
/ A DEVICE.  IT REQUIRES AS ARGUMENTS THE PDVL NODE		/EAG:167
/ ADDRESS ASSOCIATED WITH THE DEVICE'S UNIT ZERO AND		/EAG:167
/ THE I/O REQUEST NODE aEDSWSS (TO DETERMINE THE TASK FOR	/EAG:167
/ WHICH TO ABORT I/O AND WHETHER IT'S AN ABORT ALL UNITS OR	/EAG:167
/ ABORT SINGLE UNIT FUNCTION).					/EAG:167
/								/EAG:167
/ IF THE FUNCTION IS AN ABORT ALL UNITS (LUN = 0), ALL UNITS	/EAG:167
/ OF THE DEVICE WHICH ARE ATTACHED TO THE ABORTING TASK WILL	/EAG:167
/ BE DETACHED.  ALL I/O REQUESTS (IN EVERY UNIT REQUEST		/EAG:167
/ QUEUE) ISSUED BY THE TASK WILL BE REMOVED FROM THE REQUEST	/EAG:167
/ QUEUE(S) AND ABORTED, REGARDLESS OF THE LUN TO WHICH THEY	/EAG:167
/ WERE ISSUED.  THIS ROUTINE (DMTQ) NEED ONLY BE CALLED ONCE	/EAG:167
/ FOR A MULTI-UNIT DEVICE, PROVIDED THE UNIT ZERO PDVL NODE	/EAG:167
/ ADDRESS IS PROVIDED.  NOTE THAT ADDITIONAL CALLS (USING	/EAG:167
/ OTHER UNITS' PDVL NODE ADDRESSES) ARE PERMITTED, BUT WILL	/EAG:167
/ PERFORM NO FURTHER OPERATION.					/EAG:167
/								/EAG:167
/ IF THE FUNCTION IS AN ABORT SINGLE UNIT (LUN NON-ZERO), ALL	/EAG:167
/ I/O REQUESTS ISSUED BY THE TASK FOR THAT PARTICULAR LUN WILL	/EAG:167
/ BE REMOVED FROM THE APPROPRIATE REQUEST QUEUE AND ABORTED.	/EAG:167
/ THE DEVICE REMAINS ATTACHED AND REQUESTS TO THE SAME		/EAG:167
/ DEVICE-UNIT VIA OTHER LUNS REMAIN IN EFFECT.			/EAG:167
/								/EAG:167
/ DEFINITION:							/EAG:167
/								/EAG:167
/	"TO ABORT AN I/O REQUEST" MEANS:			/EAG:167
/								/EAG:167
/	    1.	THE I/O REQUEST NODE IS REMOVED FROM THE	/EAG:167
/		DEVICE UNIT'S I/O REQUEST QUEUE.		/EAG:167
/								/EAG:167
/	    2.	THE TRANSFERS PENDING COUNT IS DECREMENTED,	/EAG:167
/		IF THE REQUEST WAS ISSUED BY A NORMAL MODE	/EAG:167
/		TASK.						/EAG:167
/								/EAG:167
/	    3.	THE EVENT VARIABLE WHICH THE TASK SUPPLIED	/EAG:167
/		TO SIGNAL REQUEST COMPLETION IS SET TO -2,	/EAG:167
/		INDICATING THE REQUEST WAS ABORTED.  THIS	/EAG:167
/		REQUIREMENT IS OPTIONAL IN THE CASE OF ABORT	/EAG:167
/		ALL UNITS; IT IS ONLY NECESSARY FOR ABORT	/EAG:167
/		SINGLE UNIT.  NOTE THAT A SIGNIFICANT EVENT	/EAG:167
/		WILL NOT BE DECLARED, AS IT WOULD BE REDUNDANT.	/EAG:167
/								/EAG:167
/	    4.	THE I/O REQUEST NODE IS RETURNED TO THE FREE	/EAG:167
/		NODE POOL.					/EAG:167
/								/EAG:167
/ NOTE THAT THE DEVICE HANDLER IS RESPONSIBLE FOR ABORTING	/EAG:167
/ ALL REQUESTS WHICH IT IS CURRENTLY PROCESSING!		/EAG:167
/								/EAG:167
/ CALLING SEQUENCE:						/EAG:167
/   R1 -- ADDRESS OF THE PHYSICAL DEVICE NODE FOR UNIT ZERO	/EAG:167
/   R2 -- ADDRESS OF THE PICKED (ABORT) I/O REQUEST NODE	/EAG:167
/   JMS* (DMTQ)							/EAG:167
/								/EAG:167
/   RETURN AT JMS+1 UNCONDITIONALLY, WITH REGISTERS AS FOLLOWS:	/EAG:167
/	R1 -- ADDRESS OF FREE NODE POOL				/EAG:167
/	R2 -- ADDRESS OF THE ABORT I/O REQUEST NODE		/EAG:167
/	X10 -- STL ADDRESS OF ABORTING TASK			/EAG:167
/	X11 -- LUN # TO ABORT, SHIFTED LEFT 9 BITS, IF ABORT	/EAG:167
/	       SINGLE UNIT.  ZERO IF ABORT ALL UNITS.		/EAG:167
/	AC, XR -- ADDRESS OF THE EVENT VARIABLE ASSOCIATED	/EAG:167
/		  WITH THE ABORT I/O REQUEST.			/EAG:167
/								/EAG:167
/ EXAMPLE OF TYPICAL USAGE:					/EAG:167
/		LAC < PDVL UNIT ZERO >				/EAG:167
/		DAC* (R1)					/EAG:167
/		JMS DQAB					/EAG:167
/		  JMP < NO ABORT REQUESTS >			/EAG:167
/	 ABRT	JMS DMTQ					/EAG:167
/		SZA!CLA!IAC					/EAG:167
/		DAC 0,X						/EAG:167
/		JMS IOCD					/EAG:167
/		JMS NADD					/EAG:167
/		< SCAN ALL UNITS FOR ACTIVE REQUESTS >		/EAG:167
/		< WHICH MATCH STL IN X10 AND LUN IN  >		/EAG:167
/		< X11, AND ABORT SAME.  NOTE THAT R1 >		/EAG:167
/		< STILL POINTS TO THE FREE NODE POOL >		/EAG:167
/		< LISTHEAD, SUITABLE FOR USE BY NADD.>		/EAG:167
/ NOTE THAT ABORT REQUESTS DEQUEUED BY DQRQ TRANSFER TO THE	/EAG:167
/ LABEL "ABRT" IN THE ABOVE CODE SEQUENCE.			/EAG:167
/								/EAG:167
/ REGISTERS ALTERED:						/EAG:167
/   R1, R2, R3, R5, R6, X10, X11, X12, XR & AC			/EAG:167
/								/EAG:167
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN THE AC.		/EAG:167
/								/EAG:167
								/EAG:167
								/EAG:167
DMTQ1	DAC R6			/ SAVE RETURN ADDRESS		/EAG:167
/								/EAG:167
	LAC R2			/ SAVE ADDRESS OF ABORT REQUEST	/EAG:167
	DAC R3			/ IN R3, AND POINT XR TO	/EAG:167
	PAX			/ REQUEST NODE.			/EAG:167
/								/EAG:167
	LAC 2,X			/ SAVE STL NODE ADDRESS IN X10.	/EAG:167
	DAC X10			/				/EAG:167
/								/EAG:167
	LAW 777000		/ MASK OUT LUN NUMBER,		/EAG:167
	AND 5,X			/ SAVE IT IN X11, AND		/EAG:167
	DAC X11			/ CHECK IF ABORT SINGLE UNIT	/EAG:167
	SNA!SWHA		/ OR ABORT ALL UNITS.		/EAG:167
	JMP DMTQ.0		/ JMP IF ABORT ALL UNITS.	/EAG:167
/								/EAG:167
	PAX			/ FETCH PDVL NODE ADDRESS OF	/EAG:167
	LACIX (LUT-1)		/ UNIT TO BE ABORTED INTO AC.	/EAG:167
	JMP DMTQ.3		/ GO SCAN REQUEST QUEUE.	/EAG:167
/								/EAG:167
								/EAG:167
								/EAG:167
DMTQ.0	LAC R1			/ POINT XR TO PDVL NODE.	/EAG:167
	PAX			/				/EAG:167
/								/EAG:167
DMTQ.1	.INH			/// INHIBIT INTERRUPTS WHILE	/EAG:167
	LAC D.AF,X		/// PLAYING WITH ATTACH FLAGS.	/EAG:167
	DAC R5			/// POINT R5 TO AFT TABLE ENTRY	/EAG:167
	SZA!CLL			/// IS DEVICE ATTACHED? SKIP	/EAG:167
				/// WITH LINK=0 IF NOT.		/EAG:167
	LAC* R5			/// PICK UP STL ADDRESS OF	/EAG:167
				/// ATTACHED TASK.		/EAG:167
	SAD X10			/// IS DEVICE ATTACHED TO US?	/EAG:167
	SKP!STL			/// SET LINK IF YES.		/EAG:167
	JMP DMTQ.2		/// JMP WITH LINK=0 IF NO	/EAG:167
	DZM* R5			/// DEVICE ATTACHED TO US -- SO	/EAG:167
	DZM D.AF,X		/// DETACH IT (CLEAR THE FLAGS)	/EAG:167
DMTQ.2	.ENB			/				/EAG:167
	SZL			/ WAS DEVICE DETACHED?		/EAG:167
	JMS IOCD		/ YES -- DECREMENT TRANSFERS	/EAG:167
				/ PENDING COUNT.		/EAG:167
	LAC R1			/ PICK UP PDVL ADDRESS FOR	/EAG:167
				/ WHAT FOLLOWS.			/EAG:167
/								/EAG:167
DMTQ.3	AAC +D.QF		/ ENTER WITH PDVL NODE ADDRESS	/EAG:167
	DAC R5			/ IN AC.  POINT XR AND R5	/EAG:167
	PAX			/ TO REQUEST QUEUE LISTHEAD.	/EAG:167
/								/EAG:167
	LAC (POOL)		/ INITIALIZE R1 TO RETURN NODES	/EAG:167
	DAC R1			/ TO FREE POOL USING NADD.	/EAG:167
/								/EAG:167
DMTQ.4	LAC 0,X			/ CHECK NEXT NODE IN REQUEST	/EAG:167
DMTQ.5	PAX			/ QUEUE.			/EAG:167
	SAD R5			/ REACHED END OF QUEUE?		/EAG:167
	JMP DMTQ.7		/ JMP IF YES.			/EAG:167
	DAC R2			/ SAVE REQUEST FOR IOCD.	/EAG:167
/								/EAG:167
	LAC 2,X			/ WAS REQUEST ISSUED BY THIS	/EAG:167
	SAD X10			/ TASK -- I.E., DOES STL ADDR.	/EAG:167
	SKP			/ MATCH?			/EAG:167
	JMP DMTQ.4		/ JMP IF DON'T MATCH.		/EAG:167
/								/EAG:167
	LAC X11			/ NOW CHECK LUNS.  X11=0 ==>	/EAG:167
	SZA			/ ABORT ALL UNITS, OTHERWISE	/EAG:167
	XOR 5,X			/ COMPARE LUNS FOR MATCH.	/EAG:167
	AND (777000)		/				/EAG:167
	SZA			/				/EAG:167
	JMP DMTQ.4		/ JMP IF DON'T MATCH		/EAG:167
/								/EAG:167
	LAC 6,X			/ EVERYTHING MATCHES -- ABORT	/EAG:167
	SNA			/ THIS REQUEST.  FIRST, CHECK	/EAG:167
	JMP DMTQ.6		/ IF REQUEST HAS EVENT VAR.	/EAG:167
	AAC -1			/ AND SET IT TO -2 IF IT DOES.	/EAG:167
	DAC X12			/				/EAG:167
	LAW -2			/				/EAG:167
	DAC* X12		/				/EAG:167
/								/EAG:167
DMTQ.6	LAC 0,X			/ SAVE ADDRESS OF NEXT NODE	/EAG:167
	DAC X12			/ IN REQUEST QUEUE.		/EAG:167
/								/EAG:167
	JMS NDELXR		/ DELETE NODE FROM RQST QUEUE	/EAG:167
/								/EAG:167
	JMS IOCD		/ ADJUST TRANSFERS PENDING CNT	/EAG:167
/								/EAG:167
	JMS NADD		/ AND RETURN NODE TO FREE POOL	/EAG:167
/								/EAG:167
	LAC X12			/ RESTART SCAN WITH NEXT NODE.	/EAG:167
	JMP DMTQ.5		/				/EAG:167
/								/EAG:167
								/EAG:167
								/EAG:167
/ COME HERE WHEN SCAN REACHES END OF REQUEST QUEUE.		/EAG:167
/ NOTE THAT XR POINTS TO REQUEST QUEUE LISTHEAD.		/EAG:167
								/EAG:167
DMTQ.7	LAC R3			/ RESTORE R2 TO ABORT REQUEST	/EAG:167
	DAC R2			/ NODE POINTER.			/EAG:167
/								/EAG:167
	LAC X11			/ IS THIS AN ABORT ALL UNITS?	/EAG:167
	SZA			/ SKIP IF YES.			/EAG:167
	JMP DMTQ.8		/ JMP IF ABORT SINGLE UNIT.	/EAG:167
/								/EAG:167
	AXR -D.QF		/ POINT XR TO PDVL NODE BASE	/EAG:167
/								/EAG:167
	LAC D.N1,X		/ SAVE DEVICE NAME IN X12.	/EAG:167
	DAC X12			/				/EAG:167
/								/EAG:167
	LAC D.FP,X		/ ADVANCE TO NEXT PDVL NODE.	/EAG:167
	DAC R1			/				/EAG:167
	PAX			/				/EAG:167
/								/EAG:167
	LAC X12			/ IS IT FOR THE SAME DEVICE?	/EAG:167
	SAD D.N1,X		/ SKIP IF DIFFERENT DEVICE.	/EAG:167
	JMP DMTQ.1		/ GO ABORT NEXT UNIT OF MULTI-	/EAG:167
				/ UNIT DEVICE.			/EAG:167
/								/EAG:167
	LAC (POOL)		/ RESTORE R1 TO FREE NODE POOL	/EAG:167
	DAC R1			/ LISTHEAD POINTER.		/EAG:167
/								/EAG:167
DMTQ.8	LAC R2			/ POINT XR TO ABRORT REQUEST,	/EAG:167
	PAX			/ THEN PICK UP ABORT REQUEST'S	/EAG:167
	LAC 6,X			/ EVENT VARIABLE ADDRESS, AND	/EAG:167
	PAX			/ LEAVE IT IN AC AND XR.	/EAG:167
/								/EAG:167
	JMP* R6			/ AND RETURN!			/EAG:167
								/EAG:167
								/EAG:167
	.LST
	.IFUND	L.MAC
	.NOLST
	.ENDC
 .TITLE *** MEMORY PROTECT INTERRUPT SERVICE
/
/ A MEMORY PROTECT VIOLATION HAS OCCURRED.  THE TASK IN VIOLATION HAS
/ BEEN INTERRUPTED AND 'CURTSK' POINTS TO ITS ATL NODE.
/
MPKINT	0
	DBA
	DAC	R3	/SAVE AC
	PXA		/SAVE XR
	DAC	R4
	LAC	MPKINT	/SAVE ENTRY POINT SO THAT THIS ROUTINE CAN BE
	PAL		/REENTERED.
	LAC	(2)	/SET CODE INDICATING REASON FOR VIOLATION.
	MPSNE
	AAC	-1
	DAC	R5
	MPCV
	MPCNE
	DBK
	JMS	PENP	/PICK AN EMPTY NODE FROM THE POOL
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	RETX	/YES -- CAN'T PRINT ERROR MESSAGE.
	IAC		/SETUP X13 TO FILL NODE WITH TERMINATION
	DAC	X13	/NOTICE INFORMATION.
	LAC	CURTSK	/SET TASK NAME
	PAX
	LAC	A.N1,X
	DAC*	X13
	LAC	A.N2,X
	DAC*	X13
	LAC	R5	/SET TERMINATION INDICATOR
			/   1 -- MEMORY BOUND VIOLATION
			/   2 -- NONEXISTENT MEMORY REFERENCE
	DAC*	X13
	PLA		/SET ADDRESS OF VIOLATION (ACTUALLY 
	DAC*	X13	/LINK, ADR MODE, PROTECT MODE, AND ADR
			/OF WORD FOLLOWING VIOLATION)
	LAC	R3	/SET CONTENTS OF AC AT VIOLATION
	DAC*	X13
	LAC	R4	/SET CONTENTS OF XR AT VIOLATION
	DAC*	X13
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ IS THIS A MULTIACCESS TASK?		/(161)
	SNA		/ AC >< 0 IF YES.			/(161)
	JMP MPKIN1	/ NO.					/(161)
	LAC R2		/ FETCH NODE ADDRESS.			/(161)
	PAX		/ PREPARE TO SET EXIT CODE.		/(161)
	CLA!IAC		/ EXIT CODE IS 1.			/(161)
	DAC T.EC,X	/ SET EXIT CODE IN NODE.		/(161)
	LAC (TDV.EQ)	/ FETCH PROPER DEQUE HEAD.		/(161)
	JMP MPKIN2	/ GO REJOIN COMMON CODE.		/(161)
MPKIN1=.							/(161)
	.ENDC							/(161)
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST
MPKIN2	DAC R1		/ SET UP NADD FOR PROPER LIST.		/(161)
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
	.IFUND NOMAC						/(161)
	LAC MA.UN	/ IS THIS A MULTIACCESS TASK?		/(161)
	SNA		/ AC >< 0 IF YES.			/(161)
	.ENDC							/(161)
	CAL	RQTTN	/REQUEST TASK TERMINATION NOTICE TASK
	JMP	RETX
RQTTN	1		/CAL PARAMETER BLOCK TO REQUEST TASK TO
	0		/OUTPUT TASK TERMINATION NOTICE.
	.SIXBT	"TNTERM"
	0
 .TITLE *** CLOCK INTERRUPT SERVICE
/
	INTENTRY CLKINT,L.MAC	/CLOCK INTERRUPT SERVICE ROUTINE ENTRY
/
	CLON		/CLEAR CLOCK OVERFLOW FLAG
/
TU	JMS*	(SLICE	/FIND OUT IF TIME SLICING IS ON AND IF SO
			/CHANGE THE ATL STATUS WORDS AS APPROPRIATE.
	ISZ	CISEC	/SKIP IF SIGNIFICANT EVENT COUNTER OVERFLOWS.
	JMP	TU1
	LAC	NTSCSE	/RESET THE SIGNIFICANT EVENT COUNTER FROM THE
	TCA		/"NUMBER OF TICKS SEPARATING CLOCK-GENERATED
	DAC	CISEC	/SIGNIFICANT EVENTS". GENERATE A GRATUITOUS
			/SIGNIFICANT EVENT (JUST TO KEEP THE SYSTEM
	.SET6		/GOING IN CASE ONE WAS MISSED).
TU1	LAC	(TT)	/SETUP TIME PARAMETER POINTER TO TICKS.
	DAC	TMUX
	LAC	TPS	/UPDATE TICKS COUNT -- OVERFLOW?
	JMS	TMU
	JMP	CQX	/NO -- CHECK CLOCK QUEUE
	ISZ	SSM	/YES -- UPDATE SECONDS-SINCE-MIDNITE COUNT
	LAC	(D60)	/AND UPDATE SECONDS COUNT -- OVERFLOW?
	JMS	TMU
	JMP	CQX	/NO -- CHECK CLOCK QUEUE
	LAC	(D60)	/YES -- UPDATE MINUTES COUNT -- OVERFLOW?
	JMS	TMU
	JMP	CQX	/NO -- CHECK CLOCK QUEUE
	LAC	(D24)	/YES -- UPDATE HOURS COUNT -- OVERFLOW?
	JMS	TMU
	JMP	CQX	/NO -- CHECK CLOCK QUEUE
	JMP	CU	/YES -- UPDATE CALENDAR AND CHECK HOURS,
			/SECONDS, MINUTES, & TICKS QUEUES
/
/ TMU -- TIME UPDATE SUBROUTINE.  ENTER WITH 'TMUX' POINTING TO
/ WORD (TT, SS, MM, OR HH) TO INCREMENT, AND AC CONTAINING THE
/ OVERFLOW VALUE.  IF OVERFLOW, THE WORD IS ZEROED AND THE
/ POINTER ('TMUX') IS INCREMENTED.
/
/ RETURN AT JMS+2 IF OVERFLOW
/ RETURN AT JMS+1 IF NO OVERFLOW
/
TMU	0
	ISZ*	TMUX	/INCREMENT WORD
	SAD*	TMUX	/OVERFLOW?
	SKP
	JMP*	TMU	/NO -- RETURN AT JMS+1
	DZM*	TMUX	/YES -- ZERO WORD, INCREMENT POINTER,
	ISZ	TMUX	/AND RETURN AT JMS+2
	ISZ	TMU
	JMP*	TMU
/
TMUX	0		/POINTER
/
/ CALENDAR UPDATE ROUTINE -- GOOD THRU DEC 31, 1999
/
CU	ISZ	DSR	/AUGMENT DAYS RUNNING COUNT
	NOP
	DZM	SSM	/RESET SECONDS SINCE MIDNITE
	ISZ	DA	/INCREMENT DAY-OF-MONTH
	LAC	MO	/DETERMINE NUMBER OF DAYS THIS MONTH
	SAD	(02)	/FEBRUARY?
	JMP	CU1	/YES -- SET AC=29 OR 30 (FOR LEAP YEAR)
	LAC	MO	/NO -- SET AC=31 OR 32 (PER MONTH MAP)
	XOR	(LRS 0)
	DAC	.+2
	LAC	(012652)/(MONTH MAP -- BIT SET FOR 31 DAY MONTHS)
	XX		/(LONG RIGHT SHIFT ONE BIT PER MONTH NUMBER)
	AND	(01)
	TAD	(D31)
	JMP	CU2
CU1	LAC	YR
	AND	(03)
	SNA!CLA
	IAC
	TAD	(D29)
CU2	SAD	DA	/AC CONTAINS ONE MORE THAN NUMBER OF DAYS
	SKP		/THIS MONTH.  HAS DAY COUNT OVERFLOWED MONTH?
	JMP	CQX	/NO -- CALENDAR UPDATE COMPLETE
	LAC	(+1)	/YES -- SET DAY TO ONE AND INCREMENT MONTH
	DAC	DA
	ISZ	MO
	LAC	MO	/MONTH OVERFLOW?
	SAD	(D13)
	SKP
	JMP	CQX	/NO -- CALENDAR UPDATE COMPLETE
	LAC	(+1)	/YES -- SET MONTH TO ONE AND INCREMENT YEAR
	DAC	MO
	ISZ	YR
/
/
/ CLOCK QUEUE EXAMINATION
/
CQX	LAC	(CKQ)	/SETUP XR TO ACCESS FIRST NODE
	PAX		/OF CLOCK QUEUE (DEQUE).
	LAC	C.FP,X
	SAD	(CKQ)	/EMPTY DEQUE?
	JMP	CIX	/YES -- EXIT CLOCK INTERRUPT SERVICE ROUTINE
	PAX		/NO -- SETUP XR TO ACCESS FIRST NODE
	ISZ	C.ST,X	/"DECREMENT" "SCHEDULE TICKS" -- ZERO?
	JMP	CIX	/NO -- EXIT CLOCK INTERRUPT SERVICE ROUTINE
	LAC	C.SS,X	/YES -- "SCHEDULE SECONDS" ZERO?
	SNA
	JMP	CINCD	/YES -- A NODE HAS COME DUE
	ISZ	C.SS,X	/NO -- "DECREMENT" "SCHEDULE SECONDS," RESET
	NOP		/"SCHEDULE TICKS" TO A WHOLE SECOND, AND
	LAC	CTPS	/EXIT CLOCK INTERRUPT SERVICE ROUTINE.
	DAC	C.ST,X
	JMP	CIX
/
CINCD	PXA		/SAVE ADDRESS OF CLOCK QUEUE NODE
	DAC	CICNA	/AND REMOVE NODE FROM DEQUE
	DAC	R1
	JMS	NDEL	/(R1, R2, R6, XR, & AC ARE ALTERED)
	LAC	CICNA	/RESTORE XR
	PAX
/
	LAC	C.TI,X	/EXAMINE TYPE INDICATOR
	SAD	(6)	/NUL NODE?
	JMP	CIRTP	/YES -- RETURN NODE TO POOL
	SAD	(5)	/NO -- MARK TIME NODE?
	JMP	CIMT	/YES -- SET EV & RETURN NODE TO POOL
			/NO -- REQUEST A TASK
/
	LAC	C.PE,X	/SAVE REQUEST PRIORITY
	DAC	CIPRI
	LAC	C.SP,X	/SAVE STL NODE ADDRESS
	DAC	CISNA
	PAX		/SET XR TO EXAMINE STL NODE
	.INH		///IS TASK ACTIVE, SET TO BE REMOVED ON EXIT,
	LAC	S.DP,X	///OR DISABLED?
	AND	(730000 ///OR DISABLED, OR IN PARTITION TROUBLE
	SZA		///
	JMP	CIRQ2	///YES -- SKIP REQUEST
	LAC	S.DP,X	///NO -- FLAG TASK ACTIVE
	XOR	(400000)///
	.ENB		///
	DAC	S.DP,X	///
/
	JMS	PENP	/PICK AN EMPTY NODE FROM POOL
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	CIRQ1	/YES -- SKIP REQUEST
	IAC		/SETUP AUTO-INCREMENT REGISTER X13
	DAC	X13	/TO FILL NODE PICKED FROM POOL
			/FOR ENTRY INTO ACTIVE TASK LIST
	LAC	CISNA	/SETUP XR TO ACCESS STL NODE
	PAX
	LAC	S.N1,X	/SET TASK NAME INTO NODE FOR ATL
	DAC*	X13
	LAC	S.N2,X
	DAC*	X13
	LAC	CIPRI	/SET RUN PRIORITY
	DAC*	X13
	LAC	S.PB,X	/SET PARTITION BLOCK ADDRESS
	DAC*	X13
	PXA		/SET STL NODE ADDRESS
	DAC*	X13
	LAC	S.DP,X	/SET TASK STATUS
	AND	(040000)/   1 -- IMAGE ON DISK
	SZA!CLA		/   4 -- FIXED IN CORE
	AAC	+3
	IAC
	DAC*	X13
	LAC	S.EP,X	/SET ENTRY POINT
	DAC*	X13
	DZM* X13	/ CLEAR THE MAPPING INFORMATION.	/(172)
/
	LAC	(ATKL)	/ADD NODE TO ACTIVE TASK LIST PER
	DAC	R1	/PRIORITY
	JMS	SPRI	/(R1, R2, R3, R6, XR, & AC ARE ALTERED)
/
	.SET6		/DECLARE A SIGNIFICANT EVENT
/
	JMP	CIRSX	/TASK HAS BEEN REQUESTED
/
CIRQ1	ISZ	SE.EP	/TASK NOT REQUESTED -- POOL EMPTY -- RECORD
	NOP		/"SYSTEM ERROR", CLEAR ACTIVE FLAG IN STL NODE,
	.INH		///AND RESCHEDULE IF APPROPRIATE.
	LAC	CISNA	///
	PAX		///
	LAC	S.DP,X	///
	AND	(377777)///
	.ENB		///
	DAC	S.DP,X	///
	JMP	CIRSX
/
CIRQ2	.ENB		/TASK NOT REQUESTED -- ACTIVE OR DISABLED --
			/ENABLE INTERRUPTS AND RESCHEDULE IF
			/APPROPRIATE.
/
CIRSX	LAC	CICNA	/SETUP XR TO ACCESS CLOCK QUEUE NODE
	PAX
	LAC	C.TI,X	/IS TASK TO BE RE-SCHEDULED?
	SNA
	JMP	CIRTP	/NO -- RETURN CLOCK NODE TO POOL
	LAC	C.RS,X	/YES -- RESET SCHEDULE INCREMENT
	DAC	CQIDS	/AND ENTER IN CLOCK QUEUE.
	LAC	C.RT,X
	DAC	CQIDT
	PXA
	DAC	R2
	JMS	CQI
	JMP	CIENN	/EXAMINE NEXT NODE
/
CIMT	LAC	C.PE,X	/A MARK TIME INTERVAL HAS ELAPSED -- SET
	AAC	-1	/EVENT VARIABLE TO +1, DECREMENT TRANSFERS
	DAC	X15	/PENDING COUNT (IF NORMAL MODE REQUESTOR), 
	CLA!IAC		/DECLARE A SIGNIFICANT EVENT, AND RETURN NODE
	DAC*	X15	/TO POOL.
/
	LAC	C.SP,X	/ SET XR TO PARTITION BLOCK NODE ADDRESS/(173)
	PAX
	.INH		///
	LAC P.TP,X	///FETCH TRANSFER PENDING COUNT.	/(173)
	SZA		///IF IT'S ALREADY 0 IGNORE THIS REQUEST/(173)
	AAC -1		///OTHERWISE DECREMENT THE COUNTE.	/(173)
	DAC	P.TP,X	///
	.ENB		///
/
	.SET6		///					/(173)
/
CIRTP	LAC	(POOL)	/A CLOCK QUEUE NODE IS NO LONGER NEEDED,
	DAC	R1	/RETURN IT TO THE POOL
	LAC	CICNA
	DAC	R2
	JMS	NADD	/(R2, R6, XR, AND AC ARE ALTERED)
/
CIENN	LAC	(CKQ)	/EXAMINE NEXT "NODE"
	PAX
	LAC	C.FP,X	/LIST HEAD (END OF DEQUE)?
	SAD	(CKQ)
	JMP	CIX	/YES -- EXIT CLOCK INT SERVICE ROUTINE
	PAX		/NO -- SETUP XR TO EXAMINE NODE
	LAC	C.ST,X	/IS NODE DUE AT SAME TIME AS
	SZA		/PREVIOUS NODE?
	JMP	CIX	/NO -- EXIT CLOCK INT SERVICE ROUTINE
	JMP	CINCD	/YES -- PROCESS
/
CIX	LAW	-1	/DECREMENT REAL TIME CLOCK
	.INH		///
	TAD	7	///
/ IF THE CLOCK INCREMENTS HERE, BETWEEN TAD & DAC, A TICK WILL
/ BE LOST.  SINCE CLOCK INTERRUPT SERVICE TIME NORMALLY IS 
/ LESS THAN THE CLOCK PERIOD, THIS IS HIGHLY IMPROBABLE,
/ AND INHIBITING INTERRUPTS MAKES IT MORE SO.  THIS IS
/ THE ONLY KNOWN FLAKEY SPOT IN RSX!  CAN IT BE DONE BETTER???
	DAC	7	///
	.ENB		///
	SMA		///IS CLOCK BEHIND?
	JMP	TU	/YES -- CATCH UP
	INTEXIT	CLKINT	/NO -- EXIT CLOCK INTERRUPT SERVICE ROUTINE
/
CICNA	0		/CLOCK NODE ADDRESS
CISNA	0		/STL NODE ADDRESS
CIPRI	0		/REQUEST PRIORITY
CISEC	-1		/COUNTER. WHEN ZERO, GENERATE A SIGNIFICANT EVENT.
	.TITLE *** 'IORD' I/O RUNDOWN TASK
/
/ THIS TASK IS TRIGGERED INTO EXECUTION WHENEVER THE 'EXIT' DIRECTIVE
/ DETECTS A NORMAL MODE TASK FOR WHICH THE COUNT OF PENDING TRANSFERS
/ TO/FROM ITS PARTITION IS NON-0.
/
/ THIS TASK IS ALWAYS CORE RESIDENT, AND RESIDES IN A "PARTITION" THAT
/ IS NOT AVAILABLE FOR OTHER TASKS. IT CONTAINS A "PARTITION BLOCK" THAT
/ IS ONLY USED AS A REGISTER SAVE AREA (WHEN THE TASK IS INTERRUPTED BY
/ THE EXECUTIVE). IT IS NOT A PART OF THE "PARTITION BLOCK DESCRIPTIONS
/ LIST.								/(161)
/
/ IT CONTAINS AN ACTIVE TASK LIST NODE WITH STATUS INITIALLY SET TO 4,
/ INDICATING IT IS READY TO BE RUN. WHEN THE TASK IS IDLE, IT WILL
/ "WAITFOR" ITS TRIGGER EVENT VARIABLE TO BE SET NON-0 BEFORE RESUMING
/ OPERATION.
/
/ THIS TASK IS NEVER REQUESTED, NOR DOES IT EVER EXIT; THEREFORE, THERE
/ IS NO SYSTEM TASK LIST ENTRY FOR IT.
/
/ WHENEVER AN ATL NODE IS INSERTED IN THE I/O RUNDOWN DEQUE ('IORDQ'),
/ 'IORD' IS TRIGGERED. NODES APPEAR IN ORDER OF TASK PRIORITY.
/
/ FOR EVERY TASK TO BE ABORTED, FIRST ALL MARK TIME REQUESTS BY THE TASK
/ ARE NULLIFIED. THEN, A SCAN OF THE PHYSICAL DEVICE LIST IS MADE TO
/ FIND ACTIVE I/O HANDLERS. EACH I/O HANDLER IS CALLED IN TURN TO ABORT
/ I/O FOR THAT TASK BY THE PLACEMENT IN THE HANDLER'S FIRST I/O REQUEST
/ QUEUE OF A PRIORITY ZERO "ABORT" DIRECTIVE.
/
IORDTW	CAL	IORDWT	/WAITFOR TASK TRIGGER.
	DZM	IORDTG	/CLEAR THE TRIGGER EVENT VARIABLE.
/
IORDNX	LAC	(IORDQ)	/PICK NODE FROM I/O RUNDOWN QUEUE.
	DAC	R1
	JMS	PICK	/(R2, R6, XR & AC ARE ALTERED).
			/QUEUE EMPTY?
	JMP	IORDTW	/YES.
	PAX		/NO -- SET XR WITH NODE'S ADDRESS.
	DAC IORDAT	/ SAVE ATL NODE FOR MULTIACCESS.	/(161)
	LAC	A.N1,X	/SAVE TASK NAME IN 'UNMARK' CPB.
	DAC	IORDUM+2
	LAC	A.N2,X
	DAC	IORDUM+3
	LAC	A.PB,X	/TASK'S PARTITION BLOCK ADDRESS.
	DAC	IORDPB
	LAC	A.SN,X	/TASK'S STL NODE ADDRESS.
	DAC	IORDSN
/
	CAL	IORDUM	/CANCEL TASK'S MARK TIME REQUESTS.
/
	LAC	IORDPB	/PARTITION BLOCK ADDRESS.
	PAX
	LAC	P.TP,X	/IS THE 'TRANSFERS PENDING' COUNT NOW 0?
	SNA
	JMP	IORDFR	/YES -- FREE UP THE PARTITION AND CHANGE THE STL
			/NODE TO INDICATE TASK INACTIVE.
/
/ SCAN THE PHYSICAL DEVICE LIST FOR ACTIVE I/O HANDLERS.
/
	DZM	IORDPN	/SET THE "PREVIOUS DEVICE NAME" TO ZERO.
	LAC	(PDVL)	/POINTER TO PDVL LISTHEAD.
	DAC	IORDPD
/
IORDLP	LAC	IORDPD	/SET XR TO PDVL NODE ADDRESS.
	PAX
	LAC	0,X	/GET ADDRESS OF NEXT NODE.
	SAD	(PDVL)	/END OF DEQUE?
	JMP	IORDTC	/YES.
	DAC	IORDPD	/NO -- SAVE PDVL NODE ADDRESS.
/
/ COMPARE THE DEVICE NAME OF THIS PDVL NODE WITH THE PRECEDING ONE TO
/ SEE IF THIS DEVICE HAS ALREADY BEEN PROCESSED ONCE. THE SYSTEM CON-
/ FIGURATION TASK HAS ORDERED PDVL NODES SO THAT NODES FOR THE SAME
/ DEVICE ARE ADJACENTLY LINKED.
/
	PAX
	LAC	2,X	/COMPARE WITH THE PRECEDING DEVICE NAME.
	SAD	IORDPN
	JMP	IORDLP	/SAME -- GO ON TO NEXT NODE.
	DAC	IORDPN	/SAVE NEW NAME.
	SKP
/
/ PICK AN EMPTY NODE FROM THE POOL AND CONSTRUCT AN "ABORT" REQUEST.
/
	CAL	(5)	/WAIT FOR NEXT SIGNIFICANT EVENT. MAYBE THEN
			/A NODE WILL BE FREE.
	JMS	PENP	/(R1, R6, XR & AC ARE ALTERED).
			/WAS A NODE FOUND?
	JMP	.-2	/NO.
	PAX		/YES -- SET NODE'S ADDRESS IN THE XR.
	LAC	IORDSN	/STORE STL NODE ADDRESS.
	DAC	2,X
	LAC	IORDPB	/STORE PARTITION BLOCK ADDRESS.
	DAC	3,X
	DZM	4,X	/SET PRIORITY CODE OF ZERO.
	LAC	(17)	/SET LUN=0 AND I/O FUNCTION CODE=17.
	DAC	5,X
	LAC	(IORDEV) /SET EVENT VARIABLE ADDRESS.
	DAC	6,X
	DZM	IORDEV
/
/ CHECK IF THE CURRENT PDVL NODE IS FOR THE PAPER TAPE PUNCH. IF SO,
/ PREPARE TO EXECUTE A RESUME DIRECTIVE BECAUSE THERE IS A SITUATION IN
/ WHICH THE PUNCH HANDLER WILL SUSPEND ITS EXECUTION.
/
	LAC	IORDPD	/SET THE XR WITH THE PDVL NODE ADDRESS.
	PAX
	AAC	+D.QF	/SET R1 WITH THE ADDRESS OF THE I/O REQUEST DEQUE
	DAC	R1	/FOR THE CALL BELOW TO "SPRI".
	LAC	D.N1,X	/IS THIS THE NODE FOR "PP"?
	SAD	IORDPP	/(.SIXBT "PP").
	JMP	.+3	/YES.
	LAC	(NOP)	/NO.
	SKP
	LAC	(CAL IORDRS)
	DAC	IORDXX
/
/ CHECK IF THE CURRENT PDVL NODE POINTS TO AN ACTIVE I/O HANDLER. MAKE
/ THIS CHECK AT API LEVEL 6 SO THAT THE MCR FUNCTION TASK 'REASSIGN'
/ CAN'T RUN.
/
	LAC	(400002)/RAISE TO API LEVEL 6.
	ISA
	LAC	D.TG,X	//IS THE HANDLER ACTIVE?
	SNA		//
	JMP	IORDNA	//NO -- TRY NEXT PDVL NODE.
	DAC	IORDHT	//YES -- SAVE HANDLER'S TRIGGER EVENT VARIABLE ADDRESS.
	.INH		//INHIBIT INTERRUPTS.
	LAC*	IORDHT	///SET BIT 2 IN THE HANDLER'S TRIGGER TO INDICATE
	AND	(677777)///A QUEUED ABORT REQUEST.
	TAD	(100000)///
	.ENB		///ENABLE INTERRUPTS.
	DAC*	IORDHT	///
	LAC	IORDPB	//SET XR WITH TASK'S PARTITION BLOCK NODE ADDRESS.
	PAX		//
	ISZ	P.TP,X	//ADD 1 TO THE 'TRANSFERS PENDING' COUNT SINCE AN
	NOP		//I/O REQUEST IS ABOUT TO BE QUEUED.
	JMS	SPRI	//INSERT NODE BY PRIORITY.
			//(R1, R2, R3, R6, XR & AC ARE ALTERED).
	.SET6		/DECLARE A SIGNIFICANT EVENT.
	DBK		//DEBREAK BACK TO LEVEL 7.
IORDXX	XX		//EITHER "NOP" OR "CAL IORDRS".
	CAL	IORDWF	/WAITFOR HANDLER TO RESPOND.
/
/ THE HANDLER HAS RESPONDED TO THE ABORT REQUEST. IS THE 'TRANSFERS
/ PENDING' COUNT NOW ZERO?
/
	LAC	IORDPB	/SET XR WITH PARTITION BLOCK ADDRESS.
	PAX
	LAC	P.TP,X
	SZA
	JMP	IORDLP	/COUNT NOT 0 -- CONTINUE SCAN.
/
/ I/O RUNDOWN FOR THIS TASK IS COMPLETE.
/
	.IFUND NOMAC						/(161)
IORDFR	LAC IORDPB	/ FETCH TASK'S PARTITION BLOCK ADDRESS.	/(161)
	PAX		/ SET UP TO ACCESS THE PARTITION BLOCK	/(161)
	LAC P.FW,X	/ FETCH MULTIACCESS INFO FROM PBDL.	/(161)
	AND (760)	/ EXTRACT USER NUMBER FROM FLAG WORDS.	/(161)
	SNA		/ AC >< 0 IF TASK IS MULTIACCESS.	/(161)
	JMP IORDF1	/ NORMAL EXIT.				/(161)
	LAC IORDAT	/ FETCH ATL NODE ADDRESS.		/(161)
	PAX		/ SET UP TO ACCESS ATL.			/(161)
	DZM T.EC,X	/ SET NORMAL EXIT FOR TDV.		/(161)
	LAC (TDV.EQ)	/ FETCH PROPER POOL HEAD.		/(161)
	JMP IORDF2	/ REJOIN COMMON CODE.			/(161)
IORDF1=.							/(161)
	.ENDC							/(161)
	.IFDEF NOMAC						/(161)
IORDFR=.							/(161)
	.ENDC							/(161)
	LAC (POOL)	/ FETCH NORMAL RETURN LIST.		/(161)
IORDF2	DAC R1		/ STORE LIST ADDRESS FOR NADD.		/(161)
	LAC IORDAT	/ FETCH NODE ADDRESS.			/(161)
	DAC R2		/ SET UP NODE ADDRESS FOR NADD.		/(161)
	JMS NADD	/ ADD NODE TO LIST.			/(161)
			/ (R2,R6,XR & AC ARE ALTERET).		/(161)
	LAC IORDSN	/ FETCH TASK'S STL NODE ADDRESS FOR	/(161)
	PAX		/ FREEUP.				/(161)
	JMS	FREEUP	/SUBROUTINE, USED ALSO BY "EXIT", TO FREE TASK'S
			/PARTITION IF TASK IS NOT FIXED IN CORE, AND TO
			/SET TASK INACTIVE IN ITS STL NODE.
			/(XR & AC ARE ALTERED).
	.SET6		/DECLARE A SIGNIFICANT EVENT.
	JMP	IORDNX	/ANY OTHER TASKS TO ABORT?
/
/ TEST THE "TRANSFERS PENDING" COUNT. IF IT IS STILL NON-0, MARK TIME
/ FOR 2 TICKS IN CASE A HANDLER OF PRIORITY LOWER THAN IOCD HAS SET THE
/ EVENT VARIABLE BEFORE DECREMENTING THE TRANSFERS PENDING COUNT. IF THE
/ COUNT IS STILL NON-0, ENTER A NODE IN THE TASK TERMINATION NOTICE
/ REQUEST LIST IN ORDER TO PRINT A MESSAGE TO THAT EFFECT. AN I/O HANDLER
/ HAS GOOFED SOMEWHERE.
/
IORDTC	LAC	IORDPB	/SET XR WITH PARTITION BLOCK ADDRESS.
	PAX
	LAC	P.TP,X
	SNA
	JMP	IORDFR	/COUNT IS ZERO.
	CAL	IORDMK	/MARK TIME FOR 2 TICKS.
	CAL	IORDWF
	LAC	IORDPB	/SET XR WITH PARTITION BLOCK ADDRESS.
	PAX
	LAC	P.TP,X
	SNA
	JMP	IORDFR	/COUNT IS NOW ZERO.
	JMS	PENP	/PICK AN EMPTY NODE FROM THE POOL.
			/(R1, R6, XR & AC ARE ALTERED).
			/IS THE POOL EMPTY?
	JMP	IORDNM	/YES -- CAN'T PRINT THE MESSAGE.
	IAC		/ SET UP X13 TO FILL THE NODE WITH TERMIN-
	DAC	X13	/ATION NOTICE INFORMATION.
	LAC	IORDSN	/SET XR WITH THE TASK'S STL NODE ADDRESS.
	PAX
	LAC	S.N1,X
	DAC*	X13	/STORE TASK NAME (FIRST HALF).
	LAC	S.N2,X
	DAC*	X13	/STORE TASK NAME (SECOND HALF).
	LAC	(4)	/SET TERMINATION INDICATOR FOR "NON-0 TRANSFERS
	DAC*	X13	/PENDING COUNT".
	LAC	IORDPB	/SET THE XR WITH THE TASK'S PARTITION BLOCK
	PAX		/NODE ADDRESS.
	LAC	P.TP,X
	DZM	P.TP,X
	DAC*	X13
	.IFUND NOMAC						/(161)
	LAC P.FW,X	/ FETCH FLAG WORDS.			/(161)
	AND (760)	/ EXTRACT USER NUMBER.			/(161)
	PAL		/ SAVE FOR LATER TEST.			/(161)
	SNA		/ IS THIS A MULTIACCESS TASK?		/(161)
	JMP IORTC1	/ NO.					/(161)
	LAC R2		/ FETCH TERMINATION NOTICE NODE ADDRESS	/(161)
	PAX		/ SET UP TO ACCESS NODE.		/(161)
	CLA!IAC		/ TERMINATION NOTICE EXIT CODE IS ONE	/(161)
	DAC T.EC,X	/ SET CODE IN NODE.			/(161)
	LAC (TDV.EQ)	/ FETCH CORRECT NODE LIST.		/(161)
	JMP IORTC2	/ REJOIN COMMON CODE.			/(161)
IORTC1=.							/(161)
	.ENDC							/(161)
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST.
IORTC2	DAC R1		/ ADD NODE TO CORRECT LIST.		/(161)
	JMS	NADD	/(R2, R6, XR & AC ARE ALTERED).
	.IFUND NOMAC						/(161)
	PLA		/ FETCH MULTIACCESS USER NUMBER FROM LR	/(161)
	SNA		/ AC >< 0 => MULTIACCESS.		/(161)
	.ENDC							/(161)
	CAL	RQTTN	/REQUEST THE TASK TERMINATION NOTICE TASK.
IORDNM	JMP	IORDFR	/FREE UP THE PARTITION AND FLAG THE TASK
			/INACTIVE IN ITS STL NODE.
/
/ THE CURRENT PDVL NODE DOESN'T POINT TO AN ACTIVE I/O HANDLER BECAUSE
/ THE TRIGGER EVENT VARIABLE POINTER CONTAINS ZERO.
/
IORDNA	DBK		//DEBREAK TO LEVEL 7.
	LAC	(POOL)	//EMPTY POOL LISTHEAD.
	DAC	R1
	JMS	NADD	/ADD UNUSED ABORT NODE TO THE EMPTY POOL.
			/(R2, R6, XR & AC ARE ALTERED).
	JMP	IORDLP	/TRY NEXT PDVL NODE.
/
/ VARIABLES.
/
IORDAT	0		/ IORD NODE ADDRESS.			/(161)
IORDTG	0		/IORD'S TRIGGER EVENT VARIABLE.
IORDEV	0		/IORD'S EVENT VARIABLE.
IORDPD	0		/PHYSICAL DEVICE NODE ADDRESS.
IORDPN	0		/NAME OF THE PREVIOUS DEVICE IN THE PDVL
			/NODE MOST RECENTLY SCANNED.
IORDSN	0		/TASK'S STL NODE ADDRESS.
IORDPB	0		/TASK'S PARTITION BLOCK ADDRESS.
IORDHT	0		/I/O HANDLER'S TRIGGER EVENT VARIABLE ADDRESS.
IORDPP	.SIXBT	"PP"	/PHYSICAL DEVICE NAME FOR THE PAPER TAPE PUNCH.
/
/ CAL PARAMETER BLOCKS.
/
IORDUM	23		/"UNMARK" CPB.
	0		/NO EVENT VARIABLE.
	XX		/TASK NAME (FIRST HALF).
	XX		/TASK NAME (SECOND HALF).
/
IORDMK	13		/"MARK TIME" CPB.
	IORDEV
	2		/FOR 2
	1		/TICKS.
/
IORDRS	07		/"RESUME" CPB.
	0		/NO EVENT VARIABLE.
	.SIXBT	"PP."	/TASK NAME (FIRST HALF).
	.SIXBT	"..."	/TASK NAME (SECOND HALF).
	0		/RESUME FOLLOWING THE SUSPEND.
/
IORDWT	20		/"WAITFOR" CPB.
	IORDTG		/THE TRIGGER EVENT VARIABLE.
/
IORDWF	20		/"WAITFOR" CPB.
	IORDEV		/THE EVENT VARIABLE.
/
/ ACTIVE TASK LIST NODE.
/
IORD	SFG		/FORWARD LINKAGE.
	TTY		/BACKWARD LINKAGE.
	.SIXBT	"IOR"	/TASK NAME (FIRST HALF).
	.SIXBT	"D@@"	/TASK NAME (SECOND HALF).
	10		/TASK PRIORITY (SEE NOTE BELOW).
	IORDIC-P.TP	/"PARTITION BLOCK" ADDRESS.		/(173)
	0		/STL NODE ADDRESS (NONE).
	4		/TASK STATUS (INITIALLY READY TO RUN).
	IORDTW		/RESUMPTION ADDRESS.
	0		/EVENT VARIABLE.
	.IFPNZ	NDSZMT
	.REPT	NDSZMT
	0
	.ENDC
/
/ THE PRIORITY OF "IORD" MUST BE LOWER THAN THAT OF ALL I/O HANDLER TASKS
/ IN ORDER TO AVOID AN ERRONEOUS ERROR MESSAGE INDICATING THAT THE TRANS-
/ FERS PENDING COUNT IS NON-0. THE PROBLEM ARISES WHEN THE LAST HANDLER
/ IN THE PHYSICAL DEVICE LIST IS OF LOWER PRIORITY THAN "IORD" AND
/ IT SETS IORD'S EVENT VARIABLE AND DECLARES A SIGNIFICANT EVENT BEFORE
/ CALLING "IOCD" TO DECREMENT THE TRANSFERS PENDING COUNT. SINCE "IORD"
/ IS OF HIGHER PRIORITY, IT GETS CONTROL BEFORE THE COUNT IS DECREMENTED,
/ HENCE THE ERRONEOUS MESSAGE. IF A HANDLER HAPPENS TO BE INSTALLED WITH
/ A LOWER PRIORITY, "IORD" GIVES IT A CHANCE BY MARKING TIME FOR TWO
/ CLOCK TICKS BEFORE CHECKING THE COUNT FOR A SECOND TIME. BY THE WAY,
/ THERE IS SPECIAL CODE IN THE "ABORT" MCR FUNCTION TO AVOID ABORTING
/ "IORD".
/
/ "PARTITION BLOCK" (REGISTER SAVE USE ONLY).
/
IORDIC	SHPB,L.MAC
/
	.IFUND L.ALL						/EAG:202
	.NOLST							/(176)
	.ENDC							/EAG:202
	.IFDEF %QDBG						/(176)
	.LST							/(176)
	.TITLE *** SCAN DEQUEUES FOR MULTIPLE NODES ***		/(176)
								/(176)
/ THIS SET OF SUBROUTINES IS AN ATTEMPT AT AN INTELLIGENT	/(176)
/ DEBUGGING AID FOR RSX. IT IS CALLED EACH TIME A NODE IS ADDED	/(176)
/ TO ANY LIST. IT'S FUNCTION IS TO  SCAN ALL SIGNIFICANT SMALL	/(176)
/ NODE DEQUES FOR THE NODE ADDRESS. THIS CODE IS INCLUDED BY	/(176)
/ STATING THE ASSEMBLY PARAMETER %QDBG				/(176)
/ CALL FORMAT:							/(176)
/								/(176)
/	JMS QDBG						/(176)
/	LAC NODEADDR						/(176)
/	...		/ RETURN POINT. NO REGISTERS ALTERED.	/(176)
								/(176)
QDBG	XX		/ ENTRY POINT.				/(176)
	.INH		/ THE Q SCANS WILL BE RUN INHIBITED.	/(176)
	DAC Q.ACS	/ SAVE THE AC.				/(176)
	PXA		/ SAVE THE XR.				/(176)
	DAC Q.XRS						/(176)
	XCT* QDBG	/ FETCH THE NODE ADDRESS.		/(176)
	DAC Q.NODE	/ NODE ADDRESS.				/(176)
	ISZ QDBG	/ SET UP RETURN ADDRESS.		/(176)
								/(176)
	.IFUND NOMAC						/(176)
	LAC (TDV.EQ)						/(176)
	JMS QSCAN						/(176)
	HLT							/(176)
	.ENDC							/(176)
								/(176)
	LAC (TNRL)						/(176)
	JMS QSCAN						/(176)
	HLT							/(176)
								/(176)
	LAC (IORDQ)						/(176)
	JMS QSCAN						/(176)
	HLT							/(176)
								/(176)
	LAC (POOL)	/ FETCH LIST HEAD.			/(176)
	JMS QSCAN	/ SCAN LIST.				/(176)
	HLT		/ ERROR.				/(176)
								/(176)
	LAC (STKL)	/ FETCH LIST HEAD.			/(176)
	JMS QSCAN	/ SCAN LIST.				/(176)
	HLT		/ ERROR.				/(176)
								/(176)
	LAC (ATKL)	/ FETCH LIST HEAD.			/(176)
	JMS QSCAN	/ SCAN LIST.				/(176)
	HLT		/ ERROR.				/(176)
								/(176)
	LAC (CKQ)	/ FETCH LIST HEAD.			/(176)
	JMS QSCAN	/ SCAN LIST.				/(176)
	HLT		/ ERROR.				/(176)
								/(176)
	LAC PDVL	/ FETCH PDVL NODE ADDRESS.		/(176)
Q.PLP	DAC Q.PDVL	/ SET UP ACCESS.			/(176)
	SAD (PDVL)	/ DONE WITH SCAN?.			/(176)
	JMP Q.DONE	/ YES.					/(176)
	AAC D.QF	/ CALC DEQUEUE ADDRESS.			/(176)
	JMS QSCAN	/ SCAN LIST.				/(176)
	HLT		/ ERROR.				/(176)
	LAC* Q.PDVL	/ FETCH NEXT NODE ADDRESS.		/(176)
	JMP Q.PLP	/ CONTINUE SCAN.			/(176)
								/(176)
Q.DONE	LAC Q.XRS	/ RESTOR XR.				/(176)
	PAX							/(176)
	LAC Q.ACS	/ RESTORE AC.				/(176)
	JMP* QDBG	/ RETURN TO CALLER.			/(176)
	.EJECT							/(176)
								/(176)
QSCAN	XX		/ SCAN AN ARBITRARY QUE.		/(176)
	DAC Q.LH	/SAVE LIST HEAD ADDRESS.		/(176)
Q.SL	PAX		/ ACCESS NEXT NODE.			/(176)
	LAC 0,X		/ FETCH FP.				/(176)
	SAD Q.LH	/ END OF LIST?				/(176)
	JMP QS.DON	/ YES.					/(176)
	SAD Q.NODE	/ SAME ADDRESS?				/(176)
	JMP* QSCAN	/ YES, TAKE ERROR EXIT.			/(176)
	JMP Q.SL	/ CHECK NEXT NODE.			/(176)
								/(176)
QS.DON	ISZ QSCAN	/ TAKE NORMAL EXIT.			/(176)
	JMP* QSCAN						/(176)
								/(176)
Q.LH	XX		/ LIST HEAD FOR QSCAN.			/(176)
Q.NODE	XX		/ NODE ADDRESS TO SCAN FOR.		/(176)
Q.ACS	XX		/ AC SAVE AREA.				/(176)
Q.XRS	XX		/ XR SAVE AREA.				/(176)
Q.PDVL	XX		/ CURRENT PDVL NODE FOR I/O DEQUES.	/(176)
	.ENDC							/(176)
	.LST							/(176)
