	.TITLE +++ XVM/RSX EXECUTIVE VERSION 1A (PART 1) +++
/
/ COPYRIGHT (C) 1975
/ 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=100160	/PART ONE [OF SOURCE FILE] EDIT NUMBER
/
/
/ 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
/
/ NOTE: ASSEMBLING RSX.P1 160 WITH RSX.P2 161 DEFINES
/	VERSION 1A OF THE XVM/RSX EXECUTIVE.
/ 
	.ABSP	NLD
/
/ CONDITIONAL ASSEMBLY PARAMETERS
/
	.DEC
/
	.IFUND	NLU	/NUMBER OF LOGICAL (I/O) UNITS
NLU=64			/DEFAULT: 64
	.ENDC
	.IFNEG	NLU-22
	.END --- NUMBER OF LUNS MUST BE => 22
	.ENDC
/
	.IFUND	TTYS	/MAX NUMBER OF TTY'S
TTYS=6			/DEFAULT: 6
	.ENDC
	.IFNEG	TTYS-1
	.END --- ILLEGAL NUMBER OF TTYS
	.ENDC
	.IFPNZ	TTYS-17
	.END --- ILLEGAL NUMBER OF TTYS
	.ENDC
/
	.IFUND	NDSZ	/LIST NODE SIZE
NDSZ=10
	.ENDC
	.IFNEG	NDSZ-10
	.END --- ILLEGAL NODE SIZE
	.ENDC
/
	.IFUND	DSKMA	/MAX NUMBER OF DSK I/O ATTEMPTS (IN CASE OF ERR)
DSKMA=8
	.ENDC
/
	.OCT
/
/ DEFINING 'NOXM' PRODUCES A VERSION IN WHICH THE CODE
/ OCCUPIED BY THE SHARE DIRECTIVE AND TASK TIMING ROUTINE
/ IS REPLACED BY SMALL NODES.
/
/ DEFINING 'USRTAB' NON-ZERO PRODUCES A VERSION CONTAINING A TABLE
/ TO TRACK SYSTEM USERS.  THIS TABLE CURRENTLY HAS NO USE IN RSX.
/ 
 .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
/
	.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
/
	.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)
	.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)
/
/ 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).
/
	.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	/MODE INDICATOR [MT]
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:
/   0 = EXEC MODE; NON-0 = NORMAL MODE
/
/ 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)
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.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.FE-P.FP+1	/TOTAL SIZE OF PARTITION BLOCK (INC FP BUFFER)
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 PARTITION.  IT IS INCREMENTED WHEN A TASK IS FIXED OR REQUESTED
/ AND WHENEVER A SHARE DIRECTIVE IS ACCEPTED 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 P.TC CAN BE CONSIDERED THE 'PARTITION OCCUPIED' FLAG.
/ 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 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 NORMAL MODE TASK EXITS OR IS ABORTED AND ITS "TRANSFERS
/ 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
/ 
/ 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
/
	.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
/ 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.)
/   -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 RESTRICTIVE USAGE OF DIRECTIVE (TC., SHR. & SPYST.)
/ -101	OUT OF RANGE LOGICAL UNIT NUMBER (IO.)
/ -102	UN-ASSIGNED LOGICAL UNIT NUMBER (IO.)
/ -103	NON-RESIDENT DEVICE HANDLER (IO.)
/ -104	CONTROL TABLE ARGUMENT ERROR (DVH SHR. SY. RN. SC. MT. SPY. & SPYST.)
/ -201	TASK NOT IN SYSTEM (RQ. XE. SC. RN. SY. DA. EA., FX., UF., CN., UM.)
/ -202	TASK IS ACTIVE (RQ.,XE., FX.) OR NOT ACTIVE (RS.)
/ -203	CAL NOT TASK ISSUED (SC. RN. SY. MT. DVH SJ. PI. SPY. SPYST. QJOB.
/			     TC. TN. RB. SHR.)
/ -204	TASK IS DISABLED (RQ.,XE., SC., RN., SY., FX.)
/ -205	TASK NOT SUSPENDED (RS.)
/ -206	ILLEGAL TASK PRIORITY (RQ. XE. SC. RN. SY.)
/ -207	TASK ALREADY FIXED (FX.) OR NOT FIXED (UF.)
/ -210	PARTITION OCCUPIED (FX.)
/ -211	PARTITION NOT IN SYSTEM (.PI)
/ -212  STL NODE LOST PARTITION THRU RECONFIGURATION.(RQ. RN. SY. XE. SC. FX. EA.)
/ -213  PARTITION OR SYSTEM COMMON IN PROCESS OF RECONFIGURATION.(RQ. RN. 
/					SY. XE. SC. FX. EA. SHR.)
/ -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
/	RQ. -- 'REQUEST' DIRECTIVE
/	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"
/
	.DEFINE	INTENTRY,I
/
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
/
/ 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.
/
	.DEFIN	SHPB
/
	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
	.ENDM
/
/ ASCII TEXT LINE WITH HEADER
/
	.DEFIN	TEXT,N,B,T
MES@N=.
	M..@N-MES@N/2*1000+2
	0
	.ASCII :B:<T>
M..@N=.
	.ENDM
 .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
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
 .TITLE *** HARDWARE DEFINED REGISTERS
/
/ 00000 -- PI INTERRUPT RETURN PARAMETER STORAGE
/ 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
/
	.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	CALIXX		/THE SYSTEM'S SAVE & RESTORE FACILITY.
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)
/
NADD	0		/// ADD NODE TO DEQUE
	LAC	.-1	///
	JMP	NADDE
/
NDEL	0		/// DELETE NODE FROM DEQUE
	LAC	.-1	///
	JMP	NDELE
/
PENP	0		/// PICK EMPTY NODE FROM POOL
	LAC	.-1	///
	JMP	PENPE
/
PICK	0		/// PICK NODE FROM A DEQUE
	LAC	.-1	///
	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		/WORD USED BY RSX BATCH
/
/ 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
/
	.BLOCK	1	/UNUSED
/
SLIPTR	SLICNT		/POINTER TO THE TICK COUNTER USED IN TIME SLICING
/
/ 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
FAC	0		/ENTRY TO: FETCH A CHARACTER
	JMP	FACE
/
/ 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
/
SPYBLK	.BLOCK	12	/FOR USE OF BATCH
XSIZE	0		/INDICATES TOP OF THE EXEC (SCF SET)
	.BLOCK	3	/EXTRA SPACE
/
/ 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.
	.IFDEF	USRTAB
USERT1	USERT		/START OF THE USER I.D. TABLE (UNUSED)
USERT2	USERT+USRTAB-1	/END OF THE USER I.D. TABLE (UNUSED)
	.ENDC
	.IFUND	USRTAB
	.BLOCK	2
	.ENDC
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
	DSADKC		/ADDRESS OF THE GET/PUT CONTROL TABLE FOR THE
			/DISK ALLOCATE - DEALLOCATE TASK
			/(THIS IS USED BY THE MCR FUNCTION ...SAV TO SEE
			/THAT THE CURRENT BIT MAP IS WRITTEN OUT)
/
SPY1	SPYBLK		/START OF THE SPY AREA (A POINTER)
SPY2	SPYBLK+11	/END OF THE SPY AREA (A POINTER)
JOB1	.		/HEADER OF THE QUEUE JOB DEQUE
JOB2	.-1		/BACK POINTER TO THE QUEUE JOB DEQUE
/
/ RE-ENTRANT ROUTINES FOR I/O HANDLER TASKS
/
ALAD	0		/// ATTACH LUN & DEVICE-UNIT TO INDICATED TASK
	LAC	.-1	///
	DAC	R6
	LAC	(ALAD1)
	JMP	ATDT
/
DLAD	0		/// DETACH LUN & DEVICE FROM TASK
	LAC	.-1	///
	DAC	R6
	LAC	(DLAD1)
	JMP	ATDT
/
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
	LAC	.-1	/// PENDING COUNT.
	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
/
 .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)
	TTYPI	/[--] CONSOLE TTY PRINTER **
	TTYKI	/[--] 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
	DAC	SAPIB1	/SAVE AC
	ION		/RE-ENABLE PI
	MPSK		/MEMORY PROTECT VIOLATION?
	JMP	.+3
	LAC	ITVTB+43 /YES -- SELECT TV ADR
	JMP	SAPCC
	TSF		/NO -- CONSOLE TTY PRINTER?
	JMP	.+3
	LAC	ITVTB+40 /YES -- SELECT TV ADR
	JMP	SAPCC
	KSF		/NO -- CONSOLE TTY KEYBOARD?
	JMP	.+3
	LAC	ITVTB+41 /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' VIA LOCATIONS 20 & 21.
/ THE CAL OPERAND IS EXPECTED TO BE A CAL PARAMETER BLOCK (CPB) IN
/ THE SAME PAGE AS THE CAL INSTRUCTION AND DIRECTLY ADDRESSED BY
/ THE CAL (NO IMMEDIATE, INDIRECT, OR INDEXED CAL'S).  THE FIRST
/ WORD OF THE PARAMETER BLOCK IS EXPECTED TO CONTAIN A CAL FUNCTION
/ CODE IN BITS 12-17.
/
/ 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 EFFECT A CAL-INDIRECT TRAP.)
/
/ REGISTER USAGE: R1, R2, R3, X10, X11, L20, XR & AC
/
/ CAL'S WITH THE INDIRECT BIT SET, AND "NORMAL MODE" CAL'S WITH ILLEGAL
/ CPB OR EVENT VARIABLE ADDRESSES, RESULT IN TASK TERMINATION.  (A CAL
/ INDIRECT FROM AN INTERRUPT SERVICE ROUTINE IS NOT DETECTED.)  BOTH
/ HARDWARE AND SOFTWARE IGNORE BIT-5 (THE INDEX BIT) IN CAL'S EXECUTED
/ IN PAGE MODE.
/
CALDSP	DBA		/SET INDEX MODE
	RPL		/SET X11 BITS 10-16 TO INDICATE ACTIVE
	AND	(366)	/API LEVELS 0-6.
	DAC	X11
/
	LAC	L20	/CONSTRUCT A MASK IN R2 TO REMOVE A 12 OR
	RAL		/13 BIT (PAGE OR BANK MODE) DIRECT ADDRESS
	SPA!CLA		/FIELD FROM A 15-BIT CAL INST ADDRESS, AND
	LAC	(010000)/CONSTRUCT AN ADDRESS FIELD MASK IN R1.
	XOR	(070000)
	DAC	R2
	CMA
	AND	(077777)
	DAC	R1
/
	LAC	L20	/SET HIGH ORDER (PAGE OR BANK) BITS IN R3
	AND	R2
	DAC	R3
/
	LAC	L20	/SET R1 TO THE 15-BIT CAL INSTRUCTION ADDRESS
	AND	R1	/(USING THE ADDRESS FIELD MASK IN R1 ADJUST FOR
	AAC	-1	/PAGE OR BANK WRAP-AROUND).
	SPA
	LAC	R1
	XOR	R3
	DAC	R1
/
	LAC	L20	/SET XR TO THE 17-BIT CAL INSTRUCTION ADDRESS.
	RTL
	SPA!CLA
	LAC	CTBIAS
	TAD	R1
	PAX
/
	LAC	0,X	/TERMINATE TASK IF CAL INSTRUCTION WAS FETCHED
	SNA		/EITHER AS A RESULT OF EXECUTING A ZERO (DEFINED
	JMP	CALTT	/BAD AS AN AID TO DEBUGGING), OR AS A RESULT OF
	AND	(740000)/AN "XCT" INSTRUCTION.
	SZA
	JMP	CALTT
/
	LAC	R2	/SET AC TO A 15-BIT CPB ADDRESS BY FETCHING
	CMA		/AN ADDRESS FIELD (12 OR 13 BITS) FROM A CAL 
	AND	0,X	/INSTRUCTION AND OR'ING HIGH ORDER (PAGE OR
	XOR	R3	/BANK) ADDRESS BITS. 
/
	JMS	CACAJ	/CHECK ADDRESS (IF "NORMAL MODE") AND RETURN
			/A 17-BIT CPB ADDRESS IN AC (R1 & R2 ARE ALSO
			/ALTERED).  IF ILLEGAL ADDRESS, THE ISSUING
			/TASK IS TERMINATED.
/
	PAX		/PUT THE CPB ADDRESS IN XR & X10
	DAC	X10
	LAC	0,X	/FETCH THE CAL FUNCTION CODE (BITS 12-17
			/OF THE FIRST CPB WORD)
	AND	(40)	/IS CAL FUNCTION CODE IN RANGE OF 40-77 (OCTAL)?
	SZA
	JMP	CALTT	/YES -- BAD CAL (FUNCTION IS UNIMPLEMENTED)
	LAC	0,X	/NO -- IS FIRST CPB WORD ZERO?
	SNA
	JMP	CALTT	/YES -- BAD CAL (DEFINED AS SUCH TO AID DEBUGGING)
	AND	(77)	/NO -- ARE OTHER THAN CAL FUNCTION CODE BITS SET?
	SAD	0,X
	JMP	CALD2	/NO -- CAL FUNCTION CODE MUST BE NON-ZERO, DISPATCH
			/PER CAL FUNCTION CODE IN AC.
	SNA		/YES -- IS FUNCTION CODE ZERO (QUEUE I/O)?
	JMP	IO.	/YES -- TRANSFER TO QUEUE I/O SERVICE ROUTINE
			/WITH XR & X10 POINTING TO THE CPB.
	JMP	CALTT	/NO -- BAD CAL (BITS 0-11 SET ON A NON-QUEUE
			/I/O DIRECTIVE.
/
CALD2	TAD	(CALDT-1)/TRANSFER CONTROL PER DISPATCH TABLE WITH
	DAC	R2	/XR & X10 POINTING TO THE CPB
	JMP*	R2
/
/ 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	CALTT	/36
	JMP	TC.	/37	TRANSFER COMMAND [STRING] TO TDV FUNCTION
			/40-77	FLAGGED ILLEGAL IN TEST PRIOR TO DISPATCH
/
/ 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
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 "TRAP" A CAL INDIRECT.
	DAC	R1
	LAC	(CALIXX)
	DAC	L20
	DBR
	JMP*	R1
/
/ CAL INDIRECT TRAP
/
CALIXX	0
	DBA
	LAC	CALIXX
	DAC	L20
	JMP	CALTT
 .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.
	DAC	R2	/NO -- SAVE NODE ADDRESS (FOR 'NADD') IN R2
	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.
/
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST
	DAC	R1
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
/
	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 *** '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.
/
/ 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 (NORMAL MODE) AND SET X14
	JMS	CPBRX	/TO THE 17-BIT EVENT VARIABLE ADDRESS.
/
	LAW	-NLU	/CHECK RANGE OF LOGICAL UNIT NUMBER
	TAD	2,X	/TOO LARGE?
	SMA!SZA
	JMP	CX101	/YES -- SET EVENT VAR TO -101
	LAC	2,X	/NO -- TOO SMALL?
	SPA!SNA
	JMP	CX101	/YES -- SET EVENT VAR TO -101
	PAX		/NO -- IS LUN ASSIGNED TO A PHYSICAL
	LACIX	(LUT-1)	/DEVICE (DOES LUT SLOT CONTAIN A PHYSICAL
	SNA		/DEVICE NODE ADDRESS)?
	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
			/(R1, R6, XR, & AC ARE ALTERED)
			/IS POOL EMPTY?
	JMP	CX777	/YES -- SET EVENT VARIABLE TO -777
	DAC	R2	/NO -- SAVE NODE ADR IN R2 (FOR 'SPRI')
	IAC		/AND SETUP X13 TO FILL NODE.
	DAC	X13
/
	LAC	X11	/WAS CAL ISSUED FROM A TASK (API-7)?
	SNA
	JMP	IO.2
	DZM*	X13	/NO -- SET "STL" & "MODE" WORDS TO ZERO, AND
	DZM*	X13	/"PRIORITY" WORD TO ONE. (REQUEST NODE WORDS
	LAC	(1)	/2, 3, & 4)
	DAC*	X13
	JMP	IO.3
/
IO.2	LAC	CURTSK	/YES -- SET "STL", "MODE", & "PRIORITY" WORDS 
	PAX		/PER ACTIVE TASK LIST NODE.
	LAC	A.SN,X
	DAC*	X13	/(WD 2)
	LAC	A.RA,X
	RTL
	SPA!CLA
	LAC	A.PB,X
	PAL		/(SAVE MODE INDICATOR IN LR)
	DAC*	X13	/(WD 3)
	LAC	A.TP,X
	DAC*	X13	/(WD 4)
/
	PLA		/WAS REQUESTING TASK IN "NORMAL MODE"?
	SNA
	JMP	IO.3	/NO -- (LR=0) DO NOT CHANGE TRANSFERS PENDING CNT.
	PLX		/YES -- (LR=PARTITION BLOCK ADR) INCREMENT
	ISZ	P.TP,X	/TRANSFERS PENDING COUNT (IN PARTITION BLOCK).
/
IO.3	LAC	X10	/SETUP XR TO ACCESS CPB
	PAX
/
	LAC	0,X	/SET LUN & I/O FUNCTION CODE
	LRS	6
	AND	(000777)
	DAC	X15
	LAC	2,X
	SWHA
	AND	(777000)
	XOR	X15
	DAC*	X13	/(WD 5)
/
	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 DEQUE (LIST HEAD IN PHYSICAL
	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)
	DAC	R1
	.INH		/INHIBIT INTERRUPTS.
	LAC*	R1	///SET BIT 0 OF TRIGGER.
	AND	(377777)///
	TAD	(400000)///
	.ENB		///ENABLE INTERRUPTS.
	DAC*	R1	///
/
	.SET6		/DECLARE A "SIGNIFICANT EVENT"
	JMP	CXPND	/CLEAR EVENT VARIABLE AND EXIT CAL SERVICE ROUTINE 
 .TITLE *** 'REQUEST' & 'FIX' DIRECTIVES
/
/ 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).
/
/ 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, 2-FIX
/	X12 -- SPECIFIED PRIORITY OR ZERO (FROM CPB)
/	X13 -- GENERAL AUTO INCREMENT REGISTER
/	R3 -- ADDRESS OF SYSTEM TASK LIST ENTRY
/	R4 -- ADDRESS OF ACTIVE TASK LIST NODE
/
/ 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"
	JMS	SSTL	/SCAN STL FOR TASK NAME -- FOUND?
			/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
