.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: 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,>,<175> TEXT 2,,<15> TEXT 3,,<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,>,<175> TEXT 12,,<15> TEXT 13,,<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