/
/ 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
	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
	IAC		///YES -- FLAG PARTITION OCCUPIED
	DAC*	R6	///AND FLAG TASK ACTIVE AND
	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
	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	DAC	R4	/SAVE NODE ADDRESS IN
	IAC		/R4 AND SETUP AUTO-INCREMENT REGISTER X13
	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 OR FIX
	SZA
	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
	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)
	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	(ATKL)	/ADD NODE TO ATL PER PRIORITY
	DAC	R1	/(R1, R2, R3, R6, XR, & AC ARE ALTERED)
	LAC	R4	/***
	DAC	R2
	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 POINT TO RESCHEDULE INTERVAL
	DAC	X15
	DAC	X16	/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 X12 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*	SCHINT	/NO -- RETURN
	LAC*	X16	/YES -- GET THE UNITS
	JMS	SCHIN1	/GO CHECK TO SEE IF BETWEEN 1 AND 4
	JMP*	SCHINT	/RETURN
/
/ 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	S.EP,X	//GET TASK EXECUTION MODE
	AND	(100000
	DAC	SY.S2	//SAVE MODE TEMPORARILY
	LAC	X12	//WAS A PRIORITY SPECIFIED?
	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
	DAC	R2	//NO -- SAVE NODE ADR IN R2 (FOR 'CQI')
	PAX		//SETUP XR TO FILL NODE FOR CLOCK QUEUE
/
	DZM	C.TI,X	//SET TYPE INDICATOR FOR "NO RESCHEDULING"
	LAC	SY.S2	//SET MODE INDICATOR
	DAC	C.MD,X
	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
	DAC	R2	/NO -- SAVE ADDRESS OF NODE IN R2 (FOR 'CQI'),
	PAL		/AND IN LR (FOR NODE FILL).
/
	LAC	CURTSK	/"EXEC" OR "NORMAL" MODE REQUESTOR?
	PAX
	LAC	A.RA,X
	AND	(100000)
	DAC	X16	/0=EXEC MODE; NON-0=NORMAL MODE.
	SNA
	JMP	MT.2	/"EXEC".
	LAC	A.PB,X	/"NORMAL" -- INCREMENT TRANSFERS PENDING
	PAX		/COUNT (IN PARTITION BLOCK).
	ISZ	P.TP,X
	NOP
	PXA
	SKP
MT.2	LAC	A.PB,X	/SAVE PARTITION BLOCK ADDRESS.
	DAC	X15
/
	PLX		/SETUP XR TO FILL NODE
/
	LAC	(+5)	/SET CLOCK NODE TYPE INDICATOR
	DAC	C.TI,X
/
	LAC	X16	/SET EXEC/NORMAL MODE INDICATOR.
	DAC	C.MD,X
/
	LAC	X15	/SET PARTITION BLOCK ADDRESS.
	DAC	C.SP,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
	JMP	CU.3	/YES -- NULLIFY THE CLOCK NODE
	JMP	CU.2	/NO -- EXAMINE NEXT NODE
/
CU.3	LAC	(6)	/NULL CLOCK NODE
	DAC	C.TI,X
	XCT	R1	/SKIP IF CANCELLED MARK TIME REQUEST.
	JMP	CU.2	/NO -- EXAMINE NEXT NODE.
	LAC	C.MD,X	/YES -- NORMAL MODE REQUESTER?
	SNA
	JMP	CU.2	/NO -- EXAMINE NEXT NODE.
	PXL		/YES -- SAVE XR.
	LAC	X13	/SET XR TO ACCESS PARTITION BLOCK NODE.
	PAX
	LAC	P.TP,X	/DECREMENT THE "TRANSFERS PENDING" COUNT
	SNA		/IF NOT ALREADY ZERO.
	JMP	.+3
	AAC	-1
	DAC	P.TP,X
	PLX		/RESTORE THE XR.
	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	///
	SAD	(3)	///SET EVENT VARIABLE ADDRESS IF 'WAITFOR'
	SKP		///
	JMP	.+3	///
	LAC	X14	///
	DAC	A.EV,X	///
	LAC	L20	///SET RESUMPTION ADDRESS IN ATL
	DAC	A.RA,X	///
	LAC	(CALIXX)///RESET 'L20' TO EFFECT TRAPPING CAL INDIRECT
	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	(CALIXX)/RESET L20 TO EFFECT TRAPPING CAL INDIRECT
	DAC	L20
/
	LAC	CURTSK	/DELETE NODE FROM ACTIVE TASK LIST.
	DAC	R1	/('CURTSK' POINTS TO ACTIVE TASK LIST NODE)
	JMS	NDEL	/(R1, R2, R6, XR, & AC ARE ALTERED)
/
	LAC	CURTSK	/ATL NODE ADR
	SAD	TDVCTF	/CURRENT TDV FUNCTION?
	JMP	EX.5	/YES -- TDV FLAG MIGHT NEED TO BE CLEARED.
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.EP,X	/TASK ENTRY POINT
	RTL
	SMA		/SKIP IF NORMAL MODE TASK
	JMP	EX.3
	LAC	S.PB,X	/PARTITION BLOCK ADR
	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
	LAC	CURTSK	/INSERT ATL NODE IN ORDER OF PRIORITY
	DAC	R2
	JMS	SPRI	/(R1, R2, R3, R6, XR & AC ARE ALTERED)
/
	CLC		/SET "IORD'S" TRIGGER EVENT VARIABLE.
	DAC	IORDTG
	JMP	EX.4
/
EX.3	PLX		/SET XR WITH STL NODE ADR
	JMS	FREEUP	/SUBROUTINE, USED ALSO BY "IORD", TO FREE PARTI-
			/TION IF TASK NOT FIXED IN CORE AND TO SET TASK
			/INACTIVE IN STL NODE (XR & AC ARE ALTERED)
/
	LAC	(POOL)	/RETURN ATL NODE TO POOL
	DAC	R1
	LAC	CURTSK
	DAC	R2
	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)
/
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	CURTSK
	JMP	EX.2
/
/ 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
/
FREEUP	0
	.INH		/INHIBIT INTERRUPTS
	LAC	S.DP,X	///FLAG TASK INACTIVE IN STL NODE
	AND	(377777)///
	DAC	S.DP,X	///
	AND	(040000)///FIXED IN CORE?
	SZA		///
	JMP	FREEEX	///YES -- DON'T FREE PARTITION
	LAC	S.PB,X	///NO -- CLEAR BIT 0 IN THE PARTITION'S FLAG WORD
	PAX		///
	LAC	P.TC,X	///
	AAC	-1	///
	DAC	P.TC,X	///
FREEEX	.ENB		///ENABLE INTERRUPTS
	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
/	4*N	TASK NAME FIRST HALF
/	4*N+1	TASK NAME SECOND HALF
/	4*N+2	XM CLOCK OVERFLOWS
/	4*N+3	XM CLOCK TICKS ABOVE OVERFLOW COUNT
/
/ EXIT WILL TYPICALLY SET THE EVENT VARIABLE TO +1 WHEN BUFFER 1 IF FULL
/ AND +2 WHEN BUFFER 2 IF 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	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-3 FROM END
	TAD	X12		/MAKE COMBINED TEST ON 0-3
	AAC	4
	SNL!SMA!CLL		/SKIP IF NOT 0-3 FROM END
	JMP	EX.T7		/DECLARE #1 FULL (LINK=0 FLAG)
	LAC	4,X		/IS BUFFER 2 FULL
	CLL!CMA			/SAME TEST SEQUENCE
	TAD	X12
	AAC	4
	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
/
	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
	JMP	CX077	/EVENT VARIABLE TO -77
/
	LAC	TDVLB+0	/SETUP X17 AS A 2'S COMPL LOOP COUNTER TO MOVE
	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
/
	LAC	(TDVLB-1) /SETUP X15 AS SOURCE INDEX FOR MOVE
	DAC	X15
/
	LAC*	X15
	DAC*	X16
	ISZ	X17
	JMP	.-3
/
TC.3	DZM	TDVCTF	/CLEAR 'CURRENT TDV FUNCTION'
	ISZ	TDVEV2	/SET 'LINE MOVED' EVENT VARIABLE, AND DECLARE A
	.SET6		/SIGNIFICANT EVENT.
	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
	.TITLE *** 'QUEUE JOB' DIRECTIVE
/ 
/ 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
	PAL		/SAVE THE ADDRESS OF THE NODE
	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
	PLA
	DAC	R2
	JMS	NADD
	LAC	QJOB.1
	JMP	CXDAC	/RETURN EV OF +SSM
QJOB.1	0
	.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
	PXL			/SAVE THE XR
	JMS	PENP		/GET A NODE FROM THE POOL
	JMP	CX777		/RETURN HERE IF POOL EMPTY
	DAC	R2		/RETURN HERE IF OK AND SAVE ADR.
	IAC
	DAC	X13		/SET UP X13 TO PUT DATA INTO NODE
	PLX			/RESTORE THE XR
	LAC	2,X		/GET THE TASK NAME
	DAC*	X13
	LAC	3,X
	DAC*	X13
	LAC	4,X		/GET THE PRIORITY
	DAC*	X13
	LAC	5,X		/GET THE LUN
	DAC*	X13
	LAC	6,X		/GET THE PARTITION NAME
	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
/
/ 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
/
/ 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		//
	JMP	.
/
/ 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	//
	AAC	+P.IC	//
	DAC	L6TV	//
	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.PB,X	/SAVE XR IN LR AND SETUP XR
	PXL		/TO ACCESS PARTITION BLOCK
	PAX
	.INH		/(INHIBIT BECAUSE .SET6 WOULD RESTART ATL SCAN)
	LAC	P.TC,X	///IS PARTITION FREE  ?
	SZA		///
	JMP	M5	///NO -- ENABLE INTERRUPTS & CONTINUE ATL SCAN
	IAC		///YES -- FLAG PARTITION OCCUPIED.
	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.UP,X	///ZERO THE TASK USE COUNT POINTER
	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
/
	DAC	R2	//SAVE NODE ADDRESS IN R2 (FOR SPRI)
	IAC		//SETUP X10 TO FILL EMPTY NODE
	DAC	X10	//
	PLX		//
	LAC	A.SN,X	//TASK STL NODE ADDRESS
	DAC*	X10	//
	DZM*	X10	//"EXEC MODE" INDICATION
	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	PLX		//
	DBK		//
	JMP	S2	//
/
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	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
/
	LAC	L20	/SAVE L20
	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.FB	/SAVING FP15'S REGISTERS
	DAC	R1
	UNDST		/STORE EPA, FMA1 AND FMA2.
	R1+400000
	LAC	R1
	AAC	+P.FM-P.FB
	DAC	R1
	UNSWQ		/SWAP FMA AND FMQ.
	0
	EST		/STORE FMQ1 AND FMQ2.
	R1+400000
	IDX	R1
	IDX	R1
	SJE		/STORE JEA TO SAVE THE GUARD BIT.
	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
	ISZ	R1
	ISZ	R1
	LJE
	R1+400000
	LAC	R1
	AAC	P.FB-P.FE
	DAC	R1
	UNDLD
	R1+400000
/
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.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
/
	LAC	P.20,X	/RESTORE L20
	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:
/   R2, R6, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADR IN AC
/
NADDE	DAC	R6	/SAVE RETURN ADR IN R6
	.INH		/INHIBIT INTERRUPTS
/
NAD2	LAC*	R1	///ENTRY FROM 'SPRI' (R1, R2, & R6 ARE SET)
	DAC*	R2	///
	PAX		///
	LAC	R2	///
	DAC*	R1	///
	ISZ	R2	///
	LAC	1,X	///
	DAC*	R2	///
	LAC*	R1	///
	.ENB		///
	DAC	1,X	///
	JMP*	R6
/
	.EJECT
/ NDEL -- DELETE NODE FROM THREAD
/
/ CALLING SEQUENCE:
/   R1 -- ADDRESS OF NODE TO BE DELETED
/   JMS  NDEL
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   R1, R2, R6, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADR IN AC
/
NDELE	DAC	R6	/SAVE RETURN ADR IN R6
	.INH		/
	LAC*	R1	///
	DAC	R2	///
	PAX		///
	ISZ	R1	///
	LAC*	R1	///
	DAC	1,X	///
	PAX		///
	LAC	R2	///
	.ENB		///
	DAC	0,X	///
	JMP*	R6	/  RETURN AT JMS+1
/
	.EJECT
/ 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 AC & R1 IF POOL IS NOT EMPTY
/
/ REGISTERS ALTERED:
/   R1, R6, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN AC
/
PENPE	DAC	R6	/SAVE RETURN ADR IN R6
	.INH
	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		///
	LAC	(POOL)	///
	DAC	1,X	///
	PXA		///
	DAC	POOL	///
	LAC	R1	///RETURN AT JMS+2 WITH PICKED NODE ADR IN AC
	ISZ	R6	///
PENP1	.ENB		///
	JMP*	R6	///
/
	.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
/
/ REGISTERS ALTERED:
/   R2, R6, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADR IN AC
/
PICKE	DAC	R6	/SAVE RETURN ADR IN R6
	.INH
	LAC*	R1	///EMPTY DEQUE?
	SAD	R1	///
	JMP	PICK1	///YES -- RETURN AT JMS+1
	DAC	R2	///NO -- PICK NODE
	PAX		///
	LAC	0,X	///
	PAX		///
	LAC	R1	///
	DAC	1,X	///
	PXA		///
	DAC*	R1	///
	LAC	R2	///RETURN AT JMS+1 WITH PICKED NODE ADR IN AC
	ISZ	R6	///
PICK1	.ENB		///
	JMP*	R6	///
/
	.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 IF NAME FOUND
/
/ 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 R3 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, R2, R3, R6, XR, & AC
/
/ 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?
	SAD	R1	///
	JMP	PR2	/// YES -- ADD NODE AT END OF DEQUE
	PAX		/// 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
	LAC	1,X	/// YES -- SETUP R1 FOR 'NADD' AND ADD NODE 
	JMP	PR5	/// 'NADD' CODE.
PR2	PXA		///
PR5	DAC	R1	///
	JMP	NAD2	///
/
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, R5, R6, X10, X11, XR, & AC
/
/ COMMON CODE -- ENTRY FROM SCOM WITH RETURN ADDRESS IN R6 AND
/ DISPATCH ADDRESS IN AC.
/
ATDT	DAC	R5	/SAVE DISPATCH ADR ('ALAD1' OR 'DLAD1') IN R5
	LAC	R1	/SET ADDRESS OF PDVL NODE 'ATTACH FLAG' IN R3
	AAC	+D.AF
	DAC	R3
	LAC	R2	/SETUP X10 TO FETCH TASK STL NODE ADR (THIRD
	AAC	+1	/REQUEST NODE WORD), AND NORMAL MODE INDICATOR
	DAC	X10	/(FOURTH REQUEST NODE WORD).
	PAX
	LAC	1,X	/STL NODE ADR=0?
	SNA
	JMP	ATDTNT	/YES -- CAL NOT TASK ISSUED
	LAC	4,X	/SET LUN IN XR
	SWHA
	AND	(777)
	PAX
	TAD	(AFT-1)	/SET ATTACH-FLAG-TABLE SLOT ADDRESS IN X11
	DAC	X11
	.INH		///INHIBIT INTERRUPTS
	LACIX	(LUT-1)	///IS LUN ASSIGNED TO THE PHYSICAL DEVICE-UNIT
	SAD	R1	///INDICATED BY R1?
	JMP*	R5	///YES -- DISPATCH PER R5 WITH LUN IN XR
	.ENB		///NO -- RETURN AT JMS+1 WITH -24 IN AC
	LAW	-24	///
	JMP*	R6
ATDTNT	LAW	-203	/CAL NOT TASK ISSUED
	JMP*	R6
/
/ ATTACH LUN & PHYSICAL DEVICE-UNIT
/
ALAD1	LACIX	(AFT-1)	///IS LUN ALREADY ATTACHED?
	SZA		///
	JMP	ALAD2	///YES -- RETURN AT JMS+2
	LAC*	X10	///NO -- ATTACH LUN & DEVICE
	DACIX	(AFT-1)	///
	LAC	X11	///
	DAC*	R3	///
	LAC*	X10	///NORMAL MODE REQUESTOR?
	SNA		///
	JMP	ALAD2	///NO -- RETURN AT JMS+2
	PAX		///YES -- INCREMENT TRANSFERS PENDING COUNT
	ISZ	P.TP,X	///
ALAD2	.ENB		///
	ISZ	R6	///
	JMP*	R6
/
/ DETACH LUN & PHYSICAL DEVICE-UNIT
/
DLAD1	LACIX	(AFT-1)	///IS LUN STILL ATTACHED?
	SNA		///
	JMP	DLAD2	///NO -- RETURN AT JMS+2
	DZMIX	(AFT-1)	///YES -- DETACH LUN & DEVICE
	DZM*	R3	///
	ISZ	X10	///NORMAL MODE REQUESTOR?
	LAC*	X10	///
	SNA		///
	JMP	DLAD2	///NO -- RETURN AT JMS+2
	PAX		///YES -- DECREMENT TRANSFERS PENDING COUNT
	LAC	P.TP,X	///
	SZA		///
	AAC	-1	///
	DAC	P.TP,X	///
DLAD2	.ENB		///
	ISZ	R6	///
	JMP*	R6
/
/ 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).
/
/ 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
/
/ REGISTERS ALTERED:
/   R1, R2, R4, R5, R6, XR, & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN AC
/
DQRQ1	DAC	R5	/SAVE RETURN ADDRESS IN R5
/
	LAC	R1	/SET REQUEST QUEUE LIST HEAD IN R1
	PAX		/(PDVL NODE ADDRESS TO XR)
	AAC	+D.QF
	DAC	R1
	LAC	D.AF,X	/FETCH DEVICE-UNIT ATTACH FLAG
	DAC	R4	/SAVE ATTACH FLAG IN R4 IN CASE OF EXIT AT JMS+1
	SZA		/IS UNIT ATTACHED?
	JMP	DQRQ2	/YES -- SCAN REQUEST QUEUE FOR ATTACHED TASK
			/NAME AND PICK NODE.
	JMS	PICK	/NO -- PICK FIRST NODE (R2, R6, XR, & AC ARE ALTERED)
			/IS REQUEST QUEUE EMPTY?
	JMP	DQRQ4	/YES -- RETURN AT JMS+1 WITH ATTACH FLAG IN AC
	ISZ	R5	/NO -- RETURN AT JMS+2 WITH NODE ADDRESS IN AC
	JMP*	R5
/
DQRQ2	DAC	R2	/SETUP TO SCAN REQUEST QUEUE FOR STL NODE ADDRESS MATCHING
	LAC	R1	/THE STL NODE ADDRESS POINTED TO BY CONTENTS OF AC 
	PAX
DQRQ3	LAC	0,X	/SCAN LOOP -- END OF SCAN?
	SAD	R1
	JMP	DQRQ4	/YES -- RETURN AT JMS+1 WITH ATTACH FLAG IN AC
	PAX		/NO.
	LAC	4,X	/IS THIS A PRIORITY ZERO REQUEST, I.E., "ABORT"?
	SNA
	JMP	DQRQ5	/YES.
	LAC	2,X	/NO -- EXAMINE THIRD WORD OF NODE FOR DESIRED
	SAD*	R4	/STL NODE ADDRESS. MATCH?
	SKP
	JMP	DQRQ3	/NO -- CHECK NEXT NODE?
DQRQ5	PXA		/YES -- SAVE NODE ADDRESS IN R4
	DAC	R4
	DAC	R1	/AND DELETE NODE FROM REQUEST QUEUE.
	JMS	NDEL	/(R1, R2, R6, XR, & AC ARE ALTERED)
	ISZ	R5	/RETURN AT JMS+2 WITH NODE ADDRESS IN AC
/
DQRQ4	LAC	R4	/PICK UP REQUEST NODE POINTER OR ATTACH FLAG AND
	JMP*	R5	/EXIT AT JMS+2 OR JMS+1
/
/ 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	3,X
	SNA		/EXEC MODE TASK?
	JMP	VAJX2	/YES -- RETURN AT JMS+2, NO CHECKS, NO ADJUSTMENTS.
	PAX		/NO -- SETUP XR TO ACCESS PARTITION BLOCK
/
	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
/
/ 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:
/   R5, XR, & AC
/
IOCD1	DAC	R5	/SAVE RETURN ADDRESS IN R5
/
	LAC	R2	/SETUP XR TO ACCESS I/O REQUEST NODE
	PAX
	LAC	3,X	/EXEC MODE REQUESTOR?
	SNA
	JMP*	R5	/YES -- DO NOT ALTER COUNT WORD
	PAX		/NO -- SETUP XR TO ACCESS PARTITION BLOCK
	.INH		///AND DECREMENT TRANSFERS PENDING COUNT.
	LAC	P.TP,X	///
	SZA		///
	AAC	-1	///
	.ENB		///
	DAC	P.TP,X	///
	JMP*	R5
/
/ 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	///
/
/ 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.
/
/ 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
/
/ DMTQ -- DETACH LUN & PHYSICAL DEVICE; THEN EMPTY I/O QUEUE
/
/ IF THE INDICATED NORMAL MODE TASK IS ATTACHED TO THE PHYSICAL DEVICE,
/ DETACH IT. THEN, EMPTY THE I/O REQUEST QUEUE OF ALL REQUESTS MADE BY
/ THAT TASK.
/
/ CALLING SEQUENCE:
/   R1 -- ADDRESS OF THE PHYSICAL DEVICE NODE
/   R2 -- ADDRESS OF THE PICKED I/O REQUEST NODE
/   JMS* (DMTQ)
/
/ EXIT CONDITIONS:
/   RETURN AT JMS+1 UNCONDITIONALLY
/
/ REGISTERS ALTERED:
/   R1, R2, R3, R5, R6, X10, X11, X12, XR & AC
/
/ ENTRY FROM SCOM WITH RETURN ADDRESS IN THE AC.
/
DMTQ1	DAC	R3	/SAVE RETURN ADDRESS.
/
	LAC	R2	/SET X10 TO FETCH TASK STL NODE ADDRESS (THIRD
	IAC		/REQUEST NODE WORD) AND NORMAL MODE INDICATOR
	DAC	X10	/(FOURTH WORD).
	LAC	R1	/SET XR WITH THE PDVL NODE ADDRESS.
	PAX
	.INH		/INHIBIT INTERRUPTS.
	LAC	D.AF,X	///IS THE DEVICE ATTACHED?
	SNA		///
	JMP	DMTQ2	///NO.
	PAX		///YES -- SET XR TO ATTACH FLAG TABLE ENTRY,
	LAC	0,X	///WHICH POINTS TO THE STL NODE.
	SAD*	X10	///COMPARE STL NODE ADDRESSES.
	SKP		///SAME.
	JMP	DMTQ2	///DIFFERENT.
	DZM	0,X	///DETACH THE LUN.
	LAC	R1	///DETACH THE DEVICE BY CLEARING THE
	PAX		///DEVICE-ATTACH-FLAG IN THE PHYSICAL DEVICE NODE.
	DZM	D.AF,X	///
	LAC*	X10	///GET THE PARTITION BLOCK ADDRESS.
	PAX		///
	LAC	P.TP,X	///DECREMENT THE 'TRANSFERS PENDING' COUNT.
	SZA		///
	AAC	-1	///
	DAC	P.TP,X	///
DMTQ2	.ENB		///ENABLE INTERRUPTS.
/
/ DE-QUEUE ALL I/O REQUESTS BY THE INDICATED TASK.
/
	LAC	R2	///PICK UP THE STL NODE ADDRESS OF THE INDICATED
	PAX		/TASK FROM THE I/O REQUEST NODE AND SAVE IT
	LAC	2,X	/FOR FUTURE COMPARISONS.
	DAC	X11
	LAC	R1	/SET THE ADDRESS OF THE REQUEST QUEUE LISTHEAD
	AAC	+D.QF	/IN X10 AND XR.
	DAC	X10
	PAX
/
DMTQLP	LAC	0,X	/END OF DEQUE?
DMTQLC	SAD	X10
	JMP*	R3	/YES -- EXIT.
	PAX		/NO -- SAVE NODE ADDRESS IN X12 AND COMPARE
	DAC	X12	/STL POINTERS.
	LAC	2,X
	SAD	X11	/MATCH?
	SKP		/YES.
	JMP	DMTQLP	/NO.
	PXA		/DELETE THE NODE FROM THE I/O REQUEST DEQUE.
	DAC	R1
	JMS	NDEL	/(R1, R2, R6, XR & AC ARE ALTERED).
	LAC	X12	/ADDRESS OF THE I/O REQUEST NODE.
	DAC	R2	/DECREMENT THE 'TRANSFERS PENDING' COUNT.
	LAC*	R2	/SAVE ADDRESS OF NEXT NODE BEFORE THIS NODE IS
	DAC	X12	/RETURNED TO THE POOL.
	JMS	IOCD	/(R5, XR & AC ARE ALTERED).
	LAC	(POOL)	/ADD THE NODE TO THE POOL OF EMPTY NODES.
	DAC	R1
	JMS	NADD	/(R2, R6, XR & AC ARE ALTERED).
	LAC	X12
	JMP	DMTQLC	/CHECK THE NEXT NODE.
/
	.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.
	DAC	R2	/SAVE NODE ADDRESS (FOR 'NADD') IN R2 AND
	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
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST
	DAC	R1
	JMS	NADD	/(R2, R6, XR, & AC ARE ALTERED)
	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	/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
	DAC	CIPNA	/NO -- SAVE NODE ADDRESS
	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
/
	LAC	(ATKL)	/ADD NODE TO ACTIVE TASK LIST PER
	DAC	R1	/PRIORITY
	LAC	CIPNA
	DAC	R2
	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.MD,X	/NORMAL MODE REQUEST?
	SNA
	JMP	CIMT2	/NO.
	LAC	C.SP,X	/YES -- SET XR TO PARTITION BLOCK NODE ADDRESS.
	PAX
	LAW	-1
	.INH		///
	TAD	P.TP,X	///
	SAD	(-1)	///
	SKP		///
	DAC	P.TP,X	///
	.ENB		///
/
CIMT2	.SET6		///
/
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
CIPNA	0		/POOL 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" NOR IS THE "FLAGS" WORD EVER CHECKED OR ALTERED.
/
/ 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	R2	/SAVE FOR 'NADD' BELOW.
	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
	LAC	(POOL)	/EMPTY POOL LISTHEAD.
	DAC	R1
	JMS	NADD	/ADD NODE TO DEQUE.
			/(R2, R6, XR & AC ARE ALTERED).
/
	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.
	DAC	R2	/SAVE IN R2 FOR CALL TO "SPRI".
	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.
/
IORDFR	LAC	IORDSN	/SET XR WITH STL NODE ADDRESS.
	PAX
	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.
	DAC	R2	/NO -- SAVE NODE ADDRESS FOR CALL TO "NADD"
	IAC		/AND 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
	LAC	(TNRL)	/ADD NODE TO TERMINATION NOTICE REQUEST LIST.
	DAC	R1
	JMS	NADD	/(R2, R6, XR & AC ARE ALTERED).
	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.
/
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.IC	/"PARTITION BLOCK" ADDRESS.
	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
/
	.LST
	.IFUND	L.MCR
	.NOLST
	.ENDC
 .TITLE *** MONITOR CONSOLE (MCR) DISPATCH ROUTINE
/
/ THE MCR DISPATCH ROUTINE IS A CORE RESIDENT TASK CALLED "...MCR",
/ WHICH IS REQUESTED BY THE TTY HANDLER WHENEVER A ^C IS TYPED ON
/ THE MCR INPUT TTY (AND THE ^C REQUEST INHIBIT FLAG IS NOT SET).
/ THE RESIDENT MCR ACCEPTS A LINE OF COMMAND INPUT ON THE MCR TTY
/ AND REQUESTS AN "MCR TASK" TO PERFORM THE INDICATED FUNCTION. 
/ AN "MCR TASK" IS A NORMAL RSX TASK, EXCEPT THAT IT USUALLY
/ RUNS IN A CORE PARTITION THAT IS DEDICATED TO MCR FUNCTIONS,
/ AND HAS A NAME CONSISTING OF THREE DOTS (PERIODS) FOLLOWED
/ BY THE FIRST THREE CHARACTERS OF THE FUNCTION NAME.
/
/ NOTE -- ANY TASK WHOSE NAME CONSISTS OF SIX CHARACTERS OF WHICH
/ THE FIRST THREE ARE DOTS (PERIODS) MAY BE REQUESTED BY TYPING
/ THE LAST THREE CHARACTERS OF THE TASK NAME TO THE RESIDENT MCR.
/ HOWEVER, THE RESIDENT MCR SETS THE ^C REQUEST INHIBIT FLAG AND
/ EXPECTS THE REQUESTED ROUTINE TO CLEAR THIS FLAG AT AN APPROPRIATE
/ TIME.
/
/ AS A CONVENTION, IF THE FIRST LINE OF COMMAND INPUT IS TERMINATED
/ BY A CAR RTN, THE MCR FUNCTION TASKS REQUEST THE RESIDENT MCR
/ "...MCR" UPON COMPLETION.  IF THE FIRST LINE OF COMMAND INPUT IS
/ ALTMODE TERMINATED, ^C MUST BE TYPED IN TO CUE THE RESIDENT MCR.
/
/ THE 'IFAC' & 'FAC' SUBROUTINE ENTRIES, AND THE ^C REQUEST INHIBIT
/ FLAG 'MCRRI' ARE IN SCOM (SO THAT THEY MAY BE ACCESSED FROM MCR
/ FUNCTION TASKS.
/
/ THE RESIDENT MCR USES THE FIRST THREE CHARACTERS OF COMMAND INPUT
/ TO FORM A TASK (MCR FUNCTION OVERLAY) NAME AND FLUSHES REMAINING
/ CHARACTERS THRU THE FIRST BREAK CHAR (BLANK OR COMMA).  FOR
/ EXAMPLE, THE DIRECTIVE "SCHEDULE JOE 22:30:00 90M" WILL RESULT
/ IN A REQUEST FOR THE TASK "...SCH" AND THE NEXT CHARACTER RETURNED
/ BY THE "FAC" SUBROUTINE WILL BE THE "J" OF "JOE".
/
/ SPECIAL CASE -- IF AN INPUT LINE STARTS WITH "LOG", IT IS CONSIDERED
/ TO BE A COMMENT ON THE MCR LOG.  (THEREFORE AN MCR FUNCTION TASK CALLED
/ "...LOG" IS INVALID.)
/
/ SINCE 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 BLOCKS DESCRIPTIONS LIST", NOR IS THE "FLAGS
/ WORD" EVER CHECKED OR ALTERED. HOWEVER, SINCE THIS TASK EXITS AND IS
/ REQUESTED, THE TASK SIZE, VIRTUAL PARTITION SIZE AND BUFFERS POINTER
/ WORDS ARE ALTERED.
/
MCRENT	CAL	MCRA2	/ATTACH LUN 2
/
	CAL	MCRP2	/WRITE  "MCR>" PROMPTING SYMBOL ON LUN 2
/
/
	JMS	IFAC	/READ A LINE & INIT FAC SUBROUTINE
/
	CAL	MCRD2	/DETACH LUN 2
/
	JMS	FAC	/FETCH FIRST CHARACTER
	SAD	(175)	/EXIT MCR IF ALTMODE ONLY
	JMP	MCROUT
	SAD	(15)	/READ ANOTHER LINE IF CR ONLY.
	JMP	MCRENT
	DAC	MCRCB1	/PACK FIRST THREE CHARACTERS (.SIXBT) INTO MQ
	JMS	FAC
	DAC	MCRCB2
	JMS	FAC
	LRS	6
	LAC	MCRCB2
	LRS	6
	LAC	MCRCB1
	LRS	6
	LACQ		/ARE FIRST THREE CHARACTERS "LOG" ?
	SAD	(141707)
	JMP	MCRLOG	/YES -- IGNORE LINE CONTENTS, CHECK TERMINATOR
	DAC	MCRFNM	/NO -- FORM NAME OF MCR FUNCTION TASK
MCRFBC	JMS	FAC	/FLUSH REMAINDER OF MCR FUNCTION NAME
	SAD	(040)	/(BREAK CHAR: BLANK, COMMA, CAR RTN, ALTMODE)
	JMP	MCRTRQ
	SAD	(054)
	JMP	MCRTRQ
	SAD	(015)
	JMP	MCRTRQ
	SAD	(175)
	JMP	MCRTRQ
	JMP	MCRFBC
/
MCRTRQ	CLA!IAC		/SET ^C INHIBIT FLAG TO +1 (IN CASE A ^C HAD
	DAC	MCRRI	/BEEN TYPED DURING THE PREVIOUS FUNCTION TASK
			/AND THAT TASK REQUESTED THE RESIDENT MCR. THIS
			/IS NECESSARY FOR MCR FUNCTION TASKS THAT INTERPRET
			/A NEGATIVE ^C INHIBIT FLAG AS A PREMATURE TERMINATION
			/INDICATOR)
	CAL	MCRRPB	/REQUEST INDICATED MCR FUNCTION TASK
	LAC	MCREV	/WAS REQUEST ACCEPTED?
	SMA
	CAL	(10)	/YES -- EXIT RESIDENT MCR TASK
	CAL	MCRE3	/NO -- WRITE ERR MESSAGE ON LUN 3 & TRY AGAIN
	JMP	MCRENT
/
MCRLOG	LAC	IFACTI	/WAS LINE CAR RTN TERMINATED?
	SAD	(+2)
	JMP	MCRENT	/YES -- CONTINUE MCR DIALOGUE
			/NO -- TERMINATE MCR DIALOGUE
MCROUT	DZM	MCRRI	/CLEAR MCR REQUEST INHIBIT
	CAL	(10)	/FLAG AND EXIT
/
MCREV	0		/EVENT VARIABLE
MCRCB1	0
MCRCB2	0
/
/ CPB'S AND OUTPUT TEXT
/
MCRA2	2400		/ATTACH LUN 2
	0
	2
/
MCRD2	2500		/DETACH LUN 2
	0
	2
/
MCRP2	2700		/WRITE PROMPTING SYMBOL ON LUN 2
	0
	2
	2
	MES1
/
MCRE3	2700		/WRITE ERR MESSAGE ON LUN 3
	0
	3
	2
	MES3
/
MCRRPB	1		/REQUEST MCR FUNCTION TASK
	MCREV
	.SIXBT	"..."
MCRFNM	.SIXBT	"---"
	0
/
MCRWPB	20		/WAIT FOR EVENT VARIABLE
	MCREV
/
	TEXT 1,<MCR>>,<175>
	TEXT 2,,<15>
	TEXT 3,<MCR-BAD FUNCTION>,<15>
/
/ MCR ENTRY (NODE) IN SYSTEM TASK LIST
/
MCR	TDV		/FORWARD LINKAGE
	STKL		/BACKWARD LINKAGE
	.SIXBT	"..."	/TASK NAME (FIRST HALF)
	.SIXBT	"MCR"	/TASK NAME (SECOND HALF)
	040002		/FIXED IN CORE, DEFAULT PRIORITY OF TWO
	MCRIC-P.IC	/PARTITION BLOCK ADDRESS
	0		/DISK PARAMETERS (ZEROS
	0		/INDICATE A CORE RESIDENT
	0		/TASK)
	MCRENT		/ENTRY POINT ADDRESS
	.IFPNZ	NDSZMT
	.REPT	NDSZMT
	0
	.ENDC
/
/ MCR "PARTITION BLOCK" (REGISTER SAVE USE ONLY)
/
MCRNNN=P.IC-4
	.REPT	MCRNNN
	0
MCRIC	SHPB
/
/ IFAC -- SUBROUTINE TO READ A LINE OF COMMAND INPUT AND INITIALIZE
/ THE FETCH-A-CHARACTER SUBROUTINE.  'IFACTI' IS LEFT INDICATING TYPE
/ OF LINE TERMINATION (1, ALTMODE; 2 CAR RTN).
/
/ SUBROUTINE ENTRY IS IN SCOM
/
IFACE	CAL	IFACRL	/READ LINE
	CAL	IFACWF
/
	LAC	IFACEV	/SET LINE TERMINATION INDICATOR
	DAC	IFACTI	/(EV IS RETURNED +1 FOR ALTMODE, OR +2 FOR CAR RTN)
	SAD	(2)	/RETURN CARRIAGE IF ALTMODE TERMINATED
	JMP	.+3
	CAL	IFACRC
	CAL	IFACWF	/(IN CASE OF ...SAV WHICH REQUIRES A QUIESCENT SYSTEM)
/
	LAC	(FACCB+5)
	DAC	FACCBX
	LAC	(FACLB+2)
	DAC	FACLBX
/
	JMP*	IFAC
/
IFACRL	2600		/READ LINE FROM LUN 2 CPB
	IFACEV
	2
	2
	FACLB
	36
/
IFACWF	20		/WAIT FOR 'IFACEV'
	IFACEV
/
IFACRC	2700		/RETURN CARRIAGE ON LUN 2
	IFACEV
	2
	2
	MES2
/
IFACEV	0		/EVENT VARIABLE
IFACTI	0		/LINE TERMINATION INDICATOR
/
/ FAC -- SUBROUTINE TO FETCH A CHARACTER FROM 5/7 ASCII LINE BUFFER 'FACLB'.
/ INDICIES 'FACLBX' AND 'FACCBX' MUST BE SET WHEN A NEW LINE IS READ.
/ CHARACTERS ARE NOT FETCHED BEYOND TERMINAL CHARACTERS
/
/ SUBROUTINE ENTRY IS IN SCOM AREA.
/
FACE	LAC*	FACCBX	/FETCH NEXT UNPACKED CHARACTER FROM 'FACCB'
	SMA		/WAS CHAR BUFFER (FACCB) EMPTY?
	JMP	FAC2	/NO -- TEST FOR TERMINAL CHAR
	LAC	(FACCB-1) /YES -- REFILL 'FACCB'
	DAC	FACCBX	
	LAC*	FACLBX	/(FIRST HALF OF WORD PAIR)
	ISZ	FACLBX
	LMQ
	CLA!CLL
	JMS	FACUPS	/(FIRST CHAR)
	JMS	FACUPS	/(SECOND CHAR)
	JMS	FACUPS	/(FIRST FOUR BITS OF THIRD CHAR)
	LAC*	FACLBX	/(SECOND HALF OF WORD PAIR)
	ISZ	FACLBX
	LRS	17	/(LAST THREE BITS OF THIRD CHAR)
	XOR*	FACCBX
	DAC*	FACCBX
	CLA
	JMS	FACUPS	/(FOURTH CHAR)
	JMS	FACUPS	/(FIFTH CHAR)
	LAC	(FACCB)	/RESET CHAR BUF INDEX
	DAC	FACCBX
	LAC*	FACCBX	/FETCH FIRST CHAR FROM CHAR BUF
/
FAC2	SAD	(015)	/IF TERMINAL CHARACTER, (CAR RTN OR ALTMODE)
	JMP*	FAC	/RETURN WITH CHAR IN AC BUT DO NOT
	SAD	(175)	/AUGMENT CHAR BUF INDEX (REPEATED CALLS
	JMP*	FAC	/OF FAC WILL RETURN THE TERMINAL CHAR).
/
	ISZ	FACCBX	/NON-TERMINAL CHARACTER -- AUGMENT CHARACTER
	JMP*	FAC	/BUFFER INDEX AND RETURN WITH CHAR IN AC
/
FACUPS	0		/UNPACKING SUBROUTINE -- AC & LINK MUST BE
	LLS	7	/CLEARED, NEXT CHAR MUST BE IN HIGH ORDER
	ISZ	FACCBX	/MQ, 'FACCBX' MUST POINT TO WORD PRECEDING
	DAC*	FACCBX	/CHAR TO BE STORED.
	CLA		/CHAR IS SHIFTED INTO AC (LOW ORDER BITS
	JMP*	FACUPS	/OF THIRD CHAR ARE ZERO BECAUSE LINK IS
			/ZERO), STORED, 'FACCBX' IS LEFT POINTING
			/TO CHAR, AND AC IS CLEARED (LINK IS
			/ALSO LEFT CLEARED).
FACLBX	FACLB+2		/LINE BUFFER INDEX
FACCBX	FACCB+0		/CHARACTER BUFFER INDEX
FACCB	.BLOCK	5	/CHARACTER BUFFER (5 IMAGE ALPHA CHARS)
	-1		/END OF 'FACCB' INDICATOR
/
/ FACLB -- LINE BUFFER FOR THE 'FAC' SUBROUTINE ALSO CONTAINS
/ COLD START INITIALIZATION CODE.  WHEN A MASTER IMAGE IS LOADED
/ INTO CORE, R1 CONTAINS THIS ADDRESS.  THE RSX BOOTSTRAP TRANSFERS CONTROL
/ PER R1 AFTER LOADING AN IMAGE.
/
FACLB	DBA		/SET "INDEX MODE"
	CAF		/CLEAR ALL FLAGS
	LAC	R2	/SETUP PI INTERRUPT TRANSFER WORD
	DAC	L1
	LAC	R3	/SETUP CAL INTERRUPT TRANSFER WORD
	DAC	L21
	LAC	R4	/SETUP CAL INDIRECT TRAP
	DAC	L20
	ION		/ENABLE PI
	LAC	(400000)/ENABLE API
	ISA
	KRS		/SELECT FULL DUPLEX CONSOLE KEYBOARD
	JMP	M6	/START ACTIVE TASK LIST SCAN FROM THE TOP
/
	.BLOCK	36+FACLB-. /REMAINDER OF 36 (OCT) WORD BUFFER
/
	.ASCII	<015>	/TERMINATOR IN CASE OF TRUNCATED LONG LINE
 .TITLE *** TASK DEVELOPMENT (TDV) DISPATCH ROUTINE
/
/ THE TDV DISPATCH ROUTINE IS A CORE RESIDENT TASK CALLED "TDV...",
/ WHICH IS REQUESTED BY THE TTY HANDLER WHENEVER A ^T IS TYPED ON
/ THE TDV TTY.
/
/ THIS TASK OUTPUTS A "TDV>" PROMPTING SYMBOL TO LUN 12, READS A LINE 
/ FROM LUN 12, CONSTRUCTS A TDV FUNCTION TASK NAME BY APPENDING THREE
/ DOTS (DECIMAL POINTS) TO THE FIRST THREE CHARACTERS OF THE COMMAND
/ STRING, AND REQUESTS THAT TASK.
/
/ THE RESTRICTED 'TRANSFER COMMAND' DIRECTIVE IS SETUP TO RESPOND ONCE
/ TO THE REQUESTED TASK, AND TO RETURN A +2 OR +1 EVENT VARIABLE FOR
/ SUCCESSFUL COMPLETION.  TWO INDICATES CAR RTN TERMINATION, AND ONE 
/ INDICATES ALTMODE TERMINATION.
/
/ THE TDV FUNCTION TASK IS EXPECTED TO ISSUE A 'TRANSFER COMMAND' DIRECTIVE
/ TO GET THE 5/7 PACKED COMMAND STRING. "TDV..." WAITS FOR THE LINE TO BE
/ TRANSFERRED AND EXITS (REGARDLESS OF LINE TERMINATION).
/
/ ONCE A TDV FUNCTION TASK HAS RECEIVED ITS COMMAND STRING THE TDV
/ DISPATCH TASK MAY BE STARTED VIA ^T AND ANOTHER LINE OF COMMAND
/ INPUT MAY BE READ WHILE THE PREVIOUS COMMAND(S) ARE BEING PERFORMED.
/
/ WHEN A TDV FUNCTION TASK REQUEST IS REJECTED BECAUSE THE TASK IS
/ STILL ACTIVE, THE TDV DISPATCH TASK WAITS FOR THE PREVIOUS  REQUEST 
/ TO FINISH.  HENCE ONLY ONE LEVEL OF TDV INPUT BUFFERING EXISTS.
/
/ IF A COMMAND INPUT LINE IS CAR RTN TERMINATED, THE TDV FUNCTION TASK
/ WILL REQUEST THE TDV DISPATCH TASK "TDV..." UPON EXIT (WHICH WILL BE
/ IGNORED IF ^T HAS BEEN TYPED DURING SERVICE AND THE DISPATCH TASK
/ IS WAITING FOR THE FUNCTION TASK TO EXIT).
/
TDVENT	CAL	TDVA12	/ATTACH LUN 12
/
	CAL	TDVP12	/WRITE "TDV>" PROMPTING SYMBOL ON LUN 12
/
	CAL	TDVR12	/READ COMMAND INPUT LINE FROM LUN 12
	CAL	TDVWF1
/
	LAC	TDVEV1	/SAVE TERMINATION INDICATOR (1:ALTMODE::2:CAR RTN)
	DAC	TC.EV	/FOR 'TRANSFER COMMAND DIRECTIVE', AND RETURN
	SAD	(1)	/CARRIAGE IF ALTMODE TERMINATION.
	CAL	TDVC12
/
	CAL	TDVD12	/DETACH LUN 12
/
	LAC	TDVLB+2	/FORM FIRST HALF OF TDV FUNCTION TASK NAME FROM
	LMQ		/FIRST THREE CHARACTERS OF 5/7 PACKED LINE OF
	LLS	10	/COMMAND INPUT, AND SET NAME HALF IN REQUEST
	RAR		/CPB.  IF LINE CONSISTS OF ONLY AN ALTMODE, EXIT
	AND	(177)	/TDV DISPATCH.  IF FIRST THREE CHARACTERS ARE "LOG",
	SAD	(175)	/DO NOT DISPATCH.
	CAL	(10)
	SAD	(15)	/READ ANOTHER LINE IF CR ONLY.
	JMP	TDVENT
	LLS	7
	RAR
	LLS	3
	PAL
	LAC	TDVLB+3
	LMQ
	PLA
	LLS	3
	SAD	(141707)/.SIXBT "LOG".
	JMP	TDV999
	SAD	(240426)/.SIXBT "TDV".
	JMP	TDVERR
	DAC	TDVREQ+2
	AND	(77)	/ERROR IF 3RD CHARACTER IS A PERIOD, BECAUSE
	SAD	(56)	/IT WOULD LOOK LIKE AN I/O HANDLER, E.G., DT....
	JMP	TDVERR
/
	DZM	TDVEV2	/CLEAR "COMMAND TRANSFERRED" EVENT VARIABLE
/
TDV2	CAL	TDVREQ	/REQUEST TDV FUNCTION TASK
/
	LAC	TDVEV1	/REQUEST ACCEPTED?
	SMA
	JMP	TDV4	/YES -- WAIT FOR LINE TO BE REQUESTED
	SAD	(-202)	/NO -- WAS TASK ACTIVE?
	JMP	TDV3	/YES-- WAIT AND RE-REQUEST
			/NO -- WRITE ERR MESSAGE
TDVERR	CAL	TDVE13	/WRITE ERROR MESSAGE ON LUN 13, AND
	JMP	TDVENT	/ACCEPT ANOTHER LINE OF COMMAND INPUT.
/
TDV3	DAC	TDVTAC	/FLAG CURRENT TDV TASK ACTIVE
	CAL	(5)	/TDV FUNCTION TASK WAS ACTIVE -- WAIT FOR
	DZM	TDVTAC	/NEXT SIGNIFICANT EVENT AND TRY AGAIN.
	JMP	TDV2
/
TDV4	LAC	R4	/TDV FUNCTION HAS BEEN REQUESTED -- SET ATL NODE
	DAC	TDVCTF	/ADDRESS IN CURRENT-TDV-FUNCTION INDICATOR.
			/TO ALLOW THE RESTRICTED COMMAND TRANSFER DIR-
			/ECTIVE TO SERVICE THE JUST REQUESTED TDV FUNCTION
			/TASK ONCE.
/
	CAL	TDVWF2	/WAIT FOR COMMAND INPUT LINE TO BE TRANSFERRED
			/TO THE FUNCTION TASK.  I.E., WAIT FOR THE LINE
			/BUFFER TO BECOME AVAILABLE.
/
	CAL	(10)	/EXIT -- NOW TDV DISPATCH MAY OCCUR AS A RESULT
			/OF ^T TYPEIN OR REQUEST.
/
TDV999	LAC	TC.EV	/CHECK LINE TERMINATOR FOR LOG COMMAND.
	SAD	(1)
	CAL	(10)	/ALTMODE -- EXIT.
	JMP	TDVENT	/CAR. RET. -- READ NEXT LINE.
/
TDVEV1	0		/EVENT VARIABLE FOR I/O & TASK REQUEST
TDVEV2	0		/EVENT VARIABLE FOR TRANSFERRING OF COMMAND LINE
TDVCTF	0		/CURRENT TDV FUNCTION INDICATOR (ATL NODE ADDRESS)
			/CLEARED BY COMMAND TRANSFER DIRECTIVE WHEN COMMAND
			/LINE IS MOVED TO TDV FUNCTION TASK.
TDVTAC	0		/FLAG SET NON-0 (FOR EXIT DIRECTIVE) TO INDICATE CURRENT
			/TDV TASK IS ACTIVE.
/
/ CPB'S AND I/O BUFFERS
/
TDVA12	2400		/ATTACH LUN 12
	0
	LUN12
/
TDVD12	2500		/DETACH LUN 12
	0
	LUN12
/
TDVP12	2700		/WRITE PROMPTING SYMBOL ON LUN 12
	0
	LUN12
	2
	MES11
/
TDVR12	2600		/READ COMMAND LINE FROM LUN 12
	TDVEV1
	LUN12
	2
	TDVLB
	36
/
TDVC12	2700		/RETURN CARRIAGE ON LUN 12
	0
	LUN12
	2
	MES12
/
TDVE13	2700		/WRITE ERR MESSAGE ON LUN 13
	0
	LUN13
	2
	MES13
/
TDVREQ	1		/REQUEST TDV FUNCTION TASK
	TDVEV1
	.SIXBT	"---"
	.SIXBT	"..."
	0
/
TDVWF1	20		/WAITFOR 'EV1'
	TDVEV1
/
TDVWF2	20		/WAIT FOR 'EV2'
	TDVEV2
/
	TEXT 11,<TDV>>,<175>
	TEXT 12,,<15>
	TEXT 13,<TDV-BAD FUNCTION>,<15>
/
TDVLB	.BLOCK 36	/COMMAND LINE BUFFER
/
/ TDV ENTRY (NODE) IN SYSTEM TASK LIST. NOTE -- TASK IS INITIALLY
/ DISABLED BUT WILL BE ENABLED AT COMPLETION OF SYSTEM CONFIGURATION.
/
TDV	SCF		/FORWARD LINKAGE
	MCR		/BACKWARD LINKAGE
	.SIXBT	"TDV"	/TASK NAME (FIRST HALF)
	.SIXBT	"..."	/TASK NAME (SECOND HALF)
	140121		/FIXED IN CORE, DISABLED; DEFAULT PRIORITY OF 81
	TDVIC-P.IC	/PARTITION BLOCK ADDRESS
	0		/DISK PARAMETERS (ZEROS
	0		/INDICATE A CORE RESIDENT
	0		/TASK)
	TDVENT		/ENTRY POINT ADDRESS
	.IFPNZ	NDSZMT
	.REPT	NDSZMT
	0
	.ENDC
/
/ TDV "PARTITION BLOCK" (REGISTER SAVE USE ONLY)
/
TDVNNN=P.IC-4
	.REPT	TDVNNN
	0
TDVIC	SHPB
	.LST
	.IFDEF	L.SEL
	.NOLST
	.ENDC
/
	.LTORG
/
	.TITLE *** INITIAL POOL OF EMPTY NODES ***
/
/ FILLS UP REMAINDER OF PAGE ZERO AND LINKS TO ADDITIONAL
/ EMPTY NODES THAT FILL UP THE REMAINDER OF PAGE ONE.
/
	.DEFIN	EN
	.IFPOZ	10000-NDSZ-NDSZ-.
	.+NDSZ
	.-1-NDSZ
	.REPT	NDSZM2
	0
	.ENDC
	.ENDM
/
/ NODES
/
PG0NB=.
/
BPL	.+NDSZ
	POOL
	.REPT	NDSZM2
	0
/
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
	EN
/
EPLPG0	BPLPG1
	.-1-NDSZ
	.REPT	NDSZM2
	0
/
PG0NE=.-1
/
	.LST
	.IFUND	L.DSK
	.NOLST
	.ENDC
 .TITLE *** RP15/RF15/UC15 MULTI-DISK DRIVER TASK
/
/ 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" NOR IS THE "FLAGS" WORD
/ EVER CHECKED OR ALTERED.
/
/ 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.
/
/ THIS TASK PERFORMS THE PRIMITIVE DISK FUNCTIONS OF ALLOCATE,
/ DEALLOCATE, GET, PUT & HINF, AND IS CALLED AN I/O DRIVER.  THE
/ TERM I/O HANDLER TASK IS RESERVED FOR A FILE STRUCTURE SERVICE
/ ROUTINE WHICH WOULD USE THIS TASK FOR DISK I/O.
/
/ ACTUALLY, THE ALLOCATE AND DEALLOCATE FUNCTIONS (PROVIDED THAT THEY
/ ARE REQUESTED BY AN EXECUTIVE MODE TASK) ARE PASSED
/ ON TO ANOTHER TASK, "DSA", WHICH RUNS AT A LOWER PRIORITY
/ LEVEL THAN DOES THIS TASK. THIS IS DONE SO THAT ALLOCATE,
/ WHICH CAN TAKE A CONSIDERABLE AMOUNT OF REAL TIME TO
/ PERFORM, DOES NOT HOLD OFF OTHER DISK TRANSFERS.
/
/ THE CPB FORMATS ARE AS FOLLOWS, EXCEPT THAT HINF REQUIRES
/ ONLY THE FIRST 3 WORDS:
/
/	CPB	FUNCTION CODE
/		EVENT VARIABLE ADDRESS
/		LOGICAL UNIT NUMBER
/		CONTROL TABLE ADDRESS
/		DISK DEVICE TYPE
/
/ THEY DIFFER IN FUNCTION CODE AND CONTROL TABLE
/ WORD DESIGNATIONS.
/
/ ALLOCATE -- CODE 15 (MULTI-DISK CODE 115)
/ THE FIRST WORD OF A THREE WORD CONTROL TABLE CONTAINS
/ THE DESIRED STORAGE IN WORDS.  IF SUFFICIENT CONTIGUOUS
/ STORAGE IS AVAILABLE, THE FIRST WORD IS MODIFIED TO
/ REFLECT THE ACTUAL AMOUNT OF ALLOCATED STORAGE (WHICH
/ MIGHT EXCEED THE AMOUNT REQUESTED). ALSO, THE DISK
/ UNIT NUMBER AND DISK BLOCK # ARE SET IN THE SECOND AND
/ THIRD CONTROL TABLE WORDS.
/
/ DEALLOCATE -- CODE 16 (MULTI-DISK CODE 116)
/ THE UNALTERED CONTROL TABLE USED FOR ALLOCATION IS USED FOR
/ DEALLOCATION.
/
/ GET -- CODE 30 (MULTI-DISK CODE 130)
/ THE FIRST WORD OF A FOUR WORD CONTROL TABLE CONTAINS THE
/ UNIT NUMBER AND HI-ORDER BITS OF THE DISK BLOCK NUMBER. THE
/ SECOND WORD CONTAINS THE LO-ORDER BITS OF THE BLOCK NUMBER AND A
/ DISPLACEMENT FOR RF15 DISKS ONLY. THE THIRD WORD CONTAINS THE CORE
/ BUFFER ADDRESS, AND THE FOURTH WORD CONTAINS THE WORD COUNT.
/
/ FOR RP AND RK DISKS THE LO-ORDER 8 BITS OF WORD TWO MUST BE ZERO,
/ SINCE ONLY BLOCK ADDRESSING IS SUPPORTED. THIS DRIVER STILL
/ SUPPORTS WORD ADDRESSABILITY FOR THE RF15 DISK, WHICH USES THESE
/ LO-ORDER 8 BITS TO ADDRESS A WORD ON A PLATTER.
/
/ PUT -- CODE 31 (MULTI-DISK CODE 131)
/ THE CONTROL TABLE IS THE SAME AS FOR 'GET'.
/
/ HINF -- CODE 36
/ DOES NOT USE A CONTROL TABLE.
/
/ THE DISK DEVICE TYPE CODES ARE THE STANDARD RSX DEVICE CODES, WITH
/ THE ADDITION OF THE SPECIAL DEVICE CODE 0, WHICH IMPLIES USE THE
/ SYSTEM DISK, WHATEVER IT MAY BE.E.G., INSTALL USES DEVICE CODE 0
/ BECAUSE TASKS ARE ALWAYS INSTALLED ON THE SYSTEM DEVICE (UNIT 0
/ OF THE SYSTEM DEVICE TYPE). THIS FEATURE MAKES THE MCR FUNCTIONS
/ DEVICE INDEPENDENT. THE DEVICE CODES ARE:
/
/		0	SYSTEM DEVICE
/		2	RF FIXED-HEAD DISK
/		3	RP DISK PACK
/		24	RK DISK ON THE UC15 UNICHANNEL
/
/
/ THE DISK DEVICE TYPE CODE IS IGNORED AND THE SYSTEM DEVICE IS ASSUMED
/ WHEN THE NEW MULTI-DISK CODES INDICATED IN PARENTHESES ABOVE ARE NOT
/ USED. THIS ALLOWS COMPATIBILITY WITH EXISTING SOFTWARE USING DIRECT
/ GETS AND PUTS TO THE RF DISK, BUT ONLY IF THE RF DISK IS THE SYSTEM
/ DEVICE.
/
/ ***************************** NOTE *************************************
/ RF SOFTWARE USING DIRECT GETS AND PUTS TO DISK MAY NOT BE COMPATIBLE
/ WITH OTHER DISK SYSTEMS, SINCE DISK STRUCTURES VARY WIDELY AND UN-
/ AVOIDABLY AMONG THE DIFFERENT TYPES OF DISKS. THE CONCEPT OF "PLATTER"
/ DOES NOT APPLY TO THE OTHER DISKS AND THAT TERMINOLOGY HAS BEEN DROPPED
/ FROM DESCRIPTIONS OF THIS DRIVER. THE TWO WORD DISK ADDRESS IS NOW
/ CONSIDERED TO BE A BLOCK NUMBER THAT HAPPENS TO SPAN TWO CTB WORDS TO
/ MAINTAIN FORMAT COMPATIBILITY WITH RF-STYLE CTB'S. THE ALLOCATOR
/ GUARANTEES ALL BLOCKS ALLOCATED WILL FALL ON ONE BIT MAP, BUT THIS MAY
/ SPAN MORE THAN ONE "PLATTER" (BITS 3-17 OF THE HIGH-ORDER WORD).
/ CONSEQUENTLY, ARITHMETIC DONE ON CONTROL TABLE DISK ADDRESSES MUST CARRY
/ OVER ANY OVERFLOW FROM THE LOW-ORDER WORD INTO THE HIGH-ORDER WORD OR
/ SERIOUS ERRORS WILL OCCUR. REMEMBER THAT THE UNIT # (NOT THE PLATTER #)
/ OCCUPIES BITS 0-2 OF THE HIGH-ORDER DISK ADDRESS.
/ ***********************************************************************
/
/ THE REQUESTOR'S EVENT VARIABLE IS SET AS FOLLOWS:
/
/	+300003	VALUE SET BY HINF FUNCTION TO INDICATE
/		NON-DIRECTORY-ORIENTED INPUT & OUTPUT ON
/		DEVICE CODE 3 (RP15)
/
/	+1	REQUEST PERFORMED
/
/	-6	ILLEGAL I/O FUNCTION
/
/	-26	ILLEGAL FUNCTION FOR A NORMAL MODE TASK
/
/	-27	NONEXISTENT DISK UNIT NUMBER
/
/	-30	OUT-OF-PARTITION PARAMETER (NORMAL MODE)
/
/	-35	ILLEGAL DEVICE CODE OR NON-EXISTENT DISK TYPE
/
/	-36	NON-EXISTENT BLOCK NUMBER
/
/	-104	CONTROL TABLE ERROR (DISK STARTING ADDRESS IS NOT ON A
/					SECTOR BOUNDARY)
/
/	NNNNNN	THE CONTENTS OF THE DISK STATUS REGISTER IF
/		A DISK ERROR PERSISTS AFTER 'DSKMA' TRIES.
/		SINCE THE ERR FLAG IS BIT-0, NNN IS ALWAYS NEGATIVE.
/		THE FORMAT OF THIS WORD IS:
/		00  ERROR FLAG
/		01  WRITE PROTECT ERROR
/		02  NON-EXISTENT CYLINDER ADDRESS
/		03  NON-EXISTENT HEAD ADDRESS
/		04  NON-EXISTENT SECTOR ADDRESS
/		05  HEADER NOT FOUND
/		06  UNIT IS WRITE PROTECTED
/		07  SEEK INCOMPLETE
/		08  UNIT IS UNSAFE
/		09  PROGRAM ERROR
/		10  END OF PACK
/		11  TIMING ERROR
/		12  FORMAT ERROR
/		13  WRITE CHECK ERROR
/		14  WORD PARITY ERROR
/		15  LONGTITUDINAL PARITY ERROR
/		16  SEEK UNDERWAY
/		17  UNIT NOT READY
/
/	FOR OTHER VALUES, REFER TO THE TASK "DSA".
/
/
/RP15 IOTS:
/
DPLWC=706364	/LOAD TWO'S COMP. WORD COUNT
DPLCA=706344	/LOAD THE CURRENT ADDRESS
DPLDA=706304	/LOAD THE DISK ADDR (CYL=00:07, HEAD=08:12, SECT=14:17)
DPLF=706464	/LOAD DISK FUNCT (READ=015000, WRITE=025000, RECAL=035000)
DPRSA=706312	/READ STATUS A
DPRSB=706332	/READ STATUS B
DPSE=706361	/SKIP ON ERROR
DPSA=706321	/SKIP ON ATTENTION
DPCL=706404	/CLEAR CONTROL
/
/ RF15 IOT'S:
/ 
DSCF=707041	/CLEAR FUNCTION REGISTER
DSCC=707021	/CLEAR DISK CONTROL
DSFX=707042	/XOR AC BITS 15-17 INTO FNCN REG.
DLAH=707064	/LOAD HI ORDER DISK ADDR (PLATTER #)
DLAL=707024	/LOAD LO ORDER DISK ADDRESS
DSCN=707044	/EXECUTE FUNCTION REGISTER
DSCD=707242	/CLEAR STATUS REG & DISK FLAG
DSRS=707272	/READ STATUS REGISTER
/
/ LOCATIONS OF RF15 DMA CONTROL REGISTERS:
/
DSKFWC=36	/WORD COUNT REG ADDRESS
DSKFCA=37	/CORE ADDRESS REG ADDRESS
/
/ UC15 UNICHANNEL IOT'S:
/
SIOA=706001	/SKIP ON TCBP DONE FLAG
LIOR=706006	/LOAD TCBP REGISTER & CLEAR FLAG
CIOD=706002	/CLEAR TCBP DONE FLAG
RDRS=706112	/READ DR15 STATUS REGISTER (BIT 17)
LDRS=706122	/LOAD DR15 STATUS REGISTER FROM AC (BIT 17)
SAPI0=706101	/SKIP ON API0 FLAG=1
SAPI1=706121	/SKIP ON API1 FLAG=1
SAPI2=706141	/SKIP ON API3 FLAG=1
SAPI3=706161	/SKIP ON API3 FLAG=1
CAPI0=706104	/CLEAR API0 FLAG
CAPI1=706124	/CLEAR API1 FLAG
CAPI2=706144	/CLEAR API2 FLAG
CAPI3=706164	/CLEAR API3 FLAG
/
/
/ WAIT FOR TASK TO BE TRIGGERED (BY 'I/O CAL' CAL SERVICE ROUTINE, BY 'S2'
/ OR BY THE I/O RUNDOWN TASK) TO SIGNAL THAT A REQUEST HAS BEEN QUEUED.
/
	.LOC	10020		/BEGIN THIS TASK IN PAGE ONE
DSKTW	CAL	WFDTG		/WAIT FOR DISK TRIGGER
/
	DZM	DSKTG		/CLEAR TRIGGER
DSKPQ	LAC	(DSKRQ)		/PICK REQUEST NODE -- EMPTY DEQUE?
	DAC*	(R1
	JMS*	(PICK		/(R1, R2, R6, XR & AC ARE ALTERED)
	JMP	DSKTW		/YES -- WAIT FOR TRIGGER
	DAC	DSKRN		/NO -- SAVE ADDRESS OF REQUEST NODE
	DAC*	(R2		/AND SETUP R2 FOR 'VAJX'.
	JMS	DSKSX		/SETUP XR TO ACCESS REQUEST NODE
/
	LAC	6,X		/SAVE ADDRESS OF REQUESTOR'S EVENT
	SNA			/VARIABLE (ZERO IMPLIES NO EVENT
	LAC	(DSKRE)		/VARIABLE TO BE SET).
	DAC	DSKRE
	LAC	5,X		/TEST FOR SYSTEM DEVICE ONLY
	AND	(100)
	SNA
	JMP	DSKFC		/SWITCH NON ZERO SO ASSUME SYSTEM DEVICE
	LAC	10,X		/FETCH DISK DEVICE TYPE
	SNA			/CODE=0?
	SKP			/YES, USE SYSTEM DEVICE
	SAD	(2)
	SKP			/RF DISK
	SAD	(3)
	SKP			/RP DISK
	SAD	(24)
	SKP			/RK DISK
	JMP	DSKIDV		/NONE OF ABOVE, SO ILLEGAL DEVICE!
DSKFC	LAC	5,X		/FETCH THE FUNCTION CODE.
	AND	(777)
	SAD	(115)
	JMP	DSKA		/MULTI-DISK ALLOCATE
	SAD	(015)
	JMP	DSKA		/ALLOCATE.
	SAD	(116)
	JMP	DSKA		/MULTI-DISK DEALLOCATE
	SAD	(016)
	JMP	DSKA		/DEALLOCATE.
	SAD	(017)
	JMP	DSKAB		/ABORT.
	SAD	(036)
	JMP	DSKH		/HINF.
	SAD	(130)
	SKP			/MULTI-DISK GET.
	SAD	(030)
	SKP			/GET.
	SAD	(131)
	SKP			/MULTI-DISK PUT.
	SAD	(031)
	JMP	DSKCTC		/PUT.
/
DSKILF	LAW	-6		/ILLEGAL OR UNIMPLEMENTED FUNCTION.
	JMP	DSKSE
/
DSKCTC	LAC	7,X		/IS CONTROL TABLE WITHIN PARTITION (NORMAL MODE)?
	DAC*	(R3		/(R2 IS ALREADY SETUP)
	LAC	(4)
	DAC*	(R4
	JMS*	(VAJX		/(R3, R5, XR, & AC ARE ALTERED)
	JMP	DSKBP		/NO -- SET REQUESTOR'S EVENT VARIABLE TO -30
	LAW	-1		/YES -- SETUP X11 TO ACCESS CONTROL TABLE
	TAD*	(R3
	DAC*	(X11
	LAW	-DSKMA		/SET DSKEC WITH 2'S COMP OF NO. DISK TRYS
	DAC	DSKEC
/
	LAC	DSKRN		/SETUP XR TO ACCESS REQUEST NODE
	JMS	DSKSX
	LAC	5,X		/TEST FOR SYSTEM DEVICE ONLY
	AND	(100)
	SNA
	JMP	DSKSYS		/YES, SYSTEM DEVICE ONLY
	LAC	10,X		/NO,FETCH DISK TYPE FROM REQUEST NODE
	SNA
DSKSYS	LAC*	(SYSDSK		/LOAD DISK TYPE CODE
	DAC	DSKTYP		/SAVE IT.
	SAD	(2)
	JMP	DSKRF		/RF DISK TYPE
	SAD	(3)
	JMP	DSKRP		/RP DISK TYPE
	SAD	(24)
	JMP	DSKRK		/RK DISK TYPE
	JMP	DSKIDV		/ILLEGAL DEVICE CODE.
/
/ ABORT TASK I/O ROUTINE.
/
DSKAB	XOR	5,X		/ABORT IS LEGAL ONLY IF REQUESTED BY THE I/O
	SZA			/RUNDOWN TASK, WHO SETS LUN=0.
	JMP	DSKILF
/
	LAC	(DSK0)		/ADDRESS OF THE PHYSICAL DEVICE NODE.
	DAC*	(R1
	LAC	DSKRN		/ADDRESS OF THE REQUEST NODE.
	DAC*	(R2
	JMS*	(DMTQ		/EMPTY DSK'S I/O REQUEST QUEUE OF ALL I/O RE-
				/QUESTS MADE BY THE TASK BEING ABORTED.
				/(R1, R2, R3, R5, R6, X10, X11, X12, XR & AC
				/ARE ALTERED).
	JMP	DSKOC		/DONE.
/
/ HINF ROUTINE -- SET REQUESTER'S EVENT VARIABLE TO INDICATE DEVICE CODE
/ OF THE SYSTEM DISK DEVICE; NON-DIRECTORY ORIENTED; INPUT & OUTPUT.
/
DSKH	LAC*	(SYSDSK		/FETCH SYSTEM DISK DEVICE CODE.
	XOR	(300000)
	JMP	DSKSE
/
/ ALLOCATE AND DEALLOCATE ROUTINE.
/
DSKA	LAC	3,X		/ALLOCATE & DEALLOCATE ARE ILLEGAL FUNCTIONS IF
	SZA			/REQUESTED BY A NORMAL MODE TASK.
	JMP	DSKIFN		/ERROR -- ILLEGAL FUNCTION FOR NORMAL MODE TASK
/
	LAC	(DSARQH)	/ADDRESS OF THE HEAD OF
	DAC*	(R1		/"DSA'S" REQUEST QUEUE.
	LAC	DSKRN		/ADDRESS OF THE I/O REQUEST NODE.
	DAC*	(R2
	DAC*	(DSATEV)	/SET "DSA'S" TRIGGER EVENT
				/VARIABLE NON-0.
	JMS*	(SPRI		/INSERT THE ALLOCATE OR DEALLOCATE
				/REQUEST NODE INTO "DSA'S" DEQUE
				/IN ORDER OF PRIORITY.
				/(R1, R2, R3, R6, XR & AC ARE ALTERED).
	JMP	DSKPQ		/NO NEED TO DECLARE A SIGNIFICANT EVENT
				/SINCE THE TASK "DSA" IS OF LOWER PRIORITY.
/
/ GET OR PUT -- SET DISK FUNCTION REGISTER PER FUNCTION CODE
/ THERE ARE THREE ROUTINES FOR THE THREE DISK TYPES: DSKRF,DSKRP,DSKRK.
/
/
/ DSKRP -- ROUTINE TO HANDLE GETS & PUTS TO THE RP15 DISK PACK CONTROL.
/
DSKRP	LAC*	(RPDISK		/TEST FOR PRESENCE OF RP DISK.
	SPA
	JMP	DSKIDV		/ERROR - NO RP DISK.
	LAC	(100000		/ADD 1 TO THE CURRENT DISK UNIT AND ISSUE
	TAD	DSKUNT		/A NOP SO THE CURRENT UNIT IS DESELECTED.
	DPLF			/THIS ALLOWS THE CONTROLLER TO PROPERLY
				/INTERROGATE THE READ-WRITE/READ-ONLY SWITCH
	JMS	DSKG.P		/TEST FOR GET OR PUT.
	LAC	(014000)	/GET: READ & INTERRUPT.
	SKP
	LAC	(024000)	/PUT: WRITE & INTERRUPT.
	DAC	DSK.FN		/SAVE THE FUNCTION CODE.
	JMS	DSKGAD		/GET THE DISK BLOCK #
	JMS	DSKGBN		/FROM THE CONTROL TABLE.
	TAD	(-117230)	/BLOCK # IS NOW IN AC IF O.K.
	SMA			/SO TEST IT FOR SIZE.
	JMP	DSKBDB		/TOO BIG!
	LAC	DSKBLK		/PICK THE BLOCK NUMBER BACK UP
	IDIV			/DIVIDE BY 10 TO GET SECTOR
	12			/WHICH WILL BE IN AC.
	DAC	DSKBLK		/SAVE THIS
	LACQ			/GET REMAINDER AND
	IDIV			/DIVIDE BY 20 TO GET THE
	24			/HEAD ADDRESS IN AC.
	ALSS	5		/POSITION TO XOR INTO DISK
	XOR	DSKBLK		/PHYSICAL ADDRESS WORD.
	DAC	DSKBLK		/SAVE IT TEMP.
	LACQ			/GET REMAINDER WHICH IS THE
	ALSS	12		/CYLINDER ADDRESS AND POSITION IT
	XOR	DSKBLK		/XOR INTO THE DISK PHYSICAL ADDRESS.
	DAC	DSKBLK		/ALL DONE SO SAVE IT.
	LAC	DSKUNT		/CHECK UNIT # FOR SIZE.
	CLL!RTL
	RTL
	TCA
	TAD*	(RPDISK		/SUBTRACT FROM MAX. UNIT #
	SPA
	JMP	DSKIDV		/ERROR - NON-EXISTENT UNIT.
	JMS	DSKCKP		/CHECK TO SEE IF TRANSFER IS
				/WITHIN PARTITION. RETURN IF SO.
DSKRT	LAC	DSKCA		/YES, LOAD RP15 REGISTERS.
	DPLCA			/LOAD CORE BUFFER ADDRESS.
	LAC	DSKWC
	DPLWC			/LOAD 2'S COMPL. WORD COUNT
	LAC	DSKBLK
	DPLDA			/LOAD DISK PHYSICAL ADDRESS.
	DZM	DSKEV		/ZERO THE EV.
	DZM	DPERR		/CLEAR ERROR RECALIB. UNDERWAY FLAG.
	LAC	DSK.FN		/PICK UP THE FUNCTION CODE
	XOR	DSKUNT		/ADD IN THE DISK UNIT NUMBER.
	DPLF			/LOAD AND DON'T GO YET
	LAC	(1		/WASTE 4 MICRO SECONDS
	LAC	(1
	NOP
	DPRSB			/GET THE STATUS WORD
	AND	(1		/IS THIS UNIT OFF LINE?
	SZA
	JMP	DSKRPO		/YES -- GIVE A HARDWARE ERROR
	LAC	DSK.FN		/NO -- EXECUTE GET OR PUT
	XOR	(1000		/NOW SET THE GO BIT
	XOR	DSKUNT
	DPLF
	JMS	DSKWFD		/WAIT FOR EV AND TEST FOR ERROR.
	JMP	DSKRT		/ERROR, GO RETRY!
DSKRPO	DPRSA			/CONSTRUCT THE HARDWARE FAILURE EV
	SWHA
	STL
	RAR
	AND	(776000
	DAC	DPERR
	DPRSB
	AND	(1777
	XOR	DPERR
	JMP	DSKSE		/RETURN THE EV TO CALLER
/
/ DSKRF -- ROUTINE TO HANDLE GETS AND PUTS TO THE RF15 DISK CONTROL.
/
DSKRF	LAC*	(DSIZE		/TEST FOR PRESENCE OF RF DISK.
	SPA
	JMP	DSKIDV		/NO RF DISK PRESENT!
	JMS	DSKG.P		/TEST FOR GET OR PUT FUNCTION.
	LAC	(3)		/GET: READ & INTERRUPT
	SKP
	LAC	(5)		/PUT: WRITE & INTERRUPT
	DAC	DSK.FN		/SAVE THE FUNCTION CODE
	DSCF!DSFX		/LOAD THE FUNCTION CODE INTO CONTROLLER
	JMS	DSKGAD		/GO FETCH THE DISK ADDRESS
	LAC	DSKUNT		/UNIT # MUST BE ZERO.
	SZA
	JMP	DSKIDV		/ERROR - NONZERO UNIT #
	LAC	DSKHI		/GET THE PLATTER NUMBER
	TCA			/CHECK FOR SIZE
	TAD*	(DSIZE		/BY SUBTRACTING FROM # OF PLATTERS.
	SPA
	JMP	DSKIUN		/ERROR, SET EV TO -27.
	JMS	DSKCKP		/CHECK TO SEE IF TRANSFER IS
				/WITHIN THE PARTITION. RETURN IF SO.
DSKRTR	LAW	-1		/YES,SET UP REST OF CONTROL WORDS.
	TAD	DSKCA		/ADJUST CORE ADDRESS BY -1 AND
	DAC*	(DSKFCA		/PUT CORE ADDR. IN DMA CONTROL TABLE.
	LAC	DSKWC
	DAC*	(DSKFWC		/STORE WORD COUNT THERE.
	LAC	DSKHI		/STORE THE PLATTER NUMBER
	DLAH
	LAC	DSKLO		/STORE THE LOW ORDER DISK ADDRESS
	DLAL
	DZM	DSKEV		/ZERO THE EV.
	DSCN			/GO EXECUTE THE DISK FUNCTION
	JMS	DSKWFD		/WAIT FOR THE EV AND RETURN IF ERROR
	LAC	DSK.FN		/ERROR, SO RETRY THE TRANSFER!
	DSCF!DSFX		/RELOAD THE FUNCTION.
	JMP	DSKRTR		/GO RETRY!
/
/ DSKRK -- ROUTINE TO HANDLE GETS & PUTS TO THE UC15 UNICHANNEL DISK
/
DSKRK	LAC*	(RKDISK		/TEST FOR PRESENCE OF DISK.
	SPA
	JMP	DSKIDV		/ERROR - NO RK DISK.
	JMS	DSKG.P		/TEST FOR GET OR PUT
	LAC	(4)		/GET: READ & INTERRUPT
	SKP
	LAC	(2)		/PUT: WRITE & INTERRUPT
	DAC	DSK.FN		/SAVE AS FUNCTION CODE
	JMS	DSKGAD		/GET THE DISK BLOCK #
	JMS	DSKGBN		/FROM THE CONTROL TABLE.
	TAD	(-11410)	/BLOCK # STILL IN AC SO
	SMA			/TEST IT FOR SIZE.
	JMP	DSKBDB		/BAD BLOCK #.
	LAC	DSKBLK		/PICK UP BLOCK # AGAIN AND
	DAC	RK.BLK		/PUT IT IN THE CTB.
	LAC	DSKUNT		/CHECK UNIT NUMBER FOR SIZE.
	CLL!RTL
	RTL
	TCA
	TAD*	(RKDISK
	SPA
	JMP	DSKIDV		/ERROR - NON-EXISTENT UNIT #
	JMS	DSKCKP		/CHECK TO SEE IF TRANSFER IS
				/WITHIN PARTITION. RETURN IF SO.
	LAC	DSKCA		/FETCH CORE BUFFER ADDRESS
	LMQ			/SAVE IN MQ
	AND	(177777)	/EXTRACT LOW ORDER BITS
	DAC	RKSTAD+1	/AND PUT IN CTB.
	LLSS!ECLA  2		/SHIFT IN HIGH ORDER BITS AND
	DAC	RKSTAD		/PUT IN CTB.
	LAC	DSKWC		/FETCH WORD COUNT
	DAC	RK.WC		/AND PUT IN CTB.
	TAD	(200000		/SUBTRACT WORD COUNT FROM 64K
	SMA			/TRANSFER >64K?
	JMP	DSKRK1		/NO
	LAC	RKSTAD		/YES -- SET BIT TO TELL PIREX
	XOR	(4		/THIS TRANSFER IS OVER 64K
	DAC	RKSTAD
DSKRK1	LAC	DSKUNT		/FETCH DISK UNIT #,
	LRS	7		/POSITION IT AND
	XOR	DSK.FN		/XOR IN THE DISK FUNCTION.
	DAC	RKUNFC		/PUT IT IN THE CTB.
DSKRTY	DZM	RK.EV		/ZERO THE EV
	DZM	DSKEV
	LAC	(RK.TCB)	/LOAD AC WITH ADDRESS OF CTB.
	SIOA			/SKIP IF UC15 CAN ACCEPT REQUEST.
	JMP	.-1		/WAIT UNTIL IT CAN (INTERRUPTABLE).
	LIOR			/GO ISSUE REQUEST TO UC15!
	JMS	DSKWFD		/WAIT FOR EV AND RETURN IF ERROR.
	JMP	DSKRTY		/ERROR, GO RETRY.
/
/
DSKIFN	LAW	-26		/ILLEGAL FUNCTION FOR A NORMAL MODE TASK.
	JMP	DSKSE
/
DSKIUN	LAW	-27		/NON-EXISTENT UNIT NUMBER.
	JMP	DSKSE
/
DSKIDV	LAW	-35		/NON-EXISTENT DISK TYPE OR
	JMP	DSKSE		/ILLEGAL DEVICE CODE.
/
DSKBDB	LAW	-36		/BAD BLOCK NUMBER
	JMP	DSKSE		/TELL THE USER
/
/
DSKBP	LAW	-30		/BAD PARAMETER SPECIFIED, SET REQUESTOR'S
	JMP	DSKSE		/EVENT VARIABLE TO -30.
/
DSKBDC	LAW	-104		/BAD CONTROL TABLE
	JMP	DSKSE		/SHOW THE USER
/
/ DSKG.P -- SUBROUTINE TO FETCH THE FUNCTION CODE AND TEST FOR GET OR
/ PUT. RETURNS TO CALLER+1 ON GET AND TO CALLER+3 ON PUT. ASSUMES XR
/ POINTS TO REQUEST NODE.
/
DSKG.P	0
	LAC	5,X		/FETCH FUNCTION CODE.
	AND	(77)		/MASK OFF MULTI-DISK EXTENSION BIT.
	SAD	(30)
	JMP*	DSKG.P		/GET FUNCTION
	IDX	DSKG.P
	IDX	DSKG.P
	JMP*	DSKG.P		/PUT FUNCTION
/
/
/ DSKGBN -- SUBROUTINE TO FORM A ONE WORD BLOCK NUMBER AND CHECK
/ IT FOR ALIGNMENT WITH A SECTOR BOUNDARY. FOR USE BY BLOCK ORIENTED
/ DEVICES SUCH AS RP02 AND RK05. RETURNS TO DSKBDC IF THE DISK
/ ADDRESS DOES NOT FALL ON A SECTOR BOUNDARY, OTHERWISE RETURNS TO
/ CALLER. 
/
DSKGBN	0
	LAC	DSKLO		/LOAD LO BITS OF BLOCK #.
	AND	(377)		/TEST FOR SECTOR ALIGNMENT.
	SZA
	JMP	DSKBDC		/BAD BLOCK # IN CTB.
	LAC	DSKLO
	LMQ
	LAC	DSKHI		/LOAD HI BITS OF BLOCK 3.
	LLSS	12		/BLOCK # NOW IN AC.
	DAC	DSKBLK		/SAVE IT.
	JMP*	DSKGBN
/
/ DSKGAD -- SUBROUTINE TO FETCH THE TWO-WORD DISK BLOCK NUMBER
/ AND UNIT NUMBER FROM THE CONTROL TABLE AND STORE THEM IN DSKHI,
/ DSKLO, AND DSKUNT.
/
DSKGAD	0
	LAC*	X11		/GET FIRST WORD AND
	PAL			/SAVE TEMP.
	AND	(700000)
	DAC	DSKUNT		/EXTRACT UNIT NUMBER.
	PLA
	AND	(77777)		/EXTRACT HI PART OF
	DAC	DSKHI		/DISK BLOCK NUMBER.
	AND	(77400)
	SZA
	JMP	DSKBDC		/ERROR - BAD CONTROL TABLE.
	LAC*	X11
	DAC	DSKLO		/GET AND SAVE LO PART.
	JMP*	DSKGAD
/
/ DSKCKP -- SUBROUTINE TO CHECK THAT TRANSFER WILL TAKE PLACE WITHIN
/ THE USER'S PARTITION. ASSUMES THAT X11 HAS BEEN SET TO POINT TO
/ THE THIRD WORD OF THE CONTROL TABLE. THE SUBROUTINE RETURNS TO
/ THE CALLER IF THE TRANSFER IS WITHIN THE PARTITION AND TO AN
/ ERROR ROUTINE IF IT IS NOT.
/
DSKCKP	0
	LAC	DSKRN		/GET ADDR OF REQUEST NODE.
	DAC*	(R2
	LAC*	X11		/GET CORE ADDRESS FROM CTB
	DAC*	(R3
	SPA!SNA			/TEST FOR NEGATIVE ADDRESS
	JMP	DSKBDC		/ERROR - GO EXIT.
	LAC*	X11		/GET WORD COUNT FROM CTB.
	DAC*	(R4
	JMS*	(VAJX		/GO CHECK (R3,R5,XR & AC
				/ARE ALTERED).
	JMP	DSKBP		/NO - SET REQUESTOR'S EV TO -30
	LAC*	(R3		/YES - GET THE ADJUSTED CORE ADDR.
	DAC	DSKCA
	LAC*	(R4		/GET THE WORD COUNT.
	SNA			/IS THE WORD COUNT ZERO?
	JMP	DSKBDC		/YES -- THAT'S AN ERROR
	TCA
	DAC	DSKWC
	JMP*	DSKCKP
/
/ DSKWFD -- SUBROUTINE TO WAIT FOR DISK EVENT VARIABLE AND TO TEST
/ FOR A DISK ERROR. IF ERROR OCCURS, IT TESTS FOR MAXIMUM # OF 
/ RETRIES. RETURNS TO CALLER TO RETRY THE TRANSFER, RETURNS TO
/ DSKSE IF MAXIMUM # OF RETRIES REACHED, RETURNS TO DSKOC
/ IF TRANSFER WAS MADE O.K.
/
DSKWFD	0
	CAL	WFDEV		/WAIT FOR DISK EV
	LAC	DSKEV		/TEST FOR ERRORS
	SMA
	JMP	DSKOC		/NO ERROR, EXIT.
	ISZ	DSKEC		/ERROR, ENOUGH TRIES?
	JMP	DSKER		/NO -- SET UP TO DO A RETRY
	ISZ*	(SE.DF		/YES -- BUMP DISK FAILURE 
	NOP			/COUNTER AND EXIT TO
	JMP	DSKSE		/ERROR ROUTINE.
DSKER	ISZ*	(SE.DR		/NO, BUMP DISK RETRY
	NOP			/COUNTER AND TRY AGAIN!
	JMP*	DSKWFD
/
/ DSKSX -- SET UP XR FROM PAGE ONE.
/ ON ENTRY AC HAS ADDRESS OF NODE
/ ON RETURN AC AND XR ARE MODIFIED.
/
DSKSX	0
	TAD	(-010000
	PAX
	JMP*	DSKSX
/
/ FUNCTION COMPLETED -- SET REQUESTOR'S EVENT VARIABLE & PICK NEXT REQUEST
/
DSKOC	CLA!IAC
/
DSKSE	PAL			/SAVE EV VALUE TEMPORARILY.
	LAC	DSKRE		/SET XR TO POINT TO EV ADDRESS.
	JMS	DSKSX
	PLA
	DAC	0,X
/
	LAC	DSKRN	/DECREMENT TRANSFERS PENDING COUNT (NORMAL MODE)
	DAC*	(R2	/(R5, XR, & AC ARE ALTERED)
	JMS*	(IOCD
/
	LAC	(POOL)	/RETURN REQUEST NODE TO POOL
	DAC*	(R1
			/R2 CONTAINS REQUEST NODE ADDRESS)
	JMS*	(NADD	/(R2, R6, XR, & AC ARE ALTERED)
/
/
/ NOTE -- SINCE DSK IS THE FIRST TASK IN THE ACTIVE TASK LIST, THERE IS
/ NO POINT IN DECLARING A SIGNIFICANT EVENT. IT WOULD ONLY SERVE TO CAUSE
/ A SCAN OF THE ATL WHICH WOULD RETURN RIGHT BACK TO THIS POINT.
/
	JMP	DSKPQ	/PICK NEXT REQUEST IF ANY
/
/ CONSTANTS & VARIABLES
/
DSKRE	0		/REQUESTOR'S EVENT VARIABLE ADDRESS
DSKRN	0		/REQUEST NODE ADDRESS
DSKTG	0		/TRIGGER EVENT VARIABLE
DSKEV	0		/INTERRUPT EVENT VARIABLE
DSKAC	0		/AC BUFFER (INT SAVE & RESTORE)
DSKEC	0		/ERROR COUNT
DSKBLK	0		/BLOCK NUMBER DISK ADDRESS READY FOR IOT LOADING
DSKWC	0		/TWO'S COMP WC - READY FOR IOT LOAD
DSKCA	0		/CORE ADDRESS -    "    "   "   "
DSK.FN	0		/DISK FUNCTION
DPERR	0		/ERROR FLAG - NON ZERO WHEN RECAL IS UNDERWAY
DSKHI	0		/HI PART OF DISK BLOCK NUMBER.
DSKLO	0		/LO PART OF DISK BLOCK NUMBER.
DSKUNT	0		/DISK UNIT NUMBER IN BITS 0-2.
DSKTYP	0		/DISK TYPE (STANDARD RSX DEVICE CODE)
/
/ UC15 UNICHANNEL DISK TASK CONTROL BLOCK (TCB)
/
RK.TCB	23401		/API TRAP LOC 47, PRIORITY 1 INT.
	202		/TASK CODE 2; 200 NOT SPOOLED.
RK.EV	0		/EV FOR RK DISK
RK.BLK	0		/DISK BLOCK NUMBER.
RKSTAD	0		/STARTING ADDRESS IN COMMON MEMORY (BITS 17 & 16)
	0		/LOW ORDER BITS OF ADDRESS (BITS 15-0, RIGHT JUSTIFIED)
RK.WC	0		/WORD COUNT
RKUNFC	0		/UNIT # AND DISK FUNCTION.
RK.CST	0		/CONTROL STATUS WORD.
RK.EST	0		/ERROR STATUS WORD.
RK.DST	0		/DRIVER STATUS WORD.
/
/
/ CAL PARAMETER BLOCKS
/
WFDTG	20		/WAIT FOR DISK TRIGGER
	DSKTG
/
WFDEV	20		/WAIT FOR DISK EVENT VARIABLE
	DSKEV
/
/ ACTIVE TASK LIST NODE -- THIS MUST BE THE FIRST NODE IN THE ATL
/ BECAUSE DSK DOESN'T DECLARE SIGNIFICANT EVENTS (AND VICE VERSA).
/
DSK	DSA		/FORWARD LINKAGE
	ATKL		/BACKWARD LINKAGE
	.SIXBT	"DSK"	/TASK NAME (FIRST HALF)
	.SIXBT	"@@@"	/TASK NAME (SECOND HALF)
	1		/PRIORITY
	DSKIC-P.IC	/"PARTITION BLOCK" ADDRESS
	0		/STL NODE ADR (NONE)
	4		/TASK STATUS (INITIALLY WAITING)
	DSKTW		/RESUMPTION ADDRESS
	0		/EVENT VARIABLE
	.IFPNZ	NDSZMT
	.REPT	NDSZMT
	0
	.ENDC
/
/ "PARTITION BLOCK" (REGISTER SAVE USE ONLY)
/
DSKIC	SHPB
/
/ PHYSICAL DEVICE LIST NODE
/
DSK0	TT00		/FORWARD LINKAGE
	PDVL		/BACKWARD LINKAGE
	.SIXBT	"DK@"	/DEVICE NAME (FIRST HALF)
	0		/DEVICE NAME (SECOND HALF)
	0		/DEVICE ATTACH FLAG (ALWAYS 0 FOR DISK)
	0		/UNIT NUMBER
DSKRQ	.		/REQUEST QUEUE (FORWARD LINKAGE)
	.-1		/REQUEST QUEUE (BACKWARD LINKAGE)
	DSKTG		/TRIGGER EVENT VARIABLE ADDRESS
	0		/(UNUSED)
/
/ RP15 DISK PACK INTERRUPT SERVICE ROUTINE
/
DSKRPI	0
	DBA		/SET INDEX MODE
	DAC	DSKAC	/SAVE AC
	LAC	DPERR	/IS AN ERROR CLEAR UNDERWAY?
	SZA		/SKIP IF NOT
	JMP	DPALLD	/YES, AND IT IS FINISHED - SET THE EV
	DPSE		/SKIP IF ERROR
	JMP	DPALLD-1 /NO ERRORS, LEAVE
	DPRSA		/ASSEMBLE THE ERROR STATUS WORD
	SWHA
	STL
	RAR
	AND	(776000) /CLEAR EXTRA BITS
	DAC	DPERR	/TEMP SAVE
	DPRSB
	AND	(001777) /ONLY WHAT IS NEEDED
	XOR	DPERR	/FINISH UP
	DAC	DPERR	/SAVE
	AND	(0200)	/IS THIS THE END OF PACK?
	SZA!CLC		/SKIP IF NOT
	DAC	DSKEC	/YES - NO MORE RETRIES - IT WON'T HELP
	LAC	(037000)
	XOR	DSKUNT 	/XOR IN THE UNIT # TO BE RECALIBRATED.
	DPLF		/RECAL
	JMP	DPINTE	/EXIT
	CLA!IAC		/TRANSFER IS OK - SET THE EV TO +1
DPALLD	DAC	DSKEV	/SET THE EV
	DPCL		/CLEAR THE CONTROL
	.SET6		/DECLARE A SIGNIFICANT EVENT
DPINTE	LAC	DSKAC	/RESTORE ENVIRONMENT & RETURN
	DBR		/CONTROL TO INTERRUPTED PROGRAM
	JMP*	DSKRPI
/
/RF15 DISK INTERRUPT SERVICE ROUTINE
/
DSKRFI	0
	DBA		/SET INDEX MODE
	DAC	DSKAC	/SAVE AC
	DSRS		/SET EV TO DISK STATUS
	DAC	DSKEV
	SPA		/THAW FROZEN DISK IF ERROR
	DSCC
	DSCD		/CLEAR DISK FLAG & STATUS
	.SET6		/DECLARE A SIGNIFICANT EVENT
	LAC	DSKAC	/RESTORE ENVIRONMENT AND RETURN
	DBR		/CONTROL TO INTERRUPTED PROGRAM.
	JMP*	DSKRFI
/
/ UC15 UNICHANNEL DISK INTERRUPT SERVICE ROUTINE
/
DSKRKI	0
	DBA		/SET INDEX MODE
	DAC	DSKAC	/SAVE AC.
	LAC	RK.CST	/FETCH CONTROL STATUS WORD.
	AND	(100000)
	SNA!IAC		/TEST FOR ERROR.
	JMP	DSKNOE	/O.K. - SET EV TO +1
	LAC	RK.EST	/ERROR - GET ERROR STATUS WORD,
	AND	(177777
	XOR	(400000	/MAKE MINUS AND
DSKNOE	DAC	DSKEV	/STORE AS EV.
	CAPI1		/CLEAR API1 FLAG
	.SET6		/DECLARE A SIGNIFICANT EVENT,
	LAC	DSKAC	/RESTORE ENVIRONMENT & EXIT.
	DBR
	JMP*	DSKRKI
/
 .TITLE *** RP15/RF15/UC15 MULTI-DISK ALLOCATE/DEALLOCATE TASK
/
/ THIS TASK IS CALLED "DSA" AND IT IS DIRECTLY ASSOCIATED WITH THE
/ MULTI-DISK DRIVER TASK "DSK".
/
/ SINCE AN RP02 DISK CONTAINS 41 BIT MAPS, AN ALLOCATE REQUEST
/ MAY TAKE A CONSIDERABLE AMOUNT OF TIME TO BE PROCESSED (POSSIBLY
/ 41 DISK TRANSFERS). THEREFORE, IN ORDER TO NOT HOLD OFF OTHER DISK
/ I/O REQUESTS, "DSK" PASSES ON "ALLOCATE" AND "DEALLOCATE" RE-
/ QUESTS TO "DSA" ("DSA" RUNS AT A PRIORITY LEVEL LOWER THAN "DSK").
/
/ WHEN "DSK" RECEIVES AN "ALLOCATE" OR "DEALLOCATE" REQUEST, PROVIDED
/ THAT THE REQUEST WAS MADE BY AN EXECUTIVE MODE TASK, IT PUTS
/ THE I/O REQUEST NODE INTO A DEQUE BELONGING TO "DSA", SETS "DSA'S"
/ TRIGGER EVENT VARIABLE, AND DECLARES A SIGNIFICANT EVENT.
/
/ "DSA" DOES NOT HAVE A PHYSICAL DEVICE NODE IN WHICH I/O REQUESTS ARE
/ QUEUED, HENCE IT DOES NOT RECEIVE "ABORT" REQUESTS BY I/O RUNDOWN.
/ THIS IS ALRIGHT SINCE ONLY EXEC MODE REQUESTS ARE PROCESSED HERE.
/
/ "DSA" ACCESSES THE DISK INDIRECTLY BY MAKING "GET" AND "PUT" RE-
/ QUESTS TO LOGICAL UNIT 1 -- KNOWN TO BE ASSIGNED TO "DSK".
/
/ SPACE ON THE RP02 DISK IS DOLED OUT IN 400 WORD BLOCKS (256 DECIMAL).
/ THERE ARE 5 CYLINDERS COVERED BY EACH BIT MAP. THERE ARE 5*20*10=1000
/ BLOCKS COVERED (DECIMAL) WHICH MEANS 1000/18 WORDS NEEDED FOR
/ EACH BIT MAP, PLUS A THREE WORD HEADER (SEE DOS DESCRIPTION).
/
/ EACH PLATTER OF THE RS09 DISK HAS ONE BIT MAP COVERING THE 1024 (DECIMAL)
/ BLOCKS ON THE PLATTER. THIS BIT MAP OCCUPIES THE LAST BLOCK ON EACH
/ PLATTER (1777 FOR PLATTER 0, 3777 FOR PLATTER 1, ETC.).THE MAP MUST
/ CONTAIN 1024/18 WORDS TO COVER 1024 DISK BLOCKS, PLUS THREE WORDS
/ FOR THE HEADER (STANDARD DOS FORMAT, Q.V.).
/
/THE RK05 DISK WHICH IS USED ON THE UC15 UNICHANNEL SYSTEM CONTAINS
/ TWO BIT MAPS PER CARTRIDGE (UNIT) WHICH ARE LOCATED IN DISK BLOCKS
/ 1775 AND 1776.
/
/
/ A ZERO BIT INDICATES THAT THE ASSOCIATED BLOCK IS FREE AND MAY BE
/ ALLOCATED. SINCE THE BIT MAP MUST ALWAYS EXIST, ITS SPACE MUST BE
/ MARKED AS OCCUPIED
/
/ FOR "ALLOCATE" THE REQUESTOR SPECIFIES A NUMBER OF STORAGE WORDS
/ DESIRED. IF THIS IS NOT A MULTIPLE OF 400 WORDS (OCTAL), IT IS
/ ROUNDED UP. ALLOCATED BLOCK SEGMENTS ARE CONTIGUOUS AND RESIDE
/ ENTIRELY ON ONE PLATTER.
/
/ THIS TASK IS ALWAYS CORE RESIDENT AND IT RESIDES IN A "PARTITION"
/ THAT IS NOT AVAILABLE FOR OTHER TASKS.  IT CONTAINS A "PARTITION
/ BLOCK" THAT IS USED ONLY AS A REGISTER SAVE AREA (WHEN THE TASK IS
/ INTERRUPTED BY THE EXECUTIVE). IT IS NOT A PART OF THE "PARTITION
/ BLOCK DESCRIPTIONS LIST" NOR IS THE "FLAGS" WORD EVER CHECKED OR ALTERED.
/
/ IT CONTAINS AN ACTIVE TASK LIST NODE WITH STATUS INITIALLY SET TO
/ 4 (INDICATING IT IS READY TO BE RUN). WHENEVER THE TASK HAS NO
/ FURTHER PROCESSING TO DO, IT WAITS FOR ITS "TRIGGER EVENT VARIABLE"
/ TO BE SET BEFORE RESUMING OPERATION.
/
/ THIS TASK IS NEVER "REQUEST'ED" NOR DOES IT EVER "EXIT"; HENCE, IT
/ HAS NO ENTRY IN THE SYSTEM TASK LIST.
/
/ LABELLING CONVENTION:
/
/ ALL ADDRESS TAGS DEFINED IN THIS TASK BEGIN WITH "DSA".
/
/ EVENT VARIABLES RETURNED:
/
/	+1	ALLOCATE OR DEALLOCATE REQUEST PERFORMED
/		SUCCESSFULLY.
/
/	-15	INSUFFICIENT CONTIGUOUS FREE STORAGE
/		AVAILABLE FOR ALLOCATE. MEDIUM FULL.
/
/	-26	ILLEGAL FUNCTION FOR A NORMAL MODE TASK.
/		(CHECK IS MADE IN "DSK" TASK).
/
/	-104	CONTROL TABLE ARGUMENT ERROR:
/
/		(1) AMOUNT OF STORAGE TO ALLOCATE OR
/		    DEALLOCATE IS NEGATIVE OR ZERO.
/
/		(2) AMOUNT OF STORAGE TO ALLOCATE IS
/		    LARGER THAN 377400 OCTAL.
/
/		(3) AMOUNT OF STORAGE TO BE DEALLOCATED
/		    IS NOT A MULTIPLE OF 400 OCTAL, INDI-
/		    CATING THAT THE INTEGRITY OF THE CON-
/		    TROL TABLE IS IN QUESTION.
/
/		(4) ILLEGAL BLOCK NUMBER -- NUMBER IS
/		    NEGATIVE OR INDICATES A NON-EXISTENT PLATTER.
/
/		(5) DISK BOUNDARY VIOLATION -- DISK
/		    ADDRESS PLUS THE AMOUNT OF STORAGE
/		    TO BE DEALLOCATED MINUS 1 EXCEEDS
/		    THE RANGE OF THE BIT MAP.
/
/		(6) DISK ADDRESS IS NOT A MULTIPLE OF
/		    400 OCTAL, INDICATING THAT THE IN-
/		    TEGRITY OF THE CONTROL TABLE IS IN QUESTION.
/
/	-N	CONTENTS OF THE DISK STATUS REGISTER WHEN A
/		PERSISTENT DISK ERROR CANNOT BE CIRCUMVENTED.
/
IDX=ISZ				/USED WHEN THE SKIP IS NOT INTENDED.
/
	.EJECT
/ TASK STARTS AT THIS LOCATION WHICH IS IN PAGE 1. THE BIT MAP BUFFER
/ DSAMAP IS LOCATED IN THIS PAGE AND OCCUPIES 400 LOCATIONS.
/
DSATW	CAL	DSAW4T		/"WAITFOR" TRIGGER EVENT
				/VARIABLE FOR THE TASK "DSA".
/
DSANXT	DZM	DSATEV		/CLEAR THE "TRIGGER".
	DZM	DSADER		/CLEAR THE DISK ERROR FLAG.
	LAC	(DSARQH)	/SAVE THE REQUEST QUEUE ADDRESS
	DAC*	(R1)		/FOR USE BY "PICK".
	JMS*	(PICK)		/PICK THE 1ST NODE IN THE QUEUE.
				/(R1, R2, R6, XR & AC ARE ALTERED).
				/WAS THE DEQUE EMPTY?
	JMP	DSATW		/YES -- WAIT FOR TRIGGER.
	DAC	DSARQN		/NO -- SAVE THE NODE ADDRESS.
DSAINT	NOP			/SET TO SKIP INITIALIZATION CODE.
	LAC	DSAW4T+1	/GET AN ADDRESS FROM THIS PAGE,
	AND	(370000)	/EXTRACT THE PAGE AND BANK BITS,
	TCA			/NEGATE THEM AND SAVE.
	DAC	DSAXAD
	LAC	(JMP	DSASKP)
	DAC	DSAINT		/SKIP THIS CODE NEXT TIME THRU.
	LAC	DSARQN
DSASKP	TAD	DSAXAD		/ADJUST ADDRESS BEFORE USING IN XR.
	PAX
/
/ ***********************************************************************
/
/ NOTE -- SINCE THE DIRECTIVE WAS ISSUED FROM AN EXEC MODE TASK, IT IS
/ GUARANTEED THAT IT LIES IN THE LOWER 32K OF CORE. HENCE, INDIRECT
/ REFERENCES WORK PERFECTLY WELL.
/
/ ***********************************************************************
/
	LAC	7,X		/GET THE ADDRESS OF THE CONTROL TABLE.
	DAC	DSACTB
	IAC
	DAC	DSACTU		/SAVE ADDRESS OF UNIT # IN CTB.
	LAC*	DSACTB		/EXAMINE THE AMOUNT OF STORAGE TO
	SPA!SNA			/BE ALLOCATED OR DEALLOCATED.
	JMP	DSACTE		/ERROR -- SIZE IS NEGATIVE OR ZERO.
/
/ TEST THAT THE STORAGE SIZE IS LESS THAN OR EQUAL TO 377,400 OCTAL.
/ ANYTHING LARGER (FOR ALLOCATE) WOULD REQUIRE 400,000 (WHICH IS
/ NEGATIVE) SINCE DISK SPACE IS DOLED OUT IN 400 WORD CHUNKS.
/
	TAD	(-377400)
	SMA!SZA!CLL
	JMP	DSACTE		/ERROR -- SIZE TOO LARGE.
	PXA			/SAVE THE XR TEMPORARILY
	DAC	DSAT2
/
/ COMPUTE THE NUMBER OF 256 WORD STORAGE BLOCKS (400 OCTAL).
/
	LAC*	DSACTB
	CLQ
	LRS	10		/DIVIDE BY 400.
	PAX			/SAVE TEMPORARILY.
	LACQ			/CHECK FOR OVERFLOW INTO THE MQ.
	SZA			/IF SO, ANOTHER STORAGE BLOCK
	AXR	1		/IS NEEDED.
	PXA
	DAC	DSASBR		/+# OF STORAGE BLOCKS REQUESTED.
	TCA
	DAC	DSABKS		/-# OF STORAGE BLOCKS REQUESTED.
	LAC	DSAT2		/RESTORE THE XR
	PAX
	LAC	5,X		/IS THE SYSTEM DISK SPECIFIED?
	AND	(100
	SZA
	LAC	10,X
	SZA			/SKIP IF SO, DISREGARD UNIT IN CTA
	LAC*	DSACTU		/EXTRACT UNIT # FROM CTB
	AND	(700000)
	DAC	DSAUNT		/SAVE IT IN REQUESTED UNIT LOC.
/
/ DISPATCH TO ALLOCATE OR TO DEALLOCATE ROUTINE.
/
	LAC	DSARQN		/ADDRESS OF THE REQUEST NODE.
	TAD	DSAXAD		/ADJUST THE PAGE BITS.
	PAX
	LAC	5,X		/FETCH THE FUNCTION CODE AND
	AND	(100)		/CHECK THE MULTI-DISK BIT.
	SNA
	JMP	DSASDK		/BIT IS 0 SO ASSUME SYSTEM DISK.
	LAC	10,X		/BIT IS NON-0 SO GET DEVICE TYPE.
	SNA			/IS IT 0, INDICATING SYSTEM DEVICE?
DSASDK	LAC*	(SYSDSK)	/YES, GET SYSTEM DEVICE CODE AND
	DAC	DSATYP		/SAVE DISK DEVICE TYPE.
DSALC3	SAD	(2		/MODIFIED INSTRUCTION -- CHANGES TO
				/JMP DSADSP WHEN THE BIT MAP TABLE
				/IS PROPERLY FILLED OUT, FOR BOTH THE
				/RF AND RK. (RK TABLE IS FIXED)
				/HOWEVER, NOW, IS THIS THE RF?
	SKP
DSALC2	JMP	DSADSP		/NO -- DISPATCH
	LAC	(DSARFT		/YES -- INIT. X12 TO POINT TO RF TABLE
	DAC*	(X12
	AAC	+5		/INIT. X13 TO POINT TO 2ND HALF OF TABLE
	DAC*	(X13
	LAC	(1776		/PREPARE TO GET THE 1ST RF BIT MAP
	JMS	DSATAB		/FILL OUT TABLE FOR RF
	LAC	DSADBM		/TEMP COUNTER OF RF BIT MAPS
	TCA
	DAC	DSADBM		/SAVE THIS
	LAC	DSALC2		/MODIFY INST. IN DSALC3
	DAC	DSALC3
DSADSP	LAC	5,X		/FETCH FUNCTION CODE TO DISPATCH
	AND	(77)		/BUT LEAVE THE MULTI-DISK BIT.
	SAD	(016)
	JMP	DSADAL		/DEALLOCATE.
/
/ ASSUME ALLOCATE.
/
	JMS	DSACMP		/IS A BIT MAP IN CORE?
	JMP	DSANBM		/NO,START AT FIRST BIT MAP ON DISK.
	LAC	DSACBK		/YES, GET CURRENT MAP BLOCK #
DSARBM	DAC	DSAPLT		/SET TO REQUESTED MAP BLOCK #
	JMS	DSASEL		/LOAD ON DISK TYPE:
DSADBM	.-.			/RF - # OF BIT MAPS
	-51			/RP -       "
	-2			/RK -       "
	DAC	DSAPCT		/PUT INTO MAP COUNTER.
	JMP	DSALP1
/
/ NO BIT MAP IN CORE, GO FETCH ONE
/
DSANBM	JMS	DSASEL		/LOAD ON DISK TYPE:
	1776			/RF - FIRST BIT MAP
	764			/RP - FIRST BIT MAP
	1776			/RK - FIRST BIT MAP
	JMP	DSARBM
/
/ LOOP -- SCAN EACH BIT MAP  FOR THE SPACE REQUESTED.
/
DSALP1	JMS	DSAGBM		/"GET" A BIT MAP (IF NOT ALREADY IN CORE)
				/AND "WAITFOR" COMPLETION. CHECK FOR
				/DISK ERROR & SET FLAG IF SO,
				/CLEAR THE EVENT VARIABLE, AND
				/SET THE AC + ON RETURN IF THE TRANSFER
				/WAS SUCCESSFUL; RETURN THE DISK STATUS,
				/IF NOT.
				/(ASSUME ALL ACTIVE REGISTERS ARE
				/MODIFIED DUE TO THE CAL).
	SPA			/ERROR?
	JMP	DSAGME		/YES. RETURN WITH MINUS EV.
/
/ SCAN THE BIT MAP FOR A CONTIGUOUS SET OF FREE (0) BITS (EACH BIT
/ REPRESENTS 400 OCTAL WORDS OF DISK SPACE). FIND A SET LARGE
/ ENOUGH TO SATISFY THE ALLOCATE REQUEST.
/
	LAC	DSAMAP+1	/NUMBER OF BLOCKS ON THIS MAP
	TCA			/NEGATE
	TAD	DSAMAP+2	/ADD NUMBER OF BLOCKS TAKEN UP ON THIS MAP
	TAD	DSASBR		/PLUS THE NUMBER OF BLOCKS REQUESTED
	SMA!SZA			/SKIP IF THERE ARE POSSIBLY ENOUGH
	JMP	DSANRM		/NO, NOT ENOUGH ROOM ON THIS MAP, GET ANOTHER
	LAC	DSAMAP+1	/PICK UP THE NUMBER OF BLOCKS IN THE MAP
	IDIV!660000		/DIVIDE BY
	22			/18 TO FIND THE NUMBER OF WORDS
	TCA			/REMAINDER
	DAC	DSAREM		/SAVE THIS FOR THE LAST WORD
	DZM	DSARTS		/CLEAR FLAG INDICATING ALLOC. ON THE LAST WORD
	LACQ			/NUMBER OF FULL WORDS
	TCA!SNA			/ON THE BIT MAP
	JMP	DSANRM		/NO WORDS AVAILABLE ON THIS ONE - FORGET IT
	DAC	DSAWCT		/SET THIS IN AS LOOP CONTROL
	DZM	DSABNM		/INITIALIZE THE BIT NUMBER TO 0.
	CLX
	LAC	(SPA!CLA)	/SET THE SWITCHABLE INSTRUCTION
	DAC	DSASCH		/FOR A 0-BIT SEARCH.
/
DSALP2	LAW	-22		/18 DECIMAL BITS PER WORD
	DAC	DSACNT
DSAMNX	777777
	AND	DSAMAP+3,X	/GET WORD FROM BIT MAP.
	SAD	DSAMNX		/SAD (777777)
	JMP	DSA1S		/SAVE TIME (MAYBE).
/
DSALP3	DAC	DSATMP
/
/ SWITCHABLE INSTRUCTION -- SPA!CLA MEANS SEARCH FOR A 0-BIT;
/ SMA!CLA MEANS SEARCH FOR A 1-BIT.
/
DSASCH	XX			/SPA!CLA OR SMA!CLA.
	JMP	DSANOT		/NOT THE DESIRED BIT TYPE.
/
/ NOTE -- AC IS 0 (+).
/
	XCT	DSASCH
	JMP	DSA1BT
/
/ SAVE THE LOCATION OF THE 1ST 0-BIT.
/
	PXA			/SAVE INDEX OF WORD'S ADDRESS.
	DAC	DSAIDX
	LAC	DSARTS		/IS THIS THE PARTIAL WORD OF A BIT MAP?
	SNA
	JMP	.+3
	TAD	DSACNT		/YES -- GET BIT POSITION FOR PARTIAL WORD BY ADDING  THE
				/COMPLEMENT OF FORMAER VALUE OF DSAREM
	JMP	.+3
	LAC	DSACNT		/SAVE BIT POSITION WITHIN THE WORD.
	AAC	22
	DAC	DSABTP
	LAC	DSABNM		/SAVE THE ABSOLUTE BIT NUMBER.
	DAC	DSABTN
/
/ CHANGE THE LOOP INSTRUCTION TO SEARCH FOR A 1-BIT.
/
	LAC	DSALIT		/LAC (SMA!CLA).
	DAC	DSASCH
	JMP	DSASSW
/
/ IN ORDER TO SPEED UP PROCESSING TIME, BYPASS WORD CONTAINING ALL
/ 1-BITS WHEN SEARCHING FOR A 0-BIT.
/
DSA1S	XCT	DSASCH		/SKIP IF SEARCHING FOR 1-BIT.
	JMP	.+3
	LAW	-1		/RESTORE THE AC TO -1.
	JMP	DSALP3
	LAC	DSABNM		/ADD 18 DECIMAL TO THE CURRENT BIT NUMBER.
	AAC	22
	DAC	DSABNM
	JMP	DSAAXR
/
/ FOUND A 1-BIT.
/
DSA1BT	JMS	DSANUF		/WERE ENOUGH FREE BLOCKS FOUND?
				/IF SO, DON'T RETURN HERE -- GO TO
				/DSAFND. IF NOT, RETURN HERE WITH
				/AC=0.
/
	LAC	(SPA!CLA)	/SWITCH BACK TO 0-BIT SEARCH.
DSASSW	DAC	DSASCH
/
/ BIT JUST EXAMINED IS THE WRONG TYPE.
/
DSANOT	IDX	DSABNM		/AUGMENT THE ABSOLUTE BIT #.
	LAC	DSATMP
	RAL
	ISZ	DSACNT		/IS THE CURRENT WORD DEPLETED?
	JMP	DSALP3		/NO.
/
	CLA
	XCT	DSASCH		/SKIP IF SEARCHING FOR 0-BIT.
	JMS	DSANUF		/HAVE ENOUGH FREE BLOCKS BEEN FOUND?
				/IF SO, DON'T RETURN HERE -- GO TO
				/DSAFND. IF NOT, RETURN HERE WITH
				/AC=0.
DSAAXR	AXR	1		/INDEX TO NEXT WORD.
	ISZ	DSAWCT		/END OF FULL BIT MAP WORDS??
	JMP	DSALP2		/NO.
	LAC	DSAREM		/YES, IS THERE A REMAINDER?
	SNA			/SKIP IF SO
	JMP	DSAEOM		/NO, END OF BIT MAP
	DAC	DSACNT		/YES, SET UP FOR A PARTIAL SEARCH
	TCA			/SAVE THE 2'S COMP. OF DSAREM SO CORRECT BIT POSITION
	DAC	DSARTS		/CAN BE CALC. FOR THE PARTIAL WORD
	LAW	-1		/OF THE LAST WORD
	DAC	DSAWCT		/SET UP SO ONLY ONE MORE WORD TO LOOK AT
	DZM	DSAREM		/AND NO MORE REMAINDER
	JMP	DSAMNX		/CONTINUE
/
/ END OF BIT MAP REACHED. THIS IS CONSIDERED TO BE EQUIVALENT TO
/ HAVING FOUND A 1-BIT.
/
DSAEOM	CLA
	XCT	DSASCH		/SPA!CLA OR SMA!CLA.
	JMS	DSANUF		/WERE ENOUGH FREE BLOCKS FOUND?
				/IF SO, DON'T RETURN HERE -- GO TO
				/DSAFND. IF NOT, RETURN HERE WITH
				/AC=0.
/
/ ALLOCATE REQUEST CANNOT BE HONORED ON THIS DISK BIT MAP:
/ SUFFICIENT CONTIGUOUS FREE SPACE DOES NOT EXIST OR DISK
/ FAILURE PERSISTS.
/
DSANRM	LAC	DSAMAP+377	/PICK UP THE LINK TO THE NEXT ONE
	SAD	(-1)		/IS THIS THE END?
	SKP			/YES
	JMP	DSAENM		/NO, USE AS POINTER TO NEXT MAP.
	JMS	DSASEL		/LOAD ON DISK TYPE:
	1776			/RF - FIRST BIT MAP
	764			/RP - FIRST BIT MAP
	1776			/RK - FIRST BIT MAP
DSAENM	DAC	DSAPLT		/SET THIS AS THE NEXT BIT MAP TO USE
	ISZ	DSAPCT		/O.K. TO TRY NEXT BIT MAP?
	JMP	DSALP1		/YES.
/
/ IF A DISK ERROR OCCURRED, RETURN THE DISK STATUS IN THE REQUESTOR'S
/ EVENT VARIABLE. OTHERWISE, RETURN CODE FOR "MEDIUM FULL".
/
DSAGME	LAC	DSADER		/DISK ERROR IF NON-0.
	SNA
	LAW	-15		/CANNOT ALLOCATE SPACE REQUESTED.
				/MEDIUM FULL.
	JMP	DSAREV
/
/ THE BIT MAP CONTAINS ENOUGH FREE SPACE TO HONOR THE ALLOCATE.
/
DSAFND	LAC	DSAIDX		/SET THE XR AS INDEX TO THE WORD
	PAX			/CONTAINING THE INITIAL 0 IN
				/THIS SEQUENCE.
	JMS	DSASET		/SET THE NUMBER OF REQUESTED BITS...
	STL			/(THIS IS AN ARGUMENT TO DSASET)
				/...IN THE BIT MAP TO 1'S.
				/(LINK, AC, MQ, XR, DSACNT & DSABKS ALTERED).
	LAC	DSACTB		/SET THE XR WITH THE
	TAD	DSAXAD		/PAGE-BIT ADJUSTED
	PAX			/CONTROL TABLE ADDRESS.
	CLL			/CONVERT THE NUMBER OF STORAGE
	LAC	DSASBR		/BLOCKS TO THE NUMBER OF WORDS
	ALS	10		/ALLOCATED, AND STORE IN THE
	DAC	0,X		/REQUESTOR'S CONTROL TABLE.
/
/ NOTE: HERE WE NEED TO COMPUTE THE BLOCK # OF THE FIRST BLOCK COVERED BY
/ THE BIT MAP. SINCE BIT MAP POSITION RELATIVE TO THE DISK BLOCKS IT
/ COVERS VARIES WITH THE DISK TYPE, THE FOLLOWING CODE IS FORCED TO BE
/ DEVICE SPECIFIC. WHAT IS BEING PUT INTO THE AC IS MINUS THE # OF BLOCKS
/ IN FRONT OF THE BLOCK CONTAINING THE BIT MAP.
/
	JMS	DSASEL		/LOAD AC WITH START OF SECOND HALF OF TABLE
	DSARFT+5
	0
	DSARKT+3
	SZA			/DOES THE AC (=0) INDICATE THE RP?
	JMP	DSANRP		/NO
	LAC	DSAMAP+377	/YES -- IS THIS THE LAST RP BITMAP?
	SAD	(-1
	CLA!SKP			/YES -- IT'S UNIQUE
	LAW	-764		/NO -- DON'T USE THE TABLE TO FIND THE BIT MAP
	TAD	DSAPLT
	JMP	DSABTA
DSANRP	DAC*	(X12		/INIT. X12 AS A POINTER
	LAC*	X12		/LOOK FOR A BIT MAPBLOCK=DSAPLT
	SPA!SNA			/END OF TABLE?
	JMP	DSACTE		/YES -- ERROR
	SAD	DSAPLT		/MATCH?
	SKP			/YES
	JMP	.-5		/NO -- CHECK NEXT TABLE ENTRY
	JMS	DSASEL		/GET LAST BLOCK ON THE PREVIOUS BIT MAP
	-6
	-54
	-4
	TAD*	(X12
	DAC	DSATMP
	LAC*	DSATMP		/GET THAT BLK NO. INTO AC
	IAC			/AC NOW HAS 1ST BLOCK COVERED ON CORRECT MAP
DSABTA	TAD	DSABTN		/ADD ON RELATIVE BLOCK NUMBER
				/TO GET THE BLOCK NO. OF 1ST
				/BLOCK ALLOCATED
	LMQ			/CONVERT THIS TO A DOUBLE-WORD ADDRESS
	LLSS!ECLA 10		/AND PUT IN IN THE USER'S CTB.
	XOR	DSACUN		/XOR IN THE UNIT NUMBER FIRST.
	DAC	1,X
	LACQ
	DAC	2,X		/STORE THE SECOND WORD.
	CAL	DSAPUT		/WRITE OUT THE BIT MAP
	JMS	DSADEC		/WAIT FOR IT AND
	SPA			/SKIP IF NO ERROR.
	JMP	DSAREV		/ERROR!
	JMP	DSAEV1		/ALLOCATE WAS SUCCESSFUL. SET
				/THE REQUESTOR'S EVENT VARIABLE TO +1.
/
	.EJECT
/ DEALLOCATE ROUTINE.
/
DSADAL	LAC*	DSACTB		/AMOUNT OF STORAGE TO BE DEALLOCATED
	AND	(377)		/MUST BE AN EVEN MULTIPLE OF 400
	SZA			/OCTAL.
	JMP	DSACTE		/NO. SOMETHING IS WRONG.
	LAC	DSACTB		/PUT THE ADDRESS OF THE CONTROL
	TAD	DSAXAD		/TABLE (ADJUSTED FOR PAGE BITS)
	PAX			/ IN THE XR.
	LAC	X,2		/CREATE A BLOCK NUMBER
	LMQ			/FROM THE INFO IN THE CONTROL TABLE
	AND	(377		/IS THE DISK ADDR. VALID (MUST BE A
	SZA			/MULTIPLE OF 400 OCTAL)?
	JMP	DSACTE		/NO -- ERROR
	LAC	X,1
	AND	(377)		/MASK OFF UNIT #.
	LLSS	12		/CONVERT TO BLOCK #.
	DAC	DSAREM		/SAVE TEMP. IN SCRATCH.
	LACQ
	SZA			/TEST LO BITS LEFT IN MQ.
	JMP	DSACTE		/ERROR - NOT ON BLOCK BOUNDARY.
	LAC	DSATYP		/IS THIS THE RP?
	SAD	(3
	SKP
	JMP	DSADA1		/NO -- USE THE TABLE
	LAC	DSAREM		/YES -- CALCULATE THE VALUES FOR THE RP
	IDIV			/DIVIDE BY 1000(10)
	1750
	DAC	DSABTP		/SAVE THE RELATIVE BLK NO.
	TAD	DSASBR		/ADD THE NUMBER OF BLKS TO DEALLOCATE
	TAD	(-1750		/DOES THIS FIT ON THE MAP?
	SMA!SZA
	JMP	DSACTE		/NO -- ERROR
	LACQ			/YES -- GET QUOTIENT
	MUL!660000		/MULTIPLY BY 1000(10)
	1750
	LACQ			/GET RESULT
	SAD	(116100		/LAST RP MAP?
	SKP			/YES
	TAD	(764		/ADD 500(10)
	DAC	DSAPLT		/SAVE THE BIT MAP BLOCK NUMBER
	JMP	DSADA2
DSADA1	LAC	DSAREM		/NEGATE BLK NO. OF 1ST BLK TO DEALL.
	TCA
	DAC	DSATMP		/SAVE THIS TEMP.
	JMS	DSASEL		/FIND OUT WHAT MAP THIS IS ON.
	DSARFT
	0
	DSARKT
	DAC*	(X12
	LAC*	X12
	SPA!SNA			/END OF TABLE?
	JMP	DSACTE		/YES -- ERROR
	TAD	DSATMP		/SUBTRACT BLK NO. FROM HIGHEST
				/BLOCK ON THE MAP
	SPA			/IS THE BLOCK ON THIS MAP?
	JMP	.-5		/NO -- EXAMINE NEXT MAP
	TAD	DSABKS		/YES -- ALL BLKS TO DEAL ON THE MAP?
	IAC			/ADD 1 SO IF DEALLOCATING LAST BLOCKS ON MAP
				/A CONTROL ERROR IS NOT DECLARED.
	SPA
	JMP	DSACTE		/NO -- ERROR
	JMS	DSASEL		/YES -- WHAT BLOCK CONTAINS THE MAP?
	5
	53
	3
	TAD*	(X12
	DAC	DSATMP		/DSATMP POINTS TO THE BLOCK NO OF MAP
	LAC*	DSATMP
	DAC	DSAPLT		/SAVE THE MAP NUMBER
	LAC*	(X12
	AAC	-2
	DAC*	(X12
	LAC*	X12		/GET LAST BLK OF PREVIOUS MAP
	TCA
	TAD	DSAREM		/GET THE RELATIVE BLK NO.
	AAC	-1
	DAC	DSABTP		/SAVE RELATIVE BLK NO.
/
/ O.K. TO DEALLOCATE.
/
DSADA2	JMS	DSAGBM		/"GET" THE BIT MAP (IF NOT ALREADY IN CORE)
				/AND "WAITFOR" COMPLETION. CHECK FOR
				/DISK ERROR & SET FLAG IF SO,
				/CLEAR THE EVENT VARIABLE, AND
				/SET THE AC + ON RETURN IF THE TRANSFER
				/WAS SUCCESSFUL; RETURN THE DISK STATUS,
				/IF NOT.
				/(ASSUME ALL ACTIVE REGISTERS ARE
				/ALTERED DUE TO THE CAL).
	SPA			/ERROR?
	JMP	DSAREV		/YES. DEALLOCATE WAS UNSUCCESSFUL.
				/SET THE REQUESTOR'S EVENT VARIABLE
				/WITH THE DISK STATUS.
/
/
/FIND OUT WHICH BIT IN WHICH WORD THE DEALLOCATION FIRST BLOCK BELONGS TO
/
	LAC	DSABTP		/PICK UP THE RELATIVE BLOCK NUMBER
	IDIV!660000		/DIVIDE THIS BY
	22			/18 DECIMAL
	DAC	DSABTP		/SAVE THE REMAINDER AS THE OFFSET INTO THE WORD
	LACQ			/AND THE QUOTIENT IS
	PAX			/THE OFFSET INTO THE WORDS OF THE MAP
/
	JMS	DSASET		/SET THE NUMBER OF REQUESTED BITS...
	CLL			/(ARGUMENT TO DSASET)
				/...IN THE BIT MAP TO 0'S.
				/(LINK, AC, MQ, XR, DSACNT & DSABKS ALTERED).
	CAL	DSAPUT		/WRITE OUT THE BIT MAP
	JMS	DSADEC		/WAIT FOR EV AND
	SMA			/SKIP IF ERROR.
/
/
/ COME HERE ON SUCCESSFUL COMPLETION OF ALLOCATE OR DEALLOCATE.
/
DSAEV1	CLA!IAC
/
/ SET THE REQUESTOR'S EVENT VARIABLE IF ONE IS SPECIFIED.
/
DSAREV	PAL			/SAVE VALUE TEMPORARILY.
	LAC	DSARQN		/ADDRESS OF THE REQUEST NODE.
	DAC*	(R2)		/SAVE FOR CALL TO "IOCD" BELOW.
	TAD	DSAXAD		/ADJUST PAGE BITS BEFORE PUTTING IN XR.
	PAX
	LAC	6,X		/WAS AN EVENT VARIABLE SPECIFIED?
	SNA
	JMP	DSANOV		/NO.
	TAD	DSAXAD		/ADJUST PAGE BITS.
	PAX			/ADDRESS OF THE EVENT VARIABLE.
	PLA
	DAC	0,X
/
DSANOV	JMS*	(IOCD)		/DECREMENT THE I/O PENDING COUNT (FOR
				/NORMAL MODE TASKS ONLY).
				/(R5, XR & AC ARE ALTERED).
/
/ DECLARE A SIGNIFICANT EVENT.
/
	.SET6
/
/ RETURN THE I/O REQUEST NODE TO THE "EMPTY" POOL.
/
	LAC	(POOL)		/ADDRESS OF THE "EMPTY" POOL.
	DAC*	(R1)
	LAC	DSARQN		/ADDRESS OF THE NODE.
	DAC*	(R2)
	JMS*	(NADD)		/ADD THE NODE TO "POOL".
				/(R2, R6, XR & AC ARE ALTERED).
/
	JMP	DSANXT		/CHECK IF THERE ARE ANY OTHER
				/ALLOCATE OR DEALLOCATE REQUESTS.
/
/ ERRORS.
/
DSACTE	LAW	-104		/ERROR IN ARGUMENT IN CONTROL TABLE.
	JMP	DSAREV
/
	.EJECT
/
/ DSACMP -- SUBROUTINE TO COMPARE BIT MAPS TO SEE IF ONE THAT MATCHES
/ CURRENT REQUEST IS IN CORE. IT COMPARES DISK DEVICE TYPE AND UNIT #
/ TO DETERMINE IF A MAP ON THE REQUESTED UNIT OF THE REQUESTED DISK
/ TYPE IS IN CORE. RETURNS TO CALLER+1 IF NO MATCH IS FOUND, TO CALLER+2
/ IF A MATCH IS FOUND.
/
/	CALLING SEQUENCE:
/
/		(DSATYP -- CONTAINS REQUESTED DISK TYPE)
/		(DSAUNT -- CONTAINS REQUESTED UNIT #)
/		JMS	DSACMP
/		XX		/RETURN HERE IF NO MATCH
/		XX		/RETURN HERE ON MATCH
/
/	MODIFIED REGISTERS:
/
/		AC
/
DSACMP	0
	LAC	DSACPL		/IS THERE A BIT MAP IN CORE?
	SPA
	JMP*	DSACMP		/NO - EXIT.
	LAC	DSAGTY		/YES - IS CURRENT DISK TYPE
	SAD	DSATYP		/EQUAL TO REQUESTED TYPE?
	SKP
	JMP*	DSACMP		/NO - EXIT.
	LAC	DSACUN		/YES - IS CURRENT UNIT #
	SAD	DSAUNT		/EQUAL TO REQUESTED UNIT #?
	SKP
	JMP*	DSACMP		/NO - EXIT.
	IDX	DSACMP		/YES - RETURN TO CALLER+2
	JMP*	DSACMP
/
	.EJECT
/
/ DSASEL -- SUBROUTINE TO LOAD AC WITH ONE OF THREE CONSTANTS FOLLOWING
/ THE CALL, DEPENDING ON DISK DEVICE TYPE (DSATYP). RETURNS TO CALLER+4.
/
/	CALLING SEQUENCE:
/
/		(DSATYP CONTAINS REQUESTED DISK TYPE CODE)
/		JMS	DSASEL
/		CONSTANT 1	/LOADED IF DISK TYPE IS RF.
/		CONSTANT 2	/LOADED IF DISK TYPE IS RP
/		CONSTANT 3	/LOADED IF DISK TYPE IS RK.
/		(RETURN HERE)
/
/	MODIFIED REGISTERS:
/
/		AC
/
DSASEL	0
	LAC	DSASEL		/SETUP RETURN ADDRESS.
	AAC	3
	DAC	DSARTN
	LAC	DSATYP
	SAD	(2)		/RF DISK?
	JMP	DSARF
	SAD	(3)		/RP DISK?
	JMP	DSARP
	ISZ	DSASEL		/ASSUME RK.
DSARP	ISZ	DSASEL		/BUMP POINTER ONCE MORE.
DSARF	LAC*	DSASEL		/LOAD THE AC
	JMP*	DSARTN
DSARTN	XX			/RETURN ADDRESS
/
	.EJECT
/ SUBROUTINE DSASET -- CALLED BY ALLOCATE AND DEALLOCATE TO SET
/ AND CLEAR, RESPECTIVELY, A CONTIGUOUS SET OF BITS IN THE CORE BIT MAP.
/
/ CALLING SEQUENCE:
/
/	(DSABTP -- CONTAINING STARTING BIT # (0 TO 21 OCTAL))
/	(XR -- CONTAINING ADDRESS OF THE STARTING WORD - BASE ADDRESS)
/	(DSABKS -- CONTAINING -# OF BITS TO BE SET)
/	JMS	DSASET
/	ARG			/ARG = STL TO SET BIT = 1.
/	(UNCONDITIONAL RETURN)	/ARG = CLL TO SET BIT = 0.
/
/ MODIFIED REGISTERS:
/
/	LINK, AC, MQ,  XR, DSACNT, AND DSABKS
/
DSASET	0
	LAC*	DSASET		/STL OR CLL.
	DAC	DSASOC
	DAC	DSASTE		/SAVE INST. FOR RETURN
	DZM	DSATMP		/ZERO COUNT OF BLOCKS CHANGED
	LAW	-22		/SET COUNT FOR 18 DECIMAL BITS.
	DAC	DSACNT
	CLL
	LAC	DSAMAP+3,X	/GET 1ST WORD TO BE MODIFIED.
	DAC	DSAT1		/SAVE OLD CONTENTS OF WORD
/ 
DSAST1	RAL
	LMQ
	LAW	-22		/DOES THE COUNT INDICATE THAT THE 1ST
	TAD	DSABTP		/BIT TO BE MODIFIED IS NOW IN THE LINK?
	SAD	DSACNT
	JMP	DSAMQA		/YES.
	LACQ			/NO.
	IDX	DSACNT
	JMP	DSAST1
DSAMQA	LACQ
/
/ THE FOLLOWING REGISTER IS INITIALLY SET TO STL OR CLL TO
/ SET =1 OR =0 A SET OF BITS. WHEN THE NUMBER OF BITS TO BE SET IS
/ EXHAUSTED, THIS INSTRUCTION IS CHANGED TO NOP SO
/ THAT THE REMAINDER OF THE WORD WILL BE UNCHANGED.
/
DSASOC	XX			/STL OR CLL OR NOP.
	RAL
	ISZ	DSABKS		/HAVE ALL THE DESIRED BITS BEEN SET?
	JMP	DSAST2		/NO.
/
/ ALL DESIRED BITS HAVE BEEN SET (OR CLEARED). SINCE THE CURRENT WORD
/ MAY NOT YET BE ROTATED INTO POSITION, MODIFY THE LOOP INSTRUCTION
/ SO THAT IT NO LONGER SETS OR CLEARS BITS.
/
	LMQ			/TEMPORARY SAVE.
	LAC	(NOP)
	DAC	DSASOC
	LACQ
/
DSAST2	ISZ	DSACNT		/NO. IS THIS WORD FINISHED?
	JMP	DSASOC		/NO.
/
/ WORD HAS BEEN ROTATED LEFT 19 DECIMAL PLACES.
/
	DAC	DSAMAP+3,X	/STORE WORD.
	LAW	-22		/SET COUNTER TO COUNT SHIFTS DURING
	DAC	DSAT2		/COUNTING OF CHANGED BITS.
	LAC	DSAT1		/GET OLD VALUE OF WORD
	XOR	DSAMAP+3,X	/PREPARE TO COUNT CHANGED BITS
	SPA
	IDX	DSATMP		/BIT WAS CHANGED SO BUMP COUNTER
	ISZ	DSAT2		/END OF WORD?
	SKP
	JMP	.+3		/YES -- CONTINUE
	ALS	1		/NO -- SHIFT TO TEST NEXT BIT
	JMP	.-6
/
/ END TEST -- HAS THE SWITCHABLE INSTRUCTION BEEN CHANGED TO NOP?
/ IF SO, DONE.
/
	LAC	DSASOC		/IS IT NOP?
	SAD	(NOP)
	JMP	DSASTE		/YES. RETURN.
/
	LAW	-22		/NO. RESET THE COUNT OF
	DAC	DSACNT		/BITS PER WORD.
	AXR	1		/INDEX TO NEXT WORD.
	CLL
	LAC	DSAMAP+3,X	/PICK UP AND CONTINUE
	DAC	DSAT1		/(SAVE IT)
	RAL			/WITH THE NEXT WORD.
	JMP	DSASOC
/
DSASTE	XX			/STL OR CLL
	LAC	DSATMP		/GET NO. OF BITS CHANGED
	SNL
	TCA
	TAD	DSAMAP+2
	DAC	DSAMAP+2	/FIX BLOCKS COUNTER IN MAP
	JMP*	DSASET		/RETURN
	.EJECT
/ SUBROUTINE DSANUF -- COMPUTE THE NUMBER OF CONTIGUOUS 0-BITS FOUND
/ SO FAR, AND DETERMINE IF THIS IS ENOUGH TO SATISFY THE ALLOCATE
/ REQUEST.
/
/ CALLING SEQUENCE:
/
/	JMS	DSANUF
/	(RETURN HERE IF NOT ENOUGH)	/VALUE OF AC=0.
/	(IF ENOUGH, DON'T RETURN HERE)
/	(INSTEAD, GO TO DSAFND)
/
/ ALTERED REGISTERS:
/
/	AC
/
DSANUF	0			/NOTE -- LINK STORED HERE BY JMS.
	LAC	DSABTN		/BIT NUMBER OF THE 1ST 0-BIT.
	TCA
	TAD	DSABNM		/CURRENT BIT NUMBER.
/
/ AC NOW CONTAINS THE NUMBER OF CONTIGUOUS 0-BITS.
/
	TAD	DSABKS		/-# OF BLOCKS REQUESTED.
DSALIT	SMA!CLA			/ENOUGH? (THIS INSTRUCTION IS USED
				/AS A LITERAL).
	JMP	DSAFND		/YES.
	RES			/PRIME THE CPU TO RESTORE THE LINK
				/FROM THE SUBROUTINE ENTRY POINT.
	JMP*	DSANUF
/
	.EJECT
/ SUBROUTINE DSADEC -- (1) PERFORMS A "WAITFOR" THE EVENT VARIABLE
/ ASSOCIATED WITH THE "GET" OR "PUT" OPERATION, (2) SETS A DISK ERROR
/ FLAG IF A DISK ERROR OCCURRED, AND (3) CLEARS THE EVENT VARIABLE.
/
/ CALLING SEQUENCE:
/
/	JMS	DSADEC
/	(UNCONDITIONAL RETURN)	/EVENT VARIABLE VALUE IS IN THE AC.
/
/ ALTERED REGISTERS:
/
/	ALL ACTIVE REGISTERS (DUE TO CAL)
/
DSADEC	0
	CAL	DSAWT4		/"WAITFOR" "GET" OR "PUT" COMPLETION.
	LAC	DSAEV		/PICK UP, THEN CLEAR, THE EVENT
	DZM	DSAEV		/VARIABLE.
	SPA			/DISK ERROR?
	DAC	DSADER		/YES. SAVE THE DISK STATUS.
	JMP*	DSADEC
/
/ 
/ SUBROUTINE DSATAB -- CONSTRUCTS THE BIT MAP TABLES
/
/ CALLING SEQUENCE:
/ 
/	INIT. X12 (POINTS TO PART 1 OF TABLE)
/	INIT. X13 (POINTS TO PART 2 OF TABLE)
/	AC=1ST BIT MAP BLOCK NO.
/	JMS	DSATAB
/	(IF NO ERROR, RETURN AT JMS+1)
/	(IF ERROR, JMP TO DSAREV)
/
/ ALTERED REGISTERS: ALL
/ 
DSATAB	0
	DZM	DSATMP
	DAC	DSAPLT		/SAVE THE BIT MAP NO.
	LAC*	(X12		/SAVE X12 AROUND CAL
	DAC	DSAT1
	LAC*	(X13		/SAVE X13
	DAC	DSAT2
	JMS	DSAGBM		/GET THE BIT MAP
	SPA			/ERROR?
	JMP	DSAREV		/YES
	LAC	DSAT1		/NO -- RESTORE X12 AND X13
	DAC*	(X12
	LAC	DSAT2
	DAC*	(X13
	LAC	DSAMAP+1	/NO -- GET THE BLKS ON THIS MAP
	TAD	DSATMP		/ADD ALL BLKS COVERED SO FAR
	DAC	DSATMP		/SAVE RESULT
	AAC	-1
	DAC*	X12		/SAVE LAST BLK COVERED BY THIS MAP
	LAC	DSAPLT
	DAC*	X13		/SAVE THE MAP NO.
	IDX	DSADBM		/FOR RF COUNT MAPS
	LAC	DSAMAP+377	/LAST MAP?
	SAD	(-1
	JMP*	DSATAB		/YES -- RETURN
	JMP	DSATAB+2	/NO -- GET NEXT MAP
	.EJECT
/ SUBROUTINE DSAGBM -- TESTS IF THE REQUESTED BIT MAP IS IN CORE AND,
/ IF NOT, BRINGS IT IN.
/
/ CALLING SEQUENCE:
/
/	JMS	DSAGBM
/	(UNCONDITIONAL RETURN)	/AC + IF NO ERROR.
/				/AC - (DISK STATUS) IF ERROR.
/
/ ALTERED REGISTERS:
/
/	ALL ACTIVE REGISTERS (DUE TO CAL)
/
DSAGBM	0
	LAC*	(WARMFL)	/SAVE BIT 0 OF THE "WARM START" FLAG
	RAL			/IN THE LINK.
	.INH			///INHIBIT INTERRUPTS.
	LAC*	(WARMFL)	///CLEAR BIT 0 IN THE FLAG.
	AND	(377777)	///
	.ENB			///ENABLE INTERRUPTS.
	DAC*	(WARMFL)	///
	SZL			/IF THE RF15 WARM START BIT WAS ON, NO
	JMP	DSAWRM		/BIT MAP HAS BEEN READ IN SINCE THE LATEST
				/WARM START OR SAVE, WHICHEVER CAME LAST.
	JMS	DSACMP		/DOES DISK TYPE AND UNIT # MATCH
	JMP	DSAWRM		/NO, TREAT AS WARM START.
	LAC	DSAPLT		/YES, BUT IS REQUESTED MAP
	SAD	DSACBK		/EQUAL TO CURRENT MAP?
	JMP*	DSAGBM		/YES, SO RETURN.
DSAWRM	LAW	-1		/SET THE MAP FLAG TO INDICATE
	DAC	DSACPL		/THAT NO BIT MAP IS IN CORE (IN CASE OF
				/AN ERROR).
	CLL
	LAC	DSAPLT		/ CHANGE THE BLOCK # OF THE BIT MAP TO A
	LMQ			/DOUBLE WORD DISK ADDRESS
	LLSS!ECLA  10		/MULTIPLY BY 400(8)
	XOR	DSAUNT		/XOR DISK UNIT # INTO BITS 0-2.
	DAC	DSADKC		/LOAD HI ORDER ADDRESS INTO CTB.
	LACQ
	DAC	DSADKC+1	/THEN LOAD LO ORDER PART INTO CTB.
	LAC	DSATYP		/SET UP DISK TYPE CODE
	DAC	DSAGTY		/IN GET/PUT CPB'S.
	DAC	DSAPTY
	CAL	DSAGET		/"GET" THE BIT MAP.
	JMS	DSADEC		/"WAITFOR" COMPLETION, CHECK FOR DISK
				/ERROR & SET FLAG IF SO, CLEAR THE EVENT
				/VARIABLE, AND RETURN THE EVENT VARIABLE
				/SETTING IN THE AC. (ASSUME ALL ACTIVE
				/REGISTERS ARE ALTERED DUE TO THE CAL).
	SPA			/ERROR?
	JMP*	DSAGBM		/YES (DISK STATUS IN THE AC).
	LAC	DSAUNT
	DAC	DSACUN		/UPDATE CURRENT UNIT #.
	LAC	DSAPLT		/NO -- SET THE CURRENT MAP BLOCK # TO
	DAC	DSACBK		/INDICATE WHICH BIT MAP IS IN CORE.
	LAC	(1		/SET DSACPL POSITIVE TO INDICATE THAT
	DAC	DSACPL		/A BIT MAP IS IN CORE.
	JMP*	DSAGBM		/NOTE -- AC +.
/
	.EJECT
/ "GET" CPB.
/
DSAGET	13000			/"GET" I/O REQUEST CODE.
	DSAEV			/EVENT VARIABLE.
	1			/LOGICAL UNIT 1 (TO WHICH IT IS
				/KNOWN THAT "DSK" IS ASSIGNED).
	DSADKC			/CONTROL TABLE ADDRESS.
DSAGTY	0			/DISK DEVICE TYPE
/
/ "PUT" CPB.
/
DSAPUT	13100			/"PUT" I/O REQUEST CODE.
	DSAEV			/EVENT VARIABLE.
	1			/LOGICAL UNIT 1 (TO WHICH IT IS
				/KNOWN THAT "DSK" IS ASSIGNED).
	DSADKC			/CONTROL TABLE ADDRESS.
DSAPTY	0			/DISK DEVICE TYPE.
/
DSADKC	.-.			/CONTROL TABLE FOR GET AND PUT
	.-.			/DOUBLE WORD DISK ADDRESS GOES HERE
	DSAMAP			/CORE BUFFER ADDRESS.
	400			/NUMBER OF WORDS TO "GET" OR "PUT".
/
/ "WAITFOR" CPB.
/
DSAWT4	20			/"WAITFOR" CODE.
	DSAEV
/
DSAEV	0			/EVENT VARIABLE ASSOCIATED WITH
				/"GET" AND "PUT".
/
/ "WAITFOR" CPB.
/
DSAW4T	20			/"WAITFOR" CODE.
	DSATEV
/
DSATEV	0			/EVENT VARIABLE USED TO "TRIGGER"
				/EXECUTION OF THIS TASK. VARIABLE IS
				/SET BY THE TASK "DSK" WHEN IT HAS
				/QUEUED AN ALLOCATE OR DEALLOCATE
				/REQUEST.
DSADER	0			/IF A PERSISTENT DISK ERROR OCCURS,
				/THE CONTENTS OF THE DISK STATUS
				/REGISTER ARE STORED HERE.
DSABTP	0			/BIT POSITION WITHIN THE WORD.
DSASBR	0			/+# OF STORAGE BLOCKS REQUESTED.
DSABKS	0			/-# OF STORAGE BLOCKS REQUESTED.
DSACNT	0			/COUNTER.
DSATMP	0			/TEMPORARY STORAGE.
DSABNM	0			/BIT NUMBER (0 TO 1777).
DSABTN	0			/BIT NUMBER (0 TO 1777).
DSAWCT	0			/-# OF WORDS REMAINING TO BE
				/SCANNED IN THE BIT MAP.
DSAIDX	0			/INDEX.
DSATYP	0			/REQUESTED DISK DEVICE TYPE.
DSAUNT	0			/REQUESTED DISK UNIT NUMBER (BITS 0-2).
DSACUN	0			/CURRENT UNIT NUMBER (BITS 0-2).
DSACBK	0			/CURRENT BIT MAP BLOCK NUMBER.
DSACTU	0			/ADDRESS OF UNIT # IN CTB.
DSAXAD	0			/PAGE BIT ADJUSTMENT FACTOR.
DSACTB	0			/ADDRESS OF THE CONTROL TABLE
				/ASSOCIATED WITH THE ALLOCATE
				/OR DEALLOCATE REQUEST.
DSARQN	0			/ADDRESS OF THE I/O REQUEST NODE.
DSARQH	.			/HEAD OF THE I/O REQUEST QUEUE
	.-1			/FOR THIS TASK. ENTRIES ARE
				/MADE BY THE TASK "DSK".
DSACPL	-1			/SET POSITIVE TO INDICATE WHEN A
				/BIT MAP IS IN CORE. SET NEGATIVE WHEN
				/NO BIT MAP IS IN CORE.
DSAPLT	.-.			/REQUESTED DISK BIT MAP ADDRESS
DSAREM	.-.			/SCRATCH STORAGE
DSAPCT	0			/BIT MAP COUNTER USED BY ALLOCATE.
DSAT1	0			/TEMP STOREAGE
DSAT2	0			/TEMP STOREAGE
DSARTS	0			/BIT COUNTER FOR LAST PARTIAL WORD OF MAP
/
/ DSA "SHORT PARTITION BLOCK" (FOR REGISTER SAVE USE ONLY)
/
				/DSAIC = PARTITION BLOCK
DSAIC	SHPB			/ADDRESS PLUS AN OFFSET.
/
/ ACTIVE TASK LIST NODE.
/
DSA	TTY			/FORWARD LINKAGE
	DSK			/BACKWARD LINKAGE
	.SIXBT	"DSA"		/TASK NAME (FIRST HALF)
	0			/TASK NAME (SECOND HALF)
	1			/TASK PRIORITY (MUST BE LOWER
				/THAN THAT OF THE TASK "DSK").
	DSAIC-P.IC		/PARTITION BLOCK ADDRESS.
	0			/STL NODE ADDRESS (NONE).
	4			/TASK STATUS (INITIALLY
				/READY FOR RESUMPTION).
	DSATW			/RESUMPTION ADDRESS.
	0			/EVENT VARIABLE ADDRESS
	.IFPNZ	NDSZMT
	.REPT	NDSZMT
	0
	.ENDC
/
/
/ DISK BIT MAP BUFFER FOR DSA ROUTINE
/
DSAMAP	.BLOCK	400
	.EJECT
/
/ BIT MAP TABLES
/
/ THE FORMAT OF THESE THREE TABLES IS AS FOLLOWS:
/
/	DSARXT	-1
/		####	/LAST BLOCK COVERED BY 1ST BIT MAP
/		####	/LAST BLOCK COVERED BY 2ND BIT MAP
/		.
/		.
/		.
/		####	/LAST BLOCK COVERED BY LAST BIT MAP
/		-1
/		####	/BLOCK NUMBER OF 1ST BIT MAP
/		####	/BLOCK NUMBER OF 2ND BIT MAP
/		.
/		.
/		.
/		####	/BLOCK NUMBER OF LAST BIT MAP
/
DSARFT=.
	.REPT	12
	-1
DSARKT=.
	-1
	10645
	11407
	-1
	1776
	1775
	-1
