Added base source
authorRichard Cornwell <rcornwell@github.com>
Fri, 25 Nov 2016 19:48:50 +0000 (14:48 -0500)
committerRichard Cornwell <rcornwell@github.com>
Fri, 25 Nov 2016 19:48:50 +0000 (14:48 -0500)
41 files changed:
src/clkcss.mac [new file with mode: 0644]
src/clock1.mac [new file with mode: 0644]
src/comcon.mac [new file with mode: 0644]
src/common.mac [new file with mode: 0644]
src/conall.ccl [new file with mode: 0644]
src/config.mac [new file with mode: 0644]
src/core1.mac [new file with mode: 0644]
src/crfall.ccl [new file with mode: 0644]
src/dcsint.mac [new file with mode: 0644]
src/disser.mac [new file with mode: 0644]
src/dist30.mac [new file with mode: 0644]
src/dlsint.mac [new file with mode: 0644]
src/dpdint.mac [new file with mode: 0644]
src/dskint.mac [new file with mode: 0644]
src/dskser.mac [new file with mode: 0644]
src/dtasrn.mac [new file with mode: 0644]
src/dtcsrn.mac [new file with mode: 0644]
src/eddt.mac [new file with mode: 0644]
src/errcon.mac [new file with mode: 0644]
src/ft40n.mac [new file with mode: 0644]
src/ft50sb.mac [new file with mode: 0644]
src/jobdat.mac [new file with mode: 0644]
src/k.mac [new file with mode: 0644]
src/lptser.mac [new file with mode: 0644]
src/macro.v46 [new file with mode: 0644]
src/mongen.mac [new file with mode: 0644]
src/mongen.rno [new file with mode: 0644]
src/mtasrx.mac [new file with mode: 0644]
src/mtcsr6.mac [new file with mode: 0644]
src/nulseg.mac [new file with mode: 0644]
src/onceb.mac [new file with mode: 0644]
src/patch.mac [new file with mode: 0644]
src/pltser.mac [new file with mode: 0644]
src/ptpser.mac [new file with mode: 0644]
src/ptrser.mac [new file with mode: 0644]
src/ptysrf.mac [new file with mode: 0644]
src/ptysrh.mac [new file with mode: 0644]
src/s.mac [new file with mode: 0644]
src/schedb.mac [new file with mode: 0644]
src/scnsrf.mac [new file with mode: 0644]
src/uuocon.mac [new file with mode: 0644]

diff --git a/src/clkcss.mac b/src/clkcss.mac
new file mode 100644 (file)
index 0000000..1412f7f
--- /dev/null
@@ -0,0 +1,183 @@
+TITLE  CLKCSS - SCHEDULING ALOGRITHM FOR NON-SWAPPING SYSTEMS\r
+SUBTTL T. HASTINGS/TH TS3.17 6 SEP 67 V001\r
+XP     VOLKCS,001\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;SCHEDULING ALGORITHM IS:\r
+;CALLED EVERY 60TH OF A SECOND WHEN CURRENT JOB IS USER MODE\r
+;CALLED WHEN CURRENT JOB IS IN EXEC MODE AND:\r
+;      1. JUST STARTED TO WAIT FOR IO\r
+\r
+;      2. JUST STARTED TO WAIT FOR A BUSY SHARABLE DEVICE\r
+;      3. RETURNING TO USER AFTER TYPING CONTROL C\r
+;      4. RETURNING TO USER AFTER CLOCK TRIED TO INTERRUPT\r
+;              CURRENT JOB WHILE IT WAS IN EXEC MODE\r
+;      5. AND ERROR OCCURRED IN CURRENT JOB\r
+\r
+;CALL: SETOM TIMEF             ;IF CLOCK HAS GONE OFF SINCE LAST CALL\r
+;      PUSHJ PDP,NXTJOB\r
+;      RETURN WITH NEXT JOB TO RUN IN AC ITEM\r
+\r
+;INTIALIZE SCHEDULER(CALLED FROM IOINI1 BEFORE ALL OTHER\r
+;      DEVICES ARE INITIALIZED)\r
+\r
+INTERNAL NXTINI\r
+\r
+NXTINI:        MOVSI TAC,-NQUEUE       ;NO. OF QUEUES\r
+       SETZM AVALTB(TAC)       ;CLEAR SHARABLE DEVICE AVAILABLE FLAGS\r
+       SETOM REQTAB(TAC)       ;SET SHARABLE DEVICE REQUEST COUNT TO -1\r
+                               ;IE NO JOB WAITING OR USING DEVICE\r
+       AOBJN TAC,.-2           ;OTHER DEVICE INITIALIZATION\r
+       POPJ PDP,               ;MAY CHOOSE TO SET REQUEST TO MORE\r
+                               ;NEG. VALUE IF MORE THEN ON JOB CAN\r
+                               ;USE DEVICE AT ONCE\r
+\f\r
+INTERNAL NXTJOB\r
+INTERNAL FTTRPSET,FTDISK\r
+EXTERNAL JOB,TIMEF,JBTSTS,JOBMAX,JOBN,PJBSTS,CPOPJ,CHKSHF\r
+ENTRY XCKCSS\r
+\r
+T=TAC          ;TEMPORARY\r
+Q=TAC1         ;QUEUE NO.\r
+Q1=DEVDAT      ;QUEUE NO. SHIFTED TO MATCHING POS. OF JBTSTS WORD\r
+C=DAT          ;COUNT OF JOB LEFT TO SCAN\r
+\r
+XCKCSS:\r
+NXTJOB:        PUSHJ PDP,CHKSHF        ;SHUFFLE CORE IF NEEDED\r
+       SETZM T\r
+       SKIPN ITEM,JOB          ;CURRENT JOB NO.. IS IT NULL JOB?\r
+       JRST NXT0               ;YES, DO NOT DECREMENT QUANTUM RUN TIME\r
+       SKIPE TIMEF             ;NO, IS THIS A CLOCK INTERRUPT CALL?\r
+       SOSA T,JBTSTS(ITEM)     ;YES, DECREMENT QUANTUM RUN TIME\r
+                               ;IN JOB STATUS WORD\r
+       SKIPA T,JBTSTS(ITEM)    ;NO, JUST PICKUP STATUS WORD\r
+       TRNE T,-1               ;REDUCE TIME TO ZERO YET?\r
+       JRST NXT1               ;NO\r
+       HRR T,RNQUNT            ;YES, RESET FOR RUN QUEUE QUANTUM\r
+NXT0:  SETOM RNAVAL            ;FLAG TO SCAN RUN QUEUE FOR DIFFERENT JOB\r
+NXT1:  HRRM T,JBTSTS(ITEM)     ;STORE MODIFIED QUANTUM RUN TIME\r
+       MOVEI Q,MAXQ            ;HIGHEST PRIORITY QUEUE SCANNED FIRST\r
+NXT2:  SKIPN AVALTB(Q)         ;SHOULD THIS QUEUE BE SCANNED FOR A RUNABLE JOB?\r
+NXT3:  SOJGE Q,NXT2            ;NO, LOOK AT NEXT LOWEST PRIORITY QUEUE\r
+       JUMPL Q,NXT7            ;YES, LOOKED AT QUEUES NQUEUE-1..,0?\r
+       MOVE Q1,Q               ;MOVE QUEUE INDEX TO PROPER POS.\r
+       ROT Q1,^D17-JWPOS       ;TO MATCH JOB STATUS WORD\r
+       MOVEI C,JOBMAX          ;NO, SACN ALL JOBS(EXECEPT NULL JOB)\r
+       AOSA ITEM,JOBP(Q)       ;SCAN ALL OTHER JOBS IN THIS QUEUE FIRST\r
+\r
+NXT4:  SETOM RNAVAL            ;FLAG RUN QUEUE BEING SCANNED\r
+\r
+NXT5:  CAIL ITEM,JOBN          ;GREATER THEN HIGHEST JOB NO.?\r
+       MOVEI ITEM,1            ;YES, RESET TO 1(SKIP NULL JOB)\r
+       HLRZ T,JBTSTS(ITEM)     ;IS JOB RUNABLE?\r
+       TRZ T,RUNMSK+CMWB       ;MASK OUT JOB STATUS BITS WHICH DO NOT MATTER\r
+       CAIN T,RUNABLE(Q1)      ;ADD IN QUEUE NO. IN PROPER POSITION\r
+       JRST NXT8               ;YES, IT IS RUNABLE AND IS IN THIS QUEUE\r
+NXT6:  SOJLE C,NXT3            ;NO IT IS NOT, SCANNED ALL JOBS YET?\r
+       AOJA ITEM,NXT5          ;NO, LOOK AT NEXT JOB\r
+\f\r
+;HERE IF NO JOBS FOUND TO RUN(Q=-1)\r
+\r
+NXT7:  MOVEI C,JOBN            ;SCAN ALL JOBS INCLUDING POSSIBLY NULL JOB\r
+       MOVE ITEM,JOB           ;STARTING WITH LAST JOB TO RUN\r
+       SKIPN Q1,RNAVAL         ;HAS RUN QUEUE(Q,Q1=7) BEEN SCANNED?\r
+       AOJA Q,NXT4             ;NO, FLAG THAT IS HAS AND SCAN RUN QUEUE(Q,Q1=2)\r
+       SETZB ITEM,RNAVAL       ;YES, CLEAR FLAG, SET NULL JOB TO RUN\r
+       POPJ PDP,               ;RETURN\r
+\r
+NXT8:\r
+IFN FTTRPSET,<\r
+       EXTERNAL STOPTS\r
+       MOVE T,STOPTS                   ;HAS A TRPSET UUO BEEN DONE FOR JOB1\r
+                                       ;WITH NON ZERO AC?\r
+       CAIE ITEM,1                     ;IS THIS JOB 1?\r
+       JUMPN T,NXT6                    ;KEEP LOOKING IF NOT JOB1 AND\r
+                                       ;STOPTS FLAG SET\r
+>\r
+\r
+       CAIE Q,TSQ              ;IS THIS TTY WAIT SATISFIED Q?\r
+       CAIN Q,WSQ              ;IS THIS IO WAIT SATISFIED QUEUE?\r
+       SOSGE AVALTB(Q)         ;YES, DECREMENT COUNT OF JOBS WITH SATISFIED IO\r
+       SETZM AVALTB(Q)         ;NO, CLEAR AVAILABLE FLAG FOR THIS QUEUE\r
+       MOVEM ITEM,JOBP(Q)      ;SAVE JOB NUMBER FOR THIS QUEUE FOR NEXT TIME\r
+       JUMPE Q,CPOPJ           ;IS THIS RUN QUEUE?\r
+       MOVEI T,RNQ             ;NO, SET STATE CODE TO RUN\r
+       DPB T,PJBSTS            ;CLEAR WAIT CODE(SO HE WILL BE IN RUN QUEUE)\r
+       MOVE T,QUANTS(Q)        ;SET QUANTUM RUNNING TIME FOR QUEUE\r
+       HRRM T,JBTSTS(ITEM)     ;WHICH JOB HAS JUST LEFT\r
+       POPJ    PDP,            ;RETURN\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL JOBP,AVALTB,REQTAB,QUANTS\r
+\r
+DEFINE X(A,B)\r
+<      EXTERNAL A'AVAL,A'REQ,A'QUNT\r
+       INTERNAL A'Q\r
+       A'Q=ZZ\r
+       ZZ=ZZ+1\r
+>\r
+       ZZ=0\r
+       QUEUES\r
+       LOC=ZZ\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;APPROPRIATE ENTRY IS NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
+;AT THAT QUEUE TO FIND A JOB TO RUN\r
+;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
+;SIMILARLY FOR TSAVAL\r
+\r
+DEFINE X(A,B)\r
+<      INTERNAL A'AVAL,A'Q\r
+       A'Q=.-AVALTB\r
+               A'AVAL: 0\r
+>\r
+\r
+INTERNAL AVALTB\r
+\r
+AVALTB: QUEUES         ;GENERATE THE AVAL FLAGS\r
+LOC=.-AVALTB\r
+>\r
+\r
+NQUEUE=LOC             ;NO. OF QUEUES COUNTING RUN QUEUE\r
+XP MAXQ,NQUEUE-1       ;MAX STATE CODE WHICH HAS A QUEUE\r
+\r
+;DEFINE STATE CODES WHICH DO NOT HAVE QUEUES ASSOCIATED WITH THEM\r
+\r
+\r
+DEFINE X(A)\r
+<      INTERNAL A'Q\r
+       A'Q=LOC\r
+       LOC=LOC+1\r
+>\r
+\f\r
+       CODES\r
+\f\r
+IFE FTCHECK+FTMONP,<\r
+;LAST JOB SCHEDULED FOR EACH QUEUE\r
+\r
+JOBP:   REPEAT NQUEUE,<                EXP 1>\r
+\f\r
+;SHARABLE DEVICE REQUEST TABLE(GENERAL;IZED FOR OTHER QUEUES TOO)\r
+;CONTAINS THE NUMBER OF JOBS WAITING TO USE SHARABLE DEVICE\r
+;WSREG AND RNREG ARE UNUSED\r
+\r
+DEFINE X(A,B)\r
+<      A'REQ:  0\r
+       INTERNAL A'REQ\r
+>\r
+\r
+INTERNAL REQTAB\r
+\r
+REQTAB: QUEUES\r
+\f\r
+;QUANTUM RUNNING TIME FOR EACH QUEUE IN JIFFIES(CLOCK TICKS)\r
+\r
+DEFINE X(A,B)\r
+<      A'QUNT: EXP 2\r
+       INTERNAL A'QUNT\r
+>\r
+QUANTS:        QUEUES\r
+>\r
+       END,\r
diff --git a/src/clock1.mac b/src/clock1.mac
new file mode 100644 (file)
index 0000000..eff0f89
--- /dev/null
@@ -0,0 +1,989 @@
+TITLE  CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTING AND STOP ROUTINES - V412\r
+SUBTTL APRINT TH/TH/CHW   TS  20 MAY 69\r
+XP VCLOCK1,412\r
+               ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+       ENTRY CLOCK1    ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH\r
+CLOCK1:\r
+\r
+;THIS SERVICE ROUTINE RUNS ON A HIGH PRIORITY CHANNEL\r
+;AND REQUESTS INTERRUPTS ON LOWER CLK CHANNEL\r
+;FOR SCHEDULING JOBS AND ERROR HANDLING THAT THE USER\r
+;IS NOT ENABLED TO HANDLE HIMSELF\r
+\r
+EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME\r
+EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF\r
+\r
+EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES\r
+EXTERNAL RELEA9,CRSHWD,CRASHX\r
+\r
+INTERNAL       FTTTYSER        ;THIS ROUTINE MAY BE ASSEMBLED TO WORD  EITHER\r
+                               ; THE OLD SCNSER OR THE NEW TTYSER.\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK\r
+INTERNAL UUO1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+       INTERN CLOCK,DAMESS\r
+       EXTERN CIPWTM\r
+APRCON: 231000         ;MONITOR ENABLED CPU FLAGS\r
+APRIN1: 0              ;USER ENABLED CPU FLAGS\r
+CLKS17: 0              ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT\r
+DAMESS: ASCIZ /-JAN-/\r
+\r
+CLOCK: POINT 36,CIPWTM,35      ;BYTE POINTER TO CLOCK REQ QUEUE\r
+>\r
+\f\r
+       INTERN APRINT\r
+\r
+APRINT:        JRST APRPAR             ;ALWAYS CHECK APR AND PI DEVICES\r
+       JRST .                  ;CHECK OTHER DEVICES\r
+\r
+APRPCL: CONO PI,240000         ;TURN OFF MEM PAR, ERR, AND\r
+                               ; ENABLE FOR MEM PAR AND TRY AGAIN\r
+                               ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY\r
+                               ; DISABLES POWR FAIL INTERRUPT)\r
+APRPAR: CONSZ PI,600000                ;MEM PARITY ERROR OR POWER FAILURE?\r
+       HALT APRPCL             ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN\r
+                               ; ON CONTINUE\r
+       CONSO APR,@APRCON       ;INTERRUPT FOR APR?\r
+                               ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF\r
+                               ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS\r
+                               ; ENABLED FOR PC CHANGE OR AR OVF\r
+       JRST APRINT+1           ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL\r
+       SKIPE CRSHWD            ;IS LOC, 30 CLOBBERED?\r
+       JRST CRASHX             ;YES ~ GO SAVE AC'S & STATE OF ALL DEVS,\r
+       CONSO APR,001000        ;YES, IS IT CLOCK?\r
+       JRST APRER              ;NO, GO CHECK ERROR FLAGS\r
+       AOS TIME                ;YES, INCREMENT TIME OF DAY\r
+       AOS UPTIME              ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED\r
+       SETOM TIMEF             ;FLAG THAT APR CLOCK HAS TICKED\r
+       SETOM CLKFLG            ;SET FLAG FOR CLK FORCED INTERRUPT\r
+       CONO PI,REQCLK          ;REQUEST INTERRUPT ON CLK CHANNEL\r
+       CONSZ APR,@APRIN1       ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK)\r
+                               ; RH ALSO MODIFIED EACH TIME A USER RUNS\r
+       JRST APRER              ;YES, GO PROCESS TRAP\r
+       CONO APR,1000+APRCHN    ;NO, CLEAR ONLY THE CLOCK FLAG\r
+       JEN @APRCHL             ;DISMISS INTERRUPT\r
+\r
+;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS\r
+\r
+APRER1:        CONO APR,1000+APRCHN    ;NOW CLEAR CLOCK FLAG\r
+       EXCH TAC,APRCHL         ;SAVE TAC, GET PC\r
+       TLNE TAC,USRMOD         ;IS PC FROM USER MODE?\r
+       JRST APRER4             ;YES, GO TRAP TO HIM\r
+       JRST APRER2             ;NO. GO CHECK IN CASE ALSO A SERIOUS ERROR\r
+\f\r
+;OTHER APR INTERRUPTS BESIDES CLOCK\r
+\r
+APRER: EXCH TAC,APRCHL         ;SAVE TAC, GET PC\r
+       TLNE TAC,USRMOD         ;IS PC IN USER MODE?\r
+       CONSO APR,@APRIN1       ;YES, IS USER ENABLED FOR THIS ERROR\r
+       JRST APRER2             ;NO, PRINT ERROR MESSAGE AND STOP JOB\r
+APRER4:        EXCH JDAT,JOBDAT        ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR.\r
+       MOVEM TAC,JOBTPC(JDAT)  ;STORE PC IN JOB DATA AREA\r
+\r
+       CONI APR,JOBCNI(JDAT)   ;STORE APR IN JOB DATA AREA\r
+       HLLZS JOBENB(JDAT)      ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO\r
+                               ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS\r
+       SETZM APRIN1            ;ALSO CLEAR USER APR CONSO FLAGS\r
+       HRRI TAC,231000         ;AND SET MONITOR TO LOOK ONLY FOR\r
+       HRRM TAC,APRCON         ;PD OVF,ILM,NXM, AND CLOCK\r
+       HRR TAC,JOBAPR(JDAT)    ;GET USER LOC TO TRAP TO\r
+       EXCH JDAT,JOBDAT        ;RESTORE JDAT,JOBDAT\r
+       CONO APR,440+APRCHN     ;DISBALE FOV, AROVF IN CASE ON\r
+                               ;SO USER MUST REENABLE WITH SETAPR UUO\r
+\r
+APRER3:        TLZ     TAC,440000      ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS\r
+                               ; SO INTERRUPT MAY BE DISMISSED\r
+       EXCH    TAC,APRCHL      ;RESTORE TAC & APRCHL\r
+       CONO APR,430110+APRCHN  ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS\r
+                               ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY)\r
+       JEN @APRCHL             ;DISMISS INTERRUPT\r
+\f\r
+APRER2: CONSO  APR,NXM!ILM!POV! ;DOES EXEC CARE?\r
+       JRST    APRER3          ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF\r
+       MOVEM   TAC,APRPC       ;STORE ERROR PC FOR CLK CHANNEL\r
+       CONI APR,APRERR         ;STORE ERROR FLAGS\r
+                               ; (ALSO USED AS ERROR FLAG)\r
+       SETOM CLKFLG            ;SET FLAG FOR CLK INTERRUPT\r
+       SETOM SCHEDF            ;FLAG THAT RESCHEDULING IS NEEDED\r
+                               ; (EVEN THROUGH PC MAY BE IN EXEC MODE)\r
+       CONO PI,REQCLK          ;REQUEST INTERRUPT IN CLK CHANNEL\r
+       CONSZ   APR,ILM         ;WAS ERROR ILLEGAL MEMORY(FROM USER)?\r
+       HRRI    TAC,0           ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT\r
+                               ; WILL NOT OCCUR IF THIS IS A WILD(AND A PDP-10)\r
+IFN FTHALT,<\r
+       CONSZ   PI,003400       ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR?\r
+                               ; (PDP-10 BITS ONLY)\r
+       HALT .+1                ;YES, HALT SO CONTINUE WILL TRY TO RECOVER\r
+>\r
+       JRST    APRER3          ;NO,MUST BE UUO LEVEL(OR USER MODE AND\r
+                               ; MEMORY DROPPED OUT)\r
+\f\r
+SUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)\r
+\r
+;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL\r
+;TO CAUSE AN INTERRUPT ON CLK CHANNEL:\r
+;      SETOM CLKFLG    ;FLAG THAT INTERRUPT HAS BEEN REQUESTED\r
+;      CONO PI,CLKREQ  ;REQUEST PI INTERRUPT ON LOWEST PI CHANNEL\r
+;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET\r
+;APRERR-APR DETECTED ERROR IN CURRENT JOB\r
+;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THROUGH PC IN EXEC MODE)\r
+;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL\r
+;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED\r
+\r
+;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS:\r
+;PROCESSES CLOCK QUEUE REQUESTS\r
+;CALLS CONSOLE MONITOR COMMAND DECODER\r
+;CALLS CORE SHUFFLER\r
+;THEN CALLS SCHEDULER\r
+;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE\r
+;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL\r
+\r
+;      1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE\r
+;      2. JOB STARTS TO WAIT FOR A IO TO COMPLETE\r
+;      3. CONTROL ABOUT TO RETURN TO USER MODE\r
+;THEN CLK SERVICE IS ENTERED AT THE UU0 LEVEL\r
+\r
+STOR=DAT\r
+T=TAC\r
+T1=TAC1\r
+JA=JDAT\r
+\r
+;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR\r
+;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS\r
+;HAVE OCCURRED\r
+\r
+;TO MAKE A REQUEST:\r
+;      CONO PI,PIOFF\r
+;      IDPB AC,CLOCK   ;STORE CLOCK REQUEST IN QUEUE\r
+;      CONO PI,PION    ;TURN PI BACK ON\r
+;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS*DATA*10000\r
+;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT\r
+;CLK SERVICE WILL PUSHJ PDP,ADR\r
+;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC\r
+;ALL ACS ARE FREE TO USE WHEN CALL IS MADE\r
+\r
+INTERNAL CLKINI\r
+EXTERNAL CIPWTM1,PION,PIOFF\r
+\r
+CLKINI:        MOVEI TAC,CIPWTM1       ;SETUP CLOCK QUEUE BYTE POINTER\r
+       HRRM TAC,CLOCK          ;LH NEVER CHANGES(36 BIT BYTE)\r
+       POPJ PDP,\r
+\f\r
+;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT\r
+;CALL: PUSHJ PDP,WSCHED\r
+;      RETURN HERE WHEN RUNABLE AGAIN\r
+\r
+INTERNAL WSCHED\r
+EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL\r
+\r
+WSCHED:        POP PDP,USRPC           ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
+       MOVEI AC3,JOBDAC(JDAT)  ;SAVE ACS 0-16 IN DUMP ACS\r
+       BLT AC3,JOBD16(JDAT)    ;IN CURRENT JOB DATA AREA\r
+       MOVEI PDP,NULPDL        ;NULL JOB PD LIST\r
+       HRLI PDP,MJOBP1         ; OTHERWISE GET PD OUF\r
+\r
+       JRST RSCHED             ;GO RESCHEDULE\r
+\r
+;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE\r
+;FROM A UUO CALL AND EITHER:\r
+;      1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE\r
+;      2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS\r
+;              IN EXEC MODE\r
+\r
+;CALL: PUSHJ PDP,USCHED        ;FROM UUOCON(UUO HANDLER RETURN TO USER)\r
+;      RETURN HERE WHEN RUNABLE\r
+\r
+INTERNAL USCHED\r
+EXTERNAL JOBDPG,JOBDPD,USRPC\r
+\r
+USCHED:        POP PDP,USRPC           ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
+       MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA\r
+       MOVEM PDP,JOBDPD(PROG)  ;SAVE PDP\r
+       JRST RSCHED             ;GO RESCHEDULE\r
+\f\r
+;HERE AT CLK INTERRUPT LEVEL\r
+\r
+INTERNAL CLKINT\r
+INTERNAL FTTIME\r
+EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC\r
+EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL\r
+\r
+CLKINT:        SKIPN CLKFLG            ;CLK INTERRUPT REQUEST?\r
+       JRST CLKINT                     ;NO, CHECK OTHER DEVICES\r
+       MOVEM 17,CLKS17         ;SAVE AC 17\r
+       MOVE 17,CLKCHL          ;IS CURRENT JOB IN USER MODE?\r
+       TLNN 17,USRMOD\r
+       SKIPE SCHEDF            ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT?\r
+       JRST SAVPC              ;YES, IT IS OK TO RESCHEDULE NOW\r
+       MOVE 17,CLKS17          ;NO, LEAVE TIMEF SET AND DISMISS INT.\r
+       JEN @CLKCHL\r
+\r
+SAVPC: MOVEM 17,USRPC          ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
+\r
+                               ; STORAGE FOR CURRENT JOB\r
+CLKERR:        SKIPN 17,JOBDAT         ;CURRENT JOB DATA AREA, IS THERE ONE?\r
+       MOVEI 17,NULDAT         ;NO, MUST BE NULL JOB OR CORE 0\r
+                               ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP\r
+       MOVEM 16,JOBD16(17)     ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA\r
+       MOVEI 16,JOBDAC(17)     ;SOURCE=0,DESTINATION=DUMP AC 0\r
+       BLT 16,JOBD15(17)       ;SAVE ACS 0-15 JUST BELOW AC 16\r
+       MOVE TAC,CLKS17         ;NOW SAVE 17 IN JOB DATA AREA\r
+       MOVEM TAC,JOBD17(17)    ;ALONE WITH OTHER ACS\r
+       MOVEI PDP,NULPDL        ;SET UP PUSH DOWN LIST IN NULL JOB DATA\r
+                               ; AREA IN LOWER CORE\r
+       HRLI PDP,MJOBP1         ;-LENGTH+1(LEAVE ROOM FOR UUO PC)\r
+       SKIPE TAC,APRERR        ;IT THIS AN ERROR INTERRUPT?\r
+       PUSHJ PDP,APRILM        ;YES, GO PROCESS ERROR, APRILM WILL CLEAR APRERR\r
+                               ; FLAG IMMEDIATELY\r
+\f\r
+EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD\r
+EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JDB,PMONTB\r
+\r
+RSCHED:        SKIPN TIMEF     ;HAS CLOCK GONE OFF SINCE LAST CALL?\r
+       JRST CIP6       ;NO, JUST RESCHEDULE\r
+\r
+;TIME ACCOUNTING\r
+\r
+EXTERNAL TIME,MIDNIT,THSDAT,MONTAB\r
+\r
+IFN FTTIME,<\r
+       EXTERNAL RTIME,TTIME,JOB\r
+       SKIPN   ITEM,JOB        ;WAS LAST JOB NULL JOB?\r
+       SKIPN   POTLST          ;YES-WAS IT A LOST TICK?\r
+       JRST    INCTIM          ;NO-PROCEED NORMALLY\r
+       AOS     LSTWRD          ;YES-INCREMENT LOST TIME COUNT\r
+       SETZM   POTLST          ;AND CLEAR LOST TICK INDICATION\r
+INCTIM:        AOS RTIME(ITEM)         ;INCR, CURRENT JOB INCREMENTAL RUN TIME\r
+       AOS TTIME(ITEM)         ;INCR, CURRENT JOB TOTAL RUN TIME\r
+>\r
+IFN FTKCT,<\r
+       EXTERN USRREL,JBTKCT\r
+       LDB TAC,[POINT 8,USRREL,25]     ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER\r
+       ADDI TAC,1                      ;MAKE IT NO. OF 1K BLOCKS\r
+       ADDM TAC,JBTKCT(ITEM)           ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT\r
+                               ; (KILO-CORE TICKS)\r
+\r
+IFN FT2REL,<\r
+       EXTERN CHGHGH\r
+       PUSHJ PDP,CHGHGH        ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE\r
+>\r
+>\r
+;MIDNITE CHECK\r
+\r
+       MOVE TAC1,TIME\r
+       CAMGE TAC1,MIDNIT       ;GONE PAST MIDNITE?\r
+       JRST CIP2               ;NO\r
+CIP3:  SETZB IOS,TIME          ;YES, RESET TIME OF DAY\r
+       AOS TAC,THSDAT          ;UPDATE DAY\r
+       IDIVI TAC,^D31\r
+       DIVI IOS,^D12           ;NO.\r
+       LDB TAC,PMONTB\r
+       CAMGE TAC,TAC1          ;END OF MONTH?\r
+       JRST CIP3               ;YES.\r
+\f\r
+;PROCESS TIMING REQUESTS STORED IN QUEUE\r
+\r
+CIP2:  HRRZ STOR,CLOCK         ;GET END OF LIST\r
+CIP4:  CAIN STOR,CIPWTM1       ;END YET?\r
+       JRST CIP5               ;YES\r
+       SOS TAC1, (STOR)        ;DECREMENT TIMING REQUEST\r
+       TRNE TAC1, 7777         ;TIME EXPIRED YET\r
+       SOJA STOR, CIP4         ;NO, CONTINUE SCAN\r
+       CONO PI, PIOFF          ;YES, MOVE LAST ITEM IN LIST TO THIS\r
+       MOVE TAC, @CLOCK\r
+       SOS CLOCK\r
+       MOVEM TAC, (STOR)\r
+       CONI PI,PION\r
+       LDB TAC, [POINT 6, TAC1, 23]    ;GET 6 BIT DATA ITEM\r
+       MOVSS TAC1              ;SETUP DISPATCH ADDRESS\r
+       PUSH PDP, STOR          ;SAVE ONLY VALUABLE AC\r
+       PUSHJ PDP, (TAC1)       ;AND DISPATCH TO TIMING REQUEST ROUTINE\r
+       POP PDP, STOR\r
+       SOJA STOR, CIP4         ;GO BACK FOR MORE REQUESTS\r
+\r
+CIP5:  SOSG HNGTIM             ;DECREMENT HUNG ID DEVICE\r
+       PUSHJ PDP,DEVCHK        ;GO CHECK FOR HUNG ID DEVICES\r
+       SKIPE COMCNT            ;ANY COMMANDS TO PROCESS?\r
+       PUSHJ PDP,COMMAND       ;YES, CALL COMMAND DECODER\r
+CIP6:  PUSHJ PDP,NXTJOB        ;CALL SCHEDULER\r
+       SETZM CLKFLG            ;CLEAR CLK INTERRUPT FLAG\r
+                               ; SET ON ALL FORCED CLK INTERRUPTS\r
+       SETZM TIMEF             ;CLEAR TIME0 (1 JIFFY) INTERRUPT FLAG,\r
+       SETZM SCHEDF            ;CLEAR FORCED SCHEDULING FLAG\r
+       CAMN ITEM,JOB           ;IS NEXT JOB SAME AS LAST ONE?\r
+       JRST CIP8               ;YES, JUST RESTORE ACS AND DISMISS\r
+\f\r
+;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED)\r
+\r
+EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA\r
+\r
+       SKIPN JA,JOBDAT         ;NULL JOB OR CORE 0 ON OLD JOB?\r
+       JRST CIP7               ;YES, DO NOT SAVE SOFTWARE STATE\r
+       MOVEI T,JOBPRT(JA)      ;DEST,#FIRST LOC PROTECTED FROM USER\r
+       HRLI T,USRPRT           ;SOUR,#SYSTEM DATA STORAGE FOR CURRETN JOB\r
+       SKIPL T1,USRHCU         ;MOVE NO. OF OLD USER IO CHAN. IN USE\r
+       CAILE T1,17             ;MUST BE 17 OR LESS(IO MIGHT\r
+                               ; CLOBBER IF ADDRESS CHECKING MISSES)\r
+       MOVEI T1,0              ;MOVE ONLY CHN 0 IF NEG, OR GR 17\r
+                               ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG\r
+                               ; SINCE IT DOES IO INTO AND OUT OF\r
+                               ; CHANNEL LOCATIONS (JOBJDA+1..,JOBJDA+17),\r
+       ADD JA,T1               ;RELOCATE TO USER AREA\r
+       BLT T,JOBJDA(JA)        ; STOP WITH USER CHANNEL 0-1+C(USRHCU)\r
+\f\r
+;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE\r
+\r
+INTERNAL NULJOB,NULADR\r
+EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT\r
+EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR\r
+\r
+NULJOB:                                ;TRANSFER HERE FROM SYSINI WITH ITEM=0\r
+CIP7:  MOVEM ITEM,JOB          ;STORE NEW CURRENT JOB NUMBER\r
+NULADR:        PUSHJ PDP,SETRL1        ;GO SETUP HARDWARE AND SOFTWARE RELOCATION\r
+                               ; INFORMATION FOR NEW CURRENT USER\r
+       JUMPE ITEM,NULJB        ;IS NEW JOB THE NULL JOB?\r
+\r
+IFN FTHALT,<\r
+       SKIPN JA                ;DOES JOB HAVE CORE ASSIGNED?\r
+       HALT .                  ;NO -ELSE CLOBBER MONITOR\r
+>\r
+       MOVEI T,USRPRT          ;NO, DEST,#PROTECTED AREA IN MONITOR\r
+       HRLI T,JOBPRT(JA)       ;SOURCE#FIRST PROTECT LOC. IN JB  DATA AREA\r
+       SKIPL T1,JOBHCU(JA)     ;MOVE NO. OF USER IO CHAN. IN USE\r
+       \r
+       CAILE T1,17             ;MUST BE 17 OR LESS(IO MIGHT CLOBBER\r
+                               ; IF ADRRESS CHECKING MISSES\r
+       MOVEI T1,0              ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17\r
+                               ; SAVEGET SETS NUG,DURING IO\r
+       BLT T,USRJDA(T1)        ;AND MOVE INTO MONITOR\r
+\r
+;RESTORE HARDWARE STATE OF CURRENT JOB\r
+\r
+CIP8:  SKIPN JA,JBTDAT(ITEM)   ;JOB DATA AREA(IS THERE ONE?)\r
+       MOVEI JA,NULDAT         ;NO, MUST BE NULL JOB\r
+       MOVSI 17,JOBDAC(JA)     ;RESTORE DUMP ACS\r
+       BLT 17,17\r
+       SKIPE APRERR            ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS\r
+                               ; (ON CLK PI OR HIGHER)\r
+       JRST CLKERR             ;YES, GO PROCESS ERROR\r
+       SKIPN JOB               ;IS THIS JOB THE NULL JOB?\r
+       SKIPN NULERR            ;YES, HAS AN ERROR OCCURED WHILE NULL JOB\r
+                               ; WAS RUNNING? IF YES, RESTORE ACS\r
+                               ; ILL UUO LOSED ACS\r
+       JEN @USRPC              ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS)\r
+\r
+;THE NULL JOB\r
+;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0\r
+\r
+EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR\r
+\r
+NULJB:\r
+IFN FTCHECK,<EXTERNAL MONPRTR,MONSUM,CHECK\r
+       MOVE TAC,MONPTR\r
+       PUSHJ PDP,CHECK\r
+       CAME TAC1,MONSUM\r
+       HALT .+1\r
+>\r
+       SETZB 0,NULERR  ;CLEAR AC 0 USED FOR USUAL MONITORING\r
+\f\r
+                               ; CLEAR FLAG SAYING ERROR IN NULL JOB\r
+                               ; OF NULL TIME INTERVAL\r
+                               ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0\r
+                               ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA)\r
+\r
+                               ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED\r
+                               ; WHILE CLK IN PROGRESS\r
+                               ; CATCH THEM NEXT CLK INTERRUPT\r
+       MOVE 1,[AOJA 0,1]       ;INSTR. TO AC1\r
+       JRST 11,1               ;DISMISS IF INTERUPT IN PROGRESS.\r
+\f\r
+;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER\r
+;CALLED FROM:\r
+;      CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER\r
+;      CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER\r
+;      CORE UUO\r
+;      REMAP UUO\r
+;      CALL RESET UUO\r
+;      CALL SETUWP UUO\r
+\r
+;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEQ IN JOBADR(JOB NUMBER)\r
+;      STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO)\r
+;      (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1)\r
+;      PUSHJ PDP,SETREL OR SETRL1\r
+;      ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG\r
+\r
+       INTERN SETREL\r
+       EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A\r
+\r
+SETREL:        MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
+\r
+SETRL1:        MOVE PROG,JBTADR(ITEM)  ;XWD PROTECTION,RELOCATION FOR LOW SEG\r
+       MOVEM PROG,JOBADR       ;SAVE TO MAKE UUO HANDLER FASTER\r
+       HLRZM PROG,USRREL       ;SAVE PROTECTION FOR ADDRESS CHECKING\r
+                               ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SET)\r
+IFN JDAT-PROG,<\r
+       MOVE JA,JBTDAT(ITEM)    ;LOC OF JOB DATA AREA\r
+       MOVEM JA,JOBDAT         ;SAVE IT TOO FOR UUO HANDLER\r
+>\r
+       JUMPE PROG,SETHRD       ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB)\r
+                               ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE\r
+                               ; IN EXEC LOWER CORE.  ALSO DO NOT STORE\r
+                               ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN\r
+\r
+       HLRZM PROG,JOBREL(JA)   ;SET PROTECTION IN USER JOB DATA AREA\r
+                               ; FOR HIM TO LOOK AT\r
+IFN FT2REL,<\r
+       EXTERN SETHGH\r
+       PUSHJ PDP,SETHGH        ;SET UP FOR HIGH SEG, IF USER HAS ONE\r
+                               ; PROG SETUP FOR DATAO\r
+>\r
+IFE FT2REL,<\r
+       TLZ PROG,1777           ;CLEAR OUT PROTECTION FOR HIGH SEG\r
+                               ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH\r
+                               ; SOFTWARE CANNOT HANDLE 2 SEGS)\r
+>\r
+       MOVEM PROG,KT10A        ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT\r
+                               ; USING SWITCHES WHAT IS IN SECOND REGISTER\r
+                               ; OPTION DOES NOT COME WITH PANEL LIGHTS\r
+                               ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE\r
+                               ; LAST JOB TO RUN IN LOC 33\r
+\f\r
+SETHRD:        DATAO APR,PROG          ;SET APR HARDWARE FOR RELOCATION AND PROTECTION\r
+                               ; FOR LOW(AND HIGH SEGS)\r
+       SKIPN PROG,JOBADR       ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG\r
+                               ; (IS THERE ONE)?\r
+       TDZA TAC,TAC            ;NO, MUST BE NULL JOB OR CORE0 OR KJOB\r
+                               ; SET FOR NO SPECIAL INTERRUTPS TO USER\r
+       MOVE TAC,JOBENB(JA)     ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE\r
+                               ; FALL INTO SETAPR ROUTINE\r
+\r
+;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC\r
+;CALL: MOVE TAC, APR, CONSO FLAGS FOR USER TRAPPING\r
+;      PUSHJ PDP,SETAPR\r
+;      RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET\r
+\r
+       INTERN SETAPR\r
+       EXTERN APRFOV\r
+\r
+SETAPR: ANDI TAC,231010+APRFOV         ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM,\r
+                               ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS\r
+                               ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED\r
+                               ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO\r
+       HRLS TAC                ;PRESERVE USER BITS IN LH\r
+       TRO TAC,231000          ;MAKE SURE MONITOR ALWAYS LOOKING FOR\r
+                               ; PD OVF, IL;M, NXM, CLOCK FLAGS\r
+       MOVE TAC1,TAC           ;DUPLICATE BITS IN TAC1 FOR CONO TO APR\r
+       XORI TAC1,110           ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS\r
+       ADDI TAC1, 330          ;SET DISABLE OR ENABLE FOR EACH\r
+       ANDI TAC1,660           ;MASK OUT ALL BUT DISABLE/ENABLE\r
+                               ; BITS FOR FOV(PDP-10 ONLY) AND AROVF\r
+       CONO PI,PIOFF           ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE\r
+                               ;CHANGING HARDWARE & SOFTWARE STATE FOR\r
+                               ;APR TRAPPING\r
+       HLRM TAC,APRIN1         ;STORE USER BITS\r
+       HRRM TAC,APRCON         ;STORE EXEC BITS\r
+       CONO APR,APRCHN(TAC1)   ;ENABLE OR DISABLE APR FOR\r
+                               ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY\r
+       CONO PI,PION            ;ENABLE PI'S AGAIN\r
+       POPJ PDP,\r
+\f\r
+SUBTTL RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS)\r
+\r
+;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH\r
+;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF\r
+;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP\r
+;THEM ACCORDINGLY\r
+\r
+;COMMON ERROR STOPPING ROUTINES\r
+;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT)\r
+;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED\r
+;      MOVE DEVDAT,ADDRESS OF THAT JOB TTYP DEVICE DATA BLOCK\r
+;      MOVE DAT,BYTE POINTER TO LAST CHAR, ALEADY MOVED\r
+;                      :TO TTY OUTPUT BUFFER\r
+;      PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP\r
+;      NEVER RETURN IF CALLED AT UUO LEVEL\r
+\r
+;ROUTINE TO STOP JONB AFTER KJOB COMMAND\r
+;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT\r
+\r
+INTERNAL KSTOP\r
+EXTERNAL HIGHJB\r
+\r
+KSTOP: MOVSI TAC,JNA+JLOG+JACCT        ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS\r
+       ANDCAM TAC,JBTSTS(ITEM)\r
+IFN FTLOGIN,<\r
+EXTERN PRJPRG\r
+       SETZM PRJPRG(ITEM)      ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT\r
+>\r
+                       ; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT\r
+                       ; HIGHEST AND SET HIGHJB\r
+       CAMGE   ITEM,HIGHJB     ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED?\r
+       JRST    ESTOP           ;NO, LEAVE HOLD\r
+       MOVSI   TAC1,JNA        ;YES,JOB NUMBER ASSGINED BIT\r
+       HRRZ    TAC,ITEM        ;SCAN DOWNWARD\r
+       TDNN    TAC1,JBTSTS(TAC)        ;IS JNA BIT SET FOR THIS JOB?\r
+       SOJG    TAC,-1          ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB\r
+       MOVEM   TAC,HIGHJB      ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED\r
+       JRST    ESTOP           ;GO SET ERROR BIT\r
+\f\r
+;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE\r
+;THEM ADD ^TC<CRLF><CRLF><PERIOD>\r
+;CALL: MOVEI TAC,ADR. OF MESSAGE\r
+;      PUSHJ PDP,PHOLD\r
+\r
+       INTERN PHOLD\r
+\r
+PHOLD: PUSHJ PDP,CONMES        ;MOVE MESSAGE TO TTY OUTPUT BUFFER\r
+                               ; FALL INTO HOLD\r
+;ROUTINE TO STOP JOB, SET ERROR BIT.\r
+;AND ADD "^C<CRLF><CRLF><PERIOD>\r
+\r
+INTERNAL HOLD,HOLD1\r
+EXTERNAL TTYSTC\r
+\r
+HOLD:  PUSHJ PDP,INLMES\r
+       ASCIZ /\r
+^C\r
+\r
+./\r
+\r
+HOLD1: PUSHJ PDP,TTYSTC        ;MAKE SURE TTY STAYS IN MONITOR MODE\r
+                               ; AND START TTYP TYPING OUTMESSAGE\r
+                               ; FALL INTO ESTOP\r
+\f\r
+;ROUTINE TO STOP USER AND FLAG AS ERROR STOP\r
+\r
+INTERNAL ESTOP,ESTOP1\r
+EXTERNAL JBTSTS,STUSER,STREQ,STAVAL\r
+EXTERNAL SCHEDF,JOB,CPOPJ\r
+\r
+ESTOP: JUMPE ITEM,CPOPJ        ;IS THIS ERROR IN JOB 0?\r
+       MOVSI TAC,JACCT         ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING\r
+       ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT0 SO USER CAN USE CONTROL C\r
+                               ; TO RECOVER\r
+ESTOP1: MOVSI TAC,JERR         ;SSET ERROR BIT IN JOB STATUS WORD\r
+       IORM TAC,JBTSTS(ITEM)   ;SO JOB CAN NOT CONTINUE(CONT COM.)\r
+       CAME ITEM,STUSER        ;SYSTEM TAPE USER?\r
+       JRST STOP1              ;NO\r
+       MOVSI TAC,637163        ;FIND SYS DDB\r
+       PUSHJ PDP,DEVSRC        ;SYSTEM ERROR IF NOT FOUND\r
+       JSP DAT,ERROR\r
+\r
+       PUSHJ PDP,RELEA9        ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING\r
+\f\r
+;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED\r
+;CALL:\r
+;      MOVE ITEM, JOB NUMBER\r
+;      PUSHJ PDP, STOP1\r
+;      EXIT    ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER\r
+;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE\r
+;CALLED FROM COMMAND DECODER WHEN <CONTROL>C TYPED IN BY USER\r
+;OR ON ANY ERROR MESSAGE(SFE PREVIOUS PAGE)\r
+\r
+INTERNAL STOP1\r
+EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB\r
+\r
+STOP1: MOVSI TAC,RUN   \r
+       CONO PI,PIOFF           ;DONE AT INTERRUPT LEVEL HIGHER THEN DT LEVEL\r
+       CAME ITEM,STUSER        ;IS THIS JOB CURRENTLY USING THE SYTEM TAPE?\r
+       TDNN TAC,JBTSTS(ITEM)   ;NO, IS RUN BIT OFF IN JOB STATUS WORD\r
+       JRST STOP1A             ;YES\r
+       ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT\r
+       CONO PI,PION\r
+       LDB TAC,PJBSTS          ;GET JOB WAIT QUEUE CODE(IF ANY)\r
+       CAIG TAC,MAXQ           ;DOES STATE HAVE Q ?\r
+       SOSL REQTAB(TAC)        ;YES. REDUCE IT.\r
+       JRST STOP1A             ;NO\r
+       SOSGE AVALTB(TAC)       ;YES REDUCE  COUNT\r
+       SETZM AVALTB(TAC)       ;CLEAR AVAL FLAG IF NO ONE WAITING\r
+STOP1A:        CONO PI,PION            ;MAKE SURE PI ON\r
+       CAME ITEM, JOB          ;NO. IS THIS JONB CURRENT USER\r
+\r
+INTERNAL FTSWAP\r
+\r
+IFE FTSWAP,<\r
+       POPJ PDP,               ;NO\r
+>\r
+IFN FTSWAP,<\r
+       JRST REQUE              ;SET REQUE JOB FLAG\r
+>\r
+       SKIPL TAC,JBTSTS(ITEM)  ;RUN FLAG OFF?\r
+       TLNN    TAC,JERR        ;YES, ERROR FLAG ON?\r
+       JRST    STOP2           ;NO\r
+       SETOM   SCHEDF          ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE\r
+       JRST STOP2              ;YES, MAKE CLK RESCHEDULE ANOTHER JOB\r
+\f\r
+;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED\r
+;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK.\r
+;OR IS IN CORE AND HAS ACTIVE DEVICES.\r
+;CALLED FROM COMMAND DECODER\r
+;CALL: MOVE ITEM,JOB NO.\r
+       PUSHJ PDP,DLYCOM\r
+\r
+INTERNAL DLYCOM\r
+\r
+DLYCOM:        MOVSI TAC,CMWB          ;SET COMMAND WAIT BIT\r
+IFN FTSWAP,<\r
+       EXCH    TAC,JBTSTS(ITEM)\r
+>\r
+       IORM TAC,JBTSTS(ITEM)   ;IN JOB STATUS WORD\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<\r
+       TLNN    TAC,CMWB\r
+       PUSHJ   PDP,REQUE\r
+\r
+>\r
+               POPJ PDP,\r
+\r
+;ROUTINE TO PUT JONB IN NO CORE QUEUE\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<INTERNAL NOCORQ\r
+       EXTERNAL NULQ\r
+\r
+NOCORQ:        MOVEI TAC,NUL1          ;NO JOB NO. OR NO CORE QUEUE\r
+       DPB TAC,PJBSTS\r
+       JRST REQUE\r
+>\r
+\f\r
+;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL\r
+;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO\r
+;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB)\r
+;TTY WILL REMAIN IN MONITOR MODE\r
+;JOB MUST HAVE CORE ASSIGNED\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+;      MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN\r
+;      PUSHJ PDP,MONJOB\r
+;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS\r
+\r
+INTERNAL MONJOB\r
+\r
+MONJOB:        PUSHJ PDP,MSTART        ;START WITH PC IN MONITOR\r
+       JRST SETRUN             ;SET TTY TO START JOB WHEN COMMAND RESPONSE\r
+                               ; IS FINISHED AND KEEP TTY IN MONITOR MODE\r
+\r
+;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL\r
+;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP\r
+;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA\r
+;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS\r
+;CALL: MOVEI TAC1,MONITOR JOB START ADDRESS\r
+;      JSP TAC,MONSTR\r
+;      RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP\r
+\r
+INTERNAL MONSTR\r
+EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT\r
+\r
+MONSTR:        MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
+       MOVE JDAT,JBTDAT(ITEM)  ;ADR. OF JOB DATA AREA\r
+IFN JDAT-PROG,<\r
+       MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION\r
+>\r
+       MOVSI PDP,MJOBPD        ;MINUS LENGTH OF SYSTEM PD LIST\r
+       HRRI PDP,JOBPDL(JDAT)   ;FIRST LOC.-1 OF PD LIST\r
+       PUSH PDP,TAC1           ;SAVE STOP ADDRESS\r
+       JRST (TAC)              ;RETURN AND DO MONITOR JOB\r
+                               ; WITH TT DDB,OUTPUT BYTE POINTER, AND JOB NO.\r
+\f\r
+;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN\r
+;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS\r
+;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN\r
+;SAFELY STOPPED IN ONE OF 3 STATES:\r
+;1) PC IN USER MODE\r
+;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT\r
+;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL\r
+;CALL: MOVE TAC1,STARTING PC\r
+;      MOVE ITEM, JOB NUMBER\r
+;      MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE\r
+;      PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)\r
+;      RETURN HERE IMMEDIATELY\r
+\r
+INTERNAL MSTART,USTART\r
+EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1\r
+\r
+USTART:        MOVE TAC,JOBPC(JDAT)    ;GET OLD PC\r
+       TLNE TAC,USRMOD         ;IS IT IN USER MODE TOO?\r
+       JRST USTRT1             ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS\r
+\r
+       MOVEI TAC,JOBDAC(JDAT)  ;NO. MOVE USERS(UUO) ACS TO DUMP ACS\r
+       HRL TAC,JDAT            ;SOURCE=REL, 0,DEST,=JOBDAC IN JOB DATA AREA\r
+       BLT TAC,JOBD17(JDAT)    ;MOVE ALL ACS\r
+       MOVE TAC,JOBPD1(JDAT)   ;UUO PC HAS LAST PC\r
+       HRRI TAC,-1(TAC)        ;SUBTRACT 1 FROM RIGHT HALF AND\r
+                               ; PRESERVE LH PC FLAGS\r
+                               ; (RH=0 ON HALT 0 OR FIRST START)\r
+USTRT1:        MOVEM TAC,JOBOPC(JDAT)  ;STORE OLD PC FOR USER TO LOOK AT\r
+       HLL TAC1,TAC            ;PRESERVE USER APR FLAGS\r
+       TLO TAC1,USRMOD         ;MAKE SURE NEW PC IN USER MODE\r
+       TLZ TAC1,37             ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD\r
+       \r
+MSTART:        MOVEM TAC1,JOBPC(JDAT)  ;STORE NEW PC\r
+       MOVSI TAC,JERR+WTMASK\r
+       ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS\r
+                               ;SET TTY STATE TO INITAL COND.\r
+                               ; TTYUSR OR TTYURC SHOULD BE CALLED\r
+                               ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE\r
+                               ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN\r
+                               ; MONITOR COMMAND RESPONSE FINISHES.\r
+                               ; SEE SETRUN BELOW\r
+\f\r
+;ROUTINE TO SET JOB STATUS RUN BIT(RUN)\r
+;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND\r
+;RESPONSE FINISHES,  THIS ACTION IS ENABLED BY CALLING\r
+;TTYUSR. OR TTYURC IN SCNSER\r
+;CALL:         MOVE ITEM,JOB NUMBER\r
+;      PUSHJ PDP,SETRUN\r
+\r
+INTERNAL SETRUN\r
+EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT\r
+EXTERNAL MAXQ\r
+\r
+SETRUN:        LDB TAC,PJBSTS          ;GET JOB STATUS WAIT QUEUE CODE\r
+       CAILE TAC,MAXQ          ;DOES JOB STATUS CODE HAVE A QUEUE?\r
+       JRST SETR1              ;NO\r
+       AOSLE REQTAB(TAC)       ;ADD TO REQUEST COUNT\r
+       JRST SETR1              ;OTHERS WAITING?\r
+       AOSG AVALTB(TAC)        ;MAKE AVAILABLE\r
+       SETOM AVALTB(TAC)       ;FLAG AS JUST AVAILABLE, BECAUSE\r
+                               ; NO JONB WAS USING DEVICE. SCHEDULER\r
+                               ; WILL SCAN THIS QUEUE\r
+SETR1: MOVSI TAC,RUN           ;SET RUN BIT IN JOB STATUS WORD\r
+       IORM TAC,JBTSTS(ITEM)   \r
+SETR2: MOVE TAC,RNQUNT         ;SET QUANTUM TIME TO RUN QUEUE QUANTUM\r
+       HRRM TAC,JBTSTS(ITEM)   ;RUN QUEUE QUANTUM\r
+\r
+INTERNAL FTSWAP\r
+IFE FTSWAP,<\r
+               JRST NULTST     ;GO SEE IF NULL JOB IS RUNNING\r
+>\r
+IFN FTSWAP,<\r
+       INTERNAL REQUE\r
+       EXTERNAL QJOB,JBTSTS\r
+\r
+REQUE: MOVSI TAC,JRQ           ;MARK JOB TO BE REQUEUED WITH JRQ BIT\r
+       TDNN TAC,JBTSTS(ITEM)   ;INCREMENT COUNT ONLY ONCE FOR EACH JOB\r
+       AOS QJOB                ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REUEUED\r
+\r
+       IORM TAC,JBTSTS(ITEM)   ;SET REQUE BIT FOR SCHEDULER\r
+       POPJ PDP,\r
+\r
+>\r
+\f\r
+;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER\r
+;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE\r
+\r
+INTERNAL FTSLEEP\r
+\r
+IFN FTSLEEP,<\r
+INTERNAL SETSLP\r
+EXTERNAL JBTSTS,SLPQ\r
+\r
+SETSLP:        MOVSI TAC,CLKR          ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN\r
+       IORM TAC,JBTSTS(ITEM)   ;SO ONLY ONE PER JOB\r
+       MOVEI AC1,SLPQ          ;SLEEP STATE CODE\r
+       JRST SETSTT             ;SET STATUS AND RESCHEDULE\r
+\r
+;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP\r
+;JOB NO. IN AC TAC\r
+\r
+INTERNAL WAKE\r
+\r
+EXTERNAL PJSTS,RNQ,SLPQ\r
+\r
+WAKE:  MOVEI TAC1,RNQ          ;RUN QUEUE CODE\r
+       MOVE ITEM,TAC           ;JOB NO.\r
+       MOVSI TAC,CLKR          ;CLEAR CLOCK REQUEST BIT FOR THIS JOB\r
+       ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN\r
+       LDB TAC,PJBSTS          ;GET QUEUE CODE\r
+       CAIE TAC,SLPQ           ;IS JOB STILL SLEEPING?\r
+       POPJ PDP,               ;NO, RETURN TO CLOCK ROUTINE\r
+       DPB TAC1,PJBSTS         ;YES, STORE RUN QUEUE CODE\r
+                               ; (CONTROL C, START CAN GET JOB OUT SLEEP)\r
+       JRST SETR2\r
+>\r
+\f\r
+;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE\r
+;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING\r
+;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE\r
+;CALL  PUSHJ PDP,GETDCXX\r
+;      AOSE XXREQ      ;REQUEST COUNT FOR OTHER DEVICE\r
+;      RETURN WHEN BOTH AVAILABLE\r
+\r
+INTERNAL GETDCDT,GETDCMT\r
+EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1\r
+\r
+GETDCDT:GETDCMT:       \r
+       XCT @(PDP)              ;INCREASE SHARABLE DEVICE REQ. COUNT\r
+GETWT: PUSHJ PDP,DVWAT1        ;NOT AVAIL., GO WAIT FOR IT\r
+       AOSN DCREQ              ;IS DATA CONTROL AVAILABLE?\r
+       JRST CPOPJ1             ;YES, RETURN BOTH AVAILABLE\r
+       MOVE AC1,@(PDP)         ;DATA CONTROL NOT AVAILABLE\r
+       SUBI AC1,REQTAB\r
+       SOSL REQTAB(AC1)        ;REDUCE REQ. COUNT FOR OTHER\r
+                               ; SHARABLE DEVICE.\r
+       SETOM AVALTB(AC1)       ;SET AVAILABLE IF OTHER JOBS WAITING\r
+       JFCL DCREQ              ;ARGUMENT FOR DCQAIT\r
+       PUSHJ PDP,DCWAIT        ;WAIT FOR DATA CONTROL FREE\r
+       MOVE AC1,@(PDP)         ;INCREMENT REQ. COUNT\r
+       AOSN @AC1               ;NOW IS SHARABLE DEVICE FREE?\r
+       JRST CPOPJ1             ;YES\r
+       SOSL DCREQ              ;NO, REDUCE DATA CONTROL REQUEST\r
+       SETOM DCAVAL            ;SET AVAIL., SOME OTHER JOB WAITING FOR IT\r
+       JRST GETWT              ;TRY AGAIN\r
+\f\r
+;ROUTINE TO WAIT FOR A SHARABLE DEVICE\r
+;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES\r
+;CALL: AOSLE XXREQ             ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT\r
+;                              ;IS DEVICE AVAILABLE?\r
+;      PUSHJ PDP,XXWAIT        ;NO, PUT JOB IN WAIT QUEUE\r
+;      RETURN WHEN DEVICE AVAILABLE\r
+\r
+;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE\r
+;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME\r
+;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE\r
+;USING THE DEVICE, A POSITIVE NUMBER IS THE\r
+;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE\r
+\r
+INTERNAL DVWAIT\r
+INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT\r
+EXTERNAL JOB,REQTAB\r
+\r
+MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:\r
+\r
+DVWAIT:        MOVE AC1,(PDP)          ;GET ADR. OF CALLER\r
+       MOVE AC1,-2(AC1)        ;GEET AOSLE XXREQ INSTRUCTION\r
+       JRST .+2\r
+DVWAT1:        MOVE AC1,@-1(PDP)       ;GET ADR. OF CALLER OF THIS ROUTINE\r
+       SUBI AC1,REQTAB         ;COMPUTE WAIT-STATE QUEUE CODE\r
+SETSTT:        MOVE AC3,JOB            ;CURRENT JOB NO.\r
+       DPB AC1,PJBS1           ;STORE IN JOB STATUS WORD\r
+       JRST WSCHED             ;GO SCHEDULE ANOTHER AND RETURN TO CALLER\r
+                               ; WHEN SHARABLE DEVICE BECOMES AVAILABLE\r
+                               ; SEE CLOCK AND CLKCSS\r
+\r
+PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS   ;BYTE POINTER TO JOB STATUS\r
+                               ; WORD WAIT QUEUE CODE\r
+\f\r
+;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED\r
+;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE\r
+;EACH SERVICE ROUTINE WILL AT INTERRUPT LEVEL\r
+;CHECK EACH TIME IT FINISHED A TASK(RUNFFERFUL)\r
+;TO SEE IF THE JOB USING THE DEVICE HAS\r
+;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED\r
+;CALL: MOVE DEVDAT,ADR, OF DEVICE DATA BLOCK\r
+;      MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB\r
+;      TLZE IOS,IOW    ;IS JOB AN IO WAIT FOR THIS DEVICE?\r
+;      PUSHJ PDP,SETIOD        ;YES, GO FLAG JOB TO START UP AGAIN\r
+;      RETURN\r
+;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD,\r
+;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS\r
+;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN\r
+\r
+INTERNAL SETIOD,STTIOD\r
+EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN\r
+\r
+PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS   ;BYTE POINTER TO JOB STATUS\r
+                               ; WORD QUEUE CODE\r
+STTIOD: MOVEI TAC1,TSQ         ;SET TTY IO WAIT SATISFIED QUEUE CODE\r
+       AOS TSAVAL\r
+       JRST SETIO1\r
+SETIOD:        MOVEI TAC1,WSQ          ;REQUE TO WAIT SATISFIED Q\r
+       AOS WSAVAL              ;INCR, NO, OF JOBS WITH IO WAIT\r
+                               ; SATISFIED, NON-ZERO WSAVAL WILL\r
+                               ; CAUSE SCHED, TO SCAN FOR IO\r
+SETIO1:        LDB TAC,PJOBN\r
+       DPB TAC1,PJBS2          ;IN JOB STATUS WORD\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<\r
+       EXTERN QJOB,JBTSTS\r
+       MOVSI QJOB,JBTSTS\r
+       MOVSI TAC1,JRQ          ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK\r
+       TDNN TAC1,JBTSTS(TAC)   ;IS REQUE BIT ALREADY ON?\r
+       AOS QJOB                ;NO, INCREMENT COUNT ONCE FOR EACH JOB\r
+       IORM TAC1,JBTSTS(TAC)   ;SET REQUEUEING BIT FOR SCHEDULER\r
+>\r
+NULTST:        SKIPE JOB               ;IS NULL JOB RUNNING?\r
+       POPJ PDP,               ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO\r
+\f\r
+;ROUTINE TO CAUSE CLK TO ROUTINE TO RESCHEDULE\r
+;CALLED AT ANY LEVEL\r
+;CALL: PUSHJ PDP,STOP2\r
+;      RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL\r
+;      IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN\r
+\r
+INTERNAL STOP2\r
+EXTERNAL PICLK,CLKFLG\r
+\r
+STOP2: CONO PI,PIOFF   ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE\r
+       SETOM CLKFLG    ;SET FLAG TO INDICATE CLK INTERRUPT\r
+                       ; EVEN THOUGH  CLK INTERRUTP IS NOT A ATIME INTERRUPT\r
+       CONO PI,PICLK   ;TURN PI BACK ON AND REQUESST INTERRUPT TO\r
+                       ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL)\r
+       POPJ PDP,       ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL\r
+\f\r
+;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE\r
+,CALLING SEQUENCE\r
+,      PUSHJ PDP, WAIT1\r
+,      EXIT        ALWAYS RETURN HERE\r
+\r
+,IF DEVICE IS INACTIVBE (IOACT=0), RETURNS TO EXIT, OTHERWISE, SETS\r
+,IOW:=1 AND ENTERS WAIT UNLESS IOCT BECOMES ZERO BEFORE THE\r
+,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT,\r
+,ON LEAVING THE WIAT STATE, RETURNS TO EXIT.\r
+,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING\r
+,CALLING SEQUENCE\r
+,     PUSHJ PDP, WSYNC\r
+,     EXIT            ALWAYS RETURNS HERE\r
+,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0\r
+\r
+INTERNAL WAIT1\r
+\r
+WAIT1: MOVE IOS,DEVIOS(DEVDAT)\r
+       TRNN IOS, IOACT         ;IS DEVICE ACTIVE? (IOACT=1?)\r
+       POPJ PDP,               ;RETURN\r
+       PUSHJ PDP,WSYNC         ;WAIT\r
+       JRST WAIT1\r
+\f\r
+;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE\r
+;IE  UNTIL CURRENT BUFFER ACTIVITY IS COMPLETE\r
+;CALLED ONLY FROM UUO LEVEL\r
+;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,WSYNC\r
+;      RETURN IMMEDIATELY IF DEVICE IS INACTIVE\r
+;      RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE\r
+\r
+INTERNAL WSYNC\r
+EXTERNAL IOWQ,TIOWQ,PION,PIOFF\r
+\r
+WSYNC: MOVSI IOS,IOW           ;SETUP DEVICE IO WAIT BIT\r
+       MOVEI AC1,IOWQ          ;IO WAIT STATE CODE\r
+       MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
+       TLNE AC3,DVTTY          ;IS THIS DEVICE A TTY?\r
+       MOVEI AC1,TIOWQ         ;YES, SET TTY WAIT STATE CODE\r
+       MOVE AC3,JOB            ;CURRENT JOB NO.\r
+\r
+       MOVEI AC2,IOACT         ;DEVICE ACTIVE BIT\r
+       CONO PI, PIOFF          ;TURN PI OFF\r
+       TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE?\r
+       JRST WSYNC1             ;NO\r
+       IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT\r
+                               ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED\r
+       DPB AC1,PJBS1           ;SET JOB WAIT STATE CODE\r
+                               ; IN JOB STATUS WORD\r
+       CONO PI, PION           ;TURN PI ON\r
+       PUSHJ PDP,WSCHED        ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN\r
+                               ; RETURN WHEN NEXT BUFFERFUL IS FINISHED\r
+                               ; WITH ACS 0-14 OCTAL RESTORED\r
+                               ; RETURN WHEN IO-WAIT FINISHED\r
+WSYNC1:        CONO PI, PION\r
+       ANDCAB IOS, DEVIOS(DEVDAT)      ;CLEAR DEVIVCE IO-WAIT BIT\r
+       POPJ PDP,\r
+\r
+CLKEND:        END\r
diff --git a/src/comcon.mac b/src/comcon.mac
new file mode 100644 (file)
index 0000000..050b588
--- /dev/null
@@ -0,0 +1,2994 @@
+TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433\r
+SUBTTL /RCC 03 JUN 69\r
+XP VCOMCN,433\r
+                               ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+       ENTRY COMCON    ;ALWAYS LOAD COMCON IF LIBRARY SEARCH\r
+COMCON:\r
+\r
+;CALLED FROM CLOCK ROUTINE WHEN 'COMCNT' IS GREATER THAN 0\r
+\r
+;AS SET BY TTY SERVICE ROUTINE\r
+;ALL AC'S HAVE BEEN SAVED BY CLOCK CHANNEL\r
+;THE COMMAND DECODER CALLS TTYCOM WHICH SCANS FOR TTY WHICH TYPED\r
+;THE COMMAND AND THEN DISPATCHES(PUSHJ) TO APPROPRIATE\r
+;COMMAND SETUP ROUTINE OF THE SAME NAME WITH AC'S SET AS:\r
+;ITEM = JOB NUMBER\r
+;TAC = BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
+;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
+;DEVDAT = ADDRESS OF DEVICE DATA BLOCK TYPING COMMAND\r
+;JDAT = ADDRESS OF JOB AREA, = 0 IF NO JOB AREA\r
+;PROG = ADDRESS OF PROGRAM AREA, 0 MEANS NOT IN CORE OR NO CORE\r
+;IOS IS SET TO 0, USED FOR ADDRESS OF SUBSEQUENT CALLS\r
+;DEVDAT IS ALSO PUSHED ON END OF PO LIST SO IT MAY BE DESTROYED\r
+;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED TO\r
+;MESSAGE AND TTY IS STARTED ON TTYP SPECIFIED BY -1(PDP)\r
+;SEVERAL COMMAND FLAGS ARE CHECKED BEFORE DISPATCHING TO\r
+;COMMAND SETUP ROUTINES TO SEE IF COMMAND IS LEGAL AT THIS TIME\r
+;SEVERAL MORE FLAGS ARE CHECKED UPON RETURN FROM COMMAND SETUP\r
+;ROUTINES(UNLESS AN ERROR HAS OCCURRED) FOR STANDARD\r
+;COMMAND RESPONSE\r
+;IF AN ERROR OCCURS, THE JOB NO.(ITEM) SHOULD BE 0 ON RETURN\r
+;SO THAT JOB WILL NOT BE INITIALIZED IF FIRST COMMAND.\r
+;ERRMES ROUTINE WILL SET ITEM TO 0\r
+\r
+;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
+;COMMAND SETUP ROUTINE MUST RUN TO COMPLETION QUICKLY\r
+;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
+;THE JOB TO RUNABLE STATUS AND RETURN IMMEDIATELY\r
+;OR DELAY THE COMMAND FOR LATER EXECUTION\r
+\f\r
+INTERNAL COMMAND\r
+INTERNAL FTLOGIN,FTSWAP,FTTIME\r
+EXTERNAL COMCNT,TTYCOM,JBTSTS,JOBMAX,JBTDAT,JBTADR,JOBHCU\r
+EXTERNAL CONFIG,HIGHJB\r
+EXTERNAL TTYSTR,TTYUSR,TTYATT\r
+EXTERNAL TTYTAB,PUNIT,TTYATI\r
+EXTERNAL ADRERR,ANYACT,ASSASG,CORE0,DAMESS,DEVLG,DEVPHY,DEVSRC\r
+EXTERNAL DLYCOM,ERNAM,ESTOP,GETWD1,GETWDU,KSTOP,CORE1,MONJOB,DECP1\r
+EXTERNAL MONSTR,MSTART,OCTPNT,PHOLD,PRNAME,RADX10,RELEA5\r
+EXTERNAL RELEA6,RESET,SETRUN,STOP1\r
+EXTERNAL STOTAC,UPTIME,USRXIT,USTART,UUOERR\r
+\r
+T=BUFPNT       ;TEMPORARY AC'S\r
+T1=BUFWRD\r
+T2=UUO\r
+T3=AC1\r
+T4=AC2\r
+COMMAND:PUSHJ PDP,TTYCOM       ;SETUP DEVDAT,DAT,TAC,AND ITEM\r
+                               ; FOR ANY TTY WHICH HAS TYPED A COMMAND\r
+COM0:  POPJ PDP,               ;NONE FOUND\r
+       PUSH PDP,DEVDAT         ;SAVE TTY DEVICE DATA BLOCK ADDRESS\r
+       PUSHJ PDP,CTEXT         ;SCAN COMMAND NAME, RETURN IT IN TAC1\r
+       MOVE T,TAC1             ;COPY COMMAND.\r
+       MOVNI T1,1              ;SET MASK ALL ONES\r
+       LSH T1,-6               ;CLEAR OUT ONE MORE CHAR.\r
+       LSH T,6                 ;SHIFT 1 COMMAND CHAR OFF\r
+       JUMPN T,.-2             ;IF NOT END OF COMMAND. GO AROUND\r
+       MOVEI T4,0              ;CLEAR FLAG REGISTER\r
+       MOVSI T,-DISPL          ;SEARCH COMMAND TABLE FOR MATCH\r
+COMLP: MOVE T2,COMTAB(T)       ;GET NEXT ENTRY FROM COMMAND TABLE\r
+       TDZ T2,T1               ;MASK OUT CHAR 5\r
+       CAMN TAC1,COMTAB(T)     ;EXACT MATCH?\r
+       JRST COMFND             ;YES, THIS IS IT.\r
+       CAME TAC1,T2            ;MATCH?\r
+       JRST COMNEQ             ;NOT EVEN GOOD MASK\r
+       TROE T4,1               ;MATCHES MASKED, IS THIS FIRST ONE\r
+       TROA T4,2               ;NO, SET 2ND OCCUR FLAG\r
+       MOVE T3,T               ;YES, COPY CURRENT INDEX\r
+COMNEQ:        AOBJN T,COMLP           ;NO, KEEP LOOKING\r
+       CAIN T4,1               ;DID ONE AND ONLY ONE COMMAND MATCH?\r
+       MOVE T,T3               ;YES, GET ITS INDEX\r
+\f\r
+COMFND:        MOVE TAC1,DISP(T)       ;GET DISPATCH TABLE ENTRY,\r
+       PUSH PDP,TAC1           ;SAVE RH(DISPATCH ADR,+BITS)\r
+       MOVE T,JBTSTS(ITEM)     ;JOB STATUS WORD FOR THIS JOB\r
+IFN FTLOGIN,<\r
+               TLNN T,JLOG             ;IS JOB LOGGED IN?\r
+               TLNE TAC1,NOLOGIN       ;NO, CAN COMMAND PROCEED WITH NO LOGIN?\r
+               JRST CHKNO              ;YES\r
+               JSP TAC,COMER           ;NO, TYPE "LOGIN PLEASE"\r
+               ASCIZ /LOGIN PLEASE\r
+/>\r
+CHKNO: JUMPN ITEM,CHKRUN       ;JOB NUMBER ALREADY ASSIGNED?\r
+       TLNE TAC1,NOJOBN        ;NO, DOES THIS COMMAND NEED A JOB NUMBER?\r
+       JRST COMGO              ;NO\r
+       MOVEI ITEM,1            ;YES, SCAN FOR ONE STARTING WITH 1\r
+NUMLOP:        MOVE T,JBTSTS(ITEM)     ;SCAN FOR FREE JOB NO.\r
+       TLNN T,JNA+CMWB         ;THIS NUMBER ASSIGNED?\r
+       JRST NEWJOB             ;NO, SO USE THIS NUMBER\r
+\r
+       CAIGE ITEM,JOBMAX       ;YES, IS THE MAX. JOB NO.?\r
+       AOJA ITEM,NUMLOP        ;NO, KEEP LOOKING\r
+       JSP TAC,COMER           ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED"\r
+       ASCIZ /JOB CAPACITY EXCEEDED\r
+/\r
+                               ; EVEN THROUGH THIS IS A NEW JOB NUMBER\r
+                               ; IT MAY HAVE CORE ASSIGNED NOW BECAUSE IT WAS DELAYED\r
+                               ; UNTIL IT COULD BE SWAPPED IN(LOGIN WITH CORE FULL)\r
+NEWJOB:        MOVEI T1,ASSCON         ;SET ASSIGNED BY CONSOLE BIT FOR TTY\r
+       IORM T1,DEVMOD(DEVDAT)  ;SO OTHER JOBS CAN NOT USE\r
+       SETZM DEVLOG(DEVDAT)    ;SET LOGICAL NAME TO ZERO\r
+                               ; "TTY" IS PUBLIC LOGICAL NAME\r
+IFN FTTIME,<\r
+       SETZM RTIME(ITEM)       ;CLEAR INCREMENTAL JOB RUNNING TIME\r
+       SETZM TTIME(ITEM)       ;CLEAR TOTAL JOB RUNNING TIME\r
+>\r
+IFN FTKCT,<\r
+       EXTERN JBTKCT\r
+       SETZM JBTKCT(ITEM)      ;CLEAR CORE-RUNNING TIME CORE\r
+>\r
+       CAMLE ITEM,HIGHJB       ;HIGHEST JOB NUMBER ASSIGNED?\r
+       MOVEM ITEM,HIGHJB       ;YES,SAVE IT FOR SCHEDULER SCAN OF JOBS\r
+\f\r
+CHKRUN:        TLNE    T,RUN           ;RUN BIT ON IN JOB STATUS?\r
+       TLNN    TAC1,NORUN      ;YES, DOES THIS COMMAND REQUIRE A JOB?\r
+       JRST    CHKACT          ;NO\r
+       JSP     TAC,COMER       ;YES.\r
+       ASCIZ   /PLEASE TYPE ^C FIRST\r
+/\r
+\r
+CHKACT:\r
+\r
+IFN PROG-JDAT,<\r
+       MOVE JDAT,JBTDAT(ITEM)  ;ADDRESS OF JOB DATA AREA\r
+>\r
+       MOVE PROG,JBTADR(ITEM)  ;XWD PROTECTION,RELOCATION\r
+IFN FTSWAP,<\r
+       TLNE TAC1,INCOR!NOTRAN  ;MUST JUST NOT BE SWAPPING OR\r
+                               ; IF JOB HAS CORE ASSIGNED, MUST IT BE\r
+                               ; IN PHYSICAL CORE (RATHER THAN DISK OR ON ITS WAY)\r
+       TLNN T,SWP              ;YES, IS JOB ON DISK OR ON ITS WAY?\r
+       JRST CHKCO2             ;NO\r
+       TLNN TAC1,INCOR         ;YES, MUST JOB BE IN CORE?\r
+       JUMPE PROG,CHKCO2       ;NO, IS A SWAP FOR THIS JOB IN PROGRESS?\r
+                               ; NO, SO COMMAND MUST BE DELAYED\r
+                               ; (EITHER BECAUSE SWAP IN PROGRESS OR\r
+                               ; JOB ON DISK AND MUST BE IN PHY CORE)\r
+       HRRI TAC1,DLYCM         ;ASSUME JOB MUST BE IN PHY CORE\r
+                               ; SO SET TO SWAP JOB IN\r
+       TLNN TAC1,INCOR         ;IS THIS TRUE?\r
+CHKDLY:        HRRI TAC1,DLYCM1        ;NO, JUST DELAY COMMAND UNTIL SWAP OUT OR IN IS FINISHED\r
+       JRST COMDIS             ;AND DISPATCH TO DELAY COMMAND\r
+CHKCO2:        TLNE TAC1,NOACT         ;CAN COMMAND BE PERFORMED WITH ACTIVE DEVICES?\r
+       PUSHJ PDP,RUNCHK        ;NO, RETURN IF JOB STOPPED AND NO ACTIVE DEVICES\r
+CHKCO1:        TLNE TAC1,NOCORE        ;DOES THIS COMMAND NEED CORE?\r
+       JRST COMGO              ;NO, GO DISPATCH\r
+       JUMPN PROG,CHKXPN       ;YES, IS CORE IN MEMORY?\r
+       JSP TAC,COMER           ;NO, PRINT "NO CORE ASSIGNED"\r
+       ASCIZ /NO CORE ASSIGNED\r
+/\r
+\f\r
+CHKXPN:        TLNN TAC1,PLSXPN        ;DOES THIS COMMAND NEED CORE TO BE EXPANDED?\r
+       JRST COMGO              ;NO\r
+       HLRE IOS,JOBHCU(JDAT)   ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO\r
+                               ; TO COMPLETION)\r
+       AOJGE IOS,COMGO         ;LH=-2 DURING SAVE, WHEN CORE COMPRESSED\r
+                               ;LH=-1 DURING SAVE OF HIGH SEG, OR GET OF LOW\r
+                               ; OR HIGH SEG\r
+       PUSHJ PDP,EXPAND        ;YES, EXPAND CORE FIRST\r
+       JFCL                    ;IGNORE ADDRESS CHECK ERROR, WE TRIED\r
+IFN FTSWAP,<\r
+       JRST CHKDLY             ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE\r
+                               ; ALL GONE, NEXT TIME JOBHCU WILL BE 0\r
+>\r
+\r
+IFE FTSWAP,<\r
+       HRRI TAC1,DLYCM1                ;DELAY COMMAND TILL NEXT CLOCK TICK\r
+       JRST COMDIS\r
+>\r
+\r
+COMER: MOVSI TAC1,NOINCK\r
+       MOVEM TAC1,(PDP)\r
+       MOVEI TAC1,CERR         ;CALL ERROR MESSAGE ROUTINE\r
+\r
+COMGO: MOVSI   IOS,CMWRQ\r
+       TLZN    T,CMWB          ;CLEAR CMWB; WAS JONB IN COMM WAIT\r
+       ANDCAM  IOS,(PDP)       ;NO, CLEAR REQUEU BIT IN DISP. FLAGS\r
+       MOVEM   T,JBTSTS(ITEM)\r
+\r
+COMDIS:        MOVEI IOS,0             ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES\r
+       PUSHJ PDP,(TAC1)        ;DISPATCH TO COMMAND SETUP ROUTINE.\r
+\f\r
+;RETURN FROM COMMAND SETUP ROUTINE\r
+\r
+COMRET:        POP PDP,T1              ;RESTORE COMMAND FLAGS\r
+       POP PDP,DEVDAT          ;RESTORE TTY DDB ADDRESS.\r
+IFN FTTTYSER,<\r
+       EXTERN  TITAKR,TISYNC\r
+       LDB     TEM,TITAKR(DEVDAT)      ;GET BREAK CHARACTER\r
+       PUSHJ   PDP,SKPBRK      ;SKIP TO BREAK CHAR\r
+       SOS     TISYNC(DEVDAT)  ;REDUCE LINE COUNT\r
+>\r
+       MOVSI T,400000\r
+       LDB     TAC,PUNIT\r
+       ANDCAM  T,TTYTAB(TAC)   ;YES. TURN OFF SIGN BIT\r
+       SOS     COMCNT\r
+       JUMPN ITEM,COMRT1       ;DID AN ERROR OCCUR?\r
+       TLNN T1,NOJOBN          ;I.E., ITEM=0 AND NOJOBN=0?\r
+       MOVSI T1,NOINCK+ERRFLG+CMWRQ    ;YES, PRINT ERROR MESSAGE ONLY, AND\r
+                                       ;REQUEUE JOB IF NECESSARY.\r
+\r
+COMRT1:        MOVE T,JBTSTS(ITEM)     ;JOB STATUS WORD\r
+       TLNN T1,NOINCK          ;SUPPRESS JOB INIT. CHECK?\r
+       TLOE T,JNA              ;NO, IS JOB INIT BIT ALREADY SET?\r
+       JRST PCRLF              ;YES.\r
+       MOVEM T,JBTSTS(ITEM)    ;NO, SO SET IT THIS COMMAND\r
+       PUSHJ PDP,TTYATI        ;ATTACH TTY TO JOB\r
+       JFCL                    ;INGORE IF CAN NOT(SHOULD NEVER HAPPEN)\r
+       PUSHJ PDP,INLMES        ;AND PRINT "JOB "\r
+       ASCIZ /JOB /\r
+       MOVE TAC,ITEM           ;PRINT JOB NUMBER\r
+       PUSHJ PDP,RADX10\r
+       PUSHJ PDP,PRSPC\r
+       MOVEI TAC,CONFIG        ;PRINT SYSTEM CONFIGURATION NAME\r
+       PUSHJ PDP,CONMES\r
+IFN FTLOGIN, <\r
+       PUSHJ PDP,CRLF\r
+>\r
+IFE FTLOGIN, <\r
+       PUSHJ PDP,PRSPC\r
+       PUSHJ   PDP,DAYTM1\r
+>\r
+\f\r
+PCRLF: TLNE T1,ERRFLG          ;DID AN ERROR OCCUR?\r
+       PUSHJ PDP,PRQM          ;YES. APPEND ?\r
+       TLNN T1,NOCRLF          ;SUPRESS CRLF?\r
+       PUSHJ PDP,CRLF          ;NO\r
+       TLNN T1,NOPER           ;SUPRESS PRINTING PERIOD?\r
+       PUSHJ PDP,PRPER         ;NO\r
+       JUMPE ITEM,PCRLF1       ;JOB DOES NOT RUN IF  ERROR OR NO JOB NO. ASSIGNED\r
+       TLNE T1,TTYRNU          ;JOB TO RUN WHEN TTY FINISHED TYPING?\r
+                               ; COMMAND RESPONSE (TTY TO USER MODE)?\r
+       PUSHJ PDP,TTYUSR        ;YES, CALL SCANNER ROUTINE\r
+       TLNE T1,TTYRNC          ;NO. JOB TO RUN AND REMAIN IN MONITOR MODE?\r
+       PUSHJ PDP,SETRUN        ;YES, CALL SCANNER ROUTINE\r
+PCRLF1:        TLNN T1,NOMESS          ;IS THERE A MESSAGE?\r
+       PUSHJ PDP,TTYSTR        ;YES. START TTY TYPING IT OUT\r
+IFN    FTSWAP, <\r
+       EXTERN  PJOBN,REQUE\r
+       LDB     ITEM,PJOBN      ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK\r
+       JUMPE   ITEM,CPOPJ      \r
+       TLNE    T1,CMWRQ        ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR?\r
+\r
+       JRST    REQUE           ;YES\r
+>\r
+       POPJ PDP,\r
+\r
+IFN FTTTYSER,  <EXTERN SPCHEK,TITAKR,GETCHR,TPOPJ\r
+\r
+SKPBRK:        PUSH    PDP,TAC\r
+SKPBR2:        PUSHJ   PDP,SPCHEK\r
+       JRST    SKPBR1\r
+       TLNE    TAC,BREAKB      ;IS THIS CHAR THE BREAK?\r
+       JRST    TPOPJ           ;YES, RESTORE TAC, RETURN\r
+SKPBR1:        PUSHJ   PDP,GETCHR      \r
+       JUMPN   TEM,SKPBR2      ;LOOK FURTHER FOR BREAK\r
+       JRST    TPOPJ           ;UNLESS NO MORE CHARS\r
+>\r
+\f\r
+;TABLE OF CONSOLE COMMANDS\r
+\r
+INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN\r
+INTERNAL FTFINISH,FTCCL\r
+\r
+;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE\r
+\r
+NOCORE=400000  ;NO CORE NEEDED FOR COMMAND\r
+NOJOBN=200000  ;NO JOB NUMBER NEEDED FOR COMMAND\r
+NOLOGIN=100000 ;JOB DOES NOT NEED TO BE ALREADY LOGGED IN.\r
+NOACT=40000    ;COMMAND MUST BE DELAYED IF JOB HAS ACTIVE DEVICES.\r
+NOTRAN=20000   ;COMMAND MUST BE DELAYED IF SWAPPED TRANSFER IN PROGRESS\r
+NORUN=10000    ;AN EXPLICIT ^C MUST BE TYPED BY USER BEFORE COMMAND\r
+               ; IS EXECUTED IF JOB IS RUNNING\r
+               ; JOB MUST BE SWAPPED IN IF IT HAS LOGICAL CORE\r
+INCOR=4000     ;USED ONLY BY COMMAND DISPATCH\r
+               ; DOES NOT APPEAR IN COMMAND TABLE\r
+INCORE=4000!NOTRAN     ;COMMAND MUST BE DELAYED IF JOB HAS LOGICAL CORE\r
+               ; WHICH IS ON DISK OR ON ITS WAY IN OR OUT.\r
+               ; JOB WILL BE SWAPPED IN (SEE DLYCOM)\r
+               ; AND IS NOT SITTING QUIETLY IN CORE(IE NO SWAPPING TRANSFER)\r
+PLSXPN=4       ;CORE MUST BE EXPANED IF STILL COMPRESSED BY SAVE NOT GOING\r
+               ; TO COMPLETION(CONTROL C OR DEVICE OK?)\r
+               ; MUST BE USED IN CONJUNCTION WITH COMMANDS WHICH\r
+               ; NEED CORE AND NEED IT IN CORE\r
+\r
+;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE\r
+\r
+CMWRQ=2000     ;REQUEUE JOB AFTER COMMAND WAIT\r
+NODATE=1000    ;DON'T PRINT DATE DURING JOB INTERROGATION\r
+NOINCK=400     ;NO CHECK FOR JOB INITIALIZATION (JNA=0)\r
+NOCRLF=200     ;NO PRINTING OF CRLF\r
+NOPER=100      ;NO PRINTING OF PERIOD\r
+TTYRNU=40      ;SET TTY TO USER MODE AND START JOB\r
+               ; WHEN COMMAND RESPONSE STOPS TYPING\r
+TTYRNC=20      ;KEEP TTY IN COMMAND MODE AND START JOB\r
+               ; WHEN COMMAND RESPONSE STOPS TYPING\r
+NOMESS=10      ;NO COMMAND RESPONSE EVER, DO NOT CALL TTYSTR\r
+\r
+               ;T TAKEN ABOVE BY 'PLSXPN' BIT\r
+\r
+ERRFLG=1       ;COMMAND ERROR\r
+\f\r
+DEFINE NAMES<\r
+       C START,START,NOPER!TTYRNU!INCORE!NOACT!NORUN\r
+       C HALT,STOP,NOCORE!NOJOBN!NOLOGIN!NOINCK!CMWRQ\r
+       C KJOB,KJOB,NOCORE!NOJOBN!NOINCK!NOLOGIN!NOACT!NORUN!NOPER!NOCRLF!NOMESS!NOTRAN\r
+       C <>,CBLANK,NOCORE!NOJOBN!NOLOGIN!NOINCK!NOCRLF\r
+       C R,RCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+       C RUN,RUNCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+       C CORE,CORE,NOCORE!NORUN!CMWRQ!INCORE!NOACT!NOTRAN\r
+       C GET,GET,NOCRLF!NOPER!TTYRNC!NOCORE!NOACT!NORUN!NOTRAN\r
+       C SAVE,SAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+IFN FT2REL,<\r
+       C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+>\r
+       C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN\r
+IFN FTEXAMINE,<\r
+       C D,DCOM,CMWRQ!INCORE\r
+       C E,ECOM,NOCRLF!CMWRQ!INCORE\r
+>\r
+       C PJOB,PJOB,NOCORE\r
+       C ASSIGN,ASSIGN,NOCORE\r
+       C DEASSI,DEASSIGN,NOCORE!NOJOBN!NOINCK\r
+       C DDT,DDTGO,NOPER!TTYRNU!INCORE!NORUN!PLSXPN\r
+IFN FTFINISH,<\r
+       C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN\r
+>\r
+       C REENTER,REENTER,TTYRNU!NOPER!INCORE!NORUN!PLSXPN\r
+       C CSTART,STARTC,TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+       C CCONTINUE,CONTC,TTYRNC!INCORE!NORUN\r
+IFN FTATTACH,<\r
+       C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK\r
+       C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+>\r
+       C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+IFN FTTIME,<\r
+       C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK\r
+>\r
+       C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+IFN FTLOGIN,<\r
+       C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+>\r
+IFN FTTALK,<\r
+       C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK\r
+>\r
+IFN FTLOGIN,<\r
+       C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+>\r
+IFE FTLOGIN,<\r
+       C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN\r
+>\r
+IFN FTREASSIGN,<\r
+       C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN\r
+>\r
+       C HELP,HELP,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+       C SYSTAT,SYSTAT,NOCORE!NOLOGIN!NOACT!NORUN!NOCRLF!NOPER!TTYRNU!NOTRAN\r
+IFN FTCCL,<\r
+       C COMPILE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C CREATE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C CREF,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C DEBUG,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C DELETE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C DIRECT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C EDIT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C EXECUTE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C LIST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C LOAD,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C MAKE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C RENAME,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C TECO,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C TYPE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+       C CTEST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+>\r
+>\r
+\f\r
+;GENERATE TABLE OF SIXBIT COMMAND NAMES\r
+\r
+DEFINE C(A,B,D) <\r
+       <SIXBIT /A/>\r
+>\r
+COMTAB:        NAMES\r
+DISPL=.-COMTAB ;LENGTH OF TABLE\r
+\f\r
+;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS\r
+\r
+DEFINE C(A,B,D) <\r
+Z      B       (D)\r
+>\r
+DISP:  NAMES\r
+\f\r
+;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE\r
+;WITH FOLLOWING AC'S SET:\r
+;TAC= BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
+;ITEM = JOB NUMBER\r
+;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
+;DEVDAT = ADDRESS OF DEVICE DATA BLOCK INITIATING COMMAND\r
+;JDAT = ADDRESS OF JOB DATA AREA, = 0 IF NO JOB AREA\r
+;PROG=XWD PROTECTION,RELOCATION; 0 IF NO CORE\r
+;IOS=0\r
+\r
+;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF\r
+;NEEDED AND TTY IS STARTED\r
+\r
+;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
+;COMMAND SETUP ROUTINES MUST RUN TO COMPLETION QUICKLY\r
+;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
+;THE JOB TO A RUNABLE STATUS AND RETURN IMMEDIATELY\r
+\r
+       EXTERN TTYFNU\r
+\r
+COR0:  JUMPE PROG,CPOPJ        ;RETURN IF JOB DOES NOT HAVE CORE\r
+       \r
+       JSP TAC1,MONJOB         ;SET TO RUN MONITOR JOB(PC IN EXEC MODE)\r
+                               ; RETURN HERE AT UUO LEVEL(NO ACS SET UP)\r
+       MOVEI TAC1,ESTOP        ;PUT ERROR STOP ON END OF PDL\r
+       JSP TAC,MONSTR          ;START MONITOR JOB BY SETTING UP ACS AND\r
+JOB1:  PUSHJ PDP,RESET         ;RELEASE ALL IO DEVICES ASSIGNED TO THIS JOB\r
+       PUSHJ PDP,TTYFNU        ;FIND TTY FOR THIS JOB(SETUP ITEM WITH JOB NO.)\r
+IFN FTSWAP,<\r
+       EXTERN ZERSWP,NOCORQ\r
+       PUSHJ PDP,NOCORQ        ;PUT JOB IN NO CORE Q\r
+       PUSHJ PDP,ZERSWP        ;CLEAR SWAP SPACE (IF ANY) FOR LOW SEG\r
+                               ; AND CLEAR SWP,SHF,IMGIN,IMGOUT FOR LOW SEG\r
+>\r
+IFN FT2REL,<\r
+       EXTERN KILHGH\r
+       PUSHJ PDP,KILHGH        ;HIGH SEG FOR THIS USER. RETURN CORE\r
+                               ; REMOVE HIGH SEG FROM THIS USER LOGICAL ADDRESSING SPACE\r
+                               ; IF NO OTHER USERS IN CORE ARE USING IT\r
+                               ; RETURN DISKL SPACE IF NO LONGER SHARABLE HIGH SEG\r
+>\r
+       MOVEI TAC,0             ;RETURN BOTH PHYSICAL AND LOGICAL CORE\r
+       SOS (PDP)               ;NEGATE SKIP RETURN WHICH CORE1 WILL DO\r
+       JRST CORE1              ;GO DO IT AND RETURN TO CALLER\r
+\f\r
+; "PJOB" PRINT JOB NUMBER OF JOB TTY IS ATTACHED TO\r
+\r
+INTERNAL PJOB,DECLF\r
+\r
+PJOB:  MOVE TAC,ITEM           ;JOB NO.\r
+DECLF: PUSHJ PDP,RADX10        ;PRINT TAC AS DEC. THEN CRLF\r
+       JRST CRLF\r
+\r
+; "KJOB" KILL ATTACHED JOB\r
+\r
+EXTERNAL JBTSTS,TTYKILM,CPOPJ\r
+INTERNAL FTTIME,JOBKL\r
+\r
+KJOB:  JUMPE ITEM,JOBKB        ;WAS JOB INITIALIZED?\r
+IFN    FTLOGIN,<\r
+       TLZN    T,JLOG+JACCT    ;TEST JACCT ALSO IN CASE COMMAND WAS DELAYED\r
+       JRST    KJOB2           ;IF JOB NOT LOGGED IN\r
+       TLO     T,JACCT         ;DISABLE ^C\r
+       MOVEM   T,JBTSTS(ITEM)\r
+IFN    FTSWAP, <\r
+       PUSHJ   PDP,ALOGN1      ;ATTACH TTY\r
+>\r
+       MOVSI   TAC,TTYRNU+NOMESS\r
+       XORM    TAC,-1(PDP)     ;SET TTYRNU AND CLEAR NOMESS FOR COMRET\r
+       MOVE    TAC,[SIXBIT /LOGOUT/]   ;NAME OF CUSP\r
+       JRST    ARCOM\r
+>\r
+KJOB2:\r
+IFE FTSWAP+FTLOGIN,<\r
+       JUMPE PROG,JOBKA        ;YES. DOES JOB HAVE CORE IN MEMORY?\r
+>\r
+       PUSHJ PDP,GETMIN        ;GET MINIMAL JOB AREA ON DISK OR CORE\r
+       JUMPE PROG,DLYCM1       ;DELAY COMMAND IF CORE ASSIGNED ON DISK\r
+       JSP TAC1,MONJOB         ;YES, SCHEDULE MONITOR JOB(PC IN EXEC MODE)\r
+                               ;RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
+JOBKL: MOVEI TAC1,ESTOP        ;PUT ESTOP ON END OF PDL\r
+       JSP TAC,MONSTR          ;GO SETUP ACS AND PD LIST\r
+       PUSHJ PDP,JOB1          ;FLUSH CORE AFTER RELEASING DEVICES\r
+JOBKA:\r
+IFN FTTIME,<\r
+IFE    FTLOGIN, <\r
+       PUSHJ PDP,PRTTIM        ;PRINT JUST TOTAL RUN TIME\r
+       PUSHJ   PDP,TTYSTR      ;START TTY\r
+>>\r
+       PUSHJ PDP,DEASTY        ;DEASSIGN ALL BY TTY\r
+       PUSHJ PDP,TTYKIL        ;RETURN TTY TO VIRGIN STATE\r
+       JRST KSTOP              ;CLEAR JOB STATUS WORD AND STOP JOB\r
+\r
+;ERROR IN COMMAND\r
+\r
+CERR:  JRST ERRMES\r
+\r
+JOBKB: SETZM   -1(PDP)         ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG.\r
+       JRST    ATT4            ;"NOT A JOB"\r
+\f\r
+; "START L" OR "START" - START AT LOC, L OR STARTING ADDRESS\r
+INTERNAL FT2REL\r
+EXTERNAL JOBSA\r
+\r
+START:                         ;SAME AS CSTART, DIFF BY COMTAB BITS\r
+                       ; WHICH PUT TTY IN MONITOR OR USER MODE\r
+\r
+; "CSTART L" OR   "CSTART" - START AT LOC. L(TTY IN COMMAND MODE)\r
+\r
+STARTC:        PUSHJ PDP,OCTIN         ;CONVERT POSSIBLE OCTAL NO ARG.\r
+IFE FT2REL,<\r
+       SKIPA TAC1,JOBSA(JDAT)  ;NO START ADR. SPECIFIED RETURN\r
+>\r
+IFN FT2REL,<\r
+       JRST SNOARG     ;NO ARG SPECIFIED RETURN\r
+>\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+IFN FT2REL,<\r
+       EXTERN CHKMED\r
+       PUSHJ PDP,CHKMED        ;CHECK TO SEE IF HIGH SEG WHICH IS SHARABLE\r
+                               ; IF YES, TURN ON USER MODE WRITE PROTECT\r
+                               ; FOR THIS USER, AND SET MEDDLE BIT SO HE CANNOT\r
+                               ; TURN UWP OFF.>\r
+       JRST CHKSTR             ;START JOB WITH PC IN USER MODE,\r
+                               ; IF START ADR IS NON-ZERO\r
+IFN FT2REL,<\r
+SNOARG: SKIPA TAC1,JOBSA(JDAT) ;NO. ARG SPECIFIED, USE START ADR SUPPLIED\r
+                       ; BY PROGRAM END STATEMENT AND STORED BY LINKING LOADER\r
+                       ; SKIP INTO REENTER, START WITH PC IN USER MODE\r
+>\r
+\f\r
+;"REENTER"  - REENTER USER PROGRAM\r
+\r
+EXTERNAL JOBREN\r
+\r
+REENTER:MOVE TAC1,JOBREN(JDAT) ;GET REENTER ADDRESS FORM JOB DATA AREA\r
+       JRST CHKSTR             ;START JOB WITH PC IN USER MODE\r
+                               ; IF  START ADR IS NON-ZERO\r
+\r
+; "DDT" - START EXECUTION AT DDT IN USER AREA\r
+\r
+       EXTERN JOBDDT\r
+\r
+DDTGO: MOVE TAC1,JOBDDT(JDAT)  ;DDT STARTING ADR. IN JOB DATA AREA\r
+                       ; FALL INTO CHSTR\r
+\r
+;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK\r
+\r
+CHKSTR: JUMPN TAC1,USTART      ;IS IT NON-ZERO?, IS YES\r
+                               ; STORE OLD PC IN JOBOPC IN JOB DATA AREA\r
+                               ; THEN START WITH PC IN USER MODE\r
+       JSP TAC,ERRMES          ;NO, PRINT "NO START ADR"\r
+       ASCII /NO START ADR\r
+/\r
+\f\r
+; "STOP" OR "<CONTROL>C"\r
+;SCANNER ROUTINES DUMMY UP STOP WHEN CONTROL C TYPED IN\r
+;STOP MUST BE DELAYED IF THIS JOB IS SYSTEM TAPE USER\r
+;AND SYSTEM TAPE IS ACTIVE, OTHERWISE, THE JOB WILL NOT BE\r
+;STOPPED WHEN DONE USING THE SYSTEM TAPE.\r
+\r
+INTERNAL FTDISK\r
+EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC\r
+\r
+STOP:  JUMPE   ITEM,STOP8      \r
+       CAMN ITEM,STUSER        ;IS THIS SYSTEM TAPE USER?\r
+       JRST CFINS              ;YES, DO FINISH SYS COMMAND\r
+IFN FTDISK,<\r
+       \r
+       PUSHJ PDP,STOPCK        ;CAN THE JOB STOP?\r
+       JRST DLYCM1             ;NO. DELAY IT.\r
+>\r
+       PUSHJ PDP,STOP1         ;STOP JOB\r
+STOP8: IFE FTTTYSER,<\r
+       JSP TAC,CONMES          ;PRINT "^C CRLF CRFL PERIOS"\r
+       ASCIZ /^C\r
+/\r
+>\r
+IFN FTTTYSER,<  POPJ   PDP,0>\r
+\r
+; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE)\r
+\r
+CONTC:                         ;SAME AS CONT\r
+\r
+; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF\r
+EXTERNAL JBTSTS\r
+\r
+CONT:  MOVSI TAC1,JERR\r
+       TDNN TAC1, JBTSTS(ITEM) ;IS JOB ERROR BIT SET?\r
+       POPJ PDP,               ;COMMAND DECODER WILL DO REST\r
+       JSP TAC,ERRMES          ;YES, PRINT CANT CONTINUE\r
+\r
+       ASCIZ /CAN'T CONTINUE\r
+/\r
+\f\r
+; "CORE  #" - ASSIGNS #*1024 WORDS OF CORE TO JOB\r
+; "CORE" WITH NO ARG. WILL PRINT NO OF FREE BLOCKS LEFT\r
+;      WITHOUT AFFECTING CURRENT ASSIGNMENT OF CORE\r
+;      JOB NOT IN MIDDLE OF SWAPPING\r
+;      EITHER ON DISK OR CORE OR NEITHER PLACE\r
+\r
+EXTERNAL PCORSZ\r
+\r
+CORE:  PUSHJ PDP, DECIN        ;GET NO. OF 1K BLOCKS\r
+       JRST COR3               ;NO ARG. SPECIFIED, JUST TYPE FREE BLOCK LEFT\r
+       JRST COMERA             ;ILLEGAL DECIMAL CHARACTER RETURN\r
+IFE FTSWAP,<\r
+       JUMPE TAC1,COR0         ;RELEASE DEVICES IF USER ASKING FOR 0 CORE\r
+>\r
+IFN FTSWAP,<\r
+       JUMPE TAC1,COR1         ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES\r
+                               ; IF ASKING FOR 0 CORE\r
+>\r
+       LSH TAC1,12             ;CONVERT 1K BLOCKS TO WORDS\r
+       \r
+       MOVEI TAC,-1(TAC1)      ;HIGHEST RELATIVE ADDRESS=LENGTH-1 OF LOW SEG\r
+       PUSHJ PDP,CORE0         ;TRY TO ASSIGN CORE\r
+       JRST COR2               ;CORE NOT AVAILABLE. GO PRINT MESSAGE\r
+       POPJ PDP,               ;OK RETURN, CORE ASSIGNED ON DISK OF MEMORY\r
+IFN FTSWAP,<\r
+;USER ASKING FOR 0K\r
+COR1:  JUMPN PROG,COR0         ;GO RELEASE ALL DEVICES IF HE HAS CORE IN MEMORY YET\r
+       PUSHJ PDP,GETMIN        ;NO, CORE ON DISK OR HAS NONE, ASSIGN MINIMAL\r
+                               ; AREA(FLUSH HIGH SEG TOO) IN CORE OR DISK\r
+       JRST DLYCM              ;AND DELAY COMMAND TILL CORE IS IN MEMORY\r
+                               ; DLYCM WILL SWAP IT IN.\r
+>\r
+\f\r
+COR2:  IFN FTTTYSERM,<\r
+       MOVE DEVDAT,-2(PDP)     ;RESTORE TTY DDB ADR\r
+>\r
+       PUSHJ PDP,INLMES        ;PRINT ? FOR PATCH\r
+       ASCIZ /?\r
+/\r
+COR3:  PUSHJ PDP,PRTSEG        ;PRINT SIZE OF LOW SEG\r
+IFN FT2REL,<\r
+       EXTERN PRTHGH\r
+       PUSHJ PDP,PRTHGH        ;PRINT SIZE OF HIGH SEG (+0 IF NONE)\r
+                               ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE\r
+>\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ "/"\r
+\r
+IFE FTSWAP,<\r
+       EXTERN CORTAL\r
+       MOVE TAC,CORTAL         ;NO. OF FREE 1K BLOCKS\r
+>\r
+IFN FTSWAP,<\r
+       EXTERNAL CORMAX\r
+       MOVE TAC,CORMAX         ;PRINT MAX. NO. OF BLOCKS IN PHYSICAL CORE\r
+       LSH TAC,-12             ;AVAILABLE TO A SINGLE USER(AS SET\r
+                               ; BY BUILD AND/OR ONCE)\r
+>\r
+       PUSHJ PDP,RADX10        ;PRINT NO. OF 1K BLOCKS AVAILABLE\r
+IFE FTSWAP,<\r
+       JSP TAC,CONMAS\r
+       ASCIZ /K CORE\r
+/\r
+>\r
+IFN FTSWAP,<\r
+       EXTERN VIRTAL\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ /K CORE\r
+VIR. CORE LEFT =/\r
+       MOVE TAC,VIRTAL         ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT\r
+       JRST RADX10             ;IN DECIMAL\r
+>\r
+\f\r
+; "SSAVE FILENAM.EXT [PROJ,PROG] CORE"\r
+;WORKS LIKE SAVE, EXCEPT THAT HIGH SEG IS SAVED AS SHARABLE(EXT=SHR)\r
+;INSTEAD OF NON-SHARABLE(EXT=HGH)\r
+\r
+; "SAVE FILE-NAME[PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE\r
+;ONLY A SAVE OR A GET IN PROGRESS FOR EACH JOB\r
+;NO ATTEMPT IS MADE TO SAVE DEVICE ASSGINMENTS, AC'S OR PC\r
+\r
+SAVE:IFN FT2REL,<\r
+       TLO IOS,NSRBIT          ;SET FLAGE FOR NON-SHARABLE EXT(HGH)\r
+>\r
+SSAVE: HRRI IOS,SAVJOB         ;SETUP TO RUN SAVEJOB (IOS CLEARED BEFORE\r
+       PUSHJ PDP,CTEXT1        ;DISPATCH\r
+       SETZM JBTPRG(ITEM)      ;CLEAR JOB'S PROGRAM NAME FOR ROOM\r
+       JRST SGSET\r
+\r
+; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE\r
+\r
+;DEVICE AND ASSIGNS CORE.\r
+\r
+GET:   MOVEI IOS,GETJOB        ;SETUP TO RUN GETJOB\r
+       PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
+       SETZM   JBTPRG(ITEM)    ;CLEAR NAME FOR RCOM\r
+       JRST RUNCM      \r
+                               ; JOB DATA AREA FOR MONITOR JOB\r
+\r
+IFN FTLOGIN,<  ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET\r
+\r
+EXTERNAL       REFLAG\r
+\r
+LOGREF:        MOVEM   TAC,PRJPRG(ITEM)        ;PRJ,PRG NRS. IN REFLAG\r
+       MOVSI   TAC,JLOG\r
+       IORM    TAC,JBTSTS(ITEM)\r
+       SETZM   -1(PDP)                 ;CLEAR ALL FLAGS FOR COMRET\r
+       SETZM   REFLAG                  ;ONLY ONCE\r
+       POPJ    PDP,\r
+>\r
+\f\r
+;"HELP" -HELP COMMAND\r
+\r
+INTERNAL FTLOGIN\r
+\r
+IFN FTLOGIN,<  EXTERNAL HELPPP\r
+HELP1:\r
+       MOVE TAC,HELPPP\r
+       TLN T,JLOG\r
+       JRST    ALOGIN\r
+       POPJ    PDP,\r
+>\r
+\r
+HELP:  IFN FTLOGIN,<\r
+       PUSHJ   PDP,HELP1\r
+>\r
+       MOVE    TAC,[SIXBIT /HELP/]     ;CUSP NAME\r
+       JRST    ARCOM   ;RUN IT\r
+\r
+SYSTAT:        IFN FTLOGIN,<\r
+       PUSHJ   PDP,HELP1\r
+>\r
+       MOVE    TAC,[SIXBIT /SYSTAT/]   ;CUSP NAME\r
+       JRST    ARCOM   ;RUN IT\r
+\r
+EXTERNAL JBTSTS,TTYATT\r
+\r
+ALOGIN:\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<  EXTERNAL PRJPRG\r
+       MOVEM TAC,PRJPRG(ITEM)\r
+       MOVSI TAC,JLOG\r
+       ANDCAM TAC,JBTSTS(ITEM)\r
+>\r
+IFN FTSWAP,<EXTERNAL   TTYATT\r
+ALOGN1:        PUSHJ PDP,TTYATT        ;MAKE SURE TTY IS ATTACHED IN CASE\r
+                               ; THIS COMMAND MUST BE DELAYED\r
+                               ; BECAUSE NO CORE YET.\r
+       JFCL\r
+>\r
+       POPJ PDP,\r
+\f\r
+INTERN FTCCL\r
+\r
+IFN FTCCL,<\r
+\r
+CCLRUN:        MOVE    TAC,[SIXBIT /COMPIL/]   ;CUSP NAME\r
+       JRST    ARCOM   ;RUN IT\r
+>\r
+;"LOGIN" - LOGIN COMMAND\r
+\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+\r
+EXTERNAL SYSPP\r
+\r
+LOGDET:        JSP     TAC,ERRMES\r
+       ASCIZ   /PLEASE KJOB OR DETACH\r
+/\r
+CLOGIN:        TLNE    T,JLOG          ;FORCE USER TO LOGOUT BEFORE\r
+       JRST    LOGDET          ; LOGGING IN ANEW.\r
+IFN FTSWAP,<\r
+       EXTERN VIRTAL,LOGSIZ\r
+       MOVE TAC,VIRTAL         ;AMOUNT OF FREE VIRTUAL CORE LEFT\r
+       CAIL TAC,LOGSIZ         ;IS THERE AT LEAST 2K FOR LOGIN?\r
+                               ; CUSTOMER CAN REDEFINE TO BE BIGGER THAN 2\r
+                               ; WITH MONGEN DIALOG\r
+       JRST CLOG2              ;YES,\r
+       MOVEI ITEM,0            ;NO, SET JOB NUMBER TO 0 FOR COMMAND DECODER\r
+       JRST COR2               ;AND GO TELL USER AMOUNT OF CORE LEFT\r
+>\r
+CLOG2: SKIPE   TAC,REFLAG      ;REFLAG SET NON-ZERO FOR AUTOMATIC LOGIN?\r
+       JRST    LOGREF          ;YES, LOG USER IN WITHOUT RUNNING CUSP\r
+                               ; SO HE CAN RELOAD THE DISK AFTER REFRESH\r
+       MOVE TAC,SYSPP          ;SET PRJPRG TO SYSPP\r
+       PUSHJ PDP,ALOGIN        ;AUTOMATIC LOGIN\r
+       MOVSI   TAC,JACCT       ;FLAG LOGIN OR LOGOUT RUNNING AND\r
+       IORM    TAC,JBTSTS(ITEM);DISABLE ^C,\r
+       MOVE    TAC,[SIXBIT /LOGIN/]    ;CUSP NAME\r
+       JRST    ARCOM   ;RUN IT\r
+>\r
+\f\r
+; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME"\r
+\r
+RCOM:  MOVEI   TAC,0   ;NO FILE NAME, TTY WILL SUPPLY IT\r
+       JRST    ARCOM1\r
+\r
+ARCOM: IFN FTTTYSER,<  PUSHJ   PDP,SKPBRK>\r
+ARCOM1:        MOVEM   TAC,JBTPRG(ITEM)        ;STORE FILE NAME\r
+       MOVSI   TAC1,(SIXBIT /SYS/)     ;READ FROM SYS DEVICE\r
+       JRST    RUNCO2\r
+; "RUN DEVICE:FILE[PROJ.PROG.] (CORE)"\r
+;DOES A CORE,GET,START ALL IN ONE\r
+;IF CORE ARG IS MISSING. SIZEIN DIRECTORY IS USED\r
+;JOB ON DISK OR IN CORE OR NO CORE, BUT NOT IN MIDDLE OF SWAP\r
+\r
+EXTERNAL JOBDA\r
+\r
+RUNCOM:        PUSHJ PDP,CTEXT1        ;GET DEVICE NAME FROM COMMAND STRING\r
+       SETZM   JBTPRG(ITEM)    ;CLEAR FILE NAME\r
+RUNCO2:RUNC1:  MOVEI IOS,RUNJOB\r
+RUNCM: PUSHJ PDP,GETMIN        ;GET MININAL JOB AREA IN CORE OR DISK\r
+       JUMPN PROG,SGSET        ;WAS CORE ASSIGNED IN MEMORY? IF YES, GO SCANARGS\r
+IFE FTSWAP,<\r
+       JRST COR2               ;NO. PRINT "0K CORE LEFT"\r
+>\r
+IFN FTSWAP,<\r
+       JRST DLYCM              ;NO. DELAY COMMAND UNTIL IN CORE\r
+>\r
+\f\r
+; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME\r
+\r
+EXTERNAL DEVLST,PJOBN,SYSTAP\r
+\r
+ASSIGN:        PUSHJ PDP, CTEXT1       ;GET FIRST ARGUMENT\r
+       JUMPE TAC1, NOTENF      ;NO ARGUEMNT TYPED IF 0\r
+IFN FTLOGIN,<EXTERN PRJPROG\r
+       CAME    TAC,[SIXBIT .SYS.]\r
+       JRST    ASSG6\r
+       HLRZ    T1,PRJPRG(ITEM)\r
+       CAIN    T1,1            ;PROJECT NR, 1?\r
+       JRST    ASSG7           ;YES\r
+ASSG6:\r
+>\r
+       MOVE T1, TAC1           ;SAVE DEVICE NAME\r
+IFN FTTTYSER,<\r
+       PUSH    PDP,DEVDAT      ;SAVE TTY\r
+>\r
+IFE FTTTYSER,<\r
+\r
+       PUSH PDP, TAC           ;SAVE INPUT BYTE POINT\r
+>\r
+       MOVE    TAC,TAC1\r
+       PUSHJ   PDP,DEVPHY\r
+       JRST    ASSG3\r
+       MOVEI   TAC1,ASSCON\r
+       JRST    ASSG4\r
+ASSG3: MOVEI   TAC1,ASSCON     ;SETUP ASSIGNED BY CONSOLE BIT\r
+       HLRZ DEVDAT, DEVLST\r
+ASSG0: MOVE TAC,DEVNAM(DEVDAT)\r
+       CAME T1,DEVNAM(DEVDAT)  ;DOES PHYSICAL NAME MATCH?\r
+       JRST ASSG1              ;NO\r
+ASSG4: CAMN T1,[SIXBIT /DSK/]  ;IS THIS A DISC?(IF YES,\r
+       JRST    ASSG5           ;BYPASS CHECK FOR SYSTEM TAPE AND ASSIGN BELOW\r
+       CAMN TAC,SYSTAP         ;IS NEXT DEVICE IN LIST THE SYSTEM TAPE?\r
+       JRST ASSFIN             ;YES, DO NOT ASSIGN. CLEAR DIRECTORY IN CORE BIT\r
+ASSG5: PUSHJ   PDP,ASSASG      ;NO, TRY TO ASSGIN DEVICE\r
+       JRST ASSER1             ;ALREADY ASSIGNED TO ANOTHER JOB\r
+       JRST ASSFIN             ;ASSIGNED\r
+\f\r
+;SYSTEM TAPE OR NOT MATCH OF ARG AND PHYSICAL NAME.\r
+\r
+ASSG1: CAMN TAC,SYSTAP         ;IS THIS SYSTEM TAPE?\r
+       JRST ASSG2              ;YES\r
+       LDB T, PJOBN            ;SAVE OLD JOB NUMBER FOR THIS DEVICE\r
+       TRZ TAC,-1              ;COMAPRE LEFT HALF ONLY\r
+       CAMN TAC, T1\r
+       PUSHJ PDP, ASSASG       ;MATCH. TRY TO ASSIGN IT\r
+       JRST ASSG2              ;KEEP LOOKING\r
+       JUMPE T,ASSFIN          ;IF OLD JOB NUMBER 0, DEVICE PREVIOSLY UNASSIGNED\r
+\r
+ASSG2: HLRZ DEVDAT, DEVSER(DEVDAT)\r
+       JUMPN DEVDAT, ASSG0\r
+IFN FTTTYSER,<\r
+       POP     PDP,DEVDAT      ;RESTORE TTY DDB\r
+>\r
+IFE FTTTYSER,<\r
+       POP PDP, TAC\r
+>\r
+       JRST NOTDEV             ;PRINT NO SUCH DEVICE\r
+\r
+IFN FTLOGIN,<EXTERN STREQ,SYSTAP\r
+ASSG7: PUSHJ   PDP,CTEXT1\r
+       JUMPE   TAC1,NOTENF\r
+       SKIPL   STREQ\r
+       JRST    DLYCM1\r
+       MOVEM   TAC1,SYSTAP\r
+       POPJ    PDP,\r
+>\r
+\f\r
+;ALREADY ASSIGNED TO ANOTHER JOB\r
+ASSER1:\r
+IFE FTTTYSER,<\r
+       PDP PDP, TAC\r
+       MOVEI TAC, ASSMS2\r
+       PUSHJ PDP,ERRMES\r
+       LDB TAC, PJOBN\r
+       JRST DECLF              ;PRINT JOB NUMBER CRLF\r
+>\r
+IFN FTTTYSER,<\r
+       LDB     TAC,PJOBN       ;GET JOB NUMBER FOR DEVICE\r
+       POP     PDP,DEVDAT      ;GET DDB FOR TTY\r
+       PUSH    PDP,TAC ;SAVE JOB NO.\r
+       MOVEI   TAC,ASSMS2      ;TYPE ERROR MESSAGE\r
+       PUSHJ   PDP,ERRMES\r
+       POP     PDP,TAC ;GET JOB NO. BACK\r
+       JRST    DECLF           ;AND TYPE IT\r
+>\r
+\r
+ASSMS2:        ASCIZ   /ALREADY ASSIGNED TO JOB /\r
+\f\r
+;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME\r
+ASSFIN:        SETZM   DEVLOG(DEVDAT)  ;CLEAR LOGICAL NAME\r
+IFE FTTTYSER,<\r
+       POP PDP,TAC             ;RESTORE INPUT BYTE POINTER\r
+       PUSH PDP,DEVDAT         ;SAVE DDB ADDRESS\r
+>\r
+IFN FTTTYSER,<\r
+       EXCH    DEVDAT,0(PDP)   ;GET TTYDDB, SAVE DEVICE DDB\r
+>\r
+       PUSHJ PDP,CTEXT1        ;GET SECOND ARG, LOGICAL DEVICE NAME\r
+       SKIPE TAC,TAC1          ;IS THERE A LOGICAL NAME SPECIFIED?\r
+       PUSHJ PDP, DEVLG        ;YES, SEE IF IT IS ALREADY IN USE\r
+                               ; BY THIS USER\r
+       JRST ASSG1              ;NO \r
+       MOVEI TAC,LOGERR        ;YES, PRINT ERROR\r
+       MOVE    DEVDAT,-3(PDP)  ;RESTORE TTY DDB\r
+       PUSHJ PDP,ERRMES\r
+       MOVEI TAC,0             ;CLEAR LOGICAL NAME FOR THIS DEVICE\r
+ASSF1: POP PDP,DEVDAT\r
+       MOVEM TAC,DEVLOG(DEVDAT);STORE IN DEVICE DATA BLOCK\r
+       MOVSI TAC1,DVDIRIN      ;CLEAR DIRECTORY IN CORE BIT\r
+       ANDCAB TAC1,DEVMOD(DEVDAT)      ;SETUP TAC1 WITH DEVICE CHARACTERISTICS FOR ASGHGH\r
+IFN FT2REL,<\r
+       EXTERN ASGHGH\r
+       PUSHJ PDP,ASGHGH        ;GO CHECK IF THIS DEVICE HAS INITIALIZED ANY SHARED SEGMENTS\r
+                               ; IF YES, CLEAR SEG NAMES SO NO NEW SHARING (DTA,MTA ONLY)\r
+>\r
+       MOVE TAC1,DEVNAM(DEVDAT)        ;PHYSICAL NAME\r
+       MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       PUSHJ PDP,PRNAME        ;PRINT IT\r
+       JSP TAC,CONMES\r
+\r
+       ASCIZ / ASSIGNED\r
+/\r
+\r
+LOGERR:        ASCIZ /LOGICAL NAME ALREADY IN USE. /\r
+\f\r
+;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE\r
+\r
+INTERNAL NOTDEV\r
+\r
+DEASSI:        JUMPE ITEM,CPOPJ        ;NO-OP IF NO JOB NUMBER\r
+       PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
+       JUMPE TAC1,DEASTY       ;NO ARG. IF 0, DEASSIGN ALL BY TTY\r
+       MOVE TAC, TAC1          ;DEVICE NAME\r
+       PUSHJ PDP, DEVSRC       ;SEARCH FOR DEVICE\r
+       JRST DEAER1             ;NOT FOUND\r
+       PUSHJ PDP, DEASG        ;FOUND, DEASSIGN IT\r
+       JRST DEAER2             ;NOT PREVIOUSLY ASSIGNED\r
+       POPJ PDP,               ;DEVICE DEASSIGNED\r
+\r
+NOTDEV:\r
+DEAER1:        MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       JSP TAC,ERRMES          ;PRINT NO SUCH DEVICE\r
+\r
+       ASCIZ /NO SUCH DEVICE\r
+/\r
+\r
+DEAER2:        MOVE TAC1,DEVNAM(DEVDAT)        ;PRINT PHYSICAL DEVICE NAME\r
+       MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       PUSHJ PDP,PRNAME\r
+       JSP TAC,ERRMES\r
+\r
+       ASCIZ / WASN'T ASSIGNED\r
+/\r
+\f\r
+INTERNAL FTREASSIGN\r
+IFE FTREASSIGN,<\r
+REASSI=UUOERR\r
+>\r
+\r
+IFN FTREASSIGN,<\r
+\r
+;REASSIGN UUO\r
+;CALL  MOVE AC,JOB NUMBER\r
+;      MOVE AC+1,SIXBIT /DEVICE/\r
+;      CALL AC,[SIXBIT /REASSIGN/]\r
+;IF C(AC)=0, JOB HAS NOT BEEN INITIALIZED\r
+;IF C(AC+1)=0, DEVICE NOT ASSIGNED TO THIS JOB OR DEVICE IS A TTY\r
+\r
+INTERNAL REASSIGN\r
+EXTERNAL PUUOAC,JOB\r
+\r
+REASSI:        LDB UUO,PUUOAC\r
+       HRLI UUO,PROG\r
+       PUSH PDP,@UUO           ;STACK JOB NUMBER TO BE REASSIGNED TO\r
+       AOS UUO\r
+       MOVE TAC1,@UUO          ;DEVICE NAME\r
+       MOVE ITEM,JOB           ;THIS JOB NUMBER\r
+       SOJA UUO,REASS1\r
+\r
+;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB"\r
+\r
+REASS:\r
+       PUSHJ PDP,CTEXT         ;GET DEVICE NAME\r
+       JUMPE TAC,NOTENF        ;NULL NAME?\r
+       MOVE UUO,TAC1           ;SAVE IT IN UUO\r
+       PUSHJ PDP,DECIN1        ;GET NEW JOB NUMBER\r
+       JRST NOTENF             ;NONE SPECIFIED, DOESN'T RETURN IF ERROR\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+       PUSH PDP,TAC1           ;PUT JOB NUMBER ON STACK, DEVICE\r
+       MOVE TAC1,UUO           ;NAME IN TAC1\r
+       SETZM UUO               ;SET COMMAND SWITCH\r
+\f\r
+;ROUTINE COMMON TO REASSIGN UUO AND COMMAND\r
+\r
+EXTERNAL JBTSTS,PJOBN,JOBFDV\r
+\r
+REASS1:        EXCH ITEM,(PDP)         ;NEW JOB NO. IN ITEM\r
+       CAILE ITEM,JOBN         ;IS JOB NUMBER OUT OF RANGE\r
+       JRST REASE2             ;YES, DO NOT REASSIGN\r
+       MOVE TAC,JBTSTS(ITEM)   ;NEW JOB STATUS\r
+       EXCH ITEM,(PDP)         ;RESTORE ITEM AND STACK\r
+       TLNN TAC,JNA            ;DOES NEW JOB EXIST?\r
+       JRST REASE1             ;NO.\r
+       MOVE TAC,TAC1\r
+       PUSHJ PDP,DEVSRC        ;SEARCH FOR DEV\r
+       JRST REASE2             ;NOT FOUND\r
+       LDB TAC,PJOBN\r
+       CAME TAC,ITEM           ;ASSIGNED TO THIS JOB\r
+       JRST REASE3             ;NO\r
+       MOVE TAC,DEVMOD(DEVDAT)\r
+\r
+       TLNE TAC,DVTTY          ;IS IT A TTY?\r
+       JRST REASE6             ;YES. CAN'T BE REASSIGNED\r
+       TRNN TAC,ASSPRG         ;IS DEVICE INITED?\r
+       JRST REASS3             ;NO.\r
+       JUMPN UUO,REASS4        ;YES. COMMAND LEVEL?\r
+       HRL DEVDAT,(PDP)        ;YES. SCHEDULE RELEASE\r
+       MOVEM DEVDAT,JOBFDV(JDAT)\r
+       POP PDP,TAC1\r
+       MOVE DEVDAT,-2(PDP)\r
+       MOVSI TAC1,TTYRNC       ;SET TTYRNC SO JOB WILL RUN\r
+       IORM TAC1,-1(PDP)\r
+       JSP TAC1,MSTART\r
+       JSP TAC,MONSTR\r
+       HLRZ TAC,JOBFDV(JDAT)\r
+       PUSH PDP,TAC\r
+       HRRZ DEVDAT,JOBFDV(JDAT)\r
+       MOVE ITEM,JOB\r
+       SETOM UUO               ;SET FLAG TO STOP JOB\r
+REASS4:        HRRZ DSER,DEVSER(DEVDAT)\r
+       HRRZM DEVDAT,JOBFDV(JDAT)\r
+       MOVE UCHN,USRHCU\r
+\f\r
+REASS2:        MOVE DEVDAT,USRJDA(UCHN)        ;GET XWD UUO BITS,DDB ADDRESS\r
+       HRRZ TAC,JOBFDV(JDAT)   ;GET ADDR. OF DDB SAVED BY COMMAND\r
+       PUSH PDP,UCHN           ;SAVE USER CHANNEL\r
+       CAIN TAC,(DEVDAT)       ;IS CHOSEN DEVICE ON THHS CHANNEL?\r
+       PUSHJ PDP,RELEA5        ;YES, RELEASE DEVICE\r
+       POP PDP,UCHN\r
+       SOJGE UCHN,REASS2\r
+       MOVE DEVDAT,JOBFDV(JDAT)\r
+       MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
+REASS3:        MOVEI TAC,ASSCON        ;ASSIGN IT BY CONSOLE\r
+       IORM TAC,DEVMOD(DEVDAT)\r
+       EXCH ITEM,(PDP)\r
+       DPB ITEM,PJOBN          ;PUT IN NEW JOB NUMBER\r
+       POP PDP,ITEM\r
+       JUMPL UUO,ESTOP\r
+       POPJ PDP,\r
+\r
+REASE1:        POP PDP,TAC\r
+       JUMPE UUO,ATT4          ;JOB NEVER WAS INITIATED\r
+REASE4:        SETZM @UUO              ;CLEAR C(AC)\r
+       POPJ PDP,\r
+\r
+REASE2:        MOVEI TAC,NOTDEV        ;NO SUCH DEVICE\r
+REASE5:        POP PDP,TAC1\r
+       JUMPE UUO,(TAC)\r
+       AOJA UUO,REASE4\r
+\r
+REASE3:        MOVEI TAC,DEAER2        ;WASN'T ASSIGNED\r
+       JRST REASE5\r
+\r
+REASE6:        MOVEI TAC,REASE7\r
+       JRST REASE5\r
+REASE7:        MOVE TAC1,DEVNAM(DEVDAT)\r
+       MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       PUSHJ PDP,PRNAME\r
+       JSP TAC,ERRMES\r
+       ASCIZ / CAN'T BE REASSIGNED\r
+/\r
+>\r
+\f\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+\r
+;"ATTACH DEVNAME" -ATTACHES A PREVIOUSLY PARTITIONED DEVICE\r
+;      NOTE-MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
+; "ATTACH N [PROJ.,PROG.]" - ATTACH CONSOLE TO JOB N\r
+;CHANGES ADDRESS OF TTY DEVICE DATA BLOCK STORED IN -2(PDP)\r
+;BY THE COMMAND DECODER\r
+\r
+INTERNAL ATTACH\r
+EXTERNAL TTYATT,JOBN,TTYFND\r
+\r
+ATTACH:        IFE FTTTYSER,<\r
+       MOVE AC2,TAC            ;SAVE BYTE POINTER>\r
+       PUSHJ PDP,DECIN         ;GET JOB NO.\r
+       JRST NOTENF             ;NOT A NUMBER OR NONE SPECIFIEED\r
+IFN    FTLOGIN, <\r
+       JRST DEVATT             ;WANTS TO ATTACH A DEVICE\r
+>\r
+\r
+IFE    FTLOGIN, <\r
+       JRST    ATT1\r
+>\r
+       SKIPE TAC1              ;0 IS ILLEGAL\r
+       CAIL TAC1, JOBN         ;IS JOB NUMBER TOO BIG?\r
+       JRST ATT1               ;ILLEGAL JOB NUMBER\r
+       MOVSI T1,JNA            ;HAS THIS JOB NO BEEN ASSIGNED?\r
+       TDNN T1,JBTSTS(TAC1)\r
+       JRST ATT4               ;NO, PRINT ERROR\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+       MOVE IOS,TAC1           ;SAVE JOB NO.\r
+       PUSHJ PDP,PJPGNO        ;GET PROJ,-PROG. NOS. ARG(IF ERROR, PDP SUP LEVEL\r
+                               ; OFF 1, PRINT ERROR, AND DO NOT RETRY HERE\r
+\r
+       MOVEM IOS,TAC1          ;RESTORE\r
+       SKIPN AC2               ;DID USER TYPE IN A PROG,PROG # IN []'S?\r
+       MOVE AC2,PRJPRG(ITEM)   ;NO. ASSUME PROJ,PROG NUMBER FOR CURRENT JOB\r
+                               ; SO USER CAN AVOID TYPEING PROGPROG NO. IF  DOING\r
+                               ; FROM 1 JOB TO ANOTHER UNDER SAME PROJ,PROG\r
+       CAME AC2,PRJPRG(TAC1)   ;IS THIS THE SAME PERSON WHO DETACHED FROM THIS JOB NUMBER?\r
+       JRST ATT3               ;NO-ERROR\r
+                               ; YES\r
+>\r
+       MOVE ITEM,TAC1  ;JOB NUMBER TO ITEM\r
+       PUSHJ PDP,TTYATT        ;NO, ATTACH TTY\r
+       JRST ATT2               ;ERROR CAN'T ATTACH\r
+       MOVEM DEVDAT,-2(PDP)    ;CHANGE DEV DATA BLOCK ADDRESS\r
+IFN FTTTYSER,<\r
+       EXTERN TSETBF\r
+       PUSHJ PDP,TSETBF        ;INITIALIZE TTY INPUT BUFFER\r
+>\r
+       JRST TTYFND             ;ATTACHED, GO SET UP OUTP. BYTE PTR.\r
+\f\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+DEVATT:        IFE FTTTYSER,<\r
+       MOVE TAC,AC2            ;RESTORE BYTE POINTER>\r
+       PUSHJ PDP,CTEXT1                ;GET DEVICE ARGUMENT\r
+       JFCL                    ;SHOULD NEVER RETURN\r
+       MOVE T,PRJPRG(ITEM)     ;GET PROJ.-PROG. NOS.\r
+       CAME T,SYSPP            ;PRJPRG = [1,1]?\r
+       JRST ATT5               ;NO - ERROR\r
+       MOVE TAC,TAC1           ;YES-SET UP DEVICE NAME\r
+       PUSH PDP,DEVDAT         ;SAVE DDB FOR THIS TTY\r
+       PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
+       JRST TEMP1              ;NOT FOUND\r
+       LDB T,PJOBN             ;GET JOB NUMBER\r
+       JUMPN T,ATT6            ;IS IT = 0?\r
+       DPB ITEM,PJOBN          ;SET JOB NUMBER\r
+       MOVE TAC,DEVMOD(DEVDAT); CHECK TO SEE IF THIS IS A TTY\r
+       LDB TAC1,PUNIT          ;\r
+       TLNE TAC,DVTTY          ;IS IT A TTY?\r
+       HRRM DEVDAT,TTYTAB(TAC1)        ;SET TRANS TABLE TO POINT TO DDB\r
+       POP PDP,DEVDAT          ;\r
+       POPJ PDP,               ;RETURN\r
+>\r
+\f\r
+ATT1:  JSP TAC,ERRMES\r
+       ASCIZ /ILLEGAL JOB NUMBER\r
+/\r
+ATT2:  MOVE TAC1,DEVNAM(DEVDAT)        ;[PRINT PHYSICAL NAME\r
+       MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       PUSHJ PDP,PRNAME\r
+       JSP TAC,ERRMES\r
+       ASCIZ / ALREADY ATTACHED\r
+/\r
+ATT3:  JSP TAC,ERRMES\r
+       ASCIZ /CAN'T ATT TO JOB\r
+/\r
+ATT4:  JSP TAC,ERRMES\r
+       ASCIZ /NOT A JOB\r
+/\r
+ATT5:  JSP TAC,ERRMES\r
+       ASCIZ /CAN'T ATT DEV\r
+/\r
+ATT6:  POP PDP,DEVDAT\r
+       JSP TAC,ERRMES\r
+       ASCIZ /WASN'T DET\r
+/\r
+>\r
+\f\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+\r
+;"DETACH" - DETACH CONSOLE FROM JOB\r
+;"DETACH DEVNAM" - DETACHES DEVICE FROM THE SYSTEM SOFTWAREWISE\r
+;      NOTE - MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
+\r
+EXTERNAL TTYDET\r
+INTERNAL FTLOGIN\r
+\r
+IFE FTLOGIN,<\r
+DETACH:        JRST TTYDET             ;GO DETACH TTY\r
+>\r
+\r
+IFN FTLOGIN,<\r
+EXTERNAL PRJPRG,SYSPP,PUNIT,TTYTAB,PJOBN\r
+DETACH:        PUSHJ PDP,CTEXT1                ;GET ARGUMENT\r
+       JUMPE TAC1,TTYDET       ;ONLY "DET" TYPED\r
+       MOVE T,PRJPRG(ITEM)     ;GET PROJ.-PROG. NUMBER\r
+       CAME T,SYSPP            ;PRJPRG = [1,1]?\r
+       JRST LOGER1             ;NO-PRINT ERROR MSG.\r
+       MOVE TAC,TAC1           ;YES-SET UP DEVICE NAME\r
+       PUSH PDP,DEVDAT         ;SAVE TTY DDB\r
+       PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
+       JRST TEMP1              ;DEVICE NOT FOUND\r
+       MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS DSK\r
+       TLNE TAC,DVDSK          ;IS IT THE DSK?\r
+       JRST TEMP1              ;YES-PRINT ERROR MSG.\r
+       MOVEI TAC1,ASSCON       ;FOUND-SET UP ASSIGNED BY CONSOLE\r
+       PUSHJ PDP,ASSASG        ;TRY TO ASSIGN\r
+       JRST TEMP2              ;CAN'T ASSIGN\r
+       TLNE DEVDAT,SYSDEV      ;IS THIS SYSTEM DEVICE?\r
+       JRST TEMP1              ;YES-PRINT ERROR MSG.\r
+       XOR T,T                 ;NO-SET TO ZERO\r
+       DPB T,PJOBN             ;SET JOB NO. TO NULL JOB\r
+       MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS A TTY\r
+       TLNN TAC,DVTTY          ;IS IT A TTY?\r
+       JRST .+4                ;NO-GO AHEAD\r
+       LDB TAC,PUNIT           ;YES-SET UPO FOR SCNSER\r
+       MOVEI TAC1,-1           ;SET LEFT HALVE TO TTYTAB TO -1\r
+       HRRM TAC1,TTYTAB(TAC)   ;SO THAT SCNSER CHECKS FOR THIS\r
+       POP PDP,DEVDAT          ;RESTORE TTY DDB\r
+       POPJ PDP,               ;SUCCESSFUL RETURN\r
+\f\r
+TEMP1: POP PDP,DEVDAT          ;RESTORE TTY DDB\r
+       JRST DEAER1             ;PRINT ERROR MSG. AND RETURN\r
+TEMP2:\r
+IFE FTTTYSER,< POP PDP,DEVDAT          ;RESTORE TTY DDB\r
+       JRST ASSER1+1           ;PRINT ERROR MSG. AND RETURN\r
+>\r
+IFN FTTTYSER,<\r
+       JRST ASSER1\r
+>\r
+LOGER1:        JSP TAC,ERRMES\r
+       ASCIZ /CAN'T DET DEV\r
+/\r
+\r
+>>     ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS.\r
+\r
+;"DAYTIME" - PRINT TIME OF DAY\r
+\r
+EXTERNAL TIME,THSDAT,MONTAB,JIFMIN\r
+\r
+DAYTIM:\r
+IFN    FTLOGIN, <\r
+       JUMPE ITEM,DAYTM1\r
+       PUSHJ PDP,DECIN         ;WAS AN ARGUMENT TYPED?\r
+       JRST DAYTM1             ;NO, PRINT TIME\r
+       JRST COMERA             ;ERROR\r
+       HLRZ TAC,PRJPRG(ITEM)   ;YES\r
+       CAIE TAC,1              ;IS THIS PROJECT 1?\r
+       JRST DAYTM1             ;NO, PRINT TIME OF DAY ANYWAY(IGNORE ARG)\r
+       MOVE TAC,TAC1           ;YES, RESET TIME ACCORDING TO ARGUMENT\r
+       IDIVI TAC,^D100\r
+       IDIVI TAC,^D60          ;\r
+       ADD TAC,TAC1            ;COMPUTE MINUTES\r
+       IMULI TAC,JIFMIN        ;COMPUTE JIFFIES\r
+       MOVEM TAC,TIME          ;AND STORE\r
+       POPJ PDP,\r
+>\r
+DAYTM1:        MOVE TAC,THSDAT         ;PRINT TODAY'S DATE\r
+       IDIVI TAC,^D31\r
+       EXCH TAC,TAC1           ;YEAR AND MONTH IN TAC1\r
+       PUSHJ PDP,DECP1         ;ADD 1 TO DAY(IN TAC) AND PRINT DECIMAL\r
+       MOVEI TAC,0\r
+       DIVI TAC,^D12\r
+       EXCH TAC,TAC1\r
+       MOVE TAC,MONTAB(TAC)    ;MONTH\r
+       DPB TAC,[POINT 21,DAMESS,27]\r
+       MOVEI TAC,DAMESS\r
+       PUSHJ PDP,CONMES        ;PRINT DAY\r
+       MOVEI TAC,^D64(TAC1)\r
+       PUSHJ PDP,RADX10        ;PRINT YEAR\r
+       PUSHJ PDP,PRSPC\r
+       MOVE TAC,TIME           ;PRINT TIME OF DAY\r
+       JRST PRTIM1\r
+\f\r
+INTERNAL FTTIME\r
+IFN FTTIME,<\r
+;"TIME (JOB NO.)" - PRINT TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB\r
+;FOLLOWED BY KILO-CORE TICKS\r
+;"TIME 0" IMPLIES RUNTIME FOR NULL JOB AND THE TOTAL TIME SPENT SHUFFLING USERS\r
+;      IF NO JOB NO. GIVEN-TIME WILL BE FOR CURRENTLY LOGGGED IN JOB NO.\r
+\r
+EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD\r
+\r
+RUNTIM:        PUSHJ PDP,DECIN         ;GETJOB NO. ARG.\r
+       JRST RUN1               ;NO ARG. GIVEN - LOGGED IN?\r
+       JRST COMERA             ;ILLEGAL DECIMAL CHARACTER RETURN\r
+       JUMPE TAC1,RUN2         ;RUNTIME 0 GIVEN\r
+       CAIL TAC1,JOBN          ;JOB NO. TO BIG?\r
+       JRST ATT1               ;YES,ILLEGAL JOB. NO.\r
+       MOVE TAC,TTIME(TAC1)    ;TIME SINCE LAST LOGGIN\r
+       JRST PRTIME             ;PRINT AND RETURN\r
+\r
+RUN2:  PUSHJ PDP,INLMES        ;PRINT\r
+\r
+       ASCIZ /SHFL /           ;"SHUFFLING "\r
+       MOVE TAC,SHFWRD         ;NO. WORDS SHUFFLED\r
+       IDIVI TAC,WDPJIF        ;NO.WORDS/JIFFY USING BLT\r
+       PUSHJ PDP,PRTIME        ;PRINT SHUFFLE TIME\r
+       PUSHJ   PDP,INLMES\r
+       ASCIZ   /ZCOR /\r
+       MOVE    TAC,CLRWRD\r
+       IDIVI   TAC,WDPJIF\r
+       PUSHJ   PDP,PRTIME      ;PRINT TIME SPENT CLEARING CORE\r
+       PUSHJ   PDP,INLMES\r
+       ASCIZ   /LOST /\r
+       MOVE    TAC,LSTWRD\r
+       PUSHJ   PDP,PRTIME      ;PRINT TME SPENT "LOST" RUNNING NULL JOB\r
+       PUSHJ PDP,INLMES        ;PRINT\r
+       ASCIZ /NULL /           ;"NULL TIME "\r
+       MOVE TAC,TTIME          ;PRINT NULL JOB RUNNING TIME\r
+       PUSHJ PDP,PRTIME        ;\r
+       PUSHJ PDP,INLMES        ;PRINT TOTAL SYSTEM UP TIME\r
+       ASCIZ /UP   /\r
+       MOVE TAC,UPTIME\r
+       JRST PRTIME             ;AND RETURN\r
+\f\r
+RUN1:\r
+IFE FTLOGIN,<\r
+       MOVEI TAC,0             ;GET SET TO CLEAR INCREMENTAL RUN TIME\r
+>\r
+IFN FTLOGIN,<\r
+       MOVSI TAC,JLOG          ;IS JOB LOGGED IN?\r
+       TDZN TAC,JBTSTS(ITEM)   ;TEST JOB STATUS BITS AND CLEAR TAC ALWAYS\r
+       JRST NOTENF             ;NO, NEED MORE ARGUMENTS\r
+>\r
+       EXCH TAC,RTIME(ITEM)    ;GET CURRENT INCR. TIME AND CLEAR\r
+       PUSHJ PDP,PRTIME        ;PRINT TIME SINCE LAST TIME COMM.\r
+PRTTIM:        MOVE TAC,TTIME(ITEM)    ;GET TOTAL ACCUMULATED TIME\r
+IFN FTKCT,<\r
+       PUSHJ PDP,PRTIME\r
+       EXTERN JBTKCT\r
+       PUSHJ PDP,INLMES        ;PRINT "K*CPUSEG=\r
+       ASCIZ /KILO-CORE-SEC=/\r
+       MOVE TAC,JBTKCT(ITEM)   ;PRODUCT OF NO. OF K CORE* NO. OF JIFFIES RUN\r
+       IDIVI TAC,JIFSEC        ;AT THAT SIZE, CONVERT TO KILO CORE SECONDS\r
+       PUSHJ PDP,RADX10        ;AND PRINT IN DECIMAL\r
+       JRST CRLF               ;PRINT IRLF\r
+>\r
+IFE FTKCT,<\r
+       JRST PRTIME             ;PRINT IT AND RETURN\r
+>\r
+>\r
+\f\r
+;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS\r
+;      "TALK TTYN"\r
+;      TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE\r
+\r
+INTERNAL FTTALK\r
+\r
+IFN FTTALK,<\r
+EXTERNAL TTYTLK\r
+\r
+TALK:  PUSHJ PDP,CTEXT1                ;GET ARGUMENT\r
+       JUMPE TAC1,TALK2        ;NONE SPECIFIED\r
+       MOVE TAC,TAC1\r
+       PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
+       JRST TALK1              ;DEVSRC SHOULD FIND A FREE TTY DDB\r
+                               ; EVEN IF TTY NEVER TYPED ON YET\r
+       PUSHJ PDP,TTYTLK\r
+       JRST TALK1\r
+       POPJ PDP,\r
+\r
+TALK2: MOVSI ITEM,NOINCK       ;SET FLAGS SO RESPONSE WILL PRINT\r
+       MOVEM ITEM,-1(PDP)\r
+       JRST NOTENF\r
+\r
+TALK1: MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
+       MOVSI ITEM,NOINCK       ;SET FLAGS TO PRINT RESPONSE\r
+       MOVEM ITEM,-1(PDP)\r
+       JSP TAC,ERRMES\r
+       ASCIZ /BUSY\r
+/\r
+>\r
+\f\r
+INTERNAL FTEXAMINE\r
+\r
+IFN FTEXAMINE,<\r
+\r
+;"EXAMINE LOC" - LOOKS A CONTENTS OF LOC AND PRINTS IN OCTAL\r
+;IF LOC IS MISSING, NEXT LOC IS PRINTED\r
+;IF PREVIOUS WAS E COMMAND, SAME LOC IF PREVIOUS WAS D COMMAND\r
+;TAB. IS PRINTED INSTEAD OF CRLF(LIKE DDT)\r
+\r
+EXTERNAL TPOPJ,JOBPC\r
+\r
+ECOM:  SKIPGE JOBEXM(JDAT)     ;WAS PREVIOUS D OR E COMMAND. A D COMMAND?\r
+       AOS JOBEXM(JDAT)        ;NO, IT WAS AN  E. INCREMENT IN CASE HE TYPES NO ARG\r
+       HRROS JOBEXM(JDAT)      ;YES, FLAG THAT E HAPPENED LAST(LH=-1)\r
+       PUSHJ PDP,OCTIN         ;GET OCTAL LOCATION\r
+       SKIPA TAC,JOBEXM(JDAT)  ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+       PUSHJ PDP,DEAT          ;CHECK FOR AC REFERENCE AND STORE JOBEXM\r
+       HRRZ UUO,TAC1           ;IGNORE LH\r
+       HRLI UUO,PROG   ;SET TO RELOCATE\r
+       PUSHJ PDP,GETWRD        ;GET WORD FROM LOW OR HIGH SEG\r
+       JRST ECOMA              ;ERROR, OUT OF BOUNDS\r
+       PUSH PDP,TAC            ;SAVE CONTENTS OF LOC TO BE PRINTED\r
+       HRRZ TAC,JOBEXM(JDAT)   ;PRINT LOC BEING EXAMINED\r
+       PUSHJ PDP,OCTPNT\r
+       PUSHJ PDP,INLMES        ;PRINT SLASH TAB\r
+       ASCIZ */        *\r
+       HLRZ TAC,(PDP)          ;PRINT LEFT HALF\r
+       PUSHJ PDP,OCTPNT\r
+       PUSHJ PDP,INLMES        ;PRINT SPACE\r
+       ASCIZ / /\r
+       HRRZ TAC,(PDP)          ;PRINT RIGHT HALF\r
+       PUSHJ PDP,OCTPNT\r
+       PUSHJ PDP,INLMES        ;PRINT FINAL TAB\r
+       ASCIZ / /\r
+       JRST TPOPJ              ;POP PDP,TAC,POPJ PDP,\r
+\f\r
+;"DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH IN LOCATION LOC\r
+;IF LOC IS MISSING. ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF PREVIOUS E\r
+\r
+EXTERNAL JOBEXM,JOBPFI\r
+\r
+DCOM:  PUSHJ PDP,OCTIN         ;GET LH\r
+       JRST NOTENF             ;NOT ENOUGH ARGUMENTS\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+       HRLM TAC1,IOS           ;SAVE LH\r
+       PUSHJ PDP,OCTIN         ;GET RH\r
+       JRST NOTENF             ;NOT ENOUGH ARGUMENTS\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+       HRRM TAC1,IOS           ;SVE RH\r
+       SKIPL JOBEXM(JDAT)      ;WAS PREVIOUS D OR E AN E COMMAND?\r
+                       ; LH=-1 IF E, LH=0 IF D\r
+       AOS JOBEXM(JDAT)        ;NO, INCREMENT IN CASE USER TYPED NOT THIRD ARG\r
+                       ; FOR SUCCESSIVE D'S\r
+       HRRZS JOBEXM(JDAT)      ;FLAG THAT A D WASDONE LAST(LH=0)\r
+       PUSHJ PDP,OCTIN         ;GET LOC\r
+       SKIPA TAC1,JOBEXM(JDAT) ;NOT SPECIFIED, USE LAST OF E OR NEXT OF D\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+IFN FT2REL,<\r
+       EXTERN CHKMED\r
+       PUSHJ PDP,CHKMED        ;CHECK TO SEE IF HIGH SEG IS SHARABLE\r
+                               ; IF YES, SET USER-MODE WRITE PROTECT (UWP) ON\r
+                               ; FOR THIS USER, AND SET MEDDLE FOR THIS USER\r
+                               ; SO HE CANNOT TURN UWP OFF\r
+>\r
+       TRNN TAC1,777760        ;IN USER ACS\r
+       JRST DCOM1              ;YES\r
+       HLRZ TAC,PROG           ;GET PROTECTION\r
+       CAILE TAC1,JOBPFI       ;NO, GREATER THAN HIGHEST LOC, PROTECTED\r
+                               ; FROM IO IN JOB DATA AREA?\r
+       CAMLE TAC1,TAC          ;IN BOUNDS?\r
+       JRST DCOMA              ;NO\r
+DCOM1: PUSHJ PDP,DEAT          ;CHECK FOR AC REFERENCE\r
+       HRLI TAC1,PROG          ;SET FOR RELOCATION\r
+       MOVEM IOS,@TAC1 \r
+       POPJ PDP,\r
+\f\r
+DEAT:  TLZ TAC1,-1             ;CLEAR LH IN CASE THIS IS A SUCCESSIVE E WITH NO ARG\r
+       HRRM TAC1,JOBEXM(JDAT)  ;STORE FOR NEXT TIME, DO NOT TOUCH LH(D OR E LAST)\r
+                               ; YES, WAS JOB STOPPED IN USER MODE?\r
+       CAIL TAC1,20            ;IS IT AN AC?\r
+       POPJ PDP,               ;NO\r
+       MOVE TAC,JOBPC(JDAT)\r
+       TLNE TAC,USRMOD         ;USER MODE?\r
+       ADDI TAC1,20            ;YES USER ACS ARE AT 20 INSTEAD OF 0\r
+\r
+DCOMA:\r
+IFN FT2REL,<\r
+       EXTERN HGHDEP\r
+       PUSHJ PDP,HGHDEP        ;IS IT IN BOUNDS AND ALLOWED IN HIGH SEG?\r
+       JRST ECOMA              ;NO, PRINT "OUT OF BOUNDS"\r
+       POPJ PDP,               ;YES, IOS DEPOSITED, AND JOBEXM UPDATED\r
+>\r
+ECOMA: JSP TAC,ERRMES  ;OUT OF BOUNDS\r
+       ASCIZ /OUT OF BOUNDS\r
+/\r
+\r
+>\r
+\f\r
+IFN FTLOGIN,<\r
+;"SCHEDULE OCTN" - SETS RH OF STATES TO OCTN, IF TYPED FROM\r
+; THE OPERATOR CONSOLE (C(DEVOPR)), OTHERWISE ILLEGAL\r
+;"SCHEDULE" WITH NO ARGUMENTS TYPES OUT RH OF STATES, LEGAL FOR ALL.\r
+\r
+       EXTERN DEVOPR,STATES,OCTPNT\r
+\r
+SKEDUL:        PUSHJ   PDP,OCTIN       ;GET THE ARGUMENT IF ANY\r
+       JRST    SKED1           ;NO ARGUMENT\r
+       JRST    COMERA          ;BAD SYNTAX IN OCTAL NUMBER\r
+       MOVE    TAC,DEVNAM(DEVDAT) ;AN ARGUMENT. IS THIS THE OPR?\r
+       CAME    TAC,DEVOPR\r
+       JRST    COMERR          ;NO, THIS IS ILLEGAL, THEN.\r
+       HRRM    TAC1,STATES     ;YES. STORE ARGUMENT IN RH OF STATES\r
+       POPJ    PDP,0           ;RETURN\r
+\r
+SKED1: HRRZ    TAC,STATES      ;SCHEDULE WITH NO ARGUMENTS.\r
+       PUSHJ   PDP,OCTPNT      ;PRINT RH OF STATES.\r
+       JRST    CRLF            ;AND RETURN WITH A CRLF\r
+>\r
+;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND\r
+;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE)\r
+\r
+CBLANK:\r
+IFE FTTTYSER,<\r
+       LDB     TEM,TAC         ;GET BREAK CHARACTER\r
+       CAIE    TEM,15          ;IS IT A CR\r
+>\r
+IFN FTTTYSER,<\r
+       CAIE    TEM,12          ;WAS BREAK A LF\r
+>\r
+       CAIN TEM,";"            ;NO, IS IT SEMI COLON(MONITOR COMMENT)\r
+       POPJ PDP,               ;YES, IGNORE\r
+                               ; FALL IN UNKNOWN COMMAND\r
+\r
+;COMMAND NOT IN COMMAND DICECTORY\r
+\r
+NOCOM: JRST COMERR     ;NO, APPEND ? TO WHAT HE TYPED IN\r
+\f\r
+IFN FTFINISH,<\r
+; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE\r
+;JOB MUST HAVE CORE\r
+\r
+       EXTERNAL USRJDA,PUUOAC,JOB,USRHCU,JOBFDV,SYSTAP\r
+CFINI: PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
+       JUMPE TAC1,NOTENF       ;NOT ENOUGH ARG. IF NONE\r
+       SKIPA TAC,TAC1          ;SEARCH FOR SIXBIT DEVICE NAME\r
+CFINS: MOVE TAC,SYSTAP         ;HERE ON CONTROL C ON SYSTEM TAPE USER\r
+                               ; DO A FINISH SYS COMMAND FOR HIM\r
+       PUSHJ PDP,DEVSRC        \r
+       JRST NOTDEV             ;PRINT NOT A DEVICE\r
+       HRRZM DEVDAT,JOBFDV(JDAT)       ;STORE DDB ADR. IN JOB DATA AREA\r
+       MOVE DEVDAT,-2(PDP)\r
+       JSP TAC1, MSTART        ;SETUP MONITOR JOB AND RETURN\r
+                               ; RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
+       JSP TAC,MONSTR          ;SETUP ACS,PROG,JDAT,PDP\r
+       MOVE UCHN,USRHCU        ;HIGHEST USER IO CHANNEL IN USE\r
+FDV1:  HRRZ DEVDAT,USRJDA(UCHN)        ;GET NEXT DEVICE\r
+       MOVSI UUO,071000        ;SETUP RELEASE UUO\r
+       DPB UCHN,PUUOAC         ;WITH CHANNEL NO.\r
+       PUSH PDP,UCHN\r
+       CAMN DEVDAT,JOBFDV(JDAT)        ;IS THIS DEV. THE ONE TO RELEASE?\r
+       XCT UUO                 ;YES, RELEASE IT(AND CLOSE)\r
+       POP PDP,UCHN\r
+       SOJGE UCHN,FDV1         ;FINISHED?\r
+       MOVE ITEM,JOB           ;GET JOB NUMBER\r
+       MOVE DEVDAT,JOBFDV(JDAT)        ;RESET DEVDAT\r
+       PUSHJ PDP,DEASG         ;DEASSIGN DEVICE\r
+       JFCL                    ;IGNORE IF NOT ASSIGNED BY CONSOLE\r
+       JRST ESTOP              ;STOP JOB SO HE CANNOT CONTINUE\r
+>\r
+\f\r
+IFN FTTIME,<\r
+;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK\r
+\r
+EXTERNAL DEVLST\r
+\r
+FREDEV:\r
+IFN    FTDISK, <\r
+EXTERNAL       SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT\r
+\r
+       XOR TAC,TAC             ;INITIALIZE COUNTER\r
+       HLRE    T2,SATXWD       ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE,\r
+       MOVNS   T2\r
+       HRRI T1,SATENT          ;GET SATENT ENTRY POINTER\r
+LOP05: HRRZ TAC1,0(T1)         ;GET VALUE\r
+       TRNE    TAC1,WLBIT      ;IS THIS SPACE WRITE PROTECTED?\r
+       JRST    LOP06           ;YES, NO FREE BLOCKS IN THE SAT BLOCK.\r
+       ADDI    TAC,NUMBIT      ;NO, ADD THE FOLLOWING QUANTITY IN THIS SAT\r
+       SUB     TAC,TAC1        ; RUNNING TOTAL: (TOTAL BLOCKS IN THIS SAT\r
+                               ; BLOCK) - (BLOCKS ALREADY IN USE).\r
+LOP06: ADDI T1,SENTSZ          ;BUMP POINTER\r
+       SOJN T2,LOP05           ;DECREMENT INDEX\r
+       PUSHJ PDP,RADX10        ;CONVERT TO DECIMAL\r
+       PUSHJ   PDP,INLMES      ;PRINT\r
+       ASCIZ /. BLKS/\r
+>\r
+\r
+       HRLZ T,DEVLST           ;GET DDB POINTER\r
+       MOVEI AC2,0             ;SET DEVICE NAME 0 FOR FIRST COMPARE\r
+LOP01: MOVE T1,DEVMOD(T)       ;DEVICE CHARACTERISTICS\r
+       TRNN T1,ASSCON!ASSPRG   ;DEVICE ASSIGNED BY CONSOLE OR PROGRAM?\r
+       TLNE T1,DVTTY!DVDSK     ;NO, IS IT A TTY OR DSK?\r
+       JRST LOP02              ;YES DO NOT PRINT\r
+IFE FTDISK,<\r
+       JUMPE AC2,LOP018        ;SUPPRESS LEADING COMMA IF NO DISK\r
+>\r
+       PUSHJ PDP,INLMES        ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER)\r
+       ASCIZ /,/\r
+LOP018:        MOVS AC1,DEVNAM(T)      ;GET DEVICE NAME\r
+       HLLZ TAC1,AC1           ;ASSUME SAME TYPE AS LAST ONE, PRINT\r
+                               ; ONLY RH OF NAME (UNIT NUMBER)\r
+       CAIN AC2,0(AC1)         ;IS IT REALLY THE SAME?\r
+       JRST LOP01A             ;YES. PRINT THE UNIT NUMBER,\r
+       MOVS TAC1,AC1           ;NO. MUST PRINT WHOLE NAME,\r
+       HRRZ AC2,AC1            ; AND GET THE NEW DEVICE IN FLAG AC.\r
+LOP01A:        PUSHJ PDP,PRNAME        ;AS BEING FREE\r
+LOP02: HLRZ T,DEVSER(T)        ;GET NEXT DEVICE IN CHAIN\r
+       JUMPN T,LOP01           ;IS THERE ONE?\r
+       JRST CRLF               ;NO. DONE, PRINT CR. LF AND THEN POPJ\r
+>\r
+\f\r
+EXTERNAL CPOPJ,STUSER\r
+;ROUTINE TO CHECK FOR ACTIVE DEVICES\r
+;NEVER GET HERE DURING SWAP IN OU OUT\r
+;SINCE COMMAND TABLE SHOULD AHVE NOTRAN BIT ON\r
+\r
+RUNCHK:        CAMN ITEM,STUSER        ;SYSTEM TAPE USER?\r
+       JRST DLYCM1             ;YES. DELY,BUT DO NOT STOP JOB\r
+ACTCHK:        JUMPE PROG,ACTCH1       ;DOES JOB HAVE CORE IN MEMORY\r
+       PUSHJ PDP,ANYACT        ;YES. ARE DEVICES ACTIVE?\r
+       JRST DLYCM              ;YES. DELAY COMMAND.\r
+ACTCH1:        MOVE TAC1,-1(PDP)       ;RESTORE COMMAND DISPATCH ADDRESS\r
+       MOVE DEVDAT,-2(PDP)     ;RESTORE TTY DDB ADDRESS\r
+       MOVE T,JBTSTS(ITEM)     ;RESTORE JOB STATUS\r
+CONTC1:        POPJ PDP,COM0\r
+\r
+;ROUTINE TO DELAY A COMMAND\r
+\r
+;DELAYS COMMAND TO BE EXECUTED WHEN JOB IN CORE MEMORY\r
+;AND CAUSE JOB TO BE SWAPPED IN(COMMAND WAIT BIT IS SET IN JBSTS)\r
+;AND POPD LEVEL UP ONE.\r
+\r
+EXTERNAL TTYCM,LINSAV\r
+\r
+DLYCM: PUSHJ   PDP,DLYCOM      ;SET COMMAND WAIT BIT IN JOB STATUS AND PUT\r
+                               ; JOB IN COMMAND WAIT QUEUE\r
+                               ; SO JOB IS NOT RUNNABLE ANY MORE\r
+;ROUTINE TO DELAY A COMMAND IF A SWAP OUT OR IN IS IN PROGRESS\r
+;DIFFERS FROM DLYCM IN THAT JOB IS NOT MADE TO BE SWAPPED IN\r
+;REQUIRES OR DELYAING COMMAND IF SYSTEM\r
+;TAPE USER TYPOES ^C (HALT COMMAND)\r
+\r
+DLYCM1:        POP     PDP,TAC\r
+       POP     PDP,TAC1\r
+       POP     PDP,TAC1\r
+       PUSH    PDP,CONTC1\r
+       MOVE    TAC1,LINSAV\r
+       JRST    TTYCM\r
+\f\r
+IFN FTDISK,<\r
+;SEARCH DEVICE CHAIN FOR DSK WITH COUNTS ON\r
+;CALL  MOVE ITEM,JOB NO\r
+;      PUSHJ PDP,STOPCK\r
+;      CAN'T STOP RETURN\r
+;      OK TO STOP RETURN\r
+\r
+EXTERNAL DSKDDB,DSKFGS,CPOPJ1\r
+\r
+STOPCK:        MOVEI DEVDAT,DSKDDB\r
+       MOVSI TAC1,DSKFGS\r
+STOPD: LDB TAC,PJOBN\r
+       CAIE ITEM,(TAC)         ;ASSIGNED TO THIS JOB?\r
+       JRST STOPC              ;NO\r
+       TDNE TAC1,DEVIOS(DEVDAT)        ;YES. FLAG ON?\r
+       JRST CPOPJ              ;YES. DELAY\r
+STOPC: HLRZ DEVDAT,DEVSER(DEVDAT)\r
+       MOVSI TAC,446353\r
+\r
+       CAMN TAC,DEVNAM(DEVDAT)\r
+       JRST STOPD\r
+       JRST CPOPJ1             ;OK TO STOP\r
+>\r
+\f\r
+SUBTTL COMCSS - COMMON COMMAND SUBROUTINES\r
+\r
+;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING\r
+; IN COMMAND LINE (SIXBIT)\r
+;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS CHAR.\r
+;      PUSHJ PDP, CTEXT\r
+; SIXBIT STRING RETURN LEFT JUSTIFIED IN AC TAC1\r
+\r
+INTERNAL CTEXT\r
+INTERNAL CTEXT1\r
+\r
+T=BUFPNT                       ;TEMPORARY AC'S\r
+T1=BUFWRD\r
+T2=UUO\r
+\r
+CTEXT: PUSHJ   PDP,SKIPS       ;CALL HERE IF AT START OF LINE\r
+       SKIPA\r
+\r
+CTEXT1:        PUSHJ PDP,SKIPS1                ;SKIP LEAD SPACES,TABS,NULLS AND CLEAR TAC1\r
+                               ; DO NOT RETURN IF CR WAS PERVIOUS BREAK\r
+       MOVE T,[POINT 6,TAC1]\r
+IFE FTTTYSER,<\r
+       LDB     TEM,TAC\r
+       JRST CTEX1\r
+CTEX0: ILDB    TEM,TAC\r
+>\r
+IFN FTTTYSER,<\r
+EXTERN TAKR,GETCHAR\r
+       LDB     TEM,TAKR(DAT)   ;GET LAST CHAR.\r
+       JRST    CTEX1\r
+CTEX0: PUSHJ   PDP,GETCHR      ;ROUTINE IN SCNSER TO PICK UP CHAR.\r
+>\r
+\r
+CTEX1: PUSHJ PDP, CTEX         ;IS IT ALPHANUMERIC\r
+       TRC TEM,40              ;CONVERT TO SIXBIT\r
+       TLNE    T,770000        ;SIX CHARS YET?\r
+       IDPB    TEM,T   ;NO. BUILD WORD \r
+       JRST CTEX0      ;LOOP FOR MORE\r
+\f\r
+;SCAN FOR ALPHANUMERIC CHAR IN TEM\r
+CTEX:  CAILE   TEM,"Z"+40      ;GREATER THAN LC Z?\r
+       JRST    CTEXA           ;YES. NOT SIXBIT.\r
+       CAIL    TEM,"A"+40      ;LOWER CASE LETTER?\r
+       TRZ     TEM,40          ;YES. MAKE UPPER CASE.\r
+       CAIL TEM, "0"\r
+       CAILE TEM, "Z"  ;LETTERS ARE LARGER THEN NOS.\r
+       JRST CTEXA      ;NEITHER\r
+       CAILE TEM,"9"\r
+       CAIL TEM,"A"\r
+       POPJ PDP,       ;LETTER OR NUMBER RETURN\r
+CTEXA: IFE FTTTYSER,<\r
+       POP     PDP,T1  ;REDUCE PDP BY 1 LEVEL\r
+       POPJ    PDP,    ;AND RETURN\r
+>\r
+IFN FTTTYSER,<\r
+       CAIN    TEM,":"         ;DEVICE NAME?\r
+       PUSHJ   PDP,GETCHR      ;YES. SKIP COLON\r
+       CAIE    TEM,3   ;CONTROL C?\r
+\r
+       JRST    TPOPJ   ;NO. RETURN ONE LEVEL UP\r
+CTXCNC:        MOVSI   TAC1,(SIXBIT /HAL/)     ;MAKE PHONY HALT COMMAND\r
+       MOVSI   TEM,12  ;WITH LF FOR TERMINATION\r
+       JRST    TPOPJ   ;AND RETURN UP A LEVEL\r
+>\r
+\f\r
+;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS\r
+;ALSO CLEARS TAC1\r
+;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING\r
+;CHAR, IS CR(IE POPS SUBROUTINE LEVEL UP 1 ON RETURN)\r
+;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR.\r
+;      PUSHJ PDP, SKIPS1\r
+\r
+INTERNAL SKIPS1,SKIPS\r
+\r
+IFE FTTTYSER,<\r
+SKIPS1:\r
+SKIPS: MOVEI TAC1,0    ;CLEAR TAC1\r
+       LDB TEM,TAC     ;WAS PRECEDING BREAK A CR?\r
+       CAIN TEM,15\r
+       JRST SKIPS2     ;YES. POP SUB. LEVEL UP 1\r
+SKIPSA:\r
+       ILDB    TEM,TAC\r
+       JUMPE TEM,SKIPSA        ;NULL?\r
+       CAIE TEM," "    ;SPACE?\r
+       CAIN TEM, 11\r
+       JRST SKIPSA\r
+       CAIN TEM,15     ;CR?\r
+SKIPS2:        POP PDP,T       ;YES. POP SUB. LEVEL UP ONE\r
+>\r
+IFN FTTTYSER,< EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR\r
+\r
+SKIPS: PUSHJ   PDP,GETCHR      ;GET FIRST CHAR ON LINE\r
+SKIPS1:        MOVEI   TAC1,0  ;FOR CTEXT, DECIN\r
+       LDB     TEM,TAKR(DAT)   ;IN CASE TEM CLOBBERED\r
+       CAIN    TEM,15  ;SKIP TO LF IF CR\r
+SKIPSA:        PUSHJ   PDP,GETCHR      ;NEXT CHARACTER\r
+       JUMPE   TEM,SKIPS3      ;POP UP A LEVEL IF NO CHARS\r
+       PUSHJ   PDP,SPCHEK      ;SPECIAL?\r
+       JRST    SKIPS2  ;NO\r
+       TLNE    TAC,BREAKB      ;BREAK?(END OF LINE)\r
+       JRST    SKIPS3  ;YES. POP UP RETURN\r
+SKIPS2:        CAIG    TEM,40  ;SPACE OR CONTROL CHAR?\r
+       JRST    SKIPSA  ;YES.\r
+       POPJ    PDP,Z   ;NO. RETURN\r
+SKIPS3:        CAIN    TEM,3   ;^C?\r
+       JRST    CTXCNC  ;HANDLE IT\r
+       MOVEI   TEM,12  ;FOR BREAK CONSISTENCY\r
+       JRST    TPOPJ   ;RETURN ONE LEVEL UP\r
+>\r
+\f\r
+;ROUTINE TO APPEND A "?" TO INPUT STRING AND SET AS OUTPUT\r
+;CALLED FROM OCTIN, RETURNS TO SECOND LEVEL ON PDL\r
+;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
+;      PUSHJ PDP, COMERA\r
+\r
+INTERNAL COMERA,COMERP\r
+\r
+COMERP:        POP     PDP,T           ;REMOVE SUB. RETURN BEFORE CALLING COMERA\r
+COMERA:        IFE FTTTYSER,<  IBP     TAC>\r
+       IFN FTTTYSER,<  PUSHJ   PDP,GETCHR>     ;MOVE UP, A CH\r
+\r
+;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?"\r
+;AND SET AS OUTPUT\r
+;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
+;      PUSHJ PDP, COMERR\r
+\r
+INTERNAL COMERR\r
+\r
+\r
+COMERR:\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC\r
+\r
+       MOVE    T,TITAKR(DEVDAT)        ;SAVE POSISITION IN SCAN\r
+       PUSHJ   PDP,TRESCN      ;BACK UP TO START OF COMMAND\r
+COMERL:        PUSHJ   PDP,GETCHR      ;GET A CHAR FROM COMMAND\r
+       CAMN    T,TITAKR(DEVDAT)        ;PASS BAD CHAR YET?\r
+       JRST    COMER1  ;YES\r
+       PUSHJ   PDP,OUTCHS      ;NO. TYPE CHAR.\r
+       JUMPN   TEM,COMERL      ;LOOP IF NOT OUT OF CHARACTERS\r
+\r
+COMER1:        PUSHJ   PDP,SETBFI              ;CLEAR ANY MORE TYPEIN\r
+       AOS     TISYNC(DEVDAT)  ;THIS WILL BE SOS-ED AT COMRET\r
+       MOVEI   TEM,"?"         ;APPEND ? TO ERRONEOUS WORD\r
+       PUSHJ   PDP,OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+       MOVE    DAT,TAC\r
+       MOVEI   T,"?"           ;STORE ? ON TOP OF BREAK CHAR.\r
+       DPB     T,DAT\r
+>\r
+       TDZA ITEM,ITEM          ;CLEAR JOB NO. AND SKIP INTO CRLF ROUT.\r
+\f\r
+;ROUTINE TO PRINT A COMMAND ERROR MESSAGE\r
+;SAME CALL AS CONMES\r
+\r
+INTERNAL ERRMES\r
+\r
+                               ; COMERR SKIPS THIS ROUT,(SEE ABOVE)\r
+ERRMES:        TDZA ITEM,ITEM          ;CLEAR JOB NUMBER TO INDICATE ERROR\r
+                               ; SKIP INTO CONMES ROUTINE\r
+\r
+;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED\r
+;CALL: MOVE DAT,BYTE POINTER TO OUTPUT\r
+;      PUSHJ PDP,CRLF\r
+\r
+INTERNAL CRLF\r
+\r
+                               ; COMERR SKIPS TO HERE(SEE ABOVE)\r
+CRLF:  MOVEI TAC,[ASCII /\r
+/]\r
+\r
+;ROUTINE TO MOVE ASCII CHAR. STRING TO CONSOLE OUTPUT BUFFER\r
+; CALL:        MOVE DAT, BYTE POINTER TO LAST OUTPUT CHARACTER\r
+;      MOVEI TAC,  ADDRESS OF ASCII MESSAGE\r
+;      PUSHJ PDP, CONMES\r
+; STRING TERMINATED BY NULL\r
+; CONMES DOES NOT START TTY\r
+;CONMS1 - SAME CALLING SEQUENCE A CONMES,EXCEPT LH IS BYTE POINTER \r
+\r
+INTERNAL CONMES\r
+EXTERNAL TPOPJ\r
+\r
+                               ; ERRMES SKIPS TO HERE\r
+CONMES:        HRLI TAC,440700         ;FORM ASCIZ BYTE POINTER\r
+CONMS1:        PUSH PDP,TAC            ;SAVE BYTE POINTER\r
+CON0:  ILDB TEM,(PDP)          ;GET NEXT CHAR.\r
+       JUMPE TEM,TPOPJ         ;IS IT NULL?(IF YES, DO POP TAC, POPJ)\r
+TYOINS:                ;TAG FOR THE TYPE OUT INSTRUCTION\r
+CONOUT:                                ;EXECUTED FROM REST OF COMCSS TO OUTPUT CHAR\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+       PUSHJ   PDP,OUTCHS      ;NO. STORE TTY OUTPUT BUFFER\r
+>\r
+IFE FTTTYSER,<\r
+       IDPB    TEM,DAT\r
+>\r
+       JRST CON0               ;KEEP GOING\r
+\f\r
+;ROUTINE TO PRINT INLINE ASCIZ MESSAGE\r
+;CALL: PUSHJ PDP,INLMES\r
+;      ASCIZ /THE MESSAGE/\r
+;RETURN TO NEXT LOC AFTER MESSAGE\r
+\r
+INTERNAL INLMES\r
+\r
+INLMES:        POP PDP,TAC             ;SETUP PRINT ADRESS FOR CONMES\r
+       PUSHJ PDP,CONMES        \r
+       JRST 1(TAC)             ;RETURN TO NEXT LOC AFTER MESSAGE\r
+\r
+;ROUTINE TO APPEND ? TO ERROR MESSAGE\r
+;CALL  PUSHJ PDP,PRQM\r
+;      RETURN\r
+\r
+INTERNAL PRQM\r
+\r
+PRQM:  MOVEI TEM,"?"\r
+IFN FTTTYSER,<\r
+\r
+EXTERN OUTCHS\r
+       JRST    OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+       IDPB    TEM,DAT\r
+       POPJ    PDP,\r
+>\r
+PRSPC: MOVEI TAC,[ASCIZ /      /]\r
+       JRST CONMES\r
+\f\r
+;ROUTINE TO PRINT "TOO FEW ARGUMENTS"\r
+;CALL: MOVE DAT,BYTE POINTER\r
+;      PUSHJ PDP,NOTENF\r
+\r
+INTERNAL NOTENF\r
+\r
+NOTENF:        JSP TAC,ERRMES\r
+\r
+ASCIZ /TOO FEW ARGUMENTS\r
+/\r
+\r
+;ROUTINE TO PRINT A PERIOD\r
+;CALL: PUSHJ PDP,PRPER\r
+\r
+INTERNAL PRPER\r
+\r
+PRPER: JSP TAC,CONMES\r
+       ASCIZ /./\r
+\f\r
+;ROUTINE TO DEASSIGN A DEVICE\r
+;CALL: MOVE DEVDAT, DEVICE DATA BLOCK\r
+;      MOVE ITEM, JOB NUMBER\r
+;      PUSHJ PDP, DEASG\r
+;      ERROR NOT PREVIOUSLY ASSIGNED\r
+;      OK RETURN WITH DEVICE DEASSIGNED\r
+\r
+INTERNAL DEASG\r
+EXTERNAL PJOBN,CPOPJ1,IPOPJ\r
+\r
+DEASG: LDB T, PJOBN            ;WAS DEVICE ASSIGNED TO THIS JOB?\r
+       CAME T, ITEM\r
+       POPJ PDP,               ;NO, RETURN\r
+       PUSH PDP,ITEM           ;SAVE JOB NUMBER\r
+       MOVSI TAC1,DVDIRI       ;CLEAR DIRECTORY IN CORE BIT\r
+       ANDCAB TAC1,DEVMOD(DEVDAT)      ;SET DEVICE CHARACTERISTICS FOR TEST\r
+                               ; AND ASGHGH\r
+       SETZM DEVLOG(DEVDAT)    ;CLEAR LOGICAL NAME\r
+\r
+       TRNE TAC1,ASSCON        ;IS DEVICE ASSIGNED BY CONSOLE?\r
+       AOS -1(PDP)             ;YES, DO OK RETURN\r
+IFN FT2REL,<\r
+       EXTERN ASGHGH\r
+       PUSHJ PDP,ASGHGH        ;IF DTA OR MTA, CLEAR ANY HIGH SEGMENT NAMES\r
+                               ; FROM THIS DEVICE SO NO NEW SHARING\r
+                               ; DEVMOD SETUP IN TAC1 ON CALL\r
+>\r
+       MOVEI TAC1,ASSCON       ;SETUP ASSIGNED BE CONSOLE BIT FOR RELEASE\r
+       PUSHJ PDP,RELEA6        ;CLEAR JOB NO. IN DDB IF DDB NOT NEEDED\r
+       JRST IPOPJ              ;RESTORE JOB NUMBER AND RETURN\r
+\r
+;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+;      MOVE DEVDAT,ADR. OF DEVICE NOT TO BE DEASSIGNED\r
+;      PUSHJ PDP, DEASTY\r
+\r
+INTERNAL DEASAL,DEASTY\r
+EXTERNAL DEVLST\r
+\r
+DEASTY:\r
+DEASAL:        PUSH PDP,DEVDAT         ;SAVE TTY DDB ADDRESS\r
+       HLRZ DEVDAT,DEVLST      ;SEARCH ALL DDB'S\r
+DEA1:  CAIE DEVDAT,@(PDP)      ;IS THIS DEVICE NOT TO BE DEASSIGNED?\r
+       PUSHJ PDP, DEASG        ;NO, TRY TO DEASSIGN IT\r
+       JFCL                    ;IGNORE IF CAN'T\r
+       HLRZ DEVDAT, DEVSER(DEVDAT)\r
+       JUMPN DEVDAT, DEA1\r
+       POP PDP,DEVDAT          ;RESTORE TTY DDB ADDRESS\r
+       POPJ PDP,\r
+\f\r
+;ROUTINE TO REA CONSOLE AND CONVERT ANY RADIX NUMBER\r
+; CALL:        MOVE TAC1,  DESIRED RADIX\r
+;      MOVE TAC,  BYTE POINTER TO FIRST CHARACTER\r
+;      PUSHJ PDP, ANYRIN\r
+;      NO ARG. TYPED RETURN, TAC1=0\r
+;      ILLEGAL CHARACTER RETURN\r
+;      NORMAL EXIT     TAC TAC1 CONTAINS NUMBER\r
+;SCAN STOPS ON FIRST OR,DASH,SPACE,OR TAB OR ILLEGAL CHAR.\r
+;SKIPS LEADING SPACES AND TABS\r
+\r
+INTERNAL OCTIN,OCTIN1,DECIN,DECIN1\r
+EXTERNAL CPOPJ1,CPOPJ2\r
+\r
+C=BUFPNT                       ;CHARACTER AC\r
+R=BUFWRD                       ;RADIX AC\r
+\r
+DECIN1:\r
+DECIN: MOVEI R,12              ;DECIMAL INPUT\r
+       JRST ANYRIN\r
+\r
+OCTIN1:\r
+OCTIN: MOVEI R,10              ;OCTAL INPUT\r
+ANYRIN:        PUSHJ PDP,SKIPS1        ;SKIP LEADING SPACES, TABS, NULLS\r
+                               ; DO NOT RETURN IF CR WAS PREVIOUS BREAK\r
+                               ; OR THIS BREAK\r
+IFE FTTTYSER,< LDB     TEM,TAC>\r
+OCT0:  CAIGE TEM,175           ;ALTMODES(175 OR 176)?\r
+       CAIN TEM,"["            ;NO. LEFT BRACKET(SO SPACE NOT REQ\r
+                               ; BEFORE [P,P] IN ATT AND GET COMMANDS.\r
+       JRST    CPOPJ2  ;YES. SKIP RETURN\r
+       CAIE TEM,"-"    ;DASH?\r
+       CAIG    TEM,400 ;SPACE OR CONTROL CHAR?\r
+       JRST CPOPJ2             ;YES, ONLY LEGAL TERMINATORS\r
+       CAIE TEM,","            ;COMMA?\r
+       CAIN TEM,"]"            ;RIGHT BRACKET?\r
+       JRST CPOPJ2             ;YES.\r
+       SUBI TEM,60     \r
+       JUMPL TEM,CPOPJ1                ;ERROR IF NEG.,REMOVE SUB. RETURN AND PRINT\r
+       CAML TEM, R             ;OR .GE. RADIX\r
+       JRST CPOPJ1             ;ERROR, GREATER OR EQUAL TO RADIX\r
+       IMUL TAC1, R\r
+       ADD TAC1,TEM\r
+IFE FTTTYSER,< ILDB    TEM,TAC ;NEXT CHAR>\r
+IFN FTTTYSER,< PUSHJ   PDP,GETCHR>     ;NEXT CHAR\r
+       JRST OCT0\r
+\f\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+;GET PROJECT-PROGRAMMER NUMBERS\r
+;CALL: MOVE TAC,INPUT BYTE POINTER\r
+;      PUSHJ PDP,PJPGNO\r
+;\r
+;(AC2)LH _ PROJECT NUMBER\r
+;(AC2)RH _ PROGRAMMER NUMBER\r
+;(AC2) = 0 IF NO [ ]'S TYPED\r
+;THE TERMINAL ] IS OPTIONAL\r
+\r
+IFE FTTTYSER,<\r
+PJPGNO: SKIPA  TAC1,TAC        ;SAVE INPUT BYTE POINTER IN CASE NO\r
+                               ; [ ]'S WERE TYPED IN.\r
+PP0:   IBP     TAC             ;GET NEXT CHARACTER (2ND TIME THRU LOOP)\r
+       LDB     TEM,TAC         ;GET CHAR WHICH STOPED PREVIOUS FIELD SCAN\r
+                               ; (OR NEXT CHAR ON 2ND TIME THRU LOOP)\r
+>\r
+\r
+IFN FTTTYSER,<\r
+PP0:   PUSHJ   PDP,SKIPS1\r
+PJPGNO:\r
+>\r
+       CAIN    TEM,"["         ;IS IT A "[" ?\r
+       JRST    PP1             ;YES, GET PROJECT-PROGRAMMER NUMBERS FROM INSIDE.\r
+       CAIE    TEM," "         ;NO, IS IT A SPACE ?\r
+       CAIN    TEM,11          ; OR A TAB?\r
+       JRST    PP0             ;YES, KEEP LOOKING FOR "[".\r
+       MOVEI   AC2,0           ;NEITHER SPACE NOT TAB, THUS RETURN A 0 MEANING\r
+                               ; NO PROJECT-PROGRAMMER NUMBER ENCOUNTERED.\r
+IFE FTTTYSER,< MOVEM   TAC1,TAC        ;RESTORE ORIGINAL BYTE POINTER.>\r
+       POPJ    PDP,            ;EXIT.......\r
+\r
+PP1:\r
+IFN FTTTYSER,< PUSHJ   PDP,SKIPS>\r
+       PUSHJ PDP,OCTIN ;GET FIRST ARG.-PROJ. NO.\r
+       JRST COMERP             ;NO ARG. GIVEN\r
+       JRST COMERP             ;ILLEGAL DECIMAL CHARACTER GIVEN\r
+       HRL AC2,TAC1            ;ENTER\r
+IFN FTTTYSER,< CAIE    TEM,","\r
+       JRST    COMERP\r
+       PUSHJ   PDP,SKIPS>\r
+       PUSHJ PDP,OCTIN         ;GET SECOND ARG.-PROG. NO.\r
+       JRST COMERP             ;\r
+       JRST COMERP             ;\r
+       HRR AC2,TAC1            ;ENTER\r
+       PUSHJ PDP,SKIPS1        ;SKIP BLANKS\r
+       CAIN TEM,"]"            ;IS USUAL ENDING A "]"?\r
+IFE FTTTYSER,<IBP TAC>         ;YES, SKIP IT\r
+IFN FTTTYSER,<PUSHJ PDP,GETCHR>        ;YES, SKIP IT SO FINAL ] IS OPTIONAL\r
+       POPJ PDP,               ;RETURN RO CALL\r
+>\r
+\f\r
+;ROUTINE TO PRINT TIME AS HOURS,MINUTES,SECONDS, AND HUNDRETHS\r
+;FORMAT IS HHMM:SS.HH\r
+;CALL: MOVE TAC,TIME IN JIFFIES(60THS,50THS OR MILLISECONDS)\r
+;      MOVE DAT,OUTPUT TEXT BYTE POINTER\r
+;      PUSHJ PDP,PRTIME\r
+\r
+;SCALEING IS DONE USING THE FOLLOWING GLOBAL SYMBOLS DEFINED\r
+;ON THE CONFIGURATION TAPE (IOINI1)\r
+;THUS ANY INSTALLATION MAY HAVE ANY RATE CLOCK\r
+\r
+EXTERNAL JIFMIN,JIFSEC,JIFSC2\r
+\r
+;JIFMIN=NO. OF JIFFIES(CLOCK TICKS) PER MINUTE\r
+;JIFSEC=NO. OF JIRFIES PER SECOND\r
+;JIFSC2=1/2*JIFSEC(USED FOR ROUNDING)\r
+\r
+INTERNAL PRTIME\r
+\r
+PRTIME:        IDIVI TAC,JIFMIN        ;FORM MINUTES\r
+       PUSH PDP,TAC1           ;SAVE REMAINDER IN JIFFIES\r
+       JUMPE TAC,PR1           ;SUPRESS 0 HOURS IN MINUTES\r
+       IDIVI TAC,^D60          ;HOURS, MINUTES IN TAC,TAC1\r
+       JUMPE TAC,PR0           ;SUPPRES 0 HOURS\r
+       PUSHJ PDP,RADX10\r
+       PUSHJ PDP,INLMES        ;PRINT "HH:" OR "H:"\r
+       ASCIZ /:/\r
+PR0:   MOVE TAC,TAC1           ;GET MINUTES\r
+       PUSHJ PDP,PRT2          ;PRINT "MM:"\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ /:/\r
+PR1:   POP PDP,TAC             ;RESTORE SECONDS(IN JIFFIES)\r
+       IDIVI TAC,JIFSEC        ;JIFFIES PER SECOND\r
+       PUSHJ PDP,RADX10        ;PRINT SECONDS\r
+       PUSHJ PDP,PRPER         ;PRINT PERIOD\r
+       MOVE TAC,TAC1           ;NO OF JIFFIES(HUNDRETHS)\r
+       IMULI TAC,^D100         ;CONVERT TO HUNDRETHS\r
+       IDIVI TAC,JIFSEC\r
+       CAIL TAC1,JIFSC2        ;ROUND IF GREATER THEN HALF\r
+       AOS TAC\r
+       JRST PRT2LF             ;PRINT\r
+\f\r
+PRTIM1:        IDIVI TAC,JIFMIN        ;\r
+       IDIVI TAC,^D60          ;HOURS,MINUTES IN TAC,TAC1\r
+       PUSHJ PDP,PRT2\r
+       PUSHJ PDP,INLMES        ;PRINT "HH:"\r
+       ASCIZ /:/\r
+       MOVE TAC,TAC1\r
+PRT2LF:        PUSHJ PDP,PRT2          ;PRINT "MM\r
+       JRST CRLF\r
+\r
+PRT2:  MOVEI TEM,"0"\r
+       CAIGE TAC,^D10\r
+       XCT CONOUT              ;PUT LEADING 0 IF LESS THEN 10\r
+       JRST RADX10             ;PRINT REST OF NUMBER\r
+\f\r
+;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH)\r
+;CALL: MOVE ITEM, HIGH OR LOW SEG NUMBER\r
+;      PUSHJ PDP,PRT SEG\r
+;      RETURN\r
+;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON\r
+\r
+       INTERN PRTSEG\r
+       EXTERN PCORSZ\r
+\r
+PRTSEG:        PUSHJ PDP,SEGSIZ        ;TAC1=SIZE OF HIGH OR LOW SEG\r
+       MOVE TAC,TAC1           ;RADX10 WANT DEC. NO. IN TAC\r
+       JRST RADX10             ;PRINT DECIMAL\r
+\r
+;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG\r
+;CALL: MOVE ITEM,LOW OR HIGH SEG NUMBER\r
+;      PUSHJ PDP,SEGSIZ\r
+;      RETURN WITH SIZE IN K IN TAC1\r
+\r
+       INTERN SEGSIZ\r
+       EXTERN CPOPJ\r
+\r
+SEGSIZ:\r
+IFN FTSWAP,<\r
+       EXTERN IMGIN\r
+       LDB TAC1,IMGIN          ;SIZE WHEN NEXT SWAPPED IN(IN K)\r
+       JUMPN TAC1,CPOPJ        ;0 MEANS NOT SWAPPED OUT\r
+>\r
+       HLRZ TAC1,JBTADR(ITEM)  ;SIZE-1 LOW LOW OR HIGH SEG IN WORDS IN CORE\r
+       JUMPE TAC1,CPOPJ        ;IS IT IN CORE?\r
+       LSH TAC1,-12            ;YES, CONVERT TO #K-1\r
+       AOJA TAC1,CPOPJ         ;ADD 1 AND RETURN NUMBER OF K\r
+\f\r
+;ROUTINE TO ASSIGN A MINIMAL CORE AREA(140 WORDS)\r
+;CALLED FROM CORE,KJOB, AND RUN COMMANDS\r
+;THIS ROUTINE PRESERVES INPUT BYTE POINTER IN TAC\r
+;CALL: PUSHJ PDP,GETMIN\r
+;      RETURN PROG=0 IF UNSUCCESSFUL OR CORE ASSIGNED ON DISK\r
+\r
+       EXTERN JOBDA,TPOPJ\r
+\r
+GETMIN:\r
+IFE FTTTYSER,<\r
+       PUSH PDP,TAC    ;SAVE INPUT BYTE POINTER TO COMMAND\r
+>\r
+IFN FTTTYSER,<\r
+       PUSH PDP,DEVDAT         ;SAVE TTY DDB ADR\r
+>\r
+       PUSH PDP,TAC1   ;SAVE DEVICE NAME(GET)\r
+       PUSH PDP,IOS    ;SAVE DISPATCH ADDRESS(ANYACT USES IOS)\r
+IFN FT2REL,<\r
+       EXTERN KILHGH\r
+\r
+       PUSHJ PDP,KILHGH        ;KILL HIGH SEG\r
+>\r
+       MOVEI TAC,JOBDA         ;LENGTH OF JOBDATA AREA\r
+       PUSHJ PDP,CORE0         ;ASSIGN 140 WORDS ON DISK OR MEMORY\r
+       JFCL                    ;IGNORE IF CANT(PROG=0)\r
+       POP PDP,IOS     \r
+       POP PDP,TAC1            ;RESTORE PUSHED ACS\r
+IFN FTTTYSER,<\r
+       POP PDP,DEVDAT          ;RESTORE TTY DDB ADR\r
+       POPJ PDP,               ;TAC NOT USER BY FULL DUPLEX SCNSER\r
+>\r
+IFE FTTTYSER,<\r
+       JRST TPOPJ              ;RESTORE TAC AND RETURN\r
+>\r
+\f\r
+;ROUTINE TO GET 1 WORD FORM USER ARE WHICH CAN BE IN LOW OR HIGH SEG\r
+;CALL: MOVE PROG,[XWD PROT,RELOC FOR LOW SEG]\r
+;      MOVE ITEM,JOB NUMBER\r
+;      HRLI UUO,PROG           ;FOR RELOCATION\r
+;      HRR UUO,USER ADDRESS(IE BEFORE RELOCATION)\r
+;      PUSHJ PDP,GETWRD\r
+;      ERROR RETURN ADDRESS OUT OF BOUNDS\r
+;      OK RETURN, CONTENTS IN AC TAC\r
+;CAN BE CALLED AT CLOCK OR UUO LEVEL\r
+;CALLED FROM E COMMAND,INIT,OPEN AND CALL UUOS\r
+\r
+       INTERN GETWRD\r
+       EXTERN CPOPJ1\r
+\r
+GETWRD:        HLRZ TAC,PROG           ;LARGEST REL LOC IN LOW SEG\r
+       CAIGE TAC,(UUO)         ;IS ADR. IN LOW SEG?\r
+IFN FT2REL,<\r
+       EXTERN HGHWRD\r
+       JRST HGHWRD             ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO)\r
+>\r
+IFE FT2REL,<\r
+       POPJ PDP,               ;NO, ERROR RETURN\r
+>\r
+       MOVE TAC,@UUO           ;YES, GET IT FROM LOW SEG\r
+       JRST CPOPJ1             ;AND SKIP RETURN\r
+\f\r
+SUBTTL SAVGET - SAVE,GET,R,RUN COMMANDS AND RUN,GETSEG UUOS\r
+\r
+;SAVGET LOWER CORE LOCATIONS USED FOR UUOS TO MONITOR\r
+;USED IN SAVGET IN APRSER AND SAVGET IN SEGCON\r
+;THESE LOCATIONS ARE DEFINED TO BE IN THE USERS UUO ACS\r
+\r
+;FOR LOOKUP,ENTER UUOS:\r
+       XP SGANAM,0             ;FILE NAME\r
+       XP SGAEXT,SGANAM+1      ;FILE EXTENSION\r
+       XP SGADAT,SGANAM+2      ;FILE CREATION DATE+TIME\r
+       XP SGALEN,SGANAM+3      ;LN=-LENGTH,RH=FIRST LOC-1 DUMPED\r
+                               ; OR PROJECT-PROGRAMMER NUMBER(DISK)\r
+       XP SGAEND,SGALEN+1      ;LAST WORD OF DUMP COMMAND LIST=0(SAVE AND GET)\r
+       XP SGAREN,SGAEND        ; ALSO FIRST WORD FOR RENAME USED AS DELETE\r
+       XP SGAPPN,SGAREN+3      ;FOURTH WORD-PLACE TO SAVE PROJECT-PROGRAMEMR\r
+                               ; NUMBER USER TYPED\r
+\r
+;FOR OPEN UUOS:\r
+       XP SGAMOD,10            ;IOS MODE WORD FOR OPEN UUO\r
+       XP SGADEV,SGAMOD+1      ;DEVICE NAME\r
+       XP SGAHED,SGAMOD+2      ;INPUT-OUTPUT BUFFER HEADER ADDRESSES=0\r
+\r
+;MISC. DATA LOCATIONS:\r
+\r
+       XP SGADMP,13            ;DUMP COMMAND IOWD\r
+       XP SGACOR,14            ;AC FOR CORE UUO'S(HIGHEST USER LOC DESIRED)\r
+       XP SGANEW,15            ;NEW CORE ASSIGNMENT AS SPECIFIED BY THIRD ARG\r
+       XP SGAHGH,16            ;LH=EXT TO USE FOR SAVING HIGH SEG\r
+                               ; RH=EXT TO DELETE(IE SHRHGH OR HGHSHR)\r
+       XP SGALOW,17            ;LH=EXT WHICH USER TYPED FOR SAVE OR GET COMMAND\r
+                               ; OR .SAV IF HE DIDN'T TYPE AN ARG WITH LEADING PERIOD\r
+                               ; RH=0\r
+\f\r
+;ROUTINE TO SCAN COMMAND STRING ARGUMENTS FOR SAVE,GET,RUN AND R\r
+;COMAMNDS AND STORE THEM IN JOB DATA AREA WHICH MUST BE IN CORE\r
+;WHEN SGSET IS CALLED FROM COMMAND DECODER\r
+;CALL: MOVE TAC,INPUT BYTE POINTER\r
+;      MOVE TAC1,SIXBIT DEVICE NAME\r
+;      MOVE DAT,OUTPUT BYTE POINTER\r
+;      MOVE IOS,ADR. OF MONITOR JOB(SAVJOB,GETJOB,RUNJOB)\r
+;      MOVE PROG, ADR. OF JOB AREA\r
+;      PUSHJ PDP,SGSET\r
+\r
+C=BUFPNT\r
+\r
+INTERNAL FTLOGIN,FT2REL,FTDISK\r
+EXTERNAL JOBCOR,JBTPRG\r
+\r
+SGSET: JUMPE TAC1,NOTENF       ;NOT ENOUGH ARE IF NO DEVICE NAME\r
+       MOVEM TAC1,SGADEV(PROG) ;STORE DEVICE NAME\r
+       SKIPN  TAC1,JBTPRG(ITEM)        ;GET AUTOMATIC FILENAME, OR\r
+       PUSHJ PDP, CTEXT1       ;GET FILE NAME FROM COMMAND STRING\r
+       JUMPE TAC1,NOTENF       ;THERE MUST BE A FILE NAME\r
+       MOVEM TAC1,SGANAM(PROG) ;STORE FILE NAME\r
+       MOVEM TAC1,JBTPRG(ITEM) ;SAVE FILE NAME FOR SYSTAT COMMAND\r
+       MOVEI TAC1,0            ;ASSUME USER DID NOT SPECIFY AN EXTENSION\r
+                               ; 0 WILL BE TURNED INTO SAV OR DMP\r
+IFE FTTTYSER,< LDB     TEM,TAC>\r
+       CAIN    TEM,"." ;IS AN EXTENSION SPECIFIED?\r
+       PUSHJ PDP,CTEXT ;YES. GET EXTENSION\r
+       HLLZM TAC1,SGAEXT(PROG) ;STORE IT FOR LOOKUP\r
+IFN FT2REL,<\r
+       EXTERN SETEXT           ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG\r
+                               ; LOOKUP OR ENTER\r
+       PUSHJ PDP,SETEXT        ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET\r
+                               ; .HGH IF SAVE(LH IOS=NSRBIT).\r
+>\r
+       SETZM SGADAT(PROG)      ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS\r
+IFN FTLOGIN,<\r
+       PUSHJ PDP,PJPGNO        ;GET PROJ, PROG. NO.\r
+       MOVEM AC2,SGAPPN(PROG)  ;STORE 0 IF NO []'S TYPED BY USER\r
+>\r
+       PUSHJ PDP,DECIN1        ;AMOUNT OF CORE (OPTIONAL THIRD ARG.)\r
+       JRST SGSET1             ;DOES NOT RETURN IF ERROR. RETURN HERE IF NO ARG.\r
+       JRST COMERA             ;ILLEGAL CHARACTER\r
+       LSH TAC,12              ;CONVERT TO HIGHEST REL. LOC.\r
+       SUBI TAC,1\r
+SGSET1:        MOVEM TAC1,SGANEW(PROG) ;STORE FOR RUN AND SAVE\r
+       HRRZ TAC1,IOS           ;SCHEDULE MONITOR JOB   \r
+                               ; GUARRANTEE LH OF PC WORD IS 0, SINCE IT WILL\r
+                               ; BE ADDED TO STARTING ADDRESS(IF RUN COM)\r
+       JRST MSTART             ;START JOB WITH PC IN MONITOR MODE\r
+\f\r
+;ROUTINE TO PICKUP ARGUMENTS FOR RUN AND GETSET UUOS\r
+;THIS ROUTINE DOES SAME THING AS SGSET, EXCEPT THAT ARGUMENTS ARE\r
+;OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND\r
+;THE USERS ARG ARE MOVED TO USER ACS(SGA...), THEREBY CLOBBERING HIS AC$S\r
+;USER AC FIELD AND START PC OFFSET(RUN UUO) ARE SAVED ON PD LIST AT JOBPD3\r
+;THEN LOWER CORE IS SET UP(SG2 CALLED) RESET IS NOT DONE (FOR GETSEGUUO)\r
+;JBTPRG NOT SET FOR LOW SET, SINCE GETSEGUUO SHOULD NOT\r
+;CALL: MOVE TAC,CONTENTS OF USER AC(ADR. OF 3 WORD ARG LIST)\r
+;      MOVE PROG,JOB RELOCATION\r
+;      PUSHJ PDP,GETARG\r
+;      RETURN\r
+\r
+       INTERN GETARG\r
+       EXTERN JBTPROG,JOBCORE,PUUOAC\r
+\r
+GETARG:        HRR UUO,TAC             ;MOVE ADR. OF ARG LIST TO UUO\r
+       EXCH TAC,(PDP)          ;AND PUT ON PD LIST\r
+       PUSH PDP,TAC            ;MOVE RETURN PC UP ONE IN PD LIST\r
+       LDB TAC,PUUOAC          ;USER AC FIELD IN RUN OF GETSEG UUO\r
+\r
+       HRRM TAC,-1(PDP)        ;SAVE IN CASE OF ERROR RETURN\r
+       PUSHJ PDP,GETWDU        ;GET FIRST ARG FROM USER AREA\r
+       MOVEM TAC,SGADEV(PROG)  ;STORE DEVICE NAME\r
+       PUSHJ PDP,GETWD1        ;GET NEXT ARG FROM USER ARREA\r
+       MOVEM TAC,SGANAM(PROG)  ;STORE FILE NAME FOR LOOKUP (DO NOT STORE FOR LOWSEG)\r
+       PUSHJ PDP,GETWD1        ;GET THIRD ARG(EXTENSION WORD E+1)\r
+       MOVE TAC1,TAC           ;PUT ARG IN TAC1, SO SMAE AS SGSET RETURN FROM CTEXT\r
+       MOVEM TAC1,SGAEXT(PROG) ;STORE EXTENSION AND RH FROM USER\r
+IFN FT2REL,<\r
+       EXTERN SETEX1\r
+       PUSHJ PDP,SETEX1        ;SAVE EXT AGAIN IN SGALOW\r
+                               ; SETUP EXT FOR HIGH SEG(SGAHGH="SHR")\r
+                               ; SETUP EXTENSION FOR LOW SEG(SGALOW="SAV")\r
+>\r
+       PUSHJ PDP,GETWD1        ;GET FOURTH ARG(DATE WORD)\r
+       MOVEM TAC,SGADAT(PROG)\r
+       PUSHJ PDP,GETWD1        ;GET FIFTH USER ARG FROM USER AREA\r
+       MOVEM TAC,SGAPPN(PROG)  ;STORE PROJECT,PROGRAMMER NO. OR 0\r
+       PUSHJ PDP,GETWD1        ;SIX ARG FROM USER\r
+       HRRZM TAC,SGANEW(PROG)  ;STORE CORE ARG OR 0(HIGHEST LOC DESIRED)\r
+                               ; IGNORE LH\r
+       JRST SG2A               ;GO SET UP LOWER CORE AND RETURN\r
+                               ; DO NOT DO A RESET\r
+\f\r
+;THIS JOB SAVES A JOB AREA ON RETRIEVABLE STORAGE\r
+;THIS JOB RUNS IN EXEC MODE AND CALLS IO ROUTINES USING REGULAR UUOS\r
+;NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBDP, OR AC'S\r
+;IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE WITH A JOB AREA\r
+;AFTER IT HAS BEEN SAVED IS TO START EXECUTIUON OVER AT THE STARTING\r
+;ADDRESS\r
+\r
+INTERNAL SAVJOB,SAVERR\r
+EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV\r
+\r
+SAVJOB:        JSP TAC1,SG1            ;SET UP ACS PROG,PDP,JDAT,ITEM.\r
+                               ; RESET DEVICES\r
+       HLRE TAC1,SGADMP(PROG)  ;-NO. OF WORDS TO WRITE\r
+       PUSHJ PDP,CKIOWD        ;CHECK USER'S CORE ARG(IF ANY) WITH AMOUNT\r
+                               ; RETURN ONLY IF 0 OR NOT SMALLER\r
+       HRRM TAC,JOBCOR(PROG)   ;STORE MAX OF SIZE OF FILE OR CORE ARG\r
+                               ; FOR ASSIGNING INITIAL CORE WHEN FILE GOTTEN\r
+IFN FT2REL,<\r
+       EXTERN SAVHGH\r
+       PUSHJ PDP,SAVHGH        ;INIT DEV,SAVE HIGH SEG, IF ANY, RETURN IF OK\r
+       JRST SAVFIN             ;HIGH SAVED, BUT NO DATA IN LOW SEG, SO DO\r
+                               ; NOT WRITE LOW FILE\r
+                               ; SKIP RETURN IF LOW SEG TO BE WRITTEN\r
+>\r
+                               ; SGALEN, AND SGAEXT RESTORED\r
+SAVJB1:        OPEN 0,SGAMOD           ;RE INIT DEVICE, SO UGETF WILL SET FIRST FREE\r
+                               ; BLOCK BECAUSE NO LOOKUP OR ENTER DONE\r
+       JRST SGERRA             ;DEVICE NOT AVAILABLE\r
+       UGETF 0,SGAHED          ;GET FIRST FREE BLOCK(MEANINGFUL ONLY IF DTA)\r
+                               ; CAUSE ENTER TO ASSIGN FIRST LOBCK OF FILE\r
+                               ; AS LOWEST FREE BLOCK SO TENDMP CAN READ\r
+       ENTER 0,SGANAM          ;ENTER FILE NAME IN DIRECTORY\r
+       JRST SAVERR             ;DIRECTORY FULL OR PROTECTION FAILURE\r
+       MOVE TAC,JOB41(JDAT)    ;SAVE USER UUO HANDLING JSR\r
+       MOVEM TAC,JOBS41(JDAT)  ;IN UPPER PART OF JOB DATA AREA\r
+\f\r
+       MOVE TAC,JOBDDT(JDAT)   ;SAVE DDT STARTING ADDRESS HIGHER UP IN JOB DATA AREA\r
+       MOVEM TAC,JOBSDD(JDAT)  ;SO COMPRESS ALWAYS MOVES CODE DOWN\r
+       HRROS USRHCU            ;FLAG THAT SAVE GET IS UNDER WAY\r
+                               ; SO THAT JOBHRL WILL NOT BE MODIFIED BY SETHGH RUOTINE\r
+                               ; TO USER'S HIGH SEG RELOCATION INFO. SINCE\r
+                               ; IT WILL CONTAIN COMPRESSION IOWD.\r
+                               ; COMPRESSION WILL ALWAYS MOVE DOWN\r
+       HRRZ    TEM,JOBSA(JDAT) ;SAV START ADDRESS FOR 10DMP\r
+       MOVEI   TAC,JOBSV(PROG) ;POINT TO 1ST DATA WORD\r
+       MOVE    TAC1,[XWD PROG,JOBSDD] ;IT STARTS AT JOBSDD\r
+       HLRE ITEM,SGADMP(PROG)  ;IOWD FOR THIS SIZE CORE(-LENGTH TO WRITE)\r
+       MOVNS ITEM              ;POSITIVE LENGTH\r
+       ADDI ITEM,JOBSVM        ;ADD IN FIRST LOC-1 TO WRITE=HIGHEST LOC TO WRITE\r
+                               ; TO MAKE END TEST\r
+       HRLI    ITEM,PROG               ;USE PROG FOR RELOCATION\r
+CMPLP1:        MOVEM   TAC,DAT         ;SAVE 1ST LOC FOR IOWD\r
+       CAMLE   TAC1,ITEM        ;SEARCH FOR 1ST NON-0 WORD\r
+       AOJA    TAC,CMPTHR        ;THROUGH\r
+\r
+       SKIPN   @TAC1            ;THIS A DATA WORD?\r
+       AOJA    TAC1,.-3        ;NO, KEEP LOOKING\r
+       MOVNI   AC1,1           ;YES, AC1 WILL BE AN IOWD\r
+       HRLI    AC1,-1(TAC1)    ;1ST LOCATION - 1\r
+CMPLP2:        PUSH    TAC,@TAC1       ;SAVE A DATA WORD\r
+       AOS     TAC1\r
+       CAMGE   TAC1,ITEM       ;AT TOP?\r
+       SKIPN   @TAC1           ;NO. NEXT WORD NON-0?\r
+       JRST    .+2             ;NO. THROUGH THIS BLOCK\r
+       SOJA    AC1,CMPLP2      ;COUNT THE WORD AND CHECK NEXT\r
+       MOVSM   AC1,(DAT)       ;SAVE IOWD IN FRONT OF BLOCK\r
+       AOJA    TAC,CMPLP1      ;LOOK FOR NEXT NON-0 BLOCK\r
+CMPTHR:        HRLI    TEM,254000      ;SET A JRST C(JOBSA)\r
+       MOVEM   TEM,-1(TAC)     ;AT END OF FILE\r
+       SUBI    TAC,JOBSV(JDAT) ;COMPUTE WORD COUNT\r
+       MOVNS   TAC             ;MAKE AN IOWD\r
+       HRL     TAC,SGADMP(PROG) ;START ADDRESS\r
+       MOVSM   TAC,SGALEN(PROG) ;IOWD FOR THE OUTPUT UUO\r
+       MOVEI TAC,-2            ;FLAG THAT CORE HAS BEEN COMPRESSED\r
+       HRLM TAC,USRHCU         ;KEEP LH NEG. COMMAND DECODER WILL EXPAND\r
+                               ; CORE ON START ,ODT,SAVE, REENTER,SSAVE IN CASE\r
+                               ; THIS SAE IO DOES NOT GO TO COMPLETION. (CONTROL C\r
+                               ; OR  DEVICE FULL, SO THAT CORE DOES NOT GET EXPANDED\r
+\f\r
+       PUSHJ PDP,SGDOA         ;DO OUTPUT,RELEASE,FIND TTY\r
+       OUTPUT 0,SGALEN         ;OUTPUT UUO EXECUTED BY SGDO\r
+                               ; RETURN HERE ONLY IF NO ERRORS\r
+SAVFIN:        PUSHJ PDP,SGREL         ;RELEASE DEVICE AND FIND TTY\r
+       JSP TAC,PHOLD           ;PRINT MESSAGE AND STOP JOB\r
+       ASCIZ /JOB SAVED/\r
+SAVERR:        MOVEI TAC,PRTERR        ;ERROR CORE IN CASE RUN UUO(PROTECTION ERROR)\r
+                               ; CHANGE TO DISK ERROR CODE IF DEV IS DSK\r
+       PUSHJ PDP,SGRELL        ;CHANGE TO DISK ENTER ERROR CODE IF DSK\r
+                               ; RELEASE DEVICE AND RETURN TO USER(IF RUN UUO)\r
+                               ; OR FIND TTY=PRINT ?CRLF\r
+       JSP TAC,PHOLD           ;PRINT MESSAGE AND STOP JOB\r
+       ASCIZ /DIRECTORY FULL/\r
+\f\r
+;THIS JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
+;THIS JOB RUNS IN EXEC. MODE AND CALLS IO ROUTINES DIRECTLY\r
+;NO ATTEMPT IS MADE TO RESTORE STATUS OF IO DEVICES, PC, OR AC'S\r
+;JOBPC IS SET TO STARTING ADDRESS OF JOB\r
+;CORE MUST ALREADY HAVE BEEN ASSIGNED AND THE FOLLOWING LOC. SETUP IN\r
+;JOB DATA AREA:\r
+;JOBPDP, JOBREL\r
+\r
+INTERNAL GETJOB\r
+\r
+GETJOB:        JSP TAC1,SG1            ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
+       PUSHJ PDP,GETJB         ;GET THE JOB\r
+       JSP TAC,PHOLD           ;RETURN ONLY IF EVERYTHING OK\r
+       ASCIZ /JOB SETUP/\r
+\r
+;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP\r
+\r
+;JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE\r
+;THIS MONITOR JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
+;ASSIGNS CORE AND START\r
+\r
+INTERNAL RUNJOB\r
+\r
+RUNJOB:        JSP TAC1,SG1            ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
+       JRST URUN1              ;LH PF PC WORD=0(MSTART) SO LH OF TAC1=0 AFTER JSP\r
+                               ; PUT TAC1 AS FIRST ITEM ON PD LIST(JOBPN1)\r
+                               ; LH USED BY SGRELE ON ERROR TO SEE IF FROM USER\r
+                               ; AND LH ADDED TO START PC(JOBSA) BY URUN\r
+\f\r
+;RUN UUO\r
+;CALL: MOVE AC,[XWD N,D]\r
+;      CALL AC,[SIXBIT /RUN/]\r
+;      ERROR RETURN            ;UNLESS LH=HALT(PRINT CONSOLE MESS, IF YES)\r
+;      1K OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM\r
+;      USERS ACS CLOBBERED SO CANNOT PASS DATA TO NEW PROGRAM\r
+\r
+;WHERE:        D/      DEVICE NAME\r
+;      D+1/    FILE NAME\r
+;      D+2/    FILE EXT OR 0 (LH SIXBIT)\r
+;      D+3/    DATE ETC\r
+;      D+4/    PROJECT,PROGRAMMER NO OR 0(CURRENT UFD OR DTA,MTA)\r
+;      D+5/    HIGHEST LOC DESIRED(OR 0) ANALOGOUS TO RUN COMMAND\r
+;              LH IS IGNORED(RATHER THAN ASSIGNING CORE TO HIGH SEG)\r
+\r
+       INTERN URUN\r
+       EXTERN JOBSA\r
+\r
+URUN:  PUSHJ PDP,RESET         ;RELEASE DEVICES\r
+                               ; WARNING! THIS GOES VERY DEEP IN\r
+                               ; PUSHDOWN, SEE MOD 518\r
+                               ; (AC UUO PRESERVED IN RESET)\r
+       MOVE TAC,@UUO           ;RESTORE CONTENTS OF USERS'S CALLING AC\r
+       PUSHJ PDP,GETARG        ;GET 6 ARGS FROM USER AND STORE\r
+                               ; SAVE STARTING ADDRESS INCREMENT(LH OF TAC)\r
+                               ; AND USER AC NUMBER(IN CASE OF ERROR RETURN)\r
+                               ; SETUP ACS,DEVDAT TO DDB\r
+       MOVE TAC,SGANAM(PROG)   ;STORE FILE NAME FOR LOW SEG\r
+       MOVEM TAC,JBTPRG(ITEM)  ;FOR SYSTAT\r
+URUN1: PUSHJ PDP,GETJB         ;GET BOTH LOW AND HIGH SEGMENTS\r
+       HLRZ TAC1,(PDP)         ;GET STARTING ADDRESS INCREMENT(0 IF RUN COM)\r
+\r
+IFN FT2REL,<\r
+       EXTERN CHKMED\r
+       CAILE TAC1,1            ;IS START INCREMENT 0 OR 1?\r
+       PUSHJ PDP,CHKMED        ;NO, CHECK TO SEE IF THIS IS SHARABLE SEG\r
+                               ; AND IF YES, SET MEDDLE BIT FOR THIS USER\r
+                               ; SO UWP CANNOT BE TURNED OFF AND CORE FOR HIGH SEG\r
+                               ; CANNOT BE INCREASED OR DECREASED (TAC1 PRESERVED)\r
+>\r
+       ADDB TAC1,JOBSA(JDAT)   ;ADD STARTING ADDRESS TO BOTH\r
+                               ; SO THAT <CONTROL>C START WILL START\r
+                               ; PROGRAM AT SAME STARTING ADDRESS\r
+       HRLI TAC1,USRMOD        ;SET USER MODE BIT IN PC\r
+       PUSH PDP,TAC1           ;PUT ON PD LIST\r
+       JRST USRXIT             ;AND GO TO RETURN TO USER AS IF FROM UUO\r
+\f\r
+;UUO TO GET JUST HIGH SEG AND RETURN TO USER\r
+;CALL IS THE SAME AS FOR RUN UUO EXCEPT THAT OK RETURN IS SKIP RETURN\r
+;IF ERROR RETURN HAS HALT IN LH, STANDARD CONSOLE MESSAGE IS PRINTED AND JOB STOPPED\r
+\r
+       INTERN UGTSEG,UGTERR\r
+UGTSEG:\r
+       \r
+IFN FT2REL,<\r
+       EXTERN UGETHI\r
+       JRST UGETHI             ;IN SEGCON\r
+>\r
+UGTERR:        MOVEI TAC,ILUERR        ;ILLEGAL UUO ERROR CORE\r
+       PUSHJ PDP,SGRELE        ;SEE IF USER WANTS ERROR\r
+       JRST UUOERR             ;NO, PRINT ILLEGAL UUO\r
+\f\r
+;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE LOCATIONS\r
+;FOR SAVE AND GET(SGALEN SET IO IOWD OR PP IF DTA OR DSK)\r
+;SGADMP SET TO IOWD FOR THIS SIZE CORE\r
+;CALL: JSP TAC1,SG1\r
+;      ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND\r
+;      DEVDAT SETUP TO DEVICE DATA BLOCK(BUT NOT INITED, UNLESS FT2REL=0)\r
+;      SO THAT INIT NOT NECESSARTY IF SEG ALREADY KNOWN(NO DTA QUEUING)\r
+;      DEVICE CHARACTERISTICS WORD(DEVMOD) RETURNED IN AC TAC1\r
+;      IF DISK SYSTEM\r
+\r
+       INTERN SG1,SG3,SG4              ;CALLED FROM SEGCON\r
+       EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1\r
+       EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP\r
+\r
+SG1:   JSP TAC,MONSTR          ;SETUP PROG.PDP,JDAT,ITEM=JOB NUMBER\r
+                               ; PUT TAC1 ON END OF PD LIST(EXEC MODE PC,\r
+                               ; SO ERROR MESSAGES WILL ALWAYS PRINT(SEE SGRELE)\r
+\r
+SG2:   PUSHJ PDP,RESET         ;RELEASE ALL DEVICES\r
+SG2A:  MOVEI TAC,DR            ;DUMP MODE 16(DUMP BY RECORDS\r
+                               ; IN CASE THIS IS MAGTAPE)\r
+\r
+       MOVEM TAC,SGAMOD(PROG)  ;STORE FOR OPEN UUO\r
+       SETZM SGAEND(PROG)      ;0 END OF DUMPE MODE COMMAND LIST\r
+       SETZM SGAREN+1(PROG)    ;FOR DELETE\r
+       SETZM SGAREN+2(PROG)    ;FOR DELETE\r
+       HLLZS JOBCOR(JDAT)      ;0 THIRD ARG IN JOBDATA AREA(SO CHKARG WILL\r
+                               ; WORD ON FIRST CALL(SAVE AND GET)\r
+       SETZM SGAHED(PROG)      ;CLEAR BUFFER HEADER ARG, FOR OPEN UUO\r
+IFE FT2REL,<\r
+       OPEN 0,SGAMOD           ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE\r
+>\r
+IFN FT2REL,<\r
+       MOVE TAC,SGADEV(PROG)   ;PHYSICAL OR LOGICAL DEVICE NAME\r
+       PUSHJ PDP,DEVSRC        ;FIND DEVICE AND SETUP DEVDAT TO DDB\r
+                               ; DO NOT INIT DEV SINCE IO MAY NOT BE NECESSARY\r
+                               ; DO NOT WANT TO WAIT IN DTA SYSTEM\r
+                               ; TAPE QUEUE IN 10/40 SYS\r
+>\r
+       JRST SGERRA             ;NOT AVAILABLE\r
+                               ;DEVICE INITED(OR FOUND)\r
+\f\r
+;COMMON EXIT FROM SAVHGH AND GETHGH ROUTINES(HIGH SEG SAVE AND GET)\r
+;SO THAT SGA... LOCATIONS ARE RESTOREED TO ORIGINAL VALUES FOR LOW SEG\r
+\r
+SG3:   MOVE TAC,JOBFF(JDAT)    ;FIRST FREE LOC IN JOB(SET FROM LH OF\r
+                               ; JOBSA WHICH IS SET BY LOADER\r
+       MOVEI TAC,-1(TAC)       ;MAKE LAST LOC TO SAVE OR GET(MAKE 0=777777)\r
+       SKIPN USRDDT            ;USER DDT IN USE(IF YES, SAVE ALL OF CORE\r
+                               ; SO HIS SYMBOLS WILL BE INCLUDED\r
+       PUSHJ PDP,IADRCK        ;NO, ADDRESS TO SMALL OR TO LARGE?\r
+       MOVE TAC,USRREL         ;YES, DUMP ALL OF CORE RATHER THEN GIVE\r
+                               ; ADDRESS CHECK MESSAGE-HIGHEST REL.ADR.\r
+       MOVNS TAC               ;-HIGHEST ADR TO SAVE TO GET\r
+       ADDI TAC,JOBSVM         ;LOWER CORE NOT DUMPED\r
+       HRLI TAC,JOBSVM         ;IE FIRST LOC-1 TO BE DUMPED\r
+       MOVSM TAC,SGADMP(PROG)  ;STORE IOWD WORD OF THIS SIZE CORE\r
+SG4:\r
+IFN FTDISK,<\r
+       MOVE TAC1,DEVMOD(DEVDAT)        ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS)\r
+       TLNE TAC1,DVDSK         ;IS THIS DEVICE A DISK?\r
+\r
+       MOVS TAC1,SGAPPN(PROG)  ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO.\r
+>\r
+       MOVSM TAC,SGALEN(PROG)  ;NO. MAKE SURE FORTH WORD IS IOWD FOR DECTAPE\r
+                               ; SINCE DECTAPE USES RH TO COMPUTE LENGTH IN K\r
+                               ; FOR BOTH SAVE AND GET\r
+       SKIPN TAC,SGAEXT(PROG)  ;DID USER SPECIFY AN EXTENSION ?\r
+       MOVSI TAC,SAVDMP        ;NO, USE .SAV OR .DMP\r
+       MOVEM TAC,SGAEXT(PROG)  ;AND STORE FOR LOOK UP ORENTER\r
+       POPJ PDP,\r
+\r
+;ERROR ON INIT OR DEVICE SEARCH\r
+\r
+       INTERN SGERRA           ;CALLED FROM SEGCON\r
+\r
+SGERRA:        JUMPE DEVDAT,SGERR1     ;WAS DEVICE FOUND, BUT JUST UNAVAILABLE?\r
+       MOVEM DEVDAT,(PDP)      ;YES, SAVE DDB ADDRESS FOR MESSAGE(ERNAM)\r
+       MOVEI TAC,DNAERR        ;ERROR CODE IN CASE RUN UUO(DEVICE NOT AVAILABLE)\r
+       PUSHJ PDP,SGRELE        ;RETURN TO USER IF RUN UUO\r
+                               ; OR FIND TTY AND PRINT ?CRLF\r
+       PUSHJ PDP,ERNAM         ;PRINT DEVICE NAME USING (PDP)\r
+       JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
+       ASCIZ / NOT AVAILABLE/\r
+\r
+SGERR1:        MOVEI TAC,NSDERR        ;ERROR CODE IN CASE RUN UUO(NO SUCH DEVICE)\r
+       PUSHJ PDP,SGRELE        ;RETURN TO USER IF RUN UUO\r
+                               ; OR FIND TTY AND PRINT ?CRLF\r
+       JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
+       ASCIZ /NO SUCH DEVICE/\r
+\f\r
+;ROUTINE TO GET FILE FROM DEVICE(LOW AND/OR HIGH)\r
+;CALL: ACS JDAT,PROG,PDP,DEVDAT SETUP\r
+;      MOVE ITEM,JOB NUMBER\r
+;      IFN FTDISK,<MOVE TAC1,DEVMOD(DEVDAT)    ;DEVICE CHAR.>\r
+;      PUSHJ PDP,GETJB\r
+;      RETURN ONLY IF EVERYTHING OK\r
+\r
+EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41\r
+\r
+GETJB:\r
+IFN FT2REL,<\r
+       EXTERN GETHGH\r
+       PUSHJ PDP,GETHGH        ;SEE IF HIGH SEG ALREADY EXISTS AND BEING SHARED\r
+                               ; IF NOT, TRY TO LOOKUP AND READ IN HIGH FILE\r
+                               ; IF .SHR DOESN'T EXIST, TRY .HGH, IF NEITHER-SKIP RETURN\r
+                               ; TAC1=DEVMOD(DEVDAT) IF DISK(DEV CHAR.)\r
+       JRST LOWFIN             ;HIGH SEG NOW IN CORE AND NO LOW FILE NEEDED\r
+                               ; LOW FILE NEEDED\r
+                               ; EITHER BECUASE NOHIGH SEG\r
+                               ; ORHIGH SEG ALSO NEEDS LOW FILE\r
+>\r
+       LOOKUP 0,SGANAM         ;LOOKUP LOW SEG FILE(EXT=SAV,DMP OR LOW(IF HIGH SEG\r
+                               ; REQUIRES LOW SEG AND USER DID NOT TYPE EXT)\r
+                               ; MODE=SAVMOD SO DECTAPE SERVICE WILL RETURN\r
+                               ; IOWD IN E+3(TEMPORARY)\r
+       JRST NOFILE             ;GO PRINT FILE.EXT NOT FOUND\r
+       HLRE TAC1,SGALEN(PROG)  ;-NO. OF WORDS IN FILE\r
+       PUSHJ PDP,CKIOWD        ;CHECK USER'S SUPPLIED CORE ARG TO MAKE SURE NOT\r
+                               ;TOO SMALL, RETURN LARGER OF FILE SIZE OR CORE ARG\r
+       PUSHJ PDP,GETCOR        ;OK, TRY TO GET CORE\r
+       MOVE TAC1,DEVMOD(DEVDAT)        ;DEVICE CHARACTERISTICS\r
+       MOVNS TAC\r
+       ADDI TAC,JOBSVM         ;-WORD COUNT FOR ALL USERS CORE\r
+       TLNE TAC1,DVMTA         ;MAG TAPE?\r
+       HRLM TAC,SGALEN(PROG)   ;YES, USE USER-SPECIFIED CORE ARGUMENT\r
+       HRRZS JOBPD1(JDAT)      ;TURN OFF USER MODE PC FLAG IN CASE THIS\r
+                               ;IS A RUN UUO,SO ERRORS WILL NOT TRY TO RETURN\r
+\r
+       PUSHJ PDP,SGDO          ;READ IN FILE INTO LOW SEGMENT\r
+       INPUT 0,SGALEN          ;EXECUTED FROM SGDO\r
+       MOVE TAC,JOBS41(JDAT)   ;RESTORE USER UUO JSR LOC\r
+       MOVEM TAC,JOB41(JDAT)   ;SAVED BY SAVE\r
+LOWFIN:        HRRZ TAC,JOBCOR(JDAT)   ;CORE ARG FROM PREVIOUS SAVE(THIS MONITOR\r
+                               ; ALWAYS STORES SOMETHING)\r
+       SKIP TAC                ;IS THIS AN OLD FORMAT FILE WITH NO CORE ARG TO SAVE?\r
+       MOVE TAC,USRREL         ;YES, USE ASSIGNMENT MADE WEN LOW FILE READ IN\r
+       PUSHJ PDP,CKSARG        ;RETURN ONLY IF USER'S SUPLLIED ARG IS 0 OR NOT\r
+                               ; SMALLER THAN SAVE CORE ARG. RETURN LARGER\r
+       PUSHJ PDP,GETCOR        ;TRY TO GET THIS AMOUNT OF CORE\r
+       MOVE TAC,USRREL         ;HIGHEST LOC ASSIGNED TO LOW SEG\r
+       HRRM TAC,JOBCOR(JDAT)   ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA FOR\r
+                               ; USER TO USE TO RESET CORE TO INITIAL SETTING WHEN\r
+                               ; PROGRAM IS RESTARTED\r
+                               ; FALL INTO SGREL\r
+;ROUTINE TO RELEASE DEVICE AND FIND TTY\r
+INTERN SGREL\r
+\r
+SGREL:  SKIPN   DEVDAT,USRJDA   ;HAS CHANNEL BEEN RELEASED ALREADY?\r
+        JRST    SGREL2          ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH\r
+        PUSH    PDP,T4          ;NO,\r
+        MOVE    TAC1,DEVMOD(DEVDAT)\r
+        TLNE    TAC1,DVMTA      ;MAGTAPE?\r
+        TLNN    DEVDAT,INPB     ;YES, WAS AN INPUT DONE?\r
+        JRST    SGREL1          ;NO\r
+        CLOSE   0,CLSOUT        ;YES, CLOSE MTA INPUT\r
+        STATO   0,IOTEND+IODEND ;AT END OF APTE?\r
+        MTAPE   0,16            ;NO SKIP TO EOF\r
+SGREL1: RELEASE 0,              ;NO RELEASE DEVICE\r
+        POP     PDP,T4\r
+SGREL2:\r
+        JRST    TTYFNU          ;FIND TTY FOR CURRENT USER\r
+\f\r
+;ROUTINE TO EXECUTE DUMP MODE COMMAND LIST SETUP IN SGALEN(R)\r
+;AND CHECK FOR ERRORS. USED ONLY TO READ LOW FILE.\r
+;CALL:  PUSHJ P,SGDO\r
+;       INPUT 0,SGALEN OR OUTPUT 0,SGALEN\r
+;       OK RETURN(NO ERRORS)\r
+;SGDOA CALLED FROM SAVE, IT HAS ALREADY SET LH OF USRHCU=-2\r
+;TO INDICATE CORE IS COMPRESSED\r
+\r
+       EXTERN  USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR\r
+       EXTERN  JOBSV,JOBSV3,JOBSVD,JOBSDP\r
+\r
+SGDO:   HRROS   USRHCU         ;SET LH OF USRCHU-1 AS A FLAG TO INDICATE SAVE GET\r
+                               ; LOW FILE IO IN PROGRESS, SO MONITOR WILL\r
+                               ; NOT STORE HIGH SEG PROTECTION IN JOBHRL WHICH\r
+                               ; HAS IOWD FOR ZERO COMPRESSION\r
+SGDOA:  XCT  @(PDP)            ;EXECUTE INPUT OR OUTPUT UUO\r
+       MOVE    ITEM,JOB                ;READ INTO PROTECTED PART OF JOB DATA AREA\r
+       PUSHJ   PDP,EXPAND      ;EXPAND CORE IMAGE\r
+       JRST    ADRERR          ;ADDRESS CHECK, PRINT MESSAGE AND STOP JOB\r
+       MOVE    TAC1,JOBDDT(PROG) ;COPY DDT STARTING ADR\r
+       MOVEM   TAC1,USRDDT     ;INTO MONITOR PROTECTED AREA(IN CASE THIS IS GET)\r
+       SETZM   USRHCU          ;FLAG THAT SAVE-GET IO FINISHED AND CORE EXPANDED\r
+       AOS (PDP)               ;SKIP OVER UUO IN CALLING SEQUENCE\r
+\r
+;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON)\r
+;CALL:  MOVE F,DEVICE DATA BLOCK ADDRESS\r
+;   PUSHJ P,SGIOCK\r
+;   RETURN ONLY IF NO ERRORS\r
+\r
+       INTERN  SGIOCK\r
+\r
+SGIOCK: MOVE T4,DEVIOS(DEVDAT) ;IO STATUS WORD FOR THIS DEVICE\r
+       TRNN T4,IOBKTL!IODTER!IODERR!IOIMPM   ;ANY ERRORS ON SAVE-GET DEVICE?\r
+       POPJ PDP,               ;NO, GIVE OK RETURN\r
+       MOVEI TAC,TRNERR        ;YES, ERROR CODE IN CASE THIS IS RUN UUO\r
+                               ; (TRANSMISSION ERROR)\r
+       PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+                               ; OF FIND TTY AND PRINT ?CRLF\r
+       JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
+       ASCIZ /TRANSMISSION ERROR/\r
+\f\r
+;ROUTINE TO EXPAND CORE AFTER A SAVE(LOW SEG ONLY)\r
+;CALL: MOVE DEVDAT,DEVICE ADR.\r
+;      MOVE PROG,JOBADR.\r
+;      MOVE ITEM,JOB NUMBER\r
+;      PUSHJ PDP,EXPAND\r
+;      ERROR RETURN, ADR, CHECK, OR NEED CORE BUT NOT CURRENT USER(COMMAND\r
+;                      DECODER EXPANDING AFTER USER HAS REDUCED CORE)\r
+;      OK RETURN, CORE EXPANDED\r
+;CALLED FROM SAVE AND COMMAND DECODER\r
+;START,CSTART,DDT,REENTER,SAVE,SSAVE COMMANDS IF CORE STILL COMPRESSED\r
+\r
+EXPAND:        HLRE AC3,SGALEN(PROG)   ;-LENGTH OF FILE\r
+       MOVNS AC3               ;-LENGTH OF FILE\r
+       ADDI AC3,JOBSVM         ;ADD FIRST LOC-1 TO FORM HIGHEST LEGAL ADR.\r
+       HRLI AC3,PROG           ;PUT PROG IN LH FOR COMPARE\r
+                               ; AC3 SET FOR ADDRESS CHECKING BELOW\r
+       SKIPL   TAC,JOBSV(PROG) ;IF FIRST LOC IS POSITIVE\r
+       JRST    SGDO1           ;OLD FORMAT, SO DONT EXPAND\r
+       HRRZS   TAC             ;LOOK AT 1ST WORD OF FILE\r
+       CAILE   TAC,JOBDDT      ;IS IT BELOW JOBJDA?\r
+       JRST    EXPND1           ;NO. NEW COMPRESSED FORMAT\r
+       CAIE    TAC,JOBSAV      ;IS JOBDDT THE DATA WORD?\r
+       JRST EXPND1             ;NO. EXPAND\r
+       SKIPN JOBSV3(JDAT)      ;IS THE SAVE FILE FROM CONVERT?\r
+                               ; CONVERT DOES NOT ZERO COMPRESS\r
+                               ; IT JUST WRITES ENTIRE FILE WITHH 1 IOWD IN FRONT\r
+       SOJA AC3,SGDO1          ;YES, GO BLT DATA DOWN AS IF OLD DISK SAVE FILE\r
+                               ; (NON-COMPRESSED)\r
+       HRROI   TAC,JOBSD1      ;YES. CHANGE TO IOWD 1,JOBSDD\r
+       EXCH    TAC,JOBSV(PROG) ;ZEP, THE IOWD IS FIXED\r
+       HLRES TAC               ;WORD COUNT OF IOWD\r
+       AOJE TAC,EXPND1         ;JUST 1 DATA WORD - THROUGH\r
+       MOVSI TAC,1(TAC)        ;MAKE IOWD N-2,JOBSAV\r
+       JUMPE TAC,EXPZ\r
+       HRRI TAC,JOBSAV         ;SO NEXT DATA WDS WILL BE SKIPPED\r
+       MOVEI TAC1,JOBSV(PROG)\r
+       MOVEM TAC,2(TAC1)       ;STORE IN COMPRESSED DATA\r
+       JRST EXPND1\r
+EXPZ:  MOVSI TAC,-2\r
+       HLLM TAC,JOBSV(PROG)\r
+\f\r
+;COME HERE TO DO THE ACTUAL EXPANSION OF A FILE\r
+EXPND1:        MOVE TAC,[XWD PROG,JOBSV] ;IT WAS READ INTO JOBSV\r
+       MOVE    TAC,@TAC        ;FIRST IOWD\r
+EXPLP1:        HRRZ    AC1,TAC1        ;ADDRESS OF IOWD\r
+       CAIGE   AC1,JOBSAV      ;LEGAL?\r
+       AOJA    AC1,TOOLOW      ;NO. DELETE DATA WHICH IS TO LOW\r
+       HLRE    AC1,TAC1        ;YES. GET WORDCOUNT\r
+       MOVNS   AC1             ;+N\r
+       HRLM    AC1,TAC1        ;CONVERT IOWD TO +N IN LH\r
+       ADDI    TAC,1(AC1)       ;ADDRESS OF NEXT IOWD.\r
+       CAMLE   TAC,AC3         ;IN BOUNDS?\r
+       JRST    SGDOER          ;NO. COMPLAIN\r
+       ADDI    TAC1,(AC1)      ;YES. CHANGE RH OF IOWD\r
+       EXCH    TAC1,@TAC       ;MAKE IT XWD +N,A+N-1 AFTER DATA BLOCK\r
+       JUMPL   TAC1,EXPLP1     ;CONTINUE IF NEXT THING IS AN IOWD\r
+       PUSH    PDP,TAC         ;SAVE DATA LOCATION\r
+       HRRZ    TAC,@TAC          ;TOP REAL LOCATION NEEDED\r
+\r
+       TRO     TAC,1777        ;MAKE IT NK-1\r
+\r
+       HLRZ TAC1,PROG          ;PRESENT SIZ OF LOW SEG\r
+       CAMG TAC,TAC1           ;IS THERE ENOUGH?\r
+       JRST EXPCOR             ;YES.\r
+       CAME ITEM,JOB           ;NO, IS TIS THE CURENT JOB?\r
+       JRST SGDOER             ;NO, GIVE ERRROR RETURN, MUST BE COMMAND DECODER\r
+                               ; DOING EXPAND AFTER USER HAS REDUECED CORE\r
+       PUSHJ   PDP,GETCOR      ;YES. GET IT\r
+EXPCOR:        POP     PDP,TAC1\r
+       MOVEI   AC1,@TAC1        ;TOP  DATA LOC\r
+       HRLI    AC1,1(AC1)      ;SET TO ZERO TO TOP OF CORE\r
+       HRRI    AC1,2(AC1)\r
+       SETZM   -1(AC1)\r
+       HRLI    TAC,PROG        ;RELOCATE TOP LOC OF JOB\r
+       BLT     AC1,@TAC        ;ZAP, CORE IS 0 FROM HERE ...\r
+       HRROI   TAC,@TAC1       ;FORM DATA POINTER\r
+EXPLP2:        HRRZ    AC1,(TAC)       ;TO DATA POINTER\r
+       ADDI    AC1,(PROG)      ;RELOCATE\r
+       HLRZ    AC2,(TAC)       ;WORD COUNT\r
+       SUBI    TAC1,1(AC2)     ;POINT TAC1 TO PREVIOUS IOWD\r
+       SETZM   (TAC)           ;ZERO THIS IOWD\r
+       SOSA    TAC             ;POINT TO DATA\r
+EXPLP3:        SOS     AC1\r
+       CAIGE AC1,JOBSDD(PROG)  ;DON'T STORE DATA BELOW JOBSDD\r
+       SOSA TAC\r
+       POP     TAC,(AC1)       ;MOVE A DATA WORD\r
+       SETZM   1(TAC)          ;ZERO WHERE IT CAME FROM\r
+       SOJG    AC2,EXPLP3              ;LOOP IF MORE DATA\r
+       CAMLE   TAC1,[XWD PROG,JOBSV] ;THROUGH?\r
+       JRST    EXPLP2          ;NO, DO NEXT BLOCK\r
+       EXCH    AC2,JOBSDD(PROG) ;YES, ZERO JOBSDD\r
+       MOVEM AC2,JOBDDT(JDAT)  ;SET USER DDT STR ADR\r
+       JRST SGDO2              ;AND SETUP USRDDT IN MONITOR PROTECTED\r
+                               ; FROM THIS USER\r
+\f\r
+;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE\r
+;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP)\r
+\r
+TOOLOW:        HLRE    AC2,@TAC        ;WORDCOUNT OF OFFENDING IOWD\r
+       SUB     AC1,AC2         ;ADDRESS+N\r
+       CAIG    AC1,JOBSDD      ;IS ANY DATA IN IT LEGAL?\r
+       AOJA    TAC,NXIOWD      ;NO, TEST NEXT IOWD\r
+       SUBI    AC1,JOBSDD      ;YES, NUMBER OF WORDS TO KEEP\r
+       MOVNS   AC2             ;TOTAL NUMBER OF WORDS\r
+       SUB     AC2,AC1         ;NUMBER OF WORDS TO DROP\r
+       HRLS    AC2             ;INTO BOTH HALVES\r
+       ADD     AC2,@TAC        ;NEW IOWD FOR ONLY GOOD DATA\r
+       ADDI    TAC,(AC2)       ;POINT TAC TO LAST BAD DATA LOC\r
+       MOVEM   AC2,@TAC        ;STORE UPDATED IOWD OVER IT\r
+       JRST    IOWBLT          ;GO BLT OVER BAD DATA\r
+NXIOWD:        SUB     TAC,AC2         ;POINT TAC TO NEXT IOWD\r
+       HRRZ    AC1,@TAC        ;GET ADDRESS\r
+       CAIGE   AC1,JOBSD1      ;LEGAL?\r
+       AOJA    AC1,TOOLOW      ;NO, AT LEAST PART OF THE DATA IS LOW\r
+IOWBLT:        MOVSI   TAC,@TAC        ;YES, KEEP THE ENTIRE IOWD DATA\r
+       HRRI    TAC1,JOBSV(PROG) ;TAC1 IS A BLT POINTER\r
+       SUBI    TAC,JOBSV       ;RH OF TAC IS AMOUNT BEING DELETED\r
+       SUBI    AC3,(TAC)       ;AC3 POINTS TO TOP OF DATA READ IN-(N)\r
+       BLT     TAC1,@AC3       ;MOVE ONLY GOOD DATA DOWN\r
+       JRST    EXPND1          ;GO EXPAND THE GOOD DATA\r
+\f\r
+SGDO1: MOVEI TAC,JOBDDT(PROG)  ;MOVE EVERYTHING DOWN )MUST BE NON-COMPRESSED DSK FILE\r
+       HRLI TAC,JOBSVD(TAC)    ;OR CONVERT SAVE FILE\r
+       SKIPGE JOBSV(JDAT)      ;IS THIS CONVERT FILE(FIRST WORD IS IOWD)?\r
+       HRLI TAC,JOBSDP(TAC)    ;YES, ALSO SKIP OVER IOWD\r
+       SUBI AC3,JOBSVD\r
+       BLT TAC,@AC3\r
+SGDO2: AOSA (PDP)              ;SET FOR OK RETURN\r
+SGDOER:        POP PDP,TAC\r
+       SETZM JOBHCU(JDAT)      ;CLEAR LH AND SET HIGHEST USER CHAN, IN\r
+                               ; USE TO 0(WHERE IT SHOULD BE ANYWAY)\r
+       POPJ PDP,               ;ERROR RETURN OR OK RETURN\r
+\f\r
+;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK TO SEE IF 0\r
+;OR GREATER THAN OR EQUAL TO IOWD USED TO SAVE OR GET FILE\r
+;CALL: HLRE TAC1,-NO. OF WORDS IN FILE\r
+;      PUSHJ PDP,CKIOWD\r
+;      RETURN WITH LARGER OF 2 POSITIVE NOS. IN TAC(1777 ORED IN)\r
+;      DO NOT RETURN IF CORE ARG SUPLLIED BY USER IS TOO SMALL\r
+;CALLED FROM SAVE AND GET\r
+\r
+       EXTERN JOBSVM\r
+\r
+CKIOWD:        MOVEI TAC,JOBSVM        ;FIRST LOC-1 READ OR WRITTEN IN USER AREA\r
+       HRRM TAC,SGALEN(PROG)   ;RESTORE RH TO JOBSAV AFTER LOOKUP\r
+       SUB TAC,TAC1            ;HIGHEST LOC=FIRST LOC-1+LENGTH OF FILE\r
+                               ; FALL INOT CHSARG\r
+\r
+;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0\r
+;OR GREATER THAN OR EQUAL TO CORE ARG FOR PREVIOUS SAVE\r
+;CALL: HRRZ TAC,JOBCOR(JDAT)   ;WRITTEN WHEN FILE SAVED\r
+;      PUSHJ PDP,CKSARG\r
+;      RETURN WITH LARGER OF 2 IN AC TAC, ONLY IF USER ARG NOT TOO SMALL\r
+;CALLED ONLY FROM GET AFTER JOB DATA AREA LOADED FROM FILE(JOBCOR) OR HIGH SEG\r
+\r
+       INTERN NROOM1           ;CALLED FROM SEGCON\r
+\r
+CKSARG:        IORI TAC,1777           ;MAKE SURE 1K-1\r
+       CAMG TAC,SGANEW(PROG)   ;IS USER SUPPLIED CORE ARG BIGGER?\r
+       SKIPA TAC,SGANEW(PROG)  ;YES, RETURN IT\r
+       SKIPN SGANEW(PROG)      ;NO, DID USER SUPPLY ONE\r
+       POPJ PDP,               ;NO, RETURN LARGER OF TWO\r
+;ROUTINE TO PRINTE #K OF CORE NEEDED\r
+;CALL: MOVE TAC,HIGHEST REL. USER ADR.\r
+;      PUSHJ PDP, NROOM1\r
+;      NEVER RETURN\r
+\r
+NROOM1:        PUSH PDP,TAC            ;YES, ERROR, USER'S SUPPLIED CORE ARG TOO SMALL\r
+NOROOM:        MOVEI TAC,NECERR        ;ERROR CODE IN CASE THIS IS RUN UUO(NOT ENOUGH CORE)\r
+       PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+                               ; OR FIND TTY AND PRINT ?CRLF\r
+       HRRZ TAC,(PDP)          ;GET AMOUNT OF CORE REQUESTED\r
+       LSH TAC,-12             ;CONVERT TO NO. OF 1K BLOCKS-1\r
+       PUSHJ PDP,DECP1         ;ADD 1 TO TAC AND PRINT DECIMAL\r
+       JSP TAC,PHOLD           ;START TTY ADN STOP JOB\r
+       ASCIZ /K OF CORE NEEDED/\r
+\f\r
+;ROUTINE TO ASSIGN CORE FOR LOW  AND HIGH SEG\r
+;CALL: MOVE PROG,LOW SEG RELOCATION\r
+;      HRR TAC,HIGHEST LOC DESIRED\r
+;      PUSHJ PDP,GETCORE\r
+;      RETURN ONLY IF ASSIGNED\r
+\r
+       INTERN GETCOR\r
+\r
+GETCOR:        HRRZM TAC,SGACOR(PROG)  ;SOTRE CORE ARG FOR CORE UUO IN USER AC\r
+       PUSH PDP,TAC            ;SAVE IN CASE OF ERROR\r
+       CALLI SGACOR,11         ;DO CORE UUO\r
+       JRST NOROOM             ;NOT AVAILABLE, PRINT ERROR AND AMOUNT TRYING FOR\r
+       JRST TPOPJ              ;OK, REMOVE TAC FROM PD LIST AND RETURN\r
+\f\r
+;ROUTINE TO PRINT NOT A SAVE FILE IF WRONG FORMAT FILE DETECTED\r
+\r
+INTERN GETERR\r
+\r
+GETERR:        MOVEI TAC,NSFERR        ;ERROR CODE IN CASE THIS IS RUN UUO(NOT SAVE FILE)\r
+       PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+                               ; OR FIND TTY AND PRINT ?CRLF\r
+       JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
+       ASCIZ /NOT A SAVE FILE/\r
+\r
+;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG\r
+\r
+INTERN NOFILE  ;CALLED FROM SEGCON\r
+\r
+NOFILE:        MOVEI TAC,FNFERR        ;ERROR CODE IN CASE THIS IS RUN UUO(FILE NOT FOUND\r
+                               ; CHANGE ERROR CODE TO DISK ERROR CODE IF DEV IS DSK\r
+       PUSHJ PDP,SGRELL        ;RETURN DISK LOOKUP OR ENTER ERROR CODE IF DSK  \r
+                               ; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED\r
+                               ; OR FIND TTY AND PRINT ?CRLF\r
+       MOVE TAC1,SGANAM(PROG)  ;PRINT FILE NAME\r
+       PUSHJ PDP,PRNAME\r
+       PUSHJ PDP,PRPER         ;PRINT PERIOD\r
+       HLLZ TAC1,SGAEXT(PROG)  ;PRINT EXTENSION\r
+       PUSHJ PDP,PRNAME\r
+       JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
+       ASCIZ / NOT FOUND/\r
+\f\r
+;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE\r
+;IF THIS IS A MONITOR COMMAND OR USER UUO\r
+;IF USER UUO, GIVE ERROR RETURN TO USER UNLESS THERE IS A HALT\r
+;IN LH OF EROR RETURN WORD, IN WHICH CASE FIND TTY, PRINT ?CRLF\r
+;AND RETURN TO CALLER SO CAN ADD MORE INFO TO ERROR MESSAGE AND STOP JOB\r
+;CALL: MOVEI TAC,ERROR CODE(DEFINED IN S.MAC)\r
+;      PUSHJ PDP,SGRELE\r
+;DO NOT RETURN TO CALLER IF USER WANTS ERROR RETURN ON RUN AND GETSEG UUOS\r
+\r
+       EXTERN JOBPD1,JOBPD3,USRJDA\r
+\r
+SGRELL:                                ;LOOKUP OR ENTER FAILURE\r
+IFN FTDISK,<\r
+       MOVE TAC1,DEVMOD(DEVDAT)        ;IS THIS DEVICE A DISK?\r
+       TLNE TAC1,DVDSK\r
+       HRRZ TAC,SGAEXT(PROG)   ;YES, RETURN DISK SERVICE ERROR CODE\r
+>\r
+SGRELE:        MOVE TAC1,JOBPD1(JDAT)  ;GET FIRST PC ON PD LIST\r
+       TLNN TAC1,USRMOD        ;IS IT IN USER MODE(IE USER UUO)?\r
+\r
+       JRST SGRLE1             ;NO. MUST BE MONITOR COMMAND OR CALLED OVERLAYED\r
+                               ; RELEASE DEVICE, FIND TTY, AND RETURN TO CALLED\r
+       PUSH PDP,TAC            ;SAVE ERROR CORE\r
+       HRR UUO,TAC1            ;ADDRESS OF RETURN AFTER RUN OF GETSEG UUO\r
+       PUSHJ PDP,GETWDU        ;GET ERROR RETURN WORD FROM RUN OR GETSEG UUO\r
+       HLRZ TAC1,TAC           ;GET OP CODE\r
+       POP PDP,TAC             ;RESTORE ERROR CODE\r
+       CAIN TAC1,(HALT)        ;IS LH HALT?\r
+       JRST SGRLE1             ;YES, RELEASE DEVICE,FIND TTY, AND RETURN TO CALLER\r
+       HRR UUO,JOBPD3(JDAT)    ;NO, AC NUMBER OF RUN OR GETSEG UUO\r
+       PUSHJ PDP,STOTAC        ;STORE ERROR NUMBER IN USER AC\r
+       SKIPE USRJDA+0          ;DO NOT RELEASE CHANNEL 0 IF NOT INITED YET\r
+                               ; UUO HANDLER DOES NOT ALLOW THIS FROM EXEC MODE\r
+       RELEAS 0,               ;RELEASE DEVICE(IF INITED)\r
+       JRST USRXIT             ;AND RETURN TO USER TO HANDLE ERROR\r
+\r
+SGRLE1:        PUSHJ PDP,SGREL         ;RELEASE DEVICE AND FIND TTY\r
+       JSP TAC,CONMES          ;PRINT ?CRLF AND RETURN TO CALLER\r
+                               ; WHO WILL PRINT REST OF ERROR MESSAGE AND STOP JOB\r
+       ASCIZ /?\r
+/\r
+COMEND:        END             ;END OF COMCON\r
+\r
diff --git a/src/common.mac b/src/common.mac
new file mode 100644 (file)
index 0000000..a458ba8
--- /dev/null
@@ -0,0 +1,1601 @@
+\f\r
+TITLE COMMON -  MONITOR COMMON DATA AREA AND CONFIGURATION DEFINITION - V437\r
+SUBTTL PART 3 COMMON.MAC - T. HASTINGS/RCC  TS  03 JUN 69\r
+XP VCOMMN,437\r
+               ;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP\r
+\r
+REPEAT 0, <\r
+\r
+;THE COMMON SUBPROGRAM CONSISTS OF 3 FILES ASSEMBLED TOGETHER AS ONE SUBPROGRAM:\r
+  1. S.MAC - THE USUAL SYSTEM SYMBOL DEFINITIONS ASSEMBLED WITH\r
+       EVERY MONITOR SUBPROGRAM\r
+  2. CONFIG.MAC - THE CONFIGURATION DEFINITION FILE GENERATED BY THE\r
+       CONFIGURATION PROGRAM (MONGEN) OR BY AN EDITOR (SEE ABOVE)\r
+  3. COMMON.MAC - THE REST OF THIS PROGRAM WHICH IS THE SAME SOURCE FOR\r
+       ALL CONFIGURATIONS.  HOWEVER, THE ASSEMBLIES ARE CONDITIONED BY\r
+       SYMBOLS AND MACROS DEFINED IN 2.\r
+       THE FOLLOWING SYMBOLS AND TABLES ARE GENERATED BELOW:\r
+\r
+       A. MONITOR STARTUP LOCATIONS (140-147), HENCE LOAD THIS FIRST.\r
+       B. JOB TABLES - LENGTH DEPENDENT ON MAXIMUM NUMBER OF JOBS ALLOWED\r
+       C. ALL VARIABLE STORAGE NOT ASSOCIATED WITH A PARTICULAR DEVICE\r
+       D. COMMON SUBROUTINE RETURNS\r
+       E. COMMON BYTE POINTERS\r
+       F. TABLE OF SERVICE ROUTINE INTERRUPT LOCS TO BE LINKED BY ONCE ONLY CODE\r
+       G. TABLE OF DEVICE DATA BLOCK ADDRESSES AND NUMBER TO BE USED BY ONCE TO LINK\r
+       THEM TOGETHER AND GENERATE MULTIPLE COPIES.\r
+        H. ASSIGNMENT OF PI CHANNELS\r
+       I. PI CHANNEL SAVE AND RESTORE ROUTINES\r
+       J. UUO TRAP LOCATIONS 40/41, 60/61\r
+       K. SYSTEM CRASH STOP CONI'S.\r
+>\r
+\f;THE FOLLOWING STANDARD SYMBOLS CAN BE SUPERCEDED BY A CUSTOMER\r
+;HAVING PREVIOUSLY DEFINED THEM ON THE CONFIG.MAC FILE USING \r
+;MONGEN PROGRAM\r
+\r
+\r
+IFNDEF LISTSN, <LISTSN==1>     ;FORCE S.MAC TO BE LISTED WITH COMMON FILE ONLY\r
+                       ;UNLESS 'LISTSN' DEFINED TO BE 0 WITH MONGEN\r
+IFNDEF APRSN,<APRSN==0> ;SERIAL NUMBER OF APR\r
+\r
+;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY)\r
+       INTERN STDENS           ;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY)\r
+       IFNDEF STDENS, <STDENS==2>      ;STAND. == BINARY AT 556 BPI\r
+                               ;STDENS==D+P WHERE D AND P ARE:\r
+                               ;D==1(200 BPI);D== (556 BPI);D==3(800 BPI)\r
+                               ;P==0(ODD-BINARY PARITY);P=4(EVEN-BCD PARITY)\r
+       INTERN JIFSEC                   ;NO. OF CLOCK TICKS(JIFFIES) PER SECOND\r
+       IFNDEF JIFSEC,<JIFSEC==^D60>    ;STAND.==60 JIFFIES PER SEC.\r
+       XP HNGSEC,2*JIFSEC\r
+\r
+       INTERN DTTRY                    ;NO. OF TIMES TO TRY ON DECTAPE ERRORS\r
+       IFNDEF DTTRY,<DTTRY==4>         ;STAND.==4 TRIES\r
+\r
+       INTERN MTSIZ                    ;SIZE OF MAGTAPE RECORDS(DATA WORDS IN BUFFER+1)\r
+       IFNDEF MTSIZ,<MTSIZ==^D128>     ;STAND.==128 WORDS PER BUFFER\r
+\r
+       INTERN LPTSIZ                   ;SIZE OF LPT BUFFER(NO. OF DATA WORDS+2)\r
+       IFNDEF LPTSIZ,<LPTSIZ==^D24+2>  ;STAND.==24 WORDS PER LPT BUFFER\r
+\r
+       INTERN BLKQNT                   ;MAX. NO OF CONSECUTIVE DECTAPE BLOCKS SEARCHED BEFORE\r
+                                       ; RESCHEDULING IF ANOTHER JOB IS WAITING TO USE CONTROL.\r
+       IFNDEF BLKQNT,<BLKQNT==^D50>    ;STAND.==50 DT BLOCKS SEARCHED(3 SECS.)\r
+\r
+       INTERN NSPMEM                   ;NO OF NANO-SECONDS PER MEMORY CYCLE\r
+       IFNDEF NSPMEM,<NSPMEM==^01760>  ;STAND.==1760 NANO-SECONDS PER MEMORY CYCLE\r
+INTERNAL JIFSC2,JIFMIN,WDPJIF\r
+       JIFSC2==JIFSEC/2                ;HALF NO. OF JIFFIES IN A SEC (FOR ROUNDING)\r
+       JIFMIN==JIFSEC*^D60             ;NO., OF JIFFIES PER MINUTE\r
+       WDPJIF==^D100000/NSPMEM*^D5000/JIFSEC   ;NO. OF WORDS MOVED\r
+       IFNDEF MINCOR,<MINCOR==^D54*JOBN>        ;DISK DDB AND ACCESS ENTRY\r
+                               ; ALLOCATION REQUIRMENTS IN FREE CORE\r
+                               ;USED TO EXPAND SIZE OF MONITOR AT ONCE ONLY TIME\r
+                               ;32 WORDS/DDB AND 4 WORDS/ACCESS ENTRY = 36 WORDS\r
+                               ;ASSUME 1.5 OPEN FILE/JOB\r
+\r
+INTERN LOGSIZ\r
+IFNDEF LOGSIZ, <LOGSIZ==2>     ;MINSIZ OF VIRTUAL CORE LEFT\r
+                               ;AND STILL ALLOW LOGIN.  MUST BE\r
+                               ;AT LEAST AS BIG AS LOGIN CUSP IN K.\r
+                               ;(STANDARD = 2K)\r
+\f;SYSTEM INITIALIZATION DISPATCH TABLE, STARTING AT LOCATION 140\r
+;THIS SUBROUTINE MUST BE LOADED FIRST\r
+;ROUTINE "ONCE" IS ONCE ONLY CODE. IT CONVERTS THE DATE\r
+;AND SETS UP I/O SERVICE CHAIN,\r
+\r
+       EXTERN SYSINI,SYSMAK,NULJOB,ONCE,JSR2\r
+       INTERN SYSDSP,SYSDDT\r
+\r
+       COMORG=140              ;ORIGIN OF COMMON IS 140\r
+       LOC COMORG              ;MAKE LISTING BE SAME AS LOADING SO IT WILL BE EASY\r
+                               ;TO EXAMINE SYSTEM LOCATIONS WITH CONSOLE SWITCHES\r
+                                       ;WITHOUT NEEDING A STORAGE MAP\r
+\r
+SYSDSP: JRST SYSINI            ;INITIALIZE SYSTEM VARIABLES ONCE ONLY\r
+SYSDDT:\r
+IFG DDTN, <            ;IF EXEC DDT IS LOADED.....\r
+       EXTERN PATSYM\r
+       JRST PATSYM             ;YES, EXEC DDT(PATCH SYMBOL TABLE POINTER FIRST)\r
+\r
+>\r
+       IFE DDTN, <\r
+       HALT .          ;NO. EXEC DDT\r
+>\r
+       JRST SYSMAK             ;MAKE NEW SYSTEM\r
+       JRST SYSINI             ;INITIALIZE SYSTEM VARIABLES ALWAYS\r
+       JEN NULJB1              ;ERROR RECOVERY\r
+       JSR ONCE                ;DO ONCE ONLY CODE OVER AGAIN\r
+       JRST JSR2               ;BYPASS ONCE ONLY OPERATOR DIALOGUE\r
+                               ;(IN CASE CONSOLE TTY DOWN)\r
+SYSCRS:        JRST SYSTOP             ;STOP MONITOR IN CASE OF DISASTER\r
+\f;SYSTEM DATA STORAGE\r
+\r
+;SPECIAL ABSOLUTE LOCATIONS IN LOWER MEMORY\r
+\r
+       INTERN SYSSNP,FORTY,NULDAT,SIXTY,NULPDL,ERRPDL,KT10A,RCXIOC,RCXCCW,DDTSYM\r
+       INTERN T30SYM,RAXIOC,RAXCCW,CRSHWD\r
+\r
+       RAXIOC=26               ;XWD 0,ADDRESS FOR RA-10'S DATA CHANNEL\r
+                               ; MUST BE EVEN AND .LT. 777\r
+       RAXCCW=RAXIOC+1         ;XWD CONTROL WORD ADDRESS,DATA ADDRESS\r
+                               ; STORED ON CHANNEL TERMINATION\r
+       CRSHWD=30               ;NORMALLY THIS WORD WILL BE 0.  IF IT IS \r
+                               ;ACCIDENTALLY OR PURPOSEFULLY OVERWRITTEN\r
+                               ;THE MONITOR WILL ATTEMPT TO SAVE THE \r
+                               ;AC'S AND THE STATE OF ALL DEVICES,\r
+                               ;[A LA 147 RESTART]\r
+       KT10A=33                ;COPY OF CONTENTS OF RELOCATION AND PROTECTION\r
+                               ; DONE BY DATAO APR \r
+                               ; NEEDED BECAUSE KT10A MOD DOES NOT COME WITH\r
+                               ; LIGHTS FOR 2ND REG.\r
+       RCXIOC=34               ;INITIAL CONTROL WORD FOR DATA CHANNEL\r
+                               ; (TRANSFERS CHANNEL TO SEQUENCE OF IOWD'S IN DSKINT)\r
+                               ; MUST BE IN EVEN LOC IN FIRST 1K OF MEMORY\r
+       RCXCCW=RCXIOC+1         ;CHANNEL STORES FINAL CONTROL WORD\r
+                               ; HERE ON TERMINATION\r
+       SYSSNP=37               ;WHEN DEPOSITED NON-ZERO,PRINTS SNAP SHOT OF SYSTEM\r
+                               ; ON LPT SEE LPSNAP SUBPROGRAM\r
+       DDTSYM=36               ;CONTAINS ADDRESS OF POINTER TO EXEC DDT SYMBOL TABLE\r
+       FORTY=40                ;PLACE WHERE UUOS ARE STORED ON TRAP\r
+       NULDAT=42               ;JOB DATA AREA FOR NULL JOB (USES EXEC\r
+                               ; 62 THRU 101 20-36 FOR DUMP AC)\r
+                               ; AND ABOVE FOR PUSHDOWN LIST\r
+       SIXTY=60                ;PLACE WHERE UNIMPLEMENTED INSTR. ARE STORED ON \r
+                               ; TRAP (PDP-10 ONLY)\r
+       NULPDL=101              ;PUSH DOWN LIST FOR NULL JOB\r
+                               ; USES EXEC LOCS 102 THRU 137\r
+                               ; USED FOR RE-SCHEDULING WHEN CURRENT JOB\r
+                               ; GOES INTO IO WAIT\r
+       ERRPDL=120              ;PUSH DOWN LIST FOR ERROR IN NULL JOB\r
+       T30SYM=131              ;PLACE IN 10/30 JOB DATA AREA WHERE SYMBOL TABLE\r
+                               ; POINTER IS STORED BY REGULAR 10/30 LOADER\r
+                               ; (MOVED TO DDTSYM BY ONCE)\r
+\f;PROTECTED JOB DATA STORAGE AND OTHER LOCATIONS SET EACH TIME\r
+;A NEW JOB IS RUN (SEE APRSER-CLKINT)\r
+\r
+       INTERN SYSBEG,SYSBG1,SYSEND\r
+\r
+SYSBEG:                                ;FIRST LOCATION CLEARED ON 143 RESTART (SEE SYSINI)\r
+XP SYSBG1,SYSBEG+1\r
+\r
+       INTERN JOB,JOBADR,JOBDAT,USRREL,USRSAV\r
+\r
+JOB:   0                       ;CURRENT JOB RUNNING AT UUO LEVEL\r
+JOBDAT:                                ;LOC OF CURRENT JOBS JOB DATA AREA\r
+                               ; SAME AS JBTDAT AND AC JDAT\r
+JOBADR:        0                       ;XWD PROTECTION,RELOCATION FOR CURRENT JOB\r
+                               ;SAME AS JBTADR(JOB) AND AC PROG\r
+USRREL:        0                       ;LH==0, RH CONTAINS CONTENTS OF PROTECTION REGISTER\r
+                               ;LOW ORDER BITS==1777, IE THIS IS HIGHEST REL. LOC\r
+                               ;IN CURRENT USER AREA (USED FOR ADDRESS CHECKING)\r
+USRSAV:        0                       ;TEMPORARY FOR UUO HANDLER (IMPURE ROUTINE!)\r
+\r
+;LOCATIONS COPIED FROM JOB DATA AREA INTO MONITOR WHEN A JOB RUNS\r
+;THIS PREVENTS THE USER FROM CLOBBERING THEM AND MAKES IT\r
+;EASIER FOR THE MONITOR TO LOCATE THESE QUANTITIES WHEN IT\r
+;NEEDS TO FOR THE CURRENT JOB\r
+;CONTENTS ARE COPIED BACK WHEN JOB BECOMES INACTIVE (SEE CLOCK)\r
+;COMPARE WITH JOB DATA AREA (SEE JOBDAT)\r
+;THE FOLLOWING LOCATION MUST BE IN SAME ORDER AS JOBDAT\r
+\r
+       INTERN USRPRT,USRPR1,USRPC,USRDDT,USRHCU,USRSAV,USRJDA,USRLO,USRLO1,USRHI\r
+\r
+USRPRT:                                ;FIRST LOCATION OF PROTECTED JOB DATA\r
+       USRPR1==USRPRT+1        ;FIRST LOCATION+1\r
+\r
+USRHCU:        0                       ;HIGHEST USER I/O CHANNEL IN USE\r
+                               ;0 MEANS EITHER NONE OR CHANNEL 0 IN USE\r
+                               ;LH=-1 DURING GET OF LOW OR HIGH SEG OR SAVE OF HIGH SEG\r
+                               ;SETREL ROUTINE DOESN'T STORE IN JOBHRL(11$) WHEN NEG,\r
+                               ;LH=-2 DURING SAVE OF LOW SEG AS FLAG THAT CORE\r
+                               ; IS COMPRESSED. \r
+                               ;ONLY CHANNEL ASSIGNMENTS IN USE ARE COPIED INTO\r
+                               ; MONITOR WHEN JOB RUNS\r
+USRPC: 0                       ;JOB PC WHEN SCHEDULER IS CALLED\r
+USRDDT:        0                       ;RH==STARTING ADDRESS OF USER DDT, LH UNUSED\r
+USRJDA:        BLOCK   20              ;RH==JOB DEVICE ASSIGNMENTS (DEVICE DATA\r
+                               ; BLOCK ADDRESSES)\r
+                               ;LH==UUO'S DONE SO FAR FOR THIS CHANNEL (SEE SYSPAR)\r
+                               ;0 MEANS NO DEVICE INITIALIZED ON THIS CHANNEL\r
+       USRLO==USRJDA           ;FIRST LOC CLEARED BY SETUSR ROUTINE\r
+                               ;ON A CALL [SIXBIT /RESET/]\r
+                               ;ALSO CLEARS USRHCU\r
+       USRLO1==USRLO+1         ;FIRST LOC+1\r
+       USRHI==.-1              ;LAST LOC CLEARED BY SETUSR ROUTINE\r
+\f\r
+;OTHER SYSTEM DATA STORAGE\r
+\r
+       INTERN COMCNT,CLKFLG,TIMEF,APRERR,APRPC,SCHEDF\r
+       INTERN CORLST,CORTAL,HOLEF,SHFWAT\r
+       INTERN FTTRPSET,FTSLEEP,FTTIME,FTSWAP,FT2REL,FTDISK\r
+       INTERN HNGTIM,CIPWT,CIPWTM,NULERR,POTLST\r
+\r
+COMCNT:        0                       ;NUMBER OF COMMANDS TYPED-IN BUT NOT DECODED\r
+                               ;SET BY SCNSER, DECREMENTED BY COMCON\r
+HNGTIM:        0                       ;HUNG DEVICE TIME COUNT CHECK FOR HUNG I/O\r
+                               ;DEVICES WHEN THIS GOES TO ZERO (ONCE PER HNGSEC)\r
+CLKFLG:        0                       ;NON-ZERO WHEN CLK INTERRUPT FORCED FOR ANY REASON\r
+TIMEF: 0                       ;NON-ZERO FOR CLOCK INTERRUPT ON APR\r
+                               ;SET BY APRSER, TESTED AND CLEARED BY CLK ROUTINE\r
+APRERR:        0                       ;APR ERROR BITS ON NON-EX MEM, ETC.\r
+                               ;SET BY APRSER, CLEARED BY CLK ROUTINE (CLOCK)\r
+APRPC: 0                       ;PC WHEN APR ERROR DETECTED\r
+SCHEDF:        0                       ;FORCED RESCHEDULING FLAG FOR CLK ROUTINE\r
+                               ;USED TO FORCE RESCHEDULING WHEN JOB IS IN EXEC MODE\r
+NULERR:        0                       ;SET NON-ZERO IF MONITOR DETECTS ERROR WHILE\r
+                               ; NULL JOB IS RUNNING\r
+POTLST:        0                       ;-1 WHEN SCHEDULER SEES THAT THERE ARE \r
+                               ;JOBS WHICH ARE POTENTIALLY RUNABLE BUT\r
+                               ;HAS TO RUN NULL JOB.\r
+                               ;0 WHEN IT FINDS A REAL JOB TO \r
+                               ;RUN OR NULL JOB IS ONLY JOB WHICH WANTS TO\r
+                               ;RUN.  'LSTWRD' IS INCREMENTED EVERY JIFFY\r
+                               ;IF THIS FLAG IS -1 AND PREVIOUS JOB WAS NULL JOB.\r
+       IFN     FTTRPSET,<\r
+       INTERN STOPTS\r
+STOPTS:        0                       ;STOP TIME SHARING OTHER USERS BECAUSE JOB 1 DID\r
+                               ;A TRPSET UUO WITH NON-ZERO AC(IE SET LOWER CORE\r
+                               ; PI TRAP LOCATION,ALSO STOP CORE SHUFFLING\r
+>\r
+       SLJOBN=0                ;NUMBER OF JOBS IF NO SLEEP FEATURE\r
+       IFN FTSLEEP,<SLJOBN=JOBN>       ;LEAVE ONE ENTRY PER JOB\r
+CIPWT: BLOCK SLJOBN+3          ;CLOCK REQUEST QUEUE\r
+                               ; LH-MONITOR ADDRESS TO PUSHJ TO AT CLOCK LEVEL\r
+                               ; WHEN BITS 24-35 COUNT DOWN TO ZERO\r
+                               ; BITS 18-23 ARE DATA SET IN AC TAC WHEN PUSHJ DONE\r
+                               ; BITS 24-35 ARE NUMBER OF CLK TICKS LEFT TO GO\r
+       CIPWTM=CIPWT-1          ;FIRST LOC-1 OF CLOCK QUEUE\r
+\f;STORAGE FOR VARIOUS CORE ALLOCATION FUNCTIONS\r
+\r
+       INTERN NSWTBL,NSWMXL,CORTAB,CORMAX,CORLST,CORTAL,SHFWAT\r
+       INTERN UPTIME,SHFWRD,STUSER,HIGHJB,CLRWRD,LSTWRD,FTTRACK\r
+\r
+\r
+NSWTBL:                                ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+                               ; RETURNED BY GETTAB UUO (THESE LOCATIONS\r
+                               ; PRESENT IN NON-SWAPPING SYSTEMS TOO)\r
+                               ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG\r
+CORTAB: BLOCK 10               ;(0-7) BIT=1 IF CORRESPONDING K OF CORE IN USE BY\r
+                               ; ACTIVE,IDLE, OR DORMANT HIGH OR LOW SEGS OR NON-EX\r
+       XP CORBLK,^D256\r
+                               ;NUMBER OF BITS IN CORE TABLE\r
+CORMAX:        0                       ;(10)MAX. CORE REQUEST+1(IE LARGEST REL. ADR.+1)\r
+                               ; CAN BE RESTRICTED TO LESS THEN ALL OF USER CORE\r
+                               ; BY BUILD AND/OR ONCE\r
+                       \r
+\r
+CORLST:        0                       ;(11) 1 BIT BYTE POINTER TO LAST FREE BLOCK POSSIBLE\r
+                               ; SET BY SYSINI ON 143 STARTUP\r
+CORTAL:        0                       ;(12) TOTAL NUMBER OF FREE+DORMANT+IDLE CORE BLKS LEFT\r
+SHFWAT:        0                       ;(13) JOB NUMBER SHUFFLER HAS TEMPORARILY STOPPED\r
+                               ;UNTIL ITS IO DEVICES TO BECOME INACTIVE BEFORE SHUFFLING\r
+HOLEF: 0                       ;(14) ABSOLUTE ADDRESS OF LOWEST HOLE IN CORE, 0=NONE\r
+UPTIME:        0                       ;(15) NUMBER OF CLOCK TICKS SINCE SYSTEM LOADED OR\r
+                               ; RESTARTED AT 143\r
+SHFWRD:        0                       ;(16) TOT NO. OF WORDS SHUFFLED BY SYSTEM\r
+STUSER:        0                       ;(17) JOB CURRENTLY USING THE SYSTEM TAPE\r
+                               ; NEEDED SO CONTROL C WILL NOT TIE UP SYSTEM TAPE\r
+HIGHJB:        0                       ;(20) HIGHEST JOB NUMBER CURRENTLY ASSIGNED\r
+CLRWRD:        0                       ;(21) TOTAL NO. OF WORDS CLEARED BY 'CLRCOR' RTN.\r
+LSTWRD:        0                       ;(22) TOTAL NO. OF CLOCK TICKS WHEN NULL JOB RAN\r
+                               ; BUT OTHER JOBS WANTED TO RUN AND COULD NOT\r
+                               ; DO SO BECAUSE: ---\r
+                               ;  1. SWAPPED OUT OR ON WAY IN OR OUT\r
+                               ;  2. MONITOR WAITING FOR I/O TO STOP SO\r
+                               ;      IT CAN SHUFFLE OR SWAP\r
+                               ;  3. JOB BEING SWAPPED OUT BECAUSE IT IS\r
+                               ;      EXPANDING CORE\r
+\r
+                               ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST\r
+                               ; TO USERS IN NON-SWAP AND SWAP SYSTEMS\r
+NSWMXL=<.-NSWTBL-1>B26         ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9\r
+\r
+;CORE ALLOCATION DATA NOT AVAILABLE VIA GETTAB\r
+IFN FTTRACK, <INTERNAL LASCOR  ; (FOR DEBUGGING ONLY)\r
+LASCOR:        0                       ;LAST JOB OR HIGH SEG TO CALL CORE ROUTINES\r
+>\r
+\f;DATA LOCATIONS PRESENT ONLY IN SWAPPING SYSTEMS\r
+\r
+       IFG SYS50N, <                   ;SWAPPING SYSTEM ?\r
+       INTERN SWPTBL,SWPMXL,BIGHOL,FINISH,FORCE,FIT,SWPERC,VIRTAL\r
+       INTERN FULCNT,MAXSIZ,MAXJBN,SUMCOR\r
+SWPTBL:                                ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+                               ; RETURNED BY GETTAB UUO (THESE LOCATIONS\r
+                               ; PRESENT ONLY IN SWAP SYSTEMS)\r
+                               ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG\r
+BIGHOL:        0                       ;(0) CURRENT BIGGEST HOLE IN CORE (1K BLOCKS)\r
+FINISH:        0                       ;(1) IF +, THEN JOB NUMBER OF JOB BEING SWAPPED IN,\r
+                               ;IF -, THEN JOB NUMBER OF JOB BEING SWAPPED OUT\r
+FORCE: 0                       ;(2) JOB NUMBER BEING FORCED TO SWAP OUT\r
+FIT:   0                       ;(3) JOB NUMBER WAITING TO BE FITTED INTO CORE\r
+VIRTAL:        0                       ;(4) NUMBER OF FREE 1K BLOCKS OF SWAPPING SPACE LEFT\r
+                               ; (COUNTING DORMANT SEGMENTS AS IF FREE).\r
+                               ; PRINTED WITH CORE COMMAND (NO ARG) OR ERROR\r
+                               ; USUALLY THE SAME AS THE AMOUNT OF VIRTUAL CORE\r
+                               ; LEFT IN SYSTEM, EXCEPT WHILE R,RUN,KJOB,GET\r
+                               ; COMMAND ARE WAITING TO BE SWAPPED IN, BECAUSE\r
+                               ; THE OLD DISK SPACE HAS NOT BEEN RETURNED YET,\r
+                               ; BUT VIRTUAL CORE IS ONLY 140 WORDS FOR SWAPIN\r
+SWPERC:        0                       ;(5) LH= NUMBER OF SWAPPER READ OR WRITE FAILURES\r
+                               ; RH= ERROR BITS (BITS 18-21) + NUMBER OF K OF\r
+                               ; DISCARDED SWAPPING SPACE\r
+\r
+\r
+\r
+                               ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST\r
+                               ; TO USER PROGS IN SWAPPING SYSTEMS\r
+SWPMXL=<.-SWPTBL-1>B26 ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9\r
+\f;MORE SWAPPING SYSTEM LOCATIONS (NOT RETURNED BY GETTAB)\r
+\r
+FULCNT:        0                       ;PRINT DISK IS FULL EVERY 30 SECONDS\r
+MAXSIZ:        0                       ;SIZE OF LARGEST JOB WHICH MIGHT BE SWAPPED OUT\r
+MAXJBN:        0                       ;NUMBER OF THAT JOB\r
+SUMCOR:        0                       ;TEMPORARY STORAGE CELL USED BY SWAPPER FOR SUM OF\r
+                               ; CORE NEEDED FOR SWAP IN\r
+       IFN FT2REL,<\r
+       INTERN SWPIN,SWPOUT\r
+SWPIN: 0                       ;JOB NUMBER BEING SWAPPED IN IF IT HAS A HIGH SEG\r
+                               ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG\r
+SWPOUT:        0                       ;JOB NUMBER BEING SWAPPED OUT IF IT HAS A HIGH SEG\r
+                               ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG\r
+>\r
+       INTERN FTTRACK\r
+IFN FTTRACK, <         \r
+       INTERN LASIN,LASOUT\r
+\r
+LASIN: 0               ;LAST JOB OR HIGH SEG SWAPPED IN\r
+LASOUT:        0               ;LAST JOB OR HIGH SEG SWAPPED OUT\r
+                       ; ABOVE TWO FOR DEBUGGING ONLY\r
+>\r
+>\r
+\r
+;DEFINE BLOCK FOR BIT TABLE DENOTING 4 WORD BLOCKS AVAILABLE (=0), IN USE (=1)\r
+; USE MULTIPLES OF 4*^D36 WORDS SO THE TABLE WILL HAVE A MULTIPLE OF ^D36 BITS\r
+; ADD 7 WORDS TO ACCOMODATE A POSSIBLE 1K BEYOND MINCOR AMOUNT\r
+\r
+IFG DSKN, <\r
+INTERNAL DDBTAB,MINCOR\r
+\r
+DDBTAB:        BLOCK <MINCOR/^D144>+1+7\r
+>\r
+\r
+\f;MONITOR TABLES WITH ONE ENTRY PER JOB\r
+\r
+       INTERN JBTSTS,JBTADR,JBTDAT,JBTNAM,JBTPRG\r
+       INTERN JOBMAX,JBTMAX,MJOBN,JBTAD1,JOBMXL,JBTMXL\r
+       INTERN FTTIME,FTKCT,FTPRV\r
+\r
+       JOBMAX==JOBN-1          ;MAXIMUM LEGAL JOB NUMBER\r
+       JOBMXL==<JOBMAX>B26     ;HIGHEST JOB NUMBERSHIFTED LEFT 9 (FOR GETTAB UUO)\r
+       MJOBN==-JOBN            ;NEGATIVE NUMBERS OF JOBS (COUNTING NULL JOB)\r
+       IFG KT10AN, <SEGN==JOBN+SEGN> ;IF ANY HIGH SEGMENTS,\r
+                               ; MUST HAVE AT LEAST AS MANY AS JOBS\r
+       JBTMAX==JOBN+SEGN-1     ;HIGHEST INDEX IN JBT TABLES\r
+       JBTMXL=<JBTMAX>B26      ;HIGHEST JBT ENTRY SHIFTED LEFT 9 (FOR GETTAB UUO)\r
+JBTSTS:        BLOCK JOBN+SEGN         ;JOB AND HIGH SEG STATUS WORD\r
+                               ;LH==STATUS BITS (SEE S.MAC FOR DESCRIPTION)\r
+                               ;RH==QUANTUM RUN TIME LEFT (SEE CLKCSS) FOR LOW SEGS\r
+                               ;RH=IN CORE COUNT FOR HIGH SEGS\r
+JBTADR:        BLOCK JOBN+SEGN         ;JOB AND HIGH SEG CORE ASSIGNMENT\r
+                               ; LH==PROTECTION (LENGTH-1)\r
+                               ; RH==RELOCATION (ABSOLUTE LOCATION IN CORE)\r
+       JBTAD1==JBTADR+1        ;ADDRESS OF JOB 1 (USED BY SYSMAK)\r
+       JBTDAT==JBTADR          ;RH==ADDRESS OF JOB DATA AREA\r
+                               ;SAME AS JBTADR (JDAT==PROG)\r
+JBTSGN:        IFG SEGN, <\r
+       BLOCK JOBN              ;RH=SEGMENT NUMBER OF HIGH SEGMENT THIS JOB\r
+                               ; IS USING IN CORE OR ON DISK\r
+                               ; 0 MEANS JOB DOES NOT HAVE HIGH SEG\r
+                               ;LH=USER DEPENDENT HIGH SEG STATUS BITS (SEE S.MAC)\r
+       XP ITMSGN,ITEM+JOBMXL   ;LH SYMBOL FOR GETTAB UUO\r
+>\r
+       IFE SEGN, <\r
+       0                       ;SINGLE-ENTRY NULL JBTSGN TABLE....\r
+       XP ITMSGN,JOBMXL        ;LH SYMBOL FOR GETTAB UUO SO THAT JBTSGN IS\r
+                               ; UNDEFINED, I.E., MAKE INDEXING BY ITEM BE 0, BUT\r
+                               ; ALLOW REFERENCES UP TO JOBMXL.\r
+>\r
+       IFG DSKN, <             ;DISK SYSTEM ?\r
+       INTERN PRJPRG,JBTDIR\r
+JBTDIR:                                ;HIGH SEGMENT DIRECTORY NAME (DSK) OR PHYSICAL\r
+                               ; DEVICE NAME (DTA,MTA)\r
+PRJPRG:        BLOCK JOBN+SEGN         ;XWD PROJECT NUMBER,PROGRAMMER NUMBER\r
+>\r
+       IFE DSKN, <IFG SEGN, <  ;REENTRANT MONITOR WITHOUT DISK ?\r
+       INTERN JBTDIR\r
+       JBTDIR=.-JOBN           ;INDEX BY HIGH SEG NUMBER\r
+       BLOCK SEGN              ;HIGH SEGMENT PHYSICAL DEVICE NAME (DTA,MTA)\r
+>>\r
+       IFN FTTIME, <\r
+       INTERN RTIME,TTIME\r
+RTIME: BLOCK JOBN              ;TOTAL RUN TIME SINCE LAST IJOB OR RUNTIME\r
+TTIME: BLOCK JOBN              ;TOTAL RUN TIME SINCE LAST IJOB\r
+>\r
+\r
+       IFG SYS50N,<            ;SWAPPING SYSTEM ?\r
+       INTERNAL JBTSWP,JBTCHK\r
+JBTSWP:        BLOCK JOBN+SEGN         ;LH:==PROTECT TIME WHILE JOB IS IN CORE.\r
+                               ; DISK ADDRESS WHILE SWAPPED OUT\r
+                               ;BIT 0=1 IF SEGMENT IS FRAGMENTED\r
+                               ; BITS18-26:==OUTCORE IMAGE SIZE\r
+                               ; BITS27-35:==INCORE IMAGE SIZE\r
+                               ; FOR HIGH SEG, LH ALWAYS DISK ADDRESS\r
+\fJBTCHK:       BLOCK JOBN+SEGN         ;CHECK SUM FOR SWAPPED OUT JOB DATA AREA OR\r
+                               ; SAME AREA FOR HIGH SEG\r
+\r
+>\r
+JBTNAM:                                ;NAME OF HIGH SEGMENT (FILE IT WAS INITIALIZED FROM)\r
+JBTPRG:        BLOCK JOBN+SEGN         ;NAME OF FILE USED IN LAST R,RUN,GET, ETC\r
+                               ; USED BY SYSTAT PROGRAM\r
+       IFN FTKCT, <\r
+       INTERN JBTKCT\r
+JBTKCT:        BLOCK JOBN              ;PRODUCT OF CORE LENGTH (IN K) TIMES NUMBER OF JIFFIES\r
+                               ; PROGRAM USED CPU. USED FOR TIME ACCOUNTING.\r
+>\r
+       IFN FTPRV, <\r
+       INTERN JBTPRV\r
+JBTPRV:        BLOCK JOBN              ;PRIVILEGE BITS FOR JOB SET BY LOGIN\r
+>\r
+       IFG DSKN, <\r
+       INTERN MQUEUE,MQTOP\r
+\r
+MQUEUE:        BLOCK JOBN              ;DISK MONITOR I/O QUEUE\r
+       MQTOP=.                 ;LAST LOC+1 OF MONITOR QUEUE\r
+>\r
+       IFG SYS50N, <\r
+;THE FOLLOWING ARE USED TO CREATE MXQUE\r
+;THE MAXIMUM QUEUE SIZE, USED BY SWAPPING SCHEDULER (SCHED)\r
+       FTDISK=-DSKN            ;DEFINE FEATURE SWITCH FTDISK,SINCE IT APPEARS\r
+                               ; IN MACRO QUEUES\r
+                               ; WHICH IS DEFINED IN S.MAC\r
+       XP      MXQUE,0\r
+\r
+       LALL                    ;LIST QUEUE DEFINITIONS FOR ALL TO SEE\r
+\r
+       DEFINE  X       <MXQUE==MXQUE+1;>\r
+       QUEUES\r
+DEFINE X       (A)\r
+\r
+               <A'Z==MXQUE\r
+       INTERN  A'Z\r
+               MXQUE==MXQUE+1>\r
+       CODES\r
+               MXQUE==MXQUE+3\r
+\r
+       XALL                    ;BACK TO NORMAL MACRO EXPANSION\r
+\r
+       INTERN JBTQ,JBTQM1,JBTQP1,JBTQMN\r
+\r
+       BLOCK MXQUE             ;NUMBER OF QUEUES FOR SWAPPING SCHEDULER\r
+JBTQ:  BLOCK JOBN              ;ONE ENTRY PER JOB,\r
+                               ; LH=PREVIOUS JOB, RH=NEXT JOB IN QUEUE\r
+                               ; NEGATIVE MEANS THIS IS FIRST (LH) OR LAST (RH)\r
+                               ; JOB IN QUEUE\r
+       JBTQM1==JBTQ-1                  ;JBTQ-1\r
+       JBTQP1==JBTQ+1                  ;JBTQ+1\r
+       JBTQMN==JBTQ-NULZ               ;J1\r
+>\r
+\f;TTY TRANSLATOR TABLE\r
+;INDEXED BY TTY LINE NUMBER, CONTAINS TTY DDB ADDRESS IN RH\r
+;(ASSIGNED WHEN FIRST CHARACTER TYPED ON TTY BY SCNSER\r
+       ;BIT 0==1 IF COMMAND TYPED BUT NOT PROCESSED\r
+       ;BITS 6-11==JOB NUMBER TTYP IS ATTACHED TO\r
+       ;BITS 12-17==NEXT LINE NUMBER IN TALK RING OR ITS SELF IF NOT TALKING\r
+\r
+       INTERN TTYTAB,PTYTAB,TPYTAB,TCONLN,MLTTYL,MTTYLN,TTPLEN,TTMODL,TTPMXL\r
+\r
+TTYTAB:        BLOCK HGHLIN+1+1        ;NO OF TTYS PLUS CTY\r
+       TPYTAB==.-1             ;ADDRESS OF LAST ENTRY\r
+       TCONLN==.-1-TTYTAB      ;LINE NUMBER OF CTY\r
+       BLOCK PTYN              ;PSEUDO TTY TRANSLATOR TABLE\r
+                               ; THIS IS FOR LINKED TTY LINES,\r
+                               ; NOT THE DEVICE "PTYN"'S DDB\r
+       TTPLEN==.-TTYTAB        ;LENGTH OF ENTIRE TABLE\r
+       TTPMXL=<TTPLEN-1>B26    ;HIGHET ENTRY IN TTYTAB SHIFTED LEFT 9(FOR GETTAB UUO)\r
+\r
+       MLTTYL==-JOBN           ;NEG, NO OF TTY DDBS (ONE FOR EACH JOB, PLUS 1 ETRA\r
+                               ; SO JOB CAPACITY EXCEEDED MESSAGE CAN BE TYPED\r
+       MTTYLN==-TTPLEN         ;NEG, LENGTH OF ENTIRE TRANSLATOR TABLE\r
+\r
+PTYTAB:        BLOCK PTYN+1            ;ADDRESS OF THE DDBS FOR DEVICE PTYN\r
+                               ; NOT THE LINKED TTY LINES. SEE TPYTAB.\r
+;LAST LOCATION CLEARED BY SYSINI ON 143 RESTART\r
+       SYSEND==.-1\r
+\f;ONCE ONLY CODE TO CREATE DEVICE DATA BLOCKS\r
+\r
+       LOC SYSBEG              ;PUT IN SYSTEM DATA AREA SO NOT TO TAKE\r
+                               ; VALUABLE SPACE.  THIS AREA IS CLEARED\r
+                               ; BY SYSINI AFTER IT HAS BEEN EXECUTED\r
+\r
+;CNTDB- ROUTINE TO INCREASE SIZE OF MONITOR FOR MULTIPLE DEVICE DATA BLOCKS\r
+; BOTH DISK AND OTHER DEVICES (DTA,MTA,SCN,PTY)\r
+; CALL:  JSP TAC,CNTDB  (FROM LONG ONCE DIALOG)\r
+;\r
+;LINKDB- ROUTINE TO CREATE MULTIPLE DEVICE DATA BLOCKS (EXCEPT DISK)\r
+; AND LINK THEM. THESE ARE STORED ON TOP OF ONCE ONLY CODE\r
+;CALL:  JRST LINKDB (FROM LINKSR)\r
+;BOTH ROUTINES UPDATE  SYSSIZ AS MORE DDB SPACE IS CONSUMED\r
+\r
+       INTERN LINKDB,CNTDB\r
+       EXTERN LINKSR\r
+\r
+LINKDB:        SETOM DESONC            ;PERMIT DESTRUCTION OF ONCE ONLY CODE\r
+       SKIPA TAC,LINKSR                ;GET JSRPC OF CALLER OF LINKSR IN ONCE\r
+CNTDB: SETZM DESONC            ;PREVENT DESTRUCTION OF ONCE ONLY CODE\r
+                               ;SO THAT E.G. SAT TABLES MAY BE SCANNED\r
+       HRRM TAC, LINKED        ;STORE EXIT FROM THIS ROUTINE (ONCE ONLY CODE WILL\r
+                               ; BE OVERLAYED BY MULTIPLE DEVICE DATA\r
+                               ; BLOCK GENERATION)\r
+       MOVSI TAC,INTNUM        ;NEG NUMBER OF ENTRIES IN TABLE\r
+       MOVEI DEVDAT,DEVLST-DEVSER      ;MAKE DEVLST LOOK LIKE DEVSER IN A DOB\r
+LOOP:  MOVE TAC1,INTTB1(TAC)   ;GET NEXT DEVICE DATA BLOCK ADDRESS\r
+       JUMPE TAC1,NEXT         ;0 MEANS NO DOB FOR DEVICE\r
+       SKIPE DESONC            ;OK TO DESTROY ONCE ONLY CODE ?\r
+       HRLM TAC1,DEVSER(DEVDAT)        ;YES, STORE IN PREVIOUS DEVICE DATA BLOCK\r
+       HRRZ DEVDAT,TAC1        ;MAKE DEVDAT POINT TO CURRENT DOB\r
+       LDB UUO,DDBNUM          ;GET NUMBER OF DDB'S\r
+       SOJLE UUO,NEXT          ;ONE OR LESS ?\r
+       HRRZ JBUF,DEVDAT        ;NO, CREATE MULTIPLE COPIES OF DOB\r
+                               ; SAVE ORIGINAL IN JBUF\r
+       MOVEI AC3,1             ;STARTING WITH DEV1,DEV2,DEV77\r
+       LDB AC1,PUNIT           ;START UNIT NUMBER FROM\r
+                               ; ASSEMBLE DEVICE DATA BLOCK\r
+                               ; PTY STARTS UNIT NUMBER AT 1 INSTEAD OF 0\r
+                               ; ALTHOUGH DEVICE NAMES ARE PTY0,PTY1,ETC.\r
+\fMULDDB:       HRRZ TAC1,SYSSIZ        ;ADR. OF NEXT DDB IS AT END OF MONITOR\r
+       SKIPE DESONC            ;OK TO DESTROY ONCE ONLY CODE ?\r
+       HRLM TAC1,DEVSER(DEVDAT) ;YES, MAKE PREVIOUS DDB POINT TO THE ONE ABOUT TO BE CREATED\r
+       HRL DEVDAT,JBUF         ;SOURCE ADDRESS TO LH\r
+       HRR DEVDAT,TAC1         ;DESTINATION ADDRESS TO RH\r
+       HLRZ AC2,INTTB1(TAC)    ;LENGTH OF DEVICE DATA BLOCK\r
+       ADDB AC2,SYSSIZ         ;LAST LOCATION+1 AFTER MOVE\r
+       SKIPN DESONC            ;OK TO DESTROY ONCE ?\r
+       JRST JUSTCT             ;NO, JUST COUNT DDB SPACE\r
+       BLT DEVDAT,-1(AC2)      ;MOVE ORIGINAL TO FREE STORAGE\r
+       SKIPL INTTAB(TAC)       ;IS THIS DECTAPE (ANY OF 3 SERVICES)?\r
+       JRST NOTDTA             ;NO\r
+       HRRZ AC2,DEVDAT         ;YES,DESTINATION\r
+       SUBI AC2,(JBUF)         ;-SOURCE=DISTANCE MOVED\r
+       ADDM AC2,14(DEVDAT)     ;INCREMENT POINTER TO DIRECTORY BLOCK\r
+                               ; (SORRY ABOUT NO SYMBOL)\r
+NOTDTA:        MOVE PROG,PHYNAM        ;BYTE POINTER TO NEWLY CREATED\r
+                               ; DDB PHYSICAL NAME\r
+\r
+       MOVE ITEM,AC3           ;MAKE COPY OF UNIT NUMBER\r
+       TRNN ITEM,70            ;IS IT 10 OR MORE ?\r
+       JRST SMALL              ;NO\r
+       ROT ITEM,-3             ;YES, CONVERT HIGH ORDER OCTAL DIGIT TO\r
+       ADDI ITEM,20            ;SIXBIT\r
+       IDPB ITEM,PROG          ;AND STORE\r
+       TRZ ITEM,-1             ;CLEAR OUT HIGH ORDER DIGIT\r
+       ROT ITEM,3              ;MOVE LOW ORDER DIGIT BACK\r
+SMALL: ADDI ITEM,20            ;CONVERT LOW ORDER DIGIT IN SIXBIT\r
+       IDPB ITEM,PROG          ;AND STORE IN PHYSICAL NAME\r
+       ADDI AC1,1              ;INCREMENT BINARY UNIT NUMBER\r
+       DPB AC1,PUNIT           ;STORE UNIT NUMBER\r
+JUSTCT:        CAIGE AC3,(UUO)         ;COMPARE WITH HIGHEST DEVICE NUMBER\r
+       AOJA AC3,MULDDB         ;DO ANOTHER COPY\r
+NEXT:  AOBJN TAC,.+1           ;MOVE BY TWOS\r
+       AOBJN TAC,LOOP          ;ANY MORE DEVICES\r
+       MOVEI TAC,0             ;NO, FLAG END OF DEVICE DATA BLOCK CHAIN WITH 0 LINK\r
+       SKIPE DESONC            ;OK TO DESTROY ONCE ?\r
+       HRLM TAC,DEVSER(DEVDAT) ;YES, STORE 0 IN CASE LAST DDB IS MULTIPLE\r
+IFG DSKN, <\r
+       EXTERNAL LOCORE,CRINIT\r
+       MOVE TAC,SYSSIZ         ;SIZE OF MONITOR SO FAR (SYSMAK, EXEC DDT OR NOT)\r
+       MOVEM TAC,LOCORE        ;SAVE POINTER TO FIRST 4 WORD BLOCK\r
+       ADDI TAC,MINCOR         ;MINIMUM REQUIRED FOR DISK DDBS\r
+       IORI TAC,1777           ;FORCE TO 1K BOUNDARY\r
+       ADDI TAC,1\r
+       MOVEM TAC,SYSSIZ        ;STORE SIZE OF MONITOR (FIRST FREE LOC)\r
+       SUB TAC,LOCORE          ;FORM LENGTH OF EXCESS CORE\r
+       IDIVI TAC,^D144         ;MUST BE MULTIPLE OF 144. WORDS (SEE DDBTAB)\r
+       MOVN TAC,TAC            ; -N\r
+       HRLM TAC,CRINIT         ;STORE USEABLE LENGTH OF DDBTAB\r
+>\r
+LINKED:        JRST .                  ;RETURN TO SYSINI\r
+\r
+DESONC:        0                       ;FLAG =0 IF CALLED BY JSP TAC,CNTDB\r
+                               ; (DO NOT DESTROY ONCE)\r
+                               ; FLAG NON-ZERO IF CALLED BY JRST LINKDB\r
+                               ; (OK TO DESTROY ONCE CODE)\r
+DDBNUM:        POINT 8,INTTAB(TAC),8   ;POINTER TO DDB NUMBER\r
+PHYNAM:        POINT 6,DEVNAM(DEVDAT),17       ;BYTE POINTER TO DB PHYSICAL NAME\r
+\r
+\f;MACROS TO DEFINE PI CHANNEL NUMBER AND GENERATE INTERRUPT CHAINING\r
+;INFORMATION FOR ONCE \r
+;SO IT CAN LINK THE DEVICE INTERRUPT SERVICE ROUTINES AND THE DEVICE DATA BLOCKS\r
+;TABLE INTTAB IS GENERATED WITH PAIRS OF ENTRIES FOR EACH DEVICE\r
+;WHICH HAS A DEVICE DATA BLOCK(0-7)\r
+;FIRST WORD: BIT 0==1 IF DECTAPE,BITS 1-9==NO. OF DDBS, BITS 9-17==PI CHANNEL(0-7)\r
+;0 MEANS NO PI CHANNEL (EG PTY)\r
+;SECOND WORD:LH==0 IF SINGLE DEVICE,==LENGTH OF DDB IF MULTIPLE, RH==DDB ADDRESS\r
+\r
+;MACRO FOR DEVICES WHICH ARE ALWAYS PRESENT(AND WHICH DO NOT USE A CHANNEL SAVE ROUTINE\r
+;AND HAVE NO DDB (EX-APR,CTY,PEN,CLK)\r
+\r
+DEFINE SPASGINT (DEV,PI) <\r
+       DEV'N==1\r
+       ASGINT DEV,PI\r
+>\r
+\r
+DEFINE ASGINT (DEV,PI) <\r
+       IFG DEV'N, <IFG PI, <\r
+       IFE <PI-.CH>, <.CHAS==1 ;CHANNEL PI IN USE.>\r
+       INTERNAL DEV'CHN\r
+               DEV'CHN==PI\r
+       EXTERNAL DEV'INT        ;INTERRUPT SERVICE CONSO INSTRUCTION\r
+               XWD PI,DEV'INT  ;GENERATE INTERRUPT ENTRY POINT FOR ONCE\r
+               XWD 0,0         ;NO DDB TO CHAIN TOGETHER\r
+       ASGIN1 DEV,\PI\r
+>\r
+>>\r
+\r
+DEFINE ASGIN1 (DEV,PI) <\r
+       IFDEF   CH'PI, <                ;WAIT TILL PASS 2 TO DEFINE\r
+                       DEV'CHL==CH'PI\r
+               INTERNAL DEV'CHL\r
+>>\r
+\r
+;MACRO FOR OPTIONAL DEVICES WHICH ALWAYS USE A CHANNEL SAVE ROUTINE\r
+; (EXAMPLES: CDR, DSK, PTR, ETC.  ALSO PTY WITH 0 PI)\r
+\r
+DEFINE         SPASGSAV (DEV,PI,NUM) <\r
+       DEV'N==NUM\r
+       ASGSAV DEV,PI\r
+>\r
+\r
+DEFINE ASGSAV (DEV,PI) <\r
+       IFG DEV'N, <IFG PI, <\r
+               EXTERN DEV'INT          ;INTERRUPT SERVICE CONS INSTRUCTION\r
+               >\r
+       EXTERN DEV'DDB\r
+       ASGSV1 (DEV,\PI)\r
+       >>\r
+\f;MACRO FOR:   1. COMPLETION OF THE DEFINITION REQUIRED FOR THOSE\r
+;                 DEVICES INVOKING THE ASGSAV MACRO\r
+;\r
+;              2. COMPLETE DEFINITION FOR THOSE DEVICES WITH THEIR\r
+;                 INTERRUPT ENTRY POINT AND DDB'S HERE IN COMMON\r
+;                 (EXAMPLE: LPT'S)\r
+\r
+DEFINE ASGSV1 (DEV,PI) <\r
+       IFG PI, <\r
+               IFE <PI-.CH>, <.CHAS==1         ;CHANNEL PI IN USE.>\r
+               DEV'CHN==PI             ;DEFINE DEVICE CHANNEL NUMBER\r
+               INTERN DEV'CHN          ;DECLARE INTERNAL - ONLY IF DEVICE WANTED\r
+               USED'PI==1              ;SET FLAG SO THAT A CHANNEL SAVE\r
+                                       ; ROUTINE WILL BE GENERATED FOR\r
+                                       ; THIS PI CHANNEL\r
+       IFDEF SAV'PI, <         ;WAIT TILL CHANNEL SAVE ROUTINES\r
+                                       ; ARE DEFINED BELOW (IN PASS 2)\r
+\r
+               DEV'SAV==SAV'PI         ;CHANNEL AC SAVE ROUTINE LOCATION\r
+               DEV'RET==RET'PI         ;CHANNEL AC RESTORE ROUTINE LOCATION\r
+                                       ; (USUALLY POPJ USED)\r
+               DEV'CHL==CH'PI          ;LOCATION WHERE INTERRUPT PC IS STORED\r
+               DEV'SAC==SAVAC'PI       ;STARTING CHANNEL SAVE LOCATION FOR AC'S\r
+               INTERN DEV'SAV, DEV'RET, DEV'CHL, DEV'SAC\r
+       >>\r
+\r
+       DTBIT==0                        ;ASSUME THIS IS NOT A DECTAPE\r
+\r
+       IFIDN <DEV>, <DTA>, <DTBIT==1>  ;IS IT PDP-10 DECTAPES ?\r
+       IFIDN <DEV>, <DTC>, <DTBIT==1>  ; OR PDP-6 DECTAPES ?\r
+\r
+       IFE PI, <\r
+               XWD DEV'N*1000+0,0      ;NO PI CHANNEL FOR THIS DEVICE\r
+       >\r
+\r
+       IFG PI, <\r
+               XWD DTBIT*400000+DEV'N*1000+PI,DEV'INT  ;FIRST WORD OF INTTAB ENTRY\r
+       >\r
+\r
+       IFG DEV'N-1, <\r
+               XWD DEV'DDS,DEV'DDB     ;MULTIPLE DEVICE SECOND WORD OF INTTAB ENTRY\r
+               EXTERN DEV'DDS\r
+       >\r
+       IFE DEV'N-1, <\r
+               XWD 0,DEV'DDB           ;SINGLE DEVICE SECOND WORD OF INTTAB ENTRY\r
+       >>\r
+\f\r
+;MACRO'S TO ALLOW GENERATION OF MULTIPLE INTTAB ENTRIES FOR MULTIPLE\r
+; DEVICES SUCH AS LINE-PRINTERS\r
+\r
+DEFINE MULASG (DEV,DE,PI) <\r
+       IFG DEV'N, <\r
+               ZZ==0\r
+               REPEAT DEV'N, <\r
+                       DEVASG DE,\ZZ,PI\r
+                       ZZ==ZZ+1\r
+               >\r
+       >\r
+>\r
+\r
+DEFINE DEVASG (DE,X,PI) <\r
+       DE'X'N==1\r
+       ASGSV1 DE'X,\PI\r
+>\r
+\r
+\r
+;MACROS TO CONTROL ASSIGNMENT OF PI CHANNELS TO DEVICES\r
+\r
+DEFINE NEXTCH <        .CH==.CH+1\r
+.CHAS==0\r
+NEXTCU \.CH    \r
+>\r
+DEFINE NEXTCQ <        IFN .CHAS,<NEXTCH>>\r
+DEFINE NEXTCU (N) < IFDEF UNIQ'N,<IFN UNIQ'N,<NEXTCH>>>\r
+\r
+\r
+\r
+\r
+\r
+\r
+;ASSUME NO PI CHANNEL SAVE ROUTINES NEEDED\r
+\r
+       USED1==0\r
+       USED2==0\r
+       USED3==0\r
+       USED4==0\r
+       USED5==0\r
+       USED6==0\r
+       USED7==0\r
+\r
+;NOW GENERATE THE TABLE FOR ONCE AND DEFINE PI CHANNEL ASSIGNMENTS\r
+\r
+       INTERN INTTAB,INTTB1,INTNUM,SCNN,CTYN\r
+\r
+               CTYN==1         ;ALWAYS ONE CTY\r
+               SCNN==JOBN      ;NUMBER OF SCN DDB\r
+                               ; ONE FOR EACH JOB + NULL JOB (EXTRA ONE)\r
+               APRN==1         ;ALWAYS AN APR\r
+               CLKN==1         ;ALWAYS LOWEST PRIORITY CLOCK\r
+\r
+\r
+INTTAB:                        ;TABLE OF DATA FOR DEFINING PI CHAN AND NUMBER OF DOB\r
+       INTTB1==INTTAB+1\r
+\r
+       ASGSAV PTY,0    \r
+\r
+.CHAS==0\r
+.CH==0\r
+NEXTCH\r
+\r
+;THE FOLLOWING DEVICES MUST HAVE A UNIQUE, HIGH PRIORITY\r
+; CHANNEL FOR BLOCK I/O TRANSFERS.\r
+\r
+;NOTE THAT THE PDP-6 DECTAPE AND MAGTAPE SHARE A\r
+; 136 DATA CONTROL IF BOTH ARE PRESENT.\r
+\r
+       ;DATA PRODUCTS DISK BLKI/BLKO PI CHANNEL:\r
+       IFNDEF DCBCHN, <IFG DPDN, <XP DCBCHN,.CH\r
+       NEXTCH>>\r
+       ;PDP-6 OR PDP-10 MAGTAPE BLKI/BLKO PI CHANNEL:\r
+       IFNDEF MTDCHN, <IFG MTAN, <XP MTDCHN,.CH\r
+       NEXTCH>>\r
+       IFNDEF DCTCHN, <IFG MTCN, <XP DCTCHN,.CH\r
+       NEXTCH>>\r
+       ;PDP-6 OR PDP-10 DECTAPE BLKI/BLKO PI CHANNEL:\r
+       IFNDEF DTDCHN, <IFG DTAN, <XP DTDCHN,.CH\r
+       NEXTCH>>\r
+       IFNDEF DCTCHN, <IFG DTCN, <XP DCTCHN,.CH\r
+       NEXTCH>>\r
+\r
+IFNDEF BLKMXC, <BLKMXC=.CH>    ;REMEMBER THIS CHANNEL ON PASS 1\r
+.CH==BLKMXC                    ;ON PASS 2, SKIP OVER BLKI CHANNELS\r
+\r
+\f;THE FOLLOWING ARE GROUPED ON A CHANNEL FOR HIGH-PRIORITY DEVICES\r
+       ASGSAV CDR,.CH\r
+       ASGINT APR,.CH\r
+\r
+NEXTCQ\r
+\r
+;THE FOLLOWING ARE MEDIUM-PRIORITY DEVICES, AS A GROUP\r
+       ASGSAV SCN,.CH\r
+       ASGSAV PTR,.CH\r
+       MULASG LPT,LP,.CH\r
+       ASGSAV DTA,.CH\r
+       ASGSAV DTC,.CH\r
+       ASGSAV MTA,.CH\r
+       ASGSAV MTC,.CH\r
+       ASGINT CTY,.CH\r
+\r
+NEXTCQ\r
+\f\r
+;THE FOLLOWING ARE LOWER-PRIORITY DEVICES, AS A GROUP\r
+       ASGSAV DSK,.CH\r
+       ASGSAV PEN,.CH\r
+       ASGSAV PTP,.CH\r
+       ASGSAV CDP,.CH\r
+       ASGSAV PLT,.CH\r
+NEXTCQ\r
+\r
+\r
+;THESE DEVICES GET LOW PRIORITY CHANNEL\r
+       ASGSAV DIS,.CH\r
+\r
+NEXTCQ\r
+\f\r
+;LAST IS THE SCHEDULER, ON CHANNEL 7 BY ITSELF\r
+\r
+IFG <.CH-7>, < PRINTX ;NOT ENOUGH PI'S TO SERVICE THIS CONFIGURATION.\r
+               PRINTX ;SUGGEST EDITING COMMON TO PUT MORE DEVICES ON\r
+               PRINTX ; A SINGLE CHANNEL\r
+>\r
+\r
+.CH==7\r
+       ASGINT CLK,.CH\r
+\r
+       SPCINT\r
+                               ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING\r
+                               ; WHICH DO NOT USE A CHANNEL SAVE ROUTINE AND HAVE\r
+                               ; NO DEVICE DATA BLOCK\r
+       SPCSAV\r
+                               ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING\r
+                               ; WHICH DO NEED A CHANNEL SAVE ROUTINE\r
+\r
+;END OF THE ASSIGNMENT TABLE\r
+\r
+       INTNUM==INTTAB-.        ;-LENGTH OF INTERRUPT CHANNEL ASSIGNMENT TABLE\r
+\r
+       IFLE .-SYSEND, <LOC SYSEND+1>\r
+                               ; SET LOC UP TO SYSEND+1, UNLESS ONCE ONLY CODE\r
+                               ; IS BIGGER\r
+\r
+\f\r
+\r
+;SYSTEM CONSTANTS AND PARAMETERS\r
+\r
+       INTERN CNFTBL,CNFMXL,CONFIG,SYSTAP,SYSDAT\r
+\r
+\r
+CNFTBL:                                ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+                               ; RETURNED BE GETTAB UUO (THESE LOCATIONS\r
+                               ; NOT CLEARED BY SYSINI)\r
+                               ; CNFTBL IS GETTAB TABLE 11 (RH OF AC)\r
+                               ; OCTAL NO. IN () CORRESPOND TO GETTAB UUO\r
+CONFIG: SYSNAM\r
+\r
+       LOC CONFIG+5            ;ALWAYS LEAVE 5 WORDS (24 CHARS)\r
+                               ; SO GETTAB UUO WILL BE CONSTANT\r
+SYSDAT: SYSDAT\r
+                               ;(5,6) GENERATE SYSTEM DATE\r
+       LOC SYSDAT+2            ;ALWAYS LEAVE 2 WORDS SO GETTAB CONSTANT\r
+SYSTAP: SYSDEV\r
+                               ;(7) NAME OF SYSTEM DEVICE, IN SIXBIT\r
+\r
+;LOCATIONS SETUP BY ONCE ONLY OPERATOR DIALOGUE AND NEVER RESET ON RESTARTS\r
+\r
+       INTERN TIME,THSDAT,SYSSIZ,DEVOPR,DEVLST,SEGPTR,TWOREG,STATES\r
+       INTERN SERIAL\r
+       EXTERN PATCH\r
+\r
+TIME:  0                       ;(10) TIME OF DAY IN JIFFIES (60TH OR 50THS OF A SEC)\r
+THSDAT:        0                       ;(11) TODAY'S DATE ((Y-1964)*12+(M-1))*31+(D-1)\r
+SYSSIZ:        EXP PATCH               ;(12) SIZE OF MONITOR (FIRST LOC NOT USED)\r
+DEVOPR:        SIXBIT /CTY/            ;(13) SIXBIT PHYSICAL NAME OF OPERATORS CONSOLE\r
+                               ; (IF THIS LOCATION CONTAINS 0, NONE HAS\r
+                               ;  BEEN DESIGNATED)\r
+                               ;PUBLIC LOGICAL NAME "OPR" WILL BE THIS DEVICE.\r
+                               ; ALSO UNEXPLAINED MONITOR ERROR MESSAGES\r
+                               ; WILL BE TYPED ON TTY OPR\r
+DEVLST:        XWD 0,0                 ;(14) LH CONTAINS ADDRESS OF FIRST DEVICE DATA BLOCK\r
+                               ; ONCE ONLY CODE LINKS DEVICE DATA BLOCKS\r
+\fSEGPTR:       XWD -SEGN,JOBN          ;(15) AOBJN POINTER TO 1ST HIGH SEG IN JBTXXX TABLES\r
+                               ; LH=-NO. OF HIGH SEGS,  RH= ST HIGH SEG NO.\r
+TWOREG:        0                       ;(16) FLAG TO INDICATE WHETHER BOTH HARDWARE AND SOFTWARE\r
+                               ; HAVE 2 RELOC REG CAPACITY\r
+                               ; NON-ZERO IF BOTH DO, 0 IF EITHER OR BOTH DO NOT\r
+                               ; SET BY ONCE ONLY CODE\r
+\r
+       ZZ==0\r
+       IFG DSKN,<ZZ==ZZ!1B0>   ;1 IF DISK SYSTEM (ANALOGOUS TO FTDISK)\r
+       IFG SYS50N,<ZZ==ZZ!1B1> ;1 IF SWAPPING SYSTEM (ANALOGOUS TO FTSWAP)\r
+       IFG LOGINN,<ZZ==ZZ!1B2> ;1 IF LOGIN (ANALOGOUS TO FTLOGIN)\r
+       IFN FTTTYSER,<ZZ==ZZ!1B3>       ;1 IF FULL DUPLEX SOFTWARE\r
+       IFN FTPRV,<ZZ==ZZ!1B4>  ;1 IF PRIVILEGE FEATURE INCLUDED\r
+       IFN FT2REL,<ZZ==ZZ!1B5> ;1 IF REENTRANT SOFTWARE\r
+       IFE JIFSEC-^D50,<ZZ==ZZ!1B6>    ;1 IF 50 CYCLE MACHINE, 0 IF 60 CYCLE\r
+STATES:        EXP ZZ                  ;(17) BITS WHICH DEFINE TYPE OF SYSTEM IN LH\r
+                               ; RH PATCHED BY MONITOR COMMAND TO\r
+                               ; INDICATE OPERATIONAL STATE OF SYSTEM\r
+SERIAL:        EXP APRSN       ;(20) SERIAL NUMBER OF APR\r
+CNFMXL==<.-CNFTBL-1>B26        ;MAXIMUM ENTRY IN CNFTBL FOR GETTAB UUO\r
+\fIFG DSKN, <\r
+       INTERN ODPTBL,ODPMXL,SWPHGH,K4SWAP,PROT,PROT0\r
+\r
+IFG SYS50N,<   EXTERN ICPROT,ICPRT1    ;THESE ARE DEFINED ONLY IN\r
+                                       ; A SWAPPING SYSTEM>\r
+IFLE SYS50N,<  XP ICPROT,0             ;IF NON-SWAPPING, DECLARE\r
+               XP ICPRT1,0             ; INTERNAL IN COMMON>\r
+\r
+ODPTBL:                                ;FIRST LOC IN MONITOR DATA AREA FOR DISK\r
+                               ; LOCATIONS WHICH ARE NOT SET TO 0 WHEN SYSTEM\r
+                               ; STARTED, ODPTBL IS GETTAB UUO TABLE 15\r
+\r
+SWPHGH:        0                       ;(0) HIGHEST LOGICAL BLOCK # IN THE SWAPPING\r
+                               ; SPACE ON THE DISK (SET BY SWPINI)\r
+K4SWAP:        0                       ;(1)K OF DISK WORDS SET ASIDE FOR SWAPPING\r
+                               ; ASSIGNED AT ONCE ONLY REFRESH TIME\r
+\r
+PROT:  EXP ICPROT              ;(2) IN-CORE PROTECT TIME PARAMETER TO BE\r
+                               ; MULTIPLIED BY <K-1> OF CORE IN JOB.\r
+PROT0: EXP ICPRT1              ;(3) IN-CORE PROTECT TIME PARAMETER TO \r
+                               ; BE ADDED TO ABOVE RESULT.\r
+\r
+                               ;INSERT NEW LOCATIONS OF INTEREST SETUP\r
+                               ; BY ONCE ONLY CODE HERE FOR DISK SYSTEMS\r
+ODPMXL==<.-ODPTBL-1>B26        ;MAXIMUM ENTRY IN ODPTBL FOR GETTAB UUO\r
+>      \r
+\r
+\f;MORE DATA LOCATIONS SETUP AT ASSEMBLY TIME OR ONCE ONLY TIME\r
+; BUT NOT OF INTEREST TO USER PROGRAMS\r
+\r
+       INTERN XJBPFI,PMONTB,MONTAB,MIDNIT\r
+\r
+XJBPFI:        XWD .,0                 ;LH FILLED IN WITH EXTERNAL JOBPFI (SEE JOBDAT)\r
+                                       ; JOBPFI==HIGHEST LOC, IN USER JOB DATA AREA\r
+                               ; PROTECTED FROM I/O\r
+;MONTH TABLE FOR DAYTIME COMMAND PRINTING\r
+\r
+PMONTB:        POINT 6,MONTAB(TAC),5   ;POINTER TO NUMBER OF DAYS INMONTH\r
+MONTAB:        EXP ^D30B5+"JAN"\r
+       EXP ^D27B5+"FEB"\r
+       EXP ^D30B5+"MAR"\r
+       EXP ^D29B5+"APR"\r
+       EXP ^D30B5+"MAY"\r
+       EXP ^D29B5+"JUN"\r
+       EXP ^D30B5+"JUL"\r
+       EXP ^D30B5+"AUG"\r
+       EXP ^D29B5+"SEP"\r
+       EXP ^D30B5+"OCT"\r
+       EXP ^D29B5+"NOV"\r
+       EXP ^D30B5+"DEC"\r
+MIDNIT: EXP ^D60*^D60*^D24*JIFSEC ;NO OF JIFFIES TILL MIDNIGHT\r
+\f;STOP PROCEDURE WHEN SHUTTING DOWN SYSTEM\r
+;BECAUSE OF CATOSTROPHIC FAILURE OR ANY OTHER REASON\r
+;WRITE OUT DIRECTORIES STILL IN CORE (DISK)\r
+;TRANSFER HERE FROM LOC 147\r
+\r
+;PROCEDURE TO SAVE CRASHED MONITOR ON DECTAPE FOR LATER DEBUGGING UNDER TIME SHARING\r
+;OPERATOR SHOULD:\r
+;  1. PUSH STOP AND HOLD IT DOWN\r
+;  2. PUSH CONTINUE (APR PI IN PROGRESS SHOULD COME ON)\r
+;              THIS PUTS MACHINE INTO EXEC MODE AND STORES PC OC CRASH\r
+;  3. LETUP ON STOP\r
+;  4. SET ADDRESS SWITCHES TO 147\r
+;  5. PUSH START (DO NOT PUSH I/O RESET AS IT WILL CLEAR DEVICES)\r
+\r
+INTERN APRSTS,PISTS,SYSTOP,CRASHX,SWTSTS,TTYSTS,PTRSTS,TMCSTS\r
+INTERN PTPSTS,DLSSTS,DTSSTS,CRSTS,LPTSTS,PLTSTS,TMSSTS,DSKSTS,DSKDTI\r
+EXTERN SYSPDL\r
+\r
+EXTERN CRSHAC                  ;DEFINED IN SYSINI TO BE 143 RESTART CODE\r
+                               ;SO MONITOR CANNOT BE RESTARTED AT 143 AFTER\r
+                               ;BEING STARTED AT 147.\r
+\r
+CRASHX:        MOVEM 17,CRSHAC+17      ;SAVE AC17\r
+       MOVE 17,TSTLOC\r
+       CAME 17,SYSCRS          ;IS LOC 147 WIPED OUT?\r
+       HALT SYSTOP+1           ;YES - LET OPERATOR DECIDE WHAT TO DO\r
+       JRST SYSTOP+1           ;NO - GO SAVE AC'S & DEVICE STATES\r
+TSTLOC:        JRST SYSTOP\r
+\r
+SYSTOP:        MOVEM 17,CRSHAC+17      ;SAVE ALL ACS\r
+       MOVEI 17,CRSHAC         ;SOURCE==0, DESTINATION==CRSHAC\r
+       BLT 17,CRSHAC+16        ;SO DDT CAN LOOK AT SAVED CRASH LATER\r
+\r
+APRSTS:        CONI APR,.              ;STORE APR STATUS HERE\r
+PISTS: CONI PI,.               ;STORE PI STATUS HERE\r
+SWTSTS:        DATAI APR,.\r
+TTYSTS:        CONI TTY,.\r
+PTRSTS:        CONI PTR,.\r
+PTPSTS:        CONI PTP,.\r
+DLSSTS:        CONI DLS,.\r
+DTSSTS:        CONI DTS,.\r
+CRSTS: CONI CR,.\r
+LPTSTS:        CONI LPT,.\r
+PLTSTS:        CONI PLT,.\r
+TMSSTS:        CONI TMS,.\r
+TMCSTS:        CONI    TMC,.\r
+DSKSTS:        CONI    DSK,.\r
+DSKDTI:        DATAI   DSK,.\r
+       CONO APR,APRRST         ;RESET SYSTEM\r
+       MOVEI   PDP,SYSPDL      ;SETUP PDP TO SPARE AREA\r
+       IFG DSKN, <\r
+       EXTERN DSKSTP\r
+       PUSHJ   PDP,DSKSTP>\r
+       HALT 137400             ;STOP AT TENDMP(READY TO READ IN ANYTHING)\r
+;ERROR RECOVERY - TRY TO START NULL JOB\r
+\r
+NULJB1:        MOVEI ITEM,0    ;SET JOB NUMBER TO 0\r
+       JRST NULJOB     ;GO RESTORE NULL JOB\r
+\f\r
+\r
+\r
+;COMMON SUBROUTINE RETURNS\r
+\r
+       INTERN CPOPJ,CPOPJ1,DPOPJ,TPOPJ,TPOPJ1,CPOPJ2,IPOPJ1,IPOPJ\r
+       INTERN CUXIT1,CUXIT,UXIT\r
+       INTERN FTTIME,FTSWAP,FTSLEEP,FTKCT,FT2REL,FTPRV\r
+CPOPJ2:        AOS     (PDP)           ;DOUBLE SKIP SUBROUTINE RETURN\r
+CUXIT1:                                ;OLD SKIP RETURN FOR UUOS\r
+CPOPJ1:        AOSA    (PDP)           ;SKIP SUBROUTINE RETURN\r
+DPOPJ: MOVEM   IOS,DEVIOS(DEVDAT) ;DEPOSIT I/O STATUS WORD IN DDB\r
+UXIT:\r
+CUXIT:                         ;OLD RETURN FOR UUOS\r
+CPOPJ: POPJ    PDP,\r
+\r
+TPOPJ1:        AOS     -1(PDP)         ;RESTORE TAC THEN SKIP RETURN\r
+TPOPJ: POP     PDP,TAC         ;RESTORE TAC\r
+       POPJ    PDP,            ;AND RETURN\r
+IPOPJ1:        AOS -1(PDP)             ;SET FOR SKIP RETURN\r
+IPOPJ: POP PDP,ITEM            ;RESTORE ITEM (USUALLY JOB OR HIGH SEG NUMBER)\r
+       POPJ PDP,\r
+\r
+\f; SYSTEM BYTE POINTERS\r
+\r
+       INTERN PUUOAC,PIOMOD,PJOBN,PUNIT,PJBSTS,PDVTIM,PDVCNT,PCORSZ,COREP\r
+       INTERN IADPTR\r
+\r
+PUUOAC:        POINT   4,UUO,12        ;UUO AC FIELD\r
+PIOMOD:        POINT   4,IOS,35        ;MODE BITS\r
+PJOBN: POINT   6,DEVCHR(DEVDAT),5 ;DEVICE JOB ASSIGNMENT\r
+PUNIT: POINT   6,DEVCHR(DEVDAT),23 ;DEVICE UNIT NUMBER\r
+PJBSTS:        POINT   JWSIZ,JBTSTS(ITEM),JWPOS ;JOB WAIT STATE (QUEUE) CODE\r
+                               ;IN JOB STATUS WORD\r
+PDVTIM:        POINT   6,DEVCHR(DEVDAT),17 ;TIME IN SECONDS BEFORE DEVICE\r
+                                   ;IS SAID TO BE HUNG\r
+PDVCNT:        POINT   6,DEVCHR(DEVDAT),11 ;COUNTED DOWN EACH SECOND,\r
+                               ;1 TO 0 TRANSITION MEANS HUNG DEVICE\r
+IADPTR:        POINT   2,DEVIAD(DEVDAT),2      ;COUNT OF NUMBER OF USER CHANNELS INITED\r
+                               ; ON THIS DEVICE (DECTAPE ONLY)\r
+PCORSZ:        POINT 8,JBTADR(ITEM),7  ;BYTE POINTER TO LOW OR HIGH SEG CORE SIZE-1\r
+\r
+COREP: POINT   1,CORTAB        ;1 BIT POINTER TO CORE ALLOCATION TABLE\r
+\r
+       IFG SYS50N, <           ;SWAPPING SYSTEM ?\r
+       INTERN IMGIN,IMGOUT,IMGINT,OUTMSK,INMSK,INLEFT\r
+       INMSK=000377            ;RH MASK TO IMGIN\r
+       INLEFT=12               ;NUMBER OF BITS TO SHIFT TO LEFT JUSTIFY IN RH\r
+\r
+IMGIN: POINT 8,JBTSWP(ITEM),35 ;BYTE POINTER FOR # 1K BLOCKS OF CORE\r
+                               ;WHEN JOB OR HIGH SEG NEXT SWAPPED IN\r
+                               ;NON-ZERO ONLY WHEN SWAPPED OUT\r
+IMGOUT:        POINT 8,JBTSWP(ITEM),26 ;BYTE POINTER FOR # 1K BLOCK OF DISK\r
+                               ;WHEN JOB OR HIGH SEG HAS IMAGE ON DISK\r
+                               ;ZERO MEANS NO DISK SPACE ALLOCATED\r
+       OUTMSK=377000           ;RH MASK TO IMGOUT. USED TO TEST FOR 0\r
+                               ; (IE NO DISK SPACE)\r
+IMGINT:        POINT   8,JBTSWP(DEVDAT),35 ;POINTER TO INCORE IMAGE\r
+>\r
+\r
+\f;SPECIAL PROJECT-PROGRAMMER NUMBERS\r
+       IFG DSKN, <             ;DISK SYSTEM?\r
+       INTERN CUSPPP,SYSPP,DUMPPP,HELPPP\r
+\r
+CUSPPP:                        ;CUSP FILE DIRECTORY, MAKE SEPARATE TAG FROM\r
+                               ; MFD(SYSPP) \r
+SYSPP: XWD     1,1     ;THE MASTER FILE DIRECTORY PROJECT PROGRAMMER NO.\r
+DUMPPP:        XWD     1,2     ;THE FAILSAFE PROJ,PROG NO (CAN READ OF WRITE ANYTHING)\r
+HELPPP:        XWD     2,4     ;SYSTAT AND HELP PROJECT,PROGRAMMER NOS IF JOB NOT LOGGED IN ALREADY\r
+>\r
+\f;DEFINE PI CHANNEL SAVE AND RESTORE ROUTINES IF A DEVICE IS ON THE CHANNEL\r
+\r
+       HIGHAC==10      ;HIGHEST AC SAVE ON A PI INTERRUPT\r
+       PDL==25         ;LENGTH OF INTERRUPT PI PUSH DOWN LIST\r
+\r
+DEFINE CHAN (PI)<\r
+       XLIST\r
+       INTERN SAV'PI,RET'PI,CH'PI\r
+CH'PI: 0               ;PC STORED HERE BY JSR ON INTERRUPT TO CHANNEL PI\r
+       JEN @CH'PI      ;LAST INSTRUCTION ON CONSO DEV, CHAIN\r
+\r
+;HERE FROM AN INTERRUPT ROUTINE WHICH HAS FOUND ITS DEVICE NEEDS SERVICE\r
+;SAVE ACS 0 THRU HIGHAC, CALLED BY JSR, SETS UP PDP TO PUSH DOWN LIST FOR THIS PI\r
+\r
+SAV'PI:        0               ;CALLED BY JSR\r
+       MOVEM HIGHAC,SAVAC'PI+HIGHAC    ;SAVE AC HIGHAC\r
+       MOVEI HIGHAC,SAVAC'PI   ;SETUP TO SAVE 0 THRU HIGHAC-1\r
+       BLT HIGHAC,SAVAC'PI+HIGHAC-1    ;SAVE ACS\r
+       MOVE PDP,SAVAC'PI+HIGHAC+1      ;SETUP PUSH DOWN POINTER\r
+       JRST @SAV'PI                    ;RETURN TO CALLER AND PROCESS INTERRUPT\r
+\r
+;HERE FROM INTERRUPT ROUTINE WHEN IT HAS FINISHED SERVICING INTERRUPT\r
+;RESTORE ACS AND DISMISS INTERRUPT\r
+;USUALLY TRANSFERRED TO BY POPJ PDP,\r
+\r
+RET'PI:        MOVSI HIGHAC,SAVAC'PI   ;RESTORE ACS 0 THRU HIGHAC\r
+       BLT HIGHAC,HIGHAC\r
+       JEN @CH'PI              ;DISMISS INTERRUPT ON THIS PI CHANNEL\r
+\r
+SAVAC'PI:      BLOCK HIGHAC+1  ;PLACE TO SAVE ACS 0 THRU HIGHAC\r
+       XWD -PDL+1,.+1          ;INITIAL PUSH DOWN POINTER\r
+CH'PI'PD1:     EXP RET'PI      ;FIRST WORD ON LIST,\r
+                               ; POPJ WILL RETURN TO DISMISS INTERRUPT\r
+       BLOCK PDL-1             ;PUSHDOWN LIST SPACE\r
+       LIST\r
+>\r
+\r
+\f;GENERATE THE CHANNEL SAVE ROUTINE ONLY FOR PI WHICH NEED THEM (ASGSAV MACRO USED)\r
+\r
+       IFN USED1, <CHAN 1>\r
+       IFN USED2, <CHAN 2>\r
+       IFN USED3, <CHAN 3>\r
+       IFN USED4, <CHAN 4>\r
+       IFN USED5, <CHAN 5>\r
+       IFN USED6, <CHAN 6>\r
+       IFN USED7, <CHAN 7>\r
+\r
+\r
+\r
+;GENERATE NULL CHANNEL SAVE ROUTINES FOR THOSE CHANNELS NOT USED\r
+\r
+DEFINE NULL (PI)<\r
+       XLIST\r
+       INTERN CH'PI\r
+CH'PI: 0\r
+       JEN @CH'PI\r
+       LIST\r
+>\r
+\r
+       IFE USED1, <NULL 1>\r
+       IFE USED2, <NULL 2>\r
+       IFE USED3, <NULL 3>\r
+       IFE USED4, <NULL 4>\r
+       IFE USED5, <NULL 5>\r
+       IFE USED6, <NULL 6>\r
+       IFE USED7, <NULL 7>\r
+\f;HERE ON TRAPS TO LOC 60/61 - UNIMPLEMENTED INSTRUCTIONS (PDP-10 ONLY)\r
+;OPCODE AND EFFECTIVE ADDRESS STORED IN SIXTY AND 61 EXECUTED (JSR UUO2)\r
+;OP CODE 100 (UJEN) IS USED TO DISMISS USER MODE INTERRUPTS FOR REAL TIME OPERATION\r
+;USED IN CONJUNCTION WITH TRPSET UUOWHICH IS SOON TO BE REPLACED\r
+;WITH SOME KNAVE-PROOF REAL TIME UUOS.  THIS CODE IS HERE ONLY\r
+;BECAUSE MANUAL DESCRIBES TRPSET AND TRPJEN UUOS.\r
+;TRPJEN HAS BEEN REPLACED WITH OPCODE 100 (UJEN).\r
+;CALL: UGEN U                  ;WHERE U CONTAINS PC STORED BY INTERRUPT JSR\r
+\r
+       INTERN UUO2\r
+\r
+UUO2:  0                       ;USER PC STORE HERE BY JSR\r
+       EXCH TAC,UUO2           ;GET USER PC, SAVE TAC\r
+IFN FTTRPSET, <\r
+       TLNN TAC,UIOMOD         ;USER I/O MODE ON ?\r
+       JRST UUOER2             ;NO, TREAT AS AN ILLEGAL INSTRUCTION AND PRINT MESS.\r
+       HLL TAC,SIXTY           ;YES, GET UNIMPLEMENTED OPCODE WHICH TRAPPED\r
+       TLNE TAC,677777         ;IS IT OPCODE 100 (UJEN)?\r
+       JRST UUOER1             ;NO, TREAT AS ILLEGAL INSTRUCTION\r
+       MOVE TAC,SIXTY          ;YES, GET EFFECTIVE ADDRESS\r
+       ADD TAC,JOBADR          ;ADD RELOCATION FOR CURRENT JOB\r
+       MOVE TAC,(TAC)          ;GET PC STORED BY INTERRUPT JSR\r
+       EXCH TAC,UUO2           ;RESTORE TAC, AND STORE PC\r
+       JEN @UUO2               ;DISMISS INTERRUPT\r
+\r
+UUOER1:        HRLI TAC,USRMOD!UIOMOD  ;SET USER MODE AND USER I/O MODE BACK ON\r
+>\r
+UUOER2:        MOVEM TAC,UUO0          ;STORE PC AS IF AN ILLEGAL INSTR. HAD OCCURRED\r
+       SETOM FORTY             ;MAKE IT LOOK LIKE AN ILLEGAL INSTRUCTION\r
+                               ; TRAPPED TO 40\r
+       SKIPA TAC,UUO2          ;RETORE TAC AND FALL INTO REGULAR UUO HANDLER\r
+\f;HERE ON TRAPS TO EXEC LOC 40/41 - OPCODES 0,40-77 (0-77 ON PDP-6)\r
+\r
+       INTERN UUO0\r
+       EXTERN UUOUSR,UUOSY1,ERROR\r
+\r
+UUO0:  0                       ;JSR HERE FROM LOC 41\r
+       MOVEM 17,USRSAV         ;SAVE 17\r
+       MOVE 17,UUO0            ;GET PROCESSOR FLAGS\r
+       TLNN 17,USRMOD          ;IS UUO FROM MONITOR ?\r
+       JRST UUOSY1             ;YES, DO NOT SAVE ACS\r
+       SKIPN 17,JOBADR         ;IS THERE A JOB DATA AREA ?\r
+       JSP DAT,ERROR           ;NO, MUST BE UUO DURING NULL JOB\r
+                               ; PRINT ERROR IN MONITOR\r
+IFE PDP10N, <                  ;FOR PDP-6 OPCODES 1-37\r
+       EXCH TAC,FORTY          ;SAVE TAC, PICK UP UUO\r
+       TLNN TAC,740000         ;IS THIS SYSTEM UUO ?\r
+       TLNN TAC,077000         ;NO, IS IT 0 UUO ?\r
+       JRST UUOSYS             ;YES\r
+       MOVEM TAC,40(17)        ;STORE UUO IN USER'S 40\r
+       HRRZ TAC,41(17)         ;PICK UP ADR OF USER'S JSR\r
+       JUMPE TAC,UUOSY2        ;IF ADDRESS=0,ILLEGAL USER UUO****UWA PATCH\r
+       HLL TAC,UUO0            ;USER PD FLAGS (RESTORED ON RETURN)\r
+       MOVEI 17,(TAC)          ;17 NOW HAS REL.ADR+1 OF USER JSR\r
+       CAML 17,USRREL          ;IS EFFECTIVE ADDRESS IN BOUNDS ?\r
+       JRST UUOSY0             ;ERROR, JSR EFF. ADDR. OUTSIDE USER AREA\r
+       HRRI TAC,1(TAC)         ;YES, INCREMENT PC.\r
+       EXCH TAC,UUO0           ;SET UP RETURN TO USER IN UUO0\r
+                               ; PICKUP USERS FLAGS,PC\r
+       ADD 17,JOBADR           ;MAKE REL. ADDRESS INTO ABSOLUTE ADDRESS\r
+       MOVEM TAC,(17)          ;STORE FLAGS AND PC LIKE JSR\r
+       MOVE TAC,FORTY          ;RESTORE TAC\r
+       MOVE 17,USRSAV          ;RESTORE 17\r
+       JRST 2,@UUO0            ;RETURN TO USER (RESTORING FLAGS)\r
+\r
+UUOSY0:        MOVE 17,JOBADR          ;SETUP 17 FOR LOW SEGMENT RELOCATION\r
+UUOSY2:        EXCH TAC,FORTY          ;RESTORE USERS AC(TAC) AND USER'S UUO (FORTY)\r
+>              \r
+       JRST UUOUSR             ;GO SAVE USER'S ACS IN REL. LOCATION 0-17\r
+                               ; AND DISPATCH ON UUO\r
+\f;GENERATE EXTERNAL GLOBALS TO CAUSE LOADING OF PROPER ROUTINES FROM MONITOR LIBRARY TAPE\r
+;IF THERE IS ONE\r
+\r
+\r
+;ALWAYS LOAD CLOCK1,COMCON,CORE1,ERRCON,JOBDAT,ONCE,PATCH,SYSMAK,UUOCON\r
+\r
+EXTERNAL CLOCK1,COMCON,CORE1,ERRCON,DATJOB,ONCE,PATCH,SYSMAK,UUOCON\r
+\r
+;LOAD DDT\r
+       IFG DDTN, <EXTERN DDTX>\r
+       IFE DDTN, <XP DDTEND,0  ;ONCE REFERENCES END OF DDT>\r
+\r
+;LOAD SCHEDULER FOR NON-SWAPPING OR SWAPPING SYSTEM\r
+       IFG SYS40N,<EXTERN XCKCSS>      ;CLKCSS\r
+       IFG SYS50N,<EXTERN XCKCSW>      ;SCHED\r
+\r
+;LOAD EITHER SEGCON (2REG SOFTWARE) OR NULSEG (1 REG SOFTWARE)\r
+; UNLESS USER HAS EDITTED S WITH FT2REL=0 SO ALL PUSHJ'S\r
+; TO SEGCON (NULSEG) ARE REMOVED\r
+\r
+IFN FT2REL, <\r
+       IFG KT10AN, <EXTERN SEGCON>\r
+\r
+       IFE KT10AN, <EXTERN NULSEG>\r
+>\r
+\r
+\r
+;APR AND PI BITS\r
+       INTERN  PION,PIOFF,REQCLK,PICLK,APRCLR,APRCLE,APRNUL,APRRST,NXM,APRFOV\r
+\r
+       CLKBIT==1\r
+       REPEAT 7-CLKCHN, <CLKBIT==CLKBIT*2>\r
+       PION==200               ;CONO PI,PION TURNS PI SYSTEM ON\r
+       PIOFF==400              ;TURN IT OFF\r
+       REQCLK==1B24+CLKBIT     ;REQUEST INTERRUPT ON LOW PRIORITY CLK CHANNEL\r
+       PICLK=PION+REQCLK       ;TURN ON PI,REQUEST INTERRUPT ON CLK CHANNEL\r
+       APRCLR==1000+APRCHN     ;TURN APR CLOCK FLAG OFF\r
+       APRCLE==431550+APRCHN   ;CLEAR ALL APR ERROR BITS\r
+                               ; AND DISABLE FOV AND AR OVF\r
+       APRNUL==433550+APRCHN   ;RESET APR FOR NULL JOB\r
+                       ; CLEAR EVERYTHING BUT DON'T I/O RESET\r
+       APRRST==APRNUL+200000   ;RESET APR FOR SYSINI (I/O RESET TOO)\r
+       NXM==10000              ;NON-EX MEM (APR STATUS WORD)\r
+       IFG PDP10N,<APRFOV==100 ;FLOADTING OVERFLOW CAN BE ENABLED ON PDP10\r
+                               ; FOR USER TRAPPING>\r
+       IFE PDP10N,<APRFOV==000 ;PC CHANGE CANNOT BE ENABLED ON PDP-6, BEACUSE\r
+                               ; IT MAKES MONITOR TRAP ALSO>\r
+\r
+;MAKE SURE THAT PROPER VERSION OF FEATURE SWITCH FILES WERE USED TO ASSEMBLE\r
+;THE REST OF THE MONITOR\r
+;THE LOADER WILL PRINT NUL. DEF. GLOBAL IF A MISTAKE HAS BEEN MADE\r
+       XP FTDISK,-DSKN\r
+       XP FTSWAP,-SYS50N\r
+       XP FTRC10,-RD10N\r
+\r
+       IFG KT10AN,<XP FT2REL,-1>       ;IF Z RELOC SOFTWARE, THEN FTZREI MUST BE -1\r
+       IFE COREN,<COREN=^D256          ;NO RESTRICTION IF 0 TYPED>\r
+       XP USRLIM,COREN                 ;DEFINE GLOBAL RESTRICTING SIZE OF CRE FOR ANY SINGLE USER\r
+                                       ; ONCE ONLY CODE CAN ALTER THIS VALUE\r
+                                       ; (PATCH RH CORLIM IN SYSIM)\r
+\f;SCANNER ENTRY POINTS AND BIT DEFINITIONS\r
+\r
+       IFG DLSN, <EXTERN DLSINT>       ;DATA LINE SCANNER\r
+       IFG CCIN, <EXTERN CCIINT>       ;DA-10 PDP-8 680\r
+       IFG DCSN, <EXTERN DCSINT>       ;630 DATA COMMUNICATIONS SYS\r
+\r
+       IFG FULLN, <EXTERN SCNSRF>      ;FULL DUPLEX SOFTWARE ENTRY POINT\r
+       IFE FULLN, <EXTERN SCNSRH>      ;HALF DUPLEX SOFTWARE ENTRY POINT\r
+\r
+       IFG FULLN, <\r
+       INTERN LINTAB\r
+\r
+LINTAB:                ;LINE CHARACTERISTICS BITS (NOT CLEARED ON SYSTEM STARTUP)\r
+\r
+;TELETYPE LINE CHARACTERISTICS (LH OF LINTAB)\r
+;USED IN SCNSRF ALSO\r
+\r
+       XP PTYLIN,400000        ;PSEUDO TTY LINE\r
+       XP CTYLIN,200000        ;CONSOLE TTY\r
+       XP DISLIN,100000        ;KEYBOARD DISPLAY\r
+       XP DSDTLN, 40000        ;DATASET DATA LINE\r
+       XP DSCTLN, 20000        ;DATASET CONTROL LINE(DC10E)\r
+       XP HLFDPX, 10000        ;HALF DUPLEX LINE\r
+       XP TTYRMT,  4000        ;REMOTE TTY\r
+       XP    T35,    10        ;TTY HAS HARDWARE TABS\r
+       XP FULTWX,     4        ;SELF-ECHOING LINE\r
+                               ;USED IN CCIINT,DCSINT,DLSINT & SCNSRF\r
+\r
+IFG EDITN,<            ;HAS COMMON.MAC BEEN EDITED TO DEFINE TTY LINE CHAR.\r
+                       ; SO MONGEN TYPE-IN REDUCED?\r
+;IF NO APR NUMBER, AND THIS IS NOT EDITED FOR THE CUSTOMER,\r
+; MAKE ALL LIENS JUST BE MODEL 33 TELETYPES\r
+\r
+IFE APRN,<REPEAT TTPLEN,<0>>\r
+\r
+IFE APRSN-2,<\r
+;FOLLOWING LINE DEFINITIONS FOR DEC PDP12 #2\r
+\r
+       XWD T35,0       ;TTY0\r
+       XWD T35,0       ;TTY1\r
+       XWD T35,0       ;TTY2\r
+       XWD 0,0         ;TTY3\r
+REPEAT 3,<     XWD T35,0>;TTY4-6\r
+       XWD T35+TTYRMT,0        ;TTY7 - REMOTE 35\r
+       XWD DSDTLN,0    ;TTY10\r
+       XWD DSDTLN+HLFDPX,0     ;TTY11\r
+       XWD DSDTLN,0    ;TTY12\r
+REPEAT 4,<     XWD T35,0>;TTY13-16\r
+REPEAT 8,<XWD TTYRMT,0>\r
+>\r
+\r
+IFE APRSN-^D40,<\r
+;THIS CONFIGURATION FOR DEC SYSTEM NUMBER 40\r
+\r
+REPEAT ^D8,<0          ;MODEL 33'S LOCALLY>\r
+\r
+REPEAT ^D8,<   XWD DSDTLN,0    ;DATASET>\r
+>\r
+\r
+; CTY AND PTY SET BY SCNSER\r
+>      ;END PRE-EDITED LINE CHARACTERISTICS\r
+\f\r
+\r
+IFE EDITN,<            ;MONGEN DIALOG DEFINE TTY CONFIG?\r
+\r
+DEFINE GENLIN(LIN)<\r
+       IFNDEF DSD'LIN,<DSD'LIN=0>      ;DATA SET?\r
+       IFNDEF TAB'LIN,<TAB'LIN=0>      ;HARDWARE TABS?\r
+       IFNDEF RMT'LIN,<RMT'LIN=0>      ;REMOTE?\r
+       IFNDEF HLF'LIN,<HLF'LIN=0>      ;HALF DUPLEX SCANNER?\r
+       XWD DSD'LIN*TAB'LIN*T35+RMT'LIN*TTYRMT+HLF'LIN*HLFDPX,0\r
+>\r
+\r
+REPEAT HGHLIN+1,<LINE=.-LINTAB         ;DEFINE LINE NUMBER\r
+       GENLIN \LIN>\r
+>\r
+       LOC LINTAB+TTPLEN       ;MAKE SURE ENOUGH SPACE FOR CTY+PTY;S\r
+\r
+>      ;END OF FULL DUPLEX CONDITIONAL\r
+\r
+       INTERN FSNCHN,SCNON,SCNOFF\r
+\r
+       FSNCHN==SCNCHN*101      ;CHANNEL ASSIGNMENT FOR FULL DUPLEX SCN.\r
+       SCNBIT==<1_<7-SCNCHN>>\r
+       SCNON==2000+SCNBIT      ;CONO PI, TURNS SCANNER PI CHANNEL ON\r
+       SCNOFF==1000+SCNBIT     ;CONO PI, TURNS SCANNER PI CHANNEL OFF\r
+       IFG TABSN, <TTMODL=-1>  ;HARDWARD TABS\r
+       IFE TABSN, <TTMODL=0>\r
+XP SCNNUM,HGHLIN+1             ;# OF SCANNER LINES (USED BY ONCE FOR PRINTING CONFIG)\r
+\f;MAGTAPE ENTRY POINT AND BIT DEFINITIONS\r
+\r
+       IFG MTAN, <EXTERN MTASRX>       ;TM10 ENTRY POINT\r
+       IFG MTCN, <EXTERN MTCSR6>       ;PDP-6 MAGTAPES ENTRY POINT\r
+\r
+       IFG MTAN, <\r
+\r
+       INTERN MMTSIZ,MTALOC,MTLOC1,MTBOTH,MTFLAG\r
+\r
+       MMTSIZ==-MTSIZ\r
+       MTALOC==40+2*MTDCHN             ;BLKI/BLKO LOCATION\r
+       MTLOC1==MTALOC+1                ;NEXT LOCATION\r
+       MTBOTH==MTACHN*10+MTDCHN        ;BOTH PI CHANNELS\r
+       MTFLAG==400+MTACHN*10\r
+>\r
+\r
+       IFG MTCN, <\r
+\r
+       INTERN  DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT\r
+\r
+       DCLOC==40+2*DCTCHN      ;EVEN DC PI CHANNEL LOCATION\r
+       DCLOC1==DCLOC+1         ;NEXT LOCATION\r
+               DCBIT==1\r
+               REPEAT 7-DCTCHN, <DCBIT==DCBIT*2>\r
+       DCON==2000+DCBIT        ;TURN DC PI CHANNEL ON\r
+       DCOFF==1000+DCBIT       ;TURN DC PI CHANNEL OFF\r
+       DCIN=4010+DCTCHN        ;SET DATA CHANNEL FOR INPUT\r
+       DCOUT==3410+DCTCHN      ;SET DATA CHANNEL FOR OUTPUT\r
+>\r
+\f\r
+;DECTAPE ENTRY POINT AND BIT DEFINITIONS\r
+\r
+       SAVN==1                         ;WE ONLY SUPPORT NEW FORMAT NOW\r
+                                       ;MONGEN NO LONGER ASKS QUESTION,\r
+\r
+       IFG DTAN, <EXTERN DTASRN>       ;TD10 WITH NEW FORMAT\r
+       IFG DTCN, <\r
+       IFG SAVN, <EXTERN DTCSRN>       ;556 WITH NEW FORMAT\r
+       IFE SAVN, <EXTERN DTCSRO>       ;556 WITH OLD FORMAT\r
+>\r
+       IFG DTAN, <     ;DEFINE SYMBOLS IF PDP-10 DECTAPES (TD10)\r
+       INTERNAL DTALOC,DTALC2,DTBOTH,DTTURN\r
+               DTALOC==40+2*DTDCHN     ;BLKI/BLKO LOCATION\r
+               DTALC2==DTALOC+1        ;NEXT LOCATION\r
+               DTBOTH==DTDCHN*10+DTACHN\r
+               DTTURN==300200+DTBOTH\r
+>\r
+       IFG DTCN, <     ;DEFINE SYMBOLS IF PDP-6 DECTAPES (556)\r
+       INTERNAL DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT\r
+               DCLOC==40+2*DCTCHN      ;EVEN DC PI CHANNEL LOC\r
+               DCLOC1==DCLOC+1         ;NEXT LOCATION\r
+               DCBIT==1\r
+               REPEAT 7-DCTCHN, <DCBIT==DCBIT*2>\r
+               DCON==2000+DCBIT        ;TURN DC PI CHANNEL ON\r
+               DCOFF==1000+DCBIT       ;TURN DC PI CHANNEL OFF\r
+               DCIN==4010+DCTCHN       ;SET DATA CHANNEL FOR INPUT\r
+               DCOUT==3410+DCTCHN      ;SET DATA CHANNEL FOR OUTPUT\r
+>\r
+\r
+;DEFINE SAVE MODE AND EXTENSION FOR OLD OR NEW FORMAT\r
+\r
+       INTERNAL SAVDMP\r
+       IFE SAVN, <XP SAVMOD,17\r
+               SAVDMP==<SIXBIT /   DMP/>       ;EXTENSION FOR SAVED FILES == "DMP"\r
+>\r
+       IFN SAVN, <\r
+               SAVDMP==<SIXBIT /   SAV/>       ;EXTENSION FOR SAVED FILES == "SAV"\r
+>\r
+\f;DISPLAY AND LITE PEN\r
+\r
+       IFG DISN,<\r
+       IFG T340N,<EXTERN DIS340>       ;TYPE 340 ENTRY POINT\r
+       IFE T340N,<EXTERN DIST30>       ;TYPE 30 ENTRY POINT\r
+       INTERN DISBLK,DISJSR,OFFDIS,DISPON,DISPOF\r
+               DISBLK==40+2*DISCHN     ;BLKI/BLKO LOCATION\r
+               DISJSR==DISBLK+1\r
+               ONDIS==100+10*PENCHN+DISCHN\r
+               NONDIS==10*PENCHN+DISCHN\r
+               OFFDIS==0\r
+               DISBIT==1\r
+               REPEAT 7-DISCHN, <DISBIT==DISBIT*2>\r
+               DISPON==2000+DISBIT     ;CONO PI, TURNS DIS PI CHANNEL ON\r
+               DISPOF==1000+DISBIT     ;CONO PI, TURNS DIS PI CHANNEL OFF\r
+>\r
+\f;LINE PRINTER ENTRY POINT AND DDB DEFINITIONS\r
+\r
+       IFG LPTN, <\r
+\r
+;PROTOTYPE DEFINITION FOR LINE PRINTER DEVICE DATA BLOCKS\r
+\r
+DEFINE LPTDDB (N) <\r
+\r
+       XLIST                           ;TURN OFF LISTING DURING EXPANSION\r
+\r
+LP'N'SV1=LP'N'SAC+DEVDAT               ;DEFINE DEVDAT SAVE LOCATION\r
+\r
+LP'N'INT: CONSO LP'N,0                 ;(-4) SKIP IF INTERRUPT FOR THIS LPT\r
+         JRST .-1                      ;(-3)  GO TO NEXT SKIP CHAIN ELEMENT\r
+         MOVEM DEVDAT,LP'N'SV1         ;(-2) SAVE DEVDAT IN CHANNEL SAVE AREA\r
+         JSP DEVDAT,LPTINT             ;(-1) SET UP DDB ADDRESS AND BRANCH\r
+LP'N'DDB:\r
+LP'N'NAM: \r
+       \r
+       IFE LPTN-1, < SIXBIT /LPT/      ;( 0) PHYSICAL DEVICE NAME>\r
+       IFN LPTN-1, < SIXBIT /LPT'N/    ;( 0) PHYSICAL DEVICE NAME>\r
+         XWD ^D60*HUNGST,<N>B23+LPTSIZ    ;( 1) DEVICE CHARACTERISTICS\r
+         0                             ;( 2) DEVICE I/O STATUS\r
+         XWD 0,LPTDSP                  ;( 3) LH=DDB LINK, RH=DSP TABLE ADDR.\r
+LPTMOD==1_A+1_AL+1_I                   ;LPT LEGAL MODES\r
+         XWD DVOUT+DVLPT,LPTMOD        ;( 4) DEVICE CHARACTERISTICS\r
+         0                             ;( 5) LOGICAL DEVICE NAME\r
+         0                             ;( 6) BUFFER HEADER ADDRESSES\r
+LP'N'PTR: 0                            ;( 7) BLOCK OUTPUT POINTER\r
+         XWD PROG,0                    ;(10) CURRENT OUTPUT BUFFER ADDRESS\r
+         EXP 11*LP'N'CHN               ;(11) INTERRUPT CHANNEL ASSIGNMENTS\r
+\r
+         MOVE DEVDAT,LP'N'SV1          ;(12) RESTORE DEVDAT, SAVE AC'S\r
+         JSR LP'N'SAV                  ;(13)  AND ESTABLISH PDP\r
+         MOVEI DEVDAT,LP'N'NAM         ;(14) SET UP DDB ADDRESS AND RETURN\r
+         JRST LPTNXT                   ;(15)  TO COMMON INTERRUPT HANDLER\r
+\r
+         MOVE DEVDAT,LP'N'SV1          ;(16) RESTORE DEVDAT AND\r
+         JEN @LP'N'CHL                 ;(17)  DISMISS INTERRUPT\r
+         0                             ;(20) SAVE LOCATION FOR DAT\r
+         CONSZ LP'N,LPTECM             ;(21) THE REST OF THE DDB CONTAINS\r
+         CONSO LP'N,LPTDON             ;(22)  THE ACTUAL I/O INSTRUCTIONS\r
+         CONSO LP'N,(DAT)              ;(23)  USED BY THE COMMON SERVICE\r
+         CONSZ LP'N,(DAT)              ;(24)  ROUTINE TO CONTROL A LINE\r
+         CONI  LP'N,DAT                ;(25)  PRINTER. THEY ARE EXECUTED\r
+         CONO  LP'N,(DAT)              ;(26)  BY MEANS OF AN XCT INSTRUCTION\r
+         DATAO LP'N,(DAT)              ;(27)  INDEXED TO THE PROPER DDB\r
+         BLKO  LP'N,LP'N'PTR           ;(30)\r
+\r
+       LIST                            ;TURN LISTING BACK ON AFTER EXPANSION\r
+\f\r
+>\r
+       EXTERN LPTSER, LPTNXT, LPTECM, LPTDON, LPTINT, LPTDSP\r
+\r
+       LPT2=234                ;DEVICE SELECT CODE FOR SECOND LPT\r
+\r
+       IFNDEF LP0, <LP0=LPT>   ;DEFINE STANDARD MNEMONIC DEFINITIONS\r
+       IFNDEF LP1, <LP1=LPT2>  ; BUT ALLOW FOR OVERRIDE\r
+\r
+       $LPNUM=0                ;TEMPORARY SYMBOL USED TO FACILITATE\r
+                               ; MACRO GENERATION\r
+\r
+\r
+       REPEAT LPTN, <\r
+\r
+               LPTDDB \$LPNUM\r
+               $LPNUM=$LPNUM+1\r
+       >\r
+\r
+>\r
+\r
+\f;CARD READER ENTRY POINT AND BITS\r
+\r
+       IFG CDRN, <\r
+       IFG CR10N, <EXTERN CDRSRX>      ;CR10 ENTRY POINT\r
+       IFE CR10N, <EXTERN CDRSR6>      ;PDP-6 CARD READER\r
+       INTERNAL CDRBTS\r
+               CDRBTS==1670+CDRCHN\r
+>\r
+\r
+\r
+;CARD PUNCH ENTRY POINT\r
+\r
+       IFG CDPN, <\r
+               EXTERN CDPSER           ;ENTRY POINT\r
+       >\r
+\f;PLOTTER ENTRY POINT\r
+\r
+       IFG PLTN,<EXTERN PLTSER>\r
+\r
+;PAPER TAPE READER ENTRY POINT AND MASK\r
+\r
+       IFG PTRN, <EXTERN PTRSER        ;SAME ROUTINE FOR PDP-6 AND PDP-10 READER\r
+       INTERN PTRMSK\r
+               IFG PDP10N, <PTRMSK==0>         ;MASK==0 IF PDP-10 READER\r
+               IFE PDP10N, <PTRMSK==777777>    ;MASK==777777 FOR PDP-6 READER\r
+>\r
+\r
+\r
+;PAPER TAPE PUNCH ENTRY POINT\r
+\r
+       IFG PTPN,<EXTERN PTPSER>\r
+\f;DISK ENTRY POINTS AND BITS\r
+\r
+\r
+       IFG DSKN,<\r
+       INTERN DSKBIT,DCBBIT,DSKON,DSKOFF\r
+               DCBBIT==0       ;0 UNLESS DATA PRODUCTS DISK(SEE BELOW)\r
+               DSKBIT==1       ;LOW PRIORITY DISK PI CHANNEL\r
+               REPEAT 7-DSKCHN,<DSKBIT==DSKBIT*2>\r
+               DSKON==2000+DSKBIT      ;CONO PI, TURN DISK CHANNEL ON\r
+               DSKOFF=1000+DSKBIT      ;CONO PI, TURN DISKCHANNEL OFF\r
+       IFG RD10N,<     ;BURROUGHS DISK\r
+               EXTERN RCXINT,DSKSRB,RCXWNZ     ;LOAD EARLIER VERSION\r
+                                       ; DSKINT,DSKSRB,ONCEB\r
+               IFG SYS50N,<EXTERN RCXSKD>      ;LOAD EARLIER VERSION OF SCHEDB\r
+       >\r
+       IFG DPDN,<      ;IF DATA PRODUCTS DISK\r
+               EXTERNAL LODINT         ;LOAD DPDINT\r
+               EXTERNAL DSKSRD         ;LOAD ONCE=DSKSR FOR DATA PROD DISK\r
+\r
+               INTERN DCBBIT,DSKX8,DSKX9\r
+                       DCBBIT==1\r
+                       REPEAT 7-DCBCHN,<DCBBIT==DCBBIT*2>\r
+                       DSKX8==40+2*DCBCHN      ;DATA-CONTROL BLKI/BLKO OCS\r
+                       DSKX9==DSKX8+1\r
+       >\r
+       IFG RA10N,<     ;IF BRYANT DISK\r
+               EXTERN MDFINT,DSKSER,MDFWNZ\r
+       IFG SYS50N,<EXTERN RCXSKD>\r
+       >\r
+>\r
+\r
+;PSEUDO TTY ENTRY POINT\r
+\r
+       IFE PTYN, <INTERN PTYPE,PTMNMZ,PTYOW,PTMNMD\r
+PTYPE:PTMNMZ:PTYOW:PTMNMD:     HALT CPOPJ      ;HALT IF SCNSER CALL PTY ROUTINES\r
+                                               ; BECAUSE NONE LOADED\r
+>\r
+       IFG PTYN, <\r
+       IFE FULLN,<EXTERN PTYSRH>       ;HALF DUPLEX SCANNER SOFTWARE\r
+       IFG FULLN,<EXTERN PTYSRF>       ;FULL DUPLEX SCANNER SOFTWARE\r
+>\r
+       LIT\r
+       RELOC .-COMORG          ;NOW MAKE RELOCATABLE SO NEXT PROGRAM WILL BE LOADED\r
+                               ; IMMEDIATELY AFTER THIS ONE\r
+\r
+COMEND: END\r
+\r
diff --git a/src/conall.ccl b/src/conall.ccl
new file mode 100644 (file)
index 0000000..af2c7d9
--- /dev/null
@@ -0,0 +1,31 @@
+CLOCK1,CLOCK1/C_S,FT40N,CLOCK1/N\r
+CLKCSS,CLKCSS/C_S,FT50SB,CLKCSS/N\r
+COMCON,COMCON/C_S,FT50SB,COMCON/N\r
+COMMON,COMMON/C_S,CONFIG,COMMON/N\r
+CORE1,CORE1/C_S,FT50SB,CORE1/N\r
+DIS340,DIS340/C_S,DISSER/N\r
+DIS34,DIS30/C_S,DIST30,DISSER/N\r
+DCSINT,DCSINT/C_S,DCSINT/N\r
+DLSINT,DLSINT/C_S,DLSINT/N\r
+DPDINT,DPDINT/C_S,DPDINT/N\r
+DSKINT,DSKINT/C_S,DSKINT/N\r
+DSKSER,DSKSER/C_S,FT50SB,DSKSER/N\r
+DTCSRN,DTCSRN/C_S,FT50SB,DTCSRN/N\r
+DTASRN,DTASRN/C_S,FT50SB,DTASRN/N\r
+EDDT,EDDT/C_EDDT/N\r
+ERRCON,ERRCON/C_S,ERRCON/N\r
+JOBDAT,JOBDAT/C_JOBDAT/N\r
+LPTSER,LPTSER/C_S,LPTSER/N\r
+MTCSR6,MTCSR6/C_S,MTCSR6/N\r
+MTASRX,MTASRX/C_S,MTASRX/N\r
+NULSEG,NULSEG/C_S,FT50SB,NULSEG/N\r
+PLTSER,PLTSER/C_S,PLTSER/N\r
+PTRSER,PTRSER/C_S,PTRSER/N\r
+PTPSER,PTPSER/C_S,PTPSER/N\r
+PTYSRF,PTYSRF/C_S,PTYSRF/N\r
+PTYSRH,PTYSRH/C_S,PTYSRH/N\r
+PATCH,PATCH/C_PATCH/N\r
+ONCEB,ONCEB/C_S,FT50SB,ONCEB/N\r
+SCNSRF,SCNSRF/C_S,FT50SB,SCNSRF/N\r
+SCHEDB,SCHEDB/C_S,FT50SB,SCHEDB/N\r
+UUOCON,UUOCON/C_S,FT50SB,UUOCON/N\r
diff --git a/src/config.mac b/src/config.mac
new file mode 100644 (file)
index 0000000..f742e73
--- /dev/null
@@ -0,0 +1,227 @@
+SUBTTL CONFIG - CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN DIALOG\r
+\r
+\r
+;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER\r
+\r
+;SHORT DIALOG?[N = LONGER QUESTIONS]\r
+;Y\r
+\r
+\r
+;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM]\r
+;N\r
+\r
+\r
+;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM]\r
+;N\r
+\r
+XP SYS40N,0\r
+XP SYS50N,1\r
+XP DSKN,1\r
+XP LOGINN,1\r
+\r
+;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES,\r
+;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING]\r
+;Y\r
+\r
+XP RD10N,1\r
+\r
+;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE]\r
+;Y\r
+\r
+XP RDSWPN,1\r
+\r
+;RP10 (MEMOREX) DISK PACKS?\r
+;N\r
+\r
+XP RP10N,0\r
+XP RPSWPN,0\r
+\r
+;RA10 (BRYANT) DISK?\r
+;N\r
+\r
+XP RA10N,0\r
+XP RASWPN,0\r
+\r
+;DPD (DATA PRODUCTS) DISK?\r
+;N\r
+\r
+XP DPDN,0\r
+XP DPSWPN,0\r
+\r
+;HOMW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB]\r
+;28\r
+XP JOBN,34\r
+\r
+;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER?\r
+;0 MEANS ALL OF CORE\r
+;0\r
+XP COREN,0\r
+\r
+;PDP-10 PROCESSORE?[N = PDP-6]\r
+;Y\r
+\r
+XP PDP10N,1\r
+\r
+;2 RELOCATION REG, SOFTWARE?[Y = MUST HAVE KT10A,\r
+;N = JUST 1 RELOC. REG.]\r
+;Y\r
+\r
+XP KT10AN,1\r
+\r
+\r
+;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU\r
+;ANTICIPATE A LOT OF DORMANT SEGMENTS]\r
+;0\r
+XP SEGN,0\r
+\r
+;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE]\r
+;Y\r
+\r
+XP DDTN,1\r
+\r
+;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE]\r
+;Y\r
+\r
+\r
+;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER,\r
+;USE USER DDT FOR PATCHING UNDER TIME SHARING]\r
+;Y\r
+\r
+XP UDDTN,1\r
+\r
+;NAME OF THIS SYSTEM (24 CHARS OR LESS)?\r
+DEFINE SYSNAM\r
+<      ASCIZ \4S47   DEC PDP-10 #2\>\r
+\r
+;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR?\r
+;2\r
+XP APRSN,2\r
+\r
+\r
+;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM,\r
+;DSK USUAL FOR 10/50 SYSTEM]\r
+DEFINE SYSDEV\r
+<      SIXBIT "DSK">\r
+DEFINE SYSDAT\r
+<      ASCIZ /6-3-69/>\r
+\r
+;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630]\r
+;Y\r
+\r
+XP DLSN,1\r
+XP CCIN,0\r
+XP DCSN,0\r
+\r
+;HIGHEST (OCTAL) LINE NUMBER?[USUALLY 7,17,27, ETC. FOR DC-10 OR 630\r
+;10, 20, 30 ETC. FOR 680 (TO ALLOW FOR PDP-8 CTY)]\r
+;27\r
+XP HGHLIN,27\r
+\r
+;FULL DUPLEX TTY SOFTWARE?[N = OLD HALF DUPLEX SOFTWARE]\r
+;Y\r
+\r
+XP FULLN,1\r
+XP TABSN,0\r
+\r
+;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION?\r
+;[N = WILL ALLOW YOU TO DEFINE NOW]\r
+;Y\r
+\r
+XP EDITN,1\r
+\r
+;PT READER?\r
+;Y\r
+\r
+PTRN=1         ;NOT GLOBAL BECAUSE OF DSKSER USE\r
+\r
+;PT PUNCH?\r
+;Y\r
+\r
+XP PTPN,1\r
+\r
+;PLOTTER?\r
+;Y\r
+\r
+XP PLTN,1\r
+\r
+;HOW MANY LINE PRINTERS?\r
+;1\r
+XP LPTN,1\r
+\r
+;CARD READER?\r
+;Y\r
+\r
+\r
+;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER]\r
+;Y\r
+\r
+XP CDRN,1\r
+XP CR10N,1\r
+\r
+;CARD PUNCH\r
+;N\r
+\r
+XP CDPN,0\r
+\r
+;DISPLAY?\r
+;N\r
+\r
+XP DISN,0\r
+XP PENN,0\r
+XP T340N,0\r
+\r
+;HOW MANY DECTAPES?\r
+;8\r
+\r
+;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE]\r
+;Y\r
+XP DTAN,10\r
+XP DTCN,0\r
+\r
+;HOW MANY MAGTAPES?\r
+;3\r
+\r
+;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES]\r
+;Y\r
+\r
+XP MTAN,3\r
+XP MTBN,0\r
+XP MTCN,0\r
+\r
+;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE]\r
+;2\r
+XP PTYN,2\r
+;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED. TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]\r
+RADIX 10\r
+\r
+RADIX 8\r
+;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES\r
+;[WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK.\r
+;"DEVICE" MUST BE 5 CHARCATERS OR LESS,\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]\r
+DEFINE SPCINT\r
+<\r
+>;TYPE "DEVICE-MNEMNIC,CHANNEL,NO.-OF-DEVICES"\r
+;[FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES AND DEVICE DATA BLOCKS\r
+;"DEVICE" MUST BE 5 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETUERN WHEN THROUGH.]\r
+DEFINE SPCSAV\r
+<\r
+>;MONGEN FINISHED\r
+;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO\r
+;THEN LOAD IT AND REST OF MONITOR WITH LOADER\r
+;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE\r
+\r
+;[TO ASSEMBLE COMMON, TYPE\r
+;R MACRO\r
+;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON\r
+;TO LOAD NEW MONITOR, TYPE\r
+;R LOADER\r
+;/S\r
+;DSK:COMMON,DSK:SYS50/L\r
+;LPT:_/W/D/A/M/P/G\r
+;TO SAVE MONITOR, TYPE\r
+;SAVE DSK MONITOR\r
+;]\r
+;      ;END OF CONFIGURATION DEFINITION\r
diff --git a/src/core1.mac b/src/core1.mac
new file mode 100644 (file)
index 0000000..1b96cdb
--- /dev/null
@@ -0,0 +1,631 @@
+TITLE CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION ROUTINES - V414\r
+SUBTTL T. HASTINGS/TH/RCC  TS  04 JUN 69\r
+XP VCORE1,414\r
+                       ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+       ENTRY CORE1     ;ALWAYS LOAD CORE1(FOR LIB SEARCH)\r
+\r
+;CORE ALLOCATION IS DONE ON A 1K BLOCK BASIS\r
+\r
+;USING A USE BIT TABLE(CORTAB) WHICH HAS A 1\r
+;FOR EVERY BLOCK WHICH IS NOT AVAILABLE BECAUSE:\r
+; 1.IN USE BY MONITOR\r
+; 2.IN USE BY USER\r
+; 3.NON-EXISTANT MEMORY\r
+;0 MEANS BLOCK IS NOT IN USE\r
+\r
+;WHEN THE SYSTEM IS STARTED, SYSINI SETS THE CORTAB TABLE\r
+;IT ALSO SETS A BYTE POINTER(CORLST) WHICH POINTS TO THE\r
+;LOWEST NON-EXISTANT BLOCK IMMEDIATELY ABOVE THE HIGHEST\r
+;EXISTANT BLOCK. IT ALSO SETS CORTAL TO THE NO. OF\r
+;FREE BLOCKS AVAILABLE.\r
+;THE CORE1 ROUTINE ASSIGNS CORE IF POSSIBLE. SETS THE USE BITS.\r
+;AND MOVES THE JOB IF NEW ASSIGNEMENT IS A DIFFERENT PLACE THEN OLD\r
+;THE JBTADR TABLE IS ALSO UPDATED BY THE CORE ROUTINES\r
+;LH-PROTECTION,RH=RELOCATION\r
+;JOBADR IS MODIFIED IF CORE FOR CURRENT JOB\r
+;HARDWARE RELOC. AND PROTEC. ARE RESET IF CURRENT JOB\r
+;FINALLY JOBREL(PROTECTION) IN JOB DATA AREA IS ALWAYS UPDATED\r
+\r
+;LIST OF GLOBALS AFFECTED:\r
+;JBTADR,CORTAL,CORTAB,HOLEF,SWFWAT,JOBADR\r
+\r
+;ACS USED(BESIDES TAC,TAC1,JDAT,IOS,DEVDAT,AND POP)\r
+BLK=BUFPNT     ;HIGHEST REL. ADR. IN USER AREA\r
+LOC=BUFWRD     ;ABS. LOC. OF FIRST BLOCK IN USER AREA\r
+T=AC1  ;TEMPORARY\r
+T1=AC2 ;"\r
+\f;CORE UUO\r
+;CALL  MOVEI AC,HIGHEST REL. ADR. DESIRED IN LOW SEG\r
+;      HRLI AC,HIGHEST REL. ADR. DESIRED IN HIGH SEG\r
+;      CALL AC,[SIXBIT /CORE/]\r
+;      ERROR RETURN\r
+;      OK RETURN TO USER. JOB MOVED IF NECESSARY\r
+;RETURN NO. OF FREE 1K BLOCKS IN AC(OR MAX. NO. BLOCKS ALLOWED IF SWAPPING SYS)\r
+;BOTH HALVES 0 MEANS ERROR RETURN NO. OF FREE 1K BLOCKS(OR MAX. NO. OF BLOCKS\r
+; ALLOWED IF SWAPPING SYSTEM) IMMEDIATELY WIOTHOUT AFFECTING CORE\r
+; OR WAITING FOR IO DEVICES\r
+;LH=0 MEANS DO NOT CHANGE HIGH SEG ASSIGNMENT\r
+;RH=0 MEANS DO NOT CHANGE LOW SEG ASSIGNMENT\r
+\r
+INTERNAL CORUUO\r
+EXTERNAL USRREL,JOB,CORTAL\r
+EXTERNAL ESTOP1,IOWAIT,OERROR,SETREL,STOTAC,WSCHED\r
+\r
+CORUUO:        JUMPE TAC,ZERCOR        ;IS HE ASKING FOR ZERO CORE?\r
+       PUSH PDP,TAC            ;NO, SAVE HIGHEST DESIRED ADDRESS IN BOTH SEGS\r
+       PUSHJ PDP,IOWAIT        ;WAIT FOR ALL DEVICE INACTIVE\r
+       HRRZ TAC,(PDP)          ;HIGHEST REL. LOC. DESIRED FOR LOW SEG(RH)\r
+       JUMPE TAC,CORU1         ;IS RH 0(IF YES DO NOT CHANGE LOW SEG)?\r
+       IORI TAC,1777           ;NO, MAKE EVEN MULTIPLE OF 1K-1\r
+       PUSHJ PDP,CORE1         ;TRY TO ASSIGN CORE\r
+       JRST CORERR             ;NOT AVIALABLE, ERROR RETURN\r
+                               ; SUM OF NEW LOW AND OLD HIGH SEG TO BIG\r
+CORU1: HLRZ TAC,(PDP)          ;CHECK TO SEE IF USER REQUESTING HIGH CORE\r
+IFE FT2REL,<\r
+       CAMG TAC,USRREL         ;0 MEANS NO CHANGE, 1 THRU TOP OF LOW SEG MEANS\r
+                               ; RETURN HIGH CORE (IF ANY), ALWAYS LEGAL\r
+                               ; EVEN IF NO HIGH SEB SHARP WARE OR SOFTWARE\r
+>\r
+IFN FT2REL,<\r
+       EXTERN UCORHI\r
+       PUSHJ PDP,UCORHI        ;TRY TO ASSIGN CORE TO HIGH SEG.\r
+                               ; UCORHI EXPECTS ARG ON PD LIST\r
+       JRST CORERR             ;ERROR-ACTIVE IO(SAVE IN PROGRESS FOR SOME USER)\r
+                               ; OR SUM OF NEW LOW SEG AND NEW HIGH SEG TOO BIG\r
+>\r
+       AOS -1(PDP)             ;SET FOR DK(SKIP) RETURN\r
+CORERR: POP PDP,TAC            ;REMOVE ARG FROM LIST\r
+IFN FTSWAP,<\r
+       PUSHJ PDP,WSCHED        ;CALL SCHEDULER TO STOP JOB\r
+                               ; IN CASE LOW SEG MUST BE SWAPPED OUT TO EXPAND\r
+                               ; OR HIGH SEG LOGICAL CORE ASSIGNED ON DISK\r
+                               ; SAVE ALL ACS EXECPT AC1,AC2,AC3,\r
+>\r
+ZERCOR:\r
+IFE FTSWAP,<\r
+       MOVE TAC,CORTAL         ;RETURN NO. OF FREE 1K BLOCKS (COUNTING\r
+                               ; DORMANT AND IDLE SEGMENTS AS FREE)\r
+>\r
+IFN FTSWAP,<\r
+       MOVE TAC,CORMAX         ;RETURN MAX. NO. 1K BLOCKS ALLOWED FOR 1 USER TO HAVE\r
+       LSH TAC,-12\r
+>\r
+       JRST STOTAC             ;STORE IN USER AC AND RETURN TO USER\r
+\f;ROUTINE TO CHECK JOBS TO SEE IF ANY JOB CAN BE SHUFFLED\r
+;IT IS CALLED EVERY 60TH OF A SECOND BY CLOCK ROUTINE\r
+;PROVIDING CURRENT JOB IS IN USER MODE OR JUST ENTERING\r
+;IO WAIT OR SHARABLE DEVICE WIAT OR RETURNING ON UUO CALLS\r
+;IE CURRENT JOB  AND ALL OTHER JOB ARE SHUFFABLE WITH RESPECT\r
+;TO RELOCATION INFO IN MONITOR\r
+;SINCE RESCHEDULING IS NEVER DONE WHEN CURRENT JOB\r
+;IS NOT  SHUFFABLE. ALL JOBS ARE SHUFFABLE WHEN\r
+;CHKSHF IS CALLED.\r
+;THE NOSHUFFLE MACRO SHOULD STILL BE USED WHEN EVER\r
+;THE MONITOR MOVES RELOCATION OUT OF ACS PDP,PROG. OR JDAT\r
+;IN CASE IT SHOULD PROVE DESIRABLE IN THE FUTURE TO SHUFFLE\r
+;MORE FREQUENTLY THEN AT THE ABOVE TIMES\r
+;FINALLY A JOB MUST HAVE ALL DEVICES INACTIVE(SINCE SOME\r
+;OF THEM USE ABSOLUTE ADDRESSES)BEFORE IT CAN BE MOVED\r
+;SO CORE CANNOT BE REASSIGNED WHILE DEVICES ARE ACTIVE\r
+;IF DEVICES ARE ACTIVE, JOB WILL BE STOPPED SO THAT IO WILL\r
+;CEASE SOON SO JOB CAN BE SHUFFLED\r
+;ALL DEVICES LOOK AT SHF BIT IN JBTSTS(ADVBEF OR ADVDFE)\r
+;TO SEE IF MONITOR IS WAITING TO SHUFFLE JOB\r
+;THE NSHF BIT IN JOBSTS WHOULD BE SET FOR JOBS USING DISPLAYS\r
+;SINCE DISSER CONTINUALLY REFERENCES USER AREA EVEN THOUGH\r
+;IOAC1 IS OFF.\r
+\r
+;THIS VERSION OF THE CORE SHUFFLER WORKS AS FOLLOWS:\r
+;EVERY CLOCK TICK FOR WHICH ALL JOBS ARE SHUFFABLE(NOT COUNTING ACTIVE\r
+;IO DEVICES). THE JOB IMMEDIATELY ABOVE THE LOWEST HOLE\r
+;(IF ANY) WILL BE MOVED DOWN INTO HOLE. THE HOLEF IS SET NON-ZERO\r
+;TO THE ADDRESS OF JOB IMMEDIATELY ABOVE THE LOWEST\r
+;HOLE(0 IF NONE), EVERY TIME CORE IS REASSIGNED.\r
+;CANNOT BE CALLED WHILE SWAPPING IN PROGRESS FOR THIS JOB(BECAUSE IT CALLS CORE0)\r
+\r
+INTERNAL CHKSHF,FTSWAP\r
+EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX\r
+\r
+CHKSHF:        SKIPE ITEM,SHFWAT       ;HAS CHKSHF STOPPED A JOB AND IS WAITING FOR\r
+                               ; DEVICES TO BECOME INACTIVE?\r
+       JRST SHFLOP             ;YES, SEE IF IO HAS STOPPED YET\r
+       SKIPN TAC,HOLEF         ;NO, DOES CORE HAVE A HOLE IN IT?\r
+       POPJ PDP,               ;NO\r
+       MOVEI ITEM,JBTMAX       ;SEARCH FOR JOB OR HIGH SEG JUST ABOVE HOLE\r
+HOLLOP:        HRRZ TAC1,JBTADR(ITEM)  ;ADR. OF JOB\r
+\r
+       CAME TAC1,TAC\r
+       SOJG ITEM,HOLLOP        ;NOT JOB ABOVE HOLE KEEP LOOKG\r
+       JUMPG ITEM,SHFLOP       ;FOUND ONE?\r
+       SETZM HOLEF             ;NO, CLEAR HOLEF OR ELSE ERROR WILL BE PRINTED EVERY\r
+                               ; CLOCK TICK AND ERROR MESSAGE WILL NEVER PRINT\r
+       JSP DAT,OERROR          ;SYSTEM ERROR(TELL OPERATOR)\r
+\r
+SHFLOP:        SKIPE PROG,JBTADR(ITEM) ;JOB ABOVE HOLE STILL IN CORE ?\r
+       PUSHJ PDP,ANYACT        ;NO ALL DEVICES FINISHED ?\r
+       JRST NOTSHF             ;YES, GO SEE IF HOLD STILL THERE\r
+IFN JDAT-PROG,<\r
+       MOVE JDAT,JBTDAT(ITEM)  ;JOB DATA AREA\r
+>\r
+       HLRZ TAC,PROG           ;YEST, REASSIGN SAME AMOUNT OF CORE.\r
+       PUSHJ PDP,SCORE1        ;IN A LOWER POSITION IN CORE\r
+\r
+NOTSH1:        SETZM SHFWAT            ;JOB SHUFFLED, CLEAR FLAG\r
+       MOVSI TAC,SHF           ;CLEAR SHUFFLE WAIT BIT IN CASE IT WAS ON\r
+       ANDCAM TAC,JBTSTS(ITEM)\r
+       POPJ PDP,\r
+\r
+;JOB CANNOT BE MOVED BECAUSE IT HAS ACTIVE DEVICES OR NSHF BIT SET(DISPLAY,REALTIME)\r
+; SO JOB CANNOT BY SHUFFLED AT THIS TIME\r
+\r
+NOTSHF: SKIPN HOLEF            ;IS HOLE STILL THERE?\r
+       JRST NOTSH1             ;NO\r
+IFN FTSWAP,<\r
+       EXTERNAL FIT,FORCE\r
+       MOVE TAC,FORCE\r
+       CAME ITEM,FIT\r
+       CAMN ITEM,TAC\r
+       JRST NOTSH1\r
+>\r
+       MOVEM ITEM,SHFWAT       ;SET SHUFFLE WAIT FLAG WITH JOB NO.\r
+       MOVSI TAC,SHF           ;SET SHF WAIT BIT IN JOB STATUS WORD\r
+       IORM TAC,JBTSTS(ITEM)   ;SO JOB WILL NOT BE RUN\r
+       POPJ PDP,               ;AND IO WILL STOP SOON\r
+\f\r
+;ROUTINE TO TEST FOR ANY ACTIVE DEVICES\r
+\r
+;CALL: MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER\r
+;      MOVE JDAT,ADDRESS OF JOB DATA AREA\r
+;      PUSHJ PDP,ANYACT\r
+;      DEVICES ACTIVE\r
+;      DEVICES NOT ACTIVE EXCEPT POSSIBLY TTY\r
+;IN SWAPPIN SYSTEMS ANYACT IS BROKEN INTO 2 CALLS, TRYSWP AND ANYDEV\r
+;TRYSWP TEST WHTETHER SWAPPER SHOULD EVEN CONSIDER SWAPING JOB\r
+\r
+       INTERN ANYACT,ANYDEV\r
+       EXTERN JOBMAX\r
+ANYACT:\r
+IFN FTSWAP,<\r
+       INTERN ANYDEV\r
+       PUSHJ PDP,TRYSWP        ;SHOULD SWAPPER MAKE JOB UNRUNNABLE\r
+                               ; IN ORDER TO SWAP OUT?\r
+       POPJ PDP,               ;NO, ACTIVE SAVE IN PROGRSS OR NSH,NSWP\r
+                               ; (REAL TIME OR DISPLAY)\r
+>\r
+ANYDEV:        MOVE T,JBTSTS(ITEM)     ;IS JOB(OR HIGH SEG) NOT SHUFFABLE?\r
+       TLNE T,NSHF             ;DISPLAY AND REAL TIME SET NSHF\r
+       POPJ PDP,               ;CANNOT BE SHUFFLED\r
+IFN FT2REL,<\r
+       CAILE ITEM,JOBMAX       ;YES IT THIS A HIGH SEG?\r
+       JRST CPOPJ1             ;YES, OK TO SHUFFLE OR SWAP SINCE NSHF,NSWP\r
+                               ; AND NO SAVE IN PROGRESS\r
+>\r
+       MOVEI T,JOBJDA(JDAT)    ;ASSUME JOB IS NOT CURRENT JOB\r
+       CAMN ITEM,JOB           ;IS IT?\r
+       MOVEI T,USRJDA          ;IT IS CURRENT JOB\r
+                               ; DEVICE ASSIGNMENT TABLE IN MONITOR\r
+       MOVEI IOS,IOACT         ;IO DEVICE ACTIVE BIT\r
+       HRRZ T1,JOBJMH(T)       ;GET NO. OF USER IO CHANNELS IN USE\r
+                               ; FOR JOB(EITHER FROM JOB DATA AREA\r
+                               ; OR FROM MONITOR (IGNORE LH WHICH MY BE-1\r
+                               ; IF SAVEGET IN PROGRESS)\r
+       TLO T,T1                ;SET TO ADD T TO T1\r
+       MOVSI AC3,DVTTY ;DEVICE IS A TTY BIT\r
+ANY:   SKIPE DEVDAT,@T         ;IS A DEVICE ASSIGNED TO THIS CHANNEL?\r
+       TDNN IOS,DEVIOS(DEVDAT) ;YES, IS IT ACTIVE?\r
+ANY2:  SOJGE T1,ANY            ;NO, KEEP LOOKING\r
+       JUMPL T1,CPOPJ1         ;YES, FINISHED YET?\r
+       TDNN AC3,DEVMOD(DEVDAT) ;NOT FINISHED, IS DEVICE TTY?\r
+       POPJ PDP,               ;NO, ERROR RETURN, CANNOT ASSIGN CORE\r
+       JRST ANY2               ;YES, KEEP LOOKING FOR AN ACTIVE DEVICE\r
+\f\r
+;ROUTINE TO TEST TO SEE IF JOB OR HIGH SEG CAN BE SWAPPED\r
+; OR WHETHER IT SHOULD BE ALLOWED TO CONITNUE RUNNING\r
+; UNTIL A MORE FAVORABLE ITME\r
+;CALL: MOVE ITEM,HIGH RO LOW SEG NUMBER\r
+;      PUSHJ PDP,TRYSWP\r
+;      RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS);       RETURN2  - OK TO SWAP HIGH OR LOW SEG\r
+\r
+IFN FTSWAP,<\r
+       INTERN TRYSWP\r
+       EXTERN JBTSTS,CPOPJ1\r
+\r
+TRYSWP:        MOVE T,JBTSTS(ITEM)     ;IS JONB OR HIGH SEG NOT SWAPPABLE?\r
+       TLNE T,NSHF!NSWP        ;OR SHUFFABLE(DISPLAY,REAL TIME)?\r
+       POPJ PDP,               ;YES, ERROR RETURN\r
+IFN FT2REL,<\r
+       EXTERN ANYSAV\r
+       JRST ANYSAV             ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET\r
+                               ; WHICH IS STILL ACTIVE\r
+>\r
+IFE FT2REL,<\r
+       JRST CPOPJ1             ;NO, GIVE OK RETURN\r
+>\r
+>\r
+\f\r
+;ROUTINE TO FLUSH PHYSICAL CORE ASSIGNED IN MEMORY\r
+;NOTE: THIS ROUTINE DIFERS SIGNIFICANTLY FROM CORE0 AND CORE1 IN THAT\r
+;IT IS ONLY A PHYSICAL  REMOVAL OF CORE(VIRTAL IS NOT AFFECTED)\r
+;SEE COMMENTS FOR CORE1\r
+;CALL: MOVE ITEM,HIGH OR LOW SEGMENT NUMBER\r
+;      PUSHJ PDP,KCORE1\r
+;      ALWAYS RETURN HERE\r
+;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE\r
+\r
+       INTERN KCORE1\r
+\r
+KCORE1:        MOVEI TAC,0             ;SETUP DESIRED HIGHEST ADR\r
+SCORE1:        SOS(PDP)                ;CORE1 WILL ALWAYS SKIP RETURN\r
+       JRST CORE1A             ;BYPASS LOGICAL CORE ASSIGNMENT PART\r
+                               ; AND FLUSH PHYSICAL CORE(LOGICAL CORE UNEFFECTED)\r
+\r
+\r
+;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER\r
+\r
+;AND RUN COMMAND\r
+;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED\r
+\r
+;CALL: MOVE TAC,HIGHEST LEGAL ASSRESSABLE LOC. DESIRED\r
+;      MOVE ITEM,JOB NUMBER\r
+;      MOVE PROG,[XWD PROT,,RELOC.]=JBTADR(ITEM)\r
+;      PUSHJ PDP,CORE0\r
+;      ERROR   ;EITHER JOB HAS ACTIVE IO\r
+               ; OR NOT ENOUGH CORE\r
+;      OK RETURN\r
+;JOB IS MOVED IF NECESSARY TO SATISFY REQUEST\r
+;PROG AND JDAT ARE SET TO NEW CORE ASSIGNMENT ON EITHER RETURN\r
+;0 MEANS NONE ASSIGNED IN MEMORY, ASSIGNED ON DISK\r
+INTERNAL CORE0\r
+INTERNAL CORE1,FTTIME,FTTRPSET,CORGET,FTSWAP\r
+EXTERNAL JOBJDA,JOB,USRJDA,JOBADR,JBTADR\r
+EXTERNAL JOBREL,JOBADR,JOBDAC,JOBPC,JOBDAT,JBTDAT\r
+EXTERNAL CORTAL,CORLST,CORTAB,HOLEF,CLRWRD\r
+EXTERNAL USRREL,CPOPJ1,JOBJMH,JOBENB,JOBDPD,JOBDPG\r
+EXTERNAL JOBPR1,CPOPJ1,JOBPRT,USRPC,CORMAX\r
+;ENTER HERE FROM CORE CONSOLE COMMAND OR INITIAL CORE\r
+;ASSIGNMENT OF JUST A JOB DATA AREA FOR RUN COMMAND\r
+;IE ENTER WHEN DEVICES MAY BE ACTIVE OR JOB MAY HAVE NO PREVIOUS CORE\r
+;JOB CAN HAVE CORE IN MEMORY, CORE ON DISK., OR NONE EITHER PLACE\r
+;JOB CANNOT BE IN PROCESS OF SWAP OUT OR SWAP IN(CALLER'S RESPONSIBILITY)\r
+;CORE0 NO LONGER REASSIGN CORE ON DISK IF OLD CORE ON DISK\r
+;BECAUSE OF FRAGMENTED SWAPPING(TOO HARD) UNLESS 0 BEING ASKED FOR\r
+;THEREFORE THE CORE COMMAND CAUSES JOB TO BE SWAPPED INTO CORE FIRST(INCORE=1)\r
+;HOWEVER, THE R,RUN,GET,KJOB COMMANDS DO NOT REQUIRE HE PREVIOUS CORE IMAGE TO\r
+;BE SWAPPED IN(AS THIS IS SLOW). THEY ASK FOR 140 WORDS, AND LARGER DISK SPACE IS RELINQUISHED\r
+;UPON SWAPIN BY THE SWAPPER, VIRTAL IS INCREASED THEN RATHER THAN\r
+;ON THE CALL TO CORE0.\r
+;IT WILL TRY TO REASSIGN CORE IN MEMORY IF OLD CORE IN MEMORY\r
+;IF THIS FAILS, IT WILL REASSIGN NEW CORE ON DISK AND ASK SWAPPER TO EXPAND\r
+;IF JOB DID NOT HAVE OLD CORE, AN ATTEMPT WILL BE MADE TO ASSIGN CORE IN MEMORY\r
+;IF THIS FAILS, TI WILL BE ASSIGNED ON THE DISK AND ASK SWAPPER TO EXPAND\r
+;THE OTHER PLACES IN THE MONITOR WHERE THE IN-CORE COUNT IS TOUCHED IS\r
+;IN GET WHERE IT INCREMENTS TO SHARE COPY ALREADY IN CORE.\r
+;AND END OF SWPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER\r
+;THE CORE ROUTINES DO NOT ALTER THE HIGH SEG IN CORE COUT.  IT IS UP TO THE  CALLER\r
+;(IN SEGCOR) TO CALL THE CORE ROUTINES ONLY IF IN CORE COUNT IS 0\r
+;AND END OF SWAPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER\r
+\f\r
+CORE0:\r
+IFE FTSWAP,<\r
+       JUMPE PROG,CORGET       ;IS JOB WITHOUT CORE IN MEMORY?\r
+>\r
+IFN FTSWAP,<\r
+       EXTERN IMGOUT,CPOPJ1,CHGSWP\r
+       JUMPN PROG,CORE0A       ;DOES JOB HAVE CORE IN MEMORY?\r
+                               ; (ALWAYS TRUE BOTH SEGS IF CORE UUO)\r
+       IFE FT2REL,<\r
+       EXTERN CORMAX\r
+       CAML TAC,CORMAX         ;NO, WILL REQUEST FIT IN PHYSICAL CORE?\r
+                               ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND\r
+                               ; ONCE CAN RESTART CORMAX)\r
+\r
+       >\r
+       IFN FT2REL,<\r
+       EXTERN SUMSEG\r
+       PUSHJ PDP,SUMSEG        ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE?\r
+                               ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX\r
+       >\r
+       POPJ PDP,               ;NO, GIVE ERROR RETURN\r
+       MOVSI TAC1,SWP          ;IS JOB SWAPPED OUT?\r
+       TDNN TAC1,JBTSTS(ITEM)  ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT)\r
+       JRST CORE1              ;NO, TRY TO ASSIGN CORE IN MEMORY\r
+       PUSHJ PDP,CHGSWP        ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK\r
+                               ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING\r
+                               ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE\r
+                               ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST).\r
+                               ; (FRAGMENTATION POSTPONES RETURNING SPACE AND\r
+                               ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING\r
+                               ; FOR 0 VIRTUAL CORE)\r
+       JRST CPOPJ1             ;GIVE OK RETURN TO CALLER\r
+\r
+CORE0A:\r
+EXTERNAL  JBTSWP\r
+>\r
+IFN FTTRPSET,<\r
+       EXTERNAL STOPTS\r
+       SKIPN STOPTS            ;NO,IS TIME SHARING STOPPED BY\r
+                               ; TRPSET UUO DONE FOR JOB 1?\r
+>\r
+\r
+       PUSHJ PDP,ANYACT        ;NO,ANY ACTIVE DEVICE?\r
+       POPJ PDP,               ;YES, CANNOT ASSIGN CORE\r
+                               ; NO, FALL INTO CORE1\r
+;ROUTINE TO TRY TO ASSIGN CORE IN CORE\r
+;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY)\r
+;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH)\r
+;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE\r
+;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE\r
+;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT\r
+;FIRST OLD CORE IS RETURNED TO SYSTEM\r
+;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST \r
+;POSITION POSSIBLE.  THUS CORE TENDS TO BE PACKED\r
+;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS\r
+;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT\r
+\r
+\r
+       EXTERN SEGSIZ\r
+\r
+CORE1: NOSCHEDULE              ;PREVENT SCHEDULING\r
+\r
+IFN FTSWAP,<\r
+       EXTERN VIRTAL\r
+       PUSHJ PDP,SEGSIZ        ;TAC1=OLD SEG SIZE\r
+       SKIPN LOC,TAC           ;IS 0 BEING REQUESTED?\r
+       MOVNI LOC,1             ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1\r
+                               ; ON RT. SHIFT)\r
+       ASH LOC,-12             ;CONVERT TO NO. OF K-1(01,0,1,2,...)\r
+       SUB LOC,TAC1            ;NO. OF K-1 INCREASE=NEW-OLD-1\r
+       CAMGE LOC,VIRTAL        ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM?\r
+>\r
+IFE FT2REL,<\r
+       CAML TAC,CORMAX         ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?\r
+>\r
+IFN FT2REL,<\r
+       EXTERN SUMSEG\r
+       PUSHJ PDP,SUMSEG        ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?\r
+>\r
+       POPJ PDP,               ;NO, ERROR RETURN\r
+IFN FTSWAP,<\r
+       ADDI LOC,1              ;YES, GET NO. OF K OF INCREASE\r
+       MOVNS LOC               ;MAKE MINUS FOR UPDATE\r
+       ADDM LOC,VIRTAL         ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM\r
+                               ; SINCE THIS REQUEST CAN BE SATISFIIED\r
+>\r
+CORE1A: NOSCHEDULE             ;PREVENT JOB SCHEDULING\r
+       JUMPE PROG,CORGET       ;OLD ASSIGNMENT 0?\r
+                               ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE\r
+       HRRZ LOC,PROG           ;NO. ABS, LOC. OF OLD CORE\r
+       HLRZ BLK,PROG           ;HIGHEST LEGAL REL. ADR.\r
+       MOVEI T,0               ;CLEAR FOR CORSTG CALL\r
+       PUSHJ PDP,CORSTG        ;RETURN OLD CORE TO FREE STORAGE\r
+;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS\r
+;WANTED IN CORE.\r
+\r
+CORGET:        SETZB LOC,PROG          ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED\r
+       JUMPE TAC,DIDLE1        ;IS ZERO CORE BEING REQUESTED?\r
+       PUSHJ PDP,HOLSRC        ;NO, SEARCH FOR HOLE BIG ENOUGH\r
+       JRST BAKOLD             ;NONE, GIVE BACK OLD AMOUNT\r
+INTERN FTTRACK\r
+IFN FTTRACK,<\r
+       EXTERN LASCOR\r
+       MOVEM   ITEM,LASCOR     ;LEAVE TRACKS FOR LAST JOB USING\r
+                               ; PHYSICAL CORE ALLOCATION\r
+                               ; (FOR DEBUGGING ONLY)\r
+>\r
+       MOVEM LOC,PROG          ;SETUP NEW RELOC\r
+       HRLM TAC,PROG           ;AND NEW PROTECT.\r
+       MOVEI BLK,(TAC)         ;HIGHEST REL ADR. BEING REQUESTED\r
+       MOVEI T,1               ;SET USE BITS IN CORE TBALE\r
+       PUSHJ PDP,CORSTG\r
+       MOVE BLK,JBTADR(ITEM)   ;OLD CORE ASSIGNMENT\r
+       JUMPN BLK,MOVCOR        ;WAS THERE OLD MEMORY ASSIGNED?\r
+                               ; NO,\r
+IFN FTSWAP,<\r
+       LDB TAC1,IMGOUT         ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN\r
+       LSH TAC1,12             ;CONVERT TO WORDS\r
+>\r
+IFE FTSWAP,<\r
+       MOVEI TAC1,0            ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)\r
+>\r
+       MOVE BLK,PROG           ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START\r
+                               ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING)\r
+       SOJA TAC1,CLRCR1                ;IF NEW CORE SIZE IS BIGGER THAN\r
+                               ;OLD, CLEAR OUT INCREASED SO SECURITY WILL\r
+                               ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD\r
+                               ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT\r
+;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST\r
+\r
+BAKOLD:\r
+IFN FTSWAP,<\r
+       EXTERN XPAND\r
+       PUSHJ PDP,XPAND         ;TELL SWAPPER TO SWAP OUT\r
+>\r
+IFE FTSWAP,<\r
+       IFE FT2REL,<\r
+       SOSO (PDP)              ;SET FOR ERROR RETURN AND GET BACK LO CORE\r
+       >\r
+       IFN FT2REL,<\r
+       EXTERN FRECOR\r
+       PUSHJ PDP,FRECOR        ;TRY TO DELETE 1 DORMANT HIGH SEGMENT,\r
+                               ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS\r
+       SOSA (PDP)              ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK\r
+       JRST CORGET             ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN\r
+       >\r
+>\r
+BKOLD1: HLRZ TAC,JBTADR(ITEM)  ;GIVE BACK OLD CORE.\r
+       JRST CORGET\r
+\f\r
+;MOVE OLD CORE TO NEW AREA\r
+\r
+MOVCOR:        CAIN LOC,(BLK)          ;IS NEW CORE IN SAME PLACE AS OLD?\r
+       JRST CLRCOR             ;YES, DO NOT MOVE IT,CLEAR IF INCREASE\r
+       HLRZ TAC1,BLK           ;LENGTH OF OLD CORE\r
+       CAILE TAC1,(TAC)        ;IS OLD CORE LESS THEN NEW?\r
+       HRRZ TAC1,TAC           ;NO, MOVE THE SHORTENED NEW CORE\r
+IFN FTTIME,<\r
+       EXTERNAL SHRWRD\r
+       ADDM TAC1,SHRWRD        ;INCREMENT TOTAL NO. WORDS SHUFFLED\r
+>\r
+       ADD TAC1,LOC            ;ADD IN NEW RELOC.\r
+       MOVE AC1,LOC            ;DEST.=NEW RELOC.\r
+       HRL AC1,BLK             ;SOURCE=OLD RELOC.\r
+       SETZM JBTADR(ITEM)      ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES)\r
+       BLT AC1,(TAC1)          ;MOVE CORE TO NEW ASSIGNMENT\r
+\r
+;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD\r
+\r
+CLRCOR:        HLRZ TAC1,BLK           ;OLD CORE SIZE-1\r
+CLRCR1:        CAMG TAC,TAC1           ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1\r
+       JRST DIDLE              ;NO, DO NOT CLEAR ANY CORE\r
+IFN FTTIME,<\r
+       MOVE AC1,TAC            ;NEW CORE SIZE\r
+       SUB AC1,TAC1            ;LESS OLD CORE SIZE\r
+       ADDM AC1,CLRWRD         ;ACCUMULATE NO. OF WORDS CLEARED\r
+>      \r
+       ADDI TAC1,2(PROG)       ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR\r
+       ADDI TAC,(PROG)         ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR\r
+       SETZM -1(TAC1)          ;CLEAR FIRST WORD\r
+       HRLI TAC1,-1(TAC1)      ;SET LH TO FIRST ADR. TO CLEAR\r
+       BLT TAC1,(TAC)          ;CLEAR THE INCREASE PORTION\r
+;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS\r
+;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE\r
+;ALTERED BY DISTANCE CODE WAS MOVED\r
+\r
+;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF\r
+;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT\r
+;CORE WAS MOVED\r
+\r
+EXTERNAL SYSSIZ\r
+\r
+DIDLE: SUBI LOC,(BLK)          ;DISTANCE JOB WAS MOVED(DIST.-SOURCE)\r
+       CAME ITEM,JOB           ;IS THIS CURRENT JOB?\r
+       SKIPA TAC,JOBPC(JDAT)   ;NO. GET PC IN JOB DATA AREA\r
+       MOVE TAC,USRPC          ;YES, PC IN PROTECTED SYSTEM AREA\r
+IFN FT2REL,<\r
+       EXTERN JOBMAX\r
+       CAIG ITEM,JOBMAX        ;IS THIS A HIGH SEGMENT?\r
+>\r
+       TLNE TAC,USRMOD         ;NO. IS JOB IN USER MODE?\r
+       JRST DIDLE1             ;YES, DO NOT ALTER DUMP ACS\r
+                               ; BECAUSE THEY ARE IN USERS(OR HIGH SEG)\r
+       ADDM LOC,JOBDPD(JDAT)   ;NO. ALTER DUMP PDP BY DIST. OF MOVE\r
+       ADDM LOC,JOBDPG(JDAT)   ;AND ALTER PROG BY DIST. MOVED\r
+DIDLE1:        MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG)\r
+       CAME ITEM,JOB           ;IS THIS CURRENT JOB?\r
+       JRST DIDLE3             ;NO, DO NOT ALTER STATE OF MONITOR\r
+       MOVE    TAC,SYSSIZ      ;DONT CHANGE PDP IF LIST\r
+       CAIG    TAC,(PDP)       ;IS IN SYSTEM\r
+       ADD PDP,LOC             ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE\r
+       PUSHJ PDP,SETREL        ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION\r
+                               ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB\r
+DIDLE3:\r
+IFN FT2REL,<\r
+       EXTERN CURHGH\r
+       PUSHJ PDP,CURHGH        ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR\r
+                               ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING\r
+                               ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO.\r
+                               ; OF SEG WHICH HAS JUST HAD CORE REASSIGNED\r
+\r
+>\r
+       SETZB TAC,HOLEF         ;CLEAR HOLD FLAG\r
+       PUSHJ PDP,HOLSRC        ;IS THERE A NON-ZERO HOLE?\r
+       JRST COROK              ;NO\r
+       ADDI LOC,1(BLK)         ;YES, FORM ADR. OF JOB JUST ABOVE HOLD\r
+       CAME T,CORLST           ;IS HOLE AT TOP OF MEMORY\r
+       MOVEM LOC,HOLEF         ;NO, FLAG WITH ADDRESS OF JOB ABOVE HOLE\r
+COROK:\r
+IFN FTSWAP,<\r
+       EXTERNAL BIGHOLE\r
+       MOVEI TAC,-1            ;FIND BIGGEST HOLE\r
+       PUSHJ PDP,HOLSRC        ;ALWAYS GET ERROR RETURN\r
+       ASH T1,-^D10            ;CONVERT TPO 1K BLOCKS\r
+       MOVEM T1,BIGHOLE        \r
+>\r
+       SCHEDULE\r
+       JRST CPOPJ1             ;SKIP RETURN(UNLES ERROR)\r
+\f\r
+;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST\r
+;CALL: MOVE TAC,HIGHEST REL. ADR. ASKING FOR\r
+;      PUSHJ PDP,HOLSRC\r
+;      RETURN1 ;NO HOLES BIG ENOUGH\r
+;      RETURN2 ;T BYTE SET TO LAST BLOCK+1 IN HOLE\r
+;              ;BLK SET TO HIGHEST REL. LOC. IN THAT HOLE\r
+;              ;LOC SET TO ADDRESS OF FIRST BLOCK IN HOLE\r
+;              ;T1=LARGEST HOLE SEEN\r
+;USES TAC1\r
+\r
+HOLSRC:        MOVE T,CORE2P           ;BYTE POINTER TO FIRST BIT-1\r
+       SETZB LOC,T1            ;START AT BOTTOM OF MEMORY\r
+                               ; LARGEST HOLE SO FAR=0\r
+CORHOL:        TDZA BLK,BLK            ;START BLK AT 0 AND SKIP\r
+\r
+CORHO0:        ADDI BLK,2000           ;INCREMENT HIGHEST REL LOC.\r
+CORHO1:        CAMN T,CORLST           ;BYTE POINTER TO 1ST NON-EXISTANT BLOCK\r
+       POPJ PDP,               ;NO MORE CORE TO SEARCH\r
+       ILDB TAC1,T             ;GET NEXT CORE USE BIT\r
+       ADDI LOC,2000           ;INCREMENT ADDRESS OF BLOCK\r
+       JUMPE TAC1,CORHO0       ;IS THIS BLOCK IN USE?\r
+       JUMPE BLK,CORHO1        ;YES, HAVE ANY FREE BLOCKS BEEN SEEN YET?\r
+IFN FTSWAP,<\r
+       CAMLE BLK,T1            ;YES, BIGGEST SO FAR?\r
+       MOVEM BLK,T1            ;YES, SAVE IN T1.\r
+>\r
+       CAMG BLK,TAC            ;YES, IS THIS HOLD EQUAL OR GREATER THEN REQUEST?\r
+       JRST CORHOL             ;NO, KEEP LOOKING FOR HOLES\r
+       SUBI LOC,2000(BLK)      ;YES, SET LOC TO FIRST BLOCK IN HOLD\r
+       SOJA BLK,CPOPJ1         ;SET BLK TO HIGHEST REL. LOC.\r
+                               ; AND RETURN\r
+\f\r
+;ROUTINE TO SET AND CLEAR CORE USE TABLE\r
+;CALL: MOVEI T,1       ;TO SET TABLE\r
+       MOVEI T,0       ;TO CLEAR TABLE\r
+;      MOVE BLK,HIGHEST REL. LOC. IN USER AREA\r
+;      MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR\r
+\r
+       INTERN CORE2P\r
+       EXTERN TPOPJ\r
+\r
+CORSTG:        PUSH PDP,TAC            ;SAVE HIGHEST LOC. BEING REQUESTED\r
+       ASH BLK,-12             ;CONVERT TO NO. OF BLOCKS-1\r
+       ADDI BLK,1              ;NO. OF BLOCKS\r
+       SKIPE T                 ;UPDATE NO OF FREE BLOCKS\r
+       MOVNS BLK               ;DECREASE IF SETTING BITS\r
+       ADDM BLK,CORTAL         ;INCREASE IF CLEARING,DECREASE IF SSETING BITS\r
+       MOVE TAC,LOC            ;ADDRESS OF FIRST BLOCK\r
+       ASH TAC,-12             ;FORM BYTE POINTER TO BIT-1\r
+       IDIVI TAC,^D36          ;TAC=WORD,TAC1=BIT\r
+       ADD TAC,CORE2P          ;FORM BYTE POINTER\r
+\r
+       MOVNS TAC1\r
+       ADDI TAC1,^D36\r
+       DPB TAC1,[POINT 6,TAC,5]\r
+       MOVMS BLK               ;GET MAG. OF NO. OF BLOCKS INVOLVED\r
+       IDPB T,TAC              ;SET OR CLEAR EACH USE BIT\r
+       SOJG BLK,.-1\r
+       JRST TPOPJ              ;RESTORE TAC. AND POPJ\r
+\r
+CORE2P:        POINT 1,CORTAB          ;BYTE POINTER TO FIRST BIT-1\r
+\f\r
+;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO)\r
+;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140)\r
+;      MOVE ITEM,JOB NO.\r
+;CALL: MOVE JDAT,ADR. OF JOB DATA AREA\r
+;      PUSHJ PDP,CLRJOB\r
+\r
+INTERNAL CLRJOB\r
+EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB\r
+EXTERNAL JOBPD1,JOBDDT\r
+\r
+CLRJOB:        SETZM JOBPRT(JDAT)      ;FIRST LOC. PROTECED FROM USER\r
+       MOVSI TAC,JOBPRT(JDAT)\r
+       HRRI TAC,JOBPR1(JDAT)\r
+       MOVE TAC1,JOBDDT(JDAT)  ;SAVE DDT STARTING ADDRESS\r
+       BLT TAC,JOBPFI(JDAT)\r
+       MOVEM TAC1,JOBDDT(JDAT)\r
+       SETZM JOBENB(JDAT)      ;ALSO CLEAR APR ENABLE WORD\r
+       SETZM JOBPD1(JDAT)      ;AND UUO PC FLAGS(USED WHEN JOB STARTS)\r
+       JRST ESTOP1             ;GO SET JOB STATUS, SO CONT WILL\r
+                               ; NOT WORK,(DO NOT CLEAR JACCT BIT)\r
+\r
+COREND: END\r
diff --git a/src/crfall.ccl b/src/crfall.ccl
new file mode 100644 (file)
index 0000000..ffb9188
--- /dev/null
@@ -0,0 +1,31 @@
+CLOCK1=CLOCK1
+CLKCSS=CLKCSS
+COMCON=COMCON
+COMMON=COMMON
+CORE1=CORE1
+DIS340=DIS340
+DIS34=DIS30
+DCSINT=DCSINT
+DLSINT=DLSINT
+DPDINT=DPDINT
+DSKINT=DSKINT
+DSKSER=DSKSER
+DTCSRN=DTCSRN
+DTASRN=DTASRN
+EDDT=EDDT
+ERRCON=ERRCON
+JOBDAT=JOBDAT
+LPTSER=LPTSER
+MTCSR6=MTCSR6
+MTASRX=MTASRX
+NULSEG=NULSEG
+PLTSER=PLTSER
+PTRSER=PTRSER
+PTPSER=PTPSER
+PTYSRF=PTYSRF
+PTYSRH=PTYSRH
+PATCH=PATCH
+ONCEB=ONCEB
+SCNSRF=SCNSRF
+SCHEDB=SCHEDB
+UUOCON=UUOCON
diff --git a/src/dcsint.mac b/src/dcsint.mac
new file mode 100644 (file)
index 0000000..00cd555
--- /dev/null
@@ -0,0 +1,115 @@
+\fTITLE DCSINT - INT. SERV. FOR DATA COMMUNICATION SYSTEM 630 - V402\r
+SUBTTL M. FREDRIKSEN/TH/CHW  TS  7 MAY 69\r
+XP     VDCSIT,402\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER\r
+\r
+EXTERNAL SCNON,SCNOFF,TYPX\r
+\r
+IFE FTTTYSER,<XP FULTWX,200000>\r
+\r
+IFN FTTTYSER,<XP FULTWX,4>\r
+\f;ACCUMULATOR ASSIGNMENTS\r
+\r
+       CHREC=TEM       ;AC FOR CHARACTER\r
+       DDB=DEVDAT      ;ADDRESS OF DEVICE DATA BLOCK\r
+       LINE=TAC1       ;SCANNER LINE NUMBER\r
+       HPOS=DAT        ;HORIZONTAL POSITION OF TTY.(0-71)\r
+\r
+;BYTE POINTERS\r
+\r
+\r
+EXTERNAL PLASTC\r
+\r
+\f;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE\r
+;CALL: MOVEI   TAC,CHANNEL NUMBER\r
+;      PUSHJ   PDP,SCNINI\r
+\r
+INTERNAL SCNINI\r
+\r
+DCSINI:\r
+SCNINI:        MOVEI   TAC,100000\r
+       CONO DCSA,4010          ;RELEASE XMITTER, RECEIVER\r
+       CONSZ DCSA, 1000\r
+       CONO DCSA, 4000\r
+       CONSZ DCSA, 10\r
+       DATAI DCSB, TAC1\r
+       SOJG TAC,.-4\r
+       CONO    DCSA,FSNCHN     ;ASSIGN INTERRUPT CHANNELS\r
+       POPJ    PDP,\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE.\r
+\r
+ENTRY DCSINT\r
+\r
+INTERNAL SCNINT\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT,FSNCHN\r
+\r
+DCSINT:\r
+SCNINT:        CONSO DCSA,1010\r
+       JRST SCNINT\r
+       JSR SCNSAV\r
+       CONSO DCSA,10           ;RECEIVER FLAG?\r
+       JRST SCNIN1             ;NO,XMITTER FLAG\r
+       CONI DCSB,LINE          ;SCANNER INPUT.\r
+       DATAI DCSB, CHREC\r
+       CAIL    LINE,TCONLN     ;ARE WE ENABLED FOR THIS LINE NUMBER?\r
+       POPJ    PDP,            ;NO, DISMISS INTERRUPT\r
+       JRST    RECINT          ;RECEIVER INT. HANDLER\r
+\f;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES.\r
+\r
+EXTERNAL INJEST,DDBSRC\r
+INTERNAL TCOMM\r
+\r
+TCOMM:\r
+       SKIPE DDB,TTYTAB(LINE)  ;DATA BLOCK ASSIGNED?\r
+       JRST INUSE              ;YES\r
+       PUSHJ PDP,DDBSRC        ;SEARCH FOR FREE TTY DEV. DATA BLOCK\r
+       JRST TYPX               ;NONE FOUND, TYPE X\r
+       MOVEI HPOS,0            ;ASSUME TTY IS AT BEGIN OF FORM\r
+       CAILE LINE,TCONLN       ;PSEUDO CONSOLE?\r
+       JRST INJEST             ;YES\r
+       CAIE LINE,TCONLN        ;IS IT CTY?\r
+       CONSO DCSA,700          ;NO, IS IT HALF DUPLEX?\r
+       JRST INUS2              ;YES, ACCEPT CHAR AND PROCESS\r
+       JRST TYPE               ;NO, ECHO CHAR ON FULL DUPLEX\r
+                               ;BEFORE PROCESSING IT\r
+\r
+SCNIN1:\r
+       DATAI DCSA,LINE         ;GET LINE NO. FROM FULL DUPLEX.\r
+       MOVEI TAC,FSNCHN\r
+       CONO DCSA,4000(TAC)     ;RELEASE XMITTER SCANNER\r
+       JRST    XMTINT          ;IN SCNSER OR TTYSER\r
+\f;COMMON TO RECEIVE AND TRANSMIT.\r
+\r
+INUSE: HRRZS  DDB      ;LINE DISABLED IF RH TTYTAB=-1\r
+       CAIN DDB,-1\r
+       POPJ PDP,\r
+       MOVE IOS,DEVIOS(DDB)    ;SETUP IOS\r
+       CAIGE   LINE,TCONLN     ;CTY OR PTY?\r
+       CONSO DCSA,700          ;NO, HALF DUPLEX?\r
+       JRST INUS2              ;YES\r
+       TLNE IOS,FULTWX         ;IS THIS SELF ECHOEING FULL DUPLEX?\r
+       JRST INUS2              ;YES,(USER TYPED CONROL B)\r
+       CONO DCSB,(LINE)        ;FULL DUPLEX SCANNER. ECHO CHAR.\r
+       DATAO DCSA,CHREC\r
+       DPB CHREC,PLASTC\r
+       POPJ PDP,               ;DISMISS INTERRUPT\r
+\f;ROUTINE TO OUTPUT A CHARACTER ON A LINE\r
+;CALLED FROM TYP OR TYPL IN SCNSER\r
+\r
+INTERNAL SCNTYP\r
+\r
+SCNTYP:\r
+DCSTYP:        CONO PI,SCNOFF          ;TURN SCANNER PI OFF IN CASE AT USER LEVEL\r
+                               ;SO NO INTERRUPTS BETWEEN CONO, AND DATAO\r
+       CONO DCSB,(LINE)        ;NO\r
+       DATAO DCSA,CHREC\r
+       CONO PI,SCNON           ;TURN SCANNER PI BACK ON\r
+       SKIPE   DDB\r
+       DPB CHREC,PLASTC        ;SAVE CHAR FOR FULL DUPLEX\r
+       POPJ PDP,\r
+\r
+\r
+\f      END\r
diff --git a/src/disser.mac b/src/disser.mac
new file mode 100644 (file)
index 0000000..b2237ad
--- /dev/null
@@ -0,0 +1,427 @@
+IFNDEF T30,<T30=0>;ASSUME TYPE 30 DISPLAY IF T30 IS UNDEFINED\r
+IFN T30,<\r
+TITLE DIST30 - TYPE 30 DISPLAY SERVICE ROUTINES\r
+ENTRY DIST30\r
+DIST30:\r
+>\r
+IFE T30,<\r
+TITLE DIS340 - TYPE 340 DISPLAY SERVICE ROUTINES\r
+ENTRY DIS340\r
+DIS340:\r
+>\r
+SUBTTL R. GRUEN/RCC TS 03 JUN 69 V004\r
+XP     VDISSR,004\r
+\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+;              THESE ROUTINES HANDLE INTERRUPTS FROM THE DISPLAY DATA\r
+;      CHANNEL.  THEY SEARCH THE COMMAND POINTER LIST SUPPLIED\r
+;      BY THE USER AND OUTPUT SECTIONS OF DATA AS SPECIFIED THEREIN.\r
+;      ALL OUTPUT IS DONE USING THE BLKO COMMAND.\r
+\r
+;              THE FORMAT OF THE COMMAND POINTE RLIST IS AS FOLLOWS:\r
+\r
+;      RH=0            END OF COMMAND POINTER LIST\r
+;\r
+;      RH=ADR LH=0     ADR IS ADDRESS OF THE NEXT SECTION OF THE\r
+;                      COMMAND POINTER LIST\r
+;      RH=L-1 LH=-N    OUTPUT TO DISPLAY THE N WORDS OF COMMANDS\r
+;                      BEGINNING AT LOCATION L.\r
+\r
+;      NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST.\r
+\r
+;      ALL ADDRESS ARE CHECKED FOR VALIDITY (I.E.. THEY MUST\r
+;      BE WITHIN USER ARE) BEFORE ANY MEM REF IS MAD.\r
+\r
+;IF THE T30 SWITCH = 1 THIS IS THE ROUTINE FOR A DEC\r
+;TYPE 30 DISPLAY WITH A TYPE 348 INTERFACE.\r
+;OTHERWISE IT IS THE ROUTINE FOR A DEC TYPE 340.\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DISDDB,DISIOS,PENLOC,DISNT,DISBKO,DISHI,DISONE,DISAV,OFFDIS\r
+EXTERNAL DISAV1,DISREL,DISCON,DISNXT\r
+INTERNAL DISNX1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;DIS DEVICE DATA BLOCK\r
+       INTERN  DISDDB\r
+DISDDB:        SIXBIT  /DIS/\r
+       XWD     ^D60*HUNGST,0\r
+DISIOS:        0\r
+       EXP     DISDSP\r
+       XWD     DVDIS+DVOUT+DVIN+DVLNG,2000\r
+       0\r
+       0\r
+       XWD     PROG,0\r
+       0\r
+PENLOC:        0\r
+DISPNT:        0\r
+DISBKO:        0\r
+DISHI: 0\r
+DISONE:        0\r
+DISAV: 0\r
+DISAV1:        0\r
+DISREL:        XWD     TAC,0\r
+       XP      OFFDIS,0\r
+IFE T30,<\r
+DISCON:        EXP ONDIS>\r
+IFN T30,<\r
+DISCON: 0>\r
+\r
+XP PENDDR,0            ;TO SATISFY A REQUEST IN COMMON.\r
+                       ; THERE IS NOT REALLY A PEN DDB.\r
+>\r
+\f\r
+IFN T30,<\r
+DIS=134                ;TYPE 30 DISPLAY DEVICE NUMBER\r
+>\r
+DISTAR=100     ;CLOCK FINISHED BEFORE PICTURE\r
+DISWAT=200     ;PICTURE FINISHED BEFORE CLOCK\r
+DISCKR=400     ;CLOCK REQUEST IN CLOCK QUEU\r
+DISUUI=1000\r
+\r
+IFE T30,<\r
+DISBSY=77\r
+PENON=7400\r
+>IFN T30,<\r
+DISBSY=2000\r
+PENON=1000\r
+>\r
+\r
+EXTERN JOBPFI\r
+\r
+EXTERN DISSAV,DISBLK,DISJSR,PENSAV\r
+       EXTERN DISCHN,PENCHN\r
+       EXTERN  DISCHL,PENCHL\r
+       EXTERN  DISSAV,DISRET\r
+       EXTERN  DISPON,DISPOF\r
+\r
+       EXTERN  ADRERR,SETIOD\r
+       EXTERN  PION,PIOFF,CLOCK\r
+       EXTERN CPOPJ1,UERROR,URREL,STOTAC,JOB,JBTSTS,JBTADR,PJOBN\r
+IFE T30,<      EXTERN ONDIS,NONDIS>\r
+\r
+INTERN PENINT,DISINT,DISFIN\r
+ENTRY DISDSP\r
+\r
+       DEFINE ADRCHK(A)\r
+<      \r
+               CAILE   A,JOBPFI\r
+               CAMLE   A,DISHI\r
+               JRST    EXIT2\r
+>\r
+\f\r
+       JRST DISINI             ;INITIALIZATION\r
+       POPJ    PDP,            ;PRINT ERROR AND STOP JOB\r
+DISDSP:        JRST    DISSTP          ;RELEASE\r
+       JRST    DISSTP          ;CLOSE\r
+       JSP     DAT,UERROR      ;OUTPUT\r
+       JSP     DAT,UERROR      ;INPUT\r
+       JRST    CPOPJ1          ;ENTER\r
+       JRST    CPOPJ1          ;LOOKUP\r
+       JRST    DISOUT          ;DUMP OUPUT (THAT'S US)\r
+       JRST    DISIN           ;DUMP INPUT (AS IN PEN)\r
+       POPJ    PDP,            ;SETO\r
+       POPJ    PDP,            ;SETI\r
+       POPJ    PDP,            ;GETF\r
+       JRST    CPOPJ1          ;RENAME\r
+       POPJ    PDP,            ;CLOSE INPUT\r
+       POPJ    PDP,            ;DIRECTORY CLEAR\r
+       POPJ    PDP,            ;MTAPE\r
+\f\r
+;DISINI IS CALLED FOR RELEASE, CLOSE, AND SUNDRY ILLEGAL CONDITIONS\r
+;      WHICH WANT TO TURN THE DISPLAY OFF.  IT FIRST CONVINCES\r
+;      THE INTERRUPT LEVEL ROUTINES TO GO BACK TO SLEEP AND THEN\r
+;      TELLS THE MONITOR THAT THE DEVICE IS INACTIVE, LASTLY,\r
+;      IT TUERNS OFF THE INTERRUPT ASSIGNMENTS OF THE DISPLAY\r
+;      AND THE PI CHANNEL ASSOCIATED WITH THE DIS BLKO. IT RETURNS\r
+;      WITH A POPJ , SOMETIMES TO ITS CALLING ROUTINE AND SOMETIMES\r
+;      TO THE CHANNLE'S DISMISS ROUTINE, THE ADDRESS OF WHICH\r
+;      WAS CLEVERLY PLACED ON THE PUSHDOWN LIST WHEN AC'S \r
+;      WERE SAVED.  THUS IT CAN BE CALLED WITH EITHER A\r
+;      PUSHJ PDP,DISINI   OR A  JRST  DISINI.\r
+\r
+DISINI:\r
+IFE T30,<\r
+       CONO    DIS,100         ;PARAMETER MODE>\r
+IFN T30,<\r
+       MOVEI   TAC,PENCHN      ;SET UP CONO WORD WITH PROPER\r
+       ASH     TAC,3           ;  CHANNEL ASSIGNMENTS\r
+       ADDI    TAC,DISCHN\r
+\r
+       TRO     TAC,4000        ;SET DISPLAY READY BIT IN CONO WORD\r
+       MOVEM   TAC,DISCON>\r
+       JRST    DISIN1\r
+\r
+DISSTP:        MOVE ITEM,JOB           ;CLEAR NSHF SO JOB CAN BE SHUFFLED\r
+       MOVSI   TAC,NSHF+NSWP           ;CLEAR NSWP SO JOB CAN BE SWAPPED(IN CASE THIS IS A SWAPPING SYSTEM\r
+       ANDCAM  TAC,JBTSTS(ITEM)\r
+\r
+DISIN1:        SETOM   PENLOC\r
+       MOVSI   TAC,DISWAT+DISUUO       ;IGNORE FURTHER TRAPS\r
+       HRRI    TAC,IOACT       ;INDICATED DEVICE INACTIVE\r
+       ANDCAM  TAC,DISIOS      ;INTO DEVICE DATA BLOCK\r
+DISOFF:        CONO    DIS,OFFDIS      ;REMOVE THE DISPLAY'S CHANNE; ASSIGNMENTS\r
+       HLLZS   PENINT          ;DON'T EXPECT ANY ON LITE PEN\r
+       CONO    PI,DISPOF       ;TURN OFF DISPLAY'S BLKO CHANNEL\r
+       POPJ    PDP,\r
+       \r
+DISINT:        JRST DISFIN\r
+       JRST    DISINT          ;...\r
+\f\r
+;PENINT        RECIEVES CONTROL ON INTERRUPTS ON THE DISPLAY NON-DATA\r
+;      CHANNEL (SPECIAL CHANNEL). IT DECIDES IF THE INTERRUPT\r
+;      WAS VALID, AND IF SO, TRANSFERS CONTROL TO AN APPROPRIATE ROUTINE\r
+\r
+IFE T30,<\r
+PENINT:        CONSO   DIS,0           ;CHECK FOR CONI FLAGS\r
+       JRST    PENINT          ;TO OTHER DEVICES ON SAME CHANNEL\r
+       CONSZ   DIS,400         ;STOP FLAG\r
+       JRST    STPFLG\r
+       CONSZ   DIS,2000        ;PEN FLAG?\r
+PENFLG:        DATAI   DIS,PENLOC      ;STORE CURRENT LITE PEN LOC\r
+       CONO    DIS,NONDIS      ;CLEAR FLAG\r
+       JEN     @PENCHL         ;DISMISS INTERRUPT\r
+\r
+;STPFLG        SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING\r
+;      A CLOSE ON THE DISPLAY\r
+\r
+STPFLG:        JSR     PENSAV          ;STOP FLAG, SAVE AC'S AND SETUP RETURN\r
+       JRST    DISDSP+DCL      ;DO A CLOSE AND DISMISS INTERRUPT\r
+>\r
+\r
+IFN T30,<\r
+PENINT:        CONSO DIS,0             ;CHECK FOR CONI FLAGS\r
+       JRST PENINT             ;TO OTHER DEVICES ON SAME CHANNEL\r
+       DATAI DIS,PENLOC        ;CLEAR PEN INTERRUPT\r
+       MOVEM TAC,PENLOC        ;SAVE AC TAC\r
+       MOVE TAC,DISBKO         ;GET ABSOLUTE ADR OF NEXT DATA ELEMENT\r
+       SUB TAC,DISREL          ;MAKE ADDRESS RELATIVE\r
+       HRRZS   TAC             ;CLEAR OUT GARBAGE IN THE LEFT HALF\r
+       EXCH TAC,PENLOC         ;SAVE ADR IN PENLOC AND RESTORE TAC\r
+       JEN @PENCHL             ;DISMIS THE INTERRUPT\r
+>\r
+\f\r
+;DISNXT        IS CALLED WITH A   JSR DISNXT,  IT SETS UP THE NEXT\r
+;      POINTER FOR THE DISPLAY'S BLKO BY INTERPRETING A\r
+;      COMMAND LIST SUPPLIED BY THE USER,  THIS COMMAND LIST\r
+;      IS DESCRIBED AT THE BEGINNING OF THE PROGRAM.  IF THE\r
+;      DATA TO BE TRANSMITTED TO THE DISPLAY WOULD VIOLATE THE\r
+;      MEMORY PROTECTION, THEN THE ROUTINE RETURNS TO THE\r
+;      CALLING LOCATION +1. OTHERWISE, IF THERE\r
+;      IS NO FURRTHER DATA TO BE OUTPUT (AS INDICATED BY THE\r
+;      USER'S COMMAND LIST) THE ROUTINE RETURNS TO THE CALLING\r
+;      LOCATION +2. OTHERWISE, THE NEXT POINTER FOR THE BLKO\r
+;      IS PLACED IN DISBLKO AND THE ROUTINE RETURNS TO THE CALLING\r
+;      LOCATION +3.\r
+\r
+IFE FTCHECK+FTMONP,<\r
+DISNXT:        0                       ;JSR AT INTERRUPT OF UUO LEVELS\r
+>\r
+DISNX1:        AOS     TAC,DISPNT      ;GET NEXT POINTER FROM LIST\r
+ILUP:  HRRZM   TAC,DISPNT      ;UPDATE POINTER POINTER\r
+       ADRCHK  TAC\r
+       MOVE    TAC,@DISREL     ;GET NEXT WORD IN POINTER LIST\r
+       MOVEM   TAC,DISBKO      ;PLACE IN BLOK POINTER\r
+       HLROM   TAC,DISAV1      ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO)\r
+IFN T30,<\r
+       JUMPE   TAC,EXIT1       ;END OF COMMAND LIST?\r
+       TRNN    TAC,-1          ;INTENSITY?\r
+       JRST    INTCHK          ;YES>\r
+IFE T30,<\r
+       TRNN    TAC,-1  ;END OF COMMAND LIST?\r
+       JRST    EXIT1   ;YES>\r
+       TLZN    TAC,-1          ;NO. POINTER TO NEW LIST?\r
+       JRST    ILUP            ;YES.\r
+       CAIL    TAC,JOBPFI      ;NO. ADDRESS IN BOUNDS?\r
+       CAML    TAC,DISHI\r
+       JRST    EXIT2           ;NO\r
+       SUB     TAC,DISAV1      ;YES. ADR. OF LAST WORD IN BLOCK.\r
+       ADRCHK  TAC\r
+       HRRZ    TAC,DISREL      ;FORM ABSOLUTE ADDR\r
+       ADDM    TAC,DISBKO      ;IN THE BLKO POINTER WORD\r
+       AOS     DISNXT          ;RETURN 2,4\r
+EXIT1: AOS     DISNXT\r
+EXIT2: MOVE    TAC,DISAV\r
+       CONO    DIS,@DISCON     ;SET UP DISPLAY STATUS WORD\r
+       JRST    2,@DISNXT       ;...\r
+\r
+IFN T30,<\r
+INTCHK:        MOVSS   TAC             ;PLACE INTENSITY IN CONO WORD\r
+       DPB     TAC,INTPNT\r
+       JRST    DISNX1          ;GET NEXT POINTER\r
+INTPNT:        POINT 3,DISCON,29>\r
+\f\r
+;DISFIN        RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES\r
+;      ZERO.  IT SAVES THE TWO AC'S WHICH DISNXT USES AND\r
+;      DOES A JRST TO DISNXT.  ON A NORMAL RETURN IT RESTORES THE\r
+;      AC'S AND DISMISSES THE INTERPUT. ON A "NO MORE DATA"\r
+;      RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER\r
+;      DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING.\r
+\r
+DISFIN:        MOVEM   TAC,DISAV       ;SAVE AC'S\r
+       JSR     DISNXT          ;SETUP NEXT BLKO POINTER\r
+       JRST    ADRER\r
+       JRST    DVT2            ;RETURN HERE IF NO NEXT POINTER\r
+       JEN     @DISCHL         ;LET THE SCOPE DO THE REST\r
+\r
+;DVT2  RECIVES CONTROL AT INTERRUPT LEVEL WHEN THE COMMAND LIST\r
+;      (SUPPLIED BY THE USER) RUNS OUT. IT SAVES THE AC'S FOR\r
+;      THIS CHANNEL AND IN THE PROCESS ENABLES REUTRNS BY POPJ\r
+;      AND SIMILAR GOOD THINGS SINCE IT ALSO STORES THE PC FROM\r
+;      THE JSR IN THE GENERAL PC LOCATION FOR THIS CHANNEL\r
+;      IF THE DISPLAY IS OFF. IT DOES NOT RESTART IT.\r
+\r
+;      IT CHECKS TO SEE IF THE CLOCK HAS RUN OUT BEFORE THE PICTURE;\r
+;      IF SO, IT CALLS DISBEG TO RESTART THE DISPLAY WITH A NEW\r
+;      COMMAND LIST.  IT TURNS OFF THE IO ACTIVE BIT WHICH WAS\r
+;      TURNED ON BY THE OUTPUT ROUTINE; THIS INSURES THAT ANY\r
+;      OUTPUT COMMAND WILL DISPLAY AT LEAST ONE PICTURE. IF\r
+;      THE JOB WAS IN AN IO-WAIT, IT IS RELEASED.\r
+\r
+DVT2:  JSR     DISSAV          ;ASK EXEC TO SAVE AC'S\r
+       MOVEI DEVDAT,DISDDB     ;SETUP ACS\r
+       MOVSI   TAC,SHF\r
+       MOVSI   DAT,NSHF\r
+       LDB     ITEM,PJOBN\r
+       PUSHJ   PDP,DISOFF\r
+       MOVSI   IOS,DISWAT      ;INDICATE PICTURES FINISHED\r
+       IORB    IOS,DISIOS      ;...\r
+       TLON    IOS,DISUUI      ;RESUME DISPLAY, NEW UUO.\r
+       JRST    DVT6            ;YES, STAY IN IO WAIT\r
+       TDNE    TAC,JBTSTS(ITEM)        ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?>\r
+       JRST    DVT4            ;YES\r
+       TLNE    IOS,DISTAR      ;HAS CLOCK TRIGGERED?\r
+       PUSHJ   PDP,DISBEG      ;YES, RESTART DISPLAY\r
+       JRST DVT3\r
+DVT4:  TLNE    IOS,DISTAR      ;DID CLOCK FINISH BEFORE PICTURE?\r
+       PUSHJ   PDP,CLKREQ      ;YES, PUT IN CLOCK REQUEST.\r
+DVT5:  ANDCAM  DAT,JBTSTS(ITEM)        ;TURN OFF NSHF SO JOB CAN BE SHUFFLED\r
+DVT3:  MOVE    IOS,DISIOS      ;BIT FIDDLING TIME\r
+       TRZ     IOS,IOACT       ;SIGNAL DISPLAY CAN BE CLOSED\r
+       TLZE    IOS,IOW         ;IS DISPLAY CAUSING AN IO-WAIT?\r
+       PUSHJ   PDP,SETIOD      ;UNWAIT THE JOB\r
+       MOVEM   IOS,DISIOS      ;RESTORE IO CONTROL WORD\r
+       JRST    DISRET          ;RESTORE AC'S AND DISMISS\r
+DVT6:  MOVEM   IOS,DISIOS\r
+       PUSHJ   PDP,DISBEG      ;START NEW COMMAND LIST\r
+       JRST    DISRET\r
+\f\r
+;DISREG        IS CALLED WITH A PUSHJ PDP,DISBEG,  IT DISABLES THE\r
+;      DISPLAY ITSELF (BY USING DISOFF) AND ALSO DISABLES THE\r
+;      CLOK RESTART AND RESETS THE POINTER TO THE USER'S\r
+;      COMMAND LIST TO THAT SPECIFIED ON THE LAST OUTPUT\r
+;      MINUS ONE.  IT ASKES DISNXT TO SET UP THE NEXT BLKO POINTER\r
+;      IF DISNXT IS UNSUCCESSFUL (I.E., IF THE USER COMMAND LIST\r
+;      IS NULL), THEN THE ROUTINE DOES A CLOSE. OTHERWISE, A\r
+;      REQUEST IS ENTERED FOR A CLOCK INTERRUPT AT THE END OF \r
+;      AT MOST TWO JIFFIES.  THIS CLOCK QUEUE REQUEST IS ENTERED\r
+;      ONLY IF THERE IS NONE ALREADY IN THE QUEUE.  THE PI\r
+;      CHANNELS FOR THE DISPLAY ARE TURNED ON AGAIN AND THE\r
+;      DISPLAY IS INITIALIZED BY A CONO.  IT SHOULD THEN REQUEST\r
+;      DATA AS SOON AS THE PI CHANNEL FOR THE BLKO IS TURNED ON.\r
+;      IT TURNS THIS CHANNEL ON AND RETURNS TO ITS CALLER.\r
+\r
+DISBEG:        MOVSI   IOS,DISTAR+DISWAT       ;INDICATE FRESH DISPLAY\r
+       ANDCAM  IOS,DISIOS              ;...\r
+       HRRZ    TAC1,DISONE     ;GET POINTER LIST ADDR (-1)\r
+       HRRZM   TAC1,DISPNT     ;RESET POINTER POINTER WITH IT\r
+       JSR     DISNXT          ;ASK FOR FIRST WORD FOR BLKO\r
+       JRST    ADRER1\r
+       JRST    DISSTP          ;NULL LIST, CLOSE\r
+       PUSHJ   PDP,CLKREQ      ;ENTER CLOCK QUEUE REQUEST\r
+       CONO    DIS,@DISCON     ;INITIALIZE THE DISPLAY\r
+       MOVEI   TAC,PENON       ;ALLOW SPECIAL PI INTERRUPTS\r
+       HRRM    TAC,PENINT      ;...\r
+       CONO    PI,DISPON       ;ALLOW BLKO INTERRUPTS\r
+       POPJ    PDP,            ;RETURN\r
+\r
+CLKREQ:        MOVSI   IOS,DISCKR      ;IF NO CLOCK INTERRUPT REQUESTED\r
+       MOVE    TAC,CLOKRT      ;RESET TIMER\r
+       CONO    PI,PIOFF        ;INHIBIT INTERRUPTS\r
+       TDON    IOS,DISIOS      ;ENTER ONLY A SINGLE CLOCK REQUEST\r
+       IDPB    TAC,CLOCK       ;PLACE REUQEST IN QUEUE\r
+       IORM    IOS,DISIOS      ;PROTECT AGAINST A DUPLICATE REQUEST\r
+       CONO    PI,PION         ;UNINHIBIT INTERRUPTS\r
+       POPJ    PDP,            ;RETURN\r
+\r
+CLOKRT:        XWD     CLOK,2          ;CONTROL FOR CLOCK QUEUE: 2 JIFFIES\r
+                               ;TWO JIFFIES\r
+\f\r
+;CLOK  IS CALLED AT THE CLOCK LEVEL IN RESPONSE TO A REQUEST\r
+;      IN THE CLOCK QUEUE.  A BIT IS SET TO INDICATE THAT THE\r
+;      CLOCL PERIOD HAS ELAPSED.  IF THE DISPLAY IS STILL IN\r
+;      PROGRESS, CLOK RETURNS AT THIS POINT.  OTHERWISE, CLOK\r
+;      GOES TO DISBEG TO START UP THE DISPLAY.  DISBEG RETURNS\r
+;      WITH A POPJ PDP,\r
+\r
+CLOK:  MOVSI   IOS,DISCKR      ;INDICATE CLOCK REQUEST SERVICED\r
+       ANDCAB  IOS,DISIOS      ;...\r
+       TLDE IOS,DISUUI\r
+       MOVSI   IOS,DISTAR      ;ASK DISPLAY TO RESTART\r
+       IORB    IOS,DISIOS      ;...\r
+       TLNN    IOS,DISWAT      ;HAS DISPLAY FINISHED?\r
+       POPJ    PDP,            ;NO. WIAT FOR IT TO DO SO\r
+       MOVEI   DEVDAT,DISDDB\r
+       MOVSI   TAC,NSHF\r
+       LDB     ITEM,PJOBN\r
+       TDNE    TAC,JBTSTS(ITEM)        ;IS SHUFFLE LOCKED OUT?\r
+       JRST    DISBEG          ;YES, RESTART DISPLAY AND RETURN\r
+\r
+       IORM    TAC,JBTSTS(ITEM)        ;NO. LOCK IT OUT.\r
+       MOVE    TAC,JBTADR(ITEM)        ;RESET DISHI AND DISREL AFTER SHUFFLING\r
+       HLRZM   TAC,DISHI\r
+       HRRM    TAC,DISREL\r
+       JRST    DISBEG          ;RESART DISPLAY AND RETURN\r
+\r
+;ADRER SERVICES PROTECTION VIOLATIONS DISCOVERED BY DISNXT.\r
+;      IT DOES A CLOSE AND THEN CALLS THE MONITOR'S ERROR PRINTING\r
+;      ROUTINES TO INFORM THE USER.\r
+\r
+ADRER: JSR     DISSAV          ;SAVE AC'S AGAIN\r
+ADRER1:        PUSHJ   PDP,DISDSP+DCL  ;DO A CLOSE\r
+       MOVEI   DEVDAT,DISDDB   ;TELL ERROR ROUTINE WHO'S UNHAPPY\r
+       JRST    ADRERR          ;GO GRIPE\r
+;DISIN HANDLES LITE PEN UUO (INPUT) IN A RUDIMENTARY FASHION\r
+;      BY RETURNING (TO THE ADDR SPECIFIED BY THE ADDR FIELD\r
+;      OF THE INPUT UUO) THE LAST PEN COORIDNATES SEEN,\r
+\r
+DISIN: MOVNI   TAC,1\r
+       EXCH    TAC,PENLOC      ;GET LATEST COORDINATES,\r
+       JRST    STOTAC          ;STORE AND RETURN\r
+\f\r
+;DISOUT        DOES THE WORK OF THE OUTPUT UUO.  IT SETS A BIT TO\r
+;      INDICATE THAT THE DEVICE IS ACTIVE AND INHIBITS\r
+;      INTERUPTS WHICH MAY STILL BE IN PROGRESS. SINCE THE\r
+;      MONITOR CALLS WSYNCE BEFORE COMING HERE. THE USER IS\r
+;      GUARANTEED AT LEAST ONE PICTURE/OUTPUT.  THE USERS MEMORY\r
+;      BOUNDS ARE STORED FOR QUICK USE AT INTERRUPT LEVEL W/0\r
+;      SAVING AC'S.  THE LOCATION OF THE COMMAND LIST (-1) IS\r
+;      STORED FOR USE IN SETTING UP BLKO POINTERS.  THE PI\r
+;      LOCATIONS (40 + 2J) ARE INITIALIZED WITH A BLKO IN\r
+;      THE EVEN LOCATIONS AND A JSR TO DISFIN IN THE ODD LOCATION,\r
+;      THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE\r
+;      A POPJ PDP, IT RETURNS ON BEHALF OF THE OUTPUT UUO.\r
+\r
+DISOUT:        TLO     IOS,IO+DISWAT   ;INDICATE OUTPUT; REQUEST START UP\r
+       TRO     IOS,IOACT       ;INDICATE DEVICE ACTIVE\r
+       SUBI    UUO,1           ;ALLOW FOR INCREMENT AT INTERRUPT\r
+       MOVE    TAC,BLKLIT      ;FEEDS WORDS TO THE DISPLAY\r
+       MOVEM   TAC,DISBLK      ;FROM EVEN NUMBERED INTERRUPT LOC\r
+       MOVE    TAC,JSRLIT      ;SERVICE THE END OF BLKO\r
+       MOVEM   TAC,DISJSR      ;FROM ODD INTERRUPT LOC\r
+       MOVEI   TAC,PENON       ;SETUP CONSO BITS ON SPECIAL CHANNEL\r
+       HRRM    TAC,PENINT      ;...\r
+       IORB    IOS,DISIOS      ;SET IOACT ON; INDICATE OUTPUT\r
+       HRRZM   UUO,DISONE      ;SET NEW COMMAND LIST ORIGIN\r
+       MOVSI IOS,DISUUI\r
+       IORM    IOS,DISIOS      ;ALLOW DISPLAY\r
+       CONSZ   DIS,@DISCON     ;DISPLAY ALREADY IN USE\r
+       ANDCAM IOS,DISIOS\r
+       JRST    CLKREQ          ;ENTER CLOCK QUEUE REQUEST AND POPJ\r
+\r
+BLKLIT:        BLKO    DIS,DISBKO\r
+JSRLIT:        JSR     DISCHL\r
+       END\r
+       \r
+       \r
diff --git a/src/dist30.mac b/src/dist30.mac
new file mode 100644 (file)
index 0000000..ef7237d
--- /dev/null
@@ -0,0 +1,4 @@
+;PARAMETER FILE FOR DISSER.MAC\r
+;USED ONLY TO ASSEMBLE DISSER TO MAKE TYPE 30 SERVICE INSTEAD OF TYPE 340\r
+\r
+T30=1  ;FLAG THAT TYPE 30 IS WANTED\r
diff --git a/src/dlsint.mac b/src/dlsint.mac
new file mode 100644 (file)
index 0000000..9699578
--- /dev/null
@@ -0,0 +1,120 @@
+TITLE  DLSINT - INT. SERV. FOR DLS (DATA LINE SCANNER DC10)\r
+SUBTTL M.FREDRIKSEN/RCC TS  01 JUN 69 V005\r
+XP     VDLSIT,005\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER\r
+\r
+EXTERN TYPX\r
+\r
+IFE FTTTYSER,<XP FULTWX,200000>\r
+\r
+IFN FTTTYSER,<XP FULTWX,4>\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+       CHREC=TEM       ;AC FOR CHARACTER\r
+       DDB=DEVDAT      ;ADDRESS OF DEVICE DATA BLOCK\r
+       LINE=TAC1       ;SCANNER LINE NUMBER\r
+       HPOS=DAT        ;HORIZONTAL POSITION OF TTY.(0-71)\r
+\r
+;BYTE POINTERS\r
+\r
+EXTERNAL PLASTC\r
+\r
+\r
+DLS=240                        ;DC10 DEVICE NUMBER\r
+;BITS IN CHREC TO COMMUNCATE WITH DLS\r
+\r
+USDRLN=100             ;USE DIRECTED LINE NUMBER\r
+TDSABL=400             ;TRANSMIT DISABLE\r
+RCVBIT=400             ;RECEIVE BIT AFER DATAI DLS,CHREC\r
+\f\r
+;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE\r
+;CALL: MOVEI   TAC,CHANNEL NUMER\r
+;      PUSHJ   PDP,SCNINI\r
+\r
+INTERNAL SCNINI\r
+DLSINI:\r
+SCNINI:        CONO    DLS,40          ;INIT DLS COMPLETELY (I/O/RESET)\r
+       CONO    DLS,(TAC)       ;ASSIGN PI CHANNEL NUMBER\r
+       POPJ    PDP,\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE\r
+\r
+ENTRY DLSINT\r
+\r
+INTERNAL SCNINT\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT\r
+\r
+DLSINT:\r
+SCNINT:        CONSO   DLS,30          ;ANY INTERRUPTS ON DLS\r
+       JRST SCNINT             ;NO\r
+       JSR SCNSAV\r
+       DATAI   DLS,CHREC       ;GET CHARACTER & LINE INFO\r
+       HLRZ    LINE,CHREC      ;PUT LINE NUMBER IN AC LINE\r
+       CAIL    LINE,TCONLN     ;ARE WE ENABLED FOR THIS LINE NUMBER?\r
+       JRST    SCNIN2          ;NO,TURN OFF TRANSMIT(IF ON) AND DISMISS\r
+       TRNE    CHREC,RCVBIT    ;WAS IT A RECEIVER INTERRUPT?\r
+       JRST    RECINT          ;YES, RECEIVER INT. HANDLER\r
+       DATAO   DLS,[EXP TDSABL]        ;CLEAR HARDWARE FLAG\r
+       JRST    XMTINT          ;GO PROCESS CHAR IN SCNSRF OR SCNSRH\r
+\f\r
+;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES.\r
+\r
+EXTERNAL INJEST,DDBSRC\r
+INTERNAL TCOMM\r
+\r
+TCOMM:\r
+       SKIPE DDB,TTYTAB(LINE)  ;DATA BLOCK ASSIGNED?\r
+       JRST INUSE              ;YES\r
+       PUSHJ PDP,DDBSRC        ;SEARCH FOR FREE TTY DEV. DATA BLOCK\r
+       JRST TYPX               ;NONE FOUND, TYPE X\r
+       MOVEI HPOS,0            ;ASSUME TTY IS AT BEGIN OF FORM\r
+       CAILE LINE,TCONLN       ;PSEUDO CONSOLE?\r
+       JRST INJEST             ;YES\r
+       CAIN    LINE,TCONLN     ;IS IT THE CTY ?\r
+       JRST INUS2              ;YES, ACCPT CHAR AND PROCESS\r
+       JRST TYPE               ;NO, ECHO CHAR ON FULL DUPLEX\r
+                               ;BEFORE PROCESSING IT\r
+\r
+                               ;HERE IF LINE NUMBER TOO BIG\r
+SCNIN2:        DATAO   DLS,[EXP TDSABL]                ;SET TRANSMIT DISABLE BIT AND OUTPUT IT\r
+                               ;(JUST INCASE, ELSE IT WILL INTERRUPT IMMEDIATLY AGAIN)\r
+       POPJ    PDP,            ;DISMISS INTERRUPT\r
+\f\r
+\r
+;COMMON TO RECEIVE AND TRANSMIT.\r
+\r
+INUSE: HRRZS  DDB      ;LINE DISABLED IF RH TTYTAB=-1\r
+       CAIN DDB,-1\r
+       POPJ PDP,\r
+       MOVE IOS,DEVIOS(DDB)    ;SETUP IOS\r
+       CAIL    LINE,TCONLN     ;CTY OR PTY ?\r
+       JRST INUS2              ;YES\r
+       TLNE IOS,FULTWX         ;IS THIS SELF ECHOEING FULL DUPLEX?\r
+       JRST INUS2              ;YES,(USER TYPED CONROL B)\r
+       HRL     CHREC,LINE      ;INSERT LINE NUMBER IN DATAO\r
+       TLO     CHREC,USDRLN\r
+       TRZ     CHREC,TDSABL\r
+       DATAO   DLS,CHREC\r
+       DPB CHREC,PLASTC\r
+       POPJ PDP,               ;DISMISS INTERRUPT\r
+\r
+;ROUTINE TO OUTPUT A CHARACTER ON A LINE\r
+;CALLED FROM TYP OR TYPL IN SCNSER\r
+\r
+INTERNAL SCNTYP\r
+\r
+SCNTYP:\r
+DLSTYP:        HRL     CHREC,LINE      ;SET UP LINE NUMBER IN CHREC\r
+       TLO     CHREC,USDRLN            ;USE THAT AS DIRECTED LINE#\r
+       TRZ     CHREC,TDSABL            ;INSURE TRANSMISSION NOT DISABLED\r
+       DATAO   DLS,CHREC               ;OUT IT GOES\r
+       SKIPE   DDB\r
+       DPB CHREC,PLASTC        ;SAVE CHAR FOR FULL DUPLEX\r
+       POPJ PDP,\r
+\r
+       LIT\r
+\r
+DLSEND:        END\r
diff --git a/src/dpdint.mac b/src/dpdint.mac
new file mode 100644 (file)
index 0000000..d20703c
--- /dev/null
@@ -0,0 +1,238 @@
+TITLE  DPDINT - DATA PRODUCTS DISK INTERRUPT SERVICE\r
+SUBTTL A. BLACKIGNTON/CMF TS  12 JAN 69  V401\r
+       XP      VDPDIT,401\r
+\r
+DCB=204                ;DATA-CONTROL-B\r
+DF=270         ;DISK-FILE\r
+DSK=DF\r
+\r
+;THIS NEXT CONSTANT MUST BE SET TO MATCH CAPACITY OF THE PARTICULAR DISK FILE---\r
+INTERNAL LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER\r
+LBHIGH: 130000-1\r
+\r
+;START A WRITE ON DISK FILE\r
+\r
+;AT ENTRY,             C(TAC 18-35)= LOGICAL BLOCK NUMBER\r
+;                      C(TAC1)     = IOWD\r
+\r
+INTERNAL DFWRT,DFRED\r
+EXTERNAL DSKX8,DCBBIT,DSKBIT,DSKCHN,DCBCHN.ERRPNT,DSKX9\r
+ENTRY LDDINT\r
+LDDINT:\r
+\r
+DFWRT:\r
+DFWRT1:        MOVEM TAC1,IOWRD\r
+       MOVE TAC1,[BLKO DCB,IOWRD]\r
+       JSR DFRW                ;SET UP DISK ADDRESS\r
+\r
+       TLO TAC,WLE             ;ENABLE WRITE LOCK ERROR\r
+       HRRI TAC,DSKCHN ;TURN ON DISK\r
+       IORI TAC,WRT+CLE+EIS+ENE\r
+       STARTDV DSK\r
+       HRRZI TAC,DCBCHN\r
+       CONO DCB,OUT+DAR+BR+P18+DFNUM(TAC)      ;TURN ON DATA-CONTROL-B\r
+       POPJ PDP,\r
+;SIMILAR ROUTINE FOR READ\r
+\r
+DFRED:\r
+DFRED1:        MOVEM TAC1,IOWRD\r
+       MOVE TAC1,[BLKI DCB,IOWRD]\r
+       JSR DFRW\r
+\r
+       HRRI TAC,DSKCHN\r
+       IORI TAC,RED+CLE+EIS+ENE        ;TURN ON DISK\r
+       STARTDV DSK\r
+       POPJ PDP,\r
+\f\r
+;SERVICE INTERRUPT ON DATA-CONTROL-B\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFE FTCHECK+FTMONP,<\r
+INTERNAL DCBINT\r
+\r
+DCBINT: Z\r
+>\r
+DCBIN1:        MOVEM TAC,ACSAV\r
+       HRRZI TAC,DCBBIT\r
+       CONO PI,1000(TAC)       ;TURN OFF DCB CHANNEL\r
+       CONI DCB,DCBERR         ;SAVE STATUS OF DATA CONTROL\r
+       HRRZI TAC,DSKCHN\r
+       CONSO DCB,OUT   ;SKIP IF  WRITING\r
+       CONO DF,END+EIS(TAC)\r
+       MOVE TAC,ACSAV\r
+       JEN @DCBINT\r
+JSRDBC:        JSR DCBINT              ;JSR STORED IN INTERRUPT CELL\r
+\r
+;DISK & DCB FLAGS\r
+\r
+ADE=1B29       ;ADDRESS ERROR\r
+ADT=1B20       ;ADDRESS TERMINATED\r
+ALM=1B30       ;ALARM\r
+CME=1B27       ;COMMAND ERROR\r
+DCE=1B26       ;DATA CLOCK ERROR\r
+MISS=1B23      ;DATA MISSED FLAG\r
+DRLATE=1B31    ;DATA REQUEST LATE\r
+RCE=1B32       ;READ COMPARE ERROR\r
+PAR=1B33       ;PARITY ERROR\r
+IDS=1B18       ;IDLE STATE (1 IF IDLE)\r
+NOPR=1B35      ;OPERABLE  (1 IF NOT)\r
+WLE=1B28       ;WRITE-LOCK ERROR\r
+OUT=1B27       ;OUTPUT INDICATION\r
+CLE=1B28       ;CLEAR ERROR FLAGS\r
+FER=1B34       ;FILE ERROR\r
+DVERAS=DRLATE+RCE+PAR+ADE+CME+DCE+ALM+NOPR+FER\r
+BR=1B26                ;BUFFER REQUEST FLAG FOR DCB\r
+DAR=1B25       ;DATA ACCUMULATOR REQUEST\r
+DFNUM=5B32     ;DISK NUMBER DOR DATA CONTROL\r
+END=1B23       ;END-SECTOR\r
+EIS=1B32       ;ENABLE IDLE STATE\r
+XMOVE=1B24     ;BUFFER ACCUMULATOR MOVE FLAG\r
+P18=3B29       ;PACK 2 18-BIT BYTES\r
+RED=1B26       ;READ INDICATOR\r
+WRT=2B26       ;WRITE INDICATOR\r
+ENE=1B29       ;ENABLE ERROR INTERRUPT\r
+\f\r
+;INTERRUPT ROUTINE TO HANDLE SECTOR-END FLAG.\r
+;CHECK FOR ERRORS.  IF THE JOB IS COMPLETED (SIOWD = 0), GO TO\r
+;DEVICE INDEPENDENT PACKAGE, ELSE CONTINUE THE JOB.\r
+\r
+INTERN DSKINT\r
+EXTERNAL DFINT,DSKSAV\r
+\r
+DSKINT:        CONSO DF,@DSKCON\r
+       JRST DSKINT             ;ALTERED BY INITIALIZATION\r
+       JSR DSKSAV\r
+       HRRZI TAC,DCBBIT\r
+       CONO PI,1000(TAC)       ;MAKE SURE DCB IS OFF\r
+       HLLZS DSKCON\r
+       MOVEI   IOS,0\r
+       SKIPE   DSKIOS          ;ERROR WAIT?\r
+       JRST DSKIN3             ;YES\r
+       MOVEI TAC1,DVERAS\r
+       CONSZ DCB,OUT\r
+       TRO TAC1,WLE\r
+\r
+       CONSZ DF,(TAC1)         ;ERROR?\r
+       SETZM SIOWD             ;YES, DO NOT DO MORE NOW\r
+       MOVE TAC,DCBERR         ;PICK UP DATA-CONTROL STATUS\r
+       TRNN TAC,MISS           ;DATA-MISSED FLAG ON?\r
+       CONSZ DF,DVERAS-PAR     ;NO, DISK ERRORS?\r
+       ORI IOS,IODERR          ;YES, SET DEVICE ERROR FLAG.\r
+       CONSZ DF,PAR            ;PARITY ERROR?\r
+       IORI IOS,IODTER         ;YES\r
+       TRZ TAC1,DVERAS\r
+       CONSZ DF,(TAC1)         ;WRITE-LOCK?\r
+       ORI IOS,IOIMPM          ;YES\r
+       CONO DF,CLE             ;CLEAR DISC ERRORS\r
+       JUMPN   IOS,DSKIN2\r
+       SKIPN SIOWD             ;JOB DONE?\r
+       JRST DFINT              ;YES, RETURN TO DEV, INDEP, ROUT.\r
+                               ;WITH ERROR FLAGS\r
+\r
+       MOVE TAC,SRECN          ;   AND BLOCK NUMBER\r
+       ADDI TAC,1\r
+       IMULI TAC,^D44\r
+       MOVE TAC1,SIOWD\r
+       CONSO DCB,OUT\r
+       JRST DFRED1\r
+       JRST DFWRT1\r
+\f\r
+DSKIN2:\r
+       HRRZI TAC,DSKCHN\r
+       CONO DF,END+EIS(TAC)    ;SEND END AND ENABLE FOR IDLE\r
+                               ;FOLLOWING ERROR\r
+       MOVEM   IOS,DSKIOS      ;SAVE ERROR FLAGS\r
+       MOVEI   IOS,IDS+DVERAS\r
+       HRRM    IOS,DSKCON\r
+       POPJ    PDP,0   ;DISMISS\r
+\r
+DSKIN3:        MOVE    IOS,DSKIOS      ;PICK\r
+       CONO DF,0\r
+       JRST    DFINT\r
+\f\r
+;SET UP FOR READ AND WRITE\r
+\r
+IFE FTCHECK+FTMONP,<\r
+DFRW:  Z\r
+>\r
+DFRW1: MOVEM TAC1,DSKX8        ;SET UP INTERRUPT LOC\r
+\r
+;CONVERT FROM LOGICAL TO PHYSICAL SECTOR NUMBER.\r
+;ENTER WITH LOGICAL NUMBER IN TAC\r
+\r
+CNVBLK:        MOVEM TAC,SLBLK\r
+CNVBK2:        HRRZS TAC\r
+IFN FTRCHK,<\r
+       CAMLE TAC,LBHIGH        ;LOGICAL BLOCK NUMBER IN RANGE\r
+                                ;(COMPARE WITH HIGHEST LEGAL)?\r
+       HALT CNVERR             ;NO, HALT - IF CONTINUE PUSHED,\r
+                                ;THEN FLAG AS DEVICE ERROR\r
+>\r
+       IDIVI TAC,^D44\r
+\r
+       MOVEM TAC,SRECN         ;SAVE THE BLOCK NUMBER\r
+       SETZM SIOWD             ;CLEAR SAVED IOWD\r
+       LSH TAC,6\r
+       ADD TAC,TAC1\r
+       CONO DCB,0              ;INSURANCE\r
+       DATAO DF,TAC            ;SEND OUT ADDRESS \r
+       HLRZ TAC,IOWRD          ;WILL THIS I/O CAUSE A CHANGE\r
+       CAIL TAC,-200           ; IN POSITION ARM DURING READ OR\r
+       JRST CNVBK1             ; WRITE?\r
+       SUBI TAC1,^D44          ;MAYBE.\r
+       LSH TAC1,7\r
+       CAIL TAC,(TAC1)\r
+       JRST CNVBK1             ;NO, GO AHEAD AS IS.\r
+\r
+       MOVE TAC,IOWRD          ;PUT SMALLER SIZE IN IOWD.\r
+       HRLM TAC1,IOWRD\r
+       MOVMS TAC1              ;STASH AWAY NEXT.\r
+       HRLS TAC1\r
+       ADD TAC,TAC1\r
+       MOVEM TAC,SIOWD\r
+\r
+CNVBK1:        CONSO DF,ADT            ;ADDRESS GO OK?\r
+       JRST .-1                ;WAIT FOR IT\r
+       HRRZI TAC,DCBBIT\r
+       CONO PI,2000(TAC)       ;TURN ON DCB CHANNEL\r
+       MOVSI TAC,IDS+DVERAS\r
+       SETZM   DSKIOS\r
+       JRST @DFRW\r
+IFN FTRCHK,<\r
+CNVERR:        MOVEI IOS,IODERR        ;HERE ONLY IF OPERATOR PUSHES CONTINUE\r
+       JRST DFINT              ;FLAG AS DEVICE ERROR\r
+>\r
+; WAIT FOR DISK TO BE TURNED ON\r
+\r
+INTERNAL DISKUP\r
+\r
+DISKUP: SETZM DSKX8            ;ZERO THE BLKI/BLKO WORD\r
+       MOVE TAC,JSRDCB\r
+       MOVEM TAC,DSKX9         ;STORE JSR EXECUTED ON BLKI/BLKO COMPLETION\r
+       CONSZ DF,NOPR\r
+       JRST .-1\r
+       HRRZI TAC,DSKBIT\r
+       IORI TAC,DCBBIT\r
+       CONO PI,2200(TAC)\r
+       POPJ PDP,\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTENRAL SRECN,SIOWD,DSKIOS,SLBLK,DFRW,ACSAV,DCBERR,DCBINT,IOWRD,DSKCON\r
+INTERNAL DCBIN1,DFRW1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+INTERNAL       DSKCON\r
+SRECN: Z                       ;SAVE OF BLOCK NUMBER\r
+SIOWD: Z                       ;NEXT IOWD TO USE\r
+DSKIOS:        Z                       ; ERROR FLAGS\r
+SLBLK: Z                       ;LOGICAL BLOCK NUMBER LAST SELECTED\r
+                               ;CLEARED ON EACH CALL TO DFWRT OR DFRED\r
+\r
+DSKCON:        0\r
+IOWRD: 0\r
+DCBERR:        0\r
+ACSAV: 0\r
+<>\r
+DPDEND:        END\r
+\r
+\r
diff --git a/src/dskint.mac b/src/dskint.mac
new file mode 100644 (file)
index 0000000..6a55479
--- /dev/null
@@ -0,0 +1,292 @@
+TITLE  DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S\r
+SUBTTL A. FRANTZ/TH  TS  5 FEB 69\r
+       XP      VDSKIT,403\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+ENTRY  RCXINT  ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
+RCXINT:                ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+\r
+INTERNAL       DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK\r
+       \r
+EXTERNAL       DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW\r
+\r
+DSK=170                ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER.\r
+\r
+\r
+;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  MAINTENANCE PANEL SWITCH SETTINGS INDICATORS --\r
+       ;BITS 00 - 04   UNUSED\r
+MSS=1B5                ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81),\r
+PLGSW=1B6      ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY,\r
+               ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY,\r
+               ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER\r
+               ;  DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY.\r
+       ;BITS 07 - 17   THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY.\r
+DTOP=1B18      ;SET INDICATES DATA TRANSFER IN PROGRESS.\r
+;BITS 19 -29   ERROR CONDITIONS INDICATORS (ERROR WHEN SET) --\r
+       SRCHE=1B19      ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!)\r
+       DDE=1B20        ;DISK DESIGNATION ERROR\r
+       TSE=1B21        ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY)\r
+       NRDY=1B22       ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED)\r
+       PSF=1B23        ;POWER SUPPLY FAILURE\r
+       DPAR=1B24       ;DISK PARITY ERROR\r
+       CHDPAR=1B25     ;CHANNEL DATA PARITY ERROR\r
+       CHCPAR=1B26     ;CHANNEL CONTROL PARITY ERROR\r
+       NXMEM=1B27      ;NON-EXISTENT MEMORY REFERENCED\r
+       WRPE=1B28       ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17)\r
+       OVR=1B29        ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH\r
+;BIT  30       CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS\r
+               ;TURNED ON ON ALMOST ALL TERMINATIONS.)\r
+BUSYBT=1B31    ;BUSY (SYNCHRONIZER PERFORMING A COMMAND  SEQUENCE)\r
+DONEFLG=1B32   ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT.\r
+;BITS 33 - 35  PI CHANNEL SELECTION BITS.\r
+\r
+;COMBINATIONS OF ERRO BITS GROUPED BY TYPE --\r
+DATERR=DPAR!CHDPAR             ;DATA ERRORS.\r
+DEVERR=SRCHE!PSF!CHCPAR!OVR    ;DEVICE ERRORS.\r
+SETERR=DDE!TSE!NRDY!NXMEM      ;SOFTWARE-PREVENTABLE ERRORS.\r
+ALLERR=DATERR!DEVERR!SETERR!WRPE       ;ALL POSSIBLE ERRORS.\r
+\f\r
+;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER\r
+\r
+;BITS 00 - 17  UNUSED\r
+;BITS 18 - 19  SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35)\r
+;BITS 20 - 29  RESET THE CORRESPONDING CONI ERROR BIT\r
+               ;(BUT PSE MAY REFUSE TO BE RESET)\r
+WRCCWD=1B30    ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!)\r
+STPBIT=1B31    ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL.\r
+RESETB=1B32    ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT\r
+;BITS 33 - 35  PI CHANNEL SELECTION BITS\r
+\r
+;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  UNUSED\r
+;BITS 18 - 23  PARITY REGISTER\r
+;BITS 24 - 25  UNUSED\r
+;BITS 26 - 27  DISK SELECTED BY BITS 18-19 OF LAST CONO\r
+;BITS 28 - 35  CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!)\r
+\r
+;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  DISK ADDRESS ELECTION\r
+       ;BITS 00 - 01   DISK SELECT\r
+       ;BITS 02 - 10   TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT)\r
+       ;BITS 11 - 17   SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS)\r
+;BITS 18 - 23  INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS)\r
+DDSKPE=1B24    ;DISABLE DISK PARITY ERROR STOP\r
+DCHNPE=1B25    ;DISABLE CHANNEL DATA PARITY ERROR STOP\r
+WRBIT=1B26     ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK\r
+;BITS 27 - 34  ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE,\r
+               ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY!\r
+;BIT 35                ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!)\r
+\f\r
+;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK.\r
+\r
+;CALLING SEQUENCE  --\r
+;      PUSHJ   PDP,DFWRT\r
+;      RETURN WHEN WRITE HAS BEEN STARTED.\r
+;ENTRY CONDITIONS --\r
+;      C(TAC 18-35) = LOGICAL BLOCK NUMBER AT WHICH TO START WRITING,\r
+;      C(TAC1) = IOWD, I.E.,\r
+;      C(TAC1 00-17) = 2'S COMPLEMENT OF WORD COUNT TO BE WRITTEN\r
+;      C(TAC1 18-25) = ADDRESS OF FIRST DATA WORD TO BE WRITTEN\r
+;EXIT CONDITIONS --\r
+;      THE REQUESTED WRITE HAS BEEN BEGUN\r
+;      TAC AND TAC1 HAVE BEEN DESTORYED\r
+\r
+DFWRT: CONSZ   DSK,BUSYBT      ;FOR SAFETY SAKE BE SURE THE DISK IS\r
+       JRST    .-1             ; FREE NOW (THIS MAY BE A REDUNDANT CHECK).\r
+       MOVEM   TAC1,WRCHNL     ;SET UP CHANNEL COMMAND SEQUENCE.\r
+       SETZM   WRCHNL+1        ;MAKE SURE NEXT COMMAND IS 0, SO CHANNEL\r
+                               ; WILL NOT WRITE ALL OVER DISK\r
+\r
+IFN    FTRCHK,<\r
+       EXTERN SATM2\r
+       MOVEI TAC1,1(TAC1)      ;CLEAR LH AND COMPARE WITH\r
+                               ; FIRST WORD AFFECTED\r
+       CAIG TAC1,SATM2         ;COMPARE ABS CORE ADDRESS TO BEGINNING\r
+                                ;OF SAT TABLE-2\r
+       HALT    .               ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
+                                ;WILL LOOP\r
+>\r
+       MOVEI   TAC1,WRCHNL\r
+       MOVEM   TAC1,RCXIOC     ;RCX10C IS MAGIC EVEN LOCATION IN FIRST 1K OF CORE.\r
+       PUSHJ   PDP,CNVBLK      ;CONVERT LOGICAL BLOCK NO. INTO PHYSICAL DISK ADDRESS.\r
+       ORI     TAC,WRBIT       ;REQUEST WRITE (INSTEAD OF READ)\r
+DFWRTC:        ORI     TAC,RCXIOC\r
+       MOVEM TAC,DFORDR        ;SAVE RC-10 DATAO COMMAND\r
+DSKFDG:        HRRZI   TAC,DSKCHN      ;THIS INSTRUCTION TEMPORARILY ALTERED DURING "ONCE".\r
+       IORI    TAC,ALLERR!RESETB\r
+       HRLI    TAC,DONEFLG     ;TO SET INTERRUPT CONDITIONS IN DSKCON.\r
+;READY THE DISK SYNCHRONIZER ---\r
+       STARTDV DSK\r
+       HRRZ    TAC,@RCXIOC     ;COMPUTE AND SAVE THE VALUE WHICH THE\r
+       HLRE    TAC1,@RCXIOC    ; CHANNEL CONTROL WORD SHOULD CONTAIN UPON\r
+       SUB     TAC,TAC1        ; SUCCESSFUL COMPLETION OF THE DISK OPERATION.\r
+       MOVE    TAC1,RCXIOC\r
+       HRLI    TAC,1(TAC)\r
+       MOVEM   TAC,RCXFIN\r
+       SETZM   RCXCCW          ;ZERO THE LOCATION WHERE THE DISK SYNCRONIZER WILL\r
+                               ; STORE THE CHANNEL CONTROL WORD.\r
+       DATAO   DSK,DFORDR      ;START UP DISK AND DATA CHANNEL.\r
+       POPJ    PDP,            ;SUBROUTINE EXIT.,......***\r
+\f\r
+;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK.\r
+\r
+;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY\r
+; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE.\r
+\r
+DFRED: CONSZ   DSK,BUSYBT      ;POSSIBLY REDUNDANT CHECK TO BE\r
+       JRST    .-1             ; SURE THE DISK IS FREE.\r
+       MOVEM   TAC1,RDCHNL     ;SET UP READ CHANNEL ORDERS IN A SEPARATE\r
+       SETZM   RDCHNL+1        ;MAKE SURE NEXT COMMAND IN LIST IS 0\r
+                               ; SO CHANNEL WILL NOT WRITE ALL OVER MEMORY\r
+IFN    FTRCHK,<\r
+       EXTERN SATM2\r
+       MOVEI TAC1,1(TAC1)      ;CLEAR LH AND COMPARE WITH FIRST WORD AFFECTED\r
+       CAIG TAC1,SATM2         ;COMPARE ABS CORE ADDRESS TO BEGINNING\r
+                                ;OF SAT TABLE-2\r
+       HALT    .               ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
+                                ;WILL LOOP\r
+>\r
+       MOVEI   TAC,RDCHNL      ; PLACE FROM WRITE CONTROL WORDS FOR\r
+       MOVEM   TAC,RCXIOC      ; BETTER FOOTPRINTS IN CASE OF A CRASH.\r
+       PUSHJ   PDP,CNVBLK      ;CONVERT LOGICAL BLOCK NUMBER TO PHYSICAL DISK ADDRESS.\r
+       JRST    DFWRTC  ;REMAINDER OF THIS READ ROUTINE IS\r
+                       ; IDENTICAL TO WRITING.\r
+\f\r
+;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY,\r
+; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC.\r
+\r
+DISKUP:        CONO    DSK,ALLERR!RESETB       ;CLEAR THE DISK SYNCHRONIZER.\r
+       CONSZ   DSK,NRDY!PSF!BUSYBT!DONEFLG     ;ANYTHING AMISS OR STUCK ?\r
+       JRST    DISKUP          ;IF SO, JUST HANGE HERE IN A LOOP.\r
+       DATAI   DSK,TAC         ;IS THE SECTOR COUNTER GOING ?\r
+       JUMPE   TAC,.-1         ;IF NOT, JUST LOOP HERE.\r
+;*** THIS LOOP ABOVE WILL OCCUR DURING INITIALIZATION IF THE DISK IS OFF-LINE. ***\r
+       HRRZI   TAC,DSKBIT      ;IF NOT, ENABLE DISK INTERRUPTS ON THE\r
+       CONO    PI,2200(TAC)    ; APPRORIATE PRIORITY INTERRUPT CHANNEL.\r
+       POPJ    PDP,            ;SUBROUTINE EXIT.....,***\r
+\f\r
+;DISK INTERRUPTS COME HERE TO BE SERVICED --\r
+\r
+DSKINT:        CONSO   DSK,@DSKCON     ;*DID THE DISK SYNCHRONIZER CAUSE THE INTERRUPT ON\r
+       JRST    .-1             ;* THIS CHANNEL? IF NOT, GO TO THE NEXT DEVICE ON\r
+                               ;* THE SAME PRIORTY INTERRUPT CHANNEL.\r
+; NOTE: THE "JRST .-1" IS ALTERED BY THE SYSTEM BUILDER PROGRAM.\r
+\r
+       CONI    DSK,DSKISV      ;*SOLELY TO LEAVE FOOTPRINTS.\r
+       JSR     DSKSAV          ;*SAVE ACCUMULATORS, ETC.\r
+       SETZB   IOS,DSKCON      ;*CLEAR THE DSK I/O STATUS ACCUMULATOR, AND\r
+                               ;* THE INTERRUPT ENABLED MARKER,\r
+       CONSZ   DSK,DATERR      ;*SET APPROPRIATE ERROR BITS (IF\r
+       TRO     IOS,IODTER      ;* ANY) IN ACCUMULATOR IOS FOR\r
+       CONSZ   DSK,DEVERR!SETERR       ;* DEVICE INDEPENED ROUTINE TO HANDLE.\r
+       TRO     IOS,IODERR      ;*\r
+       CONSZ   DSK,WRPE        ;*\r
+       TRO     IOS,IOIMPM      ;*\r
+;CLEAR OUT THE DISK SYNCHRONIZER AND LEAVE IT DETACHED FROM ITS INTERRUPT CHANNEL.\r
+       CONO    DSK,ALLERR!RESETB\r
+       MOVE    TAC,RCXCCW      ;*PICK UP THE FINAL VALUE FO THE CHANNEL CONTROL WORD.\r
+       CAMN    TAC,RCXFIN      ;*DOES IT AGREE WITH THE SAVED VALUE WE EXPECTED ?\r
+       JRST    DFINT           ;*YES, EXIT TO THE DEVICE INDEPENDENT INTERRUPT\r
+                               ;* HANDLING ROUTINE IN "DSKSER".........\r
+       MOVE    TAC1,DSKISV     ;*\r
+       TRNE    TAC1,CHCPAR     ;*CHANNEL CONTROL WORD PARITY ERROR DETECTED ?\r
+       JRST    DSKNT2          ;*YES, SET ERROR BIT, EXIT TO DSKSER TO TRY 2 TIMES,\r
+       HRRZ    TAC1,RCXFIN     ;*NO, STOP AND DEAD UNLESS THE LAST DATA ADDRES\r
+       CAIGE   TAC1,(TAC)      ;* REFERENCED WAS WITHIN THE RANGE OF THE REQUESTED\r
+       JRST    DSKNT1          ;* TRANSFER, IF IT WAS IN RANGE, SOME ERROR MUST\r
+       HRRZ    TAC1,@RCXIOC    ;* HAVE ABORTED PART OF THE DATA TRANSFER, THUS THE\r
+       CAILE   TAC1,(TAC)      ;* "DEVICE ERROR" BIT SHOULD BE TURNED BEFORE\r
+       JRST    DSKNT1          ;* EXITING TO THE DEVICE INDEPENDENT ROUTINE.\r
+DSKNT2:        TRO     IOS,IODERR      ;*\r
+       JRST    DFINT           ;*\r
+\r
+DSKNT1:        SKIPE   RCXCCW          ;*MAYBE CHANNEL WAS TURNED OFF ?\r
+       HALT    .               ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN!\r
+       PUSH    PDP,ITEM        ;*\r
+       MOVEI   ITEM,0          ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE\r
+       JSP     TAC,ERRPNT      ;*\r
+       ASCIZ   /DISK DATA CHANNEL TURNED ON ?\r
+/\r
+       POP     PDP,ITEM        ;*\r
+       JRST    DSKNT2          ;*\r
+\f\r
+;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES\r
+\r
+;CALLING SEQUENCE --\r
+;      PUSHJ   PDP,CNVBLK\r
+;      NORMAL RETURN (ONE "IMPOSSIBLE" ERROR COULD OCCUR)\r
+;ENTRY CONDITIONS--\r
+;      C(TAC) = RH IS THE LOGICAL BLOCK NUMBER TO BE CONVERTED; LH MAY BE NON-ZERO\r
+;EXIT CONDITIONS--\r
+;      C(TAC) = C(DFORDR0 = THE CORRESPONDING PHYSICAL DISK ADDRESS CORRECTLY\r
+;              POSITIONED FOR A DATAO TO THE RC-10 DISK SYNCHRONIZER.\r
+\r
+EXTERNAL       ERRPNT,ERRPTU\r
+\r
+CNVBLK:        MOVEM   TAC,SVLBLK      ;ONLY FOR FOOTPRINTS IN CASE OF CRASH.\r
+       TLZ     TAC,-1          ;CLEAR NON-USEFUL LEFT HALF OF LOGICAL BLOCK NUMBER.\r
+INTERNAL       FTRCHK\r
+IFN    FTRCHK, <\r
+       CAMLE   TAC,LBHIGH      ;IS LOGICAL BLOCK NUMBER IN RANGE?\r
+       SKIPN   LBHIGH          ;NO. BUT IF LBHIGH IS STILL 0 WE MUST STILL BE\r
+       JRST    CNVBK1          ; DOING THE INTITIALIZATION IN "ONCE", SO IT'S OKAY.\r
+;INTERNAL MONITOR ERROR IF DSKSER OR SCHEDU COMES HERE WITH A LOGICAL\r
+; DISK BLOCK NUMBER THAT IS OUT OF RANGE.....\r
+       HALT    .+1             ;HALT ON THIS IMPOSSIBLE ERROR\r
+       POP     PDP,DSKISV      ;CORRECT PUSH DOWN POINTER AND LEAVE\r
+                                ;INDICATOR\r
+       MOVEI IOS,IODERR        ;UPON CONTINUING PREDEDN I/O COMPLETED\r
+                                ;WITH DEVICE ERROR,\r
+       JRST    DFINT\r
+CNVBK1:\r
+>\r
+       PUSH    PDP,TAC1        ;THIS RTN SAVES AND RESTORES TAC1.\r
+       IDIVI   TAC,^D4000      ;DETERMINE DISK NUMBER\r
+       ROT     TAC,-2\r
+       MOVEM   TAC,DFORDR      ;SAVE DISK NUMBER AWAY.\r
+       MOVE    TAC,TAC1\r
+       IDIVI   TAC,^D20        ;SELECT TRACK NUMBER.\r
+       PUSH    PDP,TAC1\r
+       IDIVI   TAC,^D10        ;CONVERT TRACK NUMBER TO BCD.\r
+       CAIL    TAC,^D10\r
+       ADDI    TAC,6   ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1.\r
+       LSH     TAC,4\r
+       OR      TAC,TAC1\r
+       ROT     TAC,-^D11\r
+       ORM     TAC,DFORDR      ;PUT TRACK NUMBER AWAY ALSO.\r
+       POP     PDP,TAC         ;NOW RETRIEVE SEGMENT NUMBER.\r
+       LSH     TAC,2           ;MULTIPLY BY 4 (FOR PHYSICAL\r
+       IDIVI   TAC,^D10        ; SEGMENTS PER LOGICAL BLOCK)\r
+       LSH     TAC,4\r
+       OR      TAC,TAC1        ;SEGMENT NUMBER MUST BE IN BCD ALSO.\r
+       HRLZS   TAC\r
+       ORB     TAC,DFORDR      ;FINALLY, JOIN SEGMENT NUMBER TO\r
+       POP     PDP,TAC1        ; EARLIER CALCULATED PARTS OF ADDRESS,\r
+       POPJ    PDP,            ;SUBROUTINE EXIT.,....***\r
+\f\r
+IFN    FTCHECK+FTMONP, <\r
+EXTERNAL       RCXDAT  ;TO CAUSE THE CORRECT COPY OF "DSKDAT" TO BE\r
+                       ; RETRIEVED BY THE SYSTEM BUILDER.\r
+EXTERNAL       DSKCON,WRCHNL,RDCHNL,DSKISV,RCXFIN\r
+EXTERNAL       SVLBLK,DFORDR\r
+>\r
+IFE    FTCHECK+FTMONP, <\r
+INTERNAL       DSKCON,LBHIGH,WRCHNL,RDCHNL,DSKISV,RCXFIN,SVLBLK,DFORDR\r
+DSKCON:        0       ;ENABLED INTERRUPT CONDITIONS STORED HERE BY "STARTDV",\r
+LBHIGH:        0       ;HIGHEST LEGAL LOGICAL BLOCK NUMBER.\r
+WRCHNL:        0       ;CHANNEL CONTROL WORD OF LAST DISK WRITE.\r
+       Z       ;CHANNEL TERMINATION WORD.\r
+RDCHNL:        0       ;CHANNEL CONTROL WORD OF LAST DISK READ.\r
+       Z       ;ZERO WORD TO TERMINATE CHANNEL.\r
+DSKISV:        0       ;RESULT OF LAST CONI ON A DISK INTERRUPT.\r
+RCXFIN:        0       ;EXPECTED VALUE OF CHANNEL CONTROL WORD (RCXCCW) AT\r
+               ; THE END OF THE CURRENT DISK TRANSFER.\r
+SVLBLK:        0       ;LAST LOGICAL BLOCK NUMBER CONVERTED.\r
+DFORDR:        0       ;ITS  CORRESPONDING PHYSICAL DISK ADDRESS.\r
+\r
+>\r
+DSKEND:        END\r
diff --git a/src/dskser.mac b/src/dskser.mac
new file mode 100644 (file)
index 0000000..6b6d9d2
--- /dev/null
@@ -0,0 +1,3250 @@
+IFN FTRA10, <\r
+TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES.\r
+>\r
+IFE FTRA10, <\r
+IFN FTRC10,<\r
+TITLE  DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS)\r
+>>\r
+IFE FTRC10,<\r
+TITLE  DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS)\r
+>\r
+SUBTTL A, BLACKINGTOM/CMF/TH/CHW/RCC/AF   TS 02 JUN 69  V424\r
+XP     VDSKSR,424\r
+\r
+;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL FTRA10                ;TO ASSEMBLE DSKSER AS A\r
+                       ; DEVICE INDEPENDENT ROUTINE SET\r
+                       ; THIS SWITCH TO -1,  NOTE THAT MDFINT (THE BRYANT\r
+                       ; DSKINT) WAS WRITTEN SO AS TO KEEP DSKSER DEVICE-INDEPENDENT\r
+                       ; THIS SWITCH AND CODE ENCLOSED IN ITS IFE'S WILL ULTIMATELY\r
+                       ; BE REMOVED FROM DSKSER.\r
+\r
+\r
+INTERNAL       FTRC10          ;TO ASSEMBLE DSKSER FOR THE PDP-10 DISK\r
+                               ; (MODEL RC-10), SET THIS SWITCH TO -1,\r
+                               ; FOR OLD (270) DISK SET IT = 0.\r
+\r
+IFN FTRA10, <\r
+ENTRY DSKSER\r
+DSKSER:\r
+>\r
+IFE FTRA10, <\r
+IFN    FTRC10, <\r
+ENTRY DSKSRB                   ;THIS SYMBOL IS TO PERMIT SYSTEM\r
+DSKSRB:                                ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE,\r
+>\r
+IFE FTRC10, <\r
+ENTRY DSKSRD           ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD\r
+DSKSRD:\r
+>>\r
+\r
+EXTERNAL JIFMIN\r
+\r
+INTERNAL WLBIT,DSKFGS,CHKCNT\r
+\r
+TA=BUFPNT                      ;USED BY RENAME\r
+TB=BUFWRD                      ;USED BY RENAME\r
+\r
+IFE FTRA10, <\r
+INTERNAL MFDBLK,SATXWD\r
+IFN    FTRC10, <\r
+MFDBLK: 66                     ;ON PDD-10 DISK, MFD RETRIEVAL INFORMATION AND SAT\r
+SATXWD: XWD -NUMSAT,67         ;BLOCKS GO AT THESE ABSOLUTE  ADDRESSES\r
+                               ; UNLESS USER SPECIFIES OTHERWISE DURING "ONCE".\r
+>\r
+IFE    FTRC10, <\r
+MDFBLK:        13000                   ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD\r
+SATXWD:        XWD -NUMSAT,13001       ;LH=NUMBER OF SAT BLOCKS.\r
+                               ;RH=FIRST SAT BLOCK NUMBER.\r
+>>\r
+\f\r
+CHKCNT=200                     ;NUMBER OF WORDS TO CHECK-SUM\r
+W8BIT=400000                   ;WAIT INDICATION FOR DDB\r
+\r
+; BITS IN LH OF IOS\r
+\r
+NMP=100                                ;NO MORE INPUT POINTERS (LH OF  IOS)\r
+UBFS=200                       ;USING BUFFER IN FREE STORAGE (LH OF IOS)\r
+NORELB=400                     ;DO NOT RELOCATE BUFFER ON I/O (LH IOS)\r
+UBFU=1000                      ;USING BUFFER IN USER AREA\r
+NCTRLC=2000                            ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON-\r
+                                       ; INTERRUPTABLE OPERATIONS\r
+DAFLG=4000\r
+AUFLG=10000\r
+DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC ;USED TO SUPPRESS ACTION OF ^C,  SEE STOPCK\r
+PRCHG=20000                    ;PROTECTION CHANGED\r
+LIR=IOEND                      ;LAST INPUT REQUESTED\r
+\r
+;MISCELLANEOUS CONSTANTS\r
+TRIES=3                                ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK\r
+BLKSIZ=200                     ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS\r
+NBLKSZ=-BLKSIZ                 ;TO BE A POWER OF 2.\r
+BLKP2=7                                ;BLKSIZ = 2^BLKP2\r
+\r
+;TEST BITS PUT  IN LH OF DEVOAD\r
+\r
+PNTDIF=200000                  ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC\r
+VRGPTR=100000                  ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN\r
+RENBIT=20000                   ;"RENAMING" INDICATION FOR SETLE ROUTINE\r
+WPRO=40000                     ;LOOKUP DONE, FILE IS IN WRITE PROTTECT\r
+CKSUPR=10000                   ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE\r
+\f\r
+;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES\r
+\r
+ATPP=0                         ;PROJECT,PROGRAMMER NUMBERS\r
+ATNAME=1                       ;OWNER NAME\r
+ATEXT=2                                ;EXTENSION\r
+TBITS=2                                ;TEST BITS AND RCOUNT\r
+ATBLOK=3                       ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH\r
+ATLINK=3                       ;LINK TO NEXT ENTRY IN RH\r
+\r
+WTBIT=400000                   ;FILE IS BEING CREATED\r
+DTBIT=200000                   ;DELETE WHEN THRU READING\r
+RTBIT=100000                   ;FILE HAS BEEN RENAMED\r
+ATBITS=500000                  ;WTBIT+RTBIT\r
+ATIND=40000                    ;NAME IS ALREADY IN DIRECTORY\r
+ATCLO=20000                    ;OUTPUT CLOSE TO BE DONE\r
+RWTBIT=10000                   ;FILE BEING READ AND  WRITTEN, BUT NOT CREATED,\r
+RCOUNT=7777                    ;MASK FOR THE COUNT OF READERS\r
+\r
+;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS\r
+\r
+XP NUMBIT,^D36*BLKSIZ          ;NUMBER OF BITS IN ONE BLOCK\r
+\r
+IFE FTRA10, <\r
+IFN    FTRC10, <\r
+XP     NUMSAT,4                ;ONLY FOUR SAT BLOCK ON PDP-10 DISK,\r
+>\r
+IFE    FTRC10, <\r
+XP NUMSAT,16                   ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION\r
+                                       ;WORD DATA PRODUCTS MODEL 270 DISK,\r
+>>\r
+XP WLBIT,400000                                ;IF BIT IS ON IN FIRST SATENT ENTRY\r
+                               ;WORD, THE DISK IS WRITE-LOCKED.\r
+\f\r
+EXTERNAL DSKOFF\r
+\r
+DEFINE NOSCHEDULE <\r
+       CONO PI,DSKOFF\r
+>\r
+\r
+EXTERNAL DSKON\r
+DEFINE SCHEDULE <\r
+       CONO PI,DSKON\r
+>\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT\r
+EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ\r
+EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF\r
+EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3\r
+EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;DISK DEVICE DATA BLOCKS & MISCELLANEOUS CONSTANTS, WORKING STORAGE\r
+DDBPTR:        Z                       ;LOCATION OF NEXT DDB TO LOOK AT\r
+                               ;DURING DISK INTERRUPT\r
+\r
+;MORE MISCELLANEOUS FOR DISK\r
+\r
+INTERNAL SATPTR,SAT,SATBK2,REFLAG,DFBUSY,CKSMCT\r
+MOPTR: BLOCK   1               ;POINTER TO NEXT TASK TO DO\r
+MIPTR: BLOCK   1               ;POINTER TO NEXT FREE QUEUE ENTRY\r
+\r
+RUNUSR:        BLOCK   1               ;LH=DEVDAT OF USER JOB RUNNING\r
+                               ;RH= UNUSED\r
+USRCNT:        BLOCK   1               ;COUNT OF WAITING USER JOBS\r
+DFBUSY:        0                       ;-1 IF DISK CONTROL IN USE, 0 IF FREE\r
+FAT:   0                       ;POINTER TO FIRST ACCESS TABLE ENTRY\r
+DKSMOT:        0                       ;COUNT OF VARIOUS CHECKSUM ERRORS\r
+REFLAG:        0                       ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH\r
+UXFERS:        0                       ;TOTAL USER TRANSFER ATTEMPTED\r
+ECOUNT:        0                       ;TOTAL HARDWARE ERRORS ON USER TRANSFERS\r
+;DISK STORAGE ALLOCATION CONTROL\r
+\r
+SATPTR:        BLOCK   1               ;POINTER TO CURRENT SATENT ENTRY\r
+SATPIK:        BLOCK   1               ;POINTER TO NON-FULL SAT ENTRY\r
+SATCHG:        BLOCK   1               ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE\r
+SATTEM:        BLOCK 1                 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ\r
+SATTMP:        BLOCK 1                 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW.\r
+\r
+IFN FTRA10, <\r
+EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP\r
+>\r
+IFE FTRA10,<\r
+INTERNAL SATENT\r
+\r
+IFN    FTRC10, <\r
+XP     NUMBLK,^D4000   ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE\r
+                       ; PDP-10 MODEL RC-10 DISK FILE.\r
+>\r
+IFE    FTRC10, <\r
+       XP      NUMBLK,5400     ;NUMBER OF DATA BLOCKS REPRESENTED BY\r
+                               ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK.\r
+>\r
+       XP      SENTSZ,3                ;SIZE OF EACH SATENT ENTRY\r
+IFN    FTREC10, <\r
+DSKXDB=0                       ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL\r
+                               ; BLOCK NO. 0,\r
+>\r
+IFE    FTRC10, <\r
+DSKXDB=5400                    ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270)\r
+                               ; DISK FILE SINCE FIRST DISK IS ALLOCATED\r
+                               ; TO SWAPPING.\r
+>\r
+\f\r
+SATENT:        REPEAT  NUMSAT,<\r
+       XWD     DSKXDB,0        ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED\r
+       BLOCK   1               ;BIT MASK, SINGLE ROTATING BIT\r
+       BLOCK   1               ;XWD LENGTH OF SAT TABLE POINTER WORD\r
+                               ; IN SAT BLOCK\r
+       DSKXDB=DSKXDB+NUMBLK>\r
+\r
+       XP      SATTOP,SATENT*SENTSZ*NUMSAT-SENTSZ\r
+>;END OF FTRA100 CONDITIONAL\r
+\r
+SAT:   BLOCK   200             ;CURRENT SAT BLOCK\r
+\r
+       XP      SAATM2,SAT-2    ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND\r
+                               ; LIST - USED TO KEEP FROM WIPING OUT MONITOR.\r
+SATBK2:        XWD     -200,SAT\r
+\f\r
+       XP      DIRSIZ,4                ;NO. OF WORDS OF RET. INFO WHICH ARE\r
+                               ;NOT POINTERS.\r
+\r
+;THE DUMMY DEVICE DATA BLOCK\r
+DSKCOR=10\r
+DSKSIZ=4*DSKCOR                        ;NUMBER OF WORDS ALLOCATED FOR DDB\r
+                               ;MUST BE A MULTIPLE OF FOR (SEE GETCOR)\r
+\r
+INTERN DSKDDB\r
+DSKDDB:        SIXBIT  /DSK/\r
+       XWD     ^D5*HUNGST,201\r
+       Z\r
+       EXP     DSKDSP\r
+       XWD     DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403\r
+       Z\r
+       Z\r
+       XWD     PROG,\r
+       XWD     PROG,\r
+       XP      DEVFIL,.-DSKDDB ;FILE NAME\r
+       Z                       ;SIXBIT/FILE? - FILE NAME\r
+       XP      DEVEXT,.-DSKDDB ;FILE EXTENSION\r
+       Z                       ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB\r
+       XP DEVPPN,.-DSKDDB      ;PROJ,PROGRAMMER FOR CURRENT\r
+                               ; (OR MOST RECENT) LOOKUP,ENTER,RENAME\r
+       Z\r
+       XP      DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY\r
+       Z                       ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY\r
+                               ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB\r
+       XP      DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER\r
+       Z                       ;C(LH)==RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES)\r
+                               ;C(RH)=COUNT OF BLOCKS IN FILE\r
+       XP      DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER\r
+       Z                       ;C(LH)=LOGICAL BLOCK# OF RIB\r
+                               ;C(RH)=RELATIVE LOC. OF RIB\r
+                               ;POINTER IN THAT BLOCK\r
+       XP      DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING\r
+       Z                       ;SIMILAR TO DEVBLK - SAY WHERE CURRENT\r
+                               ; POINTER COME FROM\r
+       XP      DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE\r
+       Z                       ;C(LH)=-SZIE OF READ/WRITE\r
+                               ;C(RH)=BUFFER IN USER AREA\r
+       XP      DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE\r
+       Z                       ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE\r
+                               ;C(RH)=ERROR COUNT OR ERROR BITS\r
+       XP      SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF\r
+                               ;C(LH)=BLOCK# OF UFD RIB\r
+       Z                       ;UFD, RH IS SETO, SETI COUNTER.\r
+       XP      PTR1,.-DSKDDB   ;RETRIEVAL INFO STARTS HERE\r
+                               ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS\r
+       XP      FPNTR,PTR1+DIRSIZ       ;LOC. OF FIRST POINTER TO RET. INFO.\r
+       XP      FPNTR1,FPNTR-1\r
+       XP      PTRN,DSKSIZ-1\r
+\f\r
+;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB\r
+\r
+INTERNAL LOCORE,CRINIT\r
+EXTERNAL DDBTAB\r
+\r
+LOCORE:        EXP 0                   ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA\r
+                               ; SET BY LINKDB\r
+CORBIT:        0                       ;FLOATING 1 BIT USED IN SEARCHES\r
+CORIWD:        XWD 0,0                 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0\r
+CRINIT:        XWD 0,DDBTAB            ;INITIAL AOBJN POINTER FOR CORIWD\r
+                               ; LH SET BY LINKDB\r
+MONBUF:        BLOCK 200               ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC.\r
+\f\r
+;ERROR CODES FOR LOOKUP, RENAME  AND/OR ENTER\r
+\r
+NOTINU=0                       ;NO SUCH FILE\r
+NOTINM=1                       ;NO SUCH USER\r
+PHOTF=2                                ;PROTECTION FAILURE\r
+NORITE=3                       ;MORE THAN 1 WRITE TO A FILE\r
+RENFAL=4                       ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER\r
+                               ; A NULL FILE NAMES\r
+NOFILE=5                       ;TRIED TO RENAME WITH NO FILE SELECTED\r
+ERRBIT=1                       ;BITS GO IN WORD 1 OF THE ENTRY\r
+\r
+;DISK DISPATCH TABLE\r
+\r
+INTERNAL DSKDSP\r
+\r
+       JRST DSKINI             ;INITILIZE\r
+       JRST CPOPJ1             ;DSK HUNG TIMEOUT, NO ERROR MESSAGE\r
+DSKDSP:        JRST DFREL              ;RELEASE\r
+       JRST DFCLSO             ;CLOSE OUTPUT\r
+       JRST DFOUT              ;OUTPUT\r
+       JRST DFIN               ;INPUT\r
+       JRST DFENTR             ;ENTER\r
+       JRST DFLOOK             ;LOOKUP\r
+       JRST DFDMPO             ;DUMP OUTPUT\r
+       JRST DFDMPI             ;DUMP INPUT\r
+       JRST DFSET              ;USETO\r
+       JRST DFSET              ;USETI\r
+       POPJ PDP,               ;UGETF\r
+       JRST DFREN              ;RENAME\r
+       JRST DFCLSI             ;CLOSE INPUT\r
+       POPJ PDP,               ;UTPCLR\r
+       POPJ PDP,               ;MTAPE\r
+\f\r
+;ACCINI - CALLED AT 140 START, 143 RESTART\r
+;  RESTORE DEVICE DATA BLOCK CHAIN\r
+; INITIALIZE DDBTAB BIT SEARCHING ENTRY\r
+\r
+INTERNAL ACCINI\r
+\r
+ACCINI:        MOVSI TAC,(SIXBIT /DSK/)\r
+       MOVEI DEVDAT,DSKDDB     ;POINT TO PROTOTYPE DDB\r
+ACCIN1:        HLRZ DEVDAT,DEVSER(DEVDAT)\r
+       JUMPE DEVDAT,ACCIN2\r
+       CAMN TAC,DEVNAM(DEVDAT)\r
+       JRST ACCIN1\r
+ACCIN2:        MOVEI TAC,DSKDDB\r
+       HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB\r
+       MOVSI TAC,400000\r
+       MOVEM TAC,CORBIT        ;INITIALIZE FLOATING 1 BIT\r
+       MOVE TAC,CRINIT\r
+       MOVEM TAC,CORIWD        ;RESET AOBJN WORD\r
+\r
+       POPJ PDP,\r
+\r
+;DSKINI - CALLED AT START, RESTART, 143 RESTART\r
+; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE\r
+INTERNAL DSKINI, SETSAT\r
+EXTERNAL DISKUP,DFWUNS\r
+\r
+DSKINI:        IFN FTSWAP, <\r
+       SETZM SQREQ             ;NO SWAPPING REQUEST\r
+       SETZM SERA\r
+>\r
+       IFE FTRA10, <\r
+EXTERNAL DSKCON\r
+       HLLZS DSKCON            ;CLEAR INTERRUPT FLAGS FOR CONSO\r
+>\r
+       SETZM DFBUSY            ;DISK CONTROL AVAILABLE\r
+       SETZM RUNUSR            ;NO USER I/O IN PROGRESSS\r
+       SETOM USRCNT            ;NO USER TRANSFERS WAITING\r
+       SETZB DDBPTR            ;NO NEXT DDB\r
+                               ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY)\r
+       MOVEI DEVDAT,DSKDDB     ;PREPARE TO RELEASE DISK DDB'S\r
+DSKIN0:        HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK\r
+       JUMPE DEVDAT,DSKIN1     ;JUMP IF END REACHED\r
+       MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME\r
+       CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB?\r
+       JRST DSKIN1             ;NO. DONE\r
+       HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY\r
+       SKIPE TAC               ;ACCESS ENTRY EXIST?\r
+       PUSHJ PDP,CLRAT         ;YES. REMOVE IT\r
+       MOVSI TAC,W8BIT         ;PREPARE TO CLEAR "TRANSFER WAITING" BIT \r
+       ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING\r
+       ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING\r
+       MOVE TAC,DEVMOD(DEVDAT)\r
+       TRNN TAC,ASSCON         ;DDB ASSIGNED BY ASSIGN COMMAND?\r
+       PUSHJ PDP,CLRDDB        ;NO. REMOVE DDB\r
+       JRST DSKIN0             ;CONTINUE\r
+\r
+DSKIN1:        SETZM FAT               ;NO ACCESS ENTRIES\r
+       MOVEI TAC,MQUEUE+1      ;DESTINATION FOR BLT\r
+       MOVEM TAC,MIPTR\r
+       MOVEM TAC,MOPTR         ;RESET IN AND OUT POINTERS\r
+       HRLI TAC,MQUEUE\r
+       SETZM MQUEUE            ;SOURCE FOR BLT\r
+       BLT TAC,MQTOP-1         ;CELAR THE MONITOR QUEUE\r
+       PUSHJ PDP,DISKUP        ;DETERMINE IF DISK IS FUNCTIONING\r
+SETSAT:        AOSE STARTS             ;SKIP FIRST TIEM ONLY\r
+       JRST SAT01              ;WRITE SAT BLOCK IN CORE\r
+       JRST DFWUNS             ;SCAN ALL SAT BLOCKS\r
+STARTS: -1                     ;COUNT STARTS, RESTARTS\r
+\f\r
+;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147,\r
+;AT SAT01 UPON RE-ENTRY OF INITIALIZATION.\r
+\r
+INTERN DSKSTP,SAT05,JSAT06\r
+\r
+EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT\r
+\r
+DSKSTP:        HRRZI TAC,DSKBIT\r
+       IORI TAC,DCBBIT         ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K\r
+       IORI TAC,2200           ;CLEAR PI SYSTEM\r
+       CONO PI,10000(TAC)\r
+       SKIPL STARTS            ;HAS A SAT BLOCK BEEN READ IN?\r
+       PUSHJ PDP,SAT01         ;YES, WRITE IT OUT\r
+       CONO PI,10000\r
+       POPJ PDP,               ;YOU ARE SAFELY DONE.\r
+\r
+SAT01: MOVEI DEVDAT,DSKDDB\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+       MOVEI PROG,0\r
+       PUSH PDP,WSYNC          ;CHANGE WSYNC ROUTINE\r
+       MOVE TAC,JSAT06\r
+       MOVEM TAC,WSYNC\r
+SAT05: MOVEI ITEM,TRIES        ;SET UP COUNT FOR ERRORS\r
+SAT02: PUSHJ PDP,SATBLK        ;SET UP TAC,TAC1\r
+       PUSHJ PDP,MQOUT         ;WRITE IT.\r
+       JRST SAT04              ;ERROR\r
+       SETZM SATCHG            ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK.\r
+\r
+       POP PDP,WSYNC           ;NO ERRORS, SO RETURN.\r
+       SETZM DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+SAT04: SOJG ITEM,SAT02         ;ERRORS, SO TRY AGAIN\r
+       POP PDP,WSYNC           ;RESTORE WSYNC ROUTINE\r
+       JRST 4,SAT01\r
+\r
+SAT06: MOVEI TAC,IOACT         ;THIS IS SUBSTITUE FOR WSYNC\r
+       TDNE TAC,DEVIOS(DEVDAT)\r
+       JRST .-1\r
+       POPJ PDP,\r
+\r
+JSAT06:        JRST SAT06\r
+\f\r
+SUBTTL ENTER, LOOKUP, RENAME, CLOSE\r
+;ENTER UUO\r
+\r
+EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT\r
+\r
+DFENTR:        SKIPN @UUO              ;ZERO FILE NAME ?\r
+       JRST    DFER12\r
+       PUSHJ PDP,ALTMFD        ;ENTER TO MFD?\r
+       TLNE DEVDAT,LOOKB       ;NO, HAS LOOKUP BEEN DONE?\r
+       JRST DFENT5             ;YES\r
+       TLO IOS,IO\r
+       PUSHJ PDP,SETLE         ;RETURNS WITH PP ON PDL\r
+       JRST DFERR4             ;NO UFD, CLOCK ON\r
+       JRST DFENT2             ;NO FILE, CLOCK ON.\r
+       JRST DFERR6             ;FILE BEING WRITTEN\r
+       JRST DFENT7             ;FILE BEING READ,CHECK FOR WRITERS\r
+\r
+DFENT1:        SCHEDULE\r
+       HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB\r
+       PUSHJ PDP,SETPTR        ;READ FIRST RETRIEVAL POINTERS TO DDB\r
+       MOVSI DAT,100000        ;WRITE PROTECTION BIT\r
+       PUSHJ PDP,PROTEK        ;WRITE PROTECTED?\r
+       JRST DFERR3             ;NAME WRONG\r
+       JRST DFERR5             ;PROTECTION FAILURE.\r
+       MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS\r
+       TLZA IOS,PRCHG          ;PREPARE FOR PROTECTION CHECK\r
+DFENT2:        MOVEI TAC1,WTBIT+ATCLO  ;BITS FOR ACCESS ENTRRY - FILE CREATION\r
+       HLLZS DEVEXT(DEVDAT)    ;SET TO 0 RIB BLOCK#\r
+       NOSCHEDULE\r
+       PUSHJ PDP,SCANAT        ;SCAN ACCESS TABLE FROM BEGINNING\r
+       JRST DFENT3             ;NOT THERE\r
+\f\r
+DFEN2A:        MOVE DAT,TBITS(TAC)     ;WRITE BIT ON?\r
+       TRNE DAT,WTBIT\r
+       JRST DFERR6             ;YES,ERROR\r
+       PUSHJ PDP,SCNAT2\r
+       JRST DFENT3\r
+       JRST DFEN2A\r
+\r
+DFENT3:        TLZE    IOS,PRCHG       ;PROTECTION FAILURE?\r
+       JRST DFERR5             ;YES. GIVE ERROR RETURN.\r
+       SCHEDULE\r
+       PUSH PDP,TAC1           ;SAVE ACCESS BITS\r
+       PUSHJ PDP,DFGETF        ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC\r
+       POP PDP,TAC1            ;RESTORE ACCESS BITS\r
+       HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB\r
+       HRLZM TAC,DEVBKO(DEVDAT)\r
+       HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB#\r
+       NOSCHEDULE\r
+\r
+       MOVE DAT,TAC1           ;ACCESS ENTRY BITS\r
+       PUSHJ PDP,SETAT         ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1\r
+       HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
+       MOVEI DAT,PTR1(DEVDAT)  ;SET UP RETRIEVAL INFO\r
+       MOVE TAC,DAT            ;DESTINATION (DDB)\r
+       HRLI TAC,@UUO           ;SOURCE (UUO PARAMETER BLOCK)\r
+       BLT TAC,2(DAT)          ;NAME & EXTENSION\r
+       SCHEDULE\r
+       MOVE TAC1,THSDAT\r
+       ORI TAC1,400000         ;MAKE SURE ACCESS DATE NON-ZERO,\r
+       HRRM TAC1,1(DAT)        ;STORE THSDAT AS ACCESS DATE\r
+       MOVE TAC1,2(DAT)\r
+       TLZ TAC1,777740         ;IS THERE A DATE ALREADY?\r
+       JUMPN TAC1,DFENT4       ;YES IF JUMP.\r
+       MOVE TAC,TIME           ;NO, GET TIME.\r
+       IDIVI TAC,JIFMIN\r
+       HRRZ TAC1,THSDAT        ;AND DATE.\r
+       DPB TAC,[POINT 11,TAC1,23]\r
+DFENT4:        TLO TAC1,55000          ;PROTECTION\r
+       DPB IOS,[POINT 4,TAC1,12] ;MODE\r
+       MOVEM TAC1,2(DAT)       ;STORE PROTECTION MODE TIME DATE IN DDB\r
+       MOVE ITEM,JOB\r
+       MOVE TAC,PRJPRG(ITEM)\r
+       MOVEM TAC,3(DAT)        ;STORE PROGRAMMER# IN DDB\r
+       SETZM 4(DAT)            ;CLEAR FIRST POINTER\r
+       MOVSI IOS,NMP           ;SET "NO MORE POINTERS"\r
+       ORB IOS,DEVIOS(DEVDAT)\r
+       TLZ DEVDAT,OCLOSB\r
+       HLLZS DEVCNT(DEVDAT)    ;CLEAR FILE SIZE\r
+       MOVSI TAC,VRGPTR        ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE\r
+       IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED\r
+       JRST ALLOK\r
+\f\r
+;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY\r
+\r
+DFENT5:        MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION\r
+       TLNE TAC,WPRO\r
+       PUSHJ PDP,DFERR5        ;FAILURE, THIS WILL NOT RETURN HERE\r
+       HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+       NOSCHEDULE\r
+       MOVE TAC1,TBITS(TAC)    ;GET ACCESS BITS\r
+       TROE TAC1,RWTBIT        ;FILE BEING READN AND WRITTEN ALREADY?\r
+       PUSHJ PDP,DFERR6        ;YES,  THIS WILL NOT RETURN HERE\r
+       MOVEM TAC1,TBITS(TAC)   ;NO, SET IT\r
+       SCHEDULE\r
+       CONO PI,DSKON\r
+\r
+       MOVE TAC,@UUO           ;SAVE FILE?\r
+       CAME TAC,DEVFIL(DEVDAT)\r
+       JRST DFERR8             ;NO, NAME WRONG\r
+       ADDI UUO,1\r
+       HLLZ  TAC,@UUO          ;PICKUP EXTENSION FROM USER ENTER BLOCK\r
+       XOR TAC,DEVEXT(DEVDAT)  ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP\r
+                               ; RETRIEVAL INFORMATION\r
+       TLNE TAC,-1             ;EXTENSION THE SAME?\r
+       JRST DFERR8             ;NO, EXTENSION WRONG\r
+       SOS     UUO             ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND\r
+       PUSHJ   PDP,SETPTR      ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD\r
+       PUSHJ   PDP,DFLUK4      ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED\r
+                               ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID\r
+                               ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST\r
+                               ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE!\r
+\r
+;FILE IS BEING READ\r
+\r
+DFENT7:        PUSHJ PDP,SCNAT2        ;FIND ANOTHER\r
+       JRST DFENT1             ;NO WRITERS, PERMIT THIS ENTER\r
+       JRST DFERR6             ;MUST BE BEING WRITTEN OR RENAMED\r
+\f\r
+;LOOKUP UUO\r
+\r
+EXTERNAL UDLKC,TPOPJ\r
+\r
+DFLOOK:        SKIPN   @UUO            ;ZERO FILE NAME ?\r
+       JRST    DFER12          ;IF SO, ERROR.\r
+       MOVEI TAC,CLSIN         ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED\r
+       TLNE DEVDAT,ENTRB       ;ENTER DONE YET?\r
+       PUSHJ PDP,UDLKC         ;CLOSE OUTPUT\r
+       TLZ IOS,IO              ;INPUT STATE\r
+       PUSHJ PDP,SETLE         ;RETURNS WITH PP ON PDL\r
+       JRST DFERR4             ;NO UFD, CLOCK ON\r
+       JRST DFERR7             ;NO FILE, CLOCK ON.\r
+       JRST DFLUK8             ;FILE BEING WRITTEN\r
+       JRST DFLUK3             ;FILE BEING READ\r
+\r
+DFLUK2:        MOVEI DAT,0\r
+       PUSHJ PDP,SETAT         ;BUILD AN ACCESS ENTRY\r
+       MOVE TAC,TAC1           ;TAC,TAC1 POINT TO ACCESS ENTRY\r
+\r
+DFLUK3:        AOS TBITS(TAC)          ;INCREMENT RCOUNT\r
+       HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
+       SCHEDULE\r
+       MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB#\r
+       PUSHJ PDP,SETPTR        ;GET IN THE RETRIEVAL INFO\r
+\r
+       TLZE IOS,PRCHG          ;PROTECTION CHANGE FAILURE?\r
+       JRST DFLUK7             ;YES. ERROR RETURN\r
+       MOVSI DAT,200000        ;READ PROTECTION BIT\r
+       PUSH J PDP,PROTEK       ;READ PROTECTED?\r
+       JRST DFERR3             ;NAME WRONG\r
+       JRST DFLUK7             ;PROTECTION FAILURE\r
+\r
+       MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR\r
+       MOVSI DAT,100000        ;POSSIBLE SUBSEQUENT ENTER\r
+       PUSHJ PDP,PROTKX\r
+       TLOA TAC1,WPRO          ;WRITE PROTECTED. SET FLAG\r
+       TLZ TAC1,WPRO           ;WRITE OK--RESET FLAG\r
+       IORM TAC1,DEVOAD(DEVDAT)\r
+\f\r
+DFLUK4:        MOVSI TAC,PTR1(DEVDAT)  ;COPY INFO TO LOOKUP PARAMETER BLOCK\r
+       NOSCHEDULE\r
+       HRRI TAC,@UUO           ;DESTINATION IS UUO PARAMETER BLOCK\r
+       MOVE TAC1,TAC\r
+       BLT TAC,2(TAC1)         ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER\r
+       SCHEDULE\r
+       HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS)\r
+       ADD UUO,3\r
+       HRLZM TAC,@UUO          ;SET UP 4TH WORD OF DIRECTORY HDR.\r
+       SUBI UUO,3              ;RESET UUO\r
+       MOVMS TAC               ;SET FILE SIZE (WORDS) IN DDB\r
+       HRRM TAC,DEVCNT(DEVDAT)\r
+       TLZ DEVDAT,ICLOSB\r
+       MOVSI TAC,VRGPTR        ;POINTERS DO EXIST ON THE DISK SO\r
+       ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG.\r
+\f\r
+ALLOK: MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB\r
+       HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER\r
+       MOVEI TAC,1\r
+       HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE\r
+       MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS\r
+       ANDCAM TAC,DEVOAD(DEVDAT)\r
+\r
+IFG CHKCNT,<\r
+;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE\r
+\r
+       LDB TAC1,[POINT 4,-2(DAT),12]\r
+       CAIGE TAC1,15           ;IS FILE IN DUMP MODE?\r
+       JRST ALLXIT             ;NO\r
+       LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35]\r
+       MOVSI TAC,CKSUPR\r
+       CAIGE TAC1,15           ;IS CURRENT MODE DUMP?\r
+       IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM\r
+>\r
+ALLXIT:        POP PDP,TAC             ;REMEMBER 0(PDP) WASS XWD PROJ,PROG\r
+\r
+       AOS (PDP)               ;RETURN TO CALL+2\r
+       JRST CLRBUF             ;RELEASE MONITOR BUFFER\r
+\r
+DFLUK7:        PUSHJ PDP,DFCL21        ;PROTECTION FAILURE,CLEAR ACCESS\r
+       JRST DFERR5\r
+\r
+;FILE IS BEING WRITTEN\r
+\r
+DFLUK8:        PUSHJ PDP,SCNAT2        ;LOOK FOR ANOTHER\r
+       JRST DFLUK2             ;NO MORE\r
+       JRST DFLUK3             ;FOUND WHAT MUST BE READ\r
+\r
+;TEST FOR MFD ALTERAION\r
+\r
+EXTERNAL SYSPP,JOB,PRJPRG\r
+\r
+ALTMFD:        MOVEI TAC,3(UUO)        ;IS PROJ, PROG. = 1,1?\r
+       TLO TAC,PROG            ;RELOCATE\r
+       MOVE TAC,@TAC           ;XWD PROJ,PROG\r
+       CAME TAC,SYSPP\r
+       POPJ PDP,               ;NO,RETURN\r
+\r
+       MOVE ITEM,JOB\r
+       XOR TAC,PRJPRG(ITEM)\r
+       TLNN TAC,-1             ;PRIVILEGED USER?\r
+       POPJ PDP,               ;YES, RETURN\r
+\r
+       JRST    DFERR5\r
+\f\r
+;RENAME UUO\r
+\r
+EXTERNAL CPOPJ1\r
+EXTERNAL THSDAT\r
+DFREN: PUSHJ PDP,DFRENX\r
+       POPJ PDP,\r
+       JRST CPOPJ1\r
+\r
+DFRENX:        SKIPN DEVFIL(DEVDAT)    ;IS THERE AN OLD FILE?\r
+       JRST DFER11             ;NO, UNDEFINED FILE\r
+       TLO IOS,IO              ;YES, LOOK FOR THE FILE\r
+       MOVSI TAC,RENBIT        ;RESET BIT\r
+       ANDCAM TAC,DEVOAD(DEVDAT)\r
+       ADDI UUO,3              ;POINT TO XWD PROJ,PROG\r
+       PUSHJ PDP,SETLE9        ;RETURNS WITH PP ON PDL\r
+       JRST DFERR4             ;NO UFD, CLOCK ON\r
+       JRST DFERR7             ;NO SUCH FILE, CLOCK ON.\r
+       JRST DFERR6             ;FILE BEING WRITTEN\r
+       JRST DFREN1             ;ALREADY HAS ACCESS ENTRY\r
+\r
+       MOVEI DAT,0             ;BUILD ACCESS ENTRY\r
+       PUSHJ PDP,SETAT\r
+       MOVE TAC,TAC1           ;TAC,TAC1 POINT TO ACCESS ENTRY\r
+\r
+DFREN1:        AOS TBITS(TAC)          ;INCREMENT RCOUNT\r
+       HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY\r
+       SCHEDULE\r
+       HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED?\r
+       PUSHJ PDP,SETPTR        ;READ IN FIRST SET OF RETRIEVAL POINTERS\r
+       MOVEI   AC1,@UUO        ;IS THE PROTECTION TO BE CHANGED ?\r
+       MOVEI   TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB\r
+       MOVE    AC1,2(AC1)      ;USER SPECIFIED PROTECTION\r
+       XOR     AC1,2(TAC)      ;COMPARE WITH STORED PROTECTION\r
+       TLZ     IOS,PRCHG\r
+       TLNN    AC1,777000      ;ANY DIFFERENCES?\r
+       JRST DFRN2A\r
+       MOVSI DAT,400000        ;YES, CAN IT BE?\r
+       PUSHJ PDP,PROTKX\r
+       JRST DFREN8             ;NO, ERROR\r
+       TLO IOS,PRCHG           ;YES\r
+DFRN2A:        MOVSI DAT,100000        ;CAN THIS BE RE-WRITTEN?\r
+       PUSHJ PDP,PROTEK\r
+       JRST DFERR3             ;BAD RETREIVAL INFO\r
+       JRST DFRN8A             ;WRITE PROTECTED\r
+       TLZ IOS,PRCHG           ;ARBITRARY CHANGE OK.\r
+\f\r
+DFREN2:        NOSCHEDULE\r
+       PUSHJ PDP,SCANAT        ;SCAN ACCESS TABLE FROM BEGINNING\r
+       JRST DFRN1B             ;NO\r
+\r
+DFRN1A:        MOVE DAT,TBITS(TAC)     ;YES, BEING ALTERED?\r
+       TRNE DAT,ATBITS         ;FILE BEING CREATED OR RENAMED?\r
+       JRST DFREN9             ;YES, YOU LOSE.\r
+       PUSHJ PDP,SCNAT2        ;NO, CONTINUE SCANNING\r
+       JRST DFRN1B\r
+       JRST DFRN1A             ;FOUND ANOTHER\r
+\r
+DFRN1B:        HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY\r
+       MOVEI AC1,RTBIT         ;RENAME BIT\r
+       ORM AC1,TBITS(TAC)\r
+       SCHEDULE\r
+\f\r
+       MOVE TAC,@UUO           ;GET NEW FILENAME\r
+       CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB?\r
+       JRST DFREN3             ;NO\r
+       ADDI UUO,1              ;YES, SAME EXTENSION?\r
+       MOVE TAC,@UUO           ;NEW EXTENSION\r
+       XOR TAC,DEVEXT(DEVDAT)  ;COMPARE WITH DDB?\r
+       TLNE TAC,-1             ;SAME?\r
+       SOJA UUO,DFREN3         ;NO\r
+\r
+;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION\r
+\r
+       TLZ IOS,PRCHG           ;CLEAR PRTOECTION CHANGE FLAG\r
+       ADDI UUO,1              ;YES, CHANGE PROTECTION\r
+       LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION\r
+       HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO\r
+       ADDI TAC1,2             ;POINT TO PROTECTION\r
+       TLNN IOS,UBFS           ;BUFFER IN MONITOR CORE?\r
+       TLO TAC1,PROG           ;NO, RELOCATION.\r
+       DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB\r
+\r
+       PUSHJ PDP,WRI           ;RE-WRITE THE BLOCK\r
+\r
+DFREXT:        AOS -1(PDP)             ;LEAVE\r
+       POP PDP,TAC\r
+       PUSHJ PDP,CLRBUF        ;CLEAR NAY DUMP BUFFER\r
+       JRST DFCL21             ;CLEAR ACCESS ENRTY AND EXIT\r
+\r
+DFREN3:        TLZE IOS,PRCHG          ;IS ONLY PROTECTION CHANGE PERMITTED?\r
+       JRST DFREN8             ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT\r
+       POP PDP,TAC             ;BACK UP PDP\r
+       PUSHJ PDP,ALTMFD        ;ALTERING MFD?\r
+       SKIPN @UUO              ;RENAMING TO 0 (I.E. DELETING)?\r
+       JRST DFREN7             ;YES\r
+\r
+       MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE\r
+       HLR TAC,SETCNT(DEVDAT)  ;BLOCK# OF UFD RIB\r
+       PUSH PDP,TAC            ;SAVE XWD ACCESS POINTER, BLOCK#\r
+       MOVE TA,DEVEXT(DEVDAT)  ;BLOCK# OF FIRST FILE RIB\r
+       HLL TA,DEVCNT(DEVDAT)   ;RELATIVE TO UFD BLOCK#\r
+       MOVE TB,DEVFIL(DEVDAT)  ;HOLD FILE NAME\r
+\r
+       MOVSI TAC,RENBIT\r
+       ORM TAC,DEVOAD(DEVDAT)  ;FOR "SETLE"\r
+       PUSHJ PDP,SETLE0        ;LOOK FOR THIS NEW FILE NAME\r
+       JRST DFERR4             ;NO UFD (SHOULD NOT HAPPEN)\r
+       JRST DFREN5             ;NEW FILE NOT THERE\r
+       JFCL                    ;NEW NAME ALREADY THERE, ERROR\r
+       JFCL\r
+       POP     PDP,TAC\r
+       SCHEDULE\r
+       PUSHJ PDP,DFCL21\r
+       JRST DFER10\r
+\f\r
+;ALTER RETRIEVAL INFORMATION\r
+\r
+DFREN5:        POP PDP,DAT             ;BACK UP PDP\r
+\r
+       MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB\r
+       HRRM TA,DEVEXT(DEVDAT)  ;RESTORE BLOCK# OF RIB\r
+       HLLM TA,DEVCNT(DEVDAT)  ;RESTORE UFD RELATIVE BLOCK\r
+\r
+       MOVE TAC,(PDP)          ;XWD ACCESS POINTER, BLOCK#\r
+       HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY\r
+       HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB\r
+       HRRZ TAC,TA\r
+       MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS\r
+       PUSHJ PDP,RRIA          ;GET RETRIEVAL INFO BLOCK\r
+       PUSHJ PDP,SET000        ;POINT TAC1 TO WORD 0\r
+\r
+       MOVE TAC,@UUO           ;GET NEW NAME\r
+       MOVEM TAC,@TAC1         ;STORE IN RIB\r
+       ADDI TAC1,1             ;CHANGE EXTENSION\r
+       ADDI UUO,1\r
+       MOVE TAC,@TAC1          ;GET OLD EXTENSION\r
+       HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB\r
+       MOVE TAC,@UUO           ;NEW EXTENSION\r
+       HRR TAC,THSDAT          ;AND ACCESS DATE\r
+       ORI TAC,400000          ;INSURE IT IS NON-ZERO\r
+       MOVEM TAC,@TAC1         ;STORE IN RIB\r
+       ADDI TAC1,1             ;CHANGE PROTECTION\r
+       ADDI UUO,1\r
+       LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION\r
+       DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB\r
+\r
+       PUSHJ PDP,WRI           ;RE-WRITE RIB\r
+\f\r
+;ALTER UFD BLOCK\r
+\r
+       PUSHJ PDP,FINDE         ;BRING IN CORRECT BLOCK\r
+       \r
+       SUBI UUO,1              ;REPLACE EXTENSION IN UFD\r
+       MOVE TAC,@UUO\r
+       HLLM TAC,@TAC1\r
+       SUBI UUO,1              ;AND NAME\r
+       SUBI TAC1,1\r
+       MOVE TAC,@UUO\r
+       MOVEM TAC,@TAC1\r
+\r
+       PUSHJ PDP,WUFD          ;RE-WRITE THE BLOCK\r
+       JRST DFREXT             ;LEAVE\r
+\r
+;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION\r
+\r
+DFRN8A:        TLNE  IOS,PRCHG         ;PROTECTION CHANGE?\r
+       JRST DFREN2             ;YES\r
+\r
+DFREN8:        PUSHJ PDP,DFCL21        ;TAKE OUT ACCESS ENTRY\r
+       JRST DFERR5             ;AND LEAVE\r
+\r
+;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED.\r
+\r
+DFREN9:        SCHEDULE\r
+       PUSHJ PDP,DFCL21        ;TEAKE OUT ACCESS ENTRY\r
+       JRST DFERR6\r
+\f\r
+;DELETE A FILE FROM A UFD\r
+\r
+DFREN7:        PUSHJ PDP,FINDE         ;FIND THE CORRECT BLOCK\r
+\r
+       NOSCHEDULE\r
+       MOVEI TAC1,@TAC1\r
+       SUBI TAC1,1             ;DESTINATION\r
+       HRLI TAC1,2(TAC1)       ;SOURCE IS ENTRY BEYOND DESTINATION\r
+\r
+       HRRZ    AC2,DSKBUF(DEVDAT)\r
+       ADDI    AC2,BLKSIZ-2    ;SET LIMIT OF BLT\r
+       TLNN    IOS,UBFS        ;BUFFER IN MONITOR ONE?\r
+       ADDI    AC2,(PROG)      ;NO. RELOCATE\r
+\r
+       BLT TAC1,(AC2)          ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE\r
+                               ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK)\r
+\r
+       SETZM @AC2              ;MAKE SURE OF ZERO\r
+       SETZM 1(AC2)\r
+       SCHEDULE\r
+\r
+       PUSHJ PDP,WUFD          ;RE-WRITE\r
+       AOS (PDP)               ;SKIP RETURN\r
+       HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+       MOVEI TAC1,DTBIT\r
+       IORM TAC1,TBITS(TAC)    ;SET TO DELETE WHEN THROUGH READIN\r
+       JRST DFCL21             ;CLOSE ACCESS ENTRY AND LEAVE\r
+\f\r
+;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME\r
+;SEARCH THRU MFD AND UFD FOR THE FILE-NAME,\r
+;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND.\r
+;EXIT TO CALL+2 IF THE FILE IS NOT FOUND.\r
+;EXIT TO CALL+3 IF FILE IS BEING WRITTEN\r
+;EXIT TO CALL+4 IF FILE IS BEING READ\r
+;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY.\r
+\r
+;UPON EXIT,    (PDP) = OWNER PROJ,-PROG. NUMBER\r
+\r
+EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1\r
+\r
+SETLE: MOVSI TAC,RENBIT        ;TURN OFF THE FLAG\r
+       ANDCAM TAC,DEVOAD(DEVDAT)\r
+\r
+SETLE0:        MOVEM IOS,DEVIOS(DEVDAT)\r
+       TLO UUO,PROG\r
+       MOVE AC1,@UUO           ;PICK UP FILE NAME\r
+       MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB\r
+\r
+       ADDI UUO,1\r
+       HLLZ AC1,@UUO\r
+       MOVEM AC1,DEVEXT(DEVDAT)\r
+       ADDI UUO,2              ;UUO POINTS TO PP\r
+SETLE9:        MOVE ITEM,JOB           ;TRY CURRENT JOB PP.\r
+       SKIPG DAT,@UUO          ;IS IT A PP?\r
+       MOVE DAT,PRJPRG(ITEM)   ;NO. GET PP FROM TABLE.\r
+       TLNE DEVDAT,SYSDEV      ;SYSTEM DEVICE?\r
+       MOVE DAT,SYSPP          ;YES, USE SYSTEM (CUSP) PROJ,PROG #\r
+       MOVEM DAT,@UUO\r
+       MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON\r
+       SUBI UUO,3              ;UUO POINTS TO FILE NAME\r
+       EXCH DAT,(PDP)          ;PUT PP-NUMBER IN PD LIST\r
+       PUSH PDP,DAT            ;PDP POINTS TO CALL+1\r
+\f\r
+;SEARCH MFD FOR THE OWNER OF THE FILE\r
+\r
+       MOVE DAT,-1(PDP)         ;XWD PROJ,PROG\r
+       MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD"\r
+       MOVE TAC,MFDBLK          ;BLOCK# OF MFD RIB\r
+       PUSHJ PDP,DIRSRC\r
+       POPJ PDP,                ;UFD NOT THERE\r
+\r
+;SEARCH UFD FOR THE FILE\r
+\r
+       AOS (PDP)                ;PDP POITNS TO CALL+2\r
+       ADDI TAC,1               ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
+       HRRZ TAC,@TAC            ;BLOCK# OF UFD RIB\r
+       HRLM TAC,SETCNT(DEVDAT)  ;SAVE BLOCK#\r
+       SETZM DEVCNT(DEVDAT)     ;LH WILL BE USED TO COUNT UFD BLOCKS\r
+       MOVE AC1,DEVEXT(DEVDAT)\r
+       PUSHJ PDP,DSRC10         ;SEARCH UFD\r
+       POPJ PDP,                ;FILE NOT THERE\r
+\r
+       ADDI TAC,1               ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
+       MOVE AC3,@TAC\r
+       HRRM AC3,DEVEXT(DEVDAT)  ;SAVE BLOCK# OF FIRST RIB\r
+       AOS (PDP)                ;PDP POINTS TO CALL+3\r
+       MOVE AC2,-1(PDP)         ;XWD PROJ,PROG\r
+       NOSCHEDULE\r
+       PUSHJ PDP,SCNAT0         ;LOOK IN ACCESS TABLE\r
+       JRST CPOPJ2              ;NOT THERE. RETURN TO CALL+5\r
+       MOVE DAT,TBITS(TAC)      ;RENAMING?\r
+       TRNE DAT,WTBIT           ;BEING WRITTEN?\r
+       POPJ PDP,                ;YES. RETURN TO CALL+3\r
+       TRNN DAT,RTBIT\r
+       JRST CPOPJ1              ;NO, ALL OK, RETURN TO CALL+4\r
+       MOVE TAC,DEVOAD(DEVDAT)  ;ARE WE RENAMING?\r
+       TLNE TAC,RENBIT\r
+       POP PDP,TAC              ;YES\r
+       POP     PDP,TAC\r
+       JRST DFERR6\r
+\f\r
+;CHECK RETRIEVAL INFO FOR ELIGIBILITY\r
+;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2\r
+;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG\r
+;EXIT TO CALL+2 IF PROTECTION WRONG\r
+;EXIT TO CALL+3 IF ALL OK\r
+\r
+EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP\r
+\r
+PROTEK:        MOVEI TAC,PTR1(DEVDAT)  ;POINT TO RETRIEVAL INFO\r
+       MOVE AC1,@TAC           ;NAME OK?\r
+       CAME AC1,DEVFIL(DEVDAT)\r
+       POPJ PDP,               ;NO\r
+       HLLZ AC2,DEVEXT(DEVDAT)\r
+       HLLZ AC1,1(TAC)         ;EXTENSION FROM RIB\r
+       CAM AC1,AC2\r
+       POPJ PDP,               ;EXTENSION NOT RIGHT\r
+\r
+       AOS (PDP)\r
+PROTKX:        MOVE AC1,-1(PDP)\r
+\r
+PROTKY:        MOVE ITEM,JOB\r
+       XOR AC1,PRJPRG(ITEM)\r
+       TRNN AC1,-1             ;SAVEM PROGRAMMER?\r
+       JRST PROT1              ;YES\r
+\r
+       ROT DAT,-3              ;ROTATE TO PROJECT FIELD\r
+       TLNE AC1,-1             ;NO, SAME PROJECT?\r
+       ROT DAT,-3              ;NO, ROTATE TO UNIVERAL FIELD\r
+\r
+PROT1: TLZ DAT,60000   ;DO NOT TEST OWNER READ OR PROTECT PROTECTION\r
+       TDNN DAT,2(TAC)\r
+       JRST CPOPJ1     ;PROTECTION O.K.\r
+       MOVE AC1,PRJPRG(ITEM)\r
+       CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT\r
+                       ;PROGRAMMER NUMBER?\r
+       AOS(PDP)        ;YES, ALL FILES AVAILABLE\r
+       POPJ PDP,\r
+\f\r
+;CLOSE UUO\r
+;CLOSE AN OUTPUT FILE\r
+\r
+EXTERNAL PIOMOD,WAIT1,OUT\r
+\r
+DFCLSO:        TLNN DEVDAT,ENTRB       ;ENTER DONE YET?\r
+       POPJ PDP,       ;NO, FORGET IT\r
+       HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY)\r
+       IFN FTRCHK,<\r
+       SKIPN TAC       ;ACCESS TABLE POINTER EXISTS?\r
+       HALT .  ;IF NOT, HALT, NO RE-START POSSIBLE.\r
+>\r
+       MOVE TAC,TBITS(TAC)\r
+       IFN FTRCHK, <\r
+       TRNN TAC,ATCLO+RWTBIT   ;CREATION OR UPDATE OF FILE IN PROGRESS?\r
+       HALT .  ;NO, ERROR. CAN'T CONTINUE\r
+>\r
+       LDB TAC,PIOMOD\r
+       CAIGE TAC,DR    ;DUMP MODE?\r
+       TLNE DEVDAT,DSKRLB      ;RESET UUO IN PROGRESS?\r
+       JRST DFCL2      ;YES TO EITHER QUESTION\r
+       HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT\r
+                       ; BUFFER HEADER BLOCK.\r
+       TLO TAC,PROG    ;RELOCATE\r
+       SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ?\r
+       JRST DFCL2      ;YES, DON'T OUTPUT\r
+       AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER\r
+       ADD TAC1,[XWD PROG,1]   ;TAC1 POINTS TO WORD COUNT PRECEDING\r
+                       ; USER DATA BUFFER\r
+       HRRZ AC1,@TAC   ;PICK UP OUTPUT BYTE POINTER\r
+       SKIPE AC1       ;DON'T CALCULATE WORD COUNT IF BYTE POINTER\r
+                       ; NOT SET UP\r
+       SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED\r
+       TRNE IOS,IOWC   ;USER KEEPING HIS OWN WORD COUNT ?\r
+       HRRZ AC1,@TAC1  ;YES, SUBSTITUTE HIS COUNT FOR\r
+                       ; COMPUTED WORD COUNT\r
+       SKIPN AC1       ;WORD COUNT EQUAL TO 0?\r
+       JRST DFCL2      ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK.\r
+       PUSHJ PDP,OUT   ;NO, GO WRITE LAST PARTIAL BUFFER\r
+       PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH\r
+       \r
+DFCL2: PUSHJ PDP,SETBUF        ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS\r
+       TLO IOS,NMP!NCTRLC              ;SET NMP, MUST NOT INTERRUPT POINTER WRITING\r
+       MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN\r
+       PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS\r
+       HLRZ AC1,DEVBLK(DEVDAT)\r
+       XOR AC1,DEVEXT(DEVDAT)\r
+       TRNE AC1,-1             ;ONLY ONE BLOCK OF POINTERS?\r
+       PUSHJ PDP,RRIB  ;NO. READ FIRST BLOCK INTO BUFFER\r
+       PUSHJ PDP,SET000\r
+       ADDI TAC1,3     ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER\r
+       MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE\r
+       HRLM AC1,@TAC1  ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB\r
+       PUSHJ PDP,WRIB  ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION\r
+\f\r
+;CLOSE UUO CONTINUED.\r
+;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK.\r
+;NOW PUT ENTRY IN DIRECTORY.\r
+       TLZ DEVDAT,ENTRB\r
+       HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER\r
+       MOVE DAT,TBITS(TAC)     ;GET STATUS BITS AND READ COUNT\r
+       TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE?\r
+       JRST DFCLU1     ;YES\r
+       TLNE DEVDAT,DSKRLB      ;RESET UUO IN PROGRESS?\r
+       JRST DFC16A     ;YES\r
+       TRNN DAT,ATIND  ;IUS NAME ALREADY IN DIRECTORY?\r
+       JRST DFCL20     ;NO. INSERT IT\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY.\r
+       MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER\r
+       EXCH TAC,@TAC1  ;TAC1 POINTS TO ENTRY IN UFD BLOCK\r
+       MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM  \r
+       PUSHJ PDP,WUFD  ;WRITE THE BLOCK BACK OUT\r
+       HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
+       NOSCHEDULE\r
+       PUSH PDP,ATPP(TAC)      ;SAVE XWD PROJ,PROG\r
+       PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
+       POP PDP,AC2     ;XWD PROJ,PROG\r
+       PUSHJ PDP,SCNAT0        ;SCAN FOR ANY OTHERS READING OLD VERSION\r
+       JRST DFCL17             ;NONE\r
+       \r
+DFCL16:        MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED\r
+       IORM AC1,TBITS(TAC)\r
+       PUSHJ PDP,SCNAT2        ;LOOK FOR MORE\r
+       JRST CLRBUF     ;NO MORE\r
+       JRST DFCL16\r
+DFC16A:        PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE.\r
+                       ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE.\r
+                       \r
+DFCL17:        SCHEDULE\r
+       HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE\r
+       JRST RECLAM\r
+       \r
+DFCL20:        PUSHJ PDP,INSDIR                ;INSERT THE NAME\r
+       HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
+       NOSCHEDULE\r
+       PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
+       JRST CLRBUF     ;CLEAR ANY BUFFER IN FREE STORAGE\r
+DFCLU1:        MOVEM DAT,TBITS(TAC)    ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED)\r
+       TLN DEVDAT,LOOKB        ;WAS IUNPUT SIDE OF FILE ALSO CLOSED?\r
+       POPJ PDP,       ;NO, LET THE USER KEEP READING IT\r
+       TRNE DAT, RCOUNT        ;YES, ANYBODY ELSE STILL READING IT?\r
+       JRST DFCLU2     ;YES\r
+       TRNE DAT,DTBIT  ;NO, WAS IT MARKED FOR DELETION?\r
+       JRST DFC16A     ;YES, GO DELETE IT AND RECLAIM DISK SPACE\r
+       PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY\r
+DFCLU2:        HRRZS DEVACC(DEVDAT)    ;CLEAR POINTER TO ACCESS TABLE\r
+       JRST CLRBUF     ;CLEAR ANY BUFFER AREA AND EXIT.,\r
+\r
+\r
+       ;CLOSE UUO CONTINUED.\r
+;CLOSE AN INPUT FILE.\r
+\r
+DFCLSI:        TLZN DEVDAT,LOOKB\r
+       POPJ PDP,\r
+DFCL21:        HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+       JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED\r
+                       ; (PROBABLY ^C DURING EARLIER ATTEMPT)\r
+       MOVE TAC1,TBITS(TAC)    ;GET STATUS BITS\r
+       IFN FTRCHK,<\r
+       TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)?\r
+       HALT CPOPJ              ;IF SO, SOMEBODY IS VERY CONFUSED.\r
+>\r
+       NOSCHEDULE\r
+       SOS TAC1,TBITS(TAC)     ;DECREMENT RCOUNT\r
+       TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO?\r
+       JRST DFCL23     ;YES, LEAVE\r
+\r
+       TRNE TAC1,DTBIT ;TO BE DELETED?\r
+       JRST  DFC16A    ;YES\r
+       PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT\r
+DFCL23:        SCHEDULE\r
+       TLZN DEVDAT,INPB        ;ANY INPUT UUO'\r
+       JRST CLRBUF     ;NO, JUST EXIT, RETURNING MON BUF\r
+       PUSHJ PDP,SETBUF        ;YES, UPDATE ACCESS DATE AS FOLLOWS:\r
+       PUSHJ PDP,RRIB  ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION.\r
+       SUBI TAC1,BLKSIZ-2      ;SET TAC1 TO 2ND WORD OF BLOCK\r
+       LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA.\r
+       CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY?\r
+       JRST CLRBUF     ;YES, JUST CLEAR BUFFER AND EXIT.\r
+       MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE.\r
+       DPB AC1,[POINT 17,@TAC1,35] ;\r
+       PUSHJ PDP,WRIB  ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION.\r
+       JRST CLRBUF     ;CLEAR BUFFER AND EXIT.\r
+\r
+SUBTTL DIRECTORY SEARCHING\r
+;SEARCH DIRECTORY FOR A PARTICULAR ENTRY.\r
+;ENTRY BY:     MOVE DAT,NAME\r
+;              HLLZ AC1,EXTENSION\r
+;              HRRZ TAC,BLOCK NUMBER FOR POINTERS\r
+;              PUSHJ PDP,DIRSRC\r
+;              EXIT1           NAME NOT FOUND\r
+;              EXIT2           NAME FOUND, TAC POINTS TO ENTRY\r
+\r
+DIRSRC:        PUSH PDP,AC1\r
+       PUSH PDP,DAT    ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION\r
+       PUSHJ PDP,SETPTR        ;READ UFD RETRIEVAL POINTERS\r
+DRSRC0:        HRRZ TAC,DEVACC(DEVDAT)\r
+       CAILE TAC,PTRN(DEVDAT)  ;MORE POINTERS IN CORE?\r
+       JRST DRSRC7     ;NO, GET MORE.\r
+       HRRZ TAC,(TAC)\r
+       JUMPE TAC,DRSRC6        ;0 SIGNALS END OF POINTERS\r
+       AOS DEVACC(DEVDAT)      ;NEXT POINTER\r
+\r
+       AOS DEVCNT(DEVDAT)      ;COUNT UFD BLOCKS SEARCHED\r
+       PUSHJ PDP,MQIN  ;READ IN DATA BLOCK\r
+       JRST RERA       ;ERROR, YOU LOSE.\r
+\r
+       MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER\r
+       HRRZ TAC,TAC1\r
+       TLNN IOS,UBFS   ;DUMP MODE?\r
+       HRLI TAC,PROG   ;NO. RELOCATE.\r
+       HLLZ AC1,-1(PDP)        ;SIXBIT/EXT/\r
+DRSR3A:        SKIPN AC3,@TAC  ;BLOCK ENTIRELY SEARCHED?\r
+       JRST DRSRC0     ;YES\r
+       ADDI TAC,1\r
+       CAMN AC3,(PDP)  ;NAMES MATCH?\r
+       JRST DRSRC8     ;YES\r
+\r
+DRSRC4:        ADDI TAC,1\r
+       HRRZ AC3,TAC\r
+       CAIE AC3,BLKSIZ(TAC1)   ;IS BLOCK ENTIRELY SEARCHED?\r
+       JRST DRSR3A     ;NO\r
+       JRST DRSRC0\r
+\r
+DRSRC7:        TLNE IOS,NMP    ;ANY MORE POINTERS ON DISK?\r
+       JRST DRSRC6             ;NO\r
+       PUSHJ PDP,GETPTR                ;YES, GET SOME\r
+       JRST DRSRC0\r
+\r
+DRSRC8:        HLLZ AC3,@TAC   ;DOES EXTENSION MATCH\r
+       CAME AC3,AC1\r
+       JRST DRSRC4     ;NO\r
+       SUBI TAC,1      ;POINT TO FIRST WORD OF ENTRY\r
+\r
+       AOS -2(PDP)     ;YES, ENTRY IS FOUND\r
+       MOVSS DEVCNT(DEVDAT)    ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE\r
+;EXIT\r
+\r
+DRSRC6: POP PDP,DAT\r
+       POP PDP,AC1\r
+       POPJ PDP,       ;"FILE" NOT FOUND\r
+;CHECK PROTECTION ON UFD\r
+\r
+DSRC10: PUSH PDP,AC1   ;PUSH EXTENSION\r
+       PUSHJ PDP,SETPTR\r
+       MOVSI DAT,200000        ;SET UP TO TEST READ BIT\r
+       TLNE IOS,10     ;IS IT LOOKUP>\r
+       ROT DAT,-1              ;NO,TEST WRITE PROTECTION\r
+       MOVEI TAC,PTR1(DEVDAT)\r
+       HRRZ AC1,-3(PDP)                ;XWD PROJ,PROG\r
+       TLZ     IOS,PRCHG\r
+       PUSHJ PDP,PROTKY\r
+       TLO IOS,PRCHG   ;FLAG PROTECTION CHANGE\r
+       PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC\r
+       JRST DRSRC0\r
+\r
+       \r
+;FIND A UFD ENTRY,  IT MUST BE THERE.\r
+\r
+EXTERNAL AUREQ,AUWAIT\r
+\r
+FINDE: AOSE AUREQ\r
+       PUSHJ PDP,AUWAIT\r
+       TLO IOS,AUFLG\r
+       HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS\r
+       HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC\r
+       ADDI DAT,DIRSIZ\r
+\r
+FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK\r
+       PUSHJ PDP,RRIA\r
+       CAILE DAT,BLKSIZ-2      ;POINTER IN THIS BLOCK?\r
+       JRST FINDE2             ;NO, GET NEXT ONE\r
+       SUBI DAT,1                      ;YES, BRING THEM IN\r
+       HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB\r
+       PUSHJ PDP,DFIN4         ;COPY POINTERS INTO DDB\r
+       HRRZ TAC,PTR1(DEVDAT)   ;GET RETRIEVAL POINTER FOR UFD BLOCK\r
+\r
+       PUSHJ PDP,MQIN          ;READ THE UFD BLOCK\r
+       JRST RERA                       ;ERROR\r
+       PUSHJ PDP,SET000                ;FIND THE ENTRY\r
+       HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB\r
+\r
+SRCU1: MOVE TAC,@TAC1  ;GET FILE NAME FROM UFD\r
+       ADDI TAC1,1\r
+       CAME TAC,DEVFIL(DEVDAT) ;SAME?\r
+       AOJA TAC1,SRCU1         ;NAMES DO NOT MATCH\r
+       HLLZ TAC,@TAC1          ;GET EXTENSION FROM UFD\r
+       CAME TAC,AC1            ;SAME?\r
+       AOJA TAC1,SRCU1         ;EXTENSIONS DO NOT MATCH\r
+       POPJ PDP,                       ;FOUND IT\r
+\r
+FINDE2:        PUSHJ PDP,SET176                ;GET THE NEXT POINTER BLOCK\r
+       HLRZ TAC,@TAC1\r
+       SUBI DAT,BLKSIZ-2       ;BACK UP DAT\r
+       JRST FINDE1\r
+\r
+;INSERT AN ENTRY IN A DIRECTORY.\r
+\r
+EXTERNAL AUREQ,AUWAIT,AUAVAL\r
+\r
+INSDIR:        AOSE AUREQ      \r
+       PUSHJ PDP,AUWAIT\r
+       TLO IOS,AUFLG\r
+       SETZM DEVCNT(DEVDAT)    ;CLEAR BEFORE COUNTING BLOCK OF UFD\r
+       HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB\r
+       PUSHJ PDP,SETPTR                ;SET UP FIRST POINTERS,.\r
+       SOS DEVACC(DEVDAT)      ;SYNC\r
+\r
+INSD1: AOS TAC,DEVACC(DEVDAT)  ;GET NEXT POINTER,\r
+       HRRZS TAC\r
+       AOS DEVCNT(DEVDAT)      ;COUNT EACH UFD BLOCK\r
+       CAILE TAC,PTRN(DEVDAT)  ;ANY MORE IN CORE?\r
+       JRST INSD10             ;NO, GET SOME MORE\r
+\r
+INSD2: HRRZ TAC,(TAC)  ;GET RETRIEVAL POINTER\r
+       JUMPE TAC,INSD5         ;0 SIGNALS END OF POINTERS\r
+       PUSHJ PDP,MQIN  ;READ UFD BLOCK\r
+       JRST RERA               ;ERROR.\r
+\r
+       PUSHJ PDP,SET176                ;SET TAC1 TO WORD 127\r
+       SKIPE @TAC1             ;IS IT ZERO?\r
+       JRST INSD1              ;NO, BLOCK FULL.\r
+\r
+       MOVSS DEVCNT(DEVDAT)    ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY\r
+       PUSHJ PDP,INSD3         ;INSERT ENTRY.\r
+\r
+       JRST WUFD               ;WRITE BLOCK AND LEAVE\r
+\r
+;INSERT THE ENTRY.\r
+\r
+INSD3: HRRZ AC1,DSKBUF(DEVDAT)\r
+INSD3B:        CAIN AC1,(TAC1)         ;BEGINNING OF BLOCK?\r
+       JRST INSD3A     ;YES\r
+       SUBI TAC1,2\r
+       SKIPN @TAC1             ;SEARCH UFD BLOCK BACKWARDS\r
+                               ; FOR LAST NON-ZERO FILENAME.\r
+\r
+       JRST INSD3B\r
+\r
+       ADDI TAC1,2     ;MOVE IN NAME.\r
+INSD3A:        MOVE TAC,DEVFIL(DEVDAT)\r
+       MOVEM TAC,@TAC1\r
+       ADDI TAC1,1     ;MOVE IN EXTENSION & POINTER.\r
+       MOVE TAC,DEVEXT(DEVDAT)\r
+       IFN FTRCHK,<\r
+               TRNN TAC,-1     ;POINTER TO BLOCK 0\r
+\r
+               HALT .+1                ;FOR RETRIEVAL INFO\r
+                                       ; CONTINUE-GET BAD INFO MESSAGE\r
+>\r
+       MOVEM TAC,@TAC1\r
+       POPJ PDP,\r
+\r
+;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY\r
+;POINTER BLOCK, ADD POINTER IF POSSIBLE.  IF NOT POSSIBLE.\r
+;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT.\r
+\r
+INSD5: PUSHJ PDP,SET000        ;@TAC1 POINTS TO WORD 0 OF BUFFER\r
+       NOSCHEDULE\r
+       MOVEI TAC,@TAC1         ;POINT TO WORD 0 OF BUFFER\r
+       SETZM 2(TAC)            ;CLEAR FOR BLT\r
+       MOVSI DAT,2(TAC)        ;SOURCE\r
+       HRRI DAT,3(TAC)         ;DESTINATION\r
+       BLT DAT,BLKSIZ-1(TAC)   ;CLEAR WORDS 2.-127.\r
+       SCHEDULE\r
+\r
+       PUSHJ PDP,INSD3A        ;INSERT ENTRY IN WORDS 0,1\r
+       MOVSS DEVCNT(DEVDAT)    ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK\r
+       PUSHJ PDP,DFGETF        ;GET A FREE BLOCK\r
+       MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT\r
+\r
+       IFG CHKCNT,<\r
+       MOVE TAC,DSKBUF(DEVDAT)\r
+       PUSHJ PDP,CHKSUM\r
+       HRLM TAC1,SETCNT(DEVDAT)\r
+       MOVE TAC,SETCNT(DEVDAT)\r
+       >\r
+\r
+INSD5A:        PUSHJ PDP,MQOUT         ;WRITE THE UFD BLOCK OUT\r
+       JRST INSD11             ;ERROR\r
+\r
+       PUSHJ PDP,RRI           ;READ POINTER BACK IN.\r
+INSD6: PUSHJ PDP,SET176\r
+       HLRZ TAC,@TAC1          ;LAST OR ONLY BLOCK?\r
+       JUMPE TAC,INSD7\r
+\r
+       PUSHJ PDP,RRIA          ;NO, READ NEXT ONE.\r
+       JRST INSD6\r
+\r
+INSD7: SUBI TAC1,1             ;YES, ROOM FOR ANOTHER POINTER?\r
+       SKIPN @TAC1\r
+       SOJA TAC1,INSD8\r
+\r
+       PUSHJ PDP,NEWRIB        ;CREATE NEW POINTER BLOCK.\r
+       PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD\r
+INSD7A:        MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE\r
+       MOVEM TAC,@TAC1         ;STORE POINTER TO NEW UFD BLOCK\r
+       PUSHJ PDP,WRI           ;WRITE BLOCK\r
+       SOSL AUREQ              ;RELEASE UFD RESOURCE\r
+       SETOM AUAVAL\r
+       TLZ IOS,AUFLG\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+;ROOM FOR ANOTHER POINTER IN THIS BLOCK.  FIND LAST POINTER.\r
+;INSERT NEW ONE, AND WRITE BLOCK OUT.\r
+\r
+INSD8: SKIPN @TAC1\r
+       SOJA TAC1,INSD8         ;SCAN BACKWARDS FOR LAST POINTER\r
+       AOJA TAC1,INSD7A        ;FOUND IT.  ADD NEW ONE.\r
+\r
+;GET MORE POINTERS INTO CORE.\r
+\r
+INSD10:        TLNE IOS,NMP            ;ANY MORE ON DISC?\r
+       JRST INSD5              ;NO\r
+       PUSHJ PDP,GETPTR\r
+       MOVE TAC,DEVACC(DEVDAT)\r
+       JRST INSD2\r
+\r
+;WRITE ERROR. IF WRITE-LOCK. FIX IT.\r
+\r
+INSD11:        TRNN IOS,IOIMPM\r
+       JRST WERA               ;IT WAS NOT, YOU LOSE.\r
+\r
+       PUSHJ PDP,WLERA         ;GET ANOTHER BLOCK\r
+       HRRM TAC,SETCNT(DEVDAT)\r
+       JRST INSD5A\r
+\r
+\r
+;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT.\r
+;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE\r
+;ALTERED, WRITE THEM OUT.\r
+\r
+EXTERNAL AUREQ,AUAVAL\r
+\r
+WUFD:  IFG CHKCNT,<\r
+       MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER\r
+       PUSHJ PDP,CHKSUM        ;RETURN CHECKSUM IN TAC1\r
+       >\r
+       MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
+       IFG CHKCNT,<\r
+       HRLM TAC1,(TAC)         ;STORE CHECKSUM IN RETRIEVAL POINTER\r
+       MOVSI TAC1,PNTDIF\r
+       ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK\r
+       >\r
+       IFLE CHKCNT,<\r
+       MOVE TAC1,DEVOAD(DEVDAT)\r
+       TLO TAC1,PRTOUT\r
+       TLZ TAC1,PNTDIF\r
+       MOVEM TAC1,DEVOAD(DEVDAT)\r
+       >\r
+       HRRZ TAC,(TAC)          ;GET BLOCK# FROM RETRIEVAL POINTER\r
+\r
+WUFD1: PUSHJ PDP,MQOUT         ;WRITE UFD BLOCK\r
+       JRST WUFD3              ;WRITE ERROR\r
+       MOVE TAC,DEVOAD(DEVDAT)\r
+       TLO IOS,NMP             ;SET NMP\r
+       MOVEM IOS,DEVIOS(DEVDAT) ;SO DFO4A WON'T READ POINTERS\r
+       TLN TAC,PNTDIF          ;WERE POINTERS CHANGED?\r
+       PUSHJ PDP,DFO4A         ;YES, WRITE THEM OUT.\r
+       SOSL AUREQ              ;RELEASE UFD RESOURCE\r
+       SETOM AUAVAL\r
+       TLZ IOS,AUFLG           ;NOTE THAT UFD RELEASED\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK?\r
+       TRNN TAC1,IOIMPM\r
+       JRST WERA\r
+       TRZ IOS,IOIMPM          ;YES\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       MOVSI TAC1,PNTDIF\r
+       ORM TAC1,DEVOAD(DEVDAT)\r
+       PUSHJ PDP,WLERA         ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE\r
+       MOVE TAC1,DEVACC(DEVDAT)\r
+       HRRM TAC,(TAC1)\r
+       JRST WUFD1\r
+\r
+SUBTTL ACCESS TABLE PROCESSING\r
+;SCAN ACCESS TABLE.\r
+;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE.\r
+;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE.\r
+\r
+EXTERNAL CPOPJ1,CPOPJ\r
+\r
+SCANAT:        MOVE AC2,-1(PDP)\r
+SCNAT0:        SKIPN TAC,FAT           ;ANY AT ALL?\r
+SCNHLT:        POPJ PDP,               ;NO, LEAVE (HALT PC HERE IF ATTEMPT\r
+                               ; TO CLEAR NON-EXISTANT ACCESS TABLE)\r
+\r
+SCNAT1:        CAME AC2,ATPP(TAC)      ;PROJ,-PROG. THE SAME?\r
+       JRST SCNAT2             ;NO\r
+\r
+       MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME?\r
+       CAME DAT,ATNAME(TAC)\r
+       JRST SCNAT2\r
+\r
+       HLLZ DAT,ATEXT(TAC)     ;EXTENSION THE SAME?\r
+       HLLZ AC3,DEVEXT(DEVDAT)\r
+       CAMN DAT,AC3\r
+       JRST CPOPJ1             ;YES\r
+\r
+;CONTINUE SCAN FROM CURRENT ENTRY\r
+\r
+SCNAT2:        HRRZ DAT,ATLINK(TAC)    ;ANY MORE ENTRIES?\r
+       JUMPE DAT,CPOPJ         ;NO\r
+       MOVE TAC,DAT            ;YES, GO TO THE NEXT ONE\r
+       JRST SCNAT1\r
+\r
+;CLEAR AN ACCESS ENTRY.\r
+;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE.\r
+;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT.\r
+\r
+CLRAT: IFN     FTRCHK,<\r
+       SKIPN TAC               ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR\r
+\r
+       HALT SCNHLT             ;CONTINUE WILL POPJ AND EXIT.\r
+>\r
+       HRRZS DEVACC(DEVDAT)    ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK\r
+       MOVEI AC2,FAT           ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES\r
+       SUBI AC2,ATLINK\r
+\r
+CLRAT1:        MOVE AC1,AC2            ;PICKUP THE NEXT ACCESS TABLE\r
+       HRRZ AC2,ATLINK(AC1)\r
+       IFN     FTRCHK,<\r
+       SKIPN AC2               ;ZERO LINK INDICATES END OF TABLE WITHOUT\r
+                               ;FINDING ENTRY TO BE CLEARED\r
+       HALT SETHLT             ;CONTINUING AFTER THIS ERROR WILL CONTINUE\r
+                               ; NORMALLY (IE POPJ)\r
+>\r
+       CAME AC2,TAC            ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED?\r
+       JRST CLRAT1             ;NO,CONTINUE SERACH\r
+\r
+       MOVE AC2,ATLINK(TAC)    ;YES, FOUND IT\r
+       HRRM AC2,ATLINK(AC1)    ;LINK AROUND IT\r
+       JRST CLRCOR             ;CLEAR THE CORE\r
+\r
+;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK.\r
+;BUILD UP THE ENTRY\r
+;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET\r
+\r
+\r
+SETAT: PUSHJ PDP,GETFCR        ;TAC1 POINTS TO 4 WORD BLOCK\r
+       HLL DAT,DEVEXT(DEVDAT)\r
+       MOVEM DAT,ATEXT(TAC1)   ;STORE EXTENSION\r
+       MOVE DAT,DEVFIL(DEVDAT)\r
+       MOVEM DAT,ATNAME(TAC1)  ;STORE FILE NAME\r
+       MOVE DAT,-1(PDP)        ;XWD PROJ,PROG\r
+       MOVEM DAT,ATPP(TAC1)    ;STORE XWD PROJ,PROG\r
+       HLL DAT,SETCNT(DEVDAT)  ;LOGICAL BLOCK# OF UFD RIB\r
+       HRR DAT,FAT             ;POINTER TO NEXT ENTRY\r
+       MOVEM DAT,ATLINK(TAC1)  ;STORE LINKE\r
+       HRRZM TAC1,FAT          ;POINT FAT TO THIS NEW ENTRY\r
+SETHLT:        POPJ PDP,               ;HALT PC HERE IF END OF TABLE WITHOUT FINDING\r
+                               ; ENTRY TO BE CLEARED\r
+\r
+SUBTTL DUMP INPUT/OUTPUT\r
+;DUMP MODE OUTPUT\r
+\r
+EXTERNAL COMCHK,ADRERR,SAVDDL\r
+\r
+DFDMPO:        TLNN DEVDAT,ENTRB       ;ENTER YET?\r
+       JRST DFERR2             ;NO, UNDEFINED FILE\r
+\r
+       TLO IOS,10              ;OUTPUT STATUS\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,COMCHK        ;CHECK IOWDS\r
+       JRST ADRERR             ;ERROR\r
+\r
+DFDO0: SKIPN TAC,@UUO          ;PICK UP NEXT IOWD\r
+       POPJ PDP,               ;IT WAS ZERO, LEAVE\r
+       TLNE TAC,-1             ;LH ZERO?\r
+       JRST DFDO0A             ;NO\r
+       HRR UUO,TAC             ;YES, ANOTHER TABLE\r
+       JRST DFDO0\r
+\r
+DFDO0A:        ADDI TAC,1              ;FORM XWD - LENGTH, FIRST-ADDRESS\r
+       PUSH PDP,TAC            ;SAVE IT\r
+\r
+DFDO1: PUSHJ PDP,UPDA          ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY\r
+                               ; BE MANIPULATED BY ONE USER AT A TIME!)\r
+DFDO1A:        PUSHJ PDP,SATGET        ;AQUIRE A NON-FULL SAT BLOCK\r
+                               ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT\r
+       HLRE ITEM(PDP)          ;ITEM < [LH OF IOWD]/200\r
+       MOVMS ITEM\r
+       ADDI ITEM,BLKSIZ-1      ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK\r
+       ASH ITEM,-BLKP2         ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE\r
+DFDO2A:        HRRZ AC1,SATPTR\r
+       MOVE AC2,SATBK2\r
+DFDO1B:        PUSHJ PDP,GETBIT        ;ASK FOR C(ITEM BITS)\r
+       JRST DFDO6              ;NOT AVAILABLE\r
+\r
+       ADDM ITEM,@SATPTR       ;INCREMENT COUNT\r
+       SETOM SATCHG            ;SAT BLOCK HAS BEEN CHANGED\r
+       HLRZ DAT,@SATPTR        ;COMPUTE BLOCK NUMBER LESS 1.\r
+       SCHEDULE\r
+       PUSHJ   PDP,DOWNDA      ;RESET DAREQ INTERLOCK.\r
+       ADDI DAT,-2(TAC1)\r
+       PUSH PDP,DAT            ;AND SAVE BLOCK NUMBER LESS 1\r
+       PUSH PDP,ITEM           ;SAVE COUNT OF BLOCKS WRITTEN\r
+       MOVE TAC1,-2(PDP)       ;SET UP AN IOWD (SAVED AT DFDO0A)\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       MOVN TAC,ITEM\r
+       LSH TAC,BLKP2\r
+       HLRES TAC1\r
+\r
+       CAML TAC,TAC1\r
+       HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE\r
+       HLRE TAC1,DSKBUF(DEVDAT)\r
+       MOVMS TAC1\r
+       PUSHJ PDP,UPDEVC        ;UPDATE SIZE OF FILE\r
+       ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE\r
+\r
+       MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT\r
+       TLZN TAC1,BLKSIZ-1      ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN?\r
+       JRST DFDO2G             ;YES, DON'T WORRY ABOUT PARTIAL BLOCK\r
+                               ;HANDLING PROBLEMS\r
+       PUSH PDP,TAC1           ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1\r
+                               ; TO BE WRITTEN\r
+       PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO\r
+       PUSHJ PDP,SETBUF        ;GET MONITOR BUFFER\r
+       MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER\r
+                               ; (RELOCATION NOT NECESSARY)\r
+       POP PDP,TAC             ;USER'S INITIAL ADDR AND WC\r
+       PUSHJ PDP,SAVDDL        ;ADJUST IN CASE THIS IS A SAVE OF A \r
+                               ; HIGH SEGMENT, WHICH WAS MOVED IN CORE\r
+                               ; DURING I/O WAIT.\r
+       MOVE AC1,TAC\r
+       HRRZ TAC,-2(PDP)        ;GET INITIAL BLOCK NUMBER-1\r
+DFDO2C:        ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL\r
+       AOS TAC                 ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK\r
+       JUMPL AC1,DFDO2C        ;OF THIS DUMP MODE OUTPUT REQUEST.\r
+       SUB AC1,[XWD BLKSIZ,BLKSIZ]\r
+       HLL AC2,AC1             ;SAVE LH\r
+DFDO2D:        MOVE AC2,(AC1)          ;MOVE DATA FROM END OF USER'S\r
+       MOVEM AC2,(TAC1)        ;OUTPUT AREA DT MONITOR BUFFER\r
+       AOBJP TAC1,.\r
+       AOBJP AC1,DFDO2D\r
+DFDO2E:        SETZM (TAC1)            ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER\r
+       AOBJN TAC1,DFDO2E\r
+       PUSHJ PDP,MQOUT         ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER\r
+                               ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE\r
+                               ; MODE OUTPUT REQUEST\r
+       JFCL                    ;IGNORE ERROR RETURN\r
+       PUSHJ PDP,CLRBUF        ;RELINQUISH THE MONTOR BUFFER\r
+       POP PDP,DSKBUF(DEVDAT)  ;RETRIEVE ORIGINAL ADDRESS\r
+       MOVSI TAC1,BLKSIZ       ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED\r
+       ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER\r
+                               ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN\r
+       JUMPG TAC1,DFDO2B       ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER\r
+                               ; OUTPUT SEQUENCE\r
+DFDO2G:        MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT\r
+       PUSHJ PDP,SAVDDL        ;AJDUST IN CASE OF SAVE OF HIGH SEG\r
+                               ; WHICH HAS MOVED DURING IO WAIT\r
+       MOVEM TAC,DSKBUF(DEVDAT)        ;STORE BACK IN DDB\r
+       MOVE TAC,-1(PDP)        ;WRITE THE BLOCKS\r
+       ADDI TAC,1\r
+       PUSHJ PDP,MQOUT\r
+       JRST DFDO7              ;ERROR\r
+DFDO2B:        POP PDP,ITEM            ;RESTORE COUNT\r
+\r
+;TOSS OUT A SERIES OF CONSECUTIVE POINTERS\r
+\r
+       HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER\r
+DFDO3A:        MOVE AC1,@AC2           ;IS POINTER ALREADY THERE?\r
+       ADDI AC2,1\r
+       TRNE AC1,-1     \r
+       JRST DFDO9              ;YES\r
+\r
+       CAIG AC2,PTRN(DEVDAT)   ;NO, IS THERE A NEXT ONE?\r
+       SETZM @AC2              ;CLEAR NEXT POINTER\r
+       TLO IOS,NMP             ;FLAG END OF POINTERS\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+DFDO3B:        AOS DAT,(PDP)           ;PUT A POINTER IN CORE\r
+       HRRZM DAT,-1(AC2)       ;STORE NEW POINTER IN DDB\r
+       MOVSI DAT,PNTDIF\r
+       ORM DAT,DEVOAD(DEVDAT)  ;SHOW THAT POINTERS IN DDB NOT=DISK\r
+       \r
+       IFG CHKCNT,<            ;GET CHECKSUM\r
+       MOVE TAC,-1(PDP)\r
+       PUSHJ PDP,SAVDDL        ;ADJUST ADR IN CASE OF HIGH SEG SAVE\r
+       PUSHJ PDP,CHKSUM\r
+\r
+       HRLM TAC1,-1(AC2)\r
+       >\r
+\r
+       CAILE AC2,PTRN(DEVDAT)  ;MORE POINTERS?\r
+       JRST DFDO4              ;LAST POINTER IN CORE\r
+\r
+DFDO3C:        MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD\r
+       ADDM TAC1,-1(PDP)\r
+       SOJG ITEM,DFDO3A        ;ANY MORE?\r
+       POP PDP,DAT\r
+       HRRM AC2,DEVACC(DEVDAT)\r
+       SKIPGE (PDP)\r
+       JRST DFDO1              ;NOT FINISHED, GET NEXT SET\r
+       POP PDP,TAC             ;BACK UP PDP\r
+       AOJA UUO,DFDO0          ;GO BAK FOR MORE\r
+\r
+;WRITE POINTERS ONTO DISK\r
+\r
+DFDO4: HRLM ITEM,(PDP)         ;SAVE COUNT OF BLOCKS TO WRITE\r
+       PUSHJ PDP,SETBUF        ;FIND SOME 200 WORD AREA\r
+       PUSHJ PDP,DFO4A         ;WRITE THEM\r
+       PUSHJ PDP,CLRBUF        ;CLEAR THE AREA\r
+       MOVEI AC2,PTR1(DEVDAT)  ;RESET AC2 TO FIRST POINTER\r
+       HLRZ ITEM,(PDP)         ;RESTORE COUNT OF BLOCKS TO WRITE\r
+       JRST DFDO3C\r
+\r
+DFDO6: LSH ITEM,-1     ;TRY FOR 1/2 EARLIER REQUEST\r
+       JUMPN ITEM,DFDO1B       ;CONTINUE IF NON-ZERO\r
+       MOVEI TAC,NUMBIT        ;BITS/SAT BLOCK\r
+       HRRM TAC, @SATPTR       ;MARK SAT ENTRY FULL\r
+       JRST DFDO1A             ;TRY ANOTHER SAT BLOCK\r
+\r
+;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT,\r
+\r
+DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK?\r
+       TRNN TAC,IOIMPM\r
+       JRST DFDO2B             ;NO, TOO BAD.\r
+\r
+       HLRZ TAC,DSKCNT(DEVDAT)\r
+       PUSHJ PDP,SETWL         ;SET WRITE-LOCK BIT IN SAT ENTRY.\r
+       \r
+DFDO8: AOS TAC,-1(PDP)\r
+       PUSHJ PDP,SETFRE\r
+       SOSLE (PDP)\r
+       JRST DFDO8\r
+       SUB PDP,[XWD 2,2]\r
+       JRST DFDO1              ;TRY AGAIN.\r
+\r
+;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK.\r
+\r
+DFDO9: HRLM ITEM,(PDP)         ;SAVE BLOCK COUNT WITH BLOCK#\r
+       PUSH PDP,AC2            ;SAVE POINTER TO RETRIEVAL INFO IN DDB\r
+       HRRZ TAC,-1(AC2)        ;GET OLD BLOCK# FROM DDB\r
+       PUSHJ PDP,SETFRE\r
+       POP PDP,AC2             ;RESTORE POINTER INTO RETRIEVAL INFO\r
+       HLRZ ITEM,(PDP)         ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION\r
+       JRST DFDO3B\r
+\r
+;DUMP MODE INPUT.\r
+\r
+EXTERNAL COMCHK,ADRERR\r
+\r
+DFDMPI:        TLNN DEVDAT,LOOKB       ;LOOKUP YET?\r
+       JRST DFERR2             ;NO, UNDEFINED FILE\r
+       TLNE IOS,IOEND          ;END-FILE?\r
+       JRST DFDI1C             ;YES\r
+       TLZ IOS,IO              ;INPUT STATUS\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,COMCHK        ;CHECK IOWDS\r
+       JRST ADRERR             ;ERROR\r
+DFDI0: SKIPN TAC,@UUO          ;PICK UP NEXT IOWD\r
+       POPJ PDP,               ;NO MORE, LEAVE.\r
+       TLNE TAC,-1             ;LH ZERO?\r
+       JRST DFDI0A             ;NO\r
+       HRR UUO,TAC             ;YES, ANOTHER LIST.\r
+       JRST DFDI0\r
+\r
+DFDI0A:        ADDI TAC,1              ;FROM XWD -L,FIRST-ADDRESS\r
+       PUSH PDP,TAC\r
+\r
+       HLRZ TAC1,TAC           ;GET LENGTH FROM IOWD\r
+       CAIGE TAC1,NBLKSZ       ;LESS THAN 1 BLOCK?\r
+       HRLI TAC,NBLKSZ         ;YES, MUST WRITE AT LEAST 1 FULL BLOCK\r
+       PUSH PDP,TAC            ;IOWD FOR FIRST BLOCK\r
+\r
+       HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER\r
+       CAILE AC2,PTRN(DEVDAT)  ;ANY LEFT IN CORE?\r
+       PUSHJ PDP,DFDI9         ;NO, GET SOME MORE\r
+       SKIPN @AC2              ;IS A POINTER THERE?\r
+       JRST DFDI1B             ;NO. EXIT\r
+       PUSH PDP,@AC2           ;SAVE THE POINTER\r
+\r
+       MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD\r
+       ADDM TAC,-2(PDP)\r
+       AOS DEVACC(DEVDAT)      ;NEXT POINTER\r
+       AOS SETCNT(DEVDAT)      ;NEXT RELATIVE BLOCK\r
+\r
+\r
+DFDI1: SKIPGE -2(PDP)          ;MORE TO GO?\r
+       JRST DFDI2              ;YES\r
+\r
+DFDI1A:        MOVE TAC1,-1(PDP)       ;NO, PROCESS THE FIRST BLOCK\r
+       MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA\r
+       MOVE TAC,(PDP)          ;GET FIRST LOGICAL BLOCK#\r
+       PUSHJ PDP,MQIN\r
+       JFCL                    ;ERRORS IGNORED.\r
+\r
+REPEAT 0, <    ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM.\r
+       IFG CHKCNT,<            ;COMPARE CHECKSUM\r
+       MOVE TAC,-1(PDP)\r
+       PUSHJ PDP,CHKSUM\r
+       HLRZ TAC,(PDP)\r
+       MOVEI AC1,IODTER\r
+       CAME TAC,TAC1\r
+       ORM AC1,DEVIOS(DEVDAT)\r
+       MOVE IOS,DEVIOS(DEVDAT)\r
+       >\r
+>\r
+\r
+       SUB PDP,[XWD 3,3]       ;REMOVE INTERMEDIATE STORAGE FROM PDL\r
+       AOJA UUO,DFDI0          ;GO BACK FOR MORE.\r
+\r
+DFDI1B:        SUB PDP,[XWD 2,2]       ;BACK UP PDP, REMOVE XWD AND IOWD\r
+DFDI1C:        MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
+       ORB IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+;DUMP INPUT CONTINUED,\r
+;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE\r
+\r
+DFDI2: HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER\r
+       CAILE AC2,PTRN(DEVDAT)  ;ANY MORE POINTERS IN CORE?\r
+       PUSHJ PDP,DFDI9         ;NO GET SOME MORE\r
+       SKIPN @AC2              ;YES\r
+       JRST DFDI8              ;END-FILE\r
+       PUSH PDP,AC2            ;SAVE POINTER TO POINTER\r
+       HLRZ TAC,-3(PDP)        ;GET LENGTH OF REMAINING INPUT\r
+       HRRZ TAC1,(AC2)         ;GET BLOCK# FROM DDB\r
+\r
+DFDI3: ADDI TAC,BLKSIZ         ;ANY MORE TO READ?\r
+       TLNE TAC,1\r
+       JRST DFDI5              ;NO\r
+       ADDI AC2,1              \r
+       CAIG AC2,PTRN(DEVDAT)\r
+       SKIPN AC3,@AC2          ;END-FILE\r
+       JRST DFDI4              ;YES\r
+\r
+       CAIN TAC1,-1(AC3)       ;STILL CONSECUTIVE?\r
+       AOJA TAC1,DFDI3         ;YES, LOOP\r
+\r
+DFDI4: MOVE TAC,(PDP)          ;COMPUTE COUNT\r
+       SUB TAC,AC2             ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS\r
+       LSH TAC,BLKP2           ;COMPUTE WORDS\r
+       JRST DFDI6\r
+DFDI5: HLRE TAC,-3(PDP)        ;GET LENGTH OF INPUT\r
+       ADDI AC2,1\r
+DFDI6: HRRZ TAC1,DEVACC(DEVDAT)\r
+       SUBI TAC1,(AC2)\r
+       MOVMS TAC1\r
+       ADDM TAC1,SETCNT(DEVDAT)\r
+       HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER\r
+       MOVS TAC1,@TAC\r
+       HRLM TAC,(PDP)\r
+       HRR TAC1,-3(PDP)\r
+       MOVE TAC,(PDP)          ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT\r
+       MOVE TAC,(TAC)          ;GET FIRST LOGICAL BLOCK#\r
+       MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD\r
+       PUSHJ PDP,MQIN          ;REQUEST THE INPUT\r
+       JFCL                    ;ERRORS IGNORED\r
+\r
+;DUMP INPUT CONTINUED.\r
+;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD\r
+;AND LOOP.\r
+\r
+       POP PDP,AC2\r
+       IFLE CHKCNT,<           ;NO CHECKSUMMING\r
+       HLRS AC2\r
+       SETCA AC2,\r
+       AOBJN AC2,.+1\r
+       ADDM AC2,-2(PDP)\r
+       >\r
+\r
+       IFG CHKCNT,<            ;CHECK CHECKSUMS\r
+       HLRE TAC1,AC2           ;CHANGE WORD COUNT TO BLOCKS\r
+       MOVMS TAC1\r
+       ADDI TAC1,BLKSIZ-1\r
+       LSH TAC1,-BLKP2\r
+       MOVNS TAC1\r
+       HRL AC2,TAC1\r
+DFDI7: MOVE TAC,-2(PDP)\r
+       PUSHJ PDP,CHKSUM\r
+       HLRZ TAC,(AC2)\r
+       MOVEI AC3,IODTER\r
+       CAME TAC,TAC1\r
+       PUSHJ PDP,CKREC2\r
+       MOVE AC3,[XWD BLKSIZ,BLKSIZ]\r
+       ADDM AC3,-(PDP)\r
+       AOBJN AC2,DFDI7\r
+       >\r
+\r
+       JRST DFDI1              ;SEE IF MORE INPUT REQUIRED\r
+\r
+DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
+       ORB IOS,DEVIOS(DEVDAT)\r
+       JRST DFDI1A\r
+\r
+DFDI9: TLNE IOS,NMP\r
+       JRST DFDI10             ;NO\r
+       PUSHJ PDP,SETBUF        ;GET BUFFER\r
+       PUSHJ PDP,GETPTR        ;READ AND COPY POINTERS INTO DDB\r
+       PUSHJ PDP,CLRBUF        ;CLEAR BUFFER\r
+       HRRZ AC2,DEVACC(DEVDAT)\r
+       POPJ PDP,\r
+\r
+DFDI10:        MOVEI AC2,PTR1(DEVDAT)  ;NO MORE POINTERS ON DISK\r
+       HRRM AC2,DEVACC(DEVDAT)\r
+       SETZM @AC2\r
+       POPJ PDP,\r
+\r
+SUBTTL USETO/USETI\r
+;SETD AND SETI UUOS\r
+\r
+EXTERNAL WAIT1\r
+\r
+DFSET: PUSHJ PDP,.+2\r
+       POPJ PDP,\r
+       TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN?\r
+       TRNN UUO,-1             ;NON-ZERO BLOCK NUMBER ARGUMENT?\r
+       JRST DFERR2             ;NO, ERROR IN EITHER CASE\r
+       PUSHJ PDP,WAIT1         ;WAIT FOR I/O TO COMPLETE\r
+       PUSHJ PDP,SETBF6        ;SET UP A BUFFER\r
+       MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+\r
+       HRRZ TAC1,DEVACC(DEVDAT)\r
+       HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH?\r
+       CAIL TAC,(UUO)          ;(I.E. SHOULD WE GO FORWARD?)\r
+       JRST DFSET6             ;NO, GO BACKWARD\r
+\r
+       SUBI TAC1,PTRN(DEVDAT)  ;YES, DESIRED POINTER IN CORE?\r
+       SUB TAC,TAC1\r
+       CAIL TAC,(UUO)\r
+       JRST DFSET3             ;YES\r
+\r
+       HRRZ TAC1,DEVCNT(DEVDAT)\r
+       ADDI TAC1,BLKSIZ-1\r
+       LSH TAC1,-BLKP2\r
+       CAMGE TAC1,TAC          ;ANY MORE POINTERS ON DISK?\r
+       JRST DFSETX             ;NO\r
+       HRRM TAC,SETCNT(DEVDAT)\r
+       MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME\r
+       TLNN TAC,PNTDIF         ;AS ON DISC?\r
+       JRST DFSET1             ;YES\r
+       TLO IOS,NMP             ;SET "DO NOT READ NEXT POINTERS"\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,DFO4A         ;NO, WRITE THEM OUT\r
+       TLZA IOS,NMP            ;NO NEED TO READ\r
+\r
+DFSET1:        PUSHJ PDP,RRI           ;READ THEM IN\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,SET176        ;IS THIS THE FIRST POINTER BLOCK?\r
+       MOVE TAC,@TAC1\r
+       TRNN TAC,-1\r
+       JRST DFSETB             ;YES\r
+       HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE.\r
+       SUBI TAC,1\r
+       MOVNS TAC\r
+       ADDM TAC,SETCNT(DEVDAT)\r
+       JRST DFSETC\r
+\r
+;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON\r
+;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE\r
+;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED\r
+;POINTER.\r
+\r
+DFSET3:\r
+\r
+DFSETX:        HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH?\r
+       ADDI TAC,BLKSIZ-1       ;CONVERT TO BLOCKS\r
+       LSH TAC,-BLKP2\r
+       CAIL TAC,(UUO)\r
+       JRST DFSET5             ;NO, ALL OK.\r
+       MOVSI IOS,IOEND         ;YES, END-FILE.\r
+       IORB IOS,DEVIOS(DEVDAT)\r
+       AOSA TAC\r
+DFSET5:        HRRZ TAC,UUO            ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE\r
+       HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC\r
+       SUBM TAC,TAC1\r
+       ADDM TAC1,DEVACC(DEVDAT)\r
+       HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT\r
+       JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE.\r
+\r
+DFSET6:        SUBI TAC1,PTR1(DEVDAT)\r
+       SUB TAC,TAC1\r
+       CAIG TAC,(UUO)\r
+       JRST DFSET5             ;POINTER IS IN CORE\r
+\r
+;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING.\r
+\r
+       MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC?\r
+       TLNE TAC,PNTDIF\r
+       PUSHJ PDP,DFO4A         ;NO, WRITE THEM OUT\r
+       HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB\r
+       PUSHJ PDP,SETPTR        ;READ FIRST RIB\r
+DFSETB:        MOVEI TAC,1             ;RESET SETCNT\r
+       HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1\r
+\r
+DFSETC:        HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER\r
+       PUSHJ PDP,SET176        ;IS THIS THE FIRST POINTER BLOCK?\r
+       MOVE DAT,@TAC1\r
+       TRNN DAT,-1\r
+       ADDI TAC,DIRSIZ         ;YES, SKIP OVER 4 WORDS\r
+       HLRZ DAT,@TAC1          ;BLOCK FULL?\r
+       SUBI TAC1,1\r
+       JUMPN DAT,DFSETD        ;YES\r
+       SKIPN @TAC1             ;NO. MOVE TAC1 TO LAST POINTER\r
+       SOJA TAC1,.-1\r
+\r
+DFSETD:        HRRZ AC1,SETCNT(DEVDAT)\r
+       SUBI AC1,(TAC)          ;IS DESIRED POINTER HERE?\r
+       HRRZ AC2,TAC1\r
+       ADD AC2,AC1\r
+       CAIL AC2,(UUO)\r
+\r
+       JRST DFSET7             ;YES\r
+       ADDI AC2,1              ;NO. GET NEXT BLOCK\r
+       HRRM AC2,SETCNT(DEVDAT)\r
+       JUMPE DAT,DFSET8        ;ANY MORE POINTER BLOCKS?\r
+       MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK.\r
+       PUSHJ PDP,RRI\r
+       JRST DFSETC\r
+\r
+;THE BLOCK CONTAINING THE POINTER IS FOUND.\r
+DFSET7:        HRRZ TAC,UUO            ;RESET RIGHT HALF OF DEVBLK\r
+       SUB TAC,AC1\r
+       HRRZ TAC1,DSKBUF(DEVDAT)\r
+       SUB TAC,TAC1\r
+       HRRM TAC,DEVBLK(DEVDAT)\r
+\r
+       HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT\r
+       PUSHJ PDP,DFIN4         ;GET POINTERS\r
+       JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;RAN OUT OF POINTERS\r
+\r
+DFSET8:        ADDI TAC1,1\r
+       HRRZ TAC,DSKBUF(DEVDAT)\r
+       SUB TAC1,TAC\r
+       HRRM TAC1,DEVBLK(DEVDAT)\r
+       TLO IOS,NMP!IOEND       ;SET END\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,DFO6A         ;CLEAR POINTERS\r
+       JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+SUBTTL INPUT/OUPUT UUO'S.  RETRIEVAL POINTER PROCESSING\r
+;INPUT UUO\r
+;* INDICATES INTERRUPT LEVEL\r
+\r
+EXTERNAL ADVBFF\r
+\r
+DFIN:  TLNN DEVDAT,LOOKB       ;FILE OPEN?\r
+       JRST DFERR2             ;NO, UNDEFINED FILE\r
+       TLZ IOS,IO              ;SET INPUT INDICATOR\r
+\r
+DFIN1: TLNE IOS,LIR            ;*ANY MORE INPUT?\r
+       POPJ PDP,               ;*NO, LEAVE\r
+\r
+       HRRZ    TAC1,DEVACC(DEVDAT) ;*\r
+       CAILE   TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY?\r
+       JRST    DFIN2           ;*YES\r
+       SKIPN   @TAC1           ;*NO--END OF FILE?\r
+       JRST    DFIN1E          ;*YES\r
+\r
+       CAIN TAC1,PTRN(DEVDAT)  ;*NO--IS THIS THE LAST POINTER ?\r
+       JRST DFIN1B             ;*YES\r
+\r
+DFIN1D:        SKIPN 1(TAC1)           ;*NO\r
+       TLO IOS,LIR             ;*SET LAST INPUT FLAG\r
+DFIN1A:        MOVEM IOS,DEVIOS(DEVDAT) ;*\r
+       JRST QIN                ;*\r
+\r
+DFIN1E:        TLO     IOS,LIR         ;*EMPTY FILE\r
+       MOVEM   IOS,DEVIOS(DEVDAT) ;*\r
+       POPJ    PDP,            ;*\r
+\r
+DFIN1B:        TLNE IOS,NMP            ;*ANY MORE POINTERS ON DISK?\r
+       TLO IOS,LIR             ;*NO, THIS IS THE LAST READ\r
+       JRST DFIN1A             ;*\r
+\r
+DFIN2: MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,SETBFI        ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS\r
+       PUSHJ PDP,GETPTR        ;READ RIB COPY POINTERS INTO DDB\r
+       HRRZ TAC1,DEVACC(DEVDAT)\r
+       JRST DFIN1D\r
+\r
+;NEED NEW POINTER FROM DISK\r
+\r
+GETPTR:        MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER?\r
+       TLNE AC2,PNTDIF\r
+       JRST DFO4A              ;YES, WRITE THEN READ AND RETURN\r
+       PUSHJ PDP,RRI           ;NO, READ BLOCK\r
+\r
+DFIN4: MOVEI AC2,PTR1(DEVDAT)  ;RESET DEVACC\r
+       HRRM AC2,DEVACC(DEVDAT)\r
+       MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO\r
+       MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET\r
+GTPTR1:        PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD OF RIB\r
+       MOVE IOS,DEVIOS(DEVDAT) \r
+       HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET\r
+       ADD AC3,TAC1            ;AC3 POINTS TO NEXT POINTER WITHIN RIB\r
+       ADDI TAC1,BLKSIZ-2      ;TAC1 POINTS TO WORD 127\r
+\r
+       MOVEI AC1,PTRN(DEVDAT)  ;DDB END CHECK\r
+DFIN5: CAML AC3,TAC1           ;POINTER BLOCK EMPTY?\r
+\r
+       JRST DFIN7              ;YES, GET SOME MORE\r
+\r
+       MOVE TAC,@AC3           ;GET RETRIEVAL POINTER\r
+       MOVEM TAC,@AC2          ;STASH IN DDB\r
+       ADDI AC3,1\r
+       JUMPE TAC,DFIN8A        ;0 MEANS NO MORE RETRIEVAL POINTERS\r
+       CAIE AC1,(AC2)          ;DDB FULL?\r
+       AOJA AC2,DFIN5          ;NO, GET ANOTHER\r
+\r
+       CAML AC3,TAC1           ;YES, ANY MORE FOR NEXT TIME?\r
+       HLLZS @AC3              ;END OF RIB REACHED.  ACE(LH) IS LINK NEXT RIB\r
+       SKIPN @AC3              ;NEXT POINTER=0 OR LINK=0.\r
+       TLO IOS,NMP             ;SET "NO MORE POINTER"\r
+\r
+DFIN6A:        MOVEM IOS,DEVIOS(DEVDAT)\r
+       MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB\r
+       SUBI AC3,(TAC1)         ;COMPUTE NEW INDEX\r
+       HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET\r
+       MOVSI AC1,PNTDIF        ;CLEAR "POINTER DIFFER"\r
+       ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA.\r
+       POPJ PDP,\r
+\r
+DFIN7: HLRZ TAC,@TAC1          ;RIB LINK TO TAC RH\r
+       JUMPE TAC,DFIN8         ;DONE IF LINK=0\r
+       MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET\r
+       PUSH PDP,AC2\r
+       PUSHJ PDP,RRI           ;READ THE RIB\r
+       POP PDP,AC2\r
+       JRST GTPTR1\r
+DFIN8: MOVEM TAC,@AC2          ;0 WOTRD IS DOB MARKS END\r
+DFIN8A:        TLO IOS,NMP             ;NO MORE POINTERS ON DISK\r
+       JRST DFIN6A\r
+\r
+;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK\r
+\r
+DFINX: PUSHJ PDP,ADVBFF        ;*ANY MORE EMPTY BUFFERS?\r
+       POPJ PDP,               ;*\r
+\r
+       HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY?\r
+       CAILE TAC1,PTRN(DEVDAT) ;*\r
+       POPJ PDP,               ;*\r
+\r
+       JRST DFIN1              ;*NO,FILL NEXT ONE\r
+\r
+;OUTPUT UUO\r
+\r
+EXTERNAL WSYNC,ADVBFE\r
+\r
+DFOUT: TLNN DEVDAT,ENTRB       ;FILE OPEN?\r
+       JRST DFERR2             ;NO, UNDEFINED FILE\r
+       TLO IOS,IO              ;SET OUTPUT INDICATION\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+\r
+DFOUT1:        HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC\r
+\r
+       IFG CHKCNT,<\r
+       HRRZ TAC,DEVOAD(DEVDAT) ;*\r
+       ADD TAC,[XWD NBLKSZ,2]  ;*\r
+       PUSHJ PDP,CHKSUM        ;*\r
+       HRLM TAC1,@DAT          ;*\r
+       MOVSI TAC1,PNTDIF       ;*\r
+       ORM TAC1,DEVOAD(DEVDAT) ;*\r
+       >\r
+\r
+       HRRZ TAC,@DAT           ;*ALREADY HAVE A POINTER?\r
+       JUMPN TAC,DFOT3A        ;*YES IF JUMP\r
+       CAIE DAT,PTRN(DEVDAT)   ;*NO, CLEAR NEXT ONE?\r
+       SETZM 1(DAT)            ;*YES\r
+       TLO IOS,NMP             ;*SET "NO MORE POINTERS"\r
+       MOVEM IOS,DEVIOS(DEVDAT) ;*\r
+       MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER\r
+       ADDI TAC1,1             ;*NOW TO WORD COUNT\r
+       HRRZ TAC1,@TAC1         ;*RETRIEVE WORD COUNT\r
+       PUSHJ PDP,UPDEVC        ;*UPDATE DEVCNT\r
+       PUSH PDP,DAT            ;*\r
+       PUSHJ PDP,DFGETF        ;*GET A FREE BLOCK\r
+       POP PDP,DAT             ;*\r
+\r
+       IFG CHKCNT,<\r
+               HRRM TAC,@DAT>\r
+       IFLE CHKCNT,<\r
+               MOVSI TAC1,PNTDIF\r
+               ORM TAC1,DEVOAD(DEVDAT)\r
+               MOVEM TAC,@DAT>\r
+\r
+DFOT3A:        CAIE DAT,PRTN(DEVDAT)   ;*LIST FULL?\r
+       JRST QOUT               ;*NO, WRITE AND LEAVE\r
+\r
+;OUTPUT UUO CONTINUED.\r
+;WRITE OUT POINTER LIST.\r
+\r
+       PUSHJ PDP,SETBFO        ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO\r
+       PUSHJ PDP,QOUT          ;PUT REQUEST IN QUEUE\r
+       PUSHJ PDP,WSYNC         ;WAIT TIL DATA WRITTEN\r
+\r
+DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS\r
+       MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB\r
+\r
+       MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN?\r
+       TLZE TAC,VRGPTR\r
+       PUSHJ PDP,DFO7A         ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION.\r
+       PUSHJ PDP,RRI           ;RED RETRIEVAL BLOCK\r
+       MOVEI AC3,PTR1(DEVDAT)\r
+\r
+DFO4B: PUSHJ PDP,SET000        ;TAC1 POINTS TO RIB\r
+       HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB\r
+       ADD AC2,TAC1            ;ABSOLUTE POINTER INTO RIB\r
+       ADDI TAC1,BLKSIZ-2      ;END OF RIB DATA\r
+DFOUT5:        MOVE AC1,@AC3           ;GET RETRIEVAL POINTER FROM DDB\r
+       JUMPE AC1,DFOUT6        ;0 SIGNALS END\r
+       CAML AC2,TAC1           ;BLOCK FULL?\r
+       JRST DFOUT7             ;YES, WRITE IT OUT\r
+       MOVEM AC1,@AC2          ;STASH POINTER IN RIB\r
+       ADDI AC2,1\r
+       CAIE AC3,PTRN(DEVDAT)   ;DONE?\r
+       AOJA AC3,DFOUT5\r
+\r
+DFOUT6:        MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB\r
+       SUBI AC2,(TAC1)         ;FROM INDEX\r
+       HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS\r
+       MOVSI AC2,PNTDIF        ;CLEAR "POINTERS DIFFER"\r
+       ANDCAM AC2,DEVOAD(DEVDAT)\r
+       PUSHJ PDP,WRI           ;WRITE THE BLOCK\r
+DFO6A: MOVEI TAC,PTR1(DEVDAT)\r
+       HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB\r
+       SETZM @TAC              ;CLEAR FIRST POINTER\r
+       TLNN IOS,NMP            ;MORE POINTERS?\r
+       JRST DFIN4              ;YES, BRING THEM IN AND LEAVE\r
+       MOVE TAC,DEVBLK(DEVDAT)\r
+       MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET\r
+       POPJ PDP,\r
+\r
+DFO7A: MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT\r
+       PUSHJ PDP,SET177        ;SET TAC1 TO WORD 128\r
+       SETZM @TAC1             ;CLEAR BLOCK# WORD\r
+       AOS (PDP)               ;ALWAYS SKIP RETURN\r
+       PUSH PDP,AC3            ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3\r
+       JRST DFOUT8\r
+\r
+DFOUT7:        PUSHJ PDP,NEWRIB\r
+       JRST DFO4B\r
+\r
+NEWRIB:        PUSH PDP,AC3            ;CREATE A NEW RETRIEVAL BLOCK\r
+       PUSHJ PDP,SET176        ;SET TAC1 TO LINK WORD\r
+       HLLZ TAC,@TAC1          ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT?\r
+       JUMPN TAC,DFOUT9        ;YES, WRITE CURRENT ONE AND READ NEXT ONE\r
+       PUSHJ PDP,DFGETF        ;NO, GET A BLOCK FOR POINTER IN TAC\r
+       HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB\r
+       MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK\r
+       PUSHJ PDP,SET176        ;SET TAC1 TO WORD 127 AGAIN\r
+       HRLM TAC,@TAC1          ;LH LINKS TO NEW BLOCK\r
+       \r
+       MOVE TAC,AC3            ;BLOCK# OF CURRENT BLOCK\r
+       PUSHJ PDP,WRIA          ;WRITE THE BLOCK OUT\r
+\r
+DFOUT8:        MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB\r
+       NOSCHEDULE\r
+       TLNN IOS,UBFS           ;DUMP MODE?\r
+       ADD TAC1,PROG           ;NO, RELOCATE\r
+       MOVEI TAC,1(TAC1)       ;DESTINATION\r
+       HRL TAC,TAC1            ;SOURCE\r
+       SETZM (TAC1)\r
+       BLT TAC,BLKSIZ-3(TAC1)  ;ZERO OUT FIRST 126 WORDS\r
+       MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB\r
+       HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT\r
+       SETZM BLKSIZ-1(TAC1)    ;CLEAR WORD 128.\r
+       SCHEDULE\r
+DFO8A: POP PDP,AC3\r
+       POPJ PDP,\r
+\r
+DFOUT9:        EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC\r
+       HLRZS TAC               ;BLOCK# IN RH\r
+       PUSHJ PDP,WRIA          ;WRITE THIS BLOCK OF POINTERS OUT\r
+       PUSHJ PDP,RRI           ;READ NEXT BLOCK OF POINTERS IN\r
+       JRST DFO8A\r
+\r
+;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER\r
+\r
+       EXTERN MJOBN\r
+\r
+DFOUTX:        PUSHJ PDP,ADVBFE        ;*ANY MORE TO DO?\r
+       POPJ PDP,               ;*\r
+       SKIPL   DAREQ           ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT\r
+       POPJ    PDP,            ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED.\r
+       HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS?\r
+       CAIL TAC1,PTRN(DEVDAT)  ;*\r
+       POPJ PDP,               ;*\r
+       HRRZ TAC,@SATPTR        ;*CURRENT SAT BLOCK FULL?\r
+       TRNN TAC,WLBIT          ;*OR WRITE-LOCKED?\r
+       CAIL TAC,NUMBIT+MJOBN   ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS\r
+                               ; SO THAT EACH JOB CAN HAVE ONE MORE\r
+       POPJ PDP,               ;*\r
+       PUSH PDP,AC1            ;*\r
+       PUSH PDP,AC2            ;*\r
+       PUSHJ PDP,DFOUT1        ;*\r
+       POP PDP,AC2             ;*\r
+       POP PDP,AC1             ;*\r
+       POPJ PDP,               ;*\r
+\r
+SUBTTL READ/WRITE RETRIEVAL POINTERS\r
+;INPUT RETRIEVAL BLOCK.\r
+\r
+RRIB:  SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK\r
+RRI:   HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK\r
+RRIA:  PUSHJ PDP,MQIN          ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
+       JRST RERA               ;ERRORS, YOU LOSE\r
+       PUSHJ PDP,SET177        ;CHECK RH OF WORD 128\r
+       HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED\r
+       MOVE AC1,@TAC1          ;GET BLOCK# STORED IN RIB\r
+       CAIE TAC,(AC1)          ;SAME?\r
+       JRST RERA               ;IT WAS WRONG, YOU LOSE.\r
+       POPJ PDP,               ;EVERYTHING OK.\r
+\r
+;OUTPUT A RETRIEVAL BLOCK.\r
+\r
+WRIB:  SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK\r
+WRI:   HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK\r
+WRIA:  PUSHJ PDP,SET177        ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
+       HRRM TAC,@TAC1          ;STORE THIS BLOCK# IN WORD 128\r
+       IFN FTRCHK,<\r
+       SKIPN TAC               ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION\r
+                               ; IN BLOCK NR 0 IS AN ERROR\r
+       HALT WERA               ;CONTINUE WILL POINT ERROR MESSAGE\r
+>\r
+       PUSHJ PDP,MQOUT         ;WRITE IT,\r
+       JRST WERA               ;ERRORS\r
+       POPJ PDP,               ;NO, RETURN.\r
+\r
+SET177:        HRRZ TAC,DSKBUF(DEVDAT)\r
+       ADDI TAC1,BLKSIZ-1\r
+S177A: TLNN IOS,UBFS\r
+       TLO TAC1,PROG\r
+       POPJ PDP,\r
+\r
+SET176:        HRRZ TAC1,DSKBUF(DEVDAT)\r
+       ADDI TAC1,BLKSIZ-2\r
+       JRST S177A\r
+\r
+SET000:        HRRZ TAC1,DSKBUF(DEVDAT)\r
+       JRST S177A\r
+\r
+\r
+;PUT POINTER INFO IN DDB\r
+;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS.\r
+\r
+SETPTR:        HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX\r
+       ANDCM IOS,[XWD IOEND+NMP,IODEND]\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,SETBUF        ;AQUIRE BUFFERE IN MONITOR STORAGE\r
+       PUSHJ PDP,RRI           ;GET RETRIEVAL BLOCK\r
+\r
+       PUSHJ PDP,DFIN4         ;COPY POINTERS TO DDB\r
+       MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS\r
+       HRRM AC3,DEVACC(DEVDAT)\r
+       POPJ PDP,\r
+\r
+;RECLAIM STORAGE ON DISK.\r
+;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE\r
+;     TO BE DELETED.\r
+\r
+RECLAM:        PUSHJ PDP,SETBUF        ;FIND SPACE IN USER AREA\r
+       \r
+       PUSHJ PDP,RECLM5        ;GET FIRST POINTER BLOCK\r
+       ADDI DAT,DIRSIZ         ;SKIP OVER FIRST WORDS.\r
+RECLM2:        CAML DAT,TAC1           ;MORE POINTERS IN BLOCK?\r
+       PUSHJ PDP,RECLM4        ;NO. GET MORE\r
+       HRRZ TAC,@DAT           ;FREE A DATA BLOCK\r
+       JUMPE TAC,CLRBUF        ;EXIT  WHEN A ZERO POINTER IS ENCOUNTERED\r
+       PUSH PDP,TAC1\r
+       PUSHJ PDP,SETFRE        ;FREE UP SPECIFIED BLOCK\r
+       POP PDP,TAC1\r
+       AOJA DAT,RECLM2         ;GO BACK FOR MORE\r
+\r
+RECLM4:        HLRZ TAC,@TAC1          ;PICK UP POINTER TO NEXT BLOCK\r
+       JUMPE TAC,RECLM6        ;NO MORE, GO HOME.\r
+RECLM5:        PUSHJ PDP,RRIA          ;READ IN A R.I. BLOCK.\r
+\r
+       HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK\r
+       PUSHJ PDP,SETFRE\r
+\r
+       PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD\r
+       MOVE DAT,TAC1\r
+       ADDI TAC,BLKSIZ-2       ;SET TAC1 TO WORD 127\r
+       POPJ PDP,\r
+\r
+RECLM6:        POP PDP,TAC\r
+       JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;RELEASE UUO.\r
+\r
+EXTERNAL DAREQ,DAAVAL\r
+\r
+DFREL: TLO     DEVDAT,DSKRLB   ;MARK RELEASE (VIA RESET UUO) IN PROGRESS.\r
+       PUSHJ PDP,DFCLSI        ;CLOSE INPUT FIRST\r
+       PUSHJ PDP,DFCLSO        ;THEN CLOSE OUPUT\r
+                               ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON\r
+       SKIPN SATCHG            ;HAS SAT BLOCK BEEN MODIFIED?\r
+       JRST DFREL1             ;NO, SUPPRESS WRITING\r
+       PUSHJ   PDP,UPDA        ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK\r
+       PUSH PDP,DSKBUF(DEVDAT)\r
+       PUSHJ PDP,SATWRT                ;WRITE CURRENT SAT BLOCK\r
+       POP PDP,DSKBUF(DEVDAT)\r
+       PUSHJ   PDP,DOWNDA      ;RESET DAREQ INTERLOCK\r
+DFREL1:        TLZ     DEVDAT,DSKRLB   ;CLEAR RELEASE MARKER.\r
+       JRST WAIT1\r
+\r
+SUBTTL DISK SPACE ALLOCATION\r
+;DFGETF: GET A FREE DISK BLOCK\r
+;CALL:  PUSHJ PDP,DFGETF\r
+;       ... RETURNS WITH TAC:=LOGICAL BLOCK#\r
+;       MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL\r
+\r
+       EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN\r
+       INTERNAL DFGETF\r
+\r
+DFGETF:        PUSHJ PDP,UPDA          ;SET DISK ALLOCATION INTERLOCK\r
+DFGTF1:        PUSHJ PDP,SATGET        ;FOCUS ON A NON-FULL SAT BLOCK\r
+       HRRZ AC1,SATPTR         ;POINT TO 3 WORD SAT ENTRY\r
+       MOVE AC2,SATBK2         ;XWD -L, POINTER TO SAT ENTRY\r
+       MOVEI ITEM,1            ;REQUEST 1 BLOCK\r
+       PUSHJ PDP,GETBIT        ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK)\r
+       JRST DFGTF2             ;FULL AFTER ALL\r
+       SETOM SATCHG            ;SHOW SAT BLOCK IN CORE NOT = DISK COPY\r
+       AOS TAC,@SATPTR         ;COUNT ANOTHER BLOCK USED\r
+       HLRZS TAC               ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK\r
+       ADDI TAC, -1(TAC1)      ;FORM LOGICAL BLOCK#\r
+DOWNDA:        SOSL DAREQ              ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK\r
+                               ; THUS MAKING NON-SHARABLE SECTIONS OF CODE\r
+                               ; AVAILABLE TOTHE NEXT USER IN THE QUEUE\r
+       SETOM DAAVAL\r
+       TLZ IOS,DAFLG\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+DFGTF2:        MOVEI TAC,NUMBIT        ;BITS/SAT BLOCK\r
+       HRRM TAC,@SATPTR        ;MARK SAT ENTRY FULL\r
+       JRST DFGTF1\r
+\r
+;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ)\r
+;     - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS\r
+UPDA:  AOSE DAREQ              ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION\r
+       PUSHJ PDP,DAWAIT        ;WAIT UNTIL JOB REACHES TOP OF QUEUE\r
+       TLO IOS,DAFLG\r
+       MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK\r
+       POPJ PDP,\r
+\r
+;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT.\r
+;        CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER\r
+;        IS LOGGING IN OR USING A NON-SHARABLE RESOURCE.\r
+\r
+EXTERNAL JBTSTS,HNGSTP\r
+\r
+SATGET:        SETZ AC1,               ;CLEAR COUNT\r
+       HRRZ TAC,@SATPTR        ;BLOCKS USED IN CURRENT SAT BLOCK\r
+       TRNN TAC,WLBIT          ;WRITE LOCKED?\r
+       PUSHJ PDP,SATCNT        ;NO. COUNT # FREE\r
+       CAIL AC1,JOBN           ;IS THER ENOUGH SPACE?\r
+       POPJ PDP,               ;YES - USE IT.\r
+       SETZ AC1,               ;CLEAR COUNT\r
+       MOVEI TAC1,SATENT       ;START WITH FIRST SAT ENTRY\r
+SATGT1:        HRRZ TAC, 0(TAC1)       ;GET WLBIT + BLOCKS USED\r
+       TRNN TAC,WLBIT          ;WRITE LOCKED?\r
+       PUSHJ PDP,SATCNT        ;NO. COUNT # FREE\r
+       ADDI TAC1,SENTSZ        ;NEXT SAT ENTRY\r
+       CAIL AC1,JOBN           ;ENOUGH SPACE ACCUMULATED?\r
+\r
+       JRST SATGT2             ;YES - READ A SAT BLOCK\r
+       CAIGE TAC1,SATTOP       ;END OF ENTRIES?\r
+       JRST SATGT1             ;NO. CONTINUE\r
+       JUMPE AC1,DSKFUL        ;IF NONE FOUND DISK IS REALLY FULL\r
+\r
+;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE.\r
+;GIVE THEM OUT ONLY IN HARDSHIP CASES\r
+       LDB TAC,PJOBN\r
+       MOVE TAC,JBTSTS(TAC)\r
+       TLNN TAC,JACCT          ;IS THIS USER LOGGING IN?\r
+       TLNE IOS,UBFS+AUFLG     ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD?\r
+       JRST SATGT2             ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY.\r
+DSKFUL:        TLNE IOS,UBFS+AUFLG\r
+       JRST DFERR1             ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD\r
+\r
+       PUSHJ PDP,DOWNDA        ;RESET ALLOCATION INTERLOCK\r
+       PUSHJ PDP,HNGSTP        ;PRINT "DSK OK?"\r
+       PUSHJ PDP,UPDA          ;IF USER TYPE "CONT" WE TRY AGAIN\r
+       JRST SATGET\r
+\r
+SATGT2:        MOVE TAC1,SATPIK        ;POINT TO ENTRY OF NON-FULL SAT BLOCK\r
+       JRST SATRD              ;READ IN SAT BLOCK\r
+\r
+SATCNT:        CAIE TAC,NUMBIT         ;IS ENTRY FULL?\r
+       MOVEM TAC1,SATPIK       ;NO. SAVE POINTER TO A NON-FULL ENTRY\r
+       ADDI AC1,NUMBIT         ;MAXIMUM NUMBER\r
+       SUB AC1,TAC             ;LESS NUMBER USED\r
+       POPJ PDP,\r
+\r
+;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE\r
+;CALL       TAC:=LOGICAL BLOCK L\r
+;           PUSHJ PDP,SETFRE\r
+;           ... RETURN\r
+\r
+       INTERNAL SETFRE,FTRCHK\r
+\r
+SETFRE:        PUSHJ PDP,UPDA          ;SET DISK ALLOCATION INTERLOCK\r
+IFN FTRCHK,<\r
+       EXTERNAL LBHIGH\r
+\r
+       SKIPE TAC               ;BLOCK 0 SHOULD NEVER BE CLEARED\r
+       CAMLE TAC,LBHIGH        ;BLOCK # TOO LARGE\r
+       HALT DOWNDA             ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ.\r
+>\r
+       HLRZ AC1,@SATPTR        ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK\r
+       CAML TAC,AC1            ;IS L LESS THAN FIRST BLOCK REPRESENTED?\r
+       CAIL TAC,NUMBLK(AC1)    ;IS L LESS THAN LAST BLOCK REPRESENTED\r
+       SKIPA                   ;OUTSIDE RANGE\r
+       JRST SETFR2             ;IN RANGE\r
+       MOVEI TAC1,SATENT        ;INITIALIZE POINTER\r
+       SKIPA\r
+SETFR1:        ADDI TAC1,SENTSZ        ;INCREMENT POINTER\r
+       HLRZ AC1,@TAC1          ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK\r
+       CAML TAC,AC1            ;IS L LESS THEN FIRST BLOCK?\r
+       CAIL TAC,NUMBLK(AC1)    ;IS L LESS THEN LAST BLOCK?\r
+       JRST SETFR1             ;OUT-OF-RANGE, TRY NEXT\r
+       PUSH PDP,TAC            ;SAVE BLOCK#\r
+       PUSHJ PDP,SATRD         ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1\r
+       POP PDP,TAC             ;RESTORE BLOCK#\r
+       HLRZ AC1,@SATPTR\r
+SETFR2:        SUB TAC,AC1             ;FROM BIT# (IN RANGE 0 TO NUMBLK-1)\r
+       HRRZ AC1,SATPTR         ;POINT TO 3 WORD ENTRY\r
+       MOVE AC2,SATBK2         ;XWD -L, POINTER TO SAT BLOCK\r
+       MOVEI ITEM,1            ;RETURN 1 BIT\r
+       PUSHJ PDP,CLRBIT\r
+       SOS @SATPTR             ;DECREMENT BLOCKS USED\r
+       SETOM SATCHG            ;SAT BLOCK IN CORE NOT = DISK COPY\r
+       JRST DOWNDA             ;REMOVE ALLOCATION INTERLOCK AND EXIT.\r
+\r
+;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID\r
+; A PDL OVRFLW PROBLEM.  IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY\r
+; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK.\r
+\r
+SATRD: MOVEM TAC1,SATTMP       ;SAVE POINTER TO DESIRED SAT ENTRY.\r
+       MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB\r
+       MOVEM TAC1,SATTEM\r
+       SKIPE SATCHG            ;HAS COPY IN CORE BEEN MODIFIED?\r
+       PUSHJ PDP,SATWRT        ;YES, WRITE IT.\r
+       MOVE TAC,SATTMP         ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN.\r
+       MOVEM TAC,SATPTR\r
+       PUSHJ PDP,SATBLK        ;COMPUTE BLOCK#, IOWD\r
+       TLO IOS,NORELB          ;NO RELOCATION\r
+       PUSHJ PDP,MQIN          ;READ THE BLOCK\r
+       JRST RERA               ;ERROR\r
+       MOVE TAC1,SATTEM        ;RESTORE SAVED IOWD TO DDB\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       JRST SATW1\r
+\r
+SATWRT:        TLO IOS,NORELB          ;NO RELOCATION\r
+       PUSHJ PDP,SATBLK        ;COMPUTE BLOCK# IOWD\r
+       PUSHJ PDP,MQOUT         ;WRITE BLOCK\r
+       JRST WERA               ;ERROR\r
+       SETZM SATCHG            ;SHOW COPY IN CORE = BLOCK ON DISK\r
+SATW1: MOVSI IOS,NORELB        ;RESET BIT\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK\r
+\r
+SATBLK:        MOVE TAC,SATPTR\r
+       SUBI TAC,SATENT\r
+       IDIVI TAC,SENTSZ\r
+       ADD TAC,SATXWD\r
+       MOVE TAC1,SATBK2\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       POPJ PDP,\r
+\r
+SUBTTL "FREE" CORE ALLOCATION\r
+;CLEAR OUT DDB AT RELEASE TIME\r
+\r
+INTERNAL CLRDDB\r
+\r
+CLRDDB:        MOVEI TAC,DSKDDB        ;POINT TO PROTOTYPE DDB\r
+CLRDB1:        MOVE TAC1,TAC           ;COPY LINK TO TAC1\r
+       HLRZ TAC,DEVSER(TAC1)   ;GET LINK TO NEXT DDB\r
+       JUMPE  TAC,CPOPJ        ;0 MEANS END\r
+       CAIE TAC,(DEVDAT)       ;OWNED BY CURRENT USER?\r
+       JRST CLDDB1             ;NO\r
+       NOSCHEDULE\r
+       MOVE AC1,DEVSER(TAC)    ;GET LINK FROM THIS DDB\r
+       HLLM AC1,DEVSER(TAC1)   ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE\r
+       HRRZ ITEM,DDBPTR        ;GET INTERRUPT LEVEL POINTER\r
+       CAIN ITEM,0(TAC)        ;POINTED TO DISCARDED DDB?\r
+       MOVSM AC1,DDBPTR        ;YES. BYPASS DISCARDED DDB\r
+       SCHEDULE\r
+       MOVEI ITEM,DSKCOR\r
+       JRST CLCOR1             ;DELETE FREE STORAGE.\r
+\r
+;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN.\r
+;THIS IS DONE AT INIT TIME.\r
+\r
+INTERNAL SETDDB\r
+\r
+SETDDB:        PUSH PDP,ITEM           ;SAVE AC'S USED BY SETDDB\r
+       PUSH PDP,TAC1\r
+       MOVE TAC1,DEVMOD(DEVDAT)\r
+       TRNE TAC1,ASSPRG        ;HAS AN INIT BEEN DONE?\r
+       JRST SETDD0             ;YES.  MUST COPY PROTOTYPE DDB\r
+       HRRZ TAC1,DEVDAT        ;GET ADDRESS OF DDB\r
+       CAIE TAC1,DSKDDB        ;IS IT PROTOTYPE?\r
+       JRST SETDD1             ;NO. WE ALREADY HAVE A DDB\r
+SETDD0:        MOVEI ITEM,DSKCOR       ;GET SOME FREE CORE\r
+       NOSCHEDULE\r
+       PUSHJ PDP,GTCOR1        ;GET SPACE FOR DDB\r
+       HRR DEVDAT,TAC1         ;DEVDAT POINTS TO ASSIGNED CORE\r
+       HRLI TAC1,DSKDDB        ;SOURCE, DESTINATION\r
+       BLT TAC1,PTR1(DEVDAT)   ;COPY PROTOTYPE DDB INTO MONITOR CORE\r
+       MOVEI TAC1,DSKDDB       ;TAC1 POINTS TO PROTOTYPE\r
+                               ; LINK PROTOTYPE DDB TO COPY\r
+                               ; COPY ALREADY LINKS WHERE PROTOTYPE DID\r
+       HRLM DEVDAT,DEVSER(TAC1)\r
+       SCHEDULE\r
+SETDD1:        POP PDP,TAC1\r
+       POP PDP,ITEM\r
+       POPJ PDP,\r
+\r
+;SET TAC1 TO SOME AREA FOR BUFFER.\r
+;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE\r
+;ASSIGN FROM MONITOR CORE AS A LAST RESORT.\r
+;SET DSKBUF(DEVDAT) TO POINT TO BUFFER.\r
+\r
+EXTERNAL PIOMOD,UADRCK,JOBFF\r
+\r
+SETBUF:        TLNE IOS,UBFS           ;HAVE ONE IN FREE STORAGE?\r
+       POPJ PDP,               ;YES, LEAVE\r
+       LDB TAC1,PIOMOD         ;NO. DUMP MODE?\r
+       CAIGE   TAC1,SD\r
+       TLNE    DEVDAT,DSKRLB   ;RESET UUO IN PROGRESS ?\r
+       JRST SETBF6             ;YES TO EITHER QUESTION\r
+\r
+       TLNN DEVDAT,INBFB       ;INBUF DONE YET?\r
+       JRST SETBF1             ;NO\r
+SETBFI:        HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE\r
+       JRST SETBF2\r
+\r
+SETBF1:        TLNN DEVDAT,OUTBFB      ;OUTPUT DONE YET?\r
+       JRST SETBF6             ;NO\r
+SETBFO:        HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE\r
+\r
+SETBF2:        MOVE TAC1,2(TAC1)\r
+       \r
+       HRRZ AC1,TAC1           ;ADDRESS CHECK LOW END\r
+       PUSHJ PDP,UADRCK\r
+       MOVEI AC1,BLKSIZ-1(TAC1)\r
+       PUSHJ PDP,UADRCK\r
+       TLO IOS,UBFU            ;BUFFER IN USER AREA\r
+SETBF5:        HRLI TAC1,NBLKSZ\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+;DUMP MODE, USE AREA IN FREE STORAGE.\r
+\r
+SETBF6:        AOSE MQREQ\r
+       PUSHJ PDP,MQWAIT\r
+       TLO IUOS,UBFU           ;BUFFER IN MONITOR CORE\r
+       MOVEI TAC1, MONBUF      ;TAC1 POINTS TO MONITOR BUFFER\r
+       JRST SETBF5\r
+\r
+;CLEAR THE BUFFER IN FREE STORAGE IF THERE.\r
+\r
+EXTERNAL BUFCLR,JOBFF,IADRCK\r
+CLRBUF:        SCHEDULE\r
+       TLZN IOS,DAFLG          ;USING SAT BLOCK?\r
+       JRST .+3\r
+       SOSL DAREQ              ;YES. RELEASE\r
+       SETOM DAAVAL\r
+       TLZN IOS,AUFLG          ;USING UFD?\r
+       JRST .+3\r
+       SOSL AUREQ              ;YES. RELEASE UFD\r
+       SETOM AUAVAL\r
+       TLZN IOS,UBFS           ;USING MONITOR BUFFER?\r
+       JRST .+3\r
+       SOSL MQREQ              ;YES, RELEASE MONITOR BUFFER\r
+       SETOM MQAVAL\r
+       TLZ IOS,NCTRLC          ;RENABLE ^C\r
+       TLZE IOS,UBFU           ;USING BUFFER IN USER AREA\r
+       JRST CLRBF1             ;YES. CLEAR BUFFER\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+;CLEAR USER BUFFER AFTER USING\r
+\r
+CLRBF1:        MOVEM IOS,DEVIOS(DEVDAT)\r
+       HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER\r
+       CAML TAC,JOBFF(JDAT)    ;ABOVE JOBFF>\r
+       POPJ PDP,               ;NO. RETURN.\r
+       PUSHJ PDP,IADRCK\r
+       POPJ PDP,\r
+       SUBI TAC,2              ;SET TAC TO 2ND BUFFER WORD\r
+       SOS (PDP)               ;BUFCLR WILL SKIP RETURN\r
+       JRST BUFCLR             ;CLEAR THE BUFFER\r
+\r
+;FIND THE FIRST ZERO IN A SET OF WORDS\r
+;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS.\r
+;          RH OF TAC CONTAINING ADDRESS OF FIRST WORD.\r
+;CALL: PUSHJ PDP,GETZER\r
+;      EXIT1           NO ZEROS\r
+;      EXIT2           NORMAL\r
+;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO.\r
+;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO.\r
+;\r
+;ENTER AT GETZR1 IF TAC1 IS ALL SET UP.\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+\r
+GETZER:        MOVNI DAT,1\r
+       JRST GETZ3\r
+\r
+GETZ1: ROT TAC1,-1\r
+       JUMPGE TAC1,GETZ3\r
+\r
+GETZ2: AOBJP TAC,CPOPJ\r
+       CAMN DAT,(TAC)\r
+       JRST GETZ2\r
+\r
+GETZ3: TONE TAC1,(TAC)\r
+       JRST GETZ1\r
+       JRST CPOPJ\r
+\r
+;TIMING:       M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS\r
+;      M=NUMBER OF LEADING ONES IN M+1ST WORD\r
+\r
+;      38+12,8M+17.1N  MIRCO-SECS\r
+\r
+;WORST CASE WITH 128 WORDS = 2.3 MILS\r
+\r
+\r
+;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD\r
+;CONTAINING A SINGLE 1-BIT\r
+;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1.\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+\r
+RESIDU:        TLNN TAC1,777000\r
+       JRST RESID1\r
+       LSH TAC1,-11\r
+       TLOA TAC1,43000\r
+RESID1:        TLO TAC1,32000\r
+       FAD TAC1,[0]\r
+       LSH TAC1,-33\r
+       POPJ PDP,\r
+\r
+\r
+;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1\r
+;IT IS ASSUMED THAT THE CLOCK IS OFF.\r
+\r
+       INTERN GETFCR\r
+\r
+GETFCR:        MOVEI ITEM,1            ;REQUEST ONE 4 WORD BLOCK\r
+GTCOR1:        MOVEI AC1,LOCORE        ;POINT TO THREE WORD FREE CORE ENTRY\r
+       MOVEI AC2,DDBTAB        ;POINT TO BIT TABLE\r
+       PUSH PDP,DAT\r
+       PUSHJ PDP,GETBIT        ;FIND A HOLE\r
+       JRST DFERR9             ;THERE ARE NONE\r
+       POP PDP,DAT\r
+       LSH TAC1,2              ;MULTIPLY BIT# BY 4\r
+       SUBI TAC1,4             ;SYNCHRNIZE\r
+       ADD TAC1,LOCORE         ;FORM CORE ADDRESS\r
+       POPJ PDP,\r
+\r
+INTERNAL GETBIT\r
+\r
+\r
+;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS.\r
+;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE\r
+;   SIZE HOLD DESIRED,\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE\r
+;OF LARGETS HOLE ENCOUNTERED\r
+\r
+GETBIT:        PUSH PDP,[-1]           ;INITIALIZE LARGEST HOLD FOUND SO FAR\r
+       PUSH PDP,ITEM           ;SAVE HOLD SIZE\r
+       MOVE TAC,2(AC1)         ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS\r
+       MOVE TAC1,1(AC1)\r
+       PUSHJ PDP,GETZER        ;FIND THE FIRST ZERO\r
+       JRST GTBIT5             ;NO ZEROS LEFT\r
+       MOVEM TAC1,1(AC1)       ;SAVE THE SPOT\r
+       MOVEM TAC,2(AC1)\r
+       PUSH PDP,TAC\r
+       \r
+       PUSH PDP,TAC1\r
+\r
+GTBIT1:        AOS DAT                 ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1)\r
+       SOJLE ITEM,GTBIT2       ;FOUND ENOUGH?\r
+       ROT TAC1,-1             ;NO\r
+       SKIPGE TAC1\r
+       AOBJP TAC,GTBT1A        ;JUMP IF TABLE EXHAUSTED\r
+       TDNN TAC1,(TAC)         ;IS NEXT BIT ZERO?\r
+       JRST GTBIT1             ;YES, CONTINUE\r
+\r
+GTBT1A:        CAMLE DAT,-3(PDP)       ;NO. LARGEST HOLE SO FAR?\r
+       MOVEM DAT,-3(PDP)       ;YES. SAVE SIZE\r
+       JUMPG TAC,GTBIT6        ;TABLE EXHAUSTED? IF SO, ERROR EXIT.\r
+       PUSHJ PDP,GETZER        ;NO, TRY FURTHER ON\r
+       JRST GTBIT6             ;NO MORE, ERROR\r
+       MOVEM TAC1,(PDP)\r
+       MOVEM TAC,-1(PDP)\r
+       MOVE ITEM,-2(PDP)\r
+       JRST GTBIT1\r
+\r
+GTBIT2:        MOVE TAC1,(PDP)         ;HOLE FOUND, SET BITS TO ONES\r
+       MOVE TAC,-1(PDP)\r
+       MOVE ITEM,-2(PDP)\r
+\r
+GTBIT3:        ORM TAC1,(TAC)\r
+       SOJLE ITEM,GTBIT4\r
+       ROT TAC1,1\r
+       JUMPGE TAC1,GTBIT3\r
+       AOBJN TAC,GTBIT3        ;THIS SHOULD ALWAYS JUMP\r
+\r
+GTBIT4:        POP PDP,TAC1\r
+       POP PDP,TAC\r
+       AOS -2(PDP)\r
+       HRRZS TAC\r
+       SUBI TAC,-1(AC2)\r
+       PUSHJ PDP,RESIDU\r
+       IMULI TAC,^D36\r
+       SUBM TAC,TAC1\r
+GTBIT5:        POP PDP,ITEM\r
+       POP PDP,DAT             ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL\r
+       POPJ PDP,\r
+\r
+GTBIT6:        POP PDP,TAC\r
+       POP PDP,TAC1\r
+       AOS -1(PDP)             ;SIZE OF LARGEST HOLD MUST BE ADJUSTED\r
+       JRST GTBIT5\r
+\r
+;FREE A FOUR WORD SECTION OF CORE.\r
+;ENTER WITH ADDRESS IN TAC\r
+\r
+       INTERNAL CLCOR1\r
+\r
+CLRCOR:        MOVEI ITEM,1\r
+CLCOR1:        SUB TAC,LOCORE\r
+       LSH TAC,-2\r
+       MOVEI AC1,LOCORE\r
+       MOVE AC2,CRINIT         ;SEARCH FROM BEGINNING\r
+\r
+;CLEAR A SERIES OF BITS IN SOME TABLE\r
+;ENTER WITH:   C(TAC) SET TO A BIT NUMBER\r
+;              C(AC1) SET TO EITHER A SAT ENTRY OR FREE\r
+;                      CORE ENTRY\r
+;              C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM)\r
+;              C(ITEM) SET TO NUMBER OF BITS TO CLEAR\r
+;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE\r
+;      ENTRY UPDATED IF NECESSARY.\r
+\r
+INTERNAL CLRBIT\r
+\r
+CLRBIT:        IDIVI TAC,^D36\r
+       HRLS TAC                ;BOTH HALVES OF TAC CONTAIN\r
+                               ; WORD INCREMENT\r
+       ADD TAC,AC2\r
+       PUSH PDP,DAT\r
+       MOVN DAT,TAC1\r
+       MOVSI TAC1,400000\r
+       ROT TAC1,(DAT)\r
+       POP PDP,DAT\r
+       PUSH PDP,TAC\r
+       PUSH PDP,TAC1\r
+\r
+CLRB4: ANDCAM TAC1,(TAC)       ;CLEAR A BIT\r
+       SOJLE ITEM,CLRB5        ;IS THAT ALL?\r
+       ROT TAC1,-1             ;NO\r
+       JUMPGE TAC1,CLRB4\r
+       AOBJN TAC,CLRB4         ;THIS SHOULD ALWAYS JUMP\r
+\r
+CLRB5: POP PDP,TAC1\r
+       POP PDP,TAC\r
+       CAMLE TAC,2(AC1)        ;NEED TO RESET?\r
+       POPJ PDP,               ;NO\r
+       CAME TAC,2(AC1)\r
+       JRST CLRB2              ;YES\r
+       JUMPL TAC1,CLRB2\r
+       SKIPGE 1(AC1)\r
+       JRST CLRB3\r
+       CAML TAC1,1(AC1)\r
+CLRB2: MOVEM TAC1,1(AC1)\r
+CLRB3: MOVEM TAC,2(AC1)\r
+       POPJ PDP,\r
+\r
+SUBTTL QUEUEING AND INTERRUPT PROCESSING\r
+;PUT A REQUEST IN THE USER QUEUE.\r
+;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT.\r
+;CALLED AT BOTH INTERRUPT AND UUO LEVELS\r
+\r
+EXTERNAL SETACT,CPOPJ\r
+\r
+QIN:   SKIPA TAC1,DEVDAT       ;*\r
+QOUT:  MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;*\r
+\r
+       MOVEI TAC,TRIES         ;*INITIALIZE ERROR COUNT\r
+       MOVEM TAC,DSKCNT(DEVDAT) ;*\r
+       PUSHJ PDP,SETACT        ;*SET IOACT\r
+       MOVSI TAC,W8BIT         ;*SET WAIT FLAG\r
+       ORM TAC,DEVIAD(TAC1)\r
+       NOSCHEDULE      ;*\r
+       AOS USRCNT              ;*INCREMENT COUNTER OF TRANSFER REQUESTS\r
+\r
+       MOVNI DAT,1             ;*\r
+       EXCH DAT,DFBUSY         ;*\r
+       JUMPN DAT,QIOEND        ;*JUMP IF DISK BUSY\r
+\r
+       ANDCAM TAC,DEVIAD(TAC1) ;*\r
+       CAME TAC1,DEVDAT        ;*\r
+       MOVEI TAC,0             ;*\r
+       PUSHJ PDP,USRGO         ;*\r
+\r
+QIOEND:        SCHEDULE        ;*\r
+       POPJ PDP,               ;*\r
+\r
+\r
+;PUT A REQUEST IN THE MONITOR QUEUE.\r
+;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT.\r
+;ENTER WITH    C(TAC1 0-17) = -SIZE OF BLOCK\r
+;              C(TAC1 18-35) = CORE ADDRESS\r
+;              C(TAC 18-35) = LOGICAL BLOCK NUMBER\r
+\r
+INTERNAL MQIN,MQOUT\r
+EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC\r
+\r
+MQIN:  HRLZ TAC1,DEVDAT\r
+       TLOA TAC1,400000        ;BIT 0=1 IS READ INDICATOR\r
+MQOUT: HRLZ TAC1,DEVDAT\r
+       IFN FTRCHK,<\r
+       TRNN TAC,-1             ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE\r
+\r
+       HALT .+1                ;CONTINUING AFTER HALT WILL YIELD INFORMATION\r
+                               ; LOSS ON THE DISK\r
+>\r
+       HRLI TAC,TRIES\r
+\r
+       MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT.\r
+       PUSHJ PDP,SETACT        ;SET IOACT\r
+       NOSCHEDULE\r
+       TLNN IOS,UBFS+NORELB    ;USING BUFFER IN FREE STORAGE?\r
+       HRR TAC1,PROG           ;NO, RELOCATE\r
+       MOVEM TAC1,@MIPTR\r
+\r
+       AOS AC1,MIPTR           ;RING INDEX MIPTR\r
+       CAIL AC1,MQTOP\r
+       MOVEI AC1,MQUEUE\r
+       MOVEM AC1,MIPTR\r
+\r
+       MOVNI AC1,1\r
+       EXCH AC1,DFBUSY         ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS.\r
+       SKIPN AC1               ;ALREADY BUSY?\r
+       PUSHJ PDP,MONGO         ;NO, START A MONITOR JOB\r
+\r
+       SCHEDULE\r
+       PUSHJ PDP,WSYNC\r
+       HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS?\r
+       TRNN AC1,IODERR!IODTER!IOIMPM\r
+       AOS (PDP)               ;NO, SKIP RETURN\r
+       POPJ PDP,\r
+\r
+;*\r
+;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL\r
+;*\r
+;ROUTINE CALLED BY INTERRUPT IN DISK.\r
+;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB.\r
+;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR\r
+;FLAGS.\r
+\r
+INTERNAL DFINT,FTSWAP\r
+EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD\r
+EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT\r
+EXTERNAL JBTADR\r
+EXTERNAL MQTOP,MQUEUE\r
+\r
+DFINT:\r
+       IFN FTSWAP,<\r
+       EXTERNAL SQREQ,SERA,SOGO,SWPINT\r
+       MOVE TAC,SERA           ;*WAS THAT A SWAPPING JOB?\r
+       TLNE TAC,200000         ;*\r
+       JRST SWPINT             ;*YES\r
+       >\r
+       SKIPN RUNUSR            ;*WAS THAT A USER JOB?\r
+       JRST DFINT2             ;*NO, MUST HAVE BEEN MONITOR\r
+       \r
+       MOVS DEVDAT,RUNUSR      ;*YES\r
+       ANDI DEVDAT,377777      ;*CLEAR READ INDICATOR BIT.\r
+       TRNE IOS,IOIMPM         ;*WRITE-LOCK?\r
+       PUSHJ PDP,DINT1A        ;*YES\r
+       TRNE IOS,IODTER!IODERR  ;*ERRORS?\r
+       JRST DFINT9             ;*ERRORS\r
+DFINTA:        AOS DEVACC(DEVDAT)      ;INCREMENT POINTER TO RETRIEVAL POINTER\r
+       AOS SETCNT(DEVDAT)      ;INCREMENT RELATIVE BLOCK NUMBER\r
+       SOS USRCNT              ;*\r
+       PUSHJ PDP,SETDUN        ;*TURN OFF I/O WAIT\r
+       LDB TAC,PJOBN\r
+       MOVE PROG,JBTADR(TAC)   ;*SET RELOC. AND PROT. FOR THIS JOB\r
+\r
+       SKIPL RUNUSR            ;*WAS IT A READ OR A WRITE?\r
+       JRST DFINT1             ;*WRITE\r
+\r
+       MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT\r
+       ADDI TAC,1              ;*\r
+       MOVEI TAC1,BLKSIZ\r
+       HRRM TAC1,@TAC\r
+\r
+       IFG CHKCNT,<\r
+       MOVE TAC,DEVOAD(DEVDAT)\r
+       TLNE TAC,CKSUPR\r
+       JRST DINT0B\r
+       HRRZ TAC,DEVIAD(DEVDAT)\r
+       ADD TAC,[XWD NBLKSZ,2]\r
+       PUSHJ PDP,CHKSUM        ;CLEAR IOACT\r
+       MOVE TAC,DEVACC(DEVDAT)\r
+       HLRZ TAC,-1(TAC)\r
+       CAMN TAC,TAC1\r
+       JRST .+3\r
+       PUSHJ PDP,CKREC3\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       >\r
+DINT0B:\r
+       PUSHJ PDP,DFINX         ;ENTER INPUT ROUTINE\r
+       SKIPA\r
+DFINT1:        PUSHJ PDP,DFOUTX        ;CHECK FOR MORE OUTPUT\r
+       SETZM RUNUSR\r
+\r
+       JRST DFINT4\r
+\r
+DINT1A:        HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT\r
+       HRRZ TAC,-1(TAC)\r
+       JRST SETWL              ;AND RETURN\r
+\r
+DFINT2:        MOVS DEVDAT,@MOPTR      ;IT WAS A MONITOR JOB\r
+       ANDI DEVDAT,377777      ;REMOVE POSSIBLE READ INDICATOR\r
+       TRNN IOS,IODERR!IODTER  ;ERRORS?\r
+       JRST DFINT3             ;NO.\r
+       SOS TAC,DSKCNT(DEVDAT)  ;YES,TRIED ENOUGH?\r
+       TRNE TAC,-1\r
+       JRST DINT4A             ;NO, TRY AGAIN.\r
+\r
+DFINT3:        HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS\r
+       HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR?\r
+       TRNE IOS,IOIMPM\r
+       PUSHJ PDP,SETWL         ;YES, SET WLBIT\r
+       PUSHJ PDP,SETDUN\r
+       SETZM @MOPTR            ;REMOVE THIS MONITOR JOB\r
+       AOS TAC,MOPTR           ;INCREMENT POINTER.\r
+       CAIL TAC,MQTOP\r
+       MOVEI TAC,MQUEUE\r
+       MOVEM TAC,MOPTR         ;FALL THROUGH TO DFINT4\r
+\r
+;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY\r
+; 1) SWAPPING  2) MQ I/O  3) BUFFERED MODE I/O\r
+DFINT4:        MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT\r
+DINT4A:        IFN FTSWAP,<\r
+       SKIPE SQREQ             ;SWAPPING JOB WAITING?\r
+       JRST SOGO               ;YES,START IT\r
+       >\r
+INTERNAL DINT4B\r
+\r
+DINT4B:        SKIPE @MOPTR            ;MONITOR JOB WAITING?\r
+       JRST MONGO              ;YES, START IT UP\r
+\r
+       SKIPL USRCNT            ;USER WAITING?\r
+       JRST FINDV              ;YES.\r
+       SETZM DFBUSY            ;NO. TURN OFF BUSY FLAG\r
+       POPJ PDP,               ;EXIT INTERRUPT\r
+\r
+;FIND A WAITING USER\r
+\r
+FINDV: HRRZ DEVDAT,DDBPTR\r
+       MOVSI TAC,W8BIT         ;PREPARE TO TURN OFF WAIT INDICATOR\r
+\r
+DFINT5:        HLRZ TAC1,(DEVDAT)      ;END OF DISK DDBS?\r
+       SKIPE DEVDAT\r
+       CAIE TAC1,(SIXBIT /DSK/)\r
+       MOVEI DEVDAT,DSKDDB     ;YES, RESET TO TOP\r
+\r
+       SKIPGE DEVIAD(DEVDAT)   ;ANY READS WAITING?\r
+       JRST DFINT7             ;YES\r
+       SKIPGE DEVOAD(DEVDAT)   ;ANY WRITES WAITING?\r
+       JRST DFINT6             ;YES\r
+       HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB\r
+       JRST DFINT5\r
+\r
+;START UP A USER WRITE\r
+\r
+DFINT6:        ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB\r
+       MOVEI TAC,0             ;PREPARE TO SET BIT 0=0 IN RUNUSR\r
+       JRST USRGO\r
+\r
+;START UP A USER READ\r
+\r
+DFINT7:        ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB\r
+\r
+USRGO: MOVSM DEVDAT,RUNUSR     ;SAVE DEVDAT FOR USE AT DFINT\r
+       ORM TAC,RUNUSR          ;SET READ (B0=1) WRITE (B0=0) INDICATION\r
+       AOS UXFERS              ;COUNT TOTAL USER TRANSFERS\r
+       LDB PROG,PJOBN          ;SETUP RELOCATION FOR JOB\r
+       MOVE PROG,JBTADR(PROG)\r
+       MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK\r
+       MOVSM TAC,DDBPTR        ;START SEARCH WITH NEXT DDB\r
+       MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
+       HRRZ TAC,(TAC)          ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #)\r
+       MOVSI TAC1,NBLKSZ\r
+       SKIPL RUNUSR            ;READ?\r
+       JRST USRGO3\r
+\r
+       HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER\r
+       AOJA TAC1,DFRED         ;FROM IOWD AND READ\r
+\r
+USRGO3:        HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER\r
+       AOJA TAC1,DFWRT         ;FORM IOWD AND WRITE\r
+\r
+\r
+;START UP A MONITOR READ OR WRITE\r
+\r
+MONGO: MOVS ITEM,@MOPTR        ;XWD CORE ADDRESS, SAVED DEVDAT\r
+       ANDCMI ITEM,400000      ;CLEAR READ INDICATOR\r
+       MOVE TAC1,DSKBUF(ITEM)  ;GET CONTROLLING IOWD\r
+       HLRZ TAC,ITEM           ;GET CORE ADDRESS\r
+       ADD TAC1,TAC\r
+       HLL TAC1,DSKBUF(ITEM)           ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH\r
+       SUBI TAC1,1             ;FORM IOWD LENGTH ADDRESS\r
+       HLRZ TAC,DSKCNT(ITEM)   ;GET LOGICAL BLOCK#\r
+       SKIPL @MOPTR\r
+       JRST DFWRT\r
+       JRST DFRED\r
+\r
+;ERROR ON USER JOB.\r
+\r
+DFINT9:        AOS ECOUNT              ;COUNT USER HARDWARE ERRORS\r
+       SOS TAC,DSKCNT(DEVDAT)  ;TRIED ENOUGH?>\r
+       TRNN TAC,-1\r
+       JRST DFINTA             ;YES.\r
+       MOVE TAC,DEVDAT         ;NO. RESET FLAG SO IT WILL GO AGAIN.\r
+       SKIPL RUNUSR            ;READ?\r
+       ADDI TAC,DEVOAD-DEVIAD  ;NO.\r
+       MOVSI TAC1,400000\r
+       ORM TAC1,DEVIAD(TAC)    ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD\r
+       SETZM RUNUSR            ;CLEAR USER INDICATOR\r
+       JRST DINT4A             ;DO NEXT TASK.\r
+\r
+;CLEAR I/O DONE FLAG IF IT IS ON.\r
+\r
+SETDUN:                                ;*\r
+       OR IOS,DEVIOS(DEVDAT)   ;*\r
+       ANDCMI IOS,IOACT        ;*\r
+       TLZE IOS,IOW            ;*\r
+       JRST SETIOD             ;*\r
+       POPJ PDP,               ;*\r
+\r
+SUBTTL ERRORS,  SUBROUTINES.\r
+;ERROR ROUTINES CALLED FROM UUO LEVEL\r
+\r
+EXTERN EXCALP,ERRPTU,TPOPJ\r
+\r
+DEFINE ERRORS (X),<\r
+       PUSHJ PDP,CLRBUF        ;CLEAR ANY DUMP BUFFER\r
+       JSP TAC,ERRPTU          ;OUTPUT A MESSAG\r
+       ASCIZ ^X^\r
+       JRST EXCALP             ;TYPE "UUO FROM" MESSAGE AND QUIT\r
+       >\r
+\r
+DFERR1:        ERRORS          <DISK FULL-- YOUR JOB HAS LOST.  >\r
+\r
+DFERR2:        MOVEI IOS,IOIMPM\r
+       ORB IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+DFERR3:        ERRORS <INCORRECT RETRIEVAL INFORMATION>\r
+\r
+;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG\r
+\r
+DFERR6:        MOVEI TAC,NORITE        ;FILE ALREADY BEING ALTERED\r
+DFERRY:        HRRZ TAC1,UUO\r
+       ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK\r
+       HRRM TAC,@TAC1          ;STORE ERROR CODE\r
+       POP PDP,TAC             ;REMOVE XWD PROJ,PROG\r
+       JRST CLRBUF             ;RELEASE ANY RESOURCES\r
+\r
+DFERR5:        MOVEI TAC,PROTF         ;PROTECTION FAILURE\r
+       JRST DFERRY\r
+\r
+DFERR4:        MOVEI TAC,NOTINM        ;USER NOT IN MFD\r
+       JRST DFERRY\r
+\r
+DFERR7:        MOVEI TAC,NOTINU        ;FILE NOT IN UFD\r
+       JRST DFERRY\r
+\r
+DFERR8:        ERRORS <LOOKUP AND ENTER HAVE DIFFERENT NAMES>\r
+\r
+DFERR9:        SCHEDULE\r
+       ERRORS <NOT ENOUGH FREE CORE IN MONITOR>\r
+\r
+DFER10:        MOVEI TAC,RENFAL\r
+       JRST DFERRY\r
+\r
+DFER11:        MOVEI TAC,NOFILE\r
+       JRST DFERRY\r
+\r
+DFER12:        MOVEI   TAC,0\r
+       PUSH    PDP,TAC         ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED)\r
+       JRST DFERRY\r
+\r
+WERA:  MOVSI IOS,NORELB\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+       ERRORS <NON-RECOVERABLE DISC WRITE ERROR>\r
+\r
+RERA:  MOVSI IOS,NORELB\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+       ERRORS <NON-RECOVERABLE DISC READ ERROR>\r
+\r
+;CALLED AT BOTH INTERUPT AND UUO LEVELS\r
+;COMPUTE CHECK-SUM\r
+;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS\r
+;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH.\r
+\r
+IFG CHKCNT,<INTERNAL CHKSUM\r
+CHKSUM:        HLRZ TAC1,TAC           ;IS COUNT GREATER THAN CHKCNT\r
+       CAIGE TAC1,-CHKCNT\r
+       MOVEI TAC1,-CHKCNT      ;YES, USE CHKCNT\r
+       MOVE IOS,[XWD UBFS,IOACT]\r
+       ANDCM IOS,DEVIOS(DEVDAT)\r
+       IORM IOS,DEVIOS(DEVDAT)\r
+       TLNE IOS,UBFS\r
+       ADDI TAC,(PROG)         ;NO. RELOCATE,\r
+       HRL TAC,TAC1            ;RESET COUNT IN LH AFTER POSSIBLE OVERFLOW\r
+       PUSHJ PDP,CHECK\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+       TRZ IOS,IOACT\r
+       POPJ PDP,\r
+\r
+\r
+CHKSM3:        AOJA TAC1,CHKSM2        ;BRING CARRY AROUND\r
+\r
+;CHECKSUM ERROR COUNTING ROUTINE\r
+CKREC2:        PUSH PDP,TAC\r
+       IORM AC3,DEVIOS(DEVDAT)\r
+       MOVEI TAC,10000\r
+       ADDM TAC,CKSMCT\r
+       JRST TPOPJ\r
+CKREC3:        IORI IOS,IODTER\r
+       AOS CKSMCT\r
+       POPJ PDP,\r
+       >\r
+\r
+;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE.\r
+;THIS IS 1.8 MILS OR SO FOR 128 WORDS.\r
+\r
+IFN    <IFG CHKCNT, <CHKCNT+>>FTCHECK+FTMONP+FTSWAP, <\r
+\r
+       INTERNAL CHECK\r
+CHECK: MOVEI TAC,0             ;CLEAR SUM\r
+       JFCL 4,.+1              ;CLEAR CARRY0 FLAG\r
+\r
+CHKSM1:        ADD TAC1(TAC)           ;ADD NEXT WORD\r
+       JFCL 4,CHKSM3           ;JUMP IF CARRY 0\r
+CHKSM2:        AOBJN TAC,CHKSM1        ;LOOP UNTIL DONE\r
+       HLRZ TAC,TAC1           ;ADD HALVES\r
+       HRRZS TAC1\r
+       ADD TAC1,TAC\r
+       TLZE TAC1,1             ;CARRY INTO LH?\r
+       ADDI TAC1,1             ;YES BRING IT AROUND\r
+       POPJ PDP,\r
+>\r
+\r
+;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE,\r
+; OTHERWISE NEGATIVE BLOCK COUNT).\r
+; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1\r
+UPDEVC:        HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS\r
+       SUBI TAC,1              ;*\r
+       LSH TAC,BLKP2           ;*\r
+       ADD TAC,TAC1            ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT\r
+                               ; OUTPUT COMMAND.\r
+       HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON.\r
+       TRNE TAC1,400000        ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS?\r
+       JRST UPDVC2             ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS\r
+       TLNN TAC,-1             ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED\r
+\r
+                               ;* 2EXP17 WORDS?\r
+       TRNE TAC,40000          ;*\r
+       JRST UPDVC1             ;*YES, GO SAVE NEGATIVE BLOCK COUNT.\r
+       CAMLE TAC,TAC1          ;*NO, COMPARE POSITIVE WORD COUNTS\r
+       HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS\r
+                               ; MAXIMUM EXCEEDED\r
+       POPJ PDP,               ;*\r
+UPDVC1:        TRO TAC1,-1             ;*SET PREVIOUS MAXIMUM AS ONLY ONE \r
+                               ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED).\r
+UPDVC2:        ADDI TAC,BLKSIZ-1       ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE\r
+                               ; BLOCK COUNT.\r
+       LSH TAC,-BLKP2          ;*\r
+       MOVNS TAC               ;*\r
+       TRON TAC,400000         ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS)\r
+                               ; IN THIS FILE?\r
+       TROA IOS,IOBKTL         ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE\r
+                               ; BLOCK COUNT WODULO 2EXP17\r
+       CAILE TAC1,(TAC)        ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT\r
+                               ; FILE SIZE.\r
+       HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS\r
+                               ;* MAXIMUM EXEEDED.\r
+       POPJ PDP,               ;*\r
+\r
+;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE.\r
+\r
+WLERA: HLR TAC,DSKCNT(DEVDAT)  ;PICK UP BLOCK NUMBER.\r
+       PUSHJ PDP,SETFRE        ;FREE THE BLOCK\r
+       JRST DFGETF             ;GET ANOTHER.\r
+\r
+;SET WRITE-LOCK INDICATION IN A SAT ENTRY.\r
+;ENTER WITH A BLOCK NUMBER IN TAC.\r
+\r
+SETWL: MOVEI TAC1,SETENT       ;*\r
+       JRST .+2                ;*\r
+SETWL1:        ADDI TAC1,SENTSZ        ;*\r
+       HLRZ ITEM,@TAC1         ;*IS THE BLOCK IN THIS SAT ENTRY?\r
+       CAML TAC,ITEM           ;*\r
+       CAIL TAC,NUMBLK(ITEM)   ;*\r
+       JRST SETWL1             ;*NO, LOOP.\r
+       MOVEI ITEM,WLBIT        ;*\r
+       ORM ITEM,@TAC1          ;*\r
+       POPJ PDP,               ;*\r
+\r
+DSKSR: END\r
+\f\r
diff --git a/src/dtasrn.mac b/src/dtasrn.mac
new file mode 100644 (file)
index 0000000..2f8d0bd
--- /dev/null
@@ -0,0 +1,1408 @@
+TITLE  DTASRN - NEW FORMAT DECTAPE SERVICE FOR TD-10 (PDP-10)\r
+SUBTTL T. WACHS/RCC   TS 04 JUN 69  V406\r
+       XP      VDTASX,406\r
+                               ;DEFINE GLOBABL VERSION NUMBER FOR LOADER MAP.\r
+       IFNDEF ALMACT, <ALMACT=0>\r
+\r
+       ENTRY   DTASRN\r
+DTASRN:                        ;THIS ENTRY FOR SELECTIVE LOAD BYT BUILD\r
+       INTERNAL DTADSP\r
+EXTERNAL       TPOPJ,TPOPJ1,DTALOC,DTALC2,DTBOTH,WSYNC,DTACHL\r
+EXTERNAL       STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD\r
+EXTERNAL       DTAVAL,DTREQ,DTWAIT,SETIOD,THSDAT,PUNIT\r
+EXTERNAL       ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
+EXTERNAL       COMCHK,JOBPD1,DTTURN,PJOBN,RELEA9,UADCK1,STREQ\r
+EXTERNAL       CLOCK,JBTADR,DEVPHY,PION,PIOFF,DTTRY\r
+\r
+;DTALOC=PI LOC FOR DATA - CHANGED BY ROUTINE\r
+;DTALC2=PI LOC+1 FOR DAT\r
+;DTBOTH=10*(PI FOR DATA CHAN) + PI FOR FLAGS CHAN\r
+;DTTURN=300200+DTBOTH          (CONO FOR TURN-AROUND)\r
+\r
+BLK=4\r
+\r
+\r
+DIRBLK=^D100   ;NUMBER OF BLOCK FOR DIRECTORY\r
+\r
+TOPBLK=1101    ;HIGHEST LEGAL BLOCK NUMBER\r
+NAMSTR=^D83    ;1ST NAME WORD IN DIRECTORY\r
+QUANT=3                ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
+MINDIS=14      ;MINMUM NUMBER OF BLOCKS TO SEARCH BEFORE DISCONNECTING\r
+               ;FROM A TAPE\r
+SPACE=4                ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
+\r
+;DDB MAGIC CELLS\r
+FSTBLK=13\r
+DLOC=14\r
+IBLK=15\r
+OBLK=16\r
+DISPAD=17\r
+DMPLST=20\r
+SVDWRD=21\r
+\f;FLAGS IN RH OF IOS\r
+UDSD=100\r
+LSTSAV=20000\r
+\r
+;FLAGS IN LH OF IOS\r
+NOLINK=200\r
+CHNGDR=400\r
+RVERSE=1000\r
+SINGL=2000             ;JUST READ OR WRITE 1 BLOCK\r
+DMPMOD=4000\r
+RWDIR=10000\r
+DMPCLS=20000\r
+NOBUF=40000            ;DATA GOING DIRECTLY INTO USER AREA\r
+NOBUFC=737777          ;-NOBUF\r
+REWBIT=100000\r
+RUNBIT=200000\r
+RECKON=400000          ;THIS TAPE IS DEAD-RECKONING.\r
+                       ; (MUST BE SIGN BIT)\r
+\r
+CPBIT=-1               ;FEATURE TEST TO ALLOW IO INTO USER AREA DIRECTLY\r
+                       ;IT WILL ONLY HAPPEN ON DUMP MODE WITH NON-STANDARD BIT\r
+                       ;(UDSD) ON\r
+\f      EXTERN  JIFSEC\r
+\r
+       INTERN  DTAINT,DTADDB,DTAINI,DTADDS,DTADSP\r
+\r
+DTADDB:        SIXBIT  /DTA0/\r
+       XWD     ^D60*HUNGST,200\r
+       0\r
+       EXP     DTADSP\r
+       XWD     1107,154403\r
+       EXP     0,0\r
+\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       EXP     0,0,0\r
+\r
+       EXP     DTADIR\r
+       EXP     0,0,0,0,0\r
+\r
+\r
+DTADIR:        BLOCK   200\r
+DTADDS=.-DTADDR\r
+\r
+       JRST    DTAINI\r
+       JRST    HUNGTP          ;HUNG DEVICE\r
+DTADSP JRST    UREL\r
+       JRST    UCLS\r
+       JRST    UOUT\r
+       JRST    UIN\r
+       JRST    ENTR\r
+       JRST    LOOK\r
+       JRST    DMPO\r
+       JRST    DMPI\r
+       JRST    SETO\r
+       JRST    SETI\r
+       JRST    GETF\r
+       JRST    RENAM\r
+       POPJ    PDP,            ;CLOSE INPUT\r
+       JRST    UTPCLR\r
+;FALL INTO MTAPE\r
+\f      HRRZ    TAC1,UUO        ;MTAPE - GET OPERATION\r
+       CAIE    TAC1,1          ;REWIND OR\r
+       CAIN    TAC1,11         ;REWIND UNLOAD ARE LEGAL\r
+       SOJA    TAC1,MTA0\r
+       POPJ    PDP,            ;OTHERS ARE NO-OPS\r
+\r
+;INITIALIZE DTC\r
+DTAINI:        CONO    DTC,0\r
+       SETZM   DISCON\r
+       MOVEI   TAC,^D1000      ;COMPUTE NO OF MILLISECS/TICK\r
+       IDIVI   TAC,JIFSEC      ;FOR THIS FREQUENCY CLOCK\r
+       ADDI    TAC,1           ;ADD FUDGE FACTORE FOR SAFETY\r
+       HRRM    TAC,MSECPT      ;SAVE FOR CLOCK CALCULATION\r
+       POPJ    PDP,\r
+\f      EXTERN  JOBSAV\r
+;LOOKUP A DIRECTORY ENTRY\r
+LOOK:  TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       JRST    CPOPJ1          ;YES. LOOKUP OK\r
+       PUSHJ   PDP,DSERCH      ;NO. FIND DIRECTORY ENTRY\r
+       POPJ    PDP,            ;NOT THERE\r
+       HRRZ    TAC1,26(TAC)    ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
+       AOS     UUO             ;POINT UUO TO WORD 3\r
+       MOVEM   TAC1,@UUO       ;INTO USER'S LOOKUP BLOCK\r
+LOOKA: HLRE    TAC,TAC         ;GET INDEX\r
+       ADDI    TAC,27\r
+       SKIPN   FSTBLK(DEVDAT)  ;TAPE BEING WRITTEN?\r
+       HRLM    TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
+       HRRM    TAC,AC1         ;SAVE INDEX IN CASE LH(IBLK) IS\r
+                       ;CHANGED BY DEAD-RECKONING\r
+       MOVEI   TAC1,0\r
+       PUSHJ   PDP,BLKSRC      ;COUNT NUMBER OF BLOCKS IN FILE\r
+       AOJA    UUO,STOWD4      ;LAST BLOCK DONE\r
+       AOS     TAC1            ;COUNT THE BLOCK\r
+       SOS     1(PDP)          ;ADJUST FOR CORRECT RETURN\r
+       AOBJN   PDP,BLKSRB      ;LOOK FOR NEXT BLOCK\r
+\r
+;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
+STOWD4:        IMUL    TAC1,[-177]     ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
+       HRLZM   TAC1,@UUO       ;STORE IN DIRECOTRY WD 4\r
+       SUBI    UUO,2           ;POINT UUO TO DIRECORY WD 2\r
+       TLZ     IOS,IO          ;MAKE SURE IO IS OFF\r
+       TLO     IOS,SINGL       ;JUST READ 1 RECORD\r
+       MOVEI   BLK,DIRBLK      ;NO, FIND FIRST MENTION OF BLOCK\r
+       PUSHJ   PDP,LSTFRE+1    ;NEAR DIRECTORY\r
+       JUMPN   BLK,LOOKE       ;FOUND IF BLK NOT =0\r
+LOOKD: PUSHJ   PDP,BLKSRC      ;FIND FIRST MENTION IN DIRECTORY\r
+       JRST    BDDIR           ;NOT THERE - ERROR\r
+LOOKE: PUSHJ   PDP,RDBLUK      ;GO READ IT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IT'S IN\r
+       HRLM    AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
+                       ;TEST ON ENTER - WONT ALLOW ENTER\r
+                       ;TO BE DONE ON LOOKED-UP FILE\r
+       HRRZ    BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
+LOOKC: SKIPN   FSTBLK(DEVDAT)  ;IF FILE HAS NOT BEEN ENTERED\r
+       MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
+       HRRM    BLK,@UUO        ;SAVE IN USER'S AREA\r
+       HLL     TAC,@UUO        ;GET USER'S EXTENSION\r
+       HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
+                               ; AND SUPERSEDING SHARED SEGMENTS\r
+       JRST    CPOPJ1          ;AND TAKE GOOD EXIT\r
+\fRENAM:        PUSH    PDP,UUO         ;SAVE LOC OF NEW NAME\r
+       MOVEI   UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
+       PUSHJ   PDP,DSER1\r
+       JRST    RENER1          ;NOT FOUND - ERROR\r
+       POP     PDP,UUO         ;FOUND, RESTORE UUO\r
+       SKIPE   @UUO            ;RENAMING TO ZERO?\r
+       JRST    RENAM2          ;NO. GO TO REAL RENAME\r
+       SETZM   (TAC)           ;YES. DELETE NAME IN DIR\r
+       SETZM   26(TAC)         ;DELETE EXTENSION\r
+       SETZM   DEVFIL(DEVDAT)  ;ZERO DEVFIL\r
+       HLRE    TAC,TAC         ;GET INDEX OF FILE\r
+       ADDI    TAC,27\r
+       PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS OF FILE\r
+RENAM1:        TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       AOS     (PDP)           ;SET FOR GOOD RETURN\r
+       JRST    STOIOS          ;GO TO USER\r
+\r
+;COME HERE TO RENAME TO A REAL NEW NAME\r
+RENAM2:        MOVE    DAT,TAC          ;SAVE LOC OF NAME IN DIRECTORY\r
+\r
+       PUSHJ   PDP,DSERCH      ;SEARCH FOR NEW NAME\r
+       SKIPA           ;NOT FOUND - GOOD\r
+       JRST    RENER2          ;NAME ALREADY EXISTS - ERROR\r
+       MOVE    TAC,@UUO        ;GET NEW NAME\r
+       MOVEM   TAC,(DAT)       ;SAVE IN DIR\r
+       AOS     UUO\r
+       MOVE    TAC,@UUO        ;EXTENSION\r
+       HLLM    TAC,26(DAT)     ;SAVE IN DIR\r
+       HLLM    TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
+       JRST    RENAM1          ;GIVE GOOD RETURN TO USER\r
+\r
+RENER1:        POP     PDP,UUO\r
+       TDZA    TAC,TAC         ;RH E+1 =0\r
+RENER2:        MOVEI   TAC,4           ;RH E+1 =4\r
+       AOS     UUO             ;POINT TO 2ND WORD\r
+       HRRM    TAC,@UUO        ;SET ERRORR CODE\r
+       POPJ    PDP,            ;AND TAKE ERROR RETURN\r
+\f;SEARCH DIRECTORY FOR A MATCH\r
+DSERCH:        MOVEI   AC1,3(UUO)      ;CHECK VALIDITY OF ADDRESS\r
+       PUSHJ   PDP,UADCK1      ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
+DSER1: PUSHJ   PDP,DIRCHK      ;ENSURE DIRECTORY IS IN CORE\r
+       HRRZ    TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
+       ADD     TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
+NMLOOK:        SKIPN   TAC1,@UUO       ;GET NAME\r
+       JRST    TPOPJ           ;NULL ARGUMENT - ERROR RETURN                   \r
+       MOVEM   TAC1,DEVFIL(DEVDAT)     ;STORE FOR RENAME AND SUPERSEDING\r
+                               ; SHARED SEGMENTS\r
+       CAMN    TAC1,(TAC)      ;TEST FOR MATCH\r
+       AOJA    UUOI,NMFOUN     ;FOUND NAME, CHECK EXTENSION\r
+       AOBJN   TAC,.-2         ;TRY NEXT NAME\r
+       POPJ    PDP,            ;NOT FOUND\r
+NMFOUN:        HLLZ    TAC1,@UUO       ;PICK UP USER'S EXTENSION\r
+       XOR     TAC1,26(TAC)    ;TEST AGAINST DIRECTORY EXTENSION\r
+       TLNN    TAC1,-1         ;MATCH?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+       AOBJP   TAC,.+2\r
+       SOJA    UUO,NMLOOK      ;NO. TRY NEXT NAME\r
+       SOJA    UUO,CPOPJ       ;NAME NOT FOUND\r
+\r
+;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
+DIRCHK:        TRNN    IOS,UDSD        ;DONT BOTHER IF NON-STANDARD\r
+       SKIPG   DEVMOD(DEVDAT)  ;IS IT IN?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
+       TLZ     IOS,IO\r
+       PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       TLO     IOS,RWDIR       ;JUST READ 1 BLOCK\r
+       PUSHJ   PDP,READBC      ;GO READ IT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IN\r
+       MOVSI   TAC1,DVDIRI     ;SET DIRECTORY-IN-CORE BIT\r
+       ORM     TAC1,DEVMOD(DEVDAT)\r
+       POPJ    PDP,\r
+\f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
+BLKSRC:        MOVSI   DAT,440500      ;DAT IS A BLOCK POINTER\r
+       HRR     DAT,DLOC(DEVDAT)\r
+       MOVEI   BLK,1           ;START AT BLOCK 1\r
+\r
+BLKSRA:        ILDB    TEM,DAT         ;INDEX OF NEXT BLOCK\r
+       CAMN    TAC,TEM         ;MATCH?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+\r
+BLKSRB:        CAIGE   BLK,TOPBLK      ;NO. SEARCHED LAST?\r
+       AOJA    BLK,BLKSRA      ;NO. TRY NEXT BLOCK\r
+       POPJ    PDP,            ;YES. RETURN\r
+\r
+;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
+SETPTR:        PUSH    PDP,BLK         ;SAVE BLK\r
+       PUSHJ   PDP,DRPTR       ;SET BLK AS A BYTE POINTER\r
+       MOVE    DAT,BLK         ;RETURN IT IN DAT\r
+       POP     PDP,BLK         ;RESTORE BLK\r
+       POPJ    PDP,            ;AND RETURN\r
+\r
+;GET NEXT AVAILABLE FREE BLOCK\r
+NXTFRE:        PUSH    PDP,TEM \r
+       PUSHJ   PDP,SETPTR      ;SET DAT TO A BYTE POINTER\r
+       MOVEI   TAC,0           ;LOOK FOR FREE BLOCKS\r
+       PUSHJ   PDP,BLKSRA      ;FIND A ZERO BLOCK\r
+       MOVEI   BLK,0           ;NOT THERE- RETURN 0\r
+FREXIT:        POP     PDP,TEM\r
+       POPJ    PDP,\r
+\r
+;GET PREVIOUS FREE BLOCK\r
+LSTFRE:        MOVEI   TAC,0\r
+       PUSH    PDP,TEM\r
+       ADDI    BLK,2\r
+       PUSHJ   PDP,SETPTR      ;SET DAT AS A POINTER\r
+       SUBI    BLK,2\r
+       PUSHJ   PDP,DECPTR      ;DECREMENT BYTE POINTER\r
+       LDB     TEM,DAT         ;INDEX TO BLOCK\r
+       CAMN    TEM,TAC         ;FOUND?\r
+       JRST    FREXIT          ;YES. RETURN\r
+       SOJG    BLK,.-4         ;TRY AGAIN IF NOT AT START\r
+       JRST    FREXIT          ;REACHED START - RETURN BLK=0\r
+\r
+;DECREMENT BYTE POINTER\r
+DECPTR:        JUMPL   DAT,.+5\r
+       ADD     DAT,[BYTE (6) 5] ;DECREMENT\r
+       JUMPG   DAT,CPOPJ       ;IF POSITIVE - SAME WORD\r
+       HRLI    DAT,010500      ;RESET TO PREVIOS WORD\r
+       SOJA    DAT,CPOPJ\r
+       HRLI    DAT,060500\r
+       SOJA    DAT,CPOPJ\r
+\r
+\f;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC\r
+DLETE: MOVEI   TAC1,0          ;SET TO DELETE BLOCKS\r
+       PUSHJ   PDP,BLKSRC      ;FIND A BLOCK BELONGING TO FILE\r
+       JRST    CPOPJ   ;ALL THROUGH\r
+       DPB     TAC1,DAT        ;DELETE IT\r
+       SOS     1(PDP)          ;ADJUST PDL FOR RETURN\r
+       AOBJN   PDP,BLKSRB      ;AND FIND NEXT MATCH\r
+\r
+\r
+;ENTER A FILE NAME IN DIRECTORY\r
+ENTR:  TRNE    IOS,UDSD        ;NON STANDARD?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+       PUSHJ   PDP,DSERCH      ;NO. LOOK FOR MATCH\r
+       JRST    NEWNT           ;THIS IS A NEW ENTRY\r
+ENTR2: MOVE    TAC1,@UUO       ;PICK UP 2ND WORD (EXTENSSION)\r
+       AOS     UUO             ;POINT TO WORD 3\r
+       HRR     TAC1,@UUO       ;ADD DATE\r
+       TRNN    TAC1,7777       ;IS DATE ALREADY THERE?\r
+       IOR     TAC1,THSDAT     ;NO, ADD CURRENT DATE\r
+       MOVEM   TAC1,26(TAC)    ;INTO DIRECTORY\r
+       SKIPGE  AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
+                               ;BEFORE THE ENTER?)\r
+       AOJA    UUO,SETWD4      ;YES. STORE LENGTH IN DIRECTORY\r
+ENTRA: SUBI    UUO,2           ;NO. POINT TO NAME\r
+       MOVE    TAC1,@UUO       ;PICK IT UP\r
+       MOVEM   TAC1,(TAC)      ;INTO DIRECTORY\r
+       HLRE    TAC,TAC         ;COMPUTE INDEX OF FILE\r
+       ADDI    TAC,27\r
+       HLRZ    DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
+       SUB     DAT,TAC         ;WRITE SAME FILE AS READING?\r
+       JUMPE   DAT,CPOPJ       ;TAKE ERROR RETURN IF YES\r
+       HRLM    TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
+\r
+       PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS BELONGING TO FILE\r
+       AOJE    AC3,FNTRD       ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
+                               ;IS A SAVE FILE (UGETF DONE)\r
+       MOVEI   BLK,DIRBLK      ;NO. GET 1ST BLOCK CLOSE TO\r
+       TLO     IOS,RVERSE      ;DIRECTORY. GOING IN REVERSE\r
+       POPJ    PDP,USLSTA\r
+       CAILE   BLK,TOPBLK      ;BLOCK LEGAL?\r
+       POPJ    PDP,            ;NO. ERROR RETURN\r
+ENTRC: MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
+       HRRM    BLK,OBLK(DEVDAT)        ;SAVE IN DDB\r
+       AOS     UUO             ;POINT UUO TO WORD 2\r
+       HRRM    BLK,@UUO        ;SAVE 1ST BLOCK IN USER'S AREA\r
+       HLL     TAC,@UUO        ;GET EXTENSION\r
+       HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE EXTENSION IN DDB ALSO\r
+       TLO     IOS,NOLINK\r
+       AOS     (PDP)\r
+\f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
+MARKDR:        PUSHJ   PDP,DRPTR       ;SET POINTER TO BLOCK IN DIR\r
+       HLRZ    TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
+       IDPB    TAC,BLK         ;MARK DIRECTORY\r
+       TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       JRST    STOIOS\r
+\r
+;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
+DRPTR: SUBI    BLK,1           ;SET FOR ILDB OR IDPB\r
+       IDIVI   BLK,7           ;COMPUTE WORD, POSITION\r
+       ADD     BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS\r
+       HRLI    BLK,440500      ;MAKE IT A BYTE POINTER\r
+       JUMPE   DAT,CPOPJ       ;CORRECT FOR POSITION IN WORD\r
+       IBP     BLK\r
+       SOJG    DAT,.-1\r
+       POPJ    PDP,\r
+\r
+;HERE FOR NEW FILE NAME ON ENTER\r
+NEWENT:        SUB     TAC,[XWD 26,26];START AT BEGINNING OF DIRECT.\r
+\r
+       SKIPN   (TAC)           ;FIND A FREE SLOT\r
+       AOJA    UUO,ENTR2       ;RETURN WITH UUO POINTING TO WRD 2\r
+       AOBJN   TAC,.-2\r
+       POPJ    PDP,            ;NONE AVAILABLE.\r
+\r
+;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
+SETWD4:        HLRE    TAC1,@UUO       ;GET -LENGTH\r
+       MOVNS   TAC1            ;+LENGTH\r
+       HRRE    TEM,@UUO\r
+       ADD     TAC1,TEM        ; +START ADDRESS\r
+       TRZ     TAC1,1777       ;STORE N-1, WHERE N IS NO OF K\r
+       LSH     TAC1,2\r
+       ORM     TAC1,26(TAC)    ;INTO 2ND WRD OF DIRECTORY\r
+       SOJA    UUO,ENTRA       ;CONTINUE WITH ENTER\r
+\r
+ENTRD: MOVEI   TAC,0           ;GET THE 1ST FREE BLOCK ON TAPE\r
+       PUSHJ   PDP,BLKSRC      ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
+       POPJ    PDP,            ;NONE AVAILABLE\r
+       JRST    ENTRC           ;CONTINUE WITH ENTER\r
+\f;USETI        -  SET NEXT INPUT BLOCK TO READ\r
+SETI:  TDZ     IOS,[XWD IOEND,IODEND]\r
+       SKIPA   DAT,DEVDAT\r
+\r
+;USETO -  SET NEXT OUTPUT BLOCK TO READ\r
+SETO:  MOVEI   DAT,1(DEVDAT)\r
+       PUSHJ   PDP,WAIT1       ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
+       HRRM    UUO,IBLK(DAT)  ;SET BLOCK NUMBER\r
+       JRST    STOIOS          ;STOE IOS, POPJ\r
+\r
+;UGETF -  GET NEXT FREE BLOCK FOR THIS FILE\r
+GETF:  PUSHJ   PDP,WAIT1       ;WAIT TILL BUFFERES EMPTY\r
+       PUSHJ   PDP,DIRCHK      ;ENSURE DIR, IN CORE\r
+       PUSHJ   PDP,USRFRE      ;GET NEXT AVAILABLE BLOCK\r
+       SKIPN   OBLK(DEVDAT)    ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
+       SETOB   BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
+                               ;WILL FINE FIRST FREE BLOCK ON TAPE\r
+       MOVE    TAC,BLK         ;TELL USER THE BLOCK NUMBER\r
+       JRST    STOTAC\r
+\r
+;GET NEXT (OR PREVIOUS) FREE BLOCK\r
+USRFRE:        MOVEI   TEM,SPACE       ;BLOCKS "SPACE" APART\r
+       LDB     BLK,PIOMOD      ;EXCEPT DUMP AND SAVMOD FILES\r
+       CAIL    BLK,SD          ;OR ONE OF DUMP MODES?\r
+       MOVEI   TEM,2           ;YES, WHICH ARE CLOSRER\r
+USRFRA:        HRRZ    BLK,OBLK(DEVDAT)        ;CURRENT BLOCK\r
+       TLNE    IOS,RVERSE      ;FORWARD?\r
+       JRST    USRLST          ;NO\r
+       ADDI    BLK,(TEM)       ;YES, FIND NEXT BLOCK AT LEAST N\r
+       CAILE   BLK,TOPBLK\r
+       TDZA    BLK,BLK\r
+CALNXT:        PUSHJ   PDP,NXTFRE       ;BLOCKS PAST THIS ONE\r
+       JUMPN   BLK,STOIOS      ;RETURN IF FOUND\r
+       TLOE    TEM,1           ;FOUND NONE ON THIS PASS\r
+       JRST    NOBLKS          ;TAPE IS FULL\r
+       TLC     IOS,RVERSE      ;REVERSE DIRECTION\r
+       HRRI    TEM,1           ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
+       JRST    USRFRA\r
+USRLST:        SUBI    BLK,(TEM)       ;LOOK FOR FREE BLOCK N BEFORE\r
+       SKIPG   BLK\r
+       TDZA    BLK,BLK         ;REVERSE IF AT FRONT OF TAPE\r
+USLSTA:        PUSHJ   PDP,LSTFRE      ;THIS ONE\r
+       JRST    CALNXT+1\r
+\r
+;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER\r
+NOBLKS:        MOVEI   BLK,TOPBLK+1    ;SET HIGH BLOCK\r
+       POPJ    PDP,\r
+\f;UTPCLR UUO\r
+UTPCLR:        TRNE    IOS,UDSD\r
+       POPJ    PDP,            ;FORGET IT FOR NON-STANDARD\r
+       MOVSI   TAC,DVDIRIN     ;SET DIRECTORY-IN-CORE BIT\r
+       ORM     TAC,DEVMOD(DEVDAT)\r
+       TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       HRRZ    TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+       HRL     TAC1,TAC\r
+       HRRI    TAC1,1(TAC)     ;BLT POINTER\r
+       SETZM   (TAC)\r
+       BLT     TAC1,176(TAC)   ;LEAVE LAST WORD IN DIR, ALONE\r
+       MOVSI   TAC1,17000      ;MARK DIRECTORY AS UNAVAILABLE\r
+       MOVEM   TAC1,16(TAC)\r
+       MOVSI   TAC1,757000     ;RESERVE BLOCKS 1 AND 2\r
+       MOVEM   TAC1,(TAC)      ;FOR READ IN MODE LOADER\r
+       MOVSI   TAC1,777770     ;MARK BLOCKS 1102-1105 AS\r
+       ORCAM   TAC1,NAMSTR-1(TAC)  ;UNAVAILABLE ALSO\r
+       JRST    STOIOS\r
+\f;CLOSE UUO\r
+UCLS:  TLZE    IOS,NOLINK      ;IS LAST BLOCK NOT LINKED?\r
+       TRNE    IOS,UDSD        ;AND NOT NON-STD?\r
+       JRST    STOIOS          ;YES, RETURN\r
+       LDB     TAC,PIOMOD      ;NO. WRITE LAST BLOCK\r
+       CAIL    TAC,16          ;DUMPO MODE?\r
+       JRST    CLSDMP          ;YES. CLOSE DUMP MODE\r
+       MOVEI   TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
+       MOVE    TAC1,1(TAC)     ;LINK WORD\r
+       TLON    TAC1,-1         ;LINK=-1 IF NOT SPECIFIED\r
+       MOVEM   TAC1,1(TAC)     ;LINK = -1... EOF\r
+       MOVEM   IOS,DEVIOS(DEVDAT)  ;SAVE IOS\r
+       JRST    OUT             ;GO TO WRITE RECORD\r
+\r
+;HERE TO CLOSE A DUMP MODE FILE\r
+CLSDMP:        TLO     IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES\r
+       PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       SETZM   BUF             ;ENSURE ZERO LINK,WORDCOUNT\r
+       SETZM   BUF+1           ;MAKE SURE 0, SO CAN GET WITH 3 SERIES MON.\r
+                               ;FILES SAVED WITH 4 SERIES MONITOR.\r
+       JRST    OUFULL          ;GO WRITE THE BLOCK\r
+\f;RELEASE UUO\r
+UREL:  PUSHJ   PDP,WAIT1       ;MAKE SURE THE TAPE IS STOPPED\r
+       PUSHJ   PDP,NXTCM2      ;CLEAR OUT DUMP-MODE STUFF\r
+       MOVSI   TAC,DVDIRIN     ;IF NONSTANDARD, WILL CLEAR\r
+       TRZE    IOS,UDSD        ;CLEAR NON-STANDARD BIT.\r
+       ANDCAM  TAC,DEVMOD(DEVDAT)      ;SO DIRECTORY WILL BE READ ANEW\r
+       SKIPG   DEVMOD(DEVDAT)  ;IF DIRECTORY HAS BEEN\r
+       TLZN    IOS,CHNGDR      ;MODIFIED IT MUST BE WRITTEN\r
+       JRST    UREL2           ;IT HASN'T BEEN CHANGED\r
+       TLO     IOS,IO\r
+       PUSHJ   PDP,GETDT       ;WAIT TILL DTC AVAILABLE\r
+       TLO     IOS,RWDIR       ;GOING TO WRITE DIRECTORY\r
+       MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
+       PUSHJ   PDP,WRTBLK      ;WRITE UT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IT HAS BEEN WRITTEN\r
+\r
+UREL2: MOVE    TAC,DEVIAD(DEVDAT) ;BITS 1,2 ARE COUNT OF CHANS\r
+       TLNE    TAC,200000      ;DEV INITED ON ANOTHER CHANNEL TOO?\r
+\r
+QUANTL:        POPJ    PDP,QUANT       ;YES, DON'T ZAP IOS OR DDB\r
+\r
+;SOME BITS IN THE IOS WORD AND THE DDB WILL NORMALLY BE CHANGED ON THE\r
+;INTERRUPT LEVEL AFTER THE RELEASE, BUT HNGSTP CAN CAUSE  THESE ACTIONS\r
+;NEVER TO OCCUR, SO MAKE SURE THEY REALLY HAPPENED\r
+       TLZ     IOS,77600       ;ZERO IOS BITS\r
+       SETZM   OBLK(DEVDAT)    ;AND OBLK\r
+       SETZM   IBLK(DEVDAT)    ;ZERO IBLK SO WRITING A FILE AFTER READING\r
+                               ;IT WILL WORK (CHECK IS MADE AT ENTER)\r
+       SETZM   FSTBLK(DEVDAT)\r
+       JRST    STOIOS          ;STORE IOS AND RETURN\r
+\fGETDT0:       PUSHJ   PDP,SETACT      ;WAIT TILL TAPE COMES OUT OF REWIND\r
+       PUSHJ   PDP,WSYNC       ;BEFORE DOING ANYTHING ELSE TO IT\r
+;GET DEC TAPE CONTROLLER\r
+GETDT: TLNE    IOS,REWBIT      ;IF TAPE IS REWINDING NOW\r
+       JRST    GETDT0          ;WAIT TILL THRU BEFORE CONTINUING\r
+GETDT1:        AOSE    DTREQ           ;CAN I HAVE IT\r
+       PUSHJ   PDP,DTWAIT      ;NO. COME BACK LATER\r
+       LDB     TAC,PUNIT       ;HAVE CONTROL NOW\r
+       LSH     TAC,11          ;CONNECT TO DTA\r
+       CONO    DTC,30000(TAC)  ;SEE IF TAPE IS OK\r
+       CONSZ   DTS,100         ;SELECT ERROR?\r
+       JRST    QUEST           ;YES. COMPLAIN\r
+       TLNE    IOS,IO          ;NO. TRYING TO WRITE TAPE?\r
+       CONSO   DTS,4000        ;YES. WRITE PROTECTED?\r
+       SKIPA   TAC,QUANTL      ;NO. EVERYTHING IS OK\r
+       JRST    QUEST           ;YES. COMPLAIN\r
+       HRRZM   TAC,QUANTM      ;SFT UP NUMBER OF BLOCK TO KEEP CONTROL FOR\r
+       CONO    DTC,10000       ;DESELECT CONTROL SO FNDBLK TEST\r
+                               ;WILL WORK RIGHT (CONCO DTC,20000)\r
+       MOVEM   DEVDAT,USEWRD   ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
+       JRST    SETACT          ;LIGHT IOACT AND RETURN\r
+\r
+;COME HERE TO COMPLAIN ABOUT UNIT NOT RIGHT (SELECT OR PROTECT ERROR)\r
+QUEST: PUSHJ   PDP,THRUTD      ;GIVE UP CONTROL\r
+       PUSHJ   PDP,HNGSTP      ;TYPE "DTAN OK?"\r
+                               ;NOTE -- AC BLK (=ITEM) USED TO BE\r
+                               ; PUSHED HERE, BUT IS NOT ANY LONGER\r
+                               ; BECAUSE HNGSTP NOW PRESERVES IT,\r
+                               ; AND THE STACK IS VERY FULL.\r
+       JRST    GETDT1          ;GET CONTROL AGAIN AND RETRY\r
+\f      EXTERN  JOBDDT,USRDDT\r
+;DUMP MODE INPUT\r
+DMPI:  IFN     CPBIT, <\r
+       HRRZ    AC2,IBLK(DEVDAT)\r
+>\r
+       TLZ     IOS,IO\r
+       PUSHJ   PDP,DMPSET      ;SET UP DUMP-MODE STUFF\r
+       JRST    ZERCOR          ;ZER USER'S CORE IF SAVE-MODE\r
+\r
+\r
+;INPUT UUO\r
+UIN:   TLZ     IOS,IO\r
+       HRRZ    BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
+       PUSHJ   PDP,STOIOS\r
+       TRNE    IOS,UDSD        ;NON STANDAR?\r
+       JRST    READBF\r
+       JUMPE   BLK,EOF         ;0 MEANS EOF\r
+       PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK NUMBER\r
+       TLNN    IOS,DMPMOD      ;DUMP MODE?\r
+\r
+       CAIE    BLK,DIRBLK      ;TRYING TO READ DIRECTORY?\r
+       JRST    READBF          ;NO. GO READ\r
+\r
+;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
+       PUSHJ   PDP,DIRCHK      ;READ IT IF IT ISN'T IN ALREADY\r
+       HRL     TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+       MOVEI   TAC1,@DEVIAD(DEVDAT)  ;WHERE USER WANTS IT\r
+       HRRI    TAC,1(TAC1)     ;LOC OF DATA\r
+       BLT     TAC,200(TAC1)   ;GIVE IT TO HIM\r
+       PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
+       JFCL\r
+       POPJ    PDP,\r
+\f;CHECK VALIDITY OF BLOCK NUMBER\r
+BLKCHK:        CAIG    BLK,TOPBLK      ;LEGAL?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       POP     PDP,TAC\r
+       TROA    IOS,IOBKTL      ;NO. LIGHT ERROR BIT\r
+\r
+;INPUT BLOCK = 0 - END OF FILE\r
+EOF:   TLO     IOS,IOEND       ;LIGHT EOF BIT\r
+       TLNN    IOS,DMPMOD\r
+       JRST    STOIOS\r
+       JRST    DMPEOF          ;GIVE UP CONTROL IF DUMP-MODE\r
+\r
+;ZERO USER'S CORE ON SAVE-MODE INPUT\r
+ZERCOR:        MOVEI   TAC,JOBDDT(PROG) ;ZERO CORE\r
+       HRLI    TAC,1(TAC)\r
+       MOVSS   TAC             ;BLT POINTER\r
+       HRRZ    TAC1,DMPLST(DEVDAT)  ;TOP CELL TO ZERO (-175)\r
+       ADDI    TAC1,(PROG)     ;RELOCATE TO USER AREA\r
+       SETZM   -1(TAC)         ;ZERO\r
+       BLT     TAC,(TAC1)\r
+       SETZM   USRDDT          ;DDT IS KEPT IN PROTECTED PART\r
+       JRST    UIN\r
+\f;DUMP MODE OUTPUT\r
+DMPO:  PUSHJ   PDP,DIRCHK      ;MAKE SURE DIRECTORY IS IN CORE\r
+       IFN     CPBIT, <\r
+       HRRZ    AC2,OBLK(DEVDAT)\r
+>\r
+       TLO     IOS,IO\r
+       PUSHJ   PDP,DMPSET      ;SET DUMPO-MODE POINTERS\r
+       JFCL\r
+\r
+;OUTPUT UUO\r
+UOUT:  TLO     IOS,IO\r
+       TRNE    IOS,UDSD        ;NON STANDARD?\r
+       JRST    UOUT2           ;YES\r
+       PUSHJ   PDP,DIRCHK      ;NO. MAKE SURE DIRECTORY IS IN CORE\r
+       TLO     IOS,IO          ;IF DIRCHK READ, IO WENT OFF\r
+       HRRZ    BLK,OBLK(DEVDAT)\r
+       CAIN    BLK,DIRBLKK     ;CHECK IF WRITING DIRECTORY\r
+       JRST    COR2HM          ;YES, WRITE CORE IMAGE\r
+       JUMPE   BLK,FAKAV       ;DONT WRITE IF NO BLOCK GIVEN\r
+\r
+       PUSHJ   PDP,BLKCHK      ;CHECK FOR LEGAL BLOCK\r
+UOUT2: TLNN    IOS,DMPMOD      ;ALREADY HAVE CONTROL IF DUMP-MODE\r
+       PUSHJ   PDP,GETDT       ;GET DEC TAPE CONTROLLER\r
+FILBUF:\r
+DTOCHK:        TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPFIL          ;YES, FILL BUFFER FROM LIST\r
+       MOVSI   TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
+       ADD     TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
+       BLT     TAC,BUF+177     ;GO BLT IT\r
+       TLZ     IOS,NOLINK\r
+\fOUFULL:       TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       JRST    OUTBL2          ;YES, NO FILE-STRUCTURED OPERATIONS\r
+       HLRE    BLK,BUF         ;IS IT?\r
+       JUMPL   BLK,LSTBLK      ;YES, - LAST BLOCK OF FILE\r
+       JUMPN   BLK,OUTBLK      ;IF NON-0 - YES\r
+       TLNE    IOS,DMPCLS      ;NO. LAST BLOCK OF A DUMPO FILE?\r
+                       ;DMPCLS WILL BE TURNED OFF AT THE INTERRUPT\r
+       JRST    OUTBLK          ;YES. LINK MUST STAY 0\r
+OUCOMP:        PUSHJ   PDP,USRFRE      ;COMPUTE NEXT BLOCK\r
+       TLO     IOS,NOLINK      ;THIS BLOCK NOT LINKED\r
+OUTBLK:        HRLM    BLK,BUF          ;SAVE LINK IN 1ST WORD OF BLOCK\r
+       MOVE    TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
+       DPB     TEM,[POINT 10,BUF,27]\r
+       HRRZ    TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
+       HRRM    BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
+       MOVE    BLK,TEM\r
+       PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK\r
+       PUSHJ   PDP,MARKDR      ;MARK BLOCK TAKEN IN DIRECTORY\r
+       SKIPA   BLK,TEM\r
+OUTBL2:        HRRZ    BLK,OBLK(DEVDAT)\r
+       PUSHJ   PDP,STOIOS\r
+\r
+WRTBLK:        PUSHJ   PDP,FNDBLK      ;GO SEARCH FOR BLOCK\r
+       MOVE    TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE\r
+       JRST    RDWRT\r
+\f;WRITE LAST BLOCK\r
+LSTBLK:        MOVEI   BLK,0           ;LINK=0\r
+       JRST    OUTBLK          ;GO WRITE LAST BLOCK\r
+\r
+;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
+COR2HM:        MOVEI   TAC,@DEVOAD(DEVDAT)  ;WHERE IT IS\r
+       HRLI    TAC,1(TAC)      \r
+       HRR     TAC,DLOC(DEVDAT)        ;WHERE TO PUT IT\r
+       MOVEI   TAC1,177(TAC)\r
+       BLT     TAC,(TAC1)\r
+       TLO     IOS,CHNGDR      ;REMEMBER TO WRITE IT OUT\r
+       MOVSI   TAC1,DVDIRI\r
+       ORM     TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
+FAKADV:        TLZE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    THRUTD          ;YES. GIVE UP CONTROL\r
+       PUSHJ   PDP,ADVBFE      ;ADVANCE BUFFERS\r
+       JFCL\r
+       TLZ     IOS,NOLINK      ;DIRECTORY BLOCK IS NOT LINKED\r
+       SETZM   OBLK(DEVDAT)\r
+       JRST    STOIOS\r
+\f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
+DMPSET:        PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       TLO     IOS,DMPMOD      ;LIGHT BIT\r
+       PUSHJ   PDP,COMCHK      ;CHECK VALIDITY OF LIST\r
+       JRST    SVADER          ;NG. GIVE ADRESS ERROR\r
+       SKIPL   TAC,@UUO        ;OK. NULL LIST?\r
+       JRST    DMPTS1          ;YES. RETURN\r
+       IFN CPBIT, <\r
+       TRNE    IOS,UDSD        ;NO. NON-STD MODE?\r
+       SOJA    DAT,TDUSER      ;YES. GO ELSEWHERE\r
+>\r
+DMPST2:        SOS     UUO             ;NO. SAVE START OF LIST (-1)\r
+       MOVEM   UUO,DMPLST(DEVDAT)\r
+       JRST    CPOPJ1\r
+\r
+DMPTS1:        POP     PDP,TAC\r
+       JRST    THRUTD\r
+\r
+       IFN CPBIT, <\r
+;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
+TOUSRF:        JUMPE   AC2,NOBLK0      ;CANT READ BLK 0 IN NON-STD DUMP  MODE\r
+       ASH     DAT,-7          ;NUMBER OF WRDS IN LIST /200\r
+       AOS     DAT\r
+       MOVEM   DAT,BLKCNT      ;SAVE TO UPDATE POSITION\r
+       MOVEI   UUO,@UUO        ;REAL ADDRESS OF LIST\r
+TOUSR1:        MOVEM   UUO,USPNTR      ;SAVE IT\r
+       MOVEM   UUO,SVPNTR\r
+       ADDI    TAC,(PROG)      ;RELOCATE ADDRESS OF 1ST IOWD\r
+       MOVEM   TAC,PNTR        ;AND SAVE IT\r
+       MOVE    TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN\r
+       MOVEM   TAC,DTALC2      ;IOWD IS EXHAUSTED\r
+       HRRZM   PROG,ADRPRG     ;SAVE JUST ADDRESS OF PROG\r
+       TLO     IOS,NOBUF       ;INDICATE DIRECTLY TO USER\r
+       TLNN    IOS,IO\r
+       JRST    CPOPJ1          ;READING - CONTINUE\r
+       POP     PDP,TAC         ;WRITING - THIS WILL SAVE LOTS OF TIME\r
+       JRST    OUTBL2\r
+\r
+NOBLK0:        TRO     IOS,IOIMPM\r
+       POP     PDP,TAC         ;RETURN TO UUOCON WITH ERROR BIT SET\r
+       JRST    THRUTD\r
+>\r
+\f;FILL OUTPUT BUFFER FROM LIST\r
+DMPFIL:        MOVSI   TAC1,-177\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD\r
+       SUB     TAC1,ONEONE     ;200 DATA WORDS IF NON-STANDARD\r
+>\r
+DMPFLB:        PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
+       JRST    DMPOTH          ;END OF LIST\r
+DMPLFA:        MOVE    TEM,(TAC)       ;GET NEXT WORD\r
+       MOVEM   TEM,BUF+1(TAC1) ;INTO BUFFER\r
+       AOBJP   TAC1,DMPOVR     ;BUFFER FULL IF GOES\r
+       AOBJN   TAC,.-3         ;GET NEXT WORD FROM COMMAND\r
+       JRST    DMPFLB          ;GET NEXT COMMAND\r
+\r
+DMPOTH:\r
+       IFE     CPBIT, <\r
+       TRNN    IOS,UDSD\r
+>\r
+       HRRZM   TAC1,BUF        ;LIST RAN OUT  SAVE WORD COUNT\r
+       SETZM   BUF+1(TAC1)     ;ZERO REST OF BUFFER\r
+       HRRZI   TAC1,BUF+2(TAC1)\r
+       CAILE   TAC1,BUF+177    ;JUST ZERO 1 WORD IF AT TOP\r
+       JRST    OUFULL\r
+       HRLI    TAC1,-1(TAC1)\r
+       BLT     TAC1,BUF+177    ;****TEST IF TOP OF BUFFER\r
+       JRST    OUFULL          ;NOW WRITE BUFFER\r
+\r
+;BUFFER FULL BEFORE END OF COMMAND\r
+DMPOVR:        AOBJN   TAC,.+3         ;WAS THAT LAST WORD OF COMMAND?\r
+       PUSHJ   PDP,NXTCOM      ;YES. GET NEXT\r
+       MOVEI   TAC,0\r
+       MOVEM   TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
+DMPOVA:        MOVEI   TAC,177\r
+       IFE     CPBIT, <\r
+       TRNN    IOS,UDSD\r
+>\r
+       MOVEM   TAC,BUF         ;WD CNT =177\r
+       JRST    OUFULL          ;GO WRITE PART OF STUFF\r
+\r
+;GET NEXT COMMAND FROM LIST\r
+NXTCOM:        SKIPN   DMPLST(DEVDAT)  ;END OF COMMANDS?\r
+       JRST    NXTCM2          ;YES. RETURN\r
+       AOSA    TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
+NXTCM1:        HRRM    TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
+       MOVE    TAC,@TAC        ;GET COMMAND\r
+       JUMPE   TAC,NXTCM2      ;END OF LIST\r
+       JUMPG   TAX,NXTCM1      ;GO-TO WORD\r
+       ADDI    TAC,(PROG)      ;REAL COMMAND - ADD RELOCATION\r
+       AOJA    TAC,CPOPJ1      ;AND RETURN\r
+\f;END OF DUMP-MODE LIST\r
+NXTCM2:        SETZM   SVDWRD(DEVDAT)  ;ZERO POINTERS\r
+       SETZM   DMPLST(DEVDAT)\r
+       POPJ    PDP,\r
+\r
+DMPFLC:        SKIPE   TAC,SVDWRD(DEVDAT)      ;IS THERE ANOTHER COMMAND\r
+       JRST    DMPFLA          ;YES. GET IT\r
+       JRST    DMPTH2          ;NO. THROUGH\r
+\fDTC=320\r
+DTS=324\r
+\r
+;IO INTERFACE\r
+READBF:        TLNN    IOS,DMPMOD      ;HAVE CONTROL IF DUMP-MODE\r
+                               ; UNLESS ON A LOOKUP, IN WHICH\r
+                               ; CASE ALWAYS GET DT CONTROL\r
+RDBLUK:        PUSHJ   PDP,GETDT       ;GET DT CONTROL\r
+\r
+READBC:        PUSHJ   PDP,FNDBLK      ;SEARCH FOR RIGHT BLOCK\r
+       MOVE    TAC1,[BLKI DTC,300] ;FOUND IT - START READING\r
+\r
+;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
+RDWRT: HLLM    TAC1,IOWD       ;BLKI OR BLKO\r
+       HRLI    TAC,-200\r
+       TLNN    IOS,RWDIR       ;WRITING (READING) DIRECT?\r
+       SKIPA   TAC,BFPNTR      ;NO. INTO BUF\r
+       HRR     TAC,DLOC(DEVDAT)        ;YES. LOC OF DIRECTORY\r
+       CONSZ   DTC,100000      ;IN REVERSE?\r
+\r
+       JRST    IORVRS          ;YES\r
+       SOS     TAC             ;ADDRESS -1\r
+       MOVE    TEM,IOWD        ;GET IOWD\r
+IOGO:  MOVEM   TEM,DTALOC      ;SET UP INTERRUPT LOCATION\r
+       IFN CPBIT, <\r
+       TLNE    IOS,NOBUF       ;IF DIRECTLY TO USER\r
+       JRST    IOGO2           ;DTALC2, PNTR ALREADY SET UP\r
+>\r
+       MOVEM   TAC,PNTR        ;POINTER\r
+       MOVE    TAC,[JSR DTATHR]        ;SET UP INTERRUPT LOC+1\r
+       MOVEM   TAC,DTALC2\r
+IOGO2: CONO    DTC,DTBOTH(TAC1) ;START READ OR WRITE\r
+       CONO    DTS,770000      ;ENABLE FOR ALL INTERRUPTS\r
+       POPJ    PDP,            ;DISMISS INTERRUPT\r
+\f;HERE IF TAPE IS GOING IN REVERSE WHEN BLOCK NUMBER FOUND\r
+IORVRS:        ADDI    TAC,176         ;START AT TOP OF BUFFER\r
+       MOVE    TEM,[JSR RVERS]\r
+       JRST    TOGO            ;COMPILCATED STUFF FOR EACH WORD\r
+\r
+;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
+RVERS: 0\r
+IOWD:  BLKI    DTC,PNTR        ;READ (WRITE) A WORD\r
+                               ; NOTE -- THIS LOCATION IS IMPURE.\r
+                               ; MODIFIED TO A BLKI OR BLKO.\r
+       JRST    RVTHRU          ;POINTER RAN OUT\r
+       SOS     PNTR            ;POINTER HAS TO BACK UP\r
+       SOS     PNTR\r
+       JEN     @RVERS          ;DISMISS THE INTERRUPT\r
+\r
+;HERE WHEN POINTER RUNS OUT IN REVERSE\r
+RVTHRU:        CONO    DTS,770001      ;FUNCTION STOP\r
+       JEN     @RVERS          ;DISMISS\r
+\r
+;HERE WHEN POINTER RUNS OUT FORWARD\r
+DTATHR:        0\r
+       CONO    DTS,770001      ;FUNCTION STOP\r
+       JEN     @DTATHR         ;DISMISS\r
+\f;HERE TO PERFORM A REWIND MTAPE FOR DTA\r
+MTAP0: PUSHJ   PDP,GETDT       ;GET THE CONTROL FOR THE TAPE\r
+       LSH     TAC1,15         ;TAC1=0 FOR REQ; 10 FOR REW UNLD\r
+       TDZ     IOS,[XWD IO,IOACT] ;SET UP IOS\r
+       TLO     IOS,REWBIT+RVERSE(TAC1)\r
+       MOVEI   BLK,0           ;SEARCH FOR BLOCK 0\r
+       PUSHJ   PDP,FNDBLK      ;GO FIND BLOCK\r
+\r
+;CONTROL COMES HERE ON INTERRUPT CHANNEL WHEN THE BLOCK IS FOUND\r
+       TLNE    IOS,RUNBIT      ;REWIND UNLOAD?\r
+       JRST    .+3             ;YES, CONTINUE\r
+       CONO    DTS,770001      ;NO, THROUGH WITH TAPE. - FNCTN STOP\r
+       POPJ    PDP,            ;DISMISS INTERRUPT\r
+       MOVE    TAC,RUNWD       ;USE THE CLOCK TO DESELECT THE TAPE\r
+       JSR     CLKREQ          ;FOR A WHILE - IT WILL GO OFF THE END\r
+       CONO    DTC,410000      ;DESELECT THE TAPE SO IT CAN GO OFF\r
+       POPJ    PDP,            ;DISMISS THE INTERRUPT\r
+RUNWD: XWD     RUNCLK,200\r
+\r
+;COME HERE ON THE CLOCK LEVEL FOR REWIND AND UNLOAD\r
+RUNCLK:        MOVE    DEVDAT,USEWRD\r
+       LDB     TAC,PUNIT       ;GIVE CONO TO READ BLOCK NOS IN FORWARD\r
+       LSH     TAC,11          ;DIRECTION - THIS WILL CAUSE FULL REEL\r
+       CONO    DTC,230200(TAC);TO STOP FLAPPING WHEN CONO STOP IS DONE\r
+       MOVE    IOS,DEVIOS(DEVDAT)  ;RESET IOS\r
+       JRST    REWDUN          ;DECREASE DTREQ. STOP TAP\r
+\r
+;HERE TO PUT C(TAC) IN THE CLOCK QUEUE\r
+CLKREQ:        0\r
+       CONO    PI,PIOFF        ;TURN OFF PI\r
+       IDPB    TAC,CLOCK\r
+       CONO    PI,PION\r
+       JRST    @CLKREQ\r
+\f      EXTERN  JOB\r
+       EXTERN  HNGSTP\r
+;COME HERE TO START READING BLOCK NUMBERS\r
+FNDBLK:        HRRZM   BLK,BLOCK       ;BLOCK WE'RE LOOKING FOR\r
+       POP     PDP,DISPAD(DEVDAT) ;WHERE TO GO WHEN RIGHT BLOCK FOUND\r
+       SETZM   ERRCNT\r
+FNDBL2:        LDB     TAC,PUNIT       ;GET UNIT NUMBER\r
+       LSH     TAC,11          ;POSITION IT\r
+       CONSZ   DTC,20000       ;TAPE SELECTED?\r
+       JRST    FNDBL4          ;YES\r
+       TRO     TAC,230000      ;NO, SET TO SELECT TAPE FORWARD\r
+       TLNE    IOS,RVERSE+NOBUF ;REVERSE OR DIRECT TO USER?\r
+       TRC     TAC,300000      ;YES. SET FOR REVERSE\r
+FNDBL3:        TRO     TAC,DTBOTH      ;ADD PI ASSIGNMENT\r
+       MOVE    TEM,[JSR SRCH]  ;SET UP PI LOCS FOR SEARCH\r
+       MOVEM   TEM,DTALOC      ;INTO PI INTERRUPTCELL\r
+       CONO    DTC,200(TAC)    ;START SEARCHING BLOCKS\r
+       CONO    DTS,670000      ;ENABLE FOR ALL BUT JOB DONE\r
+       SETOM   IOWRIT          ;SET SWITCH NON - 0 IF USING\r
+       TLNN    IOS,RWDIR       ;MONITOR BUFFER FOR OUTPUT\r
+       TLNN    IOS,IO          ;SO REKON WONT GIVE CONTROL (AND\r
+       SETZM   IOWRIT          ;BUFFER)  AWAY\r
+       TLZ     IOS,RECKON+IOFST ;TURN OFF DEAD-RECKON BIT\r
+       MOVEM   DEVDAT,USEWRD\r
+       PUSHJ   PDP,STOIOS      ;SAVE IOS\r
+       IFN CPBIT, <\r
+       TLZ     IOS,NOBUFC      ;SET WORD NON-ZERO IF NOBUF ON\r
+       HLRZM   IOS,DIRCTN\r
+>\r
+       POPJ    PDP,            ;AND LEAVE\r
+\r
+FNDBL4:        CONSZ   DTC,200000      ;DIRECTION TEST\r
+       TROA    TAC,200000      ;FORWARD\r
+       TRO     TAC,100000      ;REVERSE\r
+       JRST    FNDBL3          ;START SEARCH\r
+\f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
+SRCH:  0       \r
+       MOVEM   TAC,TEMP        ;SAVE WORKING AC\r
+       CONI    DTS,TAC         ;GET STATUS BITS\r
+       TLNE    TAC,2000        ;IS CONTROL STILL ACTIVE?\r
+       JRST    SRCHD           ;YES. MUST BE IN "PSEUDO END-ZONE"\r
+       DATAI   DTC,TAC         ;NO. READ A BLOCK NUMBER\r
+       TLZ     TAC,-1          ;LEGAL BLOCK NUMBER>\r
+       JRST    SRCHB           ;NO. SET ERROR SWITCH\r
+       SUB     TAC,BLOCK       ;NOW-WANTED\r
+       IFN CPBIT, <\r
+       SKIPE   DIRCTN          ;MUST BE GOING FORWARD IF DUMP-MODE\r
+       JRST    SRCHC           ;DIRECTLY TO USER\r
+>\r
+       JUMPE   TAC,FOUND       ;=0 IF WE'RE THERE\r
+SRCHA: CONSZ   DTC,100000      ;IF TAPE IS IN REVERSE\r
+       MOVNS   TAC             ;SWITCH TURN-AROUND TEST\r
+       JUMPLE  TAC,.+3 ;TEST FOR DISCONNECT IF DIRECTION IS CORRECT\r
+\r
+                               ;***\r
+       CONO    DTC,DTTURN      ;TURN AROUND\r
+       JRST    SRCHXT          ;AND GO AWAY\r
+       MOVMS   TAC\r
+       CAILE   TAC,MINDIS      ;WORTH WHILE TO DISCONNECT TAPE?\r
+       JRST    BEKON           ;YES. GO DISCONNECT\r
+       SKIPLE  DISCON          ;NO. IS THERE A DISCON. TAPE\r
+                               ;WHICH HAS TIMED OUT?\r
+       CAIG    TAC,2           ;YES. WILL THIS SEARCH TAKE LONG?\r
+       SKIPA                   ;NO\r
+       CONO    DTS,670002      ;YES. STOP DISCONNECTED TAPE\r
+       SKIPE   TAC,ALMSWT      ;READING BLOCK NOS OF AN ALMOST ACTIVE DTA?\r
+       JSR     CLKREQ          ;YES., GET ITS JOB BACK INTO MEMORY\r
+SRCHXT:        MOVE    TAC,TEMP        ;RESTORE TAC\r
+       SETZM   ALMSWT\r
+       JEN     @SRCH           ;AND DISMISS THE INTERRUPT\r
+\f;HERE IF AN ILLEGAL BLOCK WAS READ FROM THE TAPE\r
+SRCHR: AOS     TAC,ERRCNT      ;BUMP ERROR COUNT\r
+       CAIG    TAC,DTTRV       ;TRIED ENOUGH?\r
+       JRST    SRCHXT          ;NO. READ ANOTHER BLOCK NUMBER\r
+       SETOM   BLOCK           ;YES. BLOCK = -1 AS AN ERROR SWITCH\r
+       CONO    DTA,770001      ;FUNCTION STOP\r
+       JRST    SRCHXT          ;GO AWAY\r
+\r
+       IFN CPBIT, <\r
+SRCHC: CONSZ   DTC,100000      ;GOING FORWARD?\r
+       TLCA    TAC,400000      ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD\r
+       JUMPE   TAC,FOUND       ;GO IF FOUND FORWARD\r
+       SKIPI   TAC             ;TURN AROUND?>\r
+       CONO    DTC,DTTURN      ;YES\r
+       JRST    SRCHXT          ;READ ANOTHER BLOCK NUMBER\r
+>\r
+\r
+;COME HERE IF CONTROL IS STILL ACTIVE AFTER READING A BLOCK NUMBER\r
+;THIS MEANS THAT TAPE IS IN THE "PSEUDO END-ZONE" - EXTRA FILLERS\r
+;INSERTED FOR THE BENEFIT OF THE PDP-9\r
+SRCHD: CONO    DTC,DTTURN      ;TURN TAPE AROUND\r
+       JRST    SRCHXT          ;AND EXIT THE INTERRUPT\r
+\f;COME HERE WHEN A TAPE IS IN A LONG SEARCH\r
+;IF THIS TAPE HAS NOT USED THE MONITOR BUFFER (READING), AND\r
+;IF NO OTHER TAPES ARE DISCONNECTD, THIS ONE WILL BE,\r
+;AND A CLOCK REQUEST WILL BE ENTERED FOR AN ESTIMATED TIME TO BLOCK.\r
+\r
+REKON: SKIPN   IOWRIT          ;MONITOR BUFFER FULL?\r
+       SKIPGE  DISCON          ;ANOTHER TAPE DISCONNECTED?\r
+       JRST    SRCHXT          ;YES, FORGET IT\r
+       MOVEM   TAC1,FNDTMP     ;SAVE AN AC\r
+       MOVE    TAC1,DISTNC\r
+       SUB     TAC1,TAC        ;CHECK SEQUENCE\r
+       SOJN    TAC1,TRYLTR     ;JUMP IF NOT SEQUENTIAL BLOCKS\r
+       EXCH    DEVDAT,USEWRD   ;NO. DISCONNECT FROM THIS ONE\r
+       MOVSI   TAC1,ALMACT     ;SET TAPE AS ALMOST ACTIVE - SWAPPABLE AND \r
+                               ;SHUFFLABLE EVEN THOUGH ACTIVE\r
+       ORM     TAC1,DEVIOS(DEVDAT)\r
+       LDB     TAC1,PJOBN      ;ASSOCIATED JOB NUMBER\r
+       HRRM    TAC1,MONB2      ;SAVE IN WD 2 OF MONITOR BUFFER\r
+       HRLM    DEVDAT,MONB2    ;SAVE ADDRESS OF DTA\r
+\r
+       CONSZ   DTC,200000\r
+       IMULI   TAC,62          ;COMPUTE A TIME TO BLOCK\r
+       CONSZ   DTC,100000      ;BASED ON 50 MSEC/BLOCK FORWARD\r
+       IMULI   TAC,50          ;AND 40 MSEC/BLOCK IN REVERSE\r
+MSECPT:        IDIVI   TAC,.-.         ;DIVIDE BY NO, MILLISECS/TIC\r
+       CAILE   TAC,3300        ;IF THE COMPUTED TIME IS TOO HIGH\r
+       MOVEI   TAC,30          ;LOOK AGAIN IN 1 1/2 SECOND\r
+       MOVSI   TAC1,RECKON     ;LIGHT A BIT TO INDICATE THE TAPE IS\r
+       IORM    TAC1,DEVIOS(DEVDAT) ;DEAD RECKONING\r
+       MOVE    TAC1,FNDTMP     ;RESTORE TAC1\r
+       HRRM    TAC,TIMREQ      ;SET UP A TIME REQUEST\r
+       LDB     TAC,PUNIT       ;6 BITS OF INFORMATION\r
+       SKIPN   TAC             ;UNIT 0 = 8\r
+       MOVEI   TAC,10\r
+       LSH     TAC,14          ;IS THE UNIT NUMBER\r
+       ADD     TAC,TIMREQ      ;REQUEST THE MONITOR TO WAKE\r
+       JSR     CLKREQ          ;IN N TICKS\r
+       MOVE    TAC,BLOCK       ;SAVE THE BLOCK NO.\r
+       CONSO   DTC,200000      ;AND THE DIRECTION\r
+       TRO     TAC,200000\r
+       HRLM    TAC,IBLK(DEVDAT)  ;IN THE DDB\r
+       CONO    DTC,410000      ;DESELECT THE CONTROL\r
+       ;BIT 400000 IS TO PREVENT ERROR FLAGS FROM COMING IN LATER -\r
+       ; IT DOES NOT CAUSE THE DESELECTED TAPE TO STOP THOUGH\r
+       MOVEI   DEVDAT,0\r
+       EXCH    DEVDAT,USEWRD   ;RESET DEVDAT\r
+       SKIPLE  DISCON          ;SWITCHING DISCONNNECTED TAPES?\r
+       JRST    NXTICK          ;YES. COME BACK LATER\r
+       SOSL    DTREQ           ;NO. COUNT DOWN DTREQ\r
+       SETOM   DTAVAL\r
+       SETOM   DISCON          ;ONLY 1 RECKON AT A TIME\r
+       JRST SRCHXT             ;AND EXIT THE INTERRUPT\r
+\fTRYLTR:       MOVEM   TAC,DISTNC\r
+       MOVE    TAC1,FNDTMP     ;RESTORE TAC1\r
+       JRST    SRCHXT\r
+\r
+;HERE WHEN SWITCHING DISCONNECTED TAPES\r
+;TOO MUCH TO DO ON THE INTERRUPT LEVEL. SO COME BACK ON\r
+;NEXT CLOCK TICK\r
+NXTICK:        MOVE    TAC,TIMRQ2      ;COME BACK IN A JIFFY\r
+       JSR     CLKREQ\r
+       JRST    SRCHXT\r
+\r
+TIMREQ:        XWD     BACK,0\r
+TIMRQ2:        XWD     BACKA,1\r
+\r
+IFN    ALMACT,<\r
+       EXTERN  PRIIN\r
+;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH\r
+;AN "ALMOST ACTIVE" TAPE BACK INTO CORE\r
+ALMREQ:        XWD     .+1,1\r
+       MOVE    DEVDAT,USEWRD   ;DDB LOC\r
+       LDB     ITEM,PJOBN      ;JOB NUMBER\r
+       PUSHJ   PDP,PRIIN       ;TELL SWAPPER TO GET IT\r
+       JFCL\r
+       MOVSI   TAC,ALMACT\r
+       ANDCAM  TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN\r
+       POPJ    PDP,\r
+\r
+;HERE WHEN SWAPPER DOES GET THE JOB BACK INTO CORE\r
+SWPBAK:        MOVE    IOS,DEVIOS(DEVDAT)\r
+       SETM    MONB2           ;CLEAR JOB NO, FROM MON BUFFER\r
+       TLNN    IOS,IOFST       ;WAS JOB SWAPPED OUT WHEN DATA FINISHED?\r
+       POPJ    PDP,            ;NO. TRANSFER COMPLETED\r
+       MOVE    TAC,JBTSTS(ITEM) ;YES, WAS IO ABORTED?>\r
+       TRNN    TAC,ALBORT\r
+       JRST    FAKINT          ;NO. NOW TRANSFER DATA, ADVANCE BUFFERS\r
+       JRST    THRUTP          ;YES. FORGET REST OF OPERATION\r
+>\r
+\f      EXTERN  CIPWTM\r
+;COME HERE FROM THE MONITOR WHEN THE ESTIMATED TIME-TO BLOCK\r
+;HAS EXPIRED\r
+BACK:  SKIPE   USEWRD  ;IS CONTROL AVAILABLE?\r
+       JRST    FLAGIT          ;NO. SET FLAG\r
+       AOS     DTREQ           ;YES. DTREQ WILL BE COUNTED DOWN LATER\r
+       SETZM   DTAVAL\r
+       SETZM   DISCON          ;NO TAPE IS NOW DISCONNECYTED\r
+BACK2: TRZ     TAC,10\r
+       LSH     TAC,11          ;UNIT\r
+       PUSH    PDP,TAC         ;SAVE IT\r
+       LSH     TAC,3\r
+       ADD     TAC,DTADDB      ;CONVERT TO SIXBIT NAME\r
+       PUSHJ   PDP,DEVPHY      ;SET UP DEVDAT FOR IT\r
+       HALT    .               ;******************************\r
+       MOVEM   DEVDAT,USEWRD   ;RESET USEWRD\r
+       HLRZ    TAC1,IBLK(DEVDAT) ;BLOCK NEEDED\r
+       DPB     TAC1,[POINT 10,BLOCK,35]\r
+       HRRZ    TAC,CLOCK\r
+\r
+       HRLI    TAC1,CPOPJ      ;FIND CLOCK-QUEUE REFERENVCE TO BACKC\r
+BACK3: CAIN    TAC,CIPWTM\r
+       JRST    BACKD           ;NOT THERE, TAPE MUST HAVE BEEN STOPPED\r
+       HLRZ    TEM,(TAC)       ;ADDRESS OF CLOCK REQUEST\r
+       CAIE    TEM,BACKC       ;THIS THE ONE?\r
+       SOJA    TAC,BACK3       ;NO. KEEP LOOKING\r
+       HLLM    TAC1,(TAC)      ;YES. MAKE A NO-OP OUT OF IT\r
+BACKD: POP     PDP,TAC         ;UNIT\r
+       TRO     TAC,270000      ;SET SELECT, DELAY INHIBIT\r
+       TRNE    TAC1,200000     ;SET DIRECTION\r
+       TRC     TAC,300000      ;LREVERSE\r
+       MOVE    IOS,DEVIOS(DEVDAT) ;RESTORE OS\r
+IFN    ALMACT, <       ;UNTIL REST OF SCHEDR, SWAPPER IS FIXED - IGNORE\r
+       MOVE    TAC1,ALMREQ     ;INDICATE CONNECTING TO AN ALMOST\r
+       MOVEM   TAC1,ALMSWT     ;ACTIVE TAPE, SO JOB WILL BE BROUGHT\r
+                               ;BACK IN IF TAPE CLOSE TO TARGET BLOCK\r
+>\r
+       JRST    FNDBL3          ;READ NEXT BLOCK NUMBER\r
+\f;HERE WHEN TIME IS UP AND ANOTHER TAPE HAS THE CONTROL\r
+FLAGIT:        MOVEM   TAC,DISCON      ;DISCON POSITIVE IF NEED THE CONTROL\r
+       MOVE    TAC,.+3         ;SET A CLOCK REQUEST TO STOP TAPE\r
+       JSR     CLKREQ\r
+       POPJ    PDP,            ;RETURN, WILL COME IN ON INTERRUTP LEVEL\r
+       XWD     BACKC,10\r
+\r
+;HERE WHEN DTASER CAN GIVE UP THE CONTROL\r
+BACKB: CONO    DTC,400000      ;STOP CURRENT TAPE\r
+       PUSHJ   PDP,THRUTA      ;GIVE IT UP\r
+       TDZA    TAC,TAC         ;DISCON WILL GO TO 0\r
+\r
+BACKA: SETOM   TAC             ;DISCON WILL GO TO -1\r
+       EXCH    TAC,DISCON      ;UNIT TO CONNECT TO\r
+       JRST    BACK2           ;GO RECONNECT\r
+\r
+;IF WE GET HERE THERE IS A SLOW TAPE ON THE SELECTED DRIVE\r
+BACKC: CONO    PI,PIOFF ;CANT RISK CHANGING THE INTERRUPT ENABLES HRE\r
+       CONI    DTS,TAC         ;READ IN ENABLE FLAGS\r
+       HLRZS   TAC             ;FLAGS INTO R.H.\r
+       ANDI    TAC,770000      ;ONLY ENABLE FLAGS\r
+       CONO    DTS,2(TAC)      ;STOP THE DESELECTED TAPE\r
+       CONO    PI,PION\r
+       POPJ    PDP,            ;BEFORE RUNNING OFF END OF THE REEL\r
+\f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
+FOUND: MOVEM   TAC1,FNDTMP     ;SAVE THOSE ACS THAT WILL BE USED\r
+       MOVEM   TEM,RVERS\r
+       EXCH    DEVDAT,USEWRD\r
+       EXCH    IOS,DEVIOS(DEVDAT)\r
+       ECHO    PDP,FNDPDP\r
+       PUSHJ   PDP,@DISPAD(DEVDAT)     ;GO TO DISPATCH LOCATION\r
+       EXCH    PDP,FNDPDP              ;RESTORE ACS\r
+       EXCH    IOS,DEVIOS(DEVDAT)\r
+       EXCH    DEVDAT,USEWRD\r
+       MOVE    TAC,TEMP\r
+       MOVE    TAC1,FNDTMP\r
+       MOVE    TEM,RVERS\r
+       JEN     @SRCH           ;EXIT THE INTERRUPT\r
+\r
+FNDPDP:        XWD     -2,.\r
+       0\r
+\r
+       IFN CPBIT, <\r
+;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
+DMPADV:        0\r
+       MOVEM   TAC,TEMP\r
+       AOSA    TAC,USPNTR      ;ADVANCE LOC OF POINTER\r
+DMPAV1:        HRRM    TAC,USPNTR\r
+       SKIPN   TAC,@TAC        ;END OF LIST?\r
+       JRST    DMPAV3          ;YES. STOP TAPE\r
+       ADD     TAC,ADRPRG      ;ADD RELOCATION\r
+       JUMPG   TAC,DMPAV1\r
+       MOVEM   TAC,PNTR        ;NEW POINTER\r
+DMPAV2:        MOVE    TAC,TEMP        ;RESTORE TAC\r
+       JEN     @DMPADV\r
+\r
+\r
+DMPAV3:        CONO    DTS,770001      ;GIVE FUNCTION STOP\r
+       JRST    DMPAV2          ;RESTORE TAC AND EXIT THE INTERRUPT\r
+\r
+>\r
+\f;INTERRUPT HERE FOR FLAG CHANNEL\r
+DTAINT:        CONSO   DTS,770000      ;INTERRUPT FOR DTA?\r
+       JRST    .               ;NO\r
+       CONSZ   DTS,20000       ;END ZONE?\r
+       SKIPGE  BLOCK           ;YES. BAD BLOCK NUMBER?\r
+       SKIPA                   ;YES\r
+       JRST    TURN            ;NO. TURN TAPE AROUND\r
+       JSR     DTASAV          ;SAVE ACS\r
+FAKINT:        MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
+       MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
+       LDB     ITEM,PJOBN      ;JOB NUMBER\r
+IFN ALMACT,<\r
+       PUSHJ   PDP,PRIIN               ;IS JOB SWAPPED OR SHUFFLED?\r
+       JRST    SWPDLY          ;YES, CANT MOVE BUFFERS NOW\r
+>\r
+       MOVE    PROG,JBTADR(ITEM)       ;ADDRESS\r
+DTAIN1:        TLZE    IOS,REWBIT      ;NO, FROM A REWIND MTAPE?\r
+       JRST    REWDUN          ;YES. DONE\r
+       TLZE    IOS,IOFST       ;COMING FROM SWAP DELAY ROUTINE?\r
+       JRST    DTAIN2          ;YES, TD10 HAS BEEN ZAPPED\r
+       CONSZ   DTS,100000      ;JOB DONE?\r
+       CONSZ   DTS,670000      ;AND NO ERRORS?\r
+       JRST    ERRS            ;NO. TOUGH LUCK\r
+       SKIPGE  BLOCK           ;BAD BLOCK NUMBER ON TAPE?\r
+DTAIN2:        TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPTHR          ;YES. GO ELSEWHERE\r
+       TLNN    IOS,SINGL\r
+       JRST    .+3\r
+       LDB     TAC,[POINT 10,BUF,27]  ;GET 1ST BLOCK NO. IF READ\r
+                               ;CAME FROM LOOKUP\r
+       MOVEM   TAC,IBLK(DEVDAT)  ;STORE IN DDB\r
+       TLZE    IOS,IOW         ;NO. IN IO WAIT?\r
+       PUSHJ   PDP,SETIOD      ;YES. TAKE OUT OF WAIT\r
+       TLZE    IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR\r
+                                       ;CLOSING DUMP FILE?\r
+       JRST    THRUTP          ;YES. LEAVE\r
+       TLNE    IOS,IO          ;WRITING?\r
+       JRST    OUTHRU          ;YES\r
+\fEXTERN        JBTSTS,PJOBN\r
+\r
+;HERE ON END OF AN INPUT BLOCK\r
+       HRROI   TAC1,177        ;MASK OUT 1ST-BLK DATA\r
+       TRNN    IOS,UDSD        ;UNLESS IN NON-STD\r
+       ANDM    TAC1,BUF\r
+       MOVEI   TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
+       ADD     TAC,[XWD BUF,1];FROM BUF TO THERE\r
+       MOVEI   TAC1,177(TAC)\r
+       BLT     TAC,(TAC1)      ;TRANSFER IT\r
+       HLRZ    BLK,BUF         ;NEXT BLOCK TO READ\r
+       TRNE    IOS,UDSD        ;IF NON-STD\r
+       AOSA    BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS\r
+       HRRM    BLK,IBLK(DEVDAT) ;DAVE IN DDB\r
+       TRNE    IOS,IODTER+IODERR+IOIMPM\r
+       JRST    THRUIN\r
+       PUSHJ   PDP,ADVBUFF     ;GET NEXT BUFFER\r
+       JRST    THRUIN          ;EMPTY BUF NOT AVAILABLE\r
+\r
+       SKIPLE  DISCON          ;TAPE TIMED OUT?\r
+       JRST    BACKB           ;YES. GO RECONNECT\r
+       SKIPE   BLK             ;EXIT  IF EOF OR BLOCK TOO LARGE\r
+       CAILE   BLK,TOPBLK      ;THE ERROR WILL BE CAUGHT ON THE\r
+       JRST    THRUIN          ;UUO LEVEL NEXT TIME AROUND\r
+       SOSGE   QUANTM          ;HAS TAPE HAD CHAN LONG ENOUGH?\r
+       SKIPG   DTREQ           ;YES. ANYONE ELSE WANT IT?\r
+       JRST    READBC          ;NO. READ NEXT BLOCK\r
+\r
+THRUIN:        HRRZ    TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN?\r
+       JUMPN   TAC,THRUTP      ;YES. DONT CHANGE REVERSE BIT\r
+       TLZ     IOS,RVERSE      ;NO. SET IOS BIT TO CORRECT DIRECTION\r
+       CONSZ   DTC,100000\r
+       TLO     IOS,RVERSE\r
+\f;HERE WHEN TAPE IS DONE\r
+THRUTP:        SKIPLE  TAC,DISCON      ;TAPE TIMED OUT?\r
+       JRST    BACKB           ;YES\r
+       CONO    DTC,400000      ;STOP TAPE\r
+THRUTD:        SOSL    DTREQ           ;BUMP COUNT DOWN\r
+       SETOM   DTAVAL          ;TELL SCHEDULER\r
+THRUTA:        CONO    DTC,10000       ;DESELECT CONTROL\r
+       TLZ     IOS,DMPMOD+NOBUF+DMPCLS+PEWBIT+RUNBIT\r
+       SETZM   USEWRD          ;INDICATE CONTROL NOW FREE\r
+       JRST    CLRACT          ;RESET IOACT AND RETURN\r
+\r
+;COME HERE IF A TAPE IS HUNG\r
+HUNGTP:        JUMPGE  IOS,THRUTP      ;GIVE UP CONTROL IF NOT DEAD-RECKONING\r
+       JRST    CPOPJ1          ;IGNORE IT IF DEAD RECKONING -\r
+;WHEN THE TAPE TIMES OUT FNDBLK WILL RESET THE HUNG TIME, AND\r
+;IF IT IS STILL HUNG AT ITS END THE ERROR MESSAGE WILL OCCUR\r
+\r
+       INTERN  FTSWAP\r
+       EXTERN  SHFWAT\r
+;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT\r
+;CONTROL GETS HERE IF SWP OR SHF IS ON IN JBTSTS\r
+;IO THE JOB IS CURRENTLY SWAPPED OR SHUFFLED WE MUST DELAY\r
+;SO TEST JOB NO AGAINST SHFWAT (IF SHUFFLE) OR FORCE (IF SWAP) TO DETERMINE\r
+;IF JOB IS REALLY IN THAT STATE, OR IF MONITOR HAS LIT THE BIT\r
+;IN ANTICIPATION OF PUTTING THE JOB IN THAT STATE\r
+SWPDLY:\r
+\r
+       IFN FTSWAP, <\r
+       EXTERN  FORCE\r
+       TLNE    TAC1,SWP        ;SWAPPED JOB?\r
+       SKIPA   TAC,FORCE       ;YES.\r
+>\r
+       MOVE    TAC,SHFWAT      ;NO. SHUFFLED?\r
+       CAMN    ITEM,TAC        ;JOB REALLY SWAPPED OR SHUFFLED?\r
+       JRST    DTAIN1          ;NO, FINISH THIS DATA OPERATION\r
+       CONO    DTC,400000      ;YES, STOP TAPE (WE MUST DELAY)\r
+       TLO     IOS,IOFST       ;INDICATE JOB WAS DELAYED (FOR FAKINT)\r
+       MOVE    TAC,[XWD FAKINT,1] ;IF JOB IS CURRENTLY BEING SHUFFLED\r
+       TLNN    TAC,SWP         ;COME BACK ON NEXT CLOCK INTERRUPT, AT WHICH TIME\r
+       JSR     CLKREQ          ;THE BLT MUST HAVE FINISHED\r
+       JRST    STOIOS          ;AND GO AWAY\r
+\f;HERE ON END OF OUTPUT BLOCK\r
+OUTHRU:        PUSHJ   PDP,ADVBFE      ;GET NEXT BUFFER\r
+       JRST    THRUTP          ;NOT FULL\r
+       SKIPLE  DISCON\r
+       JRST    BACKB\r
+       HRRZ    BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
+       CAILE   BLK,TOPBLK      ;LEGAL?\r
+       JRST    THRUTP          ;NO. CATCH ERROR ON UUO LEVEL\r
+       SOSGE   QUANTM          ;YES. HAD CHAN LONG ENOUGH?\r
+       SKIPG   DTREQ           ;AND SOMEONE ELSE WANT IT?\r
+       JRST    FILBUF          ;NO. GO WRITE NEXT BLOCK\r
+       JRST    THRUTP          ;YES. GIVE UP TAPE\r
+\r
+;TURN TAPE AROUND AFTER END-ZONE INTERRUPT\r
+TURN:  CONSZ   DTC,500         ;READ BLOCK NUMBERS?\r
+       JRST    DIREOF          ;NO. END ZONE WHILE READING DATA\r
+       CONO    DTC,DTTURN      ;YES. TURN AROUND\r
+       JEN     @DTACHL         ;DISMISS INTERRUPT\r
+\r
+;COME HERE ON AN END ZONE INTERRUPT WHILE READING DATA\r
+;THIS CAN ONLY HAPPEN IN MODE 116,117\r
+;LIGHT IODEND (IT IS A PREMATURE EOF) AND LEAVE\r
+DIREOF:        JSR     DTASAV          ;SAVE ACS\r
+       MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
+       MOVE    IOS,DEVIOS(DEVDAT)      ;AND IOS\r
+       JRST    DMPEOF          ;LIGHT IODEND AND RETURN\r
+\f;COME HERE ON END OF DUMP MODE BLOCK\r
+SVDMTH:        SKIPLE  DISCON          ;HAS A TAPE TIMED OUT\r
+       CONO    DTS,2           ;YES. STOP IT\r
+       IFN CPBIT, <\r
+       TLNE    IOS,NOBUF       ;DIRECTLY TO USER?\r
+       JRST    USDMTH          ;YES. ALMOST THROUGH\r
+>\r
+       MOVSI   TAC1,-177\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD\r
+       SUB     TAC1,ONEONE     ;SET UP TAC1 WITH COUNT\r
+>\r
+       TLNN    IOS,IO\r
+       JRST    SVOMIN          ;INPUT FILE\r
+       HRRZ    BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
+       JUMPF   BLK,DMPTHA      ;LAST BLOCK\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD        ;IF NON-STD MODE\r
+       AOSA    OBLK(DEVDAT)    ;WRITE CONSECUTIVE BLOCKS\r
+>\r
+       CAIG    BLK,TOPBLK      ;NOT LAST. LEGAL BLOCK NUMBER?\r
+       POPJ    PDP,            ;YES. RETURN\r
+\r
+       TRO     IOS,IOBKTL      ;BLOCK TOO LARGE\r
+DMPTHA:        POP     PDP,TAC         ;REMOVE THE RETURN ADDRESS FROM\r
+                               ;CALL TO SVDMTH. SINCE\r
+                               ;NO MORE I/O WILL BE DONE\r
+DMPTH2:        SETZM   SVDWRD(DEVDAT)  ;ZERO DUMP-MODE STUFF\r
+       SETZM   DMPLST(DEVDAT)\r
+DMPTH3:        TLZE    IOS,IOW         ;IS IO WAIT?\r
+       PUSHJ   PDP,SETIOD      ;YES, RESTART JOB\r
+       JRST    THRUTP\r
+\r
+;HERE ON END SAVE MODE INPUT BLOCK\r
+SVDMIN:        HLRZ    BLK,BUF         ;NEXT BLOCK NUMBER\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       AOSA    BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
+>\r
+       HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+       JRST    CPOPJ1\r
+\r
+       IFN CPBIT, <\r
+;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
+USDMTH:        MOVEI   TAC1,IBLK(DEVDAT)\r
+       TLNE    IOS,IO\r
+       MOVEI   TAC1,OBLK(DEVDAT)       ;SET TAC1 TO RIGHT BLOCK NUMBER\r
+       MOVE    TAC,BLKCNT      ;UPDATE BLOCK COUNTER\r
+       ADDM    TAC,(TAC1)\r
+       JRST    DMPTHA          ;THROUGH\r
+>\r
+\f;HERE WHEN THROUGH DUMP MODE BLOCK\r
+DMPTHR:        PUSHJ   PDP,SVDMTH      ;END OF BLOCK HOUSEKEEPING\r
+                               ; RETURN ONLY IF MORE I/O\r
+                               ; WILL BE DONE\r
+       JRST    DMPFLC          ;FILL BUFFER FOR NEXT OUTPUT\r
+\r
+;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
+DMIFIL:        SKIPE   TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
+       JRST    DMIFLB          ;YES. CONTINUE\r
+DMIFLA:        PUSHJ   PDP,NXTCOM      ;NO. GET NEXT COMMAND\r
+       JRST    DMPTH2          ;END OF LIST - THROUGH\r
+DMIFLB:        MOVE    TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
+       MOVEM   TEM,(TAC)       ;GIVE TO USER\r
+       AOBJP   TAC1,.+3        ;IF BUFFER IS FULL\r
+       AOBJN   TAC,DMIFLB      ;GET NEXT WORD\r
+       JRST    DMIFLA          ;GET NEXT COMMAND\r
+\r
+       AOBJN   TAC,.+3         ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
+       PUSHJ   PDP,NXTCOM      ;THAT COM, IS DONE. GET NEXT\r
+\r
+       JRST    DMPTH2          ;END OF LIST - THROUGH\r
+       MOVEM   TAC,SVDWRD(DEVDAT)  ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
+       JUMPE   BLK,DMPEOF      ;IF EOF - LIGHT BIT\r
+RDNXT: CAIG    BLK,TOPBLK      ;BLOCK LEGAL?\r
+       JRST    READBC          ;GO READ BLOCK NUMBER\r
+       TROA    IOS,IOBLKT      ;LIGHT ERROR BIT\r
+\r
+;EOF BEFORE ALL DATA IS IN - DUMP MODE\r
+DMPEOF:        TRO     IOS,IODEND      ;LIGHT EOF BIT\r
+       JRST    DMPTH2          ;GIVE UP TAPE\r
+\fSVADER:       PUSHJ   PDP,DMPTH2      ;GIVE UP CONTROL\r
+       JRST    ADRERR          ;TYPE ERROR MESSAGE\r
+;COME HERE ON ERROR\r
+ERRS:  AOS     TAC,ERRCNT      ;BUMP COUNT\r
+       IFN CPBIT, <\r
+       TLNN    IOS,NOBUF       ;I/O DIRECT TO USER?\r
+       JRST    ERRS1           ;NO\r
+       MOVE    TAC1,SVPNTR     ;YES. RESET POINTERS\r
+       MOVEM   TAC1,USPNTR\r
+       MOVE    TAC1,(TAC1)     ;RESET PNTR\r
+       ADD     TAC1,ADRPRG\r
+       MOVEM   TAC1,PNTR\r
+>\r
+ERRS1: CONSO   DTS,40000       ;IF ILLEGAL OP - DONT RETRY\r
+       CAILE   TAC,DTTRY       ;ENOUGH REREADS?\r
+       JRST    PERMET          ;YES. PERMANENT ERROR\r
+       JRST    FNDBL2          ;NO. TRY AGAIN\r
+\r
+;PERMANENT ERROR\r
+PERMER:        SKIPL   BLOCK           ;IF BAD BLOCK # LIGHT IODTER\r
+       CONSZ   DTS,400000      \r
+       TRO     IOS,IODTER      ;PARITY\r
+       CONSO   DTS,10000\r
+       CONSZ   DTS,200000\r
+DERR:  TRO     IOS,IODERR      ;MISSED DATA\r
+       CONSZ   DTS,40000\r
+       TRO     IOS,IOIMPM      ;ILLEGAL OP\r
+       TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPTHR          ;YES. NOT THROUGH YET\r
+       TLNN    IOS,IO+RDDIR+SINGL\r
+       JRST    DTAIN2\r
+REWDUN:        TLZE    IOS,IOW\r
+       PUSHJ   PDP,SETIOD      ;NO. TAKE OUT OF IO WAIT\r
+       TLZN    IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
+       JRST    THRUTP          ;NO. RETURN TO USER\r
+       PUSHJ   PDP,THRUTP      ;YES. STOP TAPE\r
+       MOVSI   TAC,DVDIRIN     ;CLEAR DIRECTORY IN CORE BIT\r
+       ANDCAM  TAC,DEVMOND(DEVDAT)\r
+BDDIR: LDB     ITEM,PJOBN      ;NUMBER OF OFFENDING JOB\r
+       JRST    RADDIR          ;GO PRINT ERROR MESSAGE\r
+\f      INTERN  DTABUF\r
+BFPNTR:        IOWD    200,BUF+1\r
+ONEONE:        XWD     1,1\r
+USEWRD:        0\r
+USEPRG:        0\r
+ADRPRG:        0\r
+PNTR:  0\r
+TEMP:  0\r
+DISTNC:        0\r
+BLOCK: 0\r
+QUANTM:        0\r
+DISCON:        0\r
+ERRCNT:        0\r
+FNDTMP:        0\r
+IOWRIT:        0\r
+ALMSWT:        0\r
+       IFN CPBIT, <\r
+BLKCNT:        0\r
+SVPNTR:        0\r
+\r
+USPNTR:        0\r
+DIRCNT:        0\r
+>\r
+;THIS IS THE MONITOR BUFFER\r
+DTABUF:\r
+IFN ALMACT,<\r
+       XWD     SWPBACK,0       ;RH WILL BE LINK TO NEXT MONITOR BUFFER\r
+>\r
+MONB2: 0\r
+BUF:   BLOCK   200\r
+DTAEND:        END\r
+\f\r
diff --git a/src/dtcsrn.mac b/src/dtcsrn.mac
new file mode 100644 (file)
index 0000000..d8286ce
--- /dev/null
@@ -0,0 +1,1100 @@
+TITLE  DTCSRN - NEW FORMAT DECTAPE SERVICE FOR 551 (PDP-6)\r
+SUBTTL DTA551 A.WACHS/TW/RCC 01 JUN 69  V012\r
+       XP      VDTASR,012      ;GLOBAL VERSION NUMBER FOIR LOADER STORAGE MAP.\r
+\r
+       ENTRY   DTCSRN   ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD\r
+DTCSRN:\r
+EXTERNAL       TPOPJ,TPOPJ1,DTCCHL,DCOUT,DCIN,DCON,DCOFF\r
+EXTERNAL       STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD\r
+\r
+EXTERNAL       DTAVAL,DTREQ,SETIOD,THSDAT,PUNIT,GETDCDT\r
+EXTERNAL       ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
+EXTERNAL       COMCHK,PJOBN,RELEA9,UADCK1,DTTRY\r
+EXTERNAL       JBTADR,DCLOC,DCLOC1,DTCCHN,DCREQ,DCAVAL\r
+\r
+\r
+BLK=4\r
+\r
+\r
+DIRBLK=^D100   ;NUMBER OF BLOCK FOR DIRECTORY\r
+\r
+TOPBLK=1101    ;HIGHEST LEGAL BLOCK NUMBER\r
+NAMSTR=^D83    ;1ST NAME WORD IN DIRECTORY\r
+QUANT=5                ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
+SPACE=6                ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
+\r
+;DDB MAGIC CELLS\r
+FSTBLK=13\r
+DLOC=14\r
+IBLK=15\r
+OBLK=16\r
+DISPAD=17\r
+DMPLST=20\r
+SVDWRD=21\r
+\f;FLAGS IN RH OF IOS\r
+UDSD=100\r
+\r
+\r
+;FLAGS IN LH OF IOS\r
+NOLINK=200\r
+CHNGDR=400\r
+RVERSE=1000\r
+SINGL=2000             ;JUST READ OR WRITE 1 BLOCK\r
+DMPMOD=4000\r
+RWDIR=10000\r
+DMPCLS=20000\r
+NOBUF=40000            ;DATA GOING DIRECTLY INTO USER AREA\r
+NOBUFC=737777          ;-NOBUF\r
+\r
+CPBIT=-1               ;CONDITIONAL ASSEMBLY PARAMETER FOR I/O DIRECTLY\r
+                       ;TO USER.  IF -1 THE I/O IN DUMP MODE WITH\r
+                       ;BIT 29 ON IN INIT WILL DO IO DIRECTLY TO USER\r
+                       ;WIUTHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES\r
+\f      EXTERN  JIFSEC\r
+\r
+       INTERN  DTCINT,DTCDDB,DTCINI,DTCDDS\r
+\r
+DTCDDB:        SIXBIT  /DTA0/\r
+       XWD     ^D60*HUNGST,200\r
+       0\r
+       EXP     DTCDSP\r
+       XWD     1107,154403\r
+       EXP     0,0\r
+\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       EXP     0,0,0\r
+\r
+       EXP     DTCDIR\r
+       EXP     0,0,0,0,0\r
+\r
+\r
+DTCDIR:        BLOCK   200\r
+DTCDDS=.-DTCDDB\r
+\r
+       JRST    DTCINI\r
+       JRST    THRUTP          ;HUNG DEVICE\r
+DTADSP JRST    UREL\r
+       JRST    UCLS\r
+       JRST    UOUT\r
+       JRST    UIN\r
+       JRST    ENTR\r
+       JRST    LOOK\r
+       JRST    DMPO\r
+       JRST    DMPI\r
+       JRST    SETO\r
+       JRST    SETI\r
+       JRST    GETF\r
+       JRST    RENAM\r
+       POPJ    PDP,            ;CLOSE INPUT\r
+       JRST    UTPCLR\r
+       POPJ    PDP,            ;MTAPE\r
+\r
+;INITIALIZE DTC\r
+DTCINI:        CONO    DTC,0\r
+       CONO    DC,0\r
+       HLLZS   DTCINT  ;CLEAR CONSO\r
+       POPJ    PDP,\r
+\f      EXTERN  JOBSAV\r
+;LOOKUP A DIRECTORY ENTRY\r
+LOOK:  TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       JRST    CPOPJ1          ;YES. LOOKUP OK\r
+       PUSHJ   PDP,DSERCH      ;NO. FIND DIRECTORY ENTRY\r
+       POPJ    PDP,            ;NOT THERE\r
+       HRRZ    TAC1,26(TAC)    ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
+       AOS     UUO             ;POINT UUO TO WORD 3\r
+       MOVEM   TAC1,@UUO       ;INTO USER'S LOOKUP BLOCK\r
+LOOKA: HLRE    TAC,TAC         ;GET INDEX\r
+       ADDI    TAC,27\r
+       SKIPN   FSTBLK(DEVDAT)  ;TAPE BEING WRITTEN?\r
+       HRLM    TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
+       HRRM    TAC,AC1         ;SAVE INDEX IN CASE LH(IBLK) IS\r
+                       ;CHANGED BY DEAD-RECKONING\r
+       MOVEI   TAC1,0\r
+       PUSHJ   PDP,BLKSRC      ;COUNT NUMBER OF BLOCKS IN FILE\r
+       AOJA    UUO,STOWD4      ;LAST BLOCK DONE\r
+       AOS     TAC1            ;COUNT THE BLOCK\r
+       SOS     1(PDP)          ;ADJUST FOR CORRECT RETURN\r
+       AOBJN   PDP,BLKSRB      ;LOOK FOR NEXT BLOCK\r
+\r
+;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
+STOWD4:        IMUL    TAC1,[-177]     ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
+       HRLZM   TAC1,@UUO       ;STORE IN DIRECOTRY WD 4\r
+       SUBI    UUO,2           ;POINT UUO TO DIRECORY WD 2\r
+       TLZ     IOS,IO          ;MAKE SURE IO IS OFF\r
+       TLO     IOS,SINGL       ;JUST READ 1 RECORD\r
+       MOVEI   BLK,DIRBLK      ;NO, FIND FIRST MENTION OF BLOCK\r
+       PUSHJ   PDP,LSTFRE+1    ;NEAR DIRECTORY\r
+       JUMPN   BLK,LOOKE       ;FOUND IF BLK NOT =0\r
+LOOKD: PUSHJ   PDP,BLKSRC      ;FIND FIRST MENTION IN DIRECTORY\r
+       JRST    BDDIR           ;NOT THERE - ERROR\r
+LOOKE: PUSHJ   PDP,RDBLUK      ;GO READ IT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IT'S IN\r
+       HRLM    AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
+                       ;TEST ON ENTER - WONT ALLOW ENTER\r
+                       ;TO BE DONE ON LOOKED-UP FILE\r
+       HRRZ    BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
+LOOKC: SKIPN   FSTBLK(DEVDAT)  ;IF FILE HAS NOT BEEN ENTERED\r
+       MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
+       HRRM    BLK,@UUO        ;SAVE IN USER'S AREA\r
+       HLL     TAC,@UUO        ;GET USER'S EXTENSION\r
+       HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
+                               ; AND SUPERSEDING SHARED SEGMENTS\r
+       JRST    CPOPJ1          ;AND TAKE GOOD EXIT\r
+\fRENAM:        PUSH    PDP,UUO         ;SAVE LOC OF NEW NAME\r
+       MOVEI   UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
+       PUSHJ   PDP,DSER1\r
+       JRST    RENER1          ;NOT FOUND - ERROR\r
+       POP     PDP,UUO         ;FOUND, RESTORE UUO\r
+       SKIPE   @UUO            ;RENAMING TO ZERO?\r
+       JRST    RENAM2          ;NO. GO TO REAL RENAME\r
+       SETZM   (TAC)           ;YES. DELETE NAME IN DIR\r
+       SETZM   26(TAC)         ;DELETE EXTENSION\r
+       SETZM   DEVFIL(DEVDAT)  ;ZERO DEVFIL\r
+       HLRE    TAC,TAC         ;GET INDEX OF FILE\r
+       ADDI    TAC,27\r
+       PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS OF FILE\r
+RENAM1:        TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       AOS     (PDP)           ;SET FOR GOOD RETURN\r
+       JRST    STOIOS          ;GO TO USER\r
+\r
+;COME HERE TO RENAME TO A REAL NEW NAME\r
+RENAM2:        MOVE    DAT,TAC          ;SAVE LOC OF NAME IN DIRECTORY\r
+\r
+       PUSHJ   PDP,DSERCH      ;SEARCH FOR NEW NAME\r
+       SKIPA           ;NOT FOUND - GOOD\r
+       JRST    RENER2          ;NAME ALREADY EXISTS - ERROR\r
+       MOVE    TAC,@UUO        ;GET NEW NAME\r
+       MOVEM   TAC,(DAT)       ;SAVE IN DIR\r
+       AOS     UUO\r
+       MOVE    TAC,@UUO        ;EXTENSION\r
+       HLLM    TAC,26(DAT)     ;SAVE IN DIR\r
+       HLLM    TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
+       JRST    RENAM1          ;GIVE GOOD RETURN TO USER\r
+\r
+RENER1:        POP     PDP,UUO\r
+       TDZA    TAC,TAC         ;RH E+1 =0\r
+RENER2:        MOVEI   TAC,4           ;RH E+1 =4\r
+       AOS     UUO             ;POINT TO 2ND WORD\r
+       HRRM    TAC,@UUO        ;SET ERRORR CODE\r
+       POPJ    PDP,            ;AND TAKE ERROR RETURN\r
+\f;SEARCH DIRECTORY FOR A MATCH\r
+DSERCH:        MOVEI   AC1,3(UUO)      ;CHECK VALIDITY OF ADDRESS\r
+       PUSHJ   PDP,UADCK1      ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
+DSER1: PUSHJ   PDP,DIRCHK      ;ENSURE DIRECTORY IS IN CORE\r
+       HRRZ    TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
+       ADD     TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
+NMLOOK:        SKIPN   TAC1,@UUO       ;GET NAME\r
+       JRST    TPOPJ           ;NULL ARGUMENT - ERROR RETURN                   \r
+       MOVEM   TAC1,DEVFIL(DEVDAT)     ;STORE FOR RENAME AND SUPERSEDING\r
+                               ; SHARED SEGMENTS\r
+       CAMN    TAC1,(TAC)      ;TEST FOR MATCH\r
+       AOJA    UUOI,NMFOUN     ;FOUND NAME, CHECK EXTENSION\r
+       AOBJN   TAC,.-2         ;TRY NEXT NAME\r
+       POPJ    PDP,            ;NOT FOUND\r
+NMFOUN:        HLLZ    TAC1,@UUO       ;PICK UP USER'S EXTENSION\r
+       XOR     TAC1,26(TAC)    ;TEST AGAINST DIRECTORY EXTENSION\r
+       TLNN    TAC1,-1         ;MATCH?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+       AOBJP   TAC,.+2\r
+       SOJA    UUO,NMLOOK      ;NO. TRY NEXT NAME\r
+       SOJA    UUO,CPOPJ       ;NAME NOT FOUND\r
+\r
+;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
+DIRCHK:        TRNN    IOS,UDSD        ;DONT BOTHER IF NON-STANDARD\r
+       SKIPG   DEVMOD(DEVDAT)  ;IS IT IN?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
+       TLZ     IOS,IO\r
+       PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       TLO     IOS,RWDIR       ;JUST READ 1 BLOCK\r
+       PUSHJ   PDP,READBC      ;GO READ IT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IN\r
+       MOVSI   TAC1,DVDIRI     ;SET DIRECTORY-IN-CORE BIT\r
+       ORM     TAC1,DEVMOD(DEVDAT)\r
+       POPJ    PDP,\r
+\f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
+BLKSRC:        MOVSI   DAT,440500      ;DAT IS A BLOCK POINTER\r
+       HRR     DAT,DLOC(DEVDAT)\r
+       MOVEI   BLK,1           ;START AT BLOCK 1\r
+\r
+BLKSRA:        ILDB    TEM,DAT         ;INDEX OF NEXT BLOCK\r
+       CAMN    TAC,TEM         ;MATCH?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+\r
+BLKSRB:        CAIGE   BLK,TOPBLK      ;NO. SEARCHED LAST?\r
+       AOJA    BLK,BLKSRA      ;NO. TRY NEXT BLOCK\r
+       POPJ    PDP,            ;YES. RETURN\r
+\r
+;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
+SETPTR:        PUSH    PDP,BLK         ;SAVE BLK\r
+       PUSHJ   PDP,DRPTR       ;SET BLK AS A BYTE POINTER\r
+       MOVE    DAT,BLK         ;RETURN IT IN DAT\r
+       POP     PDP,BLK         ;RESTORE BLK\r
+       POPJ    PDP,            ;AND RETURN\r
+\r
+;GET NEXT AVAILABLE FREE BLOCK\r
+NXTFRE:        PUSH    PDP,TEM \r
+       PUSHJ   PDP,SETPTR      ;SET DAT TO A BYTE POINTER\r
+       MOVEI   TAC,0           ;LOOK FOR FREE BLOCKS\r
+       PUSHJ   PDP,BLKSRA      ;FIND A ZERO BLOCK\r
+       MOVEI   BLK,0           ;NOT THERE- RETURN 0\r
+FREXIT:        POP     PDP,TEM\r
+       POPJ    PDP,\r
+\r
+;GET PREVIOUS FREE BLOCK\r
+LSTFRE:        MOVEI   TAC,0\r
+       PUSH    PDP,TEM\r
+       ADDI    BLK,2\r
+       PUSHJ   PDP,SETPTR      ;SET DAT AS A POINTER\r
+       SUBI    BLK,2\r
+       PUSHJ   PDP,DECPTR      ;DECREMENT BYTE POINTER\r
+       LDB     TEM,DAT         ;INDEX TO BLOCK\r
+       CAMN    TEM,TAC         ;FOUND?\r
+       JRST    FREXIT          ;YES. RETURN\r
+       SOJG    BLK,.-4         ;TRY AGAIN IF NOT AT START\r
+       JRST    FREXIT          ;REACHED START - RETURN BLK=0\r
+\r
+;DECREMENT BYTE POINTER\r
+DECPTR:        JUMPL   DAT,.+5\r
+       ADD     DAT,[BYTE (6) 5] ;DECREMENT\r
+       JUMPG   DAT,CPOPJ       ;IF POSITIVE - SAME WORD\r
+       HRLI    DAT,010500      ;RESET TO PREVIOS WORD\r
+       SOJA    DAT,CPOPJ\r
+       HRLI    DAT,060500\r
+       SOJA    DAT,CPOPJ\r
+\r
+\f;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC\r
+DLETE: MOVEI   TAC1,0          ;SET TO DELETE BLOCKS\r
+       PUSHJ   PDP,BLKSRC      ;FIND A BLOCK BELONGING TO FILE\r
+       JRST    CPOPJ   ;ALL THROUGH\r
+       DPB     TAC1,DAT        ;DELETE IT\r
+       SOS     1(PDP)          ;ADJUST PDL FOR RETURN\r
+       AOBJN   PDP,BLKSRB      ;AND FIND NEXT MATCH\r
+\r
+\r
+;ENTER A FILE NAME IN DIRECTORY\r
+ENTR:  TRNE    IOS,UDSD        ;NON STANDARD?\r
+       JRST    CPOPJ1          ;YES. RETURN\r
+       PUSHJ   PDP,DSERCH      ;NO. LOOK FOR MATCH\r
+       JRST    NEWNT           ;THIS IS A NEW ENTRY\r
+ENTR2: MOVE    TAC1,@UUO       ;PICK UP 2ND WORD (EXTENSSION)\r
+       AOS     UUO             ;POINT TO WORD 3\r
+       HRR     TAC1,@UUO       ;ADD DATE\r
+       TRNN    TAC1,7777       ;IS DATE ALREADY THERE?\r
+       IOR     TAC1,THSDAT     ;NO, ADD CURRENT DATE\r
+       MOVEM   TAC1,26(TAC)    ;INTO DIRECTORY\r
+       SKIPGE  AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
+                               ;BEFORE THE ENTER?)\r
+       AOJA    UUO,SETWD4      ;YES. STORE LENGTH IN DIRECTORY\r
+ENTRA: SUBI    UUO,2           ;NO. POINT TO NAME\r
+       MOVE    TAC1,@UUO       ;PICK IT UP\r
+       MOVEM   TAC1,(TAC)      ;INTO DIRECTORY\r
+       HLRE    TAC,TAC         ;COMPUTE INDEX OF FILE\r
+       ADDI    TAC,27\r
+       HLRZ    DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
+       SUB     DAT,TAC         ;WRITE SAME FILE AS READING?\r
+       JUMPE   DAT,CPOPJ       ;TAKE ERROR RETURN IF YES\r
+       HRLM    TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
+\r
+       PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS BELONGING TO FILE\r
+       AOJE    AC3,FNTRD       ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
+                               ;IS A SAVE FILE (UGETF DONE)\r
+       MOVEI   BLK,DIRBLK      ;NO. GET 1ST BLOCK CLOSE TO\r
+       TLO     IOS,RVERSE      ;DIRECTORY. GOING IN REVERSE\r
+       POPJ    PDP,USLSTA\r
+       CAILE   BLK,TOPBLK      ;BLOCK LEGAL?\r
+       POPJ    PDP,            ;NO. ERROR RETURN\r
+ENTRC: MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
+       HRRM    BLK,OBLK(DEVDAT)        ;SAVE IN DDB\r
+       AOS     UUO             ;POINT UUO TO WORD 2\r
+       HRRM    BLK,@UUO        ;SAVE 1ST BLOCK IN USER'S AREA\r
+       HLL     TAC,@UUO        ;GET EXTENSION\r
+       HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE EXTENSION IN DDB ALSO\r
+       TLO     IOS,NOLINK\r
+       AOS     (PDP)\r
+\f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
+MARKDR:        PUSHJ   PDP,DRPTR       ;SET POINTER TO BLOCK IN DIR\r
+       HLRZ    TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
+       IDPB    TAC,BLK         ;MARK DIRECTORY\r
+       TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       JRST    STOIOS\r
+\r
+;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
+DRPTR: SUBI    BLK,1           ;SET FOR ILDB OR IDPB\r
+       IDIVI   BLK,7           ;COMPUTE WORD, POSITION\r
+       ADD     BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS\r
+       HRLI    BLK,440500      ;MAKE IT A BYTE POINTER\r
+       JUMPE   DAT,CPOPJ       ;CORRECT FOR POSITION IN WORD\r
+       IBP     BLK\r
+       SOJG    DAT,.-1\r
+       POPJ    PDP,\r
+\r
+;HERE FOR NEW FILE NAME ON ENTER\r
+NEWENT:        SUB     TAC,[XWD 26,26];START AT BEGINNING OF DIRECT.\r
+\r
+       SKIPN   (TAC)           ;FIND A FREE SLOT\r
+       AOJA    UUO,ENTR2       ;RETURN WITH UUO POINTING TO WRD 2\r
+       AOBJN   TAC,.-2\r
+       POPJ    PDP,            ;NONE AVAILABLE.\r
+\r
+;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
+SETWD4:        HLRE    TAC1,@UUO       ;GET -LENGTH\r
+       MOVNS   TAC1            ;+LENGTH\r
+       HRRE    TEM,@UUO\r
+       ADD     TAC1,TEM        ; +START ADDRESS\r
+       TRZ     TAC1,1777       ;STORE N-1, WHERE N IS NO OF K\r
+       LSH     TAC1,2\r
+       ORM     TAC1,26(TAC)    ;INTO 2ND WRD OF DIRECTORY\r
+       SOJA    UUO,ENTRA       ;CONTINUE WITH ENTER\r
+\r
+ENTRD: MOVEI   TAC,0           ;GET THE 1ST FREE BLOCK ON TAPE\r
+       PUSHJ   PDP,BLKSRC      ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
+       POPJ    PDP,            ;NONE AVAILABLE\r
+       JRST    ENTRC           ;CONTINUE WITH ENTER\r
+\f;USETI        -  SET NEXT INPUT BLOCK TO READ\r
+SETI:  TDZ     IOS,[XWD IOEND,IODEND]\r
+       SKIPA   DAT,DEVDAT\r
+\r
+;USETO -  SET NEXT OUTPUT BLOCK TO READ\r
+SETO:  MOVEI   DAT,1(DEVDAT)\r
+       PUSHJ   PDP,WAIT1       ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
+       HRRM    UUO,IBLK(DAT)  ;SET BLOCK NUMBER\r
+       JRST    STOIOS          ;STOE IOS, POPJ\r
+\r
+;UGETF -  GET NEXT FREE BLOCK FOR THIS FILE\r
+GETF:  PUSHJ   PDP,WAIT1       ;WAIT TILL BUFFERES EMPTY\r
+       PUSHJ   PDP,DIRCHK      ;ENSURE DIR, IN CORE\r
+       PUSHJ   PDP,USRFRE      ;GET NEXT AVAILABLE BLOCK\r
+       SKIPN   OBLK(DEVDAT)    ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
+       SETOB   BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
+                               ;WILL FINE FIRST FREE BLOCK ON TAPE\r
+       MOVE    TAC,BLK         ;TELL USER THE BLOCK NUMBER\r
+       JRST    STOTAC\r
+\r
+;GET NEXT (OR PREVIOUS) FREE BLOCK\r
+USRFRE:        MOVEI   TEM,SPACE       ;BLOCKS "SPACE" APART\r
+       LDB     BLK,PIOMOD      ;EXCEPT DUMP AND SAVMOD FILES\r
+       CAIL    BLK,SD          ;OR ONE OF DUMP MODES?\r
+       MOVEI   TEM,2\r
+       MOVEI   TEM,2           ;YES, WHICH ARE CLOSRER\r
+USRFRA:        HRRZ    BLK,OBLK(DEVDAT)        ;CURRENT BLOCK\r
+       TLNE    IOS,RVERSE      ;FORWARD?\r
+       JRST    USRLST          ;NO\r
+       ADDI    BLK,(TEM)       ;YES, FIND NEXT BLOCK AT LEAST N\r
+       CAILE   BLK,TOPBLK\r
+       TDZA    BLK,BLK\r
+CALNXT:        PUSHJ   PDP,NXTFRE       ;BLOCKS PAST THIS ONE\r
+       JUMPN   BLK,STOIOS      ;RETURN IF FOUND\r
+       TLOE    TEM,1           ;FOUND NONE ON THIS PASS\r
+       JRST    NOBLKS          ;TAPE IS FULL\r
+       TLC     IOS,RVERSE      ;REVERSE DIRECTION\r
+       HRRI    TEM,1           ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
+       JRST    USRFRA\r
+USRLST:        SUBI    BLK,(TEM)       ;LOOK FOR FREE BLOCK N BEFORE\r
+       SKIPG   BLK\r
+       TDZA    BLK,BLK         ;REVERSE IF AT FRONT OF TAPE\r
+USLSTA:        PUSHJ   PDP,LSTFRE      ;THIS ONE\r
+       JRST    CALNXT+1\r
+\r
+;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER\r
+NOBLKS:        MOVEI   BLK,TOPBLK+1    ;SET HIGH BLOCK\r
+       POPJ    PDP,\r
+\f;UTPCLR UUO\r
+UTPCLR:        TRNE    IOS,UDSD\r
+       POPJ    PDP,            ;FORGET IT FOR NON-STANDARD\r
+       MOVSI   TAC,400000      ;SET DIRECTORY-IN-CORE BIT\r
+       ORM     TAC,DEVMOD(DEVDAT)\r
+       TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
+       HRRZ    TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+       HRL     TAC1,TAC\r
+       HRRI    TAC1,1(TAC)     ;BLT POINTER\r
+       SETZM   (TAC)\r
+       BLT     TAC1,176(TAC)   ;LEAVE LAST WORD IN DIR, ALONE\r
+       MOVSI   TAC1,17000      ;MARK DIRECTORY AS UNAVAILABLE\r
+       MOVEM   TAC1,16(TAC)\r
+       MOVSI   TAC1,757000     ;RESERVE BLOCKS 1 AND 2\r
+       MOVEM   TAC1,(TAC)      ;FOR READ IN MODE LOADER\r
+       MOVSI   TAC1,777770     ;MARK BLOCKS 1102-1105 AS\r
+       ORCAM   TAC1,NAMSTR-1(TAC)  ;UNAVAILABLE ALSO\r
+       JRST    STOIOS\r
+\f;CLOSE UUO\r
+UCLS:  TLZE    IOS,NOLINK      ;IS LAST BLOCK NOT LINKED?\r
+       TRNE    IOS,UDSD        ;AND NOT NON-STD?\r
+       JRST    STOIOS          ;YES, RETURN\r
+       LDB     TAC,PIOMOD      ;NO. WRITE LAST BLOCK\r
+       CAIL    TAC,16          ;DUMPO MODE?\r
+       JRST    CLSDMP          ;YES. CLOSE DUMP MODE\r
+       MOVEI   TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
+       MOVE    TAC1,1(TAC)     ;LINK WORD\r
+       TLON    TAC1,-1         ;LINK=-1 IF NOT SPECIFIED\r
+       MOVEM   TAC1,1(TAC)     ;LINK = -1... EOF\r
+       MOVEM   IOS,DEVIOS(DEVDAT)  ;SAVE IOS\r
+       JRST    OUT             ;GO TO WRITE RECORD\r
+\r
+\r
+;RELEASE UUO\r
+UREL:  SETZM   FSTBLK(DEVDAT)  ;ZERO FSTBLK\r
+       PUSHJ   PDP,NXTCM2      ;CLEAR OUT DUMP-MODE STUFF\r
+       TRZ     IOS,UDSD        ;CLEAR NON-STD BIT.\r
+       SKIPG   DEVMOD(DEVDAT)  ;IF DIRECTORY HAS BEEN\r
+       TLZN    IOS,CHNGDR      ;MODIFIED IT MUST BE WRITTEN\r
+       POPJ    PDP,            ;NOT TOUCHED\r
+       TLO     IOS,RWDIR+IO    ;GOING TO WRITE IT\r
+       PUSHJ   PDP,GETDT       ;WAIT TILL DTC AVAILABLE\r
+       MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
+       PUSHJ   PDP,WRTBLK      ;WRITE UT\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL IT HAS BEEN WRITTEN\r
+\r
+;GET DEC TAPE CONTROLLER\r
+GETDT: PUSHJ   PDP,GETDCDT     ;GET DATA CONTROL. DECTAPE CONTROL\r
+       AOSE    DTREQ           ;ARGUMENT FOR GETDCD\r
+       MOVEI   TAC,QUANT       ;HAVE IT NOW\r
+       MOVEM   TAC,QUANTM      ;KEEP IT FOR QUANT BLOCKS\r
+       MOVEM   PROG,USEPRG\r
+       MOVEM   DEVDAT,USEWRD   ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
+       JRST    SETACT          ;LIGHT IOACT AND RETURN\r
+\r
+;HERE TO CLOSE A DUMP MODE FILE\r
+CLSDMP:        TLO     IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES\r
+       PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       SETZM   BUF             ;ENSURE LINK, WORDCOUNT=0\r
+       JRST    OUFULL          ;GO WRITE THE BLOCK\r
+\f      EXTERN  JOBDDT,USRDDT\r
+;DUMP MODE INPUT\r
+DMPI:  IFN     CPBIT, <\r
+       HRRZ    AC2,IBLK(DEVDAT)\r
+>\r
+       PUSHJ   PDP,DMPSET      ;SET UP DUMP-MODE STUFF\r
+       JRST    ZERCOR          ;ZER USER'S CORE IF SAVE-MODE\r
+\r
+\r
+;INPUT UUO\r
+UIN:   TLZ     IOS,IO\r
+       HRRZ    BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
+       PUSHJ   PDP,STOIOS\r
+       TRNE    IOS,UDSD        ;NON STANDAR?\r
+       JRST    READBF\r
+       JUMPE   BLK,EOF         ;0 MEANS EOF\r
+       PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK NUMBER\r
+       TLNN    IOS,DMPMOD      ;DUMP MODE?\r
+       CAIE    BLK,DIRBLK      ;TRYING TO READ DIRECTORY?\r
+\r
+       JRST    READBF          ;NO. GO READ\r
+\r
+;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
+       PUSHJ   PDP,DIRCHK      ;READ IT IF IT ISN'T IN ALREADY\r
+       HRL     TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+       MOVEI   TAC1,@DEVIAD(DEVDAT)  ;WHERE USER WANTS IT\r
+       HRRI    TAC,1(TAC1)     ;LOC OF DATA\r
+       BLT     TAC,200(TAC1)   ;GIVE IT TO HIM\r
+       PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
+       JFCL\r
+       POPJ    PDP,\r
+\f;CHECK VALIDITY OF BLOCK NUMBER\r
+BLKCHK:        CAIG    BLK,TOPBLK      ;LEGAL?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       POP     PDP,TAC\r
+       TROA    IOS,IOBKTL      ;NO. LIGHT ERROR BIT\r
+\r
+;INPUT BLOCK = 0 - END OF FILE\r
+EOF:   TLO     IOS,IOEND       ;LIGHT EOF BIT\r
+       TLNN    IOS,DMPMOD\r
+       JRST    STOIOS\r
+       JRST    DMPEOF          ;GIVE UP CONTROL IF DUMP-MODE\r
+\r
+;ZERO USER'S CORE ON SAVE-MODE INPUT\r
+ZERCOR:        MOVEI   TAC,JOBDDT(PROG) ;ZERO CORE\r
+       HRLI    TAC,1(TAC)\r
+       MOVSS   TAC             ;BLT POINTER\r
+       HRRZ    TAC1,DMPLST(DEVDAT)  ;TOP CELL TO ZERO (-175)\r
+       ADDI    TAC1,(PROG)     ;RELOCATE TO USER AREA\r
+       SETZM   -1(TAC)         ;ZERO\r
+       BLT     TAC,(TAC1)\r
+       SETZM   USRDDT          ;DDT IS KEPT IN PROTECTED PART\r
+       JRST    UIN\r
+\f;DUMP MODE OUTPUT\r
+DMPO:  PUSHJ   PDP,DIRCHK      ;MAKE SURE DIRECTORY IS IN CORE\r
+       IFN     CPBIT, <\r
+       HRRZ    AC2,OBLK(DEVDAT)\r
+>\r
+       PUSHJ   PDP,DMPSET      ;SET DUMPO-MODE POINTERS\r
+       JFCL\r
+\r
+;OUTPUT UUO\r
+UOUT:  TLO     IOS,IO\r
+       TRNE    IOS,UDSD        ;NON STANDARD?\r
+       JRST    UOUT2           ;YES\r
+       PUSHJ   PDP,DIRCHK      ;NO. MAKE SURE DIRECTORY IS IN CORE\r
+       HRRZ    BLK,OBLK(DEVDAT)\r
+       CAIN    BLK,DIRBLKK     ;CHECK IF WRITING DIRECTORY\r
+       JRST    COR2HM          ;YES, WRITE CORE IMAGE\r
+       JUMPE   BLK,FAKAV       ;DONT WRITE IF NO BLOCK GIVEN\r
+       PUSHJ   PDP,BLKCHK      ;CHECK FOR LEGAL BLOCK\r
+UOUT2: TLNN    IOS,DMPMOD      ;ALREADY HAVE CONTROL IF DUMP-MODE\r
+\r
+       PUSHJ   PDP,GETDT       ;GET DEC TAPE CONTROLLER\r
+FILBUF:\r
+DTOCHK:        TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPFIL          ;YES, FILL BUFFER FROM LIST\r
+       MOVSI   TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
+       ADD     TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
+       BLT     TAC,BUF+177     ;GO BLT IT\r
+       TLZ     IOS,NOLINK\r
+\fOUFULL:       TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       JRST    OUTBL2          ;YES, NO FILE-STRUCTURED OPERATIONS\r
+       HLRE    BLK,BUF         ;IS IT?\r
+       JUMPL   BLK,LSTBLK      ;YES, - LAST BLOCK OF FILE\r
+       JUMPN   BLK,OUTBLK      ;IF NON-0 - YES\r
+       TLNE    IOS,DMPCLS      ;NO. LAST BLOCK OF A DUMPO FILE?\r
+       JRST    OUTBLK          ;YES. LINK MUST STAY 0\r
+OUCOMP:        PUSHJ   PDP,USRFRE      ;COMPUTE NEXT BLOCK\r
+       TLO     IOS,NOLINK      ;THIS BLOCK NOT LINKED\r
+OUTBLK:        HRLM    BLK,BUF          ;SAVE LINK IN 1ST WORD OF BLOCK\r
+       MOVE    TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
+       DPB     TEM,[POINT 10,BUF,27]\r
+       HRRZ    TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
+       HRRM    BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
+       MOVE    BLK,TEM\r
+       PUSHJ   PDP,MARKDR      ;MARK BLOCK TAKEN IN DIRECTORY\r
+       SKIPA   BLK,TEM\r
+OUTBL2:        HRRZ    BLK,OBLK(DEVDAT)\r
+       PUSHJ   PDP,STOIOS\r
+\r
+WRTBLK:        PUSHJ   PDP,FNDBLK      ;GO SEARCH FOR BLOCK\r
+       MOVE    TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE\r
+       JRST    RDWRT\r
+\f;WRITE LAST BLOCK\r
+LSTBLK:        MOVEI   BLK,0           ;LINK=0\r
+       JRST    OUTBLK          ;GO WRITE LAST BLOCK\r
+\r
+;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
+COR2HM:        MOVEI   TAC,@DEVOAD(DEVDAT)  ;WHERE IT IS\r
+       HRLI    TAC,1(TAC)      \r
+       HRR     TAC,DLOC(DEVDAT)        ;WHERE TO PUT IT\r
+       MOVEI   TAC1,177(TAC)\r
+       BLT     TAC,(TAC1)\r
+       TLO     IOS,CHNGDR      ;REMEMBER TO WRITE IT OUT\r
+       MOVSI   TAC1,DVDIRI\r
+       ORM     TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
+FAKADV:        TLZE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    THRUTD          ;YES. GIVE UP CONTROL\r
+       PUSHJ   PDP,ADVBFE      ;ADVANCE BUFFERS\r
+       JFCL\r
+       TLZ     IOS,NOLINK      ;DIRECTORY BLOCK IS NOT LINKED\r
+       SETZM   OBLK(DEVDAT)\r
+       JRST    STOIOS\r
+\f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
+DMPSET:        TLO     IOS,DMPMOD      ;LIGHT BIT\r
+       PUSHJ   PDP,GETDT       ;GET CONTROL\r
+       HRLI    UUO,PROG\r
+       PUSHJ   PDP,COMCHK      ;CHECK VALIDITY OF LIST\r
+       JRST    SVADER          ;NG. GIVE ADRESS ERROR\r
+       SKIPL   TAC,@UUO        ;OK. NULL LIST?\r
+       JRST    DMPTS1          ;YES. RETURN\r
+       IFN CPBIT, <\r
+       TRNE    IOS,UDSD        ;NO. NON-STD MODE?\r
+       SOJA    DAT,TDUSER      ;YES. GO ELSEWHERE\r
+>\r
+DMPST2:        SOS     UUO             ;NO. SAVE START OF LIST (-1)\r
+       MOVEM   UUO,DMPLST(DEVDAT)\r
+       JRST    CPOPJ1\r
+\r
+DMPTS1:        POP     PDP,TAC\r
+       JRST    THRUTD\r
+\r
+       IFN CPBIT, <\r
+;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
+TOUSRF:        JUMPE   AC2,NOBLK0      ;CANT READ BLK 0 IN NON-STD DUMP  MODE\r
+       ASH     DAT,-7          ;NUMBER OF WRDS IN LIST /200\r
+       AOS     DAT\r
+       MOVEM   DAT,BLKCNT      ;SAVE TO UPDATE POSITION\r
+       MOVEI   UUO,@UUO        ;REAL ADDRESS OF LIST\r
+       MOVEM   UUO,USPNTR      ;SAVE IT\r
+       MOVEM   UUO,SVPNTR\r
+       ADDI    TAC,(PROG)      ;RELOCATE ADDRESS OF 1ST IOWD\r
+       MOVEM   TAC,PNTR        ;AND SAVE IT\r
+       MOVE    TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN\r
+       MOVEM   TAC,DCLOC1      ;IOWD IS EXHAUSTED\r
+       HRRZM   PROG,ADRPRG     ;SAVE JUST ADDRESS OF PROG\r
+       TLO     IOS,NOBUF       ;INDICATE DIRECTLY TO USER\r
+       TLNN    IOS,IO\r
+       JRST    CPOPJ1          ;READING - CONTINUE\r
+       POP     PDP,TAC         ;WRITING - THIS WILL SAVE LOTS OF TIME\r
+       JRST    OUTBL2\r
+>\r
+\f;FILL OUTPUT BUFFER FROM LIST\r
+DMPFIL:        MOVSI   TAC1,-177\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD\r
+       SUB     TAC1,ONEONE     ;200 DATA WORDS IF NON-STANDARD\r
+>\r
+DMPFLB:        PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
+       JRST    DMPOTH          ;END OF LIST\r
+DMPLFA:        MOVE    TEM,(TAC)       ;GET NEXT WORD\r
+       MOVEM   TEM,BUF+1(TAC1) ;INTO BUFFER\r
+       AOBJP   TAC1,DMPOVR     ;BUFFER FULL IF GOES\r
+       AOBJN   TAC,.-3         ;GET NEXT WORD FROM COMMAND\r
+       JRST    DMPFLB          ;GET NEXT COMMAND\r
+\r
+DMPOTH:\r
+       IFE     CPBIT, <\r
+       TRNN    IOS,UDSD\r
+>\r
+       HRRZM   TAC1,BUF        ;LIST RAN OUT  SAVE WORD COUNT\r
+\r
+       SETZM   BUF+1(TAC1)     ;ZERO REST OF BUFFER\r
+       HRRZI   TAC1,BUF+2(TAC1)\r
+       CAILE   TAC1,BUF+177    ;JUST ZERO 1 WORD IF AT TOP\r
+       JRST    OUFULL\r
+       HRLI    TAC1,-1(TAC1)\r
+       BLT     TAC1,BUF+177    ;****TEST IF TOP OF BUFFER\r
+       JRST    OUFULL          ;NOW WRITE BUFFER\r
+\r
+;BUFFER FULL BEFORE END OF COMMAND\r
+DMPOVR:        AOBJN   TAC,.+3         ;WAS THAT LAST WORD OF COMMAND?\r
+       PUSHJ   PDP,NXTCOM      ;YES. GET NEXT\r
+       MOVEI   TAC,0\r
+       MOVEM   TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
+DMPOVA:        MOVEI   TAC,177\r
+       IFE     CPBIT, <\r
+       TRNN    IOS,UDSD\r
+>\r
+       MOVEM   TAC,BUF         ;WD CNT =177\r
+       JRST    OUFULL          ;GO WRITE PART OF STUFF\r
+\r
+;GET NEXT COMMAND FROM LIST\r
+NXTCOM:        SKIPN   DMPLST(DEVDAT)  ;END OF COMMANDS?\r
+       JRST    NXTCM2          ;YES. RETURN\r
+       AOSA    TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
+NXTCM1:        HRRM    TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
+       MOVE    TAC,@TAC        ;GET COMMAND\r
+       JUMPE   TAC,NXTCM2      ;END OF LIST\r
+       JUMPG   TAX,NXTCM1      ;GO-TO WORD\r
+       ADDI    TAC,(PROG)      ;REAL COMMAND - ADD RELOCATION\r
+       AOJA    TAC,CPOPJ1      ;AND RETURN\r
+;END OF DUMP-MODE LIST\r
+NXTCM2:        SETZM   SVDWRD(DEVDAT)  ;ZERO POINTERS\r
+       SETZM   DMPLST(DEVDAT)\r
+       POPJ    PDP,\r
+\r
+DMPFLC:        SKIPE   TAC,SVDWRD(DEVDAT)      ;IS THERE ANOTHER COMMAND\r
+       JRST    DMPFLA          ;YES. GET IT\r
+       JRST    DMPTH2          ;NO. THROUGH\r
+\fDTC=210\r
+DTS=214\r
+\r
+;IO INTERFACE\r
+READBF:        TLNN    IOS,DMPMOD      ;HAVE CONTROL IF DUMP-MODE\r
+       PUSHJ   PDP,GETDT       ;GET DT CONTROL\r
+\r
+READBC:        PUSHJ   PDP,FNDBLK      ;SEARCH FOR RIGHT BLOCK\r
+       MOVE    TAC1,[BLKI DTC,300] ;FOUND IT - START READING\r
+\r
+;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
+RDWRT: PUSH    PDP,TAC\r
+       HLLM    TAC1,IOWD       ;BLKI OR BLKO\r
+       HRLI    TAC,-200\r
+       TLNN    IOS,RWDIR       ;WRITING (READING) DIRECT?\r
+       SKIPA   TAC,BFPNTR      ;NO. INTO BUF\r
+       HRR     TAC,DLOC(DEVDAT)        ;YES. LOC OF DIRECTORY\r
+       SOS     TAC             ;NO. SET FOR FORWARD READ\r
+IOGO:  IFN CPBIT, <\r
+       TLNN    IOS,NOBUF       ;POINTER ALREADY SET UP IF DIRECT IO\r
+>\r
+       MOVEM   TAC,PNTR        ;POINTER\r
+       OR      TAC1,UNIT       ;UNIT AND PI CHAN\r
+       MOVEM   TAC1,COMAND     ;SAVE COMMAND FOR READ OR WRITE\r
+       POP     PDP,TAC         ;RESTORE SEARCH COMMAND\r
+       CONO    DC,DCIN         ;SET DATA CONTROL TO REAF\r
+       CONO    PI,DCON         ;TURN ON DC PI CHANNEL\r
+       HLRI    TAC,37\r
+       CONO    PI,PIOFF\r
+       CONO    DTC,(TAC)       ;START TAPE MOVING\r
+       HLRM    TAC,DTCINT\r
+       CONO    PI,PION\r
+       POPJ    PDP,            ;DISMISS INTERRUPT\r
+\r
+;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
+RVERS: 0\r
+IOWD:  BLKI    DTC,PNTR        ;READ (WRITE) A WORD\r
+       JRST    RVTHRU          ;POINTER RAN OUT\r
+       SOS     PNTR            ;POINTER HAS TO BACK UP\r
+       SOS     PNTR\r
+       JEN     @RVERS          ;DISMISS THE INTERRUPT\r
+\f;HERE WHEN POINTER RUNS OUT IN REVERSE\r
+RVTHRU:        JSR     SHUTDN          ;SHUT DOWN DATA CONTROL\r
+       JEN     @RVERS          ;DISMISS\r
+\r
+;HERE WHEN POINTER RUNS OUT FORWARD\r
+DTATHR:        0\r
+       JSR     SHUTDN          ;SHUT DOWN DATA CONTROL\r
+       JEN     @DTATHR         ;DISMISS\r
+\r
+SHUTDN:        0\r
+       CONSZ   DC,10000        ;DATA MISSED?\r
+       SETOM   ERRFLG          ;YES. SET SWITCH\r
+       CONSO   DTC,400         ;READING?\r
+       CONO    DC,0            ;YES. TERN OFF DC\r
+       CONO    PI,DCOFF        ;TURN OFF DC PI\r
+       JRST    @SHUTDN\r
+\f;COME HERE TO START READING BLOCK NUMBERS\r
+       EXTERN PION,PIOFF\r
+\r
+FNDBLK:        HRRZM   BLK,BLOCK       ;BLOCK WE'RE LOOKING FOR\r
+       SETZM   ERRCNT\r
+FNDBL2:        SETZM   ERRFLG          ;RESET DATA MISSED FLAG\r
+       LDB     TAC,PUNIT       ;GET UNIT NUMBER\r
+       LSH     TAC,3           ;POSITION IT\r
+       TRO     TAC,DTCCHN      ;ADD PI CHANNEL\r
+       MOVEM   TAC,UNIT        ;SAVE\r
+       MOVE    TEM,[JSR SRCH]  ;SET UP  INTERRUPT CELLS\r
+       MOVEM   TEM,DCLOC\r
+       MOVE    TEM,[JSR DTATHR]\r
+       IFN     CPBIT, <\r
+       TLNN    IOS,NOBUF       ;DCLOC1 ALREADY SET UP IF DIRECT IO\r
+>\r
+       MOVEM   TEM,DCLOC1      ;FOR FORWARD DATA OPERATIONS\r
+       CONSZ   DTC,20000       ;IS TAPE ALREADY MOVING/\r
+       JRST    FNDBL4          ;YES\r
+\r
+       TRO     TAC,323200      ;NO, SET READ BLK NOS., START DELAY\r
+       TLNN    IOS,RVERSE      ;MOVE TAPE BACKWARDS?\r
+       TRO     TAC,10000       ;YES\r
+FNDBL3:        IFN     CPBIT, <\r
+       PUSH    PDP,IOS\r
+       TLZ     IOS,NOBUFC      ;SET UP DIRCTN NON-0 IF DIRECT IO\r
+       HLLZM   IOS,DIRCTN\r
+       POP     PDP,IOS\r
+>\r
+       MOVEM   IOS,DEVIOS(DEVDAT)      ;RESTORE IOS IN CORE\r
+       POPJ    PDP,            ;AND EXIT\r
+\r
+;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY\r
+FNDBL4:        CONSZ   DTC,10000       ;GOING BACKWARDS?\r
+       TRO     TAC,10000       ;YES\r
+       TRO     TAC,320200      ;SET TO READ BLOCKS, NO DELAY\r
+       JRST    FNDBL3          ;GO TELL CONTROL\r
+\f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
+SRCH:  0       \r
+       MOVEM   TAC,TEMP        ;SAVE TAC\r
+       DATAI   DTC,TAC         ;NO. READ A BLOCK NUMBER\r
+       SUB     TAC,BLOCK       ;;PRESENT BLOCK - TARGET BLOCK\r
+       IFN CPBIT, <\r
+       SKIPE   DIRCTN          ;IF DIRECT IO\r
+       CONSO   DTC,10000       ;MUST READ DATA FORWARD\r
+>\r
+       JUMPE   TAC,FOUND       ;THERE IS ZERO\r
+       HRR     TAC,UNIT        ;NO. SET UP READ OF NEXT BLOCK\r
+       CONSZ   DTC,10000       ;GOING IN REVERSE\r
+       TDC     TAC,[XWD 400000,10000] ;YES, SWITCH TURN-AROUND TEST\r
+       SKIPL   TAC             ;TURN AROUND?\r
+       TRC     TAC,12000       ;YES, SWITCH DIR., TUERN AROUND DELAY\r
+       CONO    DTC,320200(TAC);TELL CONTROL\r
+       CONO    DC,DCIN         ;TELL DATA CONTROL ALSO\r
+SRCHXT:        MOVE    TAC,TEMP        ;RESET TAAC\r
+       JEN     @SRCH           ;AND EXIT THE INTERRUPT\r
+\r
+\r
+       IFN CPBIT, <\r
+;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
+DMPADV:        0\r
+       MOVEM   TAC,TEMP\r
+       AOSA    TAC,USPNTR      ;ADVANCE LOC OF POINTER\r
+DMPAV1:        HRRM    TAC,USPNTR\r
+       SKIPN   TAC,@TAC        ;END OF LIST?\r
+       JRST    DMPAV3          ;YES. STOP TAPE\r
+       ADD     TAC,ADRPRG      ;ADD RELOCATION\r
+       JUMPG   TAC,DMPAV1\r
+       MOVEM   TAC,PNTR        ;NEW POINTER\r
+DMPAV2:        MOVE    TAC,TEMP        ;RESTORE TAC\r
+       JEN     @DMPADV\r
+\r
+\r
+DMPAV3:        JSR     SHUTDN          ;SHUT DOWN TAPE\r
+       JRST    DMPAV2          ;RESTORE TAC AND EXIT THE INTERRUPT\r
+\r
+>\r
+\f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
+FOUND: CONSZ   DTC,10000       ;GOING FORWARD?\r
+       JRST    IORVRS          ;NO\r
+       MOVE    TAC,IOWD        ;YES. SET BLKI/BLKO INOT PI LOC\r
+FND1:  MOVEM   TAC,DCLOC\r
+       MOVE    TAC,COMAND      ;PICK UP READ OR WRITE COMMAND\r
+       TRNE    TAC,400         ;WRITE?\r
+       CONO    DC,DCOUT        ;YES. CONDITION DATA CONTROL\r
+       CONO    DTC,360000(TAC) ;START DATA FLOW\r
+       JRST    SRCHXT          ;AND LEAVE\r
+\r
+IORVS: MOVEI   TAC,10000       ;SET IO FOR REVERSE\r
+       ORM     TAC,COMAND\r
+       MOVEI   TAC,177\r
+       ADDM    TAC,PNTR        ;READ FROM TOP OF BUFFER DOWN\r
+       MOVE    TAC,[JSR RVERS] ;HAVE TO DO SOME STUFF AT INTERRUPT\r
+       JRST    FND1\r
+\f;INTERRUPT HERE FOR FLAG CHANNEL\r
+DTCINT:        CONSO   DTS,37          ;INTERRUPT FOR DECTAPE?\r
+       JRST    .               ;NO, GO AWAY\r
+       CONSZ   DTS,40000       ;YES. JOB DONE ENABLED?\r
+       JRST    BLKNUM          ;NO. READING BLOCK NUMBERS\r
+       CONSZ   DTC,4000        ;YES. TIME FLAG ENABLED?\r
+       JRST    TIMINT          ;YES. CHECK IF THIS IS A TIME INTERRUPT\r
+DTCIN1:        CONO    DC,0            ;NO. TURN OFF DATA CONTROL\r
+       JSR     DTCSAV          ;SAVE ACS\r
+       MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
+       MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
+       MOVE    PROG,USEPRG\r
+       CONSZ   DTS,1           ;JOB DONE LIT?\r
+       CONSZ   DTS,116         ;AND NO ERORS?\r
+       JRST    ERRS            ;NO. ERROR\r
+       SKIPF   ERRFLG          ;DATA MISSED?\r
+       JRST    ERRS            ;YES. TOO BAD\r
+\r
+;DATA WAS READ IN OR WRITTEN OUT FINE\r
+DTCIN2:        TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPTHR          ;YES. GO ELSEWHERE\r
+       TLNN    IOS,SINGL\r
+       JRST    .+3\r
+       LDB     TAC,[POINT 10,BUF,27]  ;GET 1ST BLOCK NO. IF READ\r
+                               ;CAME FROM LOOKUP\r
+       MOVEM   TAC,IBLK(DEVDAT)  ;STORE IN DDB\r
+       TLZE    IOS,IOW         ;NO. IN IO WAIT?\r
+       PUSHJ   PDP,SETIOD      ;YES. TAKE OUT OF WAIT\r
+       TLZE    IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR\r
+                                       ;CLOSING DUMP FILE?\r
+       JRST    THRUTP          ;YES. LEAVE\r
+       TLNE    IOS,IO          ;WRITING?\r
+       JRST    OUTHRU          ;YES\r
+\fEXTERN        JBTSTS,PJOBN\r
+\r
+;HERE ON END OF AN INPUT BLOCK\r
+       HRROI   TAC1,177        ;MASK OUT 1ST-BLK DATA\r
+       TRNN    IOS,UDSD        ;UNLESS IN NON-STD\r
+       ANDM    TAC1,BUF\r
+       MOVEI   TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
+       ADD     TAC,[XWD BUF,1];FROM BUF TO THERE\r
+       MOVEI   TAC1,177(TAC)\r
+       BLT     TAC,(TAC1)      ;TRANSFER IT\r
+       HLRZ    BLK,BUF         ;NEXT BLOCK TO READ\r
+       TRNE    IOS,UDSD        ;IF NON-STD\r
+       AOSA    BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS\r
+       HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+       TRNE    IOS,IODTER+IODERR+IOIMPM ;WAS THERE AN INPUT ERROR?\r
+       JRST    THRUIN          ;YES. DONT ADVANCE BUFFERS\r
+       PUSHJ   PDP,ADVBUFF     ;GET NEXT BUFFER\r
+       JRST    THRUIN          ;EMPTY BUF NOT AVAILABLE\r
+\r
+       SKIPE   BLK             ;EXIT  IF EOF OR BLOCK TOO LARGE\r
+       CAILE   BLK,TOPBLK      ;THE ERROR WILL BE CAUGHT ON THE\r
+       JRST    THRUIN          ;UUO LEVEL NEXT TIME AROUND\r
+       SOSGE   QUANTM          ;HAS TAPE HAD CHAN LONG ENOUGH?\r
+       SKIPG   DTREQ           ;YES. ANYONE ELSE WANT IT?\r
+       JRST    READBC          ;NO. READ NEXT BLOCK\r
+\r
+THRUIN:        HRRZ    TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN?\r
+       JUMPN   TAC,THRUTP      ;YES. DONT CHANGE REVERSE BIT\r
+       TLZ     IOS,RVERSE      ;NO. SET IOS BIT TO CORRECT DIRECTION\r
+       CONSZ   DTC,100000\r
+       TLO     IOS,RVERSE\r
+\f;HERE WHEN TAPE IS DONE\r
+THRUTP:        CONSO   DTC,200000      ;ON INTERRUPT LEVEL?\r
+       JRST    THRUTD          ;NO. TAPE IS NOT MOVING\r
+       MOVE    TAC,UNIT        ;SET TO STOP TAPE\r
+       CONSZ   DTC,10000       ;GOING REVERSE?\r
+       TRO     TAC,10000       ;YES\r
+       CONO    DTC,245000(TAC) ;STOP TAPE, WITH TIME FLAG INTERRUPT ON\r
+                               ;ENABLE JOB DONE AS A FLAG FOR DTCINT\r
+THRUTA:        SOSL    DTREQ            ;GIVE UP DATA CONTROL (DECTAPE CONTROL\r
+       SETOM   DTAVAL           ;WILL BE GIVEN UP AT NEXT INTERRUPT\r
+       TLZ     IOS,DMPMOD+NOBUF ;RESET DUMP-MODE BIT\r
+       JRST    CLRACT  ;RESET IOACT AND RETURN\r
+\r
+THRUTD:        PUSHJ   PDP,THRUTA      ;GIVE UP DATA CONTROL\r
+       SOSL    DTREQ           ;GIVE UP DECTAPE CONTROL\r
+       SETOM   DTAVAL  \r
+       CONO    DC,0            ;SHUT OFF DATA CONTROL\r
+       CONO    PI,DOFF         ;AN TURN OF ITS PI CHANNEL\r
+       CONO    DTC,0           ;SHUT DOWN DATA CONTROL\r
+       HLLZS   DTCINT\r
+       POPJ    PDP,            ;AND LEAVE\r
+\r
+\f      EXTERN  CLOCK\r
+\r
+;HERE ON END OF OUTPUT BLOCK\r
+OUTHRU:        PUSHJ   PDP,ADVBFE      ;GET NEXT BUFFER\r
+       JRST    THRUTP          ;NOT FULL\r
+       JUMPE   BLK,THRUTP      ;DONE IF BLK=0\r
+       HRRZ    BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
+       CAILE   BLK,TOPBLK      ;LEGAL?\r
+       JRST    THRUTP          ;NO. CATCH ERROR ON UUO LEVEL\r
+       SOSGE   QUANTM          ;YES. HAD CHAN LONG ENOUGH?\r
+       SKIPG   DTREQ           ;AND SOMEONE ELSE WANT IT?\r
+       JRST    FILBUF          ;NO. GO WRITE NEXT BLOCK\r
+       JRST    THRUTP          ;YES. GIVE UP TAPE\r
+\r
+TIMINT:        CONSO   DTS,20          ;TIME FLAG INTERRUPT ON?\r
+       JRST    SPRIUS          ;NO. THIS IS A SPURIOUS INTERRUPT\r
+       EXCH    TAC,TIMREQ      ;ANOTHER TAPE CAN NOT BE\r
+       CONO    PI,PIOFF        ;SELECTED FOR 25 MSEC SO\r
+       IDPB    TAC,CLOCK       ;PUT IN A CLOCK REQUEST\r
+       CONO    PI,PION ;TO WAIT FOR 3 TICKS\r
+       EXCH    TAC,TIMREQ      ;BEFORE ALLOWING NEXT USER ON\r
+       CONO    DTC,0           ;SHUT DOWN DTC\r
+       HLLZS   DTCINT\r
+       JEN     @DTCCHL         ;AND LEAVE\r
+\r
+;HERE WITH AN INTERRUPT WHILE SEARCHING FOR BLOCK NUMBERS\r
+BLKNUM:        CONSZ   DTS,2           ;END ZONE INTERRUPT?\r
+       JRST    TURN            ;YES. TURN AROUND\r
+       CONSO   DTS,14          ;NO. ILLEGAL OP OR PARITY ERROR?\r
+       JRST    DTCINT+1        ;NO. NOT REALLY A DECTAPE INTERRUPT\r
+       JRST    DTCIN1          ;YES. GO HANDLE ERROR\r
+\r
+;HERE ON A SPURIOUS DECTAPE INTERRUPT\r
+SPRIUS:        CONI    DTC,TEMPA       ;READ DTC STATUS BITS\r
+       CONO    DTC,@TEMPA      ;GIVE A CONO TO DTC TO CLEAR INTERRUPT\r
+       JEN     @DTCCHL         ;EXIT THE INTERRUPT\r
+\r
+TIMREQ:        XWD     .+1,3   ;E CLOCK TICKS\r
+       SOSL    DTREQ   ;ALLOW OTHER JOBS\r
+       SETOM   DTAVAL  ;TO GET DT CONTROL NOW\r
+       POPJ    PDP,\r
+\f;COME HERE ON END OF DUMP MODE BLOCK\r
+SVDMTH:        IFN CPBIT, <\r
+       TLNE    IOS,NOBUF       ;DIRECTLY TO USER?\r
+       JRST    USDMTH          ;YES. ALMOST THROUGH\r
+>\r
+       MOVSI   TAC1,-177\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD\r
+       SUB     TAC1,ONEONE     ;SET UP TAC1 WITH COUNT\r
+>\r
+       TLNN    IOS,IO\r
+       JRST    SVOMIN          ;INPUT FILE\r
+       HRRZ    BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
+       JUMPF   BLK,DMPTHA      ;LAST BLOCK\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD        ;IF NON-STD MODE\r
+       AOSA    OBLK(DEVDAT)    ;WRITE CONSECUTIVE BLOCKS\r
+>\r
+       CAIG    BLK,TOPBLK      ;NOT LAST. LEGAL BLOCK NUMBER?\r
+       POPJ    PDP,            ;YES. RETURN\r
+\r
+       TRO     IOS,IOBKTL      ;BLOCK TOO LARGE\r
+DMPTHA:        POP     PDP,TAC\r
+DMPTH2:        SETZM   SVDWRD(DEVDAT)  ;ZERO DUMP-MODE STUFF\r
+       SETZM   DMPLST(DEVDAT)\r
+DMPTH3:        TLZE    IOS,IOW         ;IS IO WAIT?\r
+       PUSHJ   PDP,SETIOD      ;YES, RESTART JOB\r
+       JRST    THRUTP\r
+\r
+;HERE ON END SAVE MODE INPUT BLOCK\r
+SVDMIN:        HLRZ    BLK,BUF         ;NEXT BLOCK NUMBER\r
+       IFE     CPBIT, <\r
+       TRNE    IOS,UDSD        ;NON-STANDARD?\r
+       AOSA    BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
+>\r
+       HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+       JRST    CPOPJ1\r
+\r
+       IFN CPBIT, <\r
+;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
+USDMTH:        MOVEI   TAC1,IBLK(DEVDAT)\r
+       TLNE    IOS,IO\r
+       MOVEI   TAC1,OBLK(DEVDAT)       ;SET TAC1 TO RIGHT BLOCK NUMBER\r
+       MOVE    TAC,BLKCNT      ;UPDATE BLOCK COUNTER\r
+       ADDM    TAC,(TAC1)\r
+       JRST    DMPTHA          ;THROUGH\r
+>\r
+\f;HERE WHEN THROUGH DUMP MODE BLOCK\r
+DMPTHR:        PUSHJ   PDP,SVDMTH      ;END OF BLOCK HOUSEKEEPING\r
+       JRST    DMPFLC          ;FILL BUFFER FOR NEXT OUTPUT\r
+\r
+;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
+DMIFIL:        SKIPE   TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
+       JRST    DMIFLB          ;YES. CONTINUE\r
+DMIFLA:        PUSHJ   PDP,NXTCOM      ;NO. GET NEXT COMMAND\r
+       JRST    DMPTH2          ;END OF LIST - THROUGH\r
+DMIFLB:        MOVE    TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
+       MOVEM   TEM,(TAC)       ;GIVE TO USER\r
+       AOBJP   TAC1,.+3        ;IF BUFFER IS FULL\r
+       AOBJN   TAC,DMIFLB      ;GET NEXT WORD\r
+       JRST    DMIFLA          ;GET NEXT COMMAND\r
+\r
+       AOBJN   TAC,.+3         ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
+       PUSHJ   PDP,NXTCOM      ;THAT COM, IS DONE. GET NEXT\r
+       JRST    DMPTH2          ;END OF LIST - THROUGH\r
+       MOVEM   TAC,SVDWRD(DEVDAT)  ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
+       JUMPE   BLK,DMPEOF      ;IF EOF - LIGHT BIT\r
+RDNXT: CAIG    BLK,TOPBLK      ;BLOCK LEGAL?\r
+       JRST    READBC          ;GO READ BLOCK NUMBER\r
+       TROA    IOS,IOBLKT      ;LIGHT ERROR BIT\r
+\r
+;EOF BEFORE ALL DATA IS IN - DUMP MODE\r
+DMPEOF:        TRO     IOS,IODEND      ;LIGHT EOF BIT\r
+       JRST    DMPTH2          ;GIVE UP TAPE\r
+\fSVADER:       PUSHJ   PDP,DMPTH2      ;GIVE UP CONTROL\r
+       JRST    ADRERR          ;TYPE ERROR MESSAGE\r
+\r
+\r
+;COME HERE ON ERROR\r
+ERRS:  AOS     TAC,ERRCNT      ;BUMP COUNT\r
+       IFN CPBIT, <\r
+       MOVE    TAC1,SVPNTR     ;YES. RESET POINTERS\r
+       MOVEM   TAC1,USPNTR\r
+       MOVE    TAC1,(TAC1)     ;RESET PNTR\r
+       ADD     TAC1,ADRPRG\r
+       MOVEM   TAC1,PNTR\r
+>\r
+ERRS1: CONSO   DTS,4           ;IF ILLEGAL OP - DONT RETRY\r
+       CAILE   TAC,DTTRY       ;ENOUGH REREADS?\r
+       SKIPA                   ;YES. PERMANENT ERROR\r
+       JRST    FNDBL2          ;NO. TRY AGAIN\r
+\r
+;PERMANENT ERROR\r
+\r
+PERMER:        CONSZ   DTS,10  \r
+       TRO     IOS,IODTER      ;PARITY\r
+       CONSO   DTS,100\r
+       SKIPE   ERRFLG\r
+       TRO     IOS,IODERR      ;MISSING DATA\r
+       CONSZ   DTS,4\r
+NOBLK0:        TRO     IOS,IOIMPM      ;ILLEGAL OP\r
+       TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    DMPTHR          ;YES. NOT THROUGH YET\r
+       TLNN    IOS,IO+RWDIR+SINGL ;READING DATA?\r
+       JRST    DTCIN2          ;YES. GIVE BUFFER TO USER\r
+       TLZE    IOS,IOW\r
+       PUSHJ   PDP,SETIOD      ;OUT OF IO WAIT\r
+       TLZN    IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
+       JRST    THRUTP          ;NO. RETURN TO USER\r
+       PUSHJ   PDP,THRUTP      ;YES. STOP TAPE\r
+       MOVSI   TAC,DVDIRIN     ;CLEAR DIRECTORY IN CORE BIT\r
+       ANDCAM  TAC,DEVMOND(DEVDAT)\r
+BDDIR: LDB     ITEM,PJOBN      ;NUMBER OF OFFENDING JOB\r
+       JRST    RADDIR          ;GO PRINT ERROR MESSAGE\r
+\f      INTERN  DTABUF\r
+BFPNTR:        IOWD    200,BUF+1\r
+ONEONE:        XWD     1,1\r
+USEWRD:        0\r
+USEPRG:        0\r
+PNTR:  0\r
+TEMP:  0\r
+TEMPA: 0\r
+BLOCK: 0\r
+QUANTM:        0\r
+ERRCNT:        0\r
+FNDTMP:        0\r
+UNIT:  0\r
+COMAND:        0\r
+ERRFLG:        0\r
+       IFN CPBIT, <\r
+BLKCNT:        0\r
+SVPNTR:        0\r
+USPNTR:        0\r
+ADRPRG:        0\r
+DIRCNT:        0\r
+>\r
+BUF:   BLOCK   200\r
+DTAEND:        END\r
+\f\r
diff --git a/src/eddt.mac b/src/eddt.mac
new file mode 100644 (file)
index 0000000..068ab5b
--- /dev/null
@@ -0,0 +1,2807 @@
+       IFNDEF EDDT,<\r
+       EDDT=1                  ;MAKE EXEC DDT\r
+>\r
+;ALL OTHER REFERENCES TO VERSION # ARE TAKEN CARE OF BY THIS DEFINITION\r
+\r
+DDTVER==22\r
+\r
+SUBTTL   2 JUN 69\r
+REPEAT 0,<\r
+\r
+       \r
+DDT ASSEMBLY INSTRUCTIONS\r
+\r
+THE SOURCE OF DDT,13 WILL ASSEMBLE INTO SEVERAL DIFFERENT\r
+VERSIONS; THE ASSEMBY IS CONTROLED BY THE VALUE ASSIGNED\r
+TO THE SYMBOL "EDDT". THE SYMBOL "EDDT" IS DECODED AS FOLLOWSR:\r
+\r
+BIT 35 =0:     ASSEMBLE USER MODE DDT\r
+       =1:     ASSEMBLE AN EXECUTIVE MODE DDT\r
+\r
+BIT 34 =0:     DO NOT ASSEMBLE THE PAPER TAPE FEATURE INTO DDT\r
+       =1:     ASSEMBLE THE PAPER TAPE FEATURES BUT ONLY IF\r
+                       ASSEMBLING AN EXECUTIVE MODE DDT\r
+BIT 33 =0;     FOR USER MODE DDT ONLY- ASSEMBLE USING THE\r
+                       "TTCALL" UUO FOR TELETYPE IO\r
+       =1;     FOR USER MODE DDT ONLY- ASSEMBLE USING THE\r
+                       "DDTIN" AND "DDTOUT" UUO'S FOR TELETYPE IO\r
+\r
+BIT 32 =1;     ASSEMBLE A FILE DDT\r
+\r
+BITS (0-17)\r
+       =0;     ASSEMBLE A RELOCATABLE VERSION OF DDT (RELOC 0)\r
+     NOT=0;    ASSEMBLE AN ABSOLUTE (NON-RELOCATABLE) VERSION\r
+                       OF DDT WITH A STARTING ADDRESS BEING THE\r
+                       NUMBER IN BITS 0-17\r
+\r
+(IF THE SYMBOL "EDDT" IS NOT DEFINED AT ALL, DDT WILL BE ASSEMBLED\r
+       WITH EDDT=0.)\r
+\r
+EXAMPLES OF "EDDT" DEFINTIONS:\r
+       EDDT=0  ASSEMBLE A RELOCATABLE USER MODE DDT WITH TELETYPE\r
+               I/O DONE BY THE "TTCALL" UUO\r
+\r
+       EDDT=1  ASSEMBLE A RELOCATABLE EXECUTIVE MODE DDT\r
+\r
+       EDDT=<XWD 4000,3>\r
+               ASSEMBLE AN ABSOLUTE EXECUTIVE MODE DDT\r
+               WITH PAPER TAPE FEATURES, AND WHOSE STARTING\r
+               ADDRESS IS LOCATION 4000.\r
+\r
+EXAMPLE OF A MACRO ASSEMBLY COMMAND:\r
+\r
+.^C\r
+\r
+.R MACRO\r
+\r
+*DSK:UDDT,/C_TTY:,DTA2:DDT.12\r
+EDDT=0\r
+^Z\r
+\r
+END OF PASS 1                  ;THIS LINE TYPED BY MACRO\r
+\r
+^Z\r
+\r
+NO ERRORS DETECTED             ;TYPED BY MACRO\r
+\r
+PROGRAM BREAK IS 003340                ;TYPED BY MACRO\r
+\r
+*                              ;TYPED BY MACRO\r
+\r
+\r
+OTHER VERSION OF DDT ARE ASSEMBLED IN A SIMILAR MANNER\r
+BY DEFINING "EDDT": A DIFFERENT WAY WHERE THE EXAMPLE\r
+DEFINED "EDDT=0".\r
+\r
+>      ;END OF REPEAT 0\r
+\r
+\f\r
+IFNDEF EDDT,<EDDT=0>\r
+\r
+DEFINE XP (X.,Y.),<\r
+       IF2,<X.=Y.\r
+       INTERN X.>>\r
+\r
+\r
+IFN EDDT&1,<DEFINE HEADER (VERSION),<\r
+       TITLE EDDT      V0'VERSION      -EXEC MODE DDT\r
+       JOBREL=37\r
+       JOBSYM=36\r
+       ZLOW=40\r
+>>\r
+\r
+IFE EDDT&1,<DEFINE HEADER (VERSION),<\r
+IFE EDDT&10,<\r
+       TITLE UDDT      V0'VERSION      -USER MODE DDT>\r
+IFN EDDT&10,<\r
+       TITLE FILDDT    V0'VERSION      -FILE DDT>\r
+       EXTERN JOBREL,JOBSYM,JOBSA\r
+       ZLOW=140>>\r
+\r
+;DO NOT SET LOWER CORE IF EXEC DDT(OK USER OR FILDDT)\r
+IFE EDDT&1,<\r
+JOBVER=137\r
+       LOC JOBVER\r
+       DDTVER                  ;PUT VERSION # IN JOBVER\r
+JOBDDT=74\r
+       LOC JOBDDT\r
+       XWD DDTEND,DDT\r
+RELOC 0\r
+>\r
+\r
+\r
+IFN EDDT&<XWD -1,0>,<LOC <EDDT>B53>\r
+\r
+HEADER \DDTVER^\r
+               ;THE HEADER MACRO CONSTRUCTS THE TITLE AND VERSION #\r
+\r
+IFN EDDT&10,<  CM=2            ;DEFINE SOFTWARE CHANS.\r
+               DP=3\r
+>\r
+\f;DEFINE ACCUMULATORS\r
+\r
+F=0            ;FLAGS\r
+P=1            ;PUSH DOWN\r
+R=<A=2>                ;POINTERS TO TABLES, CORE, ETC.\r
+S=<B=3>\r
+W=<C=4>                ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER\r
+T=5            ;TRANSFER DATA\r
+W1=6\r
+W2=7\r
+SCH=10         ;MODE CONTROL SWITCH FOR OUTPUT\r
+AR=11          ;MODE CONTROL SWITCH FOR OUTPUT\r
+ODF=12         ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX\r
+TT=13          ;TEMPORARY\r
+TT1=14 ;TEMPORARY\r
+\r
+;DEFINE I/O DEVICE MNEMONICS FOR DDT USE\r
+PRS=4\r
+TTYY=120\r
+PTRR=104\r
+PTPP=100\r
+\r
+;DEFINE PUSH DOWN LENGTH\r
+LPDL=50                ;MAX LENGTH PUSH DOWN LIST\r
+\r
+;DEFINE BITS FOR USE IN LEFT HALF OF ACCUMULATOR F\r
+COMF=200000            ;COMMA TYPED FLAG\r
+TIF=100000             ;TRUNCATE TO 18 BITS -  SET BY SPACE OR COMMA\r
+PTF=100                ; +, -, OR * HAS BEEN TYPED\r
+CTF=400\r
+SF=4           ;SYLLABLE FLAG\r
+QF=1           ;QUANTITY TYPED IN TO WORD ASSEMBLER\r
+\r
+CF=40          ; $  TYPED\r
+CCF=10000      ; $$  TYPED\r
+MF=2           ;MINUS SIGN TYPED IN\r
+LTF=20         ;LETTER TYPED IN TO CURRENT SYLLABLE\r
+ROF=10         ;REGISTER OPEN FLAG\r
+STF=4000\r
+FAF=1000               ; < TYPED\r
+SAF=2000               ; > TYPED\r
+\r
+FPF=20000              ; . TYPED IN\r
+FEF=400000             ; E FLAG\r
+\r
+MLF=200                ;*FLAG\r
+DVF=40000              ;DIVIDE FLAG\r
+\r
+;PID IS 20 IF SYM TAB POINTER IS INDIRECT JOBSYM\r
+PID=0          ;=0 IF SYMBOL TABLE POINTER IS IN JOBSYM\r
+\f\r
+;DEFINE BITS FOR USE IN RIGHT HALF OF ACCUMULATOR F\r
+\r
+ITF=2  ;INSTRUCTION TYPED IF ITF=1\r
+OUTF=4 ;OUTPUT IF OUTF=1\r
+CF1=400                ;OUTPUT 1 REGISTER AS CONSTANT\r
+LF1=2000               ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT\r
+Q2F=1          ;NUMBER TYPED AFTER ALT MODE \r
+R20F=10        ;TEMP FLAG USED IN SETUP\r
+SBF=20\r
+NAF=200                ;NEGATIVE ADDRESSES PERMISSABLE\r
+POWF=4000              ;ARGUMENT FOR EXPONENT COMING\r
+\r
+;DEFINE SYMBOL TABLE SYMBOL TYPES\r
+GLOBAL=040000          ;GLOBAL SYMBOL\r
+LOCAL=100000\r
+PNAME=740000           ;PROGRAM NAME\r
+DELI=200000            ;DELETE INPUT\r
+DELO=400000            ;DELETE OUTPUT\r
+\r
+DDT:   INTERN DDTEND   ;DECLARE END OF DDT AS INTERNAL, FOR\r
+                       ; USER TO SEE (USER MODE) AND ONCE ONLY CODE\r
+                       ; (MONITOR)\r
+       IFE EDDT&1,<    ENTRY DDT\r
+               >\r
+       IFN EDDT&1,<    INTERNAL DDT\r
+                       DDTX=DDT\r
+                       ENTRY DDTX              ;NEEDED BY MONITOR>\r
+\r
+;DEFINE $ SYMBOLS INTERNAL TO DDT\r
+OPDEF DDTINT [Z 0,]            ;ADDRESS FLAG FOR INTERNAL REGISTERS\r
+\r
+RADIX 10\r
+NBP=8  ;NUMBER OF BREAKPOINTS\r
+DEFINE DBPNT (Z.)<XP $'Z.'B,B1ADR+3*Z.-3>\r
+ZZ=0\r
+REPEAT NBP,<DBPNT \<ZZ=ZZ+1>>\r
+RADIX 8\r
+\r
+\r
+XP $M,MSK\r
+XP $I,SAVPI\r
+\r
+SETUWP=36\r
+\r
+\f;DEFINE I/O DEVICE MNEMONICS\r
+\r
+IFN EDDT&1,<\r
+\r
+XP PI,4B11\r
+XP PTP,100B11\r
+XP PTR,104B11\r
+XP CDR,114B11\r
+XP TTY,120B11\r
+XP LPT,124B11\r
+XP DC,200B11\r
+XP DIS,130B11\r
+XP PLT,140B11\r
+XP CR,150B11\r
+XP DSK,170B11\r
+XP UTC,210B11\r
+XP UTS,214B11\r
+XP DCSA,300B11\r
+XP DCSB,304B11\r
+\r
+XP DF,270B11\r
+XP MTC,220B11\r
+XP MTS,224B11\r
+XP MTM,230B11\r
+XP DLS,240B11\r
+XP MDF,260B11\r
+XP DTC,320B11\r
+XP DTS,324B11\r
+XP TMC,340B11\r
+XP TMS,344B11  >\r
+\r
+;DEFINE EXTENDED OPERATIONS\r
+\r
+XP JOV,2554B11\r
+XP JEN,2545B11\r
+XP HALT,2542B11\r
+\r
+\fIFE EDDT&10,<\r
+DDT:   JSR SAVE\r
+       PUSHJ P,REMOVB\r
+       HLRZ T,ESTU             ;THIS SEQUENCE INITS SYM TABLE LOGIC\r
+       SUB T,ESTU\r
+       MOVE W,@SYMP\r
+       ADD T,W         ;IF THE TOP OF THE UNDEFINED SYM TAB DOES\r
+       TRNE T,-1               ; NOT POINT TO BOTTOM OF REGULAR SYM TABLE,THEN\r
+       HRRZM W,ESTU            ; RE-INIT UNDEFINED SYM TABLE POINTER. ESTU.\r
+       MOVE T,PRGM\r
+       SUB T,W         ;IF THE SYM TABLE PNTR AND THE PROGRAM\r
+       TSC T,T         ; NAME (PRGM) PNTR DO NOT END UP IN THE\r
+       MOVE W1,PRGM            ; SAME PLACE. OR THEY DO NOT BOTH START ON\r
+       XOR W1,W                ; AN EVEN (OR BOTH ON ODD) LOCATION. OR\r
+       TRNE W1,1               ; PRGM .GE.0, THEN RE-INIT PRGM.\r
+       JRST DDT2               ;EVEN-ODD PROBLEM\r
+       SKIPN T         ;POINTERS DON'T END TOGETHER\r
+       SKIPL PRGM              ;IF PRGM .GE. 0, THEN RE-INIT\r
+DDT0:  MOVEM W,PRGM            ;PRGM=C(JOBSYM)\r
+>\r
+\fIFN EDDT&10,<\r
+DDT:   CALLI\r
+       MOVEI T,SYMSET\r
+       MOVEM T,JOBREN          ;SET REENTER ADDRESS\r
+       MOVEI P,PS\r
+       INIT 1,17\r
+       SIXBIT .DSK.\r
+       Z\r
+       HALT .-3\r
+       SETZM CRASH+3           ;CLEAR PPN\r
+       SETZM COMNDS+3          ;CLEARN PPN IN CASE FILDDT SAVED AFTER STARTING\r
+       SETZM SNAP+3            ;ALSO GOOD PRACTICE TO BE SELF INITIALIZING\r
+       SETZM CRASHS            ;ASSUME NO CRASH.SAV(IE. PEEK AT CURRENT MONITOR)\r
+       LOOKUP 1,CRASH\r
+       JRST NOCSH              ;LET USER PASS. HE MAY WANT TO PEEK AT MON.\r
+                               ; OR JUST WANT TO TYPE OUT VALUE OF SOME SYMBOLS\r
+       SETOM CRASHS            ;FLAG CRASH.SAV EXISTS ON DSK\r
+       USETI 1,1\r
+       INPUT 1,RSILST\r
+\r
+       STATZ 1,740000\r
+       HALT .-3\r
+       SETOM RSAVE             ;FORCE READING OF "CURRENT" BLOCK\r
+                               ; ON FIRST EXAMINE\r
+NOCSH: INIT CM,0\r
+       SIXBIT .SYS.\r
+       XWD 0,CBUF\r
+       HALT .-3\r
+       SETOM COMAND            ;ASSUME A COMMAND FILE\r
+       LOOKUP CM,COMNDS\r
+NOLPT: SETZM COMAND            ;NO FILE IF NOT FOUND\r
+       SKIPM COMAND\r
+       JRST DD1                ;USE TTY I/O\r
+       INIT DP,1\r
+       SIXBIT .,LPT.           ;PREPARE FOR LPT OUTPUT IN AL MODE\r
+       XWD LBUF,0      \r
+       JRST NOLPT              ;TREAT AS THO NO FILE\r
+       ENTER DP,SNAP\r
+       JRST NOLPT              ;TREAT AS NO FILE IF CAN'T ENTER\r
+       JRST DD1\r
+\r
+REPEAT 0,<\r
+HOW TO COPY MONITOR SYMBOL TABLE INTO FILDDT\r
+1) USE FDDD10 TO LOAD AN UNRUN VERSION OF YOUR MONITOR\r
+   AS SAVED AFTER BUILD OR LOADING.\r
+2) RENAME IT AS CRASH.SAV\r
+3) LOAD A PRISTINE VERSION OF FILDDT AND START IT TO SET\r
+   REENTER ADDRESS.\r
+4) TYPE ^C   REENTER\r
+5) FILDDT WILL EXPAND AS NECESSARY AND COPY THE SYMBOL\r
+   TABLE FROM CRASH.SAV INTO ITSELF\r
+6) AFTER CARRIAGE RETURN IS TYPED FILDDT IS DONE.\r
+7) SAVE FILDDT WITH A NEW NAME SO AS NOT TO CONFUSE IT WITH THE\r
+   ORIGINAL FILDDT.SAV\r
+\f\r
+THE MONITOR CAN BE LOADED IN ANY OF THREE WAYS(IN ORDER OF PREFERENCE):\r
+   1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON\r
+   2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER & COMMON\r
+   3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD\r
+\r
+THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116) & T30SYM(131) IN DIFFERENT STATES:\r
+\r
+       DDTSYM          JOBSYM          T30SYM\r
+\r
+   1.  JUNK            S.T.PTR         JUNK\r
+   2.  JUNK            JUNK(NON-NEG)   S.T.PTR\r
+   3.  S.T.PTR         S.T.PTR         JUNK\r
+>\r
+\r
+DDTSYM=36\r
+\r
+T30SYM=131\r
+\r
+EXTERNAL JOBFF,JOBREN\r
+\r
+SYMSET:        MOVEI R,JOBSYM\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       MOVEM T,JOBSYM          ;POSSIBLE SYMBOL POINTER\r
+       MOVEI R,DDTSYM\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       MOVEM T,DDTSTP          ;YET ANOTHER CANIDATE\r
+       MOVEI R,T30SYM          ;ASSUME LOADED BY 10/30\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       SKIPL JOBSYM            ;OR IS JOBSYM A POINTER (-VE)?\r
+       JRST REGT30             ;LOADED BY 10/30\r
+       SKIPL DDTSTP            ;DDTSYM A VALID POINTER (-VE)?\r
+       MOVE T,JOBSYM           ;NO TAKE JOBSYM AS THE POINTER\r
+REGT30:        MOVEM T,JOBSYM          ;SAVE IT OVER OLD JOBSYM\r
+       HLRES T,T\r
+       MOVMS T,T               ;LENGTH OF SYMBOL TABLE\r
+       MOVE W,JOBFF\r
+       ADDI W,1300             ;LEAVE SPAVE FOR COMMAND & LPT BUFFERS.\r
+                               ; OR DSK BUFFERS AND EXTRA SYMBOL DEFNS.\r
+       HRRZ W1,W               ;SAVE LOC FOR COPY\r
+       ADD W,T                 ;ADD TABLE LENGTH\r
+       IORI W,1777             ;REQUEST INTEGRAL # OF K.\r
+       CALLI W,11              ;GET CORE\r
+       HALT                    ;UGH!\r
+       MOVE R,JOBSYM           ;WHEREABOUTS OF MONITOR SYMBOLS\r
+       HRRM W1,JOBSYM          ;NOW POINT TO FILDDT SYMBOLS\r
+TCOPY: PUSHJ P,FETCH           ;GET A WORD\r
+       JRST ERR\r
+       MOVEM T,0(W1)           ;STASH IT\r
+       AOS W1\r
+       AOBJN R,TCOPY   \r
+       JRST NOLPT              ;GO TRY IT\r
+DDTSTP:        Z                       ;SAVE POSSIBLE SYMBOL POINTER\r
+>\r
+\f\r
+\r
+DD1:   PUSHJ P,CRF\r
+DD1.5: TLZ F,ROF               ;CLOSE ANY OPEN REGISTER\r
+       MOVE T,[XWD SCHM,SCH]\r
+       BLT T,ODF               ;LOAD ACS\r
+DD2:   CLEARM PRNC             ;PARENTHESES COUNT\r
+       MOVEI P,PS\r
+LIS:   MOVE T,ESTU\r
+       MOVEM T,ESTUT           ;INIT UNDEFINED SYM ASSEM\r
+       TDZ F,[XWD 777777-ROF-STF,LF1+CF1+SBF+2+Q2F]\r
+LIS0:  TDZ F,[XWD 777777-ROF-STF-FAF-SAF,NAF]\r
+       CLEARM,WRD\r
+LIS1:  CLEARM,FRASE\r
+LIS2:  MOVEI T,1\r
+       MOVEM T,FRASE1\r
+       TLZ F,MLF+DVF\r
+L1:    TLZ F,CF+CCF+SF+FPF             ;TURN OFF CONTROL, SYL, PERIOD FLAG\r
+       CLEARM,SYL\r
+L1RPR: CLEARM,SYM\r
+       MOVEI T,6\r
+       MOVEM T,TEM             ;INIT SYMBOL COUNTER\r
+       MOVE T,[POINT 7,TXT]\r
+       MOVEM T,CHP             ;SETUP FOR OPEVAL SYMBOL\r
+       CLEARM,DEN\r
+       CLEARM,WRD2\r
+\r
+L2:    PUSHJ P,TIN             ;PICK UP CHARACTER\r
+       CAIL T,"A"+40           ;LOWER CASE A\r
+       CAILE T,"Z"+40          ;LOWER CASE Z\r
+       JRST .+2\r
+       TRC T,40                ;CHANGE LOWER CASE TO UPPER CASE\r
+       TLNE F,CF               ;CONTROL FLAG\r
+       JRST L21\r
+       CAIG T,"Z"              ;Z\r
+       CAIGE T,"A"             ;A\r
+       JRST .+2\r
+       JRST LET\r
+L21:   MOVE R,T\r
+       CAILF T,137     ;DISPATCH TABLE HAS ENTRIES ONLY .LE. 137\r
+       JRST ERR\r
+       IDIVI R,3               ;REMAINDER GIVES COLUMN, QUOTIENT GIVES ROW\r
+       LDB W,BDISP(R+1)        ;GET 12 BIT ADDRESS FROM DISPATCH TABLE\r
+       CAIGE W,MULT-DDT        ;FIRST EVAL ROUTINE\r
+       JRST DDT(W)\r
+\f      MOVE T,SYL\r
+       TLZN F,LTF\r
+       JRST POWER\r
+       MOVE T,[XWD OPEVAL,EVAL]        ;GET ADDRESSES OF LOOKUP ROUTINES\r
+       SKIPN WRD               ;IF C(WRD)=0, CALL OPEVAL FIRST, OTHERWISE EVAL FIRST\r
+       MOVSS T\r
+       MOVEM T,SAVE\r
+       JRST L213\r
+\r
+L212:  HLRZS T,SAVE            ;GET ADDRESS OF THE OTHER LOOKUP ROUTINE\r
+       JUMPE T,UND1            ;IF ADR=0, THEN SYMBOL UNDEFINED\r
+L213:  PUSHJ P,(T)     ;CALL OPEVAL OR EVAL\r
+       JRST L212               ;SYMBOL NOT FOUND\r
+L4:    TLZE F,MF\r
+       MOVN T,T\r
+       TLNN F,SF\r
+       CAIE W,LPRN-DDT\r
+       JRST .+2\r
+       JRST LPRN\r
+\r
+       EXCH T,FRASE1\r
+       TLNN F,DVF\r
+       IMULB T,FRASE1\r
+       TLZE F,DVF\r
+       IDIVB T,FRASE1\r
+       CAIGE W,ASSEM-DDT\r
+       JRST DDT(W)             ;MULTIPLY OR DIVIDE\r
+       ADDB T,FRASE\r
+       CAIGE W,SPACE-DDT\r
+       JRST DDT(W)             ; + - @ ,\r
+\r
+       ADD T,WRD\r
+       TLNE F,TIF              ;TRUNCATE INDICATOR FLAG\r
+       HLL T,WRD               ;TRUNCATE\r
+       MOVEM T,WRD\r
+       TLNN F,QF\r
+       MOVE T,LWT\r
+       CLEARM,R\r
+       MOVE W1,ESTUT\r
+       CAMN W1,ESTU\r
+       JRST L5\r
+       CAILE W,CARR-DDT\r
+       JRST ERR\r
+L5:    CAIG W,RPRN-DDT\r
+       JRST DDT(W)\r
+       PUSH P,KILRET\r
+       SKIPN PRNC\r
+       JRST DDT(W)\r
+\f\r
+ERR:   MOVEI W1,"?"\r
+       JRST WRONG1\r
+UNDEF: MOVEI W1,"U"\r
+       JRST WRONG1\r
+WRONG: MOVE W1,[ASCII /XXX/]\r
+WRONG1:        MOVEI P,PS\r
+       PUSHJ P,TEXT\r
+       PUSHJ P,LCT             ;TYPE TAB\r
+       PUSHJ P,LISTEN          ;GOBBLE ANY INPUT CHARACTER\r
+       JFCL\r
+       JRST DD2\r
+RET:   MOVEI P,PS\r
+       PUSHJ P,LCT             ;COMMON RETURN FOR TAB;,JRST LIS\r
+       JRST DD2\r
+\f\r
+UND1:  MOVE R,ESTUT            ;UNDEFINED SYM ASSEMBLER\r
+       HLRE S,ESTUT\r
+       ASH S,-1                ;SETUP EVAL END TEST\r
+       PUSHJ P,EVAL2\r
+       CAIN W,ASSEM-DDT\r
+       TLNN F,ROF\r
+       JRST UNDEF\r
+       SKIPE PRNC\r
+       JRST UNDEF\r
+       MOVEI T,"#"\r
+       CAIE W,ASSEM-DDT\r
+       PUSHJ P,TOUT\r
+\r
+       MOVN R,[XWD 2,2]\r
+       ADDB R,ESTUT\r
+       MOVE T,SYM\r
+       TLO T,GLOBAL\r
+       MOVEM T,(R)\r
+\r
+       HRRZ T,LLOCO\r
+       TLNE F,MF\r
+       TLO T,400000\r
+       MOVEM T,1(R)\r
+       MOVEI T,0\r
+       JRST L4\r
+\r
+QUESTN:        PUSHJ P,CRF             ;LIST UNDEFINED SYMBOLS\r
+       MOVE R,ESTU\r
+QUEST1:        JUMPGE R,DD1\r
+       MOVE T, (R)\r
+       SKIPA W1,ESTU\r
+\r
+QUEST2:        ADD W1,[XWD 2,2]\r
+       CAME T,(W1)\r
+       JRST QUEST2\r
+       CAME R,W1\r
+       JRST QUEST4\r
+       PUSHJ P,SPT\r
+       PUSHJ P,CRF\r
+QUEST4:        ADD R,[XWD 2,2]\r
+       JRST QUEST1\r
+\fNUM:  ANDI T,17               ;T HOLDS CHARACTER\r
+       TLNE F,CF+FPF\r
+       JRST NM1\r
+       MOVE W,SYL\r
+       LSH W,3\r
+       ADD W,T\r
+       MOVEM W,SYL\r
+       MOVE W,DEN\r
+       IMULI W,12              ;CONVERT TO DECIMAL\r
+       ADD W,T\r
+       MOVEM W,DEN\r
+       AOJA T,LE1A\r
+\r
+DOLLAR:        SKIPA T,[46+101-13]     ;RADIX 50 $ TO BE\r
+PERC:  MOVEI T,47+101-13       ;PERCENT SIGN\r
+LET:   TLC F,SF+FPF            ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1\r
+       TLZN F,LTF+FEF+SF+FPF\r
+       CAIE T,105              ; E\r
+       TLOA F,LTF\r
+       TLOA F,FEF\r
+       JRST LET1\r
+       TLZN F,MF\r
+       SKIPA W1,SYL\r
+       MOVN W1,SYL\r
+       MOVEM W1,FSV\r
+       CLEARM DEN\r
+LET1:  SUBI T,101-13           ;FORM RADIX 50 SYMBOL\r
+LE1A:  TLO F,SF+QF\r
+LE2:   MOVE W,SYM\r
+       MOVEI R,101-13(T)\r
+       IMULI W,50              ;CONVERT TO RADIX 50\r
+       ADD W,T\r
+       SOSGE TEM               ;IGNORE CHARACS AFTER 6\r
+       JRST L2\r
+       MOVEM W,SYM\r
+       IDPB R,CHP\r
+       MOVEM W,SYM\r
+       JRST L2\r
+\fNUM1: EXCH T,WRD2             ;FORM NUMBER AFTER $\r
+       IMULI T,12\r
+       ADDM T,WRD2\r
+       TRO F,Q2F\r
+       JRST L2\r
+\r
+NM1:   TLNE F,CF\r
+       JRST NUM1\r
+       MOVEI W1,6              ;FORM FLOATING POINT NUMBER\r
+       AOS NM1A\r
+NM1A:  MOVEI W2,0\r
+       MOVSI R,201400\r
+NM1A1: TRZE W2,1\r
+       FMPR R,FT(W1)\r
+       JUMPE W2,NM1B\r
+       LSH W2,-1\r
+       SOJG W1,NM1A1\r
+NM1B:  MOVSI W1,211000(T)\r
+       FMPR    R,W1            ;COMPUTE VALUE OF NEW DIGIT\r
+\r
+       FADRB   R,FH            ;ADD VALUE INTO FLOATING NO.\r
+       MOVEM R,SYL\r
+       AOJA T,LE1A\r
+\r
+POWER: TLNN F,FEF\r
+       JRST L4         ;NO EXPONENT\r
+       CAIE W,PLUS\r
+       CAIN W,MINUS\r
+       TROE F,POWF\r
+       TRZA F,POWF\r
+       JRST (W)                ; E+-\r
+\r
+       MOVE W2,DEN\r
+       CLEARM FRASE\r
+       MOVEI W1,FT-1\r
+       TLZE F,MF\r
+       MOVEI W1,FT01\r
+       SKIPA T,FSV\r
+POW2:  LSH W2,-1\r
+       TRZE W2,1\r
+       FMPR T,(W1)\r
+       JUMPE W2,L4\r
+       SOJA W1,POW2\r
+\fPERIOD:       MOVE T,LLOC\r
+       TLNE F,SF               ;SYLLABLE STARTED\r
+       MOVE T,DEN\r
+       MOVEM T,SYL\r
+       TLNE    F,FPF           ;HAS A PERIOD BEEN SEEN BEFORE?\r
+       TLO     F,LTF           ;YES, TWO PERIODS MAKES A SYMBOL\r
+       TLON F,FPF+SF+QF\r
+       MOVEI T,0\r
+       IDIVI T,400\r
+       SKIPE T\r
+       TLC T,243000\r
+       TLC W1,233000\r
+       FAD     T,[0]           ;NORMALIZE T AND W1\r
+       FAD     W1,[0]\r
+       FADR    T,W1\r
+       MOVEM T,FH\r
+       HLLZS NM1A\r
+       MOVEI T,45              ;RADIX 50 PERIOD\r
+       JRST LE2\r
+\r
+QUAN:  SKIPA T,LWT             ;LAST QUANTITY TYPED\r
+PILOC: MOVEI T, SAVPI\r
+QUAN1: MOVEM T,SYL\r
+QUAN2: TLO F,SF+QF             ;WRD,SYL STARTED\r
+       TLZ F,CF+CCF\r
+       JRST L2\r
+\r
+CONTRO:                                ;SOME KIND OF ALTMODE\r
+IFN EDDT&1,<   MOVEI T,"$"     ;$\r
+       PUSHJ P,TOUT            ;TYPE OUT $\r
+>\r
+       TLOE F,CF\r
+       TLO F,CCF\r
+       JRST L2\r
+\fEVAL: MOVE R,PRGM             ;LOOK UP SYMBOL\r
+EVAL0: HRLOI W1,37777+DELI\r
+       HLRE S,@SYMP\r
+       ASH S,-1        ;SETUP END TEST\r
+       JRST EVAL3\r
+\r
+EVAL1: ADD R,[XWD 2,2]\r
+EVAL2: SKIPL R\r
+       MOVE R,@SYMP\r
+       AOJG S,CPOPJ            ;TRNASFER IF NO SYMBOL FOUND\r
+EVAL3: MOVE T,(R)\r
+       XOR T,SYM\r
+       TLNN T,PNAME\r
+       TLOA W1,LOCAL\r
+       TDNE T,W1\r
+       JRST EVAL1\r
+       TLNN T,340000\r
+       JRST EVAL1\r
+       MOVE T,1(R)\r
+\r
+CPOPJ1:        AOS (P)         ;FOUND SYMBOL, SKIP\r
+CPOPJ: POPJ P,\r
+\r
+;BIT 40 - DELETE OUTPUT\r
+; 20 - DELETE INPUT\r
+; 10 - LOCAL\r
+; 04 -GLOBAL\r
+; NO BITS - PROGRAM NAME\r
+\r
+TEXI:  PUSHJ P,TEXIN           ;INPUT TEXT\r
+       MOVEM T,SYL\r
+       MOVEI W1,5\r
+       MOVEI T-1,0\r
+       PUSHJ P,TEXIN\r
+       CAIN T,33               ;NEW ALT MODE, ESCAPE\r
+       JRST QUAN2\r
+       TLNE F,CF\r
+       JRST SIXBIN\r
+       SKIPA\r
+TEXI2: PUSHJ P,TEXIN\r
+       CAMN T,SYL\r
+       SOJA W1,TEXI3\r
+       ROT T,-7\r
+       LSHC T-1,7\r
+       SOJA W1,TEXI2\r
+\r
+TEXI3: LSHC T-1,-43\r
+       JUMPL W1,QUAN1\r
+       LSH T,7\r
+       SOJA W1,.-2\r
+\fSIXBI1:       PUSHJ P,TEXIN    ; INPUT TEXT (SIXBIT)\r
+SIXBIN:        CAMN T,SYL\r
+       JRST SIXBI2\r
+       ANDI T,77\r
+       TRC T,40\r
+       ROT T,-6\r
+       LSHC T-1,6\r
+       SOJA W1,SIXBI1\r
+SIXBI2:        MOVE T,T-1\r
+       JUMPL W1,QUAN1\r
+       LSH T,6\r
+       SOJA W1,.-2\r
+\r
+KILL:  TLNN F,LTF              ;DELETE SYMBOLS\r
+       JRST ERR\r
+       PUSHJ P,EVAL\r
+       JRST KILL1\r
+       MOVEI T,DELO/200000             ;DELETE OUTPUT\r
+       TLNE F,CCF\r
+       MOVEI T,DELI/200000             ;NO INPUT OR OUTPUT\r
+       DPB T,[POINT 2,(R),1]   ;LEFT 2 BITS IN SYMBOL\r
+KILRET:        JRST RET                ;USED AS A CONSTANT\r
+\r
+\r
+KILL1: MOVE R,ESTU             ;REMOVE UNDEFINED SYMS\r
+       JUMPGE R,UNDEF\r
+KILL2: PUSHJ P,EVAL0\r
+       JRST RET\r
+       PUSHJ P,REMUN\r
+       JRST KILL2\r
+\r
+REMUN: MOVE S,[XWD 2,2]        ;REMOVE ONE UNDEFINED SYMBOL\r
+       ADDB S,ESTU\r
+       MOVE W,-2(S)\r
+       MOVEM W,(R)\r
+       MOVE W,-1(S)\r
+       MOVEM W,1(R)\r
+       POPJ P,\r
+\fTAG:  TLNN F,LTF   ; NO LETTERS IS ERROR\r
+       JRST ERR   ; GO SAY ERROR\r
+       TLNE F,FAF   ; DEFINE SYMBOLS\r
+       JRST DEFIN              ;A<B:\r
+       TLNE F,CF               ;DEFINE SYMBOL AS OPEN REGISTER\r
+       JRST SETNAM\r
+       MOVE W,LLOCO\r
+       HRRZM W,DEFV\r
+\r
+DEFIN: PUSHJ P,EVAL            ;DEFINED SYMBOL?\r
+       JRST DEF1               ;NO - DEFINE\r
+       JRST DEF2               ;YES, REDEFINE\r
+DEF1:  MOVN R,[XWD 2,2]\r
+       ADDB R,@SYMP    ;MOVE UNDEFINED TABLE 2 REGISTERS\r
+       HRRZ T,ESTU\r
+       SUBI T,2\r
+       HRL T,ESTU\r
+       HRRM T,ESTU\r
+       SKIPGE ESTU\r
+\r
+       BLT T,-1(R)\r
+DEF2:  MOVE T,DEFV\r
+       MOVEM T,1(R)            ;PUT IN NEW VALUE\r
+       MOVSI T,GLOBAL\r
+       IORB T,SYM\r
+       MOVEM T,(R)             ;PUT IN NEW SYM AS GLOBAL\r
+       MOVE R,ESTU\r
+\r
+DEF3:  JUMPGE R,RET            ;PATCH IN VALUE FOR UNDEF SYM ENTRY\r
+       MOVE T,SYM\r
+       CAME T,(R)\r
+       JRST DEF4\r
+       MOVE S,DEFV\r
+       SKIPGE, 1(R)\r
+       MOVN S,S\r
+       PUSH P,R\r
+       MOVE R,1(R)\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       ADD S,T\r
+       HRRM S,T\r
+       PUSHJ P,DEP\r
+       POP P,R\r
+       PUSHJ P,REMUN\r
+DEF4:  ADD R,[XWD 2,2]         ;REMOVE THE NOW DEFINED SYMBOL\r
+       JRST DEF3\r
+\fSETNAM:       MOVE R,@SYMP            ;SET PROGRAM NAME - DOLLAR COLON\r
+SET1:  MOVE W,R\r
+SET2:  JUMPGE R,UNDEF\r
+       MOVE T,(R)\r
+       ADD R,[XWD 2,2]\r
+       TLNE T,PNAME\r
+       JRST SET2\r
+       CAME T,SYM\r
+       JRST SET1\r
+       MOVEM W,PRGM\r
+       JRST RET\r
+\r
+;***ROUTINES BEYOND HERE EVALUATE THEIR ARGUMENT***\r
+MULT:  TLOA F,PTF+MLF          ;*\r
+DIVD:  TLO F,DVF+PTF           ;SINGLE QUOTE\r
+       JRST L1\r
+\r
+ASSEM: JRST PLUS               ;#\r
+MINUS: TLO F,MF\r
+PLUS:  TLO F,PTF\r
+       JRST LIS2\r
+\r
+LPRN:  CAML P,[XWD LPDL-4,0]   ;LEFT PARENTHESIS\r
+       JRST ERR\r
+       PUSH P,F                ;RECURSE FOR OPEN PAREN\r
+       PUSH P,WRD\r
+       PUSH P,FRASE\r
+       PUSH P,FRASE1\r
+       AOS,PRNC\r
+       JRST LIS\r
+\r
+INDIRECT:      HRLZI W,20              ;@\r
+       IORB W,WRD\r
+       TLO F,QF\r
+       JRST LIS2\r
+\r
+ACCF:  MOVE R,T                ;COMMA PROCESSOR\r
+ACCCF: MOVSI T,.-.             ;LEFT HALF OF A,,B\r
+       TLOE F,COMF             ;COMMA TYPED BEFORE?\r
+       JRST ACCF1              ;YES\r
+       HRRM R,ACCCF            ;NO, SAVE LEFT HALF OF A,,B\r
+       HLLZ T,R\r
+       LDB W1,[POINT 3,WRD,2]  ;CHECK FOR IO INSTRUCTION\r
+       IDIVI W1,7\r
+       LSH R,27(W1)\r
+       ADD T,R\r
+       ADDB T,WRD\r
+       JRST SPACE+1\r
+\r
+\fACCF1:        MOVEM T,WRD             ;SET LEFT HALF OF A,,B\r
+       JRST SPACE+1\r
+\r
+SPACE: TLNE F,QF\r
+       TLO F,TIF\r
+       TLZ F,MF+PTF\r
+       JRST LIS1\r
+\r
+RPRN:  TLNN F,QF               ;)\r
+       MOVEI T,0\r
+       MOVS T,T\r
+       SOSGE,PRNC\r
+       JRST ERR\r
+       POP P,FRASE1\r
+       POP P,FRASE\r
+       POP P,WRD\r
+       POP P,F\r
+       TLNE F,PTF\r
+       TLNE F,SF\r
+\r
+       JRST RPRN1\r
+       MOVEM T,SYL\r
+       TLO F,QF+SF\r
+       JRST L1RPR\r
+RPRN1: ADDB T,WRD\r
+       TLO F,QF\r
+       JRST L1RPR-1\r
+\f;REGISTER EXAMINATION LOGIC\r
+\r
+LINEF: PUSHJ P,DEPRA   ;NEXT REGISTER\r
+IFE EDDT&1,<PUSHJ P,CRNRB\r
+       JRST .+2>\r
+LI0:   PUSHJ P,CRF\r
+       AOS T,LLOC\r
+LI1:           ;PUSHJ P,LINCHK         ;TRUNCATE ADRS (UNLESS INSIDE DDT)\r
+       HRRZM T,LLOC\r
+       HRRZM T,LLOCO\r
+       PUSHJ P,PAD\r
+       MOVEI T,"/"\r
+       TLNE F,STF\r
+       MOVEI T,"!"\r
+       PUSHJ P,TOUT\r
+LI2:   TLZ F,ROF\r
+       PUSHJ P,LCT\r
+       MOVE R,LLOCO\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       TLO F,ROF\r
+       TLNE F,STF\r
+       JRST DD2\r
+       JRST CONSYM             ;RETURN IS A POPJ\r
+\r
+REPEAT 0,<\r
+LINCHK:        CAML T,[DDTINT SAVPI]   ;TRUNCATE ADDRESSES\r
+       CAMLE T,[DDTINT BNADR+2]\r
+       HRRZS T\r
+       MOVEM T,LLOC\r
+       MOVEM T,LLOC0\r
+       POPJ P,\r
+>\r
+\r
+VARRW: PUSHJ P,DEPRA           ;^\r
+       PUSHJ P,CRF\r
+       SOS T,LLOC\r
+       JRST LI1\r
+\r
+CARR:  PUSHJ P,DEPRA           ;CLOSE REGISTER\r
+       IFN EDDT&1,<JRST DD1>\r
+       IFE EDDT&1,<    PUSHJ P,TIN\r
+       CAIN T,15\r
+       JRST .-2\r
+       JRST DD1.5>\r
+\fOCON: TROA F,LF1+CF1          ;OPEN AS CONSTANT\r
+OSYM:  TRZ F,CF1               ;OPEN SYMBOLICALLY\r
+       TROA F,LF1\r
+SUPTYO:        TLOA F,STF              ;SUPPRESS TYPEOUT\r
+SLASH: TLZ F,STF               ;TYPE OUT REGISTER\r
+       TLNN F,QF               ;WAS ANY QUANTITY TYPED?\r
+       JRST SLAS1              ;NO. DO NOT CHANGE MAIN SEQUENCE\r
+       MOVE R,LLOC             ;YES. SAVE OLD SEQUENCE AND\r
+       MOVEM R,SAVLOC\r
+       HRRZM T,LLOC    ;PUSHJ P,LINCHK         ;TRUNCATE ADRS- SET UP NEW SEQUENCE\r
+SLAS1: HRRZM T,LLOCO\r
+       JRST LI2\r
+\r
+ICON:  TLNN F,ROF      ;REGISTER OPENED OR ERR\r
+       JRST ERR\r
+       PUSHJ P,DEPRS\r
+       JRST SLAS1\r
+\fTAB:  PUSHJ P,DEPRS   ;OPEN REGISTER OF Q\r
+       MOVEI T,-1(T)\r
+       EXCH T,LLOC             ;SET UP NEW SEQUENCE AND\r
+       MOVEM T,SAVLOC          ;SAVE OLD SEQUENCE\r
+       HRROI T,700000  ;3 RUBOUTS\r
+       PUSHJ P,TEXTT\r
+       JRST LI0\r
+\r
+DEPRA: MOVE R,SAVLOC\r
+       TLNE F,CF               ;RESTORE OLD SEQUENCE IF $CR,$CF, OR\r
+       EXCH R,LLOC             ;IF $^ OR $BS WAS TYPED\r
+       MOVEM R,SAVLOC          ;SETUP "NEW" OLD SEQUENCE\r
+       TLNE F,ROF              ;IF REGISTER IS BEING CHANGED\r
+       TLNN F,QF               ;REMOVE ALL PREVIOUS UNDEFINED\r
+       JRST DEPRS              ;SYMBOL REFERENCES TO IT\r
+       MOVE R,ESTU\r
+       MOVEM W1,ESTU\r
+DEPRA2:        JUMPGE R,DEPRS\r
+       HRRZ W,1(R)\r
+       CAMN W,LLOCO\r
+       PUSHJ P,REMUN\r
+       ADD R,[XWD 2,2]\r
+       JRST DEPRA2\r
+\r
+EQUAL: TROA F,LF1+CF1          ;=\r
+PSYM:  TRZ F,CF1               ;@\r
+       TRO F,LF1\r
+       PUSHJ P,CONSYM\r
+       JRST RET\r
+\r
+R50PNT:        LSH T,-36       ;RADIX 50 SYMBOL PRINTER\r
+       TRZ T,3\r
+       PUSHJ P,TOC\r
+       PUSHJ P,TSPC\r
+       MOVEI W1,LWT    ;SETUP FOR SPT\r
+       JRST SPT\r
+\r
+SIXBP: MOVNI W2,6              ;SIXBIT PRINTER\r
+       MOVE W1,LWT\r
+SIXBP1:        MOVEI T,0\r
+       ROTC T,6\r
+       ADDI T,40\r
+       PUSHJ P,TOUT\r
+       AOJL W2,SIXBP1\r
+       POPJ P,\r
+\f;MODE CONTROL SWITCHES\r
+\r
+TEXO:  MOVEI R,TEXTT-HLFW      ;$T ASSUME 7 BIT ASCII\r
+       MOVE T,WRD2\r
+       CAIN T,6                ;CHECK FOR $6T\r
+       MOVEI R,SIXBP-HLFW      ;SET MODE SWITCH FOR SIXBIT\r
+       CAIN T,5                ;CHECK FOR $5T\r
+       MOVEI R,R50PNT-HLFW     ;SET MODE SWITCH FOR RADIX 50\r
+HWRDS: ADDI R,HLFW-TFLOT               ;H\r
+SFLOT: ADDI R,TFLOT-PIN                ;F\r
+SYMBOL:        ADDI R,PIN-FTOC         ;S\r
+CON:   ADDI R,FTOC             ;C\r
+       HRRZM R,SCH\r
+       JRST BASE1\r
+\r
+RELA:  TRZE F,Q2F              ;CHANGE ADDRESS MODE TO RELATIE\r
+       JRST BASECH\r
+       MOVEI R,PADSO-TOC\r
+ABSA:  ADDI R,TOC              ;A\r
+       HRRZM R,AR\r
+       JRST BASE1\r
+\r
+BASECH:        MOVE T,WRD2             ;$NR  CHANGE OUTPUT RADIX TO N, N>1\r
+       CAIGE T,2\r
+       JRST ERR\r
+       HRRZM T,ODF\r
+BASE1: MOVS S,[XWD SCHM,SCH]\r
+       TLNN F,CCF\r
+       JRST LIS1\r
+       BLT S,ODFM      ;WITH $$, MAKE MODES PERMANENT\r
+       JRST RET\r
+\r
+SEMIC: MOVEM T,LWT             ;SEMICOLON TYPES IN CURRENT MODE\r
+       JRST @SCH\r
+\f;GO AND EXECUTE LOGIC\r
+\r
+GO:    HRLI T,(JRST)             ;G\r
+IFE EDDT&1,<\r
+       TLON F,QF\r
+       HRR T,JOBSA>    ;GET STARTING ADDRESS\r
+\r
+XEC:   TLNN F,QF               ;X\r
+       JRST ,ERR\r
+XEC0:  MOVEM T,TEM\r
+       PUSHJ P,CRF\r
+       PUSHJ P,TTYLEV\r
+       PUSHJ P,INSRTB\r
+       JSP T,RESTORE\r
+       XCT,TEM\r
+XEC1:  JRST DDT                ;USED  AT PROC0\r
+       JSR,SAVE\r
+       PUSHJ P,REMOVB\r
+       PUSHJ P,CRF\r
+       JRST DD1\r
+\f;BREAK POINT LOGIC\r
+BP1:   REPEAT NBP,<    0               ;JSR TO HERE FOR BREAKPOINT\r
+       JSA T, BCOM\r
+       0               ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE\r
+>\r
+\r
+B1INS=BP1+2\r
+BPN=.-3\r
+\fBCOM: 0\r
+       POP T,LEAV              ;MOVE INSTRUCTION TO LEAV\r
+       MOVEI T,B1SKP-B1INS+1(T)\r
+       HRRM T,BCOM3            ;CONDITIONAL BREAK SETUP\r
+       MOVEI T,B1CNT-B1SKP(T)\r
+       HRRM T,BCOM2            ;PROCEDE COUNTER SETUP\r
+       MOVE T,BP1-B1CNT(T)\r
+IFN EDDT&1,<   TLZ T,010000            ;TURN OFF USER MODE BIT>\r
+       HLLM T,LEAV1            ;SAVE FLAGS FOR RESTORING\r
+       EXCH T,BCOM\r
+\r
+BCOM3: SKIPE B1SKP             ;ADDR MOD TO LOOK AT COND. INST.\r
+       XCT @.-1\r
+BCOM2: SOSG B1CNT              ;ADDR MOD TO LOOK AT PROCEED COUNTER\r
+       JRST BREAK\r
+\r
+       MOVEM T,AC0+T\r
+       LDB T,[POINT 9,LEAV,8]  ;GET INSTRUCTION\r
+       CAIL T,264      ;JSR\r
+       CAILE T,266     ;JSA,JSP\r
+       TRNN T,700      ;UUO\r
+       JRST PROC1              ;MUST BE INTERPRETED\r
+       CAIE T,260      ;PUSHJ\r
+       CAIN T,256      ;XCT\r
+       JRST PROC1              ;MUST BE INTERPRETED\r
+       MOVE T,AC0+T\r
+       JRST 2,@LEAV1           ;RESTORE FLAGS, GO TO LEAV\r
+\r
+LEAV1: XWD 0,LEAV\r
+\fBREAK:        JSR SAVE                ;SAVE THE WORLD\r
+       PUSHJ P,REMOVB          ;REMOVE BREAKPOINTS\r
+       SOS T,BCOM3\r
+       HRRZS T                 ;GET ADDR OF BREAKPOINT JUST HIT\r
+       SUBI T,B1ADR-3          ;CHANGE TO ADDRESS OF $0B\r
+       IDIVI T,3               ;QUOTIENT IS BREAK POINT NUMBER\r
+       HRRM T,BREAK2           ;SAVE BREAK POINT #\r
+       MOVE W1,[ASCII /$0B>/]  ;PRELIMINARY TYPEOUT MESSAGE\r
+       SKIPG @BCOM2            ;TEST PROCEED COUNTER\r
+       TRO W1,">"_1            ;CHANGE T TO /$0B>>/\r
+       DPB T,[POINT 4,W1,13]   ;INSERT BREAK POINT # IN MESSAGE\r
+       PUSHJ P,TEXT2\r
+       MOVE T,BCOM\r
+       HLLM T, SAVPI           ;SAVE PROCESSOR FLAGS\r
+       MOVEI T,-1(T)\r
+       PUSHJ P,PAD             ;TYPE PC AT BREAK\r
+       HRRZ T,@BCOM3\r
+       HRRM T,PROC0            ;SETUP ADDRESS OF BREAK\r
+       HLRZ T,@BCOM3\r
+\r
+       JUMPE T,BREAK1          ;TEST FOR REGISTER TO EXAMINE\r
+       PUSHJ P,LCT             ;PRINT TAB\r
+       HLRZ T,@BCOM3\r
+       PUSHJ P,LI1             ;EXAMINE REGISTER C($NB)LEFT\r
+BREAK1:        MOVSI S,400000\r
+BREAK2:        ROT S,.-.               ;ROT BY # OF BREAK POINT\r
+       PUSHJ P,LISTEN          ;DONT PROCEED IF TTY KEY HIT\r
+       TDNN S,AUTOPI           ;DONT PROCEED IF NOT AUTOMATIC\r
+       JRST RET                ;DONT PROCEED\r
+       JRST PROCD1\r
+\r
+PROCEDE: TLNN F,QF             ;N$P    ;PROCEED AT A BREAKPOINT\r
+       MOVEI T,1\r
+       MOVEM T,@BCOM2\r
+       HRRZ R,BCOM3\r
+       PUSHJ P,AUTOP\r
+PROCD1:        PUSHJ P,CRF\r
+       PUSHJ P,TTYLEV\r
+PROC0: HRRZI R,XEC1            ;MODIFIED TO ADDR OF BREAKPOINT\r
+       PUSHJ P,FETCH\r
+       JRST BPLUP1             ;ONLY GET HERE IF MEMORY SHRANK\r
+       MOVEM T,LEAV\r
+       PUSHJ P,INSRTB\r
+       JRST PROC2\r
+\r
+PROC1: MOVE T,AC0+T\r
+       JSR SAVE\r
+       JFCL\r
+PROC2: MOVEI W,100\r
+       MOVEM W,TEM1            ;SETUP MAX LOOP COUNT\r
+       JRST IXCT5\r
+\fIXCT4:        IFE EDDT&1,<    SUBI T,041\r
+       JUMPE T,BPLUP\r
+       AOJGE T,IXCT6>                          ;DONT PROCEDE FOR INIT\r
+                               ;DONT INTERPRET FOR SYSTEM UUOS\r
+       MOVEM R,40              ;INTERPRET FOR NON-SYSTEM UUOS\r
+       MOVEI R,41\r
+IXCT:  SOSL TEM1\r
+       PUSHJ P,FETCH\r
+       JRST BPLUP              ;BREAKPOINT LOOPING OR FETCH FAILED\r
+       MOVEM T,LEAV\r
+IXCT5: IFN EDDT&1,<\r
+       LDB T,[POINT 9,LEAV,8]  ;GET INSTRUCTION\r
+       CAIN T,254              ;DON'T DO ANYTHING TO JRST IN EXEC MODE\r
+       JRST IXCT6>\r
+       HRLZI 17,AC0\r
+       BLT 17,17\r
+       MOVEI T,@LEAV\r
+       DPB T,[POINT 23,LEAV,35]        ;STORE EFFECTIVE ADDRESS\r
+       LDB W1,[POINT 4,LEAV,12]        ;PICK UP AC FIELD\r
+       LDB T,[POINT 9,LEAV,8]          ;PICK UP INSTRUCTION FIELD\r
+       MOVEI P,PS\r
+       CAIN T,260\r
+       JRST  IPUSHJ            ;INTERPRET PUSHJ\r
+\r
+       CAIN T,264\r
+       JRST IJSR               ;INTERPRET JSR\r
+       CAIN T,265\r
+       JRST IJSP               ;INTERPRET JSP\r
+       CAIN T,266\r
+       JRST IJSA               ;INTERPRET JSA\r
+       MOVE R,LEAV\r
+       TRNN T,700\r
+       JRST IXCT4              ;INTERPRET UUO\r
+       CAIN T,256\r
+       JRST IXCT               ;INTERPRET XCT\r
+\r
+IXCT6: JSP T,RESTORE\r
+LEAV:  0                       ;INSTRUCTION MODIFIED\r
+       JRST @BCOM\r
+       AOS BCOM\r
+       JRST @BCOM\r
+\r
+BPLUP: PUSHJ P,REMOVB          ;BREAKPOINT PROCEED ERROR\r
+BPLUP1:        JSR SAVE\r
+       JFCL\r
+       JRST ERR\r
+\fIPUSHJ:       DPB W1,[POINT 4,CPUSHP,12]      ;STORE AC FIELD INTO A PUSH\r
+       CLEARM,TEM3\r
+       MOVE T,LEAV\r
+       JRST RESTR1\r
+\r
+IJSA:  MOVE T,BCOM             ;INTERPRET JSA\r
+       HRL T,LEAV\r
+       EXCH T,AC0(W1)\r
+       JRST IJSR2\r
+\r
+IJSR:  MOVE T,BCOM             ;INTERPRET JSR\r
+       HLL T,SAVPI\r
+IJSR2: MOVE R,LEAV\r
+       PUSHJ P,DEP\r
+        JRST BPLUP             ;ERROR, CAN'T STORE\r
+       AOSA T,LEAV\r
+IJSR3: MOVE T,LEAV\r
+       JRST RESTORE\r
+\r
+IJSP:  MOVE W,BCOM             ;INTERPRET JSP\r
+       HLL T,SAVPI\r
+       MOVEM W,AC0(W1)\r
+       JRST IJSR3\r
+\r
+;INSERT BREAKPOINTS\r
+\r
+INSRTB:        MOVE S,[JSR BP1]\r
+INSRT1:        SKIPE R,B1ADR-BP1(S)\r
+       PUSHJ P,FETCH\r
+       JRST INSRT3\r
+       MOVEM T,B1INS-BP1(S)\r
+       MOVE T,S\r
+       PUSHJ P,DEP\r
+        JFCL                   ;HERE ONLY IF CAN'T WRITE IN HIGH SEG\r
+INSRT3:        ADDI S,3\r
+       CAMG S,[JSR BPN]\r
+       JRST INSRT1\r
+       POPJ P,\r
+\r
+;REMOVE BREAKPOINTS\r
+\r
+REMOVB:        MOVEI S,BNADR\r
+REMOV1:        MOVE T,B1INS-B1ADR(S)\r
+       SKIPE R,(S)\r
+       PUSHJ P,DEP\r
+        JFCL                   ;HERE ONLY IF NO WRITE IN HIGH SEG\r
+       SUBI S,3\r
+       CAIL S,B1ADR\r
+       JRST REMOV1\r
+       IFN EDDT&1,<JRST TTYRET>\r
+       IFE EDDT&1,<POPJ P,>\r
+\r
+;IN EXEC MODE, SAVE UP TTY STATUS      ;IN USER MODE, DONE BY SAVE\r
+\f;ALL $B COMMANDS GET HERE IN FORM: <A>$<N>B\r
+\r
+\r
+BPS:   TLZE F,QF               ;HAS <A> BEEN TYPED?\r
+       JRST BPS1               ;YES\r
+       TRZE F,Q2F              ;NO, HAS <N> BEEN TYPED?\r
+       JRST BPS2               ;YES\r
+       MOVE T,[XWD B1ADR,B1ADR+1]      ;NO, COMMAND IS $B - CLEAR ALL BREAKPOINTS\r
+       CLEARM B1ADR\r
+       BLT T,AUTOPI            ;CLEAR OUT ALL BREAKPOINTS AND AUTO PROCEDE REGESTER\r
+       JRST RET\r
+\r
+BPS1:  TRZN F,Q2F              ;HAS <N> BEEN TYPED?\r
+       JRST BPS3               ;NO\r
+       MOVE R,T                ;YES, PROCESS THE COMMAND A$NB\r
+       TRO F,2\r
+BPS2:  MOVE T,WRD2\r
+       CAIL T,1\r
+       CAILE T,NBP\r
+       JRST ERR\r
+       IMULI T,3\r
+       ADDI T,B1ADR-3\r
+       TRZN F,2\r
+       JRST MASK2\r
+       EXCH R,T\r
+       JRST BPS5\r
+\r
+BPS3:  MOVEI R,B1ADR           ;PROCESS THE COMMAND A$B\r
+BPS4:  HRRZ W,(R)\r
+       CAIE W,(T)\r
+       SKIPN (R)\r
+       JRST BPS5\r
+       ADDI R,3\r
+       CAIG R,BNADR\r
+       JRST BPS4\r
+       JRST ERR\r
+BPS5:  MOVEM T,(R)\r
+       CLEARM,1(R)\r
+       CLEARM,2(R)\r
+\r
+AUTOP: SUBI R,B1ADR            ;AUTO PROCEDE SETUP SUBROUTINE\r
+       IDIVI R,3\r
+       MOVEI S,1\r
+       LSH S,(R)\r
+       ANDCAM S,AUTOPI\r
+       TLNE F,CCF\r
+       IORM S,AUTOPI\r
+       POPJ P,\r
+\f;FETCH AND DEPOSIT INTO MEMORY\r
+\r
+\r
+DEPRS: MOVEM T,LWT             ;DEPOSIT REGISTER AND SAVE AS LWT\r
+       MOVE R,LLOCO            ;QUAN TYPED IN REGIS EXAM\r
+       TLZE F,ROF\r
+       TLNN F,QF\r
+       POPJ P,0\r
+               ;CAIL R,DDT\r
+               ;CAILE R,DDREND-1\r
+       PUSHJ P,DEP             ;STORE AWAY\r
+       JRST ERR                ;CAN'T STORE (IN DDT OR OUT OF BOUNDS)\r
+       POPJ P,                 ;RETURN\r
+\r
+;DEPOSIT INTO MEMORY SUBROUTINE\r
+\r
+IFE EDDT&10,<\r
+DEP:   IFE EDDT&1,<\r
+       JSP TT1,CHKADR          ;LEGAL ADDRESS?\r
+\r
+       JRST DEP4               ;YES BUT IN HI SEGMENT>\r
+       TRNN R,777760\r
+       JRST DEPAC              ;DEPOSIT IN AC\r
+\r
+IFE EDDT&10,<  MOVE T,(R) >\r
+       JRST CPOPJ1             ;SKIP RETURN\r
+\r
+DEPAC: MOVEM T,AC0(R)          ;DEPOSIT IN AC\r
+       JRST CPOPJ1             ;SKIP RETURN\r
+\r
+IFE EDDT&1,<\r
+DEP4:  MOVEI W,0\r
+       CALLI W,SETUWP          ;IS HI SEGMENT PROTECTED? TURN OFF\r
+       POPJ P,                 ;PROTECTED, NO SKIP RETURN\r
+       MOVEM T,(R)             ;STORE WORD IN HI SEGMENT\r
+       TRNE W,1                ;WAS WRITE PROTECT ON?\r
+       CALLI W,SETUWP          ;YES, TURN IT BACK ON\r
+       JFCL\r
+       JRST CPOPJ1             ;SKIP RETURN\r
+>\r
+>      ;END NOT-FILDDT COND.\r
+\r
+IFN EDDT&10,<DEP=CPOPJ>                ;ALWAYS OK NO-OP IF FILE DDT\r
+\f;FETCH FROM MEMORY SUBROUTINE\r
+\r
+FETCH: IFE EDDT&10,<IFE EDDT&1,\r
+       <JSP TT1,CHKADR         ;LEGAL ADDRESS?\r
+       JFCL>                   ;HIGH OR LOW OK FOR FETCH\r
+       TRNN R,777760           ;ACCUMULATOR?\r
+       SKIPA T,AC0(R)          ;YES\r
+       MOVE T,(R)              ;NO\r
+       JRST CPOPJ1             ;SKIP RETURN FOR LEGAL ADDRESS>\r
+\r
+IFN EDDT&10,<  SKIPN CRASHS            ;CRASH.SAV EXISTS?\r
+       JRST MONPEK             ;NO - GO PEEK AT RUNNING MONITOR\r
+       MOVEM R,TEM4            ;SAVE THE AOBJN POINTER\r
+       HRRZ R,R                ;STRIP OFF POSSIBLE COUNT\r
+       ADD R,OFFSET\r
+       IDIVI R,4000            ;R HAS LOCATION\r
+       CAIL R,30               ;R=NO. OF INPTS  R+1=LOCATION\r
+       POPJ  P,                ;LARGER THAN 48K\r
+       TRNN S,777000           ;S=R+1\r
+       JUMPE R,RSDNT           ;LOC IS IN RESIDENT BLOCKJ\r
+       CAMN R,RSAVE            ;IS LOC INCORE ?\r
+       JRST INCORE             ;S=LOC\r
+       MOVEM R,RSAVE           ;INPT NO.\r
+       IMULI R,20              ;16/INPT\r
+       USETI 1,1(R)            ;BLOK 0 DOES NOT EXIST\r
+       INPUT 1,CURLST          ;GET 16 BLKS\r
+       STATZ 1,740000  \r
+       HALT .-2                ;YEP\r
+INCORE:        SKIPA T,CURENT(S)\r
+RSDNT: MOVE T,RSIDNT(S)\r
+       MOVE R,TEM4             ;RESTORE AOBJN POINTER\r
+       JRST CPOPJ1\r
+TEM4:  0                       ;HOLD AOBJN POINTER\r
+MONPEK:        HRRZ T,4                ;REMOVE COUNT\r
+       CALLI T,33              ;DO PEEK UUO\r
+       JRST CPOPJ1             ;RETURN VALUE IN AC T\r
+>\r
+IFE EDDT&1,<   ;DO ADDRESS CHECKS ONLY IN USER MODE\r
+CHKADR:        HRRZ TT,JOBREL          ;GET HIGHEST ADDRESS IN LOW SEGMENT\r
+       CAIL TT,(R)             ;CHECK FOR WITHIN LOW SEGMENT\r
+       JRST 1(TT1)             ;ADDRESS IS OK IN LOW SEGMENT, SKIP RETURN\r
+       HRRZ T,JOBHRL           ;GET HIGHEST ADDRESS IN HIGH SEGEMENT\r
+       TRNE R,400000           ;IS THE ADDRESS IN HIGH SEGMENT?\r
+       CAIGE TT,(R)            ;IS THE ADR TO BIG FOR HIGH SEGMENT?\r
+       POPJ P,                 ;NO, YES- ILL. ADR.\r
+       JRST 0(TT1)\r
+>      ;END OF IFE EDDT&1\r
+\r
+IFN EDDT&1,<CHKADR==CPOPJ>     ;NO ADDRESS CHECKS IN EXEC MODE\r
+\fFIRARG:       MOVEM T,DEFV\r
+       TLO F,FAF\r
+       JRST ULIM1\r
+ULIM:  TLO F,SAF\r
+       HRRZM T,ULIMIT\r
+ULIM1: TLNN F,QF\r
+       JRST ERR\r
+       JRST LIS0\r
+\r
+\r
+LOOK:  SKIPL R,PRGM    ;LOOK UP SYMBOL\r
+       MOVE R,@SYMP\r
+       HLRE S,@SYMP\r
+       ASH S,-1        ;SETUP COUNT FOR LENGTH OF SYM TABLE\r
+       TLZ F,400000\r
+       HRLZI W2,DELO+DELI\r
+       MOVEM T,TEM\r
+\r
+LOOK1: TDNE W2,(R)\r
+\r
+       JRST LOOK3\r
+       MOVE T,(R)\r
+       TLNN T,PNAME    ;NAME\r
+       TLOA W2,LOCAL\r
+       SKIPA T,TEM\r
+       JRST LOOK3\r
+       MOVE W,1(R)\r
+       XOR W,T\r
+       JUMPL W,LOOK3\r
+       SUB T,1(R)\r
+       JUMPL T,LOOK3\r
+       JUMPGE F,LOOK2\r
+       MOVE W,1(R)\r
+       SUB W,1(W1)\r
+       JUMPLE W,LOOK3\r
+LOOK2: HRR W1,R                ;POINTER BEST VALUE SO FAR\r
+       TLO F,400000\r
+       JUMPE T,SPT0\r
+LOOK3: ADD R,[XWD 2,2]\r
+       SKIPL R\r
+       MOVE R, @SYMP\r
+       AOJLE S,LOOK1   ;TERMINATING CONDITION\r
+       MOVE T,TEM\r
+       TLNE F,400000\r
+       SUB T,1(W1)\r
+       JRST CPOPJ1\r
+\fCONSYM:       MOVEM T,LWT\r
+       TRNN F,LF1\r
+       JRST @SCH               ;PIN OR FTOC\r
+       TRNE F,CF1\r
+       JRST  FTOC\r
+\r
+PIN:                           ;PRINT INSTRUCTION\r
+       TLC T,700000\r
+       TLCN T,700000\r
+       JRST INOUT              ;IN-OUT INSTRUCTION OR NEG NUM\r
+       AND T,[XWD 777000,0]    ;EXTRACT OPCODE BITS\r
+       JUMPE T,HLFW            ;TYPE AS HALF WORDS\r
+       PUSHJ P,OPTYPE\r
+       MOVSI   T,777000\r
+       AND     T,LWT\r
+       TRNN F,ITF              ;HAS INSTRUCTION BEEN TYPED?\r
+       PUSHJ P,LOOK            ;NO, LOOK IN SYMBOL TABLE\r
+       TROA F,NAF              ;INSTRUCTION TYPED, ALLOW NEG ADDRESSES\r
+       JRST HLFW               ;NOT FOUND, OUTPUT AS HALFWORDS\r
+       PUSHJ P,TSPC\r
+       LDB T,[XWD 270400,LWT]  ;GET AC FIELD\r
+       JUMPE T,PI4\r
+       PUSHJ P,PAD\r
+PI3A:  MOVEI W1,","\r
+       PUSHJ P,TEXT\r
+PI4:   MOVE W1,LWT\r
+       MOVEI T,"@"\r
+       TLNE W1,20              ;CHECK FOR INDIRECT BIT\r
+       PUSHJ P,TOUT\r
+       HRRZ T,LWT\r
+       LDB W1,[XWD 331100,LWT] ;INSTRUCTION BITS\r
+       CAIL W1,240\r
+       CAILE W1,247\r
+       JRST PI8                ;ALL (EXECPT ASH,ROT,LSH) HAVE SYMBOLIC ADRS\r
+       TLNN W1,20\r
+       CAIN W,<JFFO>_-33\r
+       JRST PI8                ;JFFO AND @ GET SYMBOLIC ADDRESSES\r
+       PUSHJ P,PADS3A  ;ONLY ABSOLUTE ADDRESSING FOR LSH, ASH, AND ROT\r
+PI7:   TRZ F,NAF       \r
+       LDB R,[XWD 220400,LWT]  ;INDEX REGISTER CHECK\r
+       JUMPE R,PADS1           ;EXIT\r
+       MOVEI T,"("\r
+       PUSHJ P,TOUT\r
+       MOVE T,R\r
+       PUSHJ P,PAD\r
+       MOVEI T,")"\r
+       JRST TOUT               ;EXIT\r
+\r
+PI8:   PUSHJ P,PAD\r
+       JRST PI7\r
+\fHLFW: REPEAT 0,<      MOVE T,LWT\r
+       CAML T,[DDTINT SAVPI]\r
+       CAMLE T,[DDTINT BNADR+2]\r
+       SKIPA\r
+       JRST PAD>\r
+       HLRZ T,LWT              ;PRINT AS HALF WORDS\r
+       JUMPE T,HLFW1           ;TYPE ONLY RIGHT ADR IF LEFT ADR=0\r
+       TRO F,NAF               ;ALLOW NEGATIVE ADDRESSES\r
+       PUSHJ P,PAD\r
+       MOVSI W1,(ASCII /,,/)\r
+       PUSHJ P,TEXT2           ;TYPE ,,\r
+HLFW1: HRRZ T,LWT\r
+\r
+;PRINT ADDRESSES (ARG USUALLY 18 BITS BUT CAN BE 36 BITS:\r
+\r
+PAD:   ANDI T,-1\r
+       JRST @AR                ;PADSO OR PAD1\r
+PADSO: JUMPE T,FP7B            ;PRINT A ZERO\r
+       PUSHJ P,LOOK\r
+\r
+PADS1: POPJ P,0\r
+       MOVE W2,1(W1)\r
+       CAIGE T,100\r
+       CAIGE W2,60\r
+       JRST PADS3\r
+       MOVEM T,TEM\r
+       JUMPGE F,PAD1\r
+       PUSHJ P,SPT0\r
+       MOVEI T,"+"\r
+PADS1A:        PUSHJ P,TOUT\r
+       HRRZ T,TEM\r
+PAD1:  JRST TOC                ;EXIT\r
+\r
+PADS3: MOVE T,TEM\r
+PADS3A:        TRNE F,NAF\r
+       CAIGE T,776000\r
+       JRST TOC\r
+PADS3B:        MOVNM T,TEM\r
+       MOVEI T,"-"\r
+       JRST PADS1A\r
+\r
+INOUT: TDC T,[XWD -1,400000]   ;IO INSTRUCTION OR NEG NUM\r
+       TDCN T,[XWD -1,400000]\r
+       JRST PADS3B             ;TYPE AS NEG NUM\r
+       LDB R,[POINT 7,T,9]     ;PICK OUT IO DEVICE BITS\r
+       CAIL R,774_-2           ;IF DEVICE <774, THEN TYPE\r
+       JRST HLFW               ;TYPE AS HALF WORDS\r
+       LDB R,[POINT 3,T,12]\r
+       DPB R,[POINT 6,T,8]     ;MOVE IO BITS OVER FOR OP DECODER\r
+       PUSHJ P,OPTYPE\r
+       PUSHJ P,TSPC\r
+       MOVSI T,077400\r
+       AND T,LWT\r
+       JUMPE T,PI4\r
+       PUSHJ P,LOOK            ;LOOK FOR DEVICE NUMBER\r
+       JRST PI3A\r
+       MOVE T,TEM\r
+       LSH T,-30\r
+       PUSHJ P,TOC\r
+       JRST PI3A\r
+MASK:  TLNE F,QF\r
+       JRST MASK1\r
+       MOVEI T,MSK\r
+MASK2: MOVEI W,1\r
+       MOVEM W,FRASE1\r
+       JRST QUAN1\r
+MASK1: MOVEM T,MSK\r
+       JRST RET\r
+\fEFFEC:        TLO F,LTF\r
+       HRRZ T,T\r
+WORD:  MOVEI R,322000-326000   ;JUMPE-JUMPN\r
+NWORD: ADDI R,326000+40*T      ;JUMPN T,\r
+       HRLM R,SEAR2\r
+       TLZN F,QF\r
+       JRST ERR\r
+       SETCAM T,WRD\r
+       MOVSI T,FRASE-DEN-1             ;PREVENT TYPE OUT OF DDT PARTS\r
+       SETCMM FRASE(T)\r
+       AOBJN T,.-1\r
+       MOVE T,ULIMIT\r
+       TLNE F,SAF\r
+       TLO F,QF                ;SIMULATE A $Q TYPED\r
+       PUSHJ P,SETUP\r
+       PUSHJ P,CRF\r
+SEAR1: PUSHJ P,FETCH\r
+       JRST SEAR2A\r
+       TLNE F,LTF      ;CHECK FOR EFFECTIVE ADDRESS SEARCH\r
+\r
+       JRST EFFEC0\r
+       EQV T,WRD\r
+       AND T,MSK\r
+SEAR2: JUMPE T,SEAR3           ;OR JUMPN T\r
+SEAR2A:        AOS R,DEFV      ;GET NEXT LOCATION\r
+       PUSHJ P,LISTEN  ;ANYTHING TYPED?\r
+       CAMLE R,ULIMIT  ;OR END OF SEARCH?\r
+       JRST SEARFN     ;YES\r
+       JRST SEAR1      ;NO, LOOK SOME MORE\r
+\r
+SEAR2B:        MOVEI R,400000-1        ;MOVE UP TO HI SEGMENT\r
+       IORB R,DEFV             ;PUT IN MEMORY TOO\r
+       TRNN R,400000           ;ALREAY IN HI SEGMENT?\r
+       JRST SEAR2A             ;NO\r
+SEARFN:        SETCMM LWT              ;COMPLEMENT BITS BACK AND STOP SEARCH\r
+       JRST DD1\r
+\fSEAR3:        MOVE R,DEFV\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       TLZ F,STF       ;GET RID OF SUPPRESS TYPEOUT MODE\r
+       MOVE T,DEFV\r
+       PUSHJ P,LI1     ;CALL REGISTER EXAMINATION LOGIC TO TYPE OUT\r
+       PUSHJ P,CRF\r
+       SETCMM LWT\r
+       SETCMM TEM\r
+SEAR4: JRST  SEAR2A\r
+\r
+EFFEC0:        MOVEI W,100\r
+       MOVEM W,TEM\r
+EFFEC1:        MOVE W,T\r
+       LDB R,[POINT 4,T,17]    ;GET IR FIELD\r
+       JUMPE R,EFFEC2\r
+       PUSHJ P,FETCH\r
+       JRST ERR\r
+       ADD T,W\r
+EFFEC2:        HRR R,T\r
+       TLNN W,20               ;INDIRECT BIT CHECK\r
+       JRST EFFEC3\r
+       SOSE,TEM\r
+       PUSHJ P,FETCH\r
+       JRST SEAR4\r
+       JRST EFFEC1\r
+EFFEC3:        EQV T,WRD\r
+       ANDI T,777777\r
+       JRST SEAR2\r
+\fSETUP:        TLNN F,QF               ;QUANTITY TYPED?\r
+\r
+IFN EDDT&10,<MOVEI T,137777    ;DON'T SEARCH BEYOND 48K>\r
+IFE EDDT&10,<\r
+IFE EDDT&1,<MOVEI T,777777     ;NO, GET LAST ADR>\r
+IFN EDDT&1,<HRRZ T,@SYMP       ;NO, GET 1ST ADR SYM TABLE>\r
+>\r
+\r
+       HRRZM T,ULIMIT          ;SAVE HIGH LIMIT INCREMENTED BY ONE\r
+       HRRZS R,DEFV            ;GET 1ST ADDRESS\r
+       TLNN F,FAF              ;WAS A 1ST ADR SPECIFIED?\r
+       SETZB R,DEFV            ;NO, MAKE IT ZERO\r
+       CAML R,ULIMIT           ;LIMITS IN A REASONABLE ORDER?\r
+       JRST ERR\r
+       POPJ P,0\r
+\r
+ZERO:  TLNN F,CCF\r
+       JRST ERR\r
+       PUSHJ P,SETUP\r
+\r
+       HRRZ S,@SYMP    ;GET 1ST ADR OF SYMBOL TABLE\r
+       HLRE W1,@SYMP   ;GET LENGTH OF SYM TABLE\r
+       SUB W1,S        ;GET NEG OF LAST ADR\r
+       MOVNS W1        ;GET POS LAST ADR\r
+       MOVEI T,0       ;0 TO STORE IN MEMORY\r
+ZERO1: TRNE R,777760\r
+       JRST ZEROR      ;OK TO ZERO AC'S\r
+       CAIGE R,ZLOW\r
+       MOVEI R,ZLOW    ;DON'T ZERO 20 THRU ZLOW\r
+       CAIL R,DDT\r
+       CAILE R,DDTEND\r
+       JRST .+2\r
+       MOVEI R,DDTEND  ;DON'T ZERO DDT\r
+       CAML R,S\r
+       CAMLE R,W1\r
+       JRST .+2\r
+       HRRZ R,W1       ;DON'T ZERO SYMBOL TABLE\r
+ZEROR: CAMLE R,ULIMIT  ;ABOVE LIMITS?\r
+       JRST DD1        ;YES, STOP\r
+       PUSHJ P,DEP     ;DEPOSIT T\r
+        TROA R,377777  ;\r
+       AOJA R,ZERO1\r
+       TRNN R,400000   ;HI SEGMENT?\r
+       AOJA R,ZERO1    ;NO, KEEP GOING\r
+       JRST DD1        ;FINISH\r
+\fFTOC:         ;NUMERIC OUTPUT SUBROUTINE\r
+TOC:   HRRZ W1,ODF\r
+       CAIN W1,10              ;IS OUPUT RADIX NOT OCTAL, OR\r
+       TLNN T,-1               ;ARE THERE  NO LEFT HALF BITS?\r
+       JRST TOCA               ;YES, DO NOTHING SPECIAL\r
+       HRRM T,TOCS             ;NO, TYPE AS HALF WORD CONSTANT\r
+       HLRZS T                 ;GET LEFT HALF\r
+       PUSHJ P,TOCA            ;TYPE LEFT HALF\r
+       MOVSI W1,(ASCII /,,/)\r
+       PUSHJ P,TEXT2           ;TYPE ,,\r
+TOCS:  MOVEI T,.-.             ;GET RIGHT HALF BACK\r
+TOCA:  LSHC T,-43\r
+       LSH W1,-1               ;W1=T+1\r
+TOC1:  DIVI T,@ODF\r
+       HRLM W1,0(P)\r
+       JUMPE T,TOC2\r
+       PUSHJ P,TOCA\r
+TOC2:  HLRZ T,0(P)\r
+       ADDI T,"0"\r
+       JRST TOUT\r
+\r
+TOC4:  MOVM W1,T               ;TYPE AS SIGNED DECIMAL INTEGER\r
+       JUMPGE T,TOC5\r
+       MOVEI T,"-"\r
+       PUSHJ P,TOUT\r
+TOC5:  PUSHJ P,FP7             ;DECIMAL PRINT ROUTINE\r
+TOC6:  MOVEI T,"."\r
+       JRST TOUT\r
+\r
+;SYMBOL OUTPUT SUBROUTINE\r
+\r
+SPT0:  HRRZM W1,SPSAV          ;SAVE POINTER TO TYPED SYM\r
+SPT:           ;RADIX 50 SYMBOL PRINT\r
+       LDB T,[POINT 32,0(W1),35]       ;GET SYMBOL\r
+SPT1:  IDIVI T,50\r
+       HRLM W1,0(P)\r
+       JUMPE T,SPT2\r
+       PUSHJ P,SPT1\r
+SPT2:  HLRZ T,0(P)\r
+       JUMPE T,CPOPJ           ;FLUSH NULL CHARACTERS\r
+       ADDI T,260-1\r
+       CAILE T,271\r
+       ADDI T,301-272\r
+       CAILE T,332\r
+       SUBI T,334-244\r
+       CAIN T,243\r
+       MOVEI T,256\r
+       JRST TOUT\r
+\fSYMD: MOVEI T,DELO/200000     ;$D ;DELETE LAST SYM & PRINT NEW\r
+       HRRZ R,SPSAV            ;PICK UP POINTER TO LAST SYM\r
+       JUMPE R,ERR\r
+       DPB T,[POINT 2,(R),1]   ;STORE SEMI-DELETE BITS IN SYMBOL\r
+       MOVE T,LWT\r
+       JRST CONSYM             ;PRINT OUT NEXT BEST SYMBOL\r
+\f;FLOATING POINT OUTPUT\r
+\r
+TFLOT: MOVE A,T\r
+       JUMPG A, TFLOT1\r
+       JUMPE A,FP1A\r
+       MOVNS A\r
+       MOVEI T,"-"\r
+       PUSHJ P,TOUT\r
+       TLZE A,400000\r
+       JRST FP1A\r
+TFLOT1:        TLNN A, 400     \r
+       JRST TOC5               ;IF UNNORMALIZED, TYPE AS DECIMAL INTEGER\r
+\r
+FP1:   MOVEI B,0\r
+       CAMGE A,FT01\r
+       JRST FP4\r
+       CAML A,FT8\r
+       AOJA B,FP4\r
+FP1A:  MOVEI C,0\r
+\r
+FP3:   MULI A,400\r
+       ASHC B,-243(A)\r
+       MOVE A,B\r
+       SETZM TEM1              ;INIT 8 DIGIT COUNTER\r
+       SKIPE A,B               ;DON'T TYPE A LEADING 0\r
+       PUSHJ P,FP7             ;PRINT INTEGER PART OF 8 DIGITS\r
+       PUSHJ P,TOC6                    ;PRINT DECIMAL POINT\r
+       MOVNI A,10\r
+       ADD A,TEM1\r
+       MOVE W1,C\r
+FP3A:  MOVE T,W1\r
+       MULI T,12\r
+       PUSHJ P,FP7B\r
+       SKIPE,W1\r
+       AOJL A,FP3A\r
+       POPJ P,\r
+\r
+FP4:   MOVNI C,6\r
+       MOVEI W2,0\r
+FP4A:  ASH W2,1\r
+       XCT,FCP(B)\r
+       JRST FP4B\r
+       FMPR A,@FCP+1(B)\r
+       IORI W2,1\r
+FP4B:  AOJN C,FP4A\r
+       PUSH P,W2       ;SAVE EXPONENT\r
+       PUSH P,FSGN(B)  ;SAVE "E+" OR "E-"\r
+       PUSHJ P,FP3     ;PRINT OUT FFF.FFF PART OF NUMBER\r
+       POP P,W1        ;GET "E+" OR "E-" BACK\r
+       PUSHJ P,TEXT\r
+       POP P,A         ;GET EXPONENT BACK\r
+\fFP7:  IDIVI A,12      ;DECIMAL OUTPUT SUBROUTINE\r
+       AOS,TEM1\r
+       HRLM B,(P)\r
+       JUMPE A,FP7A1\r
+       PUSHJ P,FP7\r
+\r
+FP7A1: HLRZ T,(P)\r
+FP7B:  ADDI T,260\r
+       JRST TOUT\r
+\r
+       353473426555    ;1.0E32\r
+       266434157116    ;1.0E16\r
+FT8:   233575360400    ;1.0E8\r
+       216470400000    ;1.0E4\r
+       207620000000    ;1.0E2\r
+       204500000000    ;1.0E1\r
+FT:    201400000000    ;1.0E0\r
+       026637304365    ;1.0E-32\r
+       113715126246    ;1.0E-16\r
+       146527461671    ;1.0E-8\r
+       163643334273    ;1.0E-4\r
+       172507534122    ;1.0E-2\r
+FT01:  175631463146    ;1.0E-1\r
+FT0=FT01+1\r
+\r
+FCP:   CAMLE A, FT0(C)\r
+       CAMGE A, FT(C)\r
+       Z FT0(C)\r
+\r
+FSGN:  ASCII .E-.\r
+       ASCII .E+.\r
+\r
+TEXTT: MOVE W1,T\r
+TEXT:  TLNN W1,774000          ;LEFT JUSTIFIED UNLESS LEFT CHAR IS NULL\r
+       LSH W1,35\r
+TEXT2: MOVEI T,0               ;7 BIT ASCII TEXT OUTPUT SUBROUTINE\r
+       LSHC T,7\r
+       PUSHJ P,TOUT\r
+       JUMPN W1,TEXT2\r
+       POPJ P,\r
+\fKILC: XWD -NSYMS,LOW\r
+\r
+WRD:   0\r
+WRD2:  0\r
+PRNC:  0\r
+\r
+FRASE: 0       ;DONT CHANGE ORDER, SEE  SEARC+3\r
+SYL:   0\r
+LWT:   0\r
+TEM2:  0\r
+FRASE1:\r
+TEM3:  0\r
+DEN:   0\r
+\r
+PRGM:  0\r
+ESTU:  0\r
+ESTUT: 0\r
+FSV:   0\r
+FH:    0\r
+SYM:   0\r
+SPSAV: 0       ;POINTER TO LAST SYMBOL TYPED\r
+DEFV:  0\r
+ULIMIT:        0\r
+LLOC:  0\r
+LLOCO: 0\r
+SAVLOC:        0               ;THE ADR OF OLD REGISTER EXAMINATION SEQUENCE\r
+SYMP:  XWD PID,JOBSYM\r
+\fSAVPI:        0\r
+       1177\r
+SAVTTY:        0\r
+MSK:   XWD -1,-1\r
+B1ADR: 0\r
+B1SKP: 0\r
+B1CNT: 0\r
+\r
+REPEAT NBP*3-3, <      0>\r
+\r
+BNADR=.-3\r
+AUTOPI:        0\r
+\r
+IFE EDDT&10,<\r
+AC0:   BLOCK 17\r
+\r
+AC17:  0\r
+>\r
+\r
+SCHM:  EXP PIN         ;DO NOT CHANGE ORDER\r
+ARM:   EXP PADSO\r
+ODFM:  EXP 10\r
+\r
+SARS:  0\r
+TEM:   0\r
+TEM1:  0\r
+IFN EDDT&10,< OFFSET:  0 >\r
+\fIFN EDDT&1&<EDDT>B36,<\r
+\r
+PUNCH: TLC F,FAF+QF\r
+       TLCE F,FAF+QF\r
+       JRST ERR                ;ONE ARGUMENT MISSING\r
+PUN2:  ADDI T,1\r
+       HRRZM T,TEM1\r
+       SUB T,DEFV\r
+       JUMPLE T,ERR\r
+\r
+PUN1:  MOVEI T,4               ;PUNCH 4 FEED HOLES\r
+       PUSHJ P,FEED\r
+       TLNE F,CF               ;PUNCH NON-ZERO BLOCKS?\r
+       JRST PUNZ               ;YES\r
+       HRRZ R,DEFV\r
+       IORI R,37\r
+       ADDI R,1\r
+       CAMLE R,TEM1\r
+       MOVE R,TEM1\r
+       EXCH R,DEFV\r
+       MOVE T,R\r
+       SUB T,DEFV\r
+       HRL R,T\r
+       JUMPGE R,RET            ;EXIT OR PUNCH\r
+\r
+PBLK:  MOVE T,R\r
+       SOS W,T         ;INIT CHECKSUM\r
+       PUSHJ P,PWRD\r
+PBLK1: PUSHJ P,FETCH\r
+       JRST ERR\r
+       ADD W,T\r
+       PUSHJ P,PWRD\r
+       AOBJN R,PBLK1\r
+       MOVE T,W\r
+       PUSHJ P,PWRD\r
+       JRST PUN1\r
+\r
+;PUNCH NON-ZERO BLOCKS\r
+\r
+PUNZ0: AOS DEFV                ;LOOK AT NEXT WORD\r
+PUNZ:  HRRZ W,DEFV             ;ENTER HERE - GET STARTING ADDRESS\r
+       MOVE R,W\r
+       SUB W,TEM1              ;CALCULATE NEGATIVE LENGTH\r
+       HRL R,W                 ;SET UP AOBJN POINTER\r
+       JUMPGE R,RET            ;FINISHED?\r
+       CAMG R,[XWD -40,0]      ;BLOCK LONGER THAN 40?\r
+       HRLI R,-40              ;YES, FIX IT UP\r
+       MOVSI W1,400000         ;W1 NEGATIVE MEANS FLUSH 0 WORDS\r
+PUNZ2: PUSHJ P,FETCH           ;GET WORD FROM MEMORY\r
+       JRST ERR\r
+       JUMPE T,[AOJA W1,PUNZ4] ;IF WORD IS 0, INDEX 0 WORD COUNTER\r
+       MOVEI W1,0              ;CLEAR 0 WORD COUNTER\r
+PUNZ4: JUMPL W1,PUNZ0          ;FLUSH 0 WORD, GET ANOTHER\r
+       CAIL W1,3               ; NOSKIP FOR 3RD 0 WORD AFTER NON 0 WORD\r
+       AOSA R                  ;ADVANCE R TO LAST ADR+1\r
+       AOBJN R,PUNZ2\r
+       ADD W1,DEFV             ;CALCULATE DEFV-R+W1=-WORD COUNT\r
+       SUB W1,R\r
+       HRLM W1,DEFV            ;PUT -WC IN LEFT HALF OF FA\r
+       EXCH R,DEFV             ;SAVE ADR FOR NEXT BLOCK, GET POINTER\r
+       JRST PBLK\r
+\r
+\r
+\r
+\r
+LOADER:        TLNE F,QF\r
+       JRST ERR\r
+       MOVEI T,400\r
+       PUSHJ P,FEED\r
+       MOVE R,LOADE\r
+\r
+LOAD1: MOVE T,0(R)\r
+       PUSHJ P,PWRD\r
+       AOBJN R,LOAD1\r
+       MOVEI T,100\r
+LOAD2: PUSHJ P,FEED\r
+       JRST RET\r
+\r
+BLKEND:        TLNN F,QF               ;BLOCK END\r
+       MOVE T,[JRST 4,DDT]\r
+       TLNN T,777000           ;INSERT JRST IF NO OPCODE\r
+       TLO T,(JRST)\r
+       PUSH P,T\r
+       MOVEI T,100\r
+       PUSHJ P,FEED\r
+       POP P,T\r
+       PUSHJ P,PWRD\r
+       PUSHJ P,PWRD    ;EXTRA WORD FOR READER TO STOP ON\r
+       MOVEI T,500\r
+       JRST LOAD2\r
+\r
+PWRD:  MOVEI W1,6\r
+PWRD2: ROT T,6\r
+       CONSZ PTPP,20\r
+       JRST .-1\r
+       CONO PTPP,50\r
+       DATAO PTPP,T\r
+       SOJG W1,PWRD2\r
+       POPJ P,0\r
+\r
+FEED:  CONSZ PTPP,20\r
+       JRST .-1\r
+       CONO PTPP,10\r
+       DATAO PTPP,FEED1\r
+       SOJN T,FEED\r
+FEED1: POPJ P,0        ;ADDRESS USED AS A CONSTANT\r
+\r
+\r
+LOADB:\r
+\r
+PHASE 0                        ;RIM10B CHECKSUM LOADER\r
+       XWD -16,0\r
+BEG:   CONO PTRR,60\r
+       HRRI AA,RD+1\r
+RD:    CONSO PTRR,10\r
+       JRST .-1\r
+       DATAI PTRR,@TBL1-RD+1(AA)\r
+       XCT     TBL1-RD+1(AA)\r
+       XCT     TBL2-RD+1(AA)\r
+AA:    SOJA AA,\r
+\r
+TBL1:  CAME CKSM,ADR\r
+       ADD CKSM,1(ADR)\r
+       SKIPL CKSM,ADR\r
+\r
+TBL2:  JRST 4,BEG\r
+       AOBJN ADR,RD\r
+ADR:   JRST BEG+1\r
+CKSM=ADR+1\r
+\r
+DEPHASE\r
+\r
+LOADE: XWD LOADB-.,LOADB\r
+>      ;END OF IFN EDDT$1&<EDDT>B36\r
+       ;FOR PAPER TAPE IO\r
+\r
+\fSAVE: 0               ;SAVE THE ACS AND PI SYSTEM\r
+       SKIPN SARS\r
+       JRST SAV1\r
+       AOS SAVE\r
+       JRST SAV5\r
+SAV1:  IFN EDDT&1,<\r
+       CONI PRS,SAVPI\r
+       CONO PRS, @SAVPI+1>\r
+       MOVEM 17,AC17\r
+       HRRZI 17,AC0\r
+       BLT 17,AC0+16\r
+       MOVE T, SAVE\r
+       HLLM T, SAVPI\r
+SAV5:\r
+;IFE EDDT&1,<HRRZS SAVUWP              ;ASSUME UWP WILL BE ZEROED\r
+;      SETZB T,F               ;T=F=0\r
+;      CALLIU T,SETUWP                 ;REQUEST TO CLEAR UWP\r
+;      HRROS SAVUWP                    ;FAILED, UWP (BIT 0) STILL 1\r
+;      SKIPN SARS                      ;USER'S SATE SAVED ALREADY?\r
+\r
+;      HRRM T,SAVUWP>                  ;NO, SAVE STATE OF UWP\r
+\r
+       SETOM,SARS                      ;FLAG PROTECTING SAVED REGISTERS\r
+       MOVEI P,PS\r
+       IFE EDDT&1,<PUSHJ P,TTYRET>     ;IN USER MODE, GET INTO DDT MODE\r
+       MOVE T,[XWD SCHM,SCH]\r
+       BLT T,ODF               ;LOAD THE ACS WITH MODE SWITCHES\r
+       JRST @SAVE\r
+\r
+RESTORE: SETOM TEM3    ;RESTORE ACS AND PI SYSTEM\r
+RESTR1:        HRRM T,SAVE\r
+       MOVE T,SAVPI\r
+       HLLM T, SAVE\r
+IFN EDDT&1,<\r
+       AND T, SAVPI+1\r
+       IORI T, 2000    ;TURN ON CHANNELS\r
+       MOVEM T, SAVPI>\r
+;IFE EDDT&1,<HRRZ T,SAVUWP             ;GET OLD UWP\r
+;      CALLI T,SETUWP          ;CHANGE IT TO OLD\r
+;       JFCL>                  ;EX MACHT NICHTS\r
+       HRLZI 17,AC0\r
+       BLT 17,17\r
+       SETZM SARS\r
+       SKIPL,TEM3\r
+CPUSHP:        PUSH BCOM       ;PROGRAM MODIFIED AT IPUSHJ\r
+IFN EDDT&1,<   CONO PRS,@SAVPI>\r
+       JRST 2,@SAVE\r
+\fCRN:  MOVEI T,15              ;CARRIAGE RETURN\r
+       JRST TOUT\r
+\r
+IFE EDDT&1,<\r
+CRNRB: PUSHJ P,CRN\r
+       MOVEI T,177\r
+       JRST TOUT>\r
+\r
+CRF:   PUSHJ P,CRN\r
+       MOVEI T,12              ;LINE FEED\r
+       JRST TOUT\r
+\r
+LCT:   IFN EDDT&1,<PUSHJ P,TSPC\r
+       PUSHJ P,TSPC>\r
+       IFE EDDT&1,<MOVEI T,11\r
+       JRST TOUT>              ;TYPE A TAB\r
+\r
+TSPC:  MOVEI T,40              ;SPACE\r
+       JRST TOUT\r
+\fIFN EDDT&1,<  ;EXECUTIVE MODE TELETYPE I/O\r
+\r
+TIN:   PUSHJ P,LISTEN          ;TELETYPE CHARACTER INPUT\r
+        JRST .-1\r
+       CAIE T,175\r
+       CAIN T,176\r
+       MOVEI T,33      ;CHANGE ALL ALT MODES TO NEW\r
+       CAIN T,177      ;RUBOUT?\r
+       JRST WRONG      ;YES, TYPE XXX\r
+       TRNE T,140      ;DON'T ECHO CR,LF,ALT,TAB,BACK SPACE,ETC\r
+TOUT:  CAIG T,04       ;DON'T TYPE EOT OR LOWER CHARS\r
+       POPJ P,\r
+       HRLM T,(P)\r
+       IMULI T,200401          ;GENERATE PARITY\r
+       AND T,[11111111]\r
+       IMUL T,[11111111]\r
+       HLR T,(P)\r
+       TLNE T,10\r
+       TRC T,200               ;MAKE PARITY EVEN\r
+       CONSZ TTYY,20\r
+       JRST .-1\r
+       DATAO TTYY,T\r
+       ANDI T,177              ;FLUSH PARITY\r
+       POPJ P,0\r
+\r
+LISTEN:        CONSO TTYY,40   ;LISTEN FOR TTY\r
+       POPJ P,\r
+       DATAI TTYY,T\r
+       ANDI T,177\r
+       JRST CPOPJ1\r
+\r
+TTYRET:        MOVEI  T,3410\r
+TTY1:  MOVEI W2,40000\r
+       CONSZ TTYY,120\r
+       SOJG W2,.-1\r
+       CONI TTYY,SAVTTY\r
+       DATAI TTYY,W2\r
+       HRLM W2,SAVTTY\r
+       CONO TTYY,(T)\r
+       POPJ P,\r
+TTYLEV:        MOVE T,SAVTTY\r
+       TRZ T,160\r
+       TRO T,3600\r
+       TRNE T,10\r
+       TRZ T,200\r
+       JRST TTY1\r
+\r
+\r
+TEXIN: PUSHJ P,TIN     ;INPUT SUBROUTINE FOR TEXT MODES\r
+       TRNN T,140\r
+       JRST TOUT       ;ECHO CHARACTERS (0-37) NOT ECHOED\r
+       POPJ P,\r
+>\r
+\fIFE EDDT&1,<  ;USER MODE TELETYPE I/O\r
+  IFN EDDT&4,< ;ASSEMBLE WITH OLD DDT MODE IO\r
+\r
+\r
+TIN:   MOVE T,POUTBF           ;GET NEXT CHARACTER ROUTINE\r
+       CAME T,[POINT 7,INBFF]\r
+       PUSHJ P,FINOUT\r
+\r
+IFE EDDT&10,<  ILDB T,PINBFF >\r
+IFN EDDT&10,<  PUSHJ P,INCHR >\r
+\r
+       CAIE T,176\r
+       CAIN T,175\r
+       MOVEI T,33      ;CHANGE TO NEW ALT MODE\r
+       CAIN    T,177   ;RUBOUT?\r
+       JRST    WRONG   ;YES PRINT XXX\r
+       JUMPN T,CPOPJ\r
+       MOVE T,[POINT 7,INBFF]\r
+       MOVEM T,PINBFF\r
+       CALL T,[SIXBIT /DDTIN/]\r
+       JRST TIN\r
+\r
+TOUT:  JUMPE   T,CPOPJ ;OUT PUT A CHARACTER FLUSH NULLS\r
+\r
+IFN EDDT&10,<  SKIPE COMAND\r
+       JRST PUTCHR >\r
+\r
+       IDPB T,POUTBF\r
+       CAIE T,12\r
+       POPJ P,\r
+TTYLEV:\r
+FINOUT:        MOVEI T,0\r
+       IDPB T,POUTBF\r
+       MOVE T,[POINT 7,INBFF]\r
+       MOVEM T,PINBFF\r
+       MOVEM T,POUTBF\r
+       CALL T,[SIXBIT /DDTOUT/]\r
+       CLEARM INBFF\r
+       POPJ P,\r
+\r
+PINBFF:        POINT 7,INBFF\r
+POUTBF:        POINT 7,INBFF\r
+\r
+LISTEN=CPOPJ\r
+INBFF: BLOCK 21\r
+\r
+TTYRET:        MOVE T,[POINT 7,INBFF]\r
+       MOVEM T,POUTBF\r
+       MOVEM T,PINBFF\r
+       CLEARM INBFF\r
+       POPJ P,\r
+\r
+TEXIN=TIN      ;USE NORMAL INPUT FOR TEXT WHEN IN USER MODE\r
+>\r
+\f  IFE EDDT&4,< ;ASSEMBLE WITH TTCALL TELETYPE IO\r
+\r
+OPDEF TTCALL [51B8]\r
+\r
+TEXIN:\r
+TIN:\r
+\r
+IFE EDDT&10,<  TTCALL 0,T              ;GET NEXT CHARACTER INTO T >\r
+IFN EDDT&10,<  PUSHJ P,INCHR >\r
+\r
+       CAIE T,175\r
+       CAIN T,176\r
+       MOVEI T,33              ;CHANGE OLD ALT MODES TO NEW\r
+       CAIN T,177\r
+       JRST WRONG              ;TYPE XXX FOR A RUBOUT          \r
+       POPJ P,\r
+\r
+\r
+TOUT:\r
+\r
+IFN EDDT&10,<  SKIPE COMAND            ;IS THERE A COMMAND FILE?\r
+       JRST PUTCHR                     ;YES >\r
+\r
+       TTCALL 1,T              ;OUTPUT A CHARACTER\r
+       POPJ P,\r
+\r
+LISTEN:        TTCALL 2,T              ;GET NEXT CHAR, NO IO WAIT\r
+       POPJ P,                 ;NO CHARACTER EXISTED, RETURN\r
+       JRST CPOPJ1             ;CHARACTER WAS THERE, SKIP RETURN\r
+\r
+TTYRET:        TTCALL 6,               ;WHEN RETURNING TO DDT, FLUSH ALL\r
+       POPJ P,                 ;WAITING INPUT CHARACTERS\r
+\r
+TTYLEV==CPOPJ                  ;NOTHING SPECIAL TO DO WHEN LEAVING DDT\r
+>      ;END OF IFN DDT&4\r
+\r
+IFN EDDT&10,<\r
+INCHR: SKIPE COMAND\r
+       JRST GETCHR\r
+\r
+IFN EDDT&4,<   ILDB T,PINBFF           ;NO COMMAND FILE>\r
+IFE EDDT&4,<   TTCALL 0,T              ;O/P CHAR, >\r
+\r
+       POPJ P,\r
+\r
+GETCHR:        SOSLE CBUF+2            ;ANY REMAINING\r
+       JRST GETOK              ;YES.\r
+       INPUT CM,\r
+       STATZ CM,740000\r
+       HALT .+1\r
+       STATZ CM,20000          ;END-OF-FILE?\r
+       JRST GETEND\r
+\r
+GETOK: ILDB T,CBUF+1\r
+       JUMPE T,GETCHR          ;BYPASS ZERO CHARACTERS\r
+       PUSHJ P,PUTCHR          ;COPY INPUT TO OUTPUT FILE\r
+       POPJ P,\r
+\r
+GETEND:        CLOSE DP,               ;CLOSE OUTPUT WHEN INPUT EXHAUSTED\r
+       RELEASE DP,\r
+       RELEASE CM,\r
+       JRST NOLPT              ;REVERT TO TTY WHEN COMMAND EXHAUSTED\r
+\r
+PUTCHR:        SOSLE LBUF+2            ;ANY ROOM?\r
+       JRST PUTOK              ;YES\r
+       OUTPUT DP,\r
+       STATZ DP,740000         ;ERRORS?\r
+       HALT .+1\r
+\r
+PUTOK:\r
+       IDPB T,LBUF+1   ;DEPOSIT CHAR.\r
+       POPJ P,\r
+\r
+>      ;END OF IFN EDDT&10\r
+>      ;END OF IFE EDDT&1\r
+\fBDISP:        POINT 12,DISP(R),11\r
+       POINT 12,DISP(R),23\r
+       POINT 12,DISP(R),35\r
+DISP:  \r
+DEFINE D (Z1,Z2,Z3)<   <Z1-DDT>_30+<Z2-DDT>_14+Z3-DDT>\r
+       ;THIS MACRO PACKS 3 ADDRESSES INTO ONE WORD; EACH ADR IS 12 BITS\r
+\r
+IFE EDDT&1&<EDDT>B36,< PUNCH=ERR\r
+       BLKEND=ERR\r
+       LOADER=ERR>\r
+\r
+D ERR,ERR,ERR\r
+D ERR,ERR,ERR\r
+D ERR,ERR,VARRW\r
+D TAB,LINEF,ERR\r
+D ERR,CARR,ERR\r
+D ERR,ERR,ERR\r
+D PUNCH,ERR,ERR\r
+D ERR,ERR,ERR\r
+\r
+D ERR,ERR,ERR\r
+D CONTROL,ERR,ERR\r
+D ERR,ERR,SPACE\r
+D SUPTYO,TEXI,ASSEM\r
+D DOLLAR,PERC,ERR\r
+D DIVD,LPRN,RPRN\r
+D MULT,PLUS,ACCF\r
+D MINUS,PERIOD,SLASH\r
+D NUM,NUM,NUM\r
+D NUM,NUM,NUM\r
+D NUM,NUM,NUM\r
+D NUM,TAG,SEMIC\r
+D FIRARG,EQUAL,ULIM\r
+D QUESTN,INDIRECT,ABSA\r
+D BPS,CON,SYMD\r
+D EFFEC,SFLOT,GO\r
+D HWRDS,PILOC,BLKEND\r
+D KILL,LOADER,MASK\r
+D NWORD,BITO,PROCEDE\r
+D QUAN,RELA,SYMBOL\r
+D TEXO,ERR,ERR\r
+D WORD,XEC,ERR\r
+D ZERO,OCON,ICON\r
+D OSYM,VARRW,PSYM\r
+\r
+;THIS TABLE DOES NOT HAVE ENTRIES FOR CHARS .GE. 140; THESE\r
+; ARE DETECTED AS ERRORS NEAR L21:\r
+\fBITO: MOVEI   R,BITT  ;BYTE OUTPUT SUBROUTINE\r
+       HRRZI   AR,TOC\r
+       TRZN    F,Q2F\r
+       JRST    ERR\r
+       MOVE    T,WRD2\r
+       MOVEM   T,SVBTS\r
+       MOVEI   T,^D36\r
+       IDIV    T,WRD2\r
+       SKIPE   T+1\r
+       ADDI    T,1\r
+       MOVEM   T,SVBTS2\r
+       HRRZ    SCH,R\r
+       JRST    BASE1\r
+\r
+BITT:  MOVE    T,SVBTS2\r
+       MOVEM   T,SVBT2\r
+       MOVE    T+1,LWT\r
+       MOVEM   T+1,SVBT3\r
+       PUSH P,LWT\r
+BITT2: MOVEI   T,0\r
+       MOVE    T+2,SVBTS\r
+       LSHC    T,(T+2)\r
+       MOVEM   T,LWT\r
+       MOVEM   T+1,SVBT3\r
+       CAIE    AR,PADSO\r
+       PUSHJ   P,TOCA\r
+       CAIE    AR,TOC\r
+       PUSHJ   P,PIN\r
+       SOSG    SVBT2\r
+       JRST BITT4\r
+       MOVEI   T,","\r
+       PUSHJ   P,TOUT\r
+       MOVE    T+1,SVBT3\r
+       JRST    BITT2\r
+\r
+BITT4: POP P,LWT\r
+       POPJ P,\r
+\r
+SVBTS: 0\r
+SVBTS2:        0\r
+SVBT3: 0\r
+SVBT2: 0\r
+\f\r
+;DESCRIPTION OF OP DECODER FOR DDT:\r
+;\r
+;         THE ENTIRE INSTRUCTION SET FOR THE PDP-6 CAN BE COMPACTED INTO\r
+;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL.  THIS OCCURS\r
+;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN\r
+;FOR THE PDP-6.  FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL\r
+;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY\r
+;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH\r
+;BEGIN WITH 110(2).\r
+;\r
+;      THE TABLE TBL IN DDT CONSISTS OF 9 BIT BYTES, 4 TO A WORD.\r
+;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE:\r
+;0-37(8):      THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER.\r
+;      LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS\r
+;      EQUAL P.\r
+;\r
+;      THE CONTENTS OF INST (INSTRUCTION) CONTAIN IN THE RIGHT\r
+;      MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION.\r
+;      P AND N REFER TO THE CONTENTS OF INST, AND THE OP DECODER\r
+;      WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS\r
+;      OF INSTX N+1 GIVES THE NUMBER OF BITS IN INST; P GIVES THE\r
+;      POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS.\r
+;\r
+;      EXAMPLE: P = 6\r
+;               N = 2\r
+;\r
+;;     C(INST) = .010 101 100(2)\r
+;\r
+;      THE RESULT = D = 010(2) = 2(8)\r
+;\r
+;      D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE.\r
+;      IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH\r
+;      PRINT TEXT, 41-72(8)) ARE SKIPPED OVER AND THE 6TH BYTE RESUMES\r
+;      THE INTERPRETATION.\r
+;\r
+;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION\r
+;      IS FINISHED.\r
+\f\r
+;41(8)-72(8)      THE ALPHABET IS ENCODED INTO THIS RANGE.\r
+;              41- A\r
+;              42- B\r
+;              72- Z\r
+;              WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING\r
+;              LETTER IS TYPED.\r
+;\r
+;73(8)-777(8)     THIS IS A TRANSFER BYTE.  IF THE BYTE IN THIS RANGE IS\r
+;              CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE A-73(8)RD\r
+;              BYTE IN THE TABLE.\r
+;\r
+;MACROS ASSEMBLE THE TABLE TBL:\r
+; 1.   A NUMBER FOLLOWED BY ^ ASSEMBLES A DISPATCH BYTE.  THE FIRST\r
+;      DIGIT IS THE POSITION; THE SECOND DIGIT IS THE SIZE.\r
+; 2.   A POINT (.) ASSEMBLES A STOP CODE.\r
+; 3.   A NAME FOLLOWED BY A SLASH ASSEMBLES A TRANSFER TO THE\r
+;      SYMBOLICALLY NAMED BYTE.\r
+; 4.   A STRING OF LETTERS TERMINATED BY A SPACE, COMMA, OR POINT,\r
+;      ASSEMBLE INTO A STRING OF BYTES, EACH BYTE BEING ONE LETTER.\r
+;\r
+;EXAMPLE OF BINARY TO SYMBOLIC DECODING:\r
+;      THE MACHINE CODE FOR JRST IS 254\r
+;          INST    0  1  0  1  0  1  1  0  0\r
+;      THE INTERPRETER STARTS WITH THE FIRST BYTE IN THE TABLE (63^).\r
+;      THE RESULT OF APPLYING THIS TO C(INST) GIVES 2.  SKIPPING OVER\r
+;      2 BYTES IN THE TABLE AND INTERPRETING THE THIRD RESULTS IN\r
+;      HAK/ BEING INTERPRETED.  AT HAK:, THERE IS A 33^.  APPLYING\r
+;      THIS TO C(INST) RESULTS IN 5 NON PRINTING BYTES BEING SKIPPED\r
+;      OVER:\r
+;          1.  MV/\r
+;               MOV      PRINTING TEXT\r
+;          2.  MO/\r
+;          3.  ML/\r
+;          4.  DV/\r
+;          5.  SH/\r
+;\r
+;H1/ IS THE NEXT BYTE INTERPRETER.  AT H1: 03^ IS FOUND SO\r
+;4 BYTES ARE SKIPPED OVER:\r
+;              EXC      PRINTING TEXT\r
+;          1.  S3/\r
+;              BL       PRINTING TEXT\r
+;              T        PRINTING TEXT\r
+;          2.  .\r
+;          3.  AO/\r
+;          4.  AOB/\r
+;          THE NEXT LETTERS JRS ARE TYPED OUT.  THEN T/ IS FOUND.  AT\r
+;T; A T IS TYPED OUT; THEN A "." IS FOUND AND EVERYTHING STOPS.\r
+;\r
+;          THE TABLE IS ALSO USED GOING FROM SYMBOLIC TO BINARY BUT A\r
+;      TREE SEARCH METHOD IS USED.\r
+\f\f\f\f\fREPEAT 0,<\r
+\r
+DEFINE REDEF (XX)<\r
+DEFINE INFO (AA,BB)<\r
+AA XX'BB>>\r
+\r
+\r
+DEFINE BYT9 (L)<\r
+XLIST\r
+REDEF %\r
+ ZZ==0\r
+ ZZZ==0\r
+ ZZM==1\r
+\r
+ IRPC L,<\r
+       Z=="L"\r
+       IFE Z-":",<INFO <>,<==CLOC>\r
+               IFNDEF FIR.,<FIR.==CLOC>\r
+               IFGE CLOC+73-1000-FIR.,<PRINTX OPTABLE TOO LONG>\r
+               Z==0>\r
+       IFE Z-"/",<IF1 <OUTP 1>\r
+               IF2,<INFO OUTP,+73-FIR.>\r
+               Z==0>\r
+ IFE Z-"^",<OUTP <ZZ&70/2+ZZ&7-1>\r
+       Z==0>\r
+ IFE <Z-",">*<Z-".">*<Z-40>,<IFN ZZZ,<\r
+                               REPEAT 5,<ZZ==ZZZ&77\r
+                                       IFN ZZ,<OUTP ZZ>\r
+                                       ZZZ==ZZZ/100>>\r
+                               IFE Z-".",<OUTP 40>\r
+                               Z==0>\r
+ IFN Z,<INFO REDEF,L\r
+       ZZ==ZZ*10+Z&7\r
+       ZZZ==ZZZ+<Z-40>*ZZM\r
+       ZZM==ZZM*100>\r
+ IFE Z,<REDEF %\r
+       ZZ==0\r
+       ZZZ==0\r
+       ZZM==1>>\r
+LIST>\r
+\r
+DEFINE OUTP (A)<\r
+       BINRY==BINRY*400+BINRY*400+A\r
+       BINC==BINC-1\r
+       IFE BINC,<EXP BINRY\r
+               BINRY==0\r
+               BINC==4>\r
+       CLOC==CLOC+1>\r
+\r
+\r
+\r
+TBL:           ;OPDECODER BYTE TABLE\r
+\r
+BINRY==0\r
+CLOC==0                ;SET BYTE LOCATION COUNTER TO 0\r
+BINC==4                ;INIT BYTES/WORD COUNTER\r
+\r
+BYT9 <63^UUO/FLO/HAK/ACCP/BOOLE/H HWT/T ACBM/>\r
+\r
+;IO INSTRUCTIONS\r
+BYT9 <21^BD/CON,11^OI/S,01^Z/O/>\r
+BYT9 <BD:01^BLK,IO/DATA,IO:11^I/O/OI:01^O/I/>\r
+\r
+;UUOS\r
+BYT9 <UUO:51^.,32^U40/U50/U60/21^U703/11^USET/01^>\r
+BYT9 <LOOKU,P/ENTE,R/USET:USET,01^I/O/>\r
+BYT9 <U40:03^U47/INI T/.....,U47:CALL,01^.,I/>\r
+BYT9 <U60:21^U603/01^IN,BPUT/OUT,BPUT:11^BU,F:F.,PU,T/>\r
+BYT9 <U603:01^U6062/STAT,11^O:O.,Z:Z.,U6062:11^S,U62/G,U62:ETST,S/>\r
+;BYTE AND FLOATING INSTRUCTIONS\r
+\r
+BYT9 <FLO:51^BYTE/F 32^ AD A/SB A/MP A/DV A:>\r
+BYT9 <21^LMB/R,IMB/LMB:02^.,L:L.,M:M.,B:B.,BYTE:32^...,03^UF,PA/DF,N/>\r
+BYT9 <FS C/IB P:P.,I LD/LD:LD B/I DP/DP:DP B/>\r
+\r
+;FWT,FIXED POINT ARITH,MISC.\r
+\r
+BYT9 <HAK:33^MV/MV:MOV MO/ML/DV/SH/H1/JP/>\r
+BYT9 <21^ADD IMB/SU BIMB:B IMB:02^.,I:I.,M/B/MO:22^>\r
+BYT9 <EIMS:E IMS/S IMS/N IMS/M IMS:02^.,I/M/S:S.,>\r
+BYT9 <ML:21^I ML1/ML1:MUL IMB/DV:21^I DV1/DV1:>\r
+BYT9 <DI DV2:V IMB/H1:03^EXC S3/BL T:T.,AO/AO:AOBJ,>\r
+BYT9 <AOB/JRS T/JFC L/XC T/.AOB:01^P/N/>\r
+BYT9 <JP:03^PU/PU:PUSH PUS/PO/PO:POP POP/JS,R:R.,>\r
+BYT9 <JS P/JS PA:A.,JR PA/PUS:01^J:J..,POP:>\r
+BYT9 <01^.,J/SH:02^A S2/ROT S1/L S2:S S3:H S1/JFF O/S1:21^.,C:C.,>\r
+\r
+;ARITH COMP,SKIP,JUMP\r
+\r
+BYT9 <ACCP:42^CA CA1/SJ/A JS/S JS:O 31^>\r
+BYT9 <J COMP/S COMP/CA1:31^I COMP/M COMP/>\r
+BYT9 <SJ:31^JUM PSJ/SKI PSJ:P COMP:>\r
+BYT9 <03^.,L/E:E.,L E/PA/G E/N:N.,G.,>\r
+\r
+\r
+;HALF WORDS\r
+\r
+BYT9 <HWT:51^HW1/21^R HW2/L HW2:R HW3/HW1:>\r
+BYT9 <21^L HW4/R HW4:L HW3:32^IMS/Z IMS/O IMS/EIMS/>\r
+\r
+;TEST INSTRUCTIONS\r
+\r
+BYT9 <ACBM:31^AC1/01^D AC2/S AC2/AC1:01^R AC2/L,>\r
+BYT9 <AC2:42^N EAN/Z EAN/C EAN/O EAN:12^.,E/PA/N/>\r
+\r
+\r
+;BOOLEAN\r
+\r
+BYT9 <BOOLE:24^ST/AN:AND B2/AN/ST/AN/ST/>\r
+BYT9 <X OR:OR B2/I OR/AN/EQ DV2/ST/OR/ST/OR/OR/>\r
+BYT9 <ST:SET B2:24^Z IMB/IMB/CA:C TA/TM:M IMB/>\r
+BYT9 <CM:C TM/TA:A IMB/IMB/IMB/CB:C BIMB/IMB/CA/>\r
+BYT9 <CA/CM/CM/CB/O IMB/>\r
+\r
+;MORE UUO'S\r
+BYT9 <U50:03^OPE,N/....,RENAM,E/I,N/OU,T/>\r
+BYT9 <U703:02^CLOS,E/RELEA,S/MTAP,E/UGET,F/>\r
+\r
+REPEAT BINC,<BINRY=BINRY*400+BINRY*400>\r
+IFN BINRY,<EXP BINRY>\r
+>      ;END OF REPEAT 0\r
+\r
+\r
+\fIFN EDDT&10,<                 ;FILDDT STUFF\r
+CRASH: SIXBIT .CRASH.          ;CANONICAL NAME FOR CRASH\r
+       SIXBIT .SAV.\r
+       Z\r
+       Z\r
+COMNDS:        SIXBIT .FILDDT.         ;CANNONICAL NAME FOR COMMAND LIST\r
+       SIXBTI .TXT.\r
+       Z\r
+       Z\r
+SNAP:  SIXBIT .SNAP.           ;NAME FOR OUTPUT IF TO RETRIEVABLE DEVCE\r
+       SIXBIT .LST.\r
+       Z\r
+       Z\r
+CBUF:  BLOCK 3                 ;RING HEADERS\r
+LBUF:  BLOCK 3 \r
+COMAND:        Z                       ;-1 IF COMMAND FILE ,0 IF NOT\r
+CRASHS:        Z                       ;-1 IF CRASH.SAV ON DISK ,0 IF PEEK AT MONITOR\r
+AC0=.\r
+AC17=.+17\r
+RSIDNT:        BLOCK 1000              ;LOCS 0-777 ALWAYS IN CORE\r
+CURENT:        BLOCK 4000              ;WINDOW TO THE FILE ON DISK\r
+RSAVE: IOWD 1000,RSIDT         ;INDEX OF THE CUFRRENT BLOCK, 0,1,...\r
+       Z\r
+CURLST:        IOWD 4000,CURENT\r
+       Z\r
+>\r
+\r
+\fSUBTTL        OP DECODER\r
+\r
+DEFINE BYT9 (A) <IRP A,<\r
+A>>\r
+\r
+IF1,<\r
+\r
+DEFINE .ADR    (A) <\r
+%'A==  CLOC\r
+FIR.== CLOC\r
+DEFINE .ADR    (A) <\r
+%'A==  CLOC\r
+IFGE   <LASTB==CLOC+73-FIR.>-1000, <PRINTX OPTABLE TO LONG>>>\r
+\r
+DEFINE .TRA    <\r
+CLOC== CLOC+1  ;>\r
+\r
+SYN    .TRA,   .DIS\r
+\r
+DEFINE .TXT    (A) <\r
+IFNB   <A>,    <IRPC A,<CLOC==CLOC+1>>>\r
+\r
+DEFINE .END    (A) <\r
+IFNB   <A>,    <IRPC A,<CLOC==CLOC+1>>\r
+CLOC==         CLOC+1>\r
+\r
+>      ;END OF IF1\r
+IF2,<\r
+\r
+DEFINE .ADR (A)<IFN %'A-CLOC,<PRINTX PHASE ERR AT: %'A>>\r
+\r
+DEFINE .TRA    (A) <\r
+OUTP   %'A+73-FIR.>\r
+\r
+DEFINE .DIS    (A) <\r
+OUTP   A&70/2+A&7-1>\r
+\r
+DEFINE .TXT    (A) <\r
+IFNB   <A>,    <IRPC A,<OUTP "A"-40>>>\r
+\r
+DEFINE .END    (A) <\r
+IFNB   <A>.    <IRPC A,<OUTP "A"-40>>\r
+OUTP   40>\r
+\r
+DEFINE OUTP (A)<\r
+BINRY== BINRY+<A>_<BINC==BINC-9>\r
+IFE BINC, <\r
+               +BINRY\r
+BINRY==0\r
+BINC==^D36 >\r
+CLOC==CLOC+1 >\r
+\r
+>\r
+\fTBL:          ;OPDECODER BYTE TABLE\r
+\r
+BINRY= 0\r
+CLOC=  0       ;SET BYTE LOCATION COUNTER TO 0\r
+BINC=  ^D36    ;INIT BYTES/WORD COUNTER\r
+\r
+BYT9 <\r
+\r
+.DIS 63,.TRA UUO,.TRA FLO,.TRA HAK,.TRA ACCP,.TRA BOOLF\r
+       .TXT H,.TRA HWT,.TXT T,.TRA ACBM\r
+\r
+;IO INSTRUCTIONS\r
+\r
+.DIS 21,.TRA BD,.TXT CON,.DIS 11,.TRA IO,.TXT S,.DIS 01,.TRA Z,. TRA O\r
+.ADR BD,.DIS 01,.TXT BLK,.TRA IO,.TXT DATA,.ADR IO,.DIS 11,.TRA I,.TRA O\r
+       .ADR OI,.DIS 01,.TRA O,.TRA I\r
+;UUOS\r
+\r
+.ADR UUOI,.DIS 51,.END,.TXT,.DIS 32,.TRA U40,.TRA U50,.TRA U60\r
+       .DIS 21,.TRA U703,.DIS 11.,TRA USET,.DIS 01\r
+.TXT LOOKU,.TRA P,.TXT ENTE,.TRA R,.ADR USET,.TXT USET,.DIS 01,.TRA I,.TRA O\r
+.ADR U40,.DIS 03,.TRA CAL,.TXT INI,.TRA T,.END,.END,.END,.END,.END,.TXT CALL,.TRA I\r
+.ADR U60,.DIS 21,.TRA U603,.DIS 01,.TXT IN,.TRA BPUT,.TXT OUT\r
+       .ADR BPUT,M.,DIS 11,.TXT BU,.ADR F,.END F,.TXT,.TXT U,.TRA T\r
+.ADR U603,.DIS 01,.TRA U6062,.TXT STAT,.DIS 11,.ADR O,.END O,.TXT,.ADR Z,.END Z,.TXT\r
+       .ADR U6062,.DIS 11,.TXT S,.TRA U62,.TXT G,.ADR U62,.TXT ETST,.TRA S\r
+\r
+;BYTE AND FLOATING INSTRUCTIONS\r
+\r
+.ADR FLO,.DIS 51,.TRA BYTE,.TXT F,.DIS 32,.TXT,.TXT AD,.TRA A,.TXT SB\r
+       .TRA A,.TXT MP,.TRA A,.TXT DV,.ADR A\r
+.DIS 21,.TRA LMB,.TXT R,.TRA IMB,.ADR LMB,.DIS 02,.END,.TXT\r
+       .ADR L,.END L,.TXT,.ADR M,.END M,.TXT\r
+.ADR B,.FND B,.TXT,.ADR BYTE,.DIS 32,.END,.END,.END,.TXT\r
+       .DIS 03,.TXT UF,.TRA PA,.TXT DF,.TRA N\r
+.TXT FS,.TRA C,.TXT IB,.ADR P,.END P,.TXT,.TXT I,.TRA LD\r
+       .ADR LD,.TXT LD,.TRA B,.TXT I,.TRA DP,.ADR DP,.TXT DP,.TRA B\r
+\r
+;FWT-FIXED POINT ARITH-MISC\r
+\r
+.ADR HAK,.DIS 33,.TRA MV,.ADR MV,.TXT MOV,.TRA MO,.TRA ML,.TRA DV\r
+       .TRA SH,.TRA H1,.TRA JP\r
+.DIS 21,.TXT ADD,.TRA IMB,.TXT SU,.ADR BIMB,.TXT B,.ADR IMB,.DIS 02,.END,.TXT\r
+       .ADR I,.END I,.TXT,.TRA M,.TRA B,.ADR MO,.DIS 22\r
+,ADR E1MS,.TXT E,.TRA IMS,.TXT S,.TRA IMS,.TXT N,.TRA IMS,.TXT M\r
+       .ADR IMS,.DIS 02,.END,.TXT,.TRA I,.TRA M,.ADR S,.END S,.TXT\r
+.ADR ML,.DIS 21,.TXT I,.TRA ML1,.ADR ML1,.TXT MUL,.TRA IMB\r
+       .ADR DV,.DIS 21,.TXT I,.TRA DV1\r
+.ADR DV1,.TXT DI,.ADR DV2,.TXT V,.TRA IMB,.ADR H1,.DIS 03,.TXT EXC,.TRA S3,.TXT BL\r
+       .ADR T,.END T,.TXT,.TRA AO,.ADR AO,.TT AOBJ\r
+.TRA AOB,.TXT JRS,.TRA T,.TXT JFC,.TRA L,.TXT XC,.TRA T,.END\r
+       .ADR AOB,.DIS 01,.TRA P,.TRA N\r
+.ADR JP,.DIS 03,.TRA PU,.ADR PU,.TXT PUSH,.TRA PUS,.TRA PO\r
+       .ADR PO,.TXT POP,.TRA POP,.TXT JS,.ADR R,.END R,.TXT\r
+.TXT JS,.TRA P,.TXT JS,.ADR PA,.END, A,.TXT,.TXT JR,.TRA PA\r
+       .ADR PUS,.DIS 01,.ADR J,.END J,.END,.TXT,.ADR POP\r
+.DIS 01,.END,.TXT,.TRA J,.ADR SH,.DIS 02,.TXT A,.TRA S2,.TXT ROT,.TRA S1,.TXT L\r
+       .ADR S2,.TXT S,.ADR S3,.TXT H,.TRA S1,.TXT JFF,.TRA O\r
+       .ADR S1,.DIS 21,.END,.TXT,.ADR C,.END C,.TXT\r
+\r
+;ARITH COMP-SKIP-JUMP\r
+\r
+.ADR ACCP,.DIS 42,.TXT CA,.TRA CA1,.TRA SJ,.TXT A,.TRA JS,.TXT S\r
+       .ADR JS,.TXT O,.DIS 31\r
+.TXT J,.TRA COMP,.TXT S,.TRA COMP,.ADR CA1,.DIS 31,.TXT I,.TRA COMP,.TXT M,.TRA COMP\r
+.ADR SJ,.DIS 31,.TXT JUM,.TRA PSJ,.TXT SKI,.ADR PSJ,.TXT P,.ADR COMP\r
+.DIS 03,.END,.TXT,.TRA L,.ADR E,.END E,.TXT,.TXT L,.TRA E,.TRA PA,.TXT G,.TRA E\r
+       .ADR N,.END N,.TXT,.END G,.TXT\r
+\r
+;HALF WORDS\r
+\r
+.ADR HWT,.DIS 51,.TRA HW1,.DIS 21,.TXT 3,.TRA HW2,.TXT L,.ADR HW2,.TXT R,.TRA HW3\r
+.ADR HW1,.DIS 21,.TXT L,.TRA HW4,.TXT R,.ADR HW4,.TXT L\r
+       .ADR HW3,.DIS 32,.TRA IMS,.TXT Z,.TRA IMS,.TXT D,.TRA IMS,.TRA EIMS\r
+\r
+;TEST INSTRUCTIONS\r
+\r
+.ADR ACBM,.DIS 31,.TRA AC1,.DIS 01,.TXT D,.TRA AC2,.TXT S,.TRA AC2\r
+       .ADR AC1,.DIS 01,.TXT R,.TRA AC2,.TXT L\r
+.ADR AC2,.DIS 42,.TXT N,.TRA EAN,.TXT Z,.TRA EAN,TXT C,.TRA EAN,.TXT O\r
+       .ADR EAN,.DIS 12,.END,.TXT,.TRA E,.TRA PA,.TRA N\r
+\r
+;BOOLEAN\r
+\r
+.ADR BOOLE,.DIS 24,.TRA ST,.ADR AN,.TXT ANBD,.TRA B2,.TRA AN,.TRA ST,.TRA AN,.TRA ST\r
+.TXT X,.ADR OR,.TXT OR,.TRA B2,.TXT I,.TRA OR,.TRA AN,.TXT EQ\r
+       .TRA DV2,.TRA ST,.TRA OR,.TRA ST,.TRA OR,.TRA OR\r
+.ADR ST,.TXT SET,.ADR B2,.DIS 24,.TXT Z,.TRA IMB,.TRA IMB\r
+       .ADR CA,.TXT C,.TRA TA,.ADR TM,.TXT M,.TRA IMB\r
+.ADR DM,.TXT C,.TRA TM,.ADR TA,.TXT A,.TRA IMB,.TRA IMBA,.TRA IMB\r
+       .ADR CP,.TXT C,.TRA BIMB,.TRA IMB,.TRA CA\r
+.TRA CA,.TRA CM,.TRA CM,.TRA CB,.TXT 0,.TRA IMB\r
+\r
+;MORE UUO'S\r
+\r
+.ADR U50,.DIS 03,.TXT OPE,.TRA N,.TXT TT,.ADR CAL,.TXT CAL,.TRA L,.END,.END,.END\r
+       .TXT,.TXT RENAM,.TRA E,.TXT I,.TRA N,.TXT OU,.TRA T\r
+.ADR U703,.DIS 02,.TXT CLOS,.TRA E,.TXT RELEA,.TRA S\r
+       .TXT MTAP,.TRA E,.TXT UGET,.TRA F\r
+\r
+;**********THIS TERMINATES THE "BYT9" MACRO ARGUMENT******\r
+>\r
+\r
+IF1,<  BLOCK   <CLOC+3>/4>\r
+\r
+IF2,<  IFN BINC-^D36,< +BINARY>>\r
+\r
+IFNDEF CLOC.,<CLOC.==CLOC>\r
+IFN CLOC.-CLOC,<PRINTX PHASE ERROR IN OPTABLE>\r
+\f\r
+PNTR:  EXP INST        ;POINTER TO BITS IN INST\r
+INST:  0               ;BINARY FOR INSTRUCTION\r
+CHP:   0               ;CHAR POINTER INTO TXT, TXT+1\r
+TXT:   BLOCK 2         ;STORE INPUT TEXT FOR OPEVAL\r
+SAVPDL:        0               ;SAVE PUSH DOWN LIST POINTER\r
+\r
+BTAB:  POINT 9,TBL     ;TABLE USED TO GET NEXT BYTE POINTER\r
+       POINT 9,TBL,8   ;FOR TRANSFER BYTE\r
+       POINT 9,TBL,17\r
+       POINT 9,TBL,26\r
+\r
+OPEVAL:        MOVEI T,0               ;EVALUATE FOR AN OP CODE\r
+       IDPB T,CHP              ;INSERT NULL IN TEXT FOR SYMBOL\r
+       MOVEM P,SAVPDL\r
+       TRZA F,OUTF\r
+OPTYPE:        TRO F,OUTF              ;TYPE AN OPCODE SYMBOLICALLY\r
+       LSH T,-33\r
+       MOVEM T,INST            ;GET OPCODE INTO RIGHT 9 BITS\r
+\r
+       MOVE T,[XWD 440700,TXT]\r
+       MOVEM T,CHP             ;FOR OPEVAL,SETUP POINTER TO INPUT TEXT\r
+       TRZ F,ITF               ;CLEAR INSTRUCTION TYPED FLAG\r
+       CLEARB R,W1\r
+       MOVE W2,BTAB\r
+DC1:   ILDB T,W2               ;GET NEXT BYTE IN TBL\r
+       CAILE T,40\r
+       CAIL T,73\r
+       SOJGE R,DC1             ;SKIP OVER # BYTES = C(R)\r
+       JUMPG R,DC1             ;SKIP OVER ALPHA TEXT WITHOUT COUNTING\r
+       SUBI T,40\r
+       JUMPE T,DECX            ;TRANSFER ON ASTOP CODE\r
+       JUMPG T,DC2\r
+       DPB T,[XWD 340500,PNTR] ;SETUP R ON A DISPATCH BYTE\r
+       TRZ T,-4\r
+       AOS T\r
+       DPB T,[XWD 300600,PNTR]\r
+       TRNN F,OUTF\r
+       JRST DC6                ;FOR OPEVAL ONLY\r
+       LDB R,PNTR              ;GET # BYTES TO SKIP OVER\r
+       JRST DC1\r
+\r
+DC2:   HRREI T,-33(T)\r
+       JUMPL T,DECT            ;TYPE OUT A LETTER\r
+       MOVEI W1,FIR.(T)                ;BYTE IS A TRANSFER\r
+       IDIVI W1,4\r
+       MOVE W2,BTAB(W2)        ;CALCULATE POINTER TO NEXT BYTE\r
+       ADDI W2,(W1)\r
+       JRST DC1\r
+\r
+\f\r
+DECT:  TRNE F,OUTF\r
+       JRST DC8        ;TYPE OUT A LETTER\r
+       ILDB W1,CHP     ;GET NEXT INPUT LETTER\r
+       CAIE W1,133(T)  ;COMPARE WITH ASSUMED NEXT LETTER\r
+       JRST NOMAT      ;DOESNT MATCH\r
+       JRST DC1        ;MATCHES, TRY NEXT\r
+\r
+DECX:  TRNE F,OUTF     ;STOP (CODE 40) HAS BEEN SEEN\r
+       POPJ P,         ;IF FOR OUTPUT, RETURN\r
+       ILDB W1,CHP     ;GET NEXT INPUT CHAR IF ANY\r
+       JUMPE W1,DC7    ;DOES # OF CHARS MATCH\r
+NOMAT: POP P,R         ;NO, BACK UP AND TRY SOME MORE\r
+       POP P,W2\r
+       POP P,PNTR\r
+       POP P,CHP\r
+NOMAT1:        AOS R           ;ASSUME NEXT NUMBER FOR BIN VALUE\r
+       DPB R,PNTR      ;STUFF INTO ANSWER\r
+       LDB R,PNTR\r
+       JUMPN R,DC6AA   ;IF =0, BYTE WAS TOO BIG\r
+       CAME P,SAVPDL\r
+       JRST NOMAT      ;NOT AT TOP LEVEL\r
+       POPJ P,         ;UNDEFINED, FINALLY\r
+\r
+DC6:   MOVEI R,0       ;ASSUME 0 FOR INITIAL BINARY VALUE\r
+       DPB R,PNTR\r
+DC6AA: CAMN P,SAVPDL\r
+       JRST DC6BB\r
+       LDB T,-2(P)     ;OLD VALUE OF PNTR\r
+       CAME T,(P)\r
+       JRST NOMAT1\r
+DC6BB: PUSH P,CHP\r
+       PUSH P,PNTR\r
+       PUSH P,W2\r
+       PUSH P,R\r
+       JRST DC1\r
+\r
+DC7:   MOVE P,SAVPDL           ;RESTORE PUSH DOWN POINTER\r
+       MOVE T,INST\r
+       LSH T,33                ;PUSH BINARY INTO POSITION FOR OPEVAL\r
+       LDB R,[POINT 3,T,8]\r
+       TLC T,700000\r
+       TLCN T,700000\r
+       DPB R,[POINT 10,T,12]   ;ONLY DONE FOR IO INSTRUCTIONS\r
+       JRST CPOPJ1             ;SYMBOL FOUND, SKIP RETURN\r
+\r
+DC8:   TRO F,ITF               ;SET INSTRUCTION TYPED FLAG\r
+       MOVEI T,133(T)\r
+       PUSHJ P,TOUT            ;OUTPUT A LETTER\r
+       CLEARM SPSAV            ;SO $D WONT TRY TO DELETE OP CODES\r
+       JRST DC1\r
+\fLIT\r
+\r
+\r
+PS:    BLOCK LPDL\r
+\r
+\r
+DDTEND:                ;ONLY STARTING ADDRESS FOR FILDDT\r
+               ;NO START EDDRESS FOR EXEC OR USER DDT\r
+               ;BECUASE MONITOR IS LOADED WITH BOTH EXEC AND USER DDTS\r
+               ;BUT STILL WANTS TO BE STARTED AT ITS OWN STARTING ADDRESS\r
+               ;USER DDT IS LOADED LAST. - T.H.\r
+IFN EDDT&10,<END DDT>\r
+       END                                                                                                                                                                                                                                                                                                                                                                                                                    \r
diff --git a/src/errcon.mac b/src/errcon.mac
new file mode 100644 (file)
index 0000000..057ec28
--- /dev/null
@@ -0,0 +1,438 @@
+TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V404\r
+SUBTTL T.HASTINGS/TH/RCC   TS  01 JUN 69\r
+XP VERRCN,404\r
+                       ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+       ENTRY ERRCON    ;ALWAYS LOAD ERRCON(IF LIB SEARCH)\r
+ERRCON:\r
+\r
+;THESE ERROR ROUTINE PRINT "ERROR IN JOB N"\r
+;FOLLOWED BY AN APPROPRIATE ERROR MESSAGE\r
+;THEN THE JOB IS STOPPED AND CONSOLE IS RETURNED TO\r
+;MONITOR COMMAND MODE\r
+\r
+\r
+;APR DETECTED ERRORS\r
+;PUSHDOWN OVERFLOW,ILLEGAL MEMORY, NONEXISTENT MEMORY\r
+;FOR WHICH THE USER IS NOT ENABLED.\r
+;SEE APRSER TO SEE HOW APR INTERRUPTS ARE HANDLED\r
+;CALL: SKIPE TAC,APRERR        ;RESULT OF CONI APR,APRERR\r
+;      PUSHJ PDP,APRLIM        ;FROM CLK SERVICE ROUT,(LOWEST PRIORTY PI)\r
+;      RETURN TO RESCHEDULE NEW USER\r
+\r
+INTERNAL APRILM\r
+EXTERNAL USRREL,CONMES,HOLD,INLMES,JOBN,PJOBN,PRQM\r
+EXTERNAL STOP1,TTYFUW,USRXIT,UUO0,WSCHED\r
+\r
+APRILM:        SETZM APRERR            ;CLEAR FLAG IMMEDIATELY,IN CASE OTHER ERRORS OCCUR\r
+       TRNN TAC,ILM            ;ILLEGAL MEMORY?\r
+       JRST APRNXM             ;NO\r
+       HRRZ TAC,APRPC          ;YES, PC STORED BY APR INTERRUPT\r
+IFE FT2REL,<\r
+       CAMG TAC,USRREL         ;IS PC IN BOUNDS/\r
+>\r
+IFN FT2REL,<\r
+       EXTERN SEGILM\r
+       CAMLE TAC,USRREL        ;IS PC IN BOUNDS(LOG SEG)?\r
+       PUSHJ PDP,SEGILM        ;NO. IS PC IN LEGAL MEMORY IN HIGH SEG?\r
+>\r
+       JRST APRILR             ;YES. GO PRINT ILL MEM REF\r
+       JSP TAC,ERRPTU          ;NO. PRINT PC EXCEEDS MEM BOUND\r
+       ASCIZ /PC OUT OF BOUNDS/\r
+       JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
+\r
+APRILR:        JSP TAC,ERRPTU\r
+       ASCIZ /ILL MEM REF/\r
+       JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
+\r
+\fAPRNXM:       TRNN TAC,NXM            ;NON-EX MEM?\r
+       JRST APRPDL             ;NO\r
+       JSP TAC,ERRPTU          ;YES\r
+       ASCIZ /NON EX MEM/\r
+       JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
+\r
+APRPDL:        TRNN TAC,POV            ;PUSHDOWN OVERFLOW?\r
+       JSP DAT,UERROR          ;NO, MUST BE HARDWARE PROBLEM\r
+       JSP TAC,ERRPTU          ;YES\r
+       ASCIZ /PDL OV/\r
+ASPSC: MOVE TAC1,APRPO         ;PRINT APR PC\r
+       JRST PCPNT              ;AS:\r
+                               ; 1)"AT USER LOC XXX" OR\r
+                               ; 2)"AT EXEC LOC XXX; EXEC CALLED FROM \r
+                               ; EXEC/USER LOC YYY\r
+\f;ADDRESS CHECK ERROR AT ANY LEVEL\r
+;DEVDAT MUST BE SET UP TO POINT TO OFFENDING DEVICE\r
+\r
+INTERNAL ADRERR\r
+\r
+ADRERR:        JSP TAC,ERRDEV          ;GET JOB NO. FROM DEVICE DATA BLOCK\r
+       ASCIZ /ADDRESS CHECK FOR /\r
+       JRST DEVEXC             ;PRINT "DEVICE XXX; EXEC CALLED FROM \r
+                               ; EXEC/USER LOC YYY"\r
+                               ; THEN STOP JOB\r
+\r
+;UNEXPLAINABLE MONITOR ERROR\r
+       ;CALL:  JSP DAT,UERROR  ;AT UUO LEVEL(PDP SET UP)\r
+       ;       JSP DAT,ERROR   ;AT INTERRUPT LEVEL(PDP NOT SET UP)\r
+       ;       JSP DAT,OERROR  ;AT INTERRUPT OR UUO LEVEL (PDP SET UP) -MESSAGE TO \r
+       ;                       ; OPERATOR'S CONSOLE RATHER THAN SPECIAL JOB\r
+       ;       JSP DAT,CERROR  ;BLAME JOB=C(ITEM), PDP SETUP\r
+\r
+INTERNAL ERROR,UERROR,CERROR,OERROR\r
+EXTERNAL JOB,ERRPDL,NULADR\r
+NLADDR:        EXP NULADR\r
+ERROR: MOVEI PDP,ERRPDL        ;USE LOWER CORE FOR PD LIST\r
+OERROR:        PUSH PDP,NLADDR         ;PUSH ADR, OF NULJOB ON PD LIST IN CASE\r
+                               ; THIS ERROR IS AT PI LEVEL 7 OR HIGHER\r
+                               ; SO NULL JOB WILL BE STARTED WHEN LAST\r
+                               ; POPJ IS DONE(STOP2 IN RUNCSS)\r
+       TDZA ITEM,ITEM          ;BLAME JOB 0(PRINT ON OPERATORS TTY)\r
+UERROR:        MOVE ITEM,JOB           ;PRINT FOR CURRENT JOB\r
+CERROR:\r
+IFN FTHALT,<\r
+       HALT    .+1             ;PUT ADR OF JSP DAT, IN PC AND STOP SO A\r
+                               ; DUMP CAN BE TAKEN,CONTINUE WILL PRINT ERROR MESSAGE\r
+>\r
+       JSP TAC,ERRPNT          ;ITEM ALREADY SETUP\r
+       ASCIZ /ERROR IN MONITOR/\r
+       MOVE TAC1,-1(PDP)       ;GET LOC OF JSP DAT,ERROR\r
+       JRST PCPNT              ;PRINT "AT EXEC LOC XXX:\r
+                               ; EXEC CALLED FROM EXEC/USER YYY"\r
+                               ; THEN STOP JOB\r
+\r
+;INPUT UUO FOR OUTPUT DEVICE\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLINP\r
+\r
+ILLINP:        JSP TAC,ERRPTU\r
+       ASCIZ /OUTPUT /\r
+       PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
+       JSP TAC,UUOMES          ;PRINT MESSAGE,UUOPC,STOP JOB\r
+       ASCIZ / CANNOT DO INPUT/\r
+\f;OUTPUT UUO FOR INPUT DEVICE\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLOUT\r
+\r
+ILLOUT:        JSP TAC,ERRPTU\r
+       ASCIZ /INPUT /\r
+       PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
+       JSP TAC,UUOMES          ;PRINT MESSAGE,UUOPC,STOP JOB\r
+       ASCIZ / CANNOT DO OUTPUT/\r
+\r
+;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUOS)\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLMOD\r
+\r
+ILLMOD:        JSP TAC,ERRPTU\r
+       ASCIZ /ILLEGAL DATA MODE FOR /\r
+       JRST DEVEXC             ;PRINT "DEVICE XXX",UUO PC\r
+\r
+;IO UUO TO USER CHANNEL WITH NO PREVIOUS INIT OR OPEN\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL IOIERR\r
+\r
+IOIERR:        JSP TAC,ERRPTU\r
+       ASCIZ /IO TO UNASSIGNED CHANNEL/\r
+       JRST UUOPCP             ;PRINT UUO PC\r
+\f;ILLEGAL UUO\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL UUOERR\r
+\r
+UUOERR:        JSP TAC,ERRPTU\r
+       ASCIZ /ILLEGAL UUO/\r
+       MOVE TAC1,UUO0          ;GET LAST UUO PC\r
+IFN FTHALT,<\r
+       TLNN TAC1,USRMOD                ;UUO FROM EXEC?\r
+       HALT    .+1                     ;YES, HALT SO DUMP CAN BE TAKEN\r
+                                       ; CONTINUE WILL PRINT MESSAGE\r
+>\r
+       SOSJ TAC1,PCPNT         ;AND PRINT, PRINT USER UUO PC IF DIFF.\r
+\r
+;ILLEGAL INSTRUCTION\r
+\r
+;HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB BUT\r
+;THE USER MAY CONTINUE FROM IT(EFFECTIVE ADR.)\r
+;CALLED AT UUO LEVEL WITH A JRST\r
+\r
+INTERNAL ILLINS\r
+EXTERNAL JOBPD1,TTYSTC\r
+\r
+ILLINS:        HLRZ TAC,UUO            ;ILLEGAL OPCODE\r
+       CAIN TAC,254200+PROG    ;IS IT A HALT?\r
+       JRST HALTI              ;YES, PRINT DIFFERENT MESSAGE\r
+       JSP TAC,ERRPTU\r
+       ASCIZ /ILL INST./\r
+       JRST UUOPCP             ;PRINT UUO PC AD STOP JOB\r
+\r
+HALTI: JSP TAC,ERRPTU\r
+       ASCIZ /HALT/\r
+       SOS TAC1,JOBPD1(JDAT)   ;UUOPC=LOC OF HALT+1\r
+       PUSHJ PDP,PCP           ;PRINT "USER LOC XXX"\r
+       PUSHJ PDP,INLMES        ;PRINT MONITOR MODE RESPONSE\r
+       ASCIZ /\r
+^C\r
+\r
+./\r
+       HRRM UUO,JOBPD1(JDAT)   ;SAVE EFFECTIVE ADDRESS OF HALT\r
+       PUSHJ PDP,TTYSTC        ;START TTY TYPING\r
+       PUSHJ PDP,STOP1         ;STOP JOB\r
+                               ; RETURN ONLY IF HE TYPES CONT\r
+       PUSH PDP,JOBPD1(JDAT)   ;PUT USER RETURN ON END OF PD LIST\r
+       JRST USRXIT             ;RETURN TO USER IN CASE HE TYPES CONT COMMAND\r
+\f;ROUTINE FOR HUNG IO DEVICE\r
+;CALL  MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,DEVHNG\r
+\r
+INTERNAL DEVHNG\r
+\r
+DEVHNG:        MOVEI TAC,IOACT         ;TURN OFF IO DEVICE ACTIVE BIT IN\r
+       ANDCAM TAC,DEVIOS(DEVDAT);MEMORY AND IOS\r
+       TRZ IOS,IOACT\r
+       JSP TAC,ERRDEV\r
+       ASCIZ /HUNG /\r
+       JRST DEVEXC\r
+\r
+;BAD DECTAPE DIRECTORY\r
+;CALLED AT INTERRUPT AND UUO LEVELS WITH DEVDAT AND ITEM SETUP\r
+\r
+INTERNAL BADDIR\r
+\r
+BADDIR:        JSP TAC,ERRPNT\r
+       ASCIZ /BAD DIRECTORY FOR /\r
+\r
+;ROUTINE TO PRINT "DEVICE XXX; EXEC CALLED FOR EXEC/USER YYY"\r
+;THEN STOP JOB\r
+;TO BE USED BY DEVICE DEPENDENT ERROR MESSAGES AFTER JSP TAC,DEVERR\r
+\r
+INTERNAL DEVEXC\r
+\r
+DEVEXC:        PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
+       JRST EXCALP             ;PRINT "EXEC CALLED FROM EXEC/USER LOC YYY"\r
+\f;ROUTINE TO HALT A JOB WHEN A DEVICE IS NOT READY FOR I/O\r
+;CALLED FROM XXSER AT UUO LEVEL\r
+;CALL  MOVE DEVDAT,ADDR. OF DEV. DDB\r
+;      PUSHJ PDP,HNGSTP\r
+\r
+INTERNAL HNGSTP\r
+\r
+HNGSTP:        PUSH PDP,ITEM\r
+       PUSH PDP,IOS\r
+       PUSH PDP,DEVDAT         ;SAVE DEV'S IOS WORD & DDB\r
+       PUSHJ PDP,TTYFUN        ;FIND JOB'S TTY & WAIT UNTIL I/O IS FINISHED\r
+       PUSHJ   PDP,PRQM        ;PRINT QUESTION MARK FOR BATCH\r
+       PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
+       PUSHJ PDP,INLMES        ;AND MSG.\r
+ASCIZ  /OK?\r
+^C\r
+\r
+./     PUSHJ PDP,TTYSTC        ;START UP TTY IN COMMAND MODE\r
+       POP PDP,DEVDAT          ;BRING BACK DEV DDB & IOS WORD\r
+       POP PDP,IOS\r
+       PUSHJ PDP,STOP1         ;STOP JOB &\r
+       POP PDP,ITEM\r
+       JRST WSCHED             ;RESCHEDULE\r
+\f;COMMON ERROR MESSAGE SETUP ROUTINES\r
+;CALL: JSP TAC,ERRPTU, ERRDEV, OR ERRPNT\r
+;      ASCIZ /MESSAGE/\r
+;      RETURNS HERE WITH DEVDAT SAVED 0(PDP)\r
+;      C(DEVDAT)=TTYDDB, DAT TO TTY OUTPUT BUFFER POINTER\r
+;      ITEM=JOB NUMBER\r
+\r
+;USE ERRPTU IF AT UUO LEVEL FOR SURE\r
+;ERRDEV IF ERROR FOR AN ASSIGNED DEVICE AT ANY LEVEL\r
+;ERRPNT WITH ITEM ALREADY SET TO OFFENDING JOB NUMBER\r
+;THE JSP CALL IS USED IN CASE PUSHDOWN SPACE BECOMES CRITICAL\r
+;AGAIN AND ERRPNT HAS TO WIRE EXISTING LIST OUT\r
+\r
+INTERNAL ERRPTU\r
+INTERNAL ERRDEV,ERRPNT\r
+EXTERNAL PJOBN,JOB,JBTADR,JBTDAT,TTYFND,NULERR\r
+IFN FTTTYSER,<EXTERNAL TTYERP>\r
+\r
+ERRPTU:        SKIPA ITEM,JOB          ;BLAME CURRENT JOB IS NOT 0.\r
+ERRDEV:        LDB ITEM,PJOBN          ;JOB NO, FROM DEVICE DATA BLOCK\r
+ERRPNT: SKIPM ITEM             ;ERROR IN NULL JOB?\r
+       SETOM NULERR            ;YES, SET FLAG FOR ERROR IN NULL JOB\r
+                               ; SO STATE OF NULL JOB WILL BE REESTABLISHED\r
+                               ; WHEN IS IT RUN AGAIN(SEE CLOCK1)\r
+\r
+       PUSH PDP,DAT            ;SAVE CALL TO ERROR(JSP DAT,ERROR)\r
+IFN FTRCHK,<\r
+       CAIL    ITEM,JOBN       ;JOB NUMBER\r
+       HALT    .               ;OUT OF RANGE?\r
+>\r
+       PUSH PDP,DEVDAT         ;SAVE ADR, OF DEV. DATA BLOCK\r
+       PUSH PDP,TAC            ;SAVE RETURN FROM ERRPNT\r
+       MOVE JDAT,JBTDAT(ITEM)  ;EVEN NULL JOB HAS JOB DATA AREA\r
+IFN JDAT-PROG,<\r
+       MOVE PROG,JBTADR(ITEM)  ;JOB RELOCATION\r
+>\r
+IFE FTTTYSER,< PUSHJ PDP,TTYFND        ;FIND TTY FOR THIS JOB(ITEM)>\r
+IFN FTTTYSER,< PUSHJ   PDP,TTYERP      ;FIND THIS TTY AND\r
+                               ;SET MERTPO IN DDB\r
+>\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ /?\r
+ERROR IN JOB /\r
+       PUSHJ PDP,PJOB          ;PRINT JOB NO.\r
+       JRST INLMES             ;PRINT MESSAGE SPECIFIED BY CALLER\r
+                               ; AND RETRUN TO LOC. AFTER MESSAGE\r
+\f;ROUTINE TO PRINT UUO PC AND STOP JOB\r
+;IF IN USER MODE PC WILL PRINT AS "AT USER LOC XXX"\r
+;IF IN EXEC MODE "AT EXEC LOC XXX; EXEC CALLED FROM EXEC/USER/ LOC YYY\r
+\r
+INTERNAL UUOPCP,UUOMES\r
+EXTERNAL JOBPD1\r
+\r
+UUOMES:        PUSHJ PDP,CONMES        ;PRINT MESSAGE POINTED TO BY TAC\r
+UUOPCP:        MOVE TAC1,JOBPD1(JDAT)  ;UUO PC STORED IN JOB DATA AREA\r
+                               ; FIRST LOC ON PD LIST\r
+       SOJA TAC1,PCPNT         ;DECREMENT TO POINT TO UUO IN USER AREA\r
+\r
+;ROUTINE TO PRINT ONE OF THREE MESSAGES AND STOP JOB\r
+;1) "AT EXEC LOC XXX; EXEC CALLED FROM EXEC LOC YYY"\r
+;2) "AT EXEC LOC XXX; EXEC CALLED FROM USER LOC YYY"\r
+;3) "AT USER LOC YYY"\r
+\r
+;CALL: MOVE TAC1, XXX          ;WITH PC FLAGS IN LH\r
+\r
+;      PUSHJ PDP,PCPNT\r
+;      NEVER RETURN IF AT UUO LEVEL\r
+\r
+INTERNAL PCPNT\r
+EXTERNAL TPOPJ\r
+\r
+PCPNT: PUSHJ PDP,PCP           ;PRINT " AT EXEC XXX" OR "AT USER "\r
+       TLNE TAC1,USRMOD        ;WAS PC IN USER MODE?\r
+       JRST PCSTOP             ;YES, ENOUGH INFO.\r
+\r
+;ROUTINE TO PRINT EITHER\r
+;1) "; EXEC CALLED FROM EXEC LOC YYY"\r
+;2) "; EXEC CALLED FROM USER LOC YYY"\r
+;AND STOP JOB\r
+;CALL: PUSHJ PDP,EXCALP\r
+;      NEVER RETURNS IF AT UUO LEVEL\r
+\r
+INTERNAL EXCALP,PCSTOP\r
+\r
+EXCALP:        PUSHJ PDP,INLMES\r
+       ASCIZ /; UUO/\r
+       MOVE TAC1,JOBPD1(JDAT)  ;UUO PC IN JOB DATA AREA\r
+       SUBI TAC1,1             ;BACK IT UP TO POINT TO UUO\r
+       PUSHJ PDP,PCP           ;PRINT "EXEC LOC " OF USER LOC\r
+PCSTOP:        PUSHJ PDP,HOLD          ;STOP JOB, START TTY AND SET JOB ERROR BIT\r
+       POP PDP,DEVDAT          ;RETURN ONLY IF AT INTERRUPT LEVEL\r
+       JRST TPOPJ              ;REMOVE ERROR CALL AND RETURN\r
+\f;ROUTINE TO PRINT PC AS:\r
+;1) "EXEC LOC XXX" OR "USER LOC XXX"\r
+;CALL: MOVE TAC1,PC TO PRINT(LH=PC FLAGS)\r
+;      PUSHJ PDP,PCP\r
+\r
+\r
+XMODE: ASCIZ / AT EXEC /\r
+UMODE: ASCIZ / AT USER /\r
+\r
+PCP:   MOVEI TAC,XMODE         ;ASSUME PC IN EXEC MODE\r
+       TLNE TAC1,USRMOD        ;IS IT?\r
+       MOVEI TAC,UMODE         ;NO, USER MODE\r
+       PUSHJ PDP,CONMES        ;PRINT ONE OR OTHER\r
+       HRRZ TAC,TAC1           ;PRINT RIGHT HALF IN OCTAL\r
+                               ; FALL INTO OCTPNT\r
+\r
+INTERN OCTPNT\r
+\r
+;ROUTINE TO PRINT 6 DIGIT OCTAL NUMBER\r
+;CALL: MOVE DAT,TTY OUTPUT BYTE POINTER\r
+;      HRR TAC, OCTAL NUMBER\r
+;      PUSHJ PDP,OCTPNT\r
+;      RETURN TAC1,PRESERVED,TAC DESTROYED\r
+\r
+OCTPNT:        HRLZ TAC,TAC            ;MOVE TO LH FOR ROTATING\r
+       TRO TAC,700000          ;SETUP AN END FLAG\r
+\r
+OCTP1: ROT TAC,3               ;GET NEXT OCTAL DIGIT\r
+       TLNN TAC,777777         ;WAS THAT FLAG?\r
+       POPJ PDP,               ;YES, DO NOT PRINT IT\r
+       PUSHJ PDP,PRTNUM        ;NO, PRINT OCTAL DIGIT\r
+       HRRI TAC,0              ;CLEAR RH\r
+       JRST OCTP1              ;GET NEXT OCTAL DIGIT\r
+\r
+;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL\r
+;SAME CALL AS OCTPNT\r
+\r
+       INTERN DECP1\r
+\r
+DECP1: AOJA TAC,RADX10         ;ADD 1 AND GO PRINT\r
+\r
+;ROUTINE TO PRINT DECIMAL\r
+;CALL: SAME AS OCTPNT\r
+;TAC1: PRESERVED\r
+\r
+INTERN RADX10\r
+\r
+RADX10:        PUSH PDP,TAC1           ;SAVE TAC1\r
+       PUSHJ PDP,PRTDIG        ;PRINT DECIMAL DIGITS\r
+       POP PDP,TAC1            ;RESTORE TAC1\r
+       POPJ PDP,               ;AND RETURN\r
+\r
+;RECURSIVE DECIMAL PRINT ROUTINE\r
+;CALL: MOVE TAC,DECIMAL NO.\r
+;      PUSHJ PDP,PRTDIG\r
+\r
+PRTDIG:        IDIVI TAC,12    ;DIVIDE BY 10\r
+       HRLM TAC1,(PDP)         ;RT ON PD LIST\r
+       JUMPE TAC,.+2           ;FINISHED?\r
+       PUSHJ PDP,PRTDIG        ;NO, CALL S OR F\r
+       HRLZ TAC,(PDP)          ;YES, GET LAST NUMBER\r
+PRTNUM:        ADDI TAC,"0"            ;CONVERT TO ASCIZ\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+       MOVE    TEM,TAC         ;PUT CHAR IN CHAR AC\r
+       JRST    OUTCHS          ;AND OUTPUT IN SCNSRF\r
+>\r
+IFE FTTTYSER,<\r
+\r
+       IDPB    TAC,DAT         ;ADD CHAR TO HALGF DUPLEX OUTPUT STREAM\r
+       POPJ PDP,\r
+>\r
+\f;ROUTINE TO PRINT "DEVICE XXX"\r
+;CALL  MOVE DAT,ASCII OUTPUT BYTE POINTER\r
+;      PUSH PDP,DEVDAT\r
+;      PUSHJ PDP,ERNAM\r
+\r
+INTERNAL ERNAM\r
+\r
+ERNAM: PUSHJ PDP,INLMES\r
+       ASCIZ /DEVICE /\r
+       SKIPE TAC1,-1(PDP)      ;IS DEVDAT = 0?\r
+       MOVE TAC1,DEVNAM(TAC1)  ;NO, GET DEVICE NAME\r
+\r
+;ROUTINE TO PRINT SIXBIT NAME\r
+;CALL  MOVE DAT,ASCII OUTPUT BYTE POINTER\r
+;      MOVE TAC1,NAME\r
+;      PUSHJ PDP,PRNAME\r
+\r
+INTERNAL PRNAME\r
+EXTERNAL CPOPJ\r
+\r
+PRNAME:        MOVEI TAC,0\r
+       LSHC TAC,6              ;SHIFT IN NEXT CHAR.\r
+       JUMPE TAC,CPOPJ\r
+       MOVEI   TEM,40(TAC)     ;ASCII VERSION INTO CHREC FOR OUTCHS\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+       PUSHJ   PDP,OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+       IDPB    TEM,DAT\r
+>\r
+       JRST PRNAME\r
+\r
+\r
+ERREND:        END\r
+\f\r
diff --git a/src/ft40n.mac b/src/ft40n.mac
new file mode 100644 (file)
index 0000000..bb6982b
--- /dev/null
@@ -0,0 +1,34 @@
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40N.MAC(V002)\r
+       XLIST\r
+;      TH/RC  TS3.19  27 SEP 68  V002\r
+;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY\r
+;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT\r
+\r
+FTSWAP=0       ;SWAPPING SYSTEM\r
+               ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTDISK=0       ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)\r
+               ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1\r
+               ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTLOGIN=0      ;LOGIN-LOGOUT COMMAND AND UUOS\r
+               ;FTDISK=-1 IMPLIES FTLOGIN=-1\r
+\r
+FTCCL=0                ;CONCISE COMMAND LANGUAGE COMMANDS\r
+               ;USED IN APRSER\r
+               ;SHOULD BE 0 IN NON-DISK SYSTEMS\r
+               ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED\r
+\r
+\r
+FTRC10=0       ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK\r
+\r
+FTKCT=0        ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=0        ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTAB=0     ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES\r
+\r
+;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS\r
+;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING\r
+\r
+       LIST\r
diff --git a/src/ft50sb.mac b/src/ft50sb.mac
new file mode 100644 (file)
index 0000000..8e6aca4
--- /dev/null
@@ -0,0 +1,33 @@
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT50SB.MAC(V002)\r
+       XLIST\r
+;      TH/RC  TS3.19  27 SEP 68  V002\r
+;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY\r
+;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT\r
+\r
+FTSWAP=-1      ;SWAPPING SYSTEM\r
+               ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTDISK=-1      ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)\r
+               ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1\r
+               ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTLOGIN=-1     ;LOGIN-LOGOUT COMMAND AND UUOS\r
+               ;FTDISK=-1 IMPLIES FTLOGIN=-1\r
+\r
+FTCCL=-1               ;CONCISE COMMAND LANGUAGE COMMANDS\r
+               ;USED IN APRSER\r
+               ;SHOULD BE 0 IN NON-DISK SYSTEMS\r
+               ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED\r
+\r
+FTRC10=-1      ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK\r
+\r
+FTKCT=-1       ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=-1       ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTAB=-1    ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES\r
+\r
+;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS\r
+;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING\r
+\r
+       LIST\r
diff --git a/src/jobdat.mac b/src/jobdat.mac
new file mode 100644 (file)
index 0000000..2d8dc0e
--- /dev/null
@@ -0,0 +1,168 @@
+TITLE  JOBDAT - JOB DATA AREA (FIRST 140 LOC OF USER AREA)
+SUBTTL T. HASTINGS/RAP TS3.19 24 SEP 68  V003
+       XP      VJOBDT,003      ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP.
+
+ENTRY DATJOB
+DATJOB:
+
+;THIS AREA PROVIDES STORAGE OF ITEMS OF INTEREST TO BOTH
+;THE MONITOR AND THE USER
+
+;MACRO TO DEFINE SYMBOLS FOR MONITOR USE ONLY
+;THESE MAY BE CHANGED TO SUIT MONITOR
+
+DEFINE M(SYMBOL,VALUE,LENGTH)
+<SYMBOL=VALUE
+INTERNAL SYMBOL
+LOC=VALUE+LENGTH>
+
+;MACRO TO DEFINE SYMBOLS FOR USER USE
+;THESE CANNOT BE CHANGED WITHOUT INVALIDATING OLD SAVED FILES
+
+DEFINE U(SYMBOL,VALUE,LENGTH)
+<SYMBOL=VALUE
+ENTRY SYMBOL
+LOC=VALUE+LENGTH>
+
+;MACRO TO DEFINE PARAMETERS OF INTEREST TO MONITOR ONLY
+;THESE MAY BE CHANGED TO SUIT MONITOR
+;MUST ASSEMBLE WITH SYSPAR TAPE FIRST
+
+DEFINE XP(SYMBOL,VALUE)
+<INTERNAL SYMBOL
+SYMBOL=VALUE>
+\f
+M JOBAC,0,20
+                       ;PLACE WHERE USER ACS ARE STORED ON UUO CALLS
+                       ;IE RELATIVE 0-17 IN USER AREA
+M JOBDAC,LOC,17
+                       ;PLACE WHERE HARDWARE ACS(0-16) ARE STORED
+                       ;WHEN JOB IS INACTIVE. THESE ARE EITHER THE
+                       ;USERS AC IF JOB WAS STOPPED IN USER MODE
+                       ;OR ARE THE EXEC IF STOPED IN EXEC MODE
+                       ;0-16 ALSO STORED HERE ON CLK INTERRUPTS
+XP JOBDPD,JOBDAC+PDP
+                       ;AC PDP DUMPED HERE
+XP JOBDPG,JOBDAC+PROG
+                       ;AC PROG DUMPED HERE
+XP JOBD14,JOBDAC+14
+                       ;AC 14 DUMPED HERE
+XP JOBD15,JOBDAC+15
+                       ;AC 15 DUMPED HERE
+XP JOBD16,JOBDAC+16
+                       ;AC 16 DUMPED HERE
+XP JOBD17,JOBDAC+17
+                       ;AC 17 DUMPED HERE
+U JOBUUO,40,1
+                       ;USER UUO TRAP LOC.(UUO STORED HERE)
+U JOB41,41,1
+                       ;USER UUO JSR LOCATION
+U JOBERR,42,1
+                       ;LH UNUSED-SAVE FOR LATER THINGS, SO USER PROGRAMS
+                       ;SHOULD IGNORE LH IN ALL PROGRAMS
+                       ;RH=COUNT OF NO. OF ERRORS IN RPG(RAPID PROGRAM
+                       ;GENERATION) SEQUENCE OF CUSPS.
+                       ;NOT CHANGED FROM GET TO GET.
+M JOBENB,43,1
+                       ;LH=UNUSED
+                       ;RH=APR CONSO FLAGS FOR USER APR TRAPPING
+                       ;SET BY CALL [SIXBIT /APRENB/]
+U JOBREL,44,1
+                       ;LH=0,RH=HIGHEST REL. ADR. IN USER AREA(IE LOW SEGMENT)
+                       ;SET BY MONITOR EACH TIME JOB RUNS OR CHANGES CORE SIZE
+M JOBPD1,LOC,0
+                       ;FIRST LOC. OF SYSTEM UUO PUSHDOWN LIST
+XP JOBPDL,JOBPD1-1
+                       ;FIRST LOC.-1
+U JOBBLT,JOBPD1,3
+                       ;3 WORDS USED BY LINKING LOADER TO MOVE PROGRAM DOWN
+                       ;BEFORE CALLING EXIT.
+                       ;OK TO USE EXEC PD LIST BEFORE EXECUTING UUO
+\fLOC=72
+XP MJOBPD,JOBPDL-LOC
+                       ;MINUS LENGTH OF PUSHDOWN LIST
+XP MJOBP1,MJOBPD+1
+                       ;-LENGTH+1
+XP JOBPRT,LOC
+                       ;FIRST LOC PROTECTED BY BEING COPIED INTO MONITOR
+XP JOBPR1,JOBPRT+1
+                       ;FIRST LOC+1
+M JOBHCU,LOC,1
+                       ;HIGHEST USER IO CHANNEL IN USE
+                       ;ONLY JOBJDA...JOBJDA+C(JOBHCU) ARE COPIED INTO
+                       ;MONITOR WHEN JOB IS RUN. 0 MEANS NONE OR
+                       ;CHAN. 0 IN USE, -1 MEANS SAVEGET HAS ACTIVE IO
+M JOBPC,LOC,1
+                       ;JOB PC WHEN JOB INACTIVE
+U JOBDDT,74,1
+                       ;LH UNUSED,RH=STARTING ADDRESS OF USER DDT
+XP JOBSAV,JOBDDT-1
+                       ;FIRST LOC.-1 WRITTEN BY SAVE COMMAND
+M JOBJDA,LOC,20
+                       ;JOB DEVICE ASSIGNMENT TABLE
+                       ;LH=UUOS DONE SO FAR,RH=ADR. OF DEVICE DATA BLOCK IN MONITOR
+XP JOBJMH,JOBHCU-JOBJDA
+                       ;JOBHCU-JOBJDA
+                       ;USED BY ANYACT ROUT. IN CORE1
+XP JOBPFI,JOBJDA+17
+                       ;HIGHEST LOC. IN JOB DATA AREA PROTECTED FROM IO
+XP MJOBCK,JOBPFI-JOBDAC
+                       ;AREA CHECKSUMMED DURING SWAPPING
+U JOBHRL,115,1         ;LH IS ANALOGOUS TO LH OF JOBSA, IE FIRST
+                       ;FREE LOC IN HIGH SEG, SET BY LINKING LOADER
+                       ;USED BY SAVE.
+                       ;RH ANALOGOUS TO JOBREL, IE HIGHEST LEGAL
+                       ;USER ADDRESS IN HIGH SEG. SET BY MONITOR EVERY TIME
+                       ;USER RUNS.  IF JOBHRL=0, JOB DOES NOT HAVE A HIGH SEG
+                       ;USER PROGRAMS SHOULD BE WRITTEN SO THAT
+                       ;THEY CAN BE ONE OR TWO SEGMENT PROGRAMS. JOBHRL
+                       ;CAN BE TESTED FOR NON-ZERO TO SEE IF HIGH SEG EXISTS
+U JOBSYM,116,1
+                       ;POINTER TO LOADER AND DDT SYMBOL TABLE POINTER
+U JOBUSY,117,1
+                       ;POINTER TO UNDEFINED SYMBOL TABLE
+                       ;SET BY LOADER, NOT YET USED BY DDT
+U JOBSA,120,1
+                       ;LH=FIRST LOC NOT LOADED BY RELOCATING LOADER
+                       ;RH=STARTING ADDRESS OF USER PROGRAM
+U JOBFF,121,1
+                       ;FIRST FREE LOCATION IN USER AREA
+                       ;USED BY MONITOR TO ASSIGN I/O BUFFERS IN TOP
+                       ;OF USER AREA
+\fU JOBS41,122,1
+                       ;C(JOB41) SAVED HERE ON SAVE COMMAND
+                       ;RESTORE FROM HERE ON GET
+M JOBEXM,LOC,1
+                       ;LAST LOC EXAMINED OR DEPOSITED USING 
+                       ;D OR E COMMANDS
+                       ;LH=-1 IF LAST COM WAS AN E, 0 IF IT WAS A D
+U JOBREN,124,1
+                       ;REENTER ADDRESS FOR REENTER COMMAND
+U JOBAPR,125,1
+                       ;PLACE TO TRAP TO IN USER AREA ON APR TRAP
+                       ;ENABLED BY APRENB UUO
+U JOBCNI,126,1
+                       ;APR IS CONIED INTO C(JOBCNI) ON APR TRAP
+U JOBTPC,127,1
+                       ;PC IS STORED HERE ON USER APR TRAP
+U JOBOPC,130,1
+                       ;OLD PC IS STORED HERE ON START,DDT,REENTER,
+                       ;STARTC COMMANDS
+U JOBCHN,131,1
+                       ;LH=FIRST LOC AFTER FIRST FORTRAN 4 LOADED PROGRAM
+                       ;RH=FIRST LOC AFTER FIRST FORTRAN 4 BLOCK DATA
+                       ;TO BE USED FOR JOB CHAINING
+M JOBFDV,LOC,1
+                       ;DEV. DATA BLOCK ADR. FOR FINISH COMMAND
+U JOBCOR,133,1
+                       ;SIZE OF CORE FOR JOB ON RUN,SAVE,GET COM.
+;134-136 UNUSED
+U JOBVER,137,1 
+                       ;CONTAINS VERSION NO.(OCTAL) OF CUSP BEING RUN
+                       ;GET LOADS FROM SAVE FILE.  NEVER CONVERTED
+                       ;TO DECIMAL BY MAN OR MACHINE. E 137 WILL PRINT VERSION NO.
+                       ;SET BY LOC 137 IN CUSP SOURCE
+XP JOBDA,140
+                       ;FIRST LOC NOT USED BY JOB DATA AREA
+
+       END,
diff --git a/src/k.mac b/src/k.mac
new file mode 100644 (file)
index 0000000..e64cbbf
--- /dev/null
+++ b/src/k.mac
@@ -0,0 +1 @@
+K==1\r
diff --git a/src/lptser.mac b/src/lptser.mac
new file mode 100644 (file)
index 0000000..05dade0
--- /dev/null
@@ -0,0 +1,230 @@
+TITLE  LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405\r
+SUBTTL T. W. MCMANUS /TNM   TS   20 MAY 69\r
+       XP VLPTSR,405           ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON:\r
+\r
+       EXTERNAL CPOPJ1, PION, PIOFF\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1:\r
+\r
+       EXTERNAL SETIOD, WAIT1\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON:\r
+\r
+       EXTERNAL HNGSTP, ILLINP\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON:\r
+\r
+       EXTERNAL ADVBFE, IDSET, OUT, SETACT, STOIOS\r
+\r
+;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER:\r
+\r
+       INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP\r
+       ENTRY LPTSER\r
+\r
+LPTSER:\r
+\f;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS\r
+\r
+       LPTCLR=1B25                     ;CLEAR LINE PRINTER BUFFER\r
+       LPTLOV=1B26                     ;LINE OVERFLOW FLAG (PDP-6 ONLY)\r
+       LPTERR=1B27                     ;ERROR FLAG\r
+       LPTBSY=1B28                     ;BUSY FLAG\r
+       LPTDON=1B29                     ;DONE FLAG\r
+       LPTECM=7B32                     ;ERROR CHANNEL MASK\r
+       LPTDCM=7B35                     ;DONE CHANNEL MASK\r
+       LPTBDM=LPTBSY+LPTDON            ;BUSY/DONE FLAG MASK\r
+\r
+;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS\r
+\r
+       LPTEND=Z(1B10)                  ;CLOSE UUO HAS BEEN DONE\r
+       LPTSYN=Z(1B11)                  ;CREF AFTER CLOSE UUO HAS BEEN SENT\r
+\r
+;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS\r
+\r
+       LPTCON=-4                       ;RH = SKIP CHAIN MASK REGISTER\r
+       LPTPTR= 7                       ;BLOCK OUTPUT POINTER\r
+       LPTCH= 11                       ;INTERRUPT CHANNEL ASSIGNMENTS\r
+       LPTSVE=12                       ;DDB ROUTINE TO SAVE AC'S\r
+       LPTEX1=16                       ;DDB EXIT ROUTINE IF AC'S NOT SAVED\r
+       LPTSV2=20                       ;TEMP. SAVE LOCN. FOR TAC\r
+       LPTECH=21                       ;CONSZ LP?,LPTECM\r
+       LPTDNE=22                       ;CONSO LP?,LPTDON\r
+       LPTCSO=23                       ;CONSO LP?,(TAC)\r
+       LPTCSZ=24                       ;CONSZ LP?,(TAC)\r
+       LPTCNI=25                       ;CONI  LP?,TAC\r
+       LPTCNO=26                       ;CONO  LP?,(TAC)\r
+       LPTDTO=27                       ;DATAO LP?,(TAC)\r
+       LPTBKO=30                       ;BLKO  LP?,LP?PTR\r
+\r
+;LINE PRINTER SERVICE DISPATCH TABLE\r
+\r
+       JRST LPTINI                     ;INITIALIZE\r
+       JRST LPTHNG                     ;HUNG DEVICE ERROR\r
+LPTDSP:        JRST LPTREL                     ;RELEASE\r
+       JRST LPTCLS                     ;CLOSE\r
+       JRST LPTOUT                     ;OUTPUT\r
+       JRST ILLINP                     ;INPUT\r
+\f;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE\r
+\r
+       ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
+       ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT\r
+       \r
+       ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH\r
+       ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER\r
+       ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO\r
+\r
+       ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB\r
+       ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED\r
+       ;FOR A LINE PRINTER\r
+\r
+       ;EACH OF THE ABOVE ROUTINE MUST:\r
+       ;\r
+       ;       1.  CLEAR THE SPECIFIED LINE PRINTER\r
+       ;       2.  DEASSIGN BOTH THE ERROR AND DONE INTERRUPT\r
+       ;            CHANNELS FOR THE LINE PRINTER\r
+       ;       3.  CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS\r
+       ;            FOR THAT LINE PRINTER\r
+\r
+       ;NOTE:  THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE\r
+       ;       LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER\r
+       ;       THAN FOR THE NORMAL CASE WHERE IT INVOKES THE\r
+       ;       INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE.\r
+       ;\r
+       ;       THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE\r
+       ;       IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE:\r
+       ;\r
+       ;               PUSHJ PDP,DINI(AC3)\r
+       ;               HRRZM AC3,SAVITM\r
+\r
+LPTHNG:\r
+LPTREL:\r
+       SOS (PDP)                       ;COUNTERACT SKIP RETURN\r
+LPTINI: MOVEI TAC,LPTCLR               ;CLEAR THE LINE PRINTER\r
+       XCT LPTCNO(DEVDAT)\r
+       HLLZS LPTCON(DEVDAT)            ;CLEAR SKIP CHAIN MASK FLAGS\r
+       JRST CPOPJ1                     ;SKIP RETURN IF ENTERED AT LPTINI\r
+                                       ; TO FORCE CALL FOR EACH LPT\r
+\r
+;LINE PRINTER CLOSE UUO ROUTINE\r
+\r
+LPTCLS:        TLO IOS,LPTEND                  ;TURN ON THE END FLAG\r
+       TLZ IOS,LPTSYN                  ;TURN OFF SYNCHRONIZATION FLAG\r
+       MOVEM IOS,DEVIOS(DEVDAT)        ;SAVE IOS IN THE DDB\r
+       JRST OUT                        ; AND RETURN TO UUOCON\r
+\f;LINE PRINTER OUTPUT UUO ROUTINE\r
+\r
+LPTOUT:        SETZ TAC,                       ;CLEAR ALL POSSIBLE\r
+       XCT LPTCNO(DEVDAT)              ; LINE PRINTER FLAGS\r
+       MOVEI TAC,LPTERR                ;SET MASK FOR ERROR FLAG\r
+       XCT LPTCSO(DEVDAT)              ;SKIP IF ERROR FLAG IS ON\r
+       JRST .+3                        ; LPT IS NOT OFF, NOT ON LOCAL\r
+       PUSHJ PDP,HNGSTP                ;STOP JOB AND PRINT REMINDER\r
+       JRST LPTOUT                     ;TRY AGAIN WHEN USER TYPES "CONT"\r
+       TLNE IOS,IOBEG                  ;IS THIS FIRST OUTPUT SINCE INIT?\r
+       JRST LPTNEW                     ; YES\r
+       PUSHJ PDP,LPTSET                ; NO, SET UP BLKO POINTER\r
+LPTGO: PUSHJ PDP,SETACT                ;SET I/O ACTIVE BIT, STORE IOS\r
+                                       ; AND SET HUNG DEVICE COUNT\r
+       MOVE TAC,LPTCH(DEVDAT)          ;GET CHANNEL ASSIGNMENTS FROM DDB\r
+       TLNE IOS,IOBEG                  ;IS THIS FIRST OUTPUT SINCE INIT?\r
+       IORI TAC,LPTCLR+LPTDON          ;SET LPTCLR IF IOBEG:=1, ELSE\r
+       XORI TAC,LPTDON                 ; SET LPTDON\r
+       HRLI TAC,LPTLOV+LPTERR+LPTDON   ;GET SKIP CHAIN MASK FLAGS\r
+       CONO PI,PIOFF                   ;TURN OFF PI TO PREVENT IMM. INT.\r
+       XCT LPTCNO(DEVDAT)              ;SEND CONDITIONS OUT TO LPT\r
+       HLRM TAC,LPTCON(DEVDAT)         ;SAVE SKIP CHAIN MASK FLAGS\r
+       CONO PI,PION                    ;REENABLE ALL INTERRUTPS\r
+       POPJ PDP,                       ; AND RETURN TO UUOCON\r
+\r
+LPTNEW:        TLO IOS,IO                      ;SET I/O DIRECTION TO OUTPUT\r
+       SETZM LPTPTR(DEVDAT)            ;CLEAR BLKO POINTER\r
+       JRST LPTGO                      ;RETURN TO MAINSTREAM\r
+\f;LINE PRINTER INTERRUPT SERVICE ROUTINE\r
+\r
+LPTINT:        XCT LPTECH(DEVDAT)              ;SKIP IF NO ERROR CHANNEL ASSIGNED\r
+       XCT LPTDNE(DEVDAT)              ;SKIP IF DONE FLAG IS UP\r
+       JRST LPTER1                     ; BRANCH TO ERROR SERVICE ROUTINE\r
+       SKIPL LPTPTR(DEVDAT)            ;BLKO COUNT TO 0 ON PREV. INTERRUPT\r
+       JRST LPTSVE(DEVDAT)             ; YES, GO SAVE ORIGINAL AC'S\r
+       XCT LPTBKO(DEVDAT)              ; NO, SEND NEXT WORD FOR PRINTING\r
+       JRST LPTEX1(DEVDAT)             ;LAST WORD SENT BUT INTERRUPT PENDING\r
+       JRST LPTEX1(DEVDAT)             ;GO RESTORE DEVDAT AND RETURN\r
+\r
+LPTNXT:                                        ;ENTER HERE AFTER DDB ROUTINE SAVE\r
+                                       ; ORIGINAL AC'S IN PROPER CHANNEL\r
+                                       ; SAVE AREA AND SETS UP DEVDAT\r
+                                       ; TO POINT TO DDB AGAIN\r
+\r
+       PUSHJ PDP,IOSET                 ;SET AC PROG:= JOB AREA ADDRESS AND\r
+                                       ; AC IOS:= DEVIOS IN THE DDB\r
+       TLZE IOS,IOBEG                  ;FIRST BUFFER SINCE INIT?\r
+       JRST LPTBG1                     ; YES, GO OUTPUT A CRFF\r
+       PUSHJ PDP,ADVBFE                ; NO, ADVANCE TO NEXT BUFFER\r
+       JRST LPTOFF                     ;CANNOT ADVANCE, BUFFER UNAVAILABLE\r
+       PUSHJ PDP,LPTSET                ;SET UP NEW BLKO POINTER\r
+LPTWCK:        TLZE IOS,IOW                    ;IS JOB WAITING FOR I/O COMPLETION?\r
+       PUSHJ PDP,SETIOD                ; YES, ARRANGE FOR JOB TO RUN AGAIN\r
+LPTEX2:        JRST STOIOS                     ;SAVE IOS, RESET HUNG DEVICE COUNT\r
+                                       ; AND DISMISS INTERRUPT\r
+\r
+LTPOFF:        TLNN IOS,LPTEND                 ;SKIP IF CLOSE HAS BEEN DONE\r
+       JRST LPTOF1                     ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT\r
+       TLON IOS,LPTSYN                 ;HAS FINAL CRFF BEEN OUTPUT?\r
+       JRST LPTBG2                     ; NO, SO GO DO IT\r
+       TLZ IOS,LPTEND                  ; YES, SO CLEAR END FLAG\r
+LPTOF1:        TRZ IOS,IOACT                   ;CLEAR I/O ACTIVE BIT\r
+       SETZ TAC,                       ;CLEAR TAC AND\r
+       XCT LPTCNO(DEVDAT)              ; TURN LPT OFF\r
+       HLLZS LPTCON(DEVDAT)            ;CLEAR SKIP CHAIN MASK FLAGS\r
+       JRST LPTWCK                     ; AND BRANCH\r
+\r
+LPTBG1:        PUSHJ PDP,LPTSET                ;SET UP INITIAL BLKO POINTER *****\r
+LPTBG2:        MOVEI TAC,[EXP 15B6+14B13]      ;SEND OUT A CRFF\r
+       XCT LPTDTO(DEVDAT)\r
+       JRST LPTEX2                     ;GO DISMISS ITERRUPT\r
+\f;LINE PRINTER ERROR HANDLING ROUTINE\r
+\r
+LPTER1:        MOVEM TAC,LPTSV2(DEVDAT)        ;SAVE TAC IN DDB\r
+       MOVEI TAC,LPTLOV                ;GET LINE OVERFLOW ERROR MASK\r
+       XCT LPTCSO(DEVDAT)              ;SKIP IF LINE OVERFLOW FLAG IS ON\r
+       JRST LPTER2                     ; GO CHECK IF PREVIOUS ERROR OCCURRED\r
+       MOVN TAC,[EXP 100001]           ;DECREMENT BLK0 POINTER\r
+       ADDM TAC,LPTPTR(DEVDAT)\r
+       MOVE TAC,[EXP 15B6+12B13]       ;PRINT CRLF\r
+       XCT LPTDTO(DEVDAT)\r
+       JRST LPTER4\r
+\r
+LPTER4:        XCT LPTECH(DEVDAT)              ;SKIP IF ERROR INTERRUPT NOT ASSIGNED\r
+       JRST LPTER5                     ; ERROR CONDITION DETECTED\r
+       MOVE TAC,LPTCH(DEVDAT)          ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
+       ANDI TAC,LPTDCM                 ;MASK OUT ERROR CHANNEL\r
+       IORI TAC,LPTBSY                 ;SET THE BUSY FLAG\r
+       XCT LPTCNO(DEVDAT)              ;SEND IT OUT TO THE LPT\r
+       MOVEI TAC,LPTRLOV+LPTERR+LPTDON ;ENABLE FOR ALL INTERRUPTS\r
+LPTER3:        HRRM TAC,LPTCON(DEVDAT)         ;SAVE SKIP CHAIN MASK FLAGS\r
+LPTER4:        MOVE TAC,LPTSV2(DEVDAT)         ;RESTORE SAVED ACCUMULATOR\r
+       JRST LPTEX1(DEVDAT)             ; AND GO DISMISS INTERRUPT\r
+\r
+LPTER5:        MOVE TAC,LPTCH(DEVDAT)          ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
+       ANDI TAC,LPTDCM                 ;MASK OUT ERROR CHANNEL ASSIGNMENT\r
+       IORI TAC,LPTBSY                 ;SET BUSY FLAG\r
+       XCT LPTCNO(DEVDAT)              ;SEND IT OUT TO THE LPT\r
+       MOVEI TAC,LPTDON                ;ENABLE FOR DONE FLAG ONLY\r
+       JRST LPTER3\r
+\f;LINE PRINTER BLKO POINTER SETUP ROUTINE\r
+\r
+LPTSET:        MOVEI TAC,@DEVOAD(DEVDAT)       ;GET ABS. ADDR. OF CURRENT BUFFER\r
+       MOVN TAC1,1(TAC)                ;GET NEGATIVE WORD COUNT\r
+       HRL TAC,TAC1                    ;COMBINE NEG. WORD COUNT AND ADDR,\r
+       AOJ TAC,                        ;INCREMENT BUFFER ADDRESS TO FORM\r
+       MOVEM TAC,LPTPTR(DEVDAT)        ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1)\r
+       POPJ PDP,                       ; AND RETURN\r
+\r
+\r
+       END\r
+\r
+\r
+\r
+\r
+       
\ No newline at end of file
diff --git a/src/macro.v46 b/src/macro.v46
new file mode 100644 (file)
index 0000000..0ade69b
--- /dev/null
@@ -0,0 +1,7778 @@
+TITLE  MACRO V.46(52)  \r
+SUBTTL  RPG/CMF/JF/PMH/DMN     7-SEPT-71\r
+;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
+\r
+       VMACRO==46              ;VERSION NUMBER\r
+       VUPDATE==0              ;DEC UPDATE LEVEL\r
+       VEDIT==52               ;EDIT NUMBER\r
+       VCUSTOM==0              ;NON-DEC UPDATE LEVEL\r
+\r
+\r
+       LOC     <JOBVER==137>\r
+       <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT\r
+       RELOC\r
+       MLON\r
+\r
+COMMENT        *       ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)\r
+\r
+       SWITCHES ON (NON-ZERO) IN DEC VERSION\r
+SEG2SW         GIVES TWO SEGMENT MACRO\r
+PURESW         GIVES VARIABLES IN LOW SEGMENT\r
+CCLSW          GIVES RAPID PROGRAM GENERATION FEATURE\r
+FTDISK         GIVES DISK FEATURES\r
+RUNSW          USE RUN UUO FOR "DEV:NAME!"\r
+TEMP           TMPCOR UUO IS TO BE USED\r
+RENTSW         ASSEMBLE REENTRANT PROGRAMS\r
+FORMSW         USE MORE READABLE FORMATS FOR LISTING (ICCSW)\r
+DFRMSW         DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)\r
+\r
+       SWITCHES OFF (ZERO) IN DEC VERSION\r
+STANSW         GIVES STANFORD FEATURES\r
+LNSSW          GIVES LNS VERSION\r
+WFWSW          GIVES ARRAY, INTEGER AND LVAR FEATURES\r
+IIISW          GIVES III FEATURES\r
+OPHSH          GIVES HASH SEARCH OF OPCODES\r
+KI10           GIVES KI10 OP-CODES\r
+*\r
+\fSUBTTL        DEFAULT ASSEMBLY SWITCH SETTINGS\r
+\r
+IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>\r
+IFNDEF SEG2SW,<SEG2SW==0>\r
+IFN SEG2SW,<PURESW==1>\r
+\r
+IFNDEF PURESW,<PURESW==1>\r
+\r
+IFNDEF STANSW,<STANSW==0>\r
+\r
+IFNDEF RENTSW,<RENTSW==1>\r
+\r
+IFNDEF LNSSW,<LNSSW==0>\r
+IFN LNSSW,<FTDISK==0>\r
+\r
+IFNDEF RUNSW,<RUNSW==0>\r
+\r
+IFNDEF CCLSW,<CCLSW==1>\r
+IFN CCLSW,<FTDISK==1>\r
+\r
+IFNDEF TEMP,<TEMP==0>\r
+\r
+IFNDEF WFWSW,<WFWSW==0>\r
+\r
+\r
+IFNDEF FTDISK,<FTDISK==0>\r
+IFNDEF DFRMSW,<DFRMSW==0>\r
+IFN DFRMSW,<FORMSW==0>\r
+IFDEF ICCSW,<FORMSW==ICCSW>    ;SAME SWITCH\r
+IFNDEF FORMSW,<FORMSW==0>\r
+\r
+IFNDEF IIISW,<IIISW==0>\r
+\r
+IFNDEF OPHSH,<OPHSH==0>\r
+\r
+IFNDEF KI10,<KI10==0>\r
+\fSUBTTL        OTHER PARAMETERS\r
+\r
+.PDP== ^D50            ;BASIC PUSH-DOWN POINTER\r
+IFNDEF LPTWID,<LPTWID==^D132>  ;DEFAULT WIDTH OF PRINTER\r
+.LPTWD==8*<LPTWID/8>           ;USEFUL WIDTH IN MAIN LISTING\r
+.CPL== .LPTWD-^D32             ;WIDTH AVAIABLE FOR TEXT WHEN\r
+                               ;BINARY IS IN HALFWORD FORMAT\r
+IFE STANSW,<.LPP==^D55 ;LINES/PAGE>\r
+IFN STANSW,<.LPP==^D52 ;LINES/PAGE>\r
+.STP== ^D40            ;STOW SIZE\r
+.TBUF==        ^D80            ;TITLE BUFFER\r
+.SBUF==        ^D80            ;SUB-TITLE BUFFER\r
+.IFBLK==^D20           ;IFIDN COMPARISON BLOCK SIZE\r
+.R1B==^D18\r
+.UNIV==^D10            ;NUMBER OF UNIVERSAL DEFINITIONS\r
+.LEAF==4               ;SIZE OF BLOCKS IN MACRO TREE\r
+\r
+NCOLS==LPTWID/^D32             ;NUMBER OF COLUMNS IN SYMBOL TABLE\r
+IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>\r
+IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>\r
+IFNDEF NUMBUF,<\r
+IFE STANSW!LNSSW,<NUMBUF==2    ;NUMBER OF INPUT BUFFERS>\r
+IFN STANSW,<NUMBUF==5  ;NUMBER OF INPUT BUFFERS>\r
+IFN LNSSW,<NUMBUF==4   ;DOUBLE BUFFER FOR DOUBLE SIZE DEVICES>\r
+>\r
+\r
+EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA\r
+IFN CCLSW,<    EXTERN  JOBERR>\r
+\r
+IFN PURESW,<\r
+IFE SEG2SW,<HISEG>\r
+IFN SEG2SW,<TWOSEGMENTS\r
+LOWL:                          ;START OF LOW SEGMENT\r
+       RELOC 400000>>\r
+\r
+       SALL            ;SUPPRESS ALL MACROS\r
+\r
+;SOME ASCII CHARACTERS\r
+\r
+HT==11\r
+LF==12\r
+VT==13\r
+FF==14\r
+CR==15\r
+EOL==33\r
+\f                      ;ACCUMULATORS\r
+AC0==  0\r
+AC1=   AC0+1\r
+AC2=   AC1+1\r
+SDEL=  3               ;SEARCH INCREMENT\r
+SX=    SDEL+1          ;SEARCH INDEX\r
+ARG=   5               ;ARGUMENT\r
+V=     6               ;VALUE\r
+C=     7               ;CURRENT CHARACTER\r
+CS=    C+1             ;CHARACTER STATUS BITS\r
+RC=    11              ;RELOCATION BITS\r
+MWP=   12              ;MACRO WRITE POINTER\r
+MRP=   13              ;MACRO READ POINTER\r
+IO=    14              ;IO REGISTER (LEFT)\r
+ER==   IO              ;ERROR REGISTER (RIGHT)\r
+FR=    15              ;FLAG REGISTER (LEFT)\r
+RX==   FR              ;CURRENT RADIX (RIGHT)\r
+MP=    16              ;MACRO PUSHDOWN POINTER\r
+PP=    17              ;BASIC PUSHDOWN POINTER\r
+\r
+%OP==  3\r
+%MAC== 5\r
+%DSYM==        2\r
+%SYM== 1\r
+%DMAC==        %MAC+1\r
+\r
+OPDEF  RESET   [CALLI   0]\r
+OPDEF  SETDDT  [CALLI   2]\r
+OPDEF  DDTOUT  [CALLI   3]\r
+OPDEF  DEVCHR  [CALLI   4]\r
+OPDEF  WAIT    [MTAPE   0]\r
+OPDEF  CORE    [CALLI  11]\r
+OPDEF  EXIT    [CALLI  12]\r
+OPDEF  UTPCLR  [CALLI  13]\r
+OPDEF  DATE    [CALLI  14]\r
+OPDEF  APRENB  [CALLI  16]\r
+OPDEF  MSTIME  [CALLI  23]\r
+OPDEF  PJOB    [CALLI  30]\r
+OPDEF  RUN     [CALLI  35]\r
+OPDEF  TMPCOR  [CALLI  44]\r
+\r
+IFN STANSW,< OPDEF SWAP [CALLI 400004] >\r
+\f                      ;FR  FLAG REGISTER (FR/RX)\r
+IOSCR== 000001         ;NO CR AFTER LINE\r
+MTAPSW==000004         ;MAG TAPE\r
+ERRQSW==000010         ;IGNORE Q ERRORS\r
+LOADSW==000020         ;END OF PASS1 & NO EOF YET\r
+DCFSW==        000040          ;DECIMAL FRACTION\r
+RIM1SW==000100         ;RIM10 MODE\r
+NEGSW==        000200          ;NEGATIVE ATOM\r
+RIMSW==        000400          ;RIM OUTPUT\r
+PNCHSW==001000         ;RIM/BIN OUTPUT WANTED\r
+CREFSW==002000\r
+R1BSW== 004000         ;RIM10 BINARY OUTPUT\r
+TMPSW==        010000          ;EVALUATE CURRENT ATOM\r
+INDSW==        020000          ;INDIRECT ADDRESSING WANTED\r
+RADXSW==040000         ;RADIX ERROR SWITCH\r
+FSNSW== 100000         ;NON BLANK FIELD SEEN\r
+MWLFLG==200000         ;ON FOR DON'T ALLOW MULTI-WORD LITERALS\r
+P1==   400000          ;PASS1\r
+\r
+                       ;IO FLAG REGISTER (IO/ER)\r
+FLDSW==        400000          ;ADDRESS FIELD\r
+IOMSTR==200000\r
+ARPGSW==100000         ;ALLOW RAPID PROGRAM GENERATION\r
+IOPROG==040000         ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)\r
+NUMSW==        020000\r
+IOMAC==        010000          ;MACRO EXPANSION IN PROGRESS\r
+IOPALL==004000         ;SUPRESS LISTING OF MACRO EXPANSIONS\r
+IONCRF==002000         ;SUPRESS OUTPUT OF CREF INFORMATION\r
+CRPGSW==001000         ;CURRENTLY IN PROGRESS ON RPG\r
+IOCREF==000400         ;WE ARE NOW OUTPUTTING CREF INFO\r
+IOENDL==000200         ;BEEN TO STOUT\r
+IOPAGE==000100\r
+DEFCRS==000040         ;THIS IS A DEFINING OCCURANCE (MACROS)\r
+IOIOPF==000020         ;IOP INSTRUCTION SEEN\r
+MFLSW== 000010         ;MULTI-FILE MODE,PRGEND SEEN\r
+IORPTC==000004         ;REPEAT CURRENT CHARACTER\r
+IOTLSN==000002         ;TITLE SEEN\r
+IOSALL==000001         ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED\r
+\r
+OPDEF  JUMP1   [JUMPL  FR,  ]  ;JUMP IF PASS 1\r
+OPDEF  JUMP2   [JUMPGE FR,  ]  ;JUMP IF PASS 2\r
+\r
+OPDEF  JUMPOC  [JUMPGE IO,  ]  ;JUMP IF IN OP-CODE FIELD\r
+OPDEF  JUMPAD  [JUMPL  IO,  ]  ;JUMP IF IN ADDRESS FIELD\r
+\r
+OPDEF  JUMPCM  [JUMPL  CS,  ]  ;JUMP IF CURRENT CHAR IS COMMA\r
+OPDEF  JUMPNC  [JUMPGE CS,  ]  ;JUMP IF CURRENT CHAR IS NON-COMMA\r
+\r
+\f                      ;ER ERROR REGISTERS (IO/ER)\r
+ERRM== 000020          ;MULTIPLY DEFINED SYMBOL\r
+ERRE== 000040          ;ILLEGAL USE OF EXTERNAL\r
+ERRP== 000100          ;PHASE DISCREPANCY\r
+ERRO== 000200          ;UNDEFINED OP CODE\r
+ERRN== 000400          ;NUMBER ERROR\r
+ERRV== 001000          ;VALUE PREVIOUSLY UNDEFINED\r
+ERRU== 002000          ;UNDEFINED SYMBOL\r
+ERRR== 004000          ;RELOCATION ERROR\r
+ERRL== 010000          ;LITERAL ERROR\r
+ERRD== 020000          ;REFERENCE TO MULTIPLY DEFINED SYMBOL\r
+ERRA== 040000          ;PECULIAR ARGUMENT\r
+ERRX== 100000          ;MACRO DEFINITION ERROR\r
+ERRQ== 200000          ;QUESTIONABLE, NON-FATAL ERROR\r
+ERRORS==777760\r
+LPTSW==        000002\r
+TTYSW==        000001\r
+\r
+                       ;SYMBOL TABLE FLAGS\r
+SYMF== 400000          ;SYMBOL\r
+TAGF== 200000          ;TAG\r
+NOOUTF==100000         ;NO DDT OUTPUT WFW\r
+SYNF== 040000          ;SYNONYM\r
+MACF== SYNF_-1         ;MACRO\r
+OPDF== SYNF_-2         ;OPDEF\r
+PNTF== 004000          ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE\r
+UNDF== 002000          ;UNDEFINED\r
+EXTF== 001000          ;EXTERNAL\r
+INTF== 000400          ;INTERNAL\r
+ENTF== 000200          ;ENTRY\r
+VARF== 000100          ;VARIABLE\r
+MDFF== 000020          ;MULTIPLY DEFINED\r
+SPTR== 000010          ;SPECIAL EXTERNAL POINTER\r
+SUPRBT==000004         ;SUPRESS OUTPUT TO DDT\r
+LELF== 000002          ;LEFT HAND RELOCATABLE\r
+RELF== 000001          ;RIGHT HAND RELOCATABLE\r
+\r
+LITF==  200000         ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S\r
+ADDF==  100000         ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES\r
+\r
+TNODE==        200000          ;TERMINAL NODE FOR EVALEX\r
+\fSUBTTL        RUN UUO\r
+\r
+IFN CCLSW,<\r
+IFN RUNSW,<    XLIST   >\r
+IFE RUNSW,<\r
+;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE\r
+; FOR OVERWRITING\r
+; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE"\r
+\r
+IFN CCLSW,<NUNCOM:     IOWD    0,INHERE        ;WHERE TO DO IO\r
+       0                       ;TERMINATE COMMAND LIST\r
+NUNGO2:        IN      BIN,NUNCOM      ;READ FILE\r
+       JRST    NUNGO3          ;THERE ARE NO ERRORS\r
+NUNERR:        DDTOUT  NUNPNT,         ;COMPLAIN\r
+       EXIT                    ;GIVE UP\r
+NUNERM:        ASCIZ   /?LINKAGE ERROR/\r
+NUNGO3:        SKIPE   12,INHERE+133-74 ;LOOK AT JOBCOR\r
+                               ;DOES JOB WANT TO RUN IN MORE CORE?\r
+       CAMG    12,JOBREL       ;MORE CORE THAN CURRENTLY USED?\r
+       JRST    NUNGO4          ;NO, GO BLT PROG\r
+       CORE    12,             ;ASK FOR MORE CORE\r
+       JRST    NUNERR          ;NOT AVAILABLE\r
+       JRST    NUNGO4          ;GO BLT PROGRAM\r
+INHERE:\r
+\f;THIS CODE MUST BE IN FIRST 1K\r
+NUNSET:        JUMPN   ACDEV,.+2               ;DEVICE SPECIFIED?\r
+       MOVSI   ACDEV,(SIXBIT /SYS/)    ;NO, USE SYSTEM DEVICE\r
+       JUMPN   ACEXT,.+2               ;EXT SPECIFIED?\r
+       MOVSI   ACEXT,(SIXBIT /SAV/)    ;NO, USE "SAV"\r
+       MOVEM   ACDEV,NUNDEV            ;DEVICE NAME TO USE\r
+       OPEN    BIN,NUNINI              ;INIT THE DEVICE\r
+       JRST    EINIT                   ;ERROR\r
+       MOVEM   ACFILE,NUNDIR           ;IS THE FILE AVAILABLE?\r
+       HLLZM   ACEXT,NUNDIR+1          ;STASH EXTENSION\r
+       SETZM   NUNDIR+3                ;CLEAR PPN\r
+       LOOKUP  BIN,NUNDIR              ;LOOK FOR FILE\r
+       JRST    [HLRZ   ACEXT,NUNDIR+1          ;WAS EXTENSION "SAV"?\r
+               CAIE    ACEXT,(SIXBIT /SAV/)    ;...\r
+               JRST    ERRCF                   ;GO COMPLAIN\r
+               MOVSI   ACEXT,(SIXBIT /DMP/)    ;TRY "DMP" EXTENSION\r
+               JRST    .-3     ]               ;TRA -3,4\r
+       PUSHJ PP,DELETE         ;COMMAND FILE\r
+       MOVE 15,NUNDIR          ;GET THE NAME\r
+       CALLI 15,43     ;TELL SYSTEM "SETNAM"\r
+       HLRO    15,NUNDIR+3     ;GET WORD COUNT\r
+       HRLM    15,NUNCOM       ;STASH COUNT\r
+       MOVNS   15              ;NEGATIVE COUNT\r
+       MOVEI   16,73(15)       ;WHERE TO STOP BLT\r
+       ADDI    15,INHERE       ;HOW BIG TO MAKE CORE\r
+       IORI    15,1777         ;AN EVEN MULTIPLE OF 1K\r
+       CORE    15,             ;ASK TS EXEC FOR CORE\r
+       JRST    [HRROI RC,[SIXBIT /NOT ENUF CORE FOR LINKAGE@/]\r
+               JRST ERRFIN     ];GO COMPLAIN\r
+       MOVSI   NUNTOP,NUNAC\r
+       BLT     NUNTOP,NUNTOP   ;SET ACS\r
+       HRR     NUNBLT,16       ;...\r
+       TLNN    IO,CRPGSW       ;WAS RPG IN PROGRESS?\r
+       TLZ     NUNAOS,577000   ;NO, DON'T MAKE NEXT AN RPG\r
+       JRST    NUNGO2\r
+\r
+NUNAC: PHASE   0\r
+NUNGO4:        MOVE    NUNLAC,INHERE+74-74     ;SETUP FOR NEW DDT\r
+       SETDDT  NUNLAC,         ;...\r
+INTERN JOBS41\r
+JOBS41=122             ;LOADER WILL GIVE MUL. DEF. GLOBAL IF CHANGED\r
+\r
+EXTERN JOB41\r
+       MOVE    NUNLAC,JOBS41+INHERE-74 ;RESTORE LOC 41\r
+       MOVEM   NUNLAC,JOB41    ;...\r
+NUNBLT:        BLT     NUNTOP,.-.      ;MOVE PRGM TO WHERE IT BELONGS\r
+       RESET                   ;RESET ALL I/O\r
+NUNAOS:        AOS     1,JOBSA         ;GET STARTING ADDR FOR RPG\r
+       JRST    0(1)            ;GET ON WITH THE GAME\r
+NUNPNT:        NUNERM                  ;ERROR MESSAGE POINTER\r
+NUNTOP:        XWD     INHERE+1,75\r
+NUNLAC=.\r
+       DEPHASE\r
+>   >\r
+       LIST\r
+\r
+\fIFN RUNSW,<   ;ASSEMBLE IF RUN UUO IMPLEMENTED\r
+NUNSET:        JUMPN   ACDEV,.+2\r
+       MOVSI   ACDEV,(SIXBIT /SYS/)    ;USE SYS IF NONE SPECIFIED\r
+       MOVEM ACDEV,RUNDEV\r
+IFE STANSW,<\r
+       MOVEM ACFILE,RUNFIL     ;STORE FILE NAME\r
+       PUSHJ PP,DELETE         ;COMMAND FILE\r
+       SETZM RUNPP\r
+       MOVEI 16,RUNDEV ;XWD 0,RUNDEV\r
+       TLNE IO,CRPGSW  ;WAS RPG IN PROGRESS?\r
+       HRLI 16,1       ;YES. START NEXT AT C(JOBSA)+1\r
+       RUN 16,         ;DO "RUN DEV:NAME"\r
+>      ;IFE STANSW,\r
+IFN STANSW,<\r
+       MOVEM   ACFILE,RUNDEV+1\r
+       SETZM   RUNDEV+2\r
+       SETZM   RUNDEV+3\r
+       SETZM   RUNDEV+4\r
+       TLNE    IO,CRPGSW       ;ARE WE DOING RPG?\r
+       AOS     RUNDEV+3        ;YES SET STARTING ADDRESS INCREMENT\r
+       MOVEI   16,RUNDEV       ;ADDRESS OF SWAPBLOCK\r
+       SWAP    16,\r
+>      ;IFN STANSW\r
+       HALT            ;SHOULDN'T RETURN. HALT IF IT DOES\r
+>\r
+\r
+DELETE:        HRRZ    EXTMP           ;IF THE EXTENSION\r
+       CAIE    (SIXBIT/TMP/)   ;IS  .TMP\r
+       POPJ    PP,             ;RETURN.\r
+       CLOSE   CTL2,           ;DELETE\r
+       SETZB   4,5             ;THE COMMAND FILE.\r
+       SETZB   6,7\r
+       RENAME  CTL2,4          ;\r
+       JFCL\r
+       POPJ    PP,\r
+>\r
+\fSUBTTL        START ASSEMBLING\r
+\r
+ASSEMB:        PUSHJ   PP,INZ          ;INITIALIZE FOR PASS\r
+       MOVE    [ASCII /.MAIN/]\r
+       MOVEM   TBUF\r
+       MOVEI   SBUF\r
+       HRRM    SUBTTX\r
+\r
+ASSEM1:        PUSHJ   PP,CHARAC       ;TEST FOR FORM FEED\r
+       SKIPGE  LIMBO           ;CRLF FLAG?\r
+       JRST    ASSEM1          ;YES ,IGNORE LF\r
+       CAIN    C,14\r
+       SKIPE   SEQNO\r
+       JRST    ASSEM2\r
+       PUSHJ   PP,OUTFF1\r
+       PUSHJ   PP,OUTLI\r
+       JRST    ASSEM1\r
+\r
+ASSEM2:        AOS     TAGINC\r
+       CAIN    C,"\"           ;BACK-SLASH?\r
+       TLZA    IO,IOMAC        ;YES, LIST IF IN MACRO\r
+       TLO     IO,IORPTC\r
+       PUSHJ   PP,STMNT        ;OFF WE GO\r
+       TLZN    IO,IOENDL       ;WAS STOUT PRE-EMPTED?\r
+       PUSHJ   PP,STOUT        ;NO, POLISH OFF LINE\r
+       JRST    ASSEM1\r
+\r
+\fSUBTTL        STATEMENT PROCESSOR\r
+\r
+STMNT: TLZ     FR,INDSW!FSNSW\r
+       TLZA    IO,FLDSW\r
+STMNT1:        PUSHJ   PP,LABEL\r
+STMNT2:        PUSHJ   PP,ATOM         ;GET THE FIRST ATOM\r
+       CAIN    C,35            ;"="?\r
+       JRST    ASSIGN          ;YES\r
+       CAIN    C,32            ;":"?\r
+       JRST    STMNT1          ;YES\r
+       JUMPAD  STMNT7          ;NUMERIC EXPRESSION\r
+       JUMPN   AC0,STMN2A      ;JUMP IF NON NULL FIELD\r
+       SKIPN   LITLVL          ;ALLOW COMMA IN LITERALS\r
+       CAIE    C,14            ;NULL, COMMA?\r
+       CAIN    C,EOL           ;OR END OF LINE?\r
+       POPJ    PP,             ;YES,EXIT\r
+       CAIN    C,"]"           ;CLOSING LITERAL?\r
+       POPJ    PP,             ;YES\r
+       JRST    STMNT9          ;NO,AT LEAST SKIP ALL THIS NONSENSE\r
+\r
+STMN2A:        JUMPE   C,.+2\r
+       TLO     IO,IORPTC\r
+       PUSHJ   PP,MSRCH        ;SEARCH FOR MACRO/OPDEF/SYN\r
+       JRST    STMNT3          ;NOT FOUND, TRY OP CODE\r
+       LDB     SDEL,[POINT 3,ARG,5]\r
+       JUMPE   SDEL,ERRAX      ;ERROR IF NO FLAGS\r
+       SOJE    SDEL,OPD1       ;OPDEF IF 1\r
+       SOJE    SDEL,CALLM      ;MACRO IF 2\r
+       JRST    STMNT4          ;SYNONYM, PROCESS WITH OP-CODES\r
+\r
+STMNT3:        PUSHJ   PP,OPTSCH       ;SEARCH OP CODE TABLE\r
+       JRST    STMNT5          ;NOT FOUND\r
+STMNT4:        HLLZ    AC0,V           ;PUT CODE IN AC0\r
+       TRZ     V,ADDF          ;CLEAR ADDRESS NON-VALID FLAG\r
+       TRZE    V,LITF          ;VALID IN LITERAL?\r
+       SKIPN   LITLVL          ;NO, ARE WE IN A LITERAL?\r
+       JRST    0(V)            ;NO, GO TO APPROPRIATE PROCESSOR\r
+       POPJ    PP,             ;YES,EXIT\r
+\r
+STMNT5:        PUSHJ   PP,SSRCH        ;TRY SYMBOLS\r
+       JRST    STMNT8          ;NOT FOUND\r
+       TLNE    ARG,EXTF!UNDF   ;EXTERNAL OR UNDEFINED?\r
+       JRST    STMNT7          ;YES, PROCESS IN EVALEX\r
+       TLNN RC,-2              ;CHECK FOR EXTERNAL\r
+       TRNE RC,-2\r
+       JRST STMNT7\r
+       MOVE    AC0,V           ;FOUND, PUT VALUE IN AC0\r
+       TLO     IO,NUMSW        ;FLAG AS NUMERIC\r
+STMNT7:        TLZ     IO,IORPTC\r
+STMNT9:        PUSHJ   PP,EVALHA       ;EVALUATE EXPRESSION\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE STANDARD FORM>\r
+       TLNE    FR,FSNSW        ;FIELD SEEN?\r
+       JRST    STOW            ;YES,STOW THE CODE AND EXIT\r
+       CAIE    C,"]"-40        ;CLOSING LITERAL?\r
+       TRO     ER,ERRQ         ;NO, GIVE "Q" ERROR\r
+       POPJ    PP,             ;EXIT\r
+\r
+\fSTMNT8:       MOVEI   V,0             ;ALWAYS START SCAN WITH 0\r
+       CAIL    V,CALNTH        ;END OF TABLE?\r
+       JRST    STMN8C          ;YES, TRY TTCALLS\r
+       CAME    AC0,CALTBL(V)   ;FOUND IT?\r
+       AOJA    V,.-3           ;NO,TRY AGAIN\r
+       SUBI    V,NEGCAL        ;CALLI'S START AT -1\r
+       HRLI    V,(CALLI)       ;PUT IN UUO\r
+STMN8D:        MOVSI   ARG,OPDF        ;SET FLAG FOR OPDEF\r
+STMN8B:        PUSHJ   PP,INSERT       ;PUT OPDEF IN TABLE\r
+       JRST    OPD             ;AND TREAT AS OPDEF\r
+\r
+STMN8C:        SETZ    V,              ;START WITH ZERO\r
+       CAIL    V,TTCLTH        ;END OF TABLE?\r
+       JRST    STMN8A          ;YES, ERROR\r
+       CAME    AC0,TTCTBL(V)   ;MATCH?\r
+       AOJA    V,.-3           ;NO, KEEP TRYING\r
+       LSH     V,5             ;PUT IN AC FIELD (RIGHT HALF)\r
+       HRLZI   V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF\r
+       JRST    STMN8D          ;SET OPDEF FLAG\r
+\r
+STMN8A:        SETZB   V,RC            ;CLEAR VALUE AND RELOCATION\r
+       TRO     ER,ERRO         ;FLAG AS UNDEFINED OP-CODE\r
+       JUMP1   OPD             ;TREAT AS STANDARD OP ON PASS1\r
+       MOVSI   ARG,OPDF!UNDF!EXTF      ;SET A FEW FLAGS\r
+       JRST    STMN8B          ;TO FORCE OUT A MESSAGE\r
+\r
+               ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)\r
+                       ;UNTIL A LINE TERMINATOR IS SEEN.\r
+STOUTS:        TLOA    IO,IOENDL!IORPTC\r
+STOUT: TLO     IO,IORPTC\r
+       PUSHJ   PP,BYPAS1\r
+       CAIN    C,14            ;COMMA?\r
+       SKIPL   STPX            ;YES, ERROR IF CODE STORED\r
+       CAIN    C,EOL\r
+       TLOA    IO,IORPTC\r
+       TRO     ER,ERRQ\r
+STOUT1:        PUSHJ   PP,CHARAC\r
+       CAIG    C,CR\r
+       CAIG    C,HT\r
+       JRST    STOUT1\r
+       JRST    OUTLIN          ;OUTPUT THE LINE (BIN AND LST)\r
+\f      SUBTTL  LABEL PROCESSOR\r
+       \r
+LABEL: JUMPAD  LABEL4          ;COMPARE IF NON-SYMBOLIC\r
+       JUMPE   AC0,LABEL5      ;ERROR IF BLANK\r
+       TLO IO,DEFCRS           ;THIS IS A DEFINITION\r
+       PUSHJ   PP,SSRCH        ;SEARCH FOR OPERAND\r
+       MOVSI   ARG,SYMF!UNDF!TAGF      ;NOT FOUND\r
+       TLNN    ARG,EXTF        ;OPERAND FOUND (SKIP EXIT)\r
+       JRST    LABEL0\r
+       JUMP1   LABEL3          ;ERROR ON PASS1\r
+       TLNN    ARG,UNDF        ;UNDEFINED ON PASS1\r
+       JRST    LABEL3          ;NO, FLAG ERROR\r
+       TLZ     ARG,EXTF!PNTF   ;TURN OFF EXT FLAG NOW\r
+LABEL0:        TLZN    ARG,UNDF!VARF   ;WAS IT PREVIOUSLY DEFINED?\r
+       JRST    LABEL2          ;YES, CHECK EQUALITY\r
+       MOVE    V,LOCA  ;WFW\r
+       MOVE    RC,MODA\r
+       TLO     ARG,TAGF\r
+       PUSHJ   PP,PEEK         ;GET NEXT CHAR.\r
+       CAIE    C,":"           ;SPECIAL CHECK FOR  ::\r
+       JRST    LABEL1          ;NO MATCH\r
+       TLO     ARG,INTF        ;MAKE IT INTERNAL\r
+       PUSHJ   PP,GETCHR       ;PROCESS NEXT CHAR.\r
+       PUSHJ   PP,PEEK         ;PREVIEW NEXT CHAR.\r
+LABEL1:        CAIE    C,"!"           ;HALF-KILL SIGN\r
+       JRST    LABEL6          ;NO\r
+       TLO     ARG,NOOUTF      ;YES, SUPPRESS IT\r
+       PUSHJ   PP,GETCHR       ;AND GET RID OF IT\r
+LABEL6:        MOVEM   AC0,TAG         ;SAVE FOR PASS 1 ERRORS\r
+       HLLZS   TAGINC          ;ZERO INCREMENT\r
+       JRST    INSERT          ;INSERT/UPDATE AND EXIT\r
+\r
+LABEL2:        HRLOM   V,LOCBLK        ;SAVE LIST LOCATION\r
+       CAMN    V,LOCA          ;DOES IT COMPARE WITH PREVIOUS? WFW\r
+       CAME    RC,MODA\r
+LABEL3:        TLOA    ARG,MDFF        ;NO, FLAG MULTIPLY DEFINED AND SKIP\r
+       JRST    LABEL7          ;YES, GET RID OF EXTRA CHARS.\r
+       TRO     ER,ERRM         ;FLAG MULTIPLY DEFINED ERROR \r
+       JRST    UPDATE          ;UPDATE AND EXIT\r
+\r
+LABEL4:        CAMN    AC0,LOCA        ;DO THEY COMPARE?\r
+       CAME    RC,MODA\r
+LABEL5:        TRO     ER,ERRP         ;NO, FLAG PHASE ERROR\r
+       POPJ    PP,\r
+\r
+LABEL7:        SKIPE   LITLVL          ;LABEL IN A LITERAL?\r
+       MOVEM   AC0,LITLBL      ;YES, SAVE LABEL NAME FOR LATER\r
+       PUSHJ   PP,PEEK         ;INSPECT A CHAR.\r
+       CAIN    C,":"           ;COLON?\r
+       PUSHJ   PP,GETCHR       ;YES, DISPOSE OF IT\r
+       PUSHJ   PP,PEEK         ;EXAMINE ONE MORE CHAR.\r
+       CAIN    C,"!"           ;EXCLAMATION?\r
+       JRST    GETCHR          ;YES, INDEED\r
+\f      POPJ    PP,\r
+\fSUBTTL        ATOM PROCESSOR\r
+ATOM:  PUSHJ   PP,CELL         ;GET FIRST CELL\r
+       TLNE    IO,NUMSW        ;IF NON-NUMERIC\r
+ATOM1: CAIE    C,42            ;OR NOT A BINARY SHIFT,\r
+       POPJ    PP,             ;EXIT\r
+\r
+       PUSH    PP,AC0          ;STACK REGISTERS, ITS A BINARY SHIFT\r
+       PUSH    PP,AC1\r
+       PUSH    PP,RC\r
+       PUSH    PP,RX\r
+       HRRI    RX,^D10         ;COMPUTE SHIFT RADIX 10\r
+       PUSHJ   PP,CELLSF       ;GET SHIFT\r
+       MOVE    ARG,RC          ;SAVE RELOCATION\r
+       POP     PP,RX           ;RESTORE REGISTERS\r
+       POP     PP,RC\r
+       POP     PP,AC1\r
+       MOVN    SX,AC0          ;USE NEGATIVE OF SHIFT\r
+       POP     PP,AC0\r
+       JUMPN   ARG,NUMER2      ;IF NOT ABSOLUTE\r
+       TLNN    IO,NUMSW        ;AND NUMERIC,\r
+       JRST    NUMER2          ;FLAG ERROR\r
+       LSHC    AC0,^D35(SX)\r
+       LSH     RC,^D35(SX)\r
+       JRST    ATOM1           ;TEST FOR ANOTHER\r
+\fCELLSF:       TLO     IO,FLDSW\r
+CELL:  SETZB   AC0,RC          ;CLEAR RESULT AND RELOCATION\r
+       SETZB   AC1,AC2         ;CLEAR WORK REGISTERS\r
+       MOVEM   PP,PPTEMP       ;SAVE PUSHDOWN POINTER\r
+       TLZ     IO,NUMSW\r
+       TLZA    FR,NEGSW!DCFSW!RADXSW\r
+\r
+CELL1: TLO     IO,FLDSW\r
+       PUSHJ   PP,BYPASS\r
+       LDB     V,[POINT 4,CSTAT(C),14] ;GET CODE\r
+       XCT     .+1(V)          ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE\r
+       JRST    CELL1           ;0; BLANK, (TAB OR "+")\r
+       JRST    LETTER          ;1; LETTER  ] $ % ( ) , ; >\r
+       TLC     FR,NEGSW        ;2; "-"\r
+       TLO     FR,INDSW        ;3; "@"\r
+       JRST    NUM1            ;4; NUMERIC   0 - 9\r
+       JRST    ANGLB           ;5; "<"\r
+       JRST    SQBRK           ;6; "["\r
+       JRST    QUOTES          ;7; ""","'" \r
+       JRST    QUAL            ;10; "^"\r
+       JRST    PERIOD          ;11; "."\r
+       TROA    ER,ERRQ         ;12; ERROR, FLAG AND TREAT AS DELIMITER\r
+                               ;12;    ! # & * / : = ? \ _\r
+\fLETTER:       TLOA    AC2,(POINT 6,AC0,)      ;SET BYTE POINTER\r
+LETTE1:        PUSHJ   PP,GETCHR       ;GET CHARACTER\r
+       TLNN    CS,6            ;ALPHA-NUMERIC?\r
+       JRST    LETTE3          ;NO,TEST FOR VARIABLE\r
+       TLNE    AC2,770000      ;STORE ONLY SIX BYTES\r
+LETTE2:        IDPB    C,AC2           ;RETURN FROM PERIOD\r
+       JRST    LETTE1\r
+\r
+LETTE3:        CAIE    C,03            ;"#"?\r
+       POPJ    PP,\r
+       JUMPE   AC0,POPOUT      ;TEST FOR NULL\r
+       PUSHJ   PP,PEEK         ;PEEK AT NEXT CHAR.\r
+       CAIN    C,"#"           ;IS IT 2ND #?\r
+       JRST    LETTE4          ;YES, THEN IT'S AN EXTERN\r
+       TLO     IO,DEFCRS\r
+       PUSHJ   PP,SSRCH        ;YES, SEARCH FOR SYMBOL (OPERAND)\r
+       MOVSI   ARG,SYMF!UNDF   ;NOT FOUND, FLAGAS UNDEFINED SYM.\r
+       TLNN    ARG,UNDF        ;UNDEFINED?\r
+       JRST    GETCHR          ;NO, GET NEXT CHAR AND RETURN\r
+       TLO     ARG,VARF        ;YES, FLAG AS A VARIABLE\r
+       TRO     ER,ERRU         ;SET UNDEFINED ERROR FLAG\r
+       PUSHJ   PP,INSERZ       ;INSERT IT WITH A ZERO VALUE\r
+       JRST    GETDEL\r
+\r
+LETTE4:        PUSHJ   PP,GETCHR       ;AND SCAN PAST IT\r
+       PUSHJ   PP,GETCHR       ;GET RID OF #\r
+       JRST    EXTER1          ;PUT IN SYMBOL TABLE\r
+\r
+NUMER1:        SETZB   AC0,RC          ;RETURN ZERO\r
+NUMER2:        TRO     ER,ERRN         ;FLAG ERROR\r
+\r
+GETDEL:        PUSHJ   PP,BYPASS\r
+GETDE1:        JUMPE   C,.-1\r
+       MOVEI   AC1,0\r
+GETDE3:        TLO     IO,NUMSW!FLDSW  ;FLAG NUMERIC\r
+       TLNN    FR,NEGSW        ;IS ATOM NEGATIVE?\r
+       POPJ    PP,             ;NO, EXIT\r
+       JUMPE   AC1,GETDE2\r
+       MOVNS   AC1\r
+       TDCA    AC0,[-1]\r
+GETDE2:        MOVNS   AC0             ;YES, NEGATE VALUE\r
+       MOVNS   RC              ;AND RELOCATION\r
+POPOUT:        POPJ    PP,             ;EXIT\r
+\fQUOTES:       CAIE    C,"'"-40        ;IS IT  "'"\r
+       JRST    QUOTE           ;NO MUST BE """\r
+       JRST    SQUOTE          ;YES\r
+\r
+QUOTE0:        TLNE    AC0,376000      ;5 CHARACTERS STORED ALREADY?\r
+       TRO     ER,ERRQ         ;YES, GIVE WARNING\r
+       ASH     AC0,7\r
+       IOR     AC0,C\r
+QUOTE: PUSHJ   PP,CHARAC       ;GET 7-BIT ASCII\r
+       CAIG    C,15            ;TEST FOR LF, VT, FF OR CR\r
+       CAIGE   C,12\r
+       JRST    .+2             ;NO, SO ALL IS WELL\r
+       JRST    QUOTE2          ;ESCAPE WITH Q ERROR\r
+       CAIE    C,42\r
+       JRST    QUOTE0\r
+       PUSHJ   PP,PEEK         ;LOOK AT NEXT CHAR.\r
+       CAIE    C,42\r
+       JRST    QUOTE1          ;RESTORE REPEAT LEVEL AND QUIT\r
+       PUSHJ   PP,CHARAC       ;GET NEXT CHAR.\r
+       JRST    QUOTE0          ;USE IT\r
+\r
+QUOTE2:        TRO     ER,ERRQ         ;SET Q ERROR\r
+QUOTE1:        JRST    GETDEL\r
+\r
+SQUOT0:        TLNE    AC0,770000      ;SIX CHARS. STORED ALREADY ?\r
+       TRO     ER,ERRQ         ;YES\r
+       LSH     AC0,6\r
+       IORI    AC0,-40(C)      ;OR IN SIXBIT CHAR.\r
+\r
+SQUOTE:        PUSHJ   PP,CHARAC\r
+       CAIG    C,CR\r
+       CAIGE   C,LF\r
+       JRST    .+2\r
+       JRST    QUOTE1\r
+       CAIE    C,"'"\r
+       JRST    SQUOT0\r
+       PUSHJ   PP,PEEK\r
+       CAIE    C,"'"\r
+       JRST    QUOTE1\r
+       PUSHJ   PP,CHARAC\r
+       JRST    SQUOT0\r
+\r
+\fQUAL: PUSHJ   PP,BYPAS1       ;SKIP BLANKS, GET NEXT CHARACTER\r
+       CAIN    C,42            ;"B"?\r
+       JRST    QUAL2           ;YES, RADIX=D2\r
+       CAIN    C,57            ;"O"?\r
+       JRST    QUAL8           ;YES, RADIX=D8\r
+       CAIN    C,46            ;"F"?\r
+       JRST    NUMDF           ;YES, PROCESS DECIMAL FRACTION\r
+       CAIN    C,54            ;"L"?\r
+       JRST    QUALL           ;YES\r
+       CAIE    C,44            ;"D"?\r
+       JRST    NUMER1          ;NO, FLAG NUMERIC ERROR\r
+       ADDI    AC2,2\r
+QUAL8: ADDI    AC2,6\r
+QUAL2: ADDI    AC2,2\r
+       PUSH    PP,RX\r
+       HRR     RX,AC2\r
+       PUSHJ   PP,CELLSF\r
+QUAL2A:        POP     PP,RX\r
+       TLNN    IO,NUMSW\r
+       JRST    NUMER1\r
+       JRST    GETDE1\r
+\r
+QUALL: PUSH    PP,FR\r
+       PUSHJ   PP,CELLSF\r
+       MOVE    AC2,AC0\r
+       MOVEI   AC0,^D36\r
+       JUMPE   AC2,QUAL2A\r
+       LSH     AC2,-1\r
+       SOJA    AC0,.-2\r
+\fSUBTTL        LITERAL PROCESSOR\r
+\r
+SQBRK: PUSH    PP,FR\r
+       PUSH    PP,EXTPNT       ;ALLOW EXTERN TO PRECEDE LIT IN XWD\r
+       SETZM   EXTPNT\r
+       SKIPE LITLVL    ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY\r
+       JRST SQB5\r
+       MOVE C,SEQNO2\r
+       MOVEM C,LITSEQ\r
+       MOVE C,PAGENO\r
+       MOVEM C,LITPG\r
+SQB5:  JSP     AC2,SVSTOW\r
+SQB3:  PUSHJ   PP,STMNT\r
+       CAIN C,75       ;CHECK FOR ]\r
+       JRST SQB1\r
+       TLO IO,IORPTC\r
+       TLNE    FR,MWLFLG       ;CALL IT ] IF NOT MULTI-WORD FLAG\r
+       JRST    SQB2            ;BUT REPEAT LAST CHARACTER\r
+       PUSHJ PP,BYPAS1\r
+       CAIN C,EOL\r
+       TLOA IO,IORPTC\r
+       TRO ER,ERRQ\r
+SQB4:  PUSHJ PP,CHARAC\r
+       CAIN    C,";"           ;COMMENT?\r
+       JRST    SQB6            ;YES, IGNORE SQUARE BRACKETS\r
+       CAIN    C,"]"           ;LOOK FOR TERMINAL SQB\r
+       TRNN    ER,ERRORS       ;IN CASE OF ERROR IN LITERAL\r
+       JRST    .+2             ;NO ALL IS WELL\r
+       JRST    SQB1            ;FINISH THE LITERAL NOW!!\r
+       CAIG    C,CR            ;LOOK FOR END OF LINE\r
+       CAIN    C,HT\r
+       JRST    SQB4\r
+SQB4A: PUSHJ   PP,OUTIML       ;DUMP\r
+       PUSHJ   PP,CHARAC       ;GET ANOTHER CHAR.\r
+       SKIPL   LIMBO           ;CRLF FLAG\r
+       TLO     IO,IORPTC       ;NO REPEAT\r
+       JRST    SQB3\r
+\r
+SQB6:  PUSHJ   PP,CHARAC       ;GET A CHARACTER\r
+       CAIG    C,CR\r
+       CAIN    C,HT            ;LOOK FOR END OF LINE CHAR.\r
+       JRST    SQB6            ;NOT YET\r
+       JRST    SQB4A           ;GOT IT\r
+\r
+SQB1:  TLZ     IO,IORPTC\r
+SQB2:  PUSHJ   PP,STOLIT\r
+       JSP     AC2,GTSTOW\r
+       SKIPE   LITLBL          ;NEED TO FIXUP A LABEL?\r
+       PUSHJ   PP,RELBLE       ;YES, USE LOC OF LITERAL\r
+       POP     PP,EXTPNT\r
+       POP     PP,FR\r
+       SKIPE   LITLVL          ;WERE WE NESTED?\r
+       JUMP1   NUMER2          ;YES, FORCE ERROR IF PASS 1\r
+       JRST    GETDEL\r
+\r
+RELBLE:        PUSH    PP,AC0          ;SAVE LOCATION COUNTER\r
+       PUSH    PP,RC           ;AND RELOCATION\r
+       MOVE    AC0,LITLBL      ;SYMBOL WE NEED\r
+       SETZM   LITLBL          ;ZERO INDICATOR\r
+       PUSHJ   PP,SSRCH        ;SEARCH FOR OPERAND\r
+       JRST    RELBL1          ;SHOULD NEVER HAPPEN\r
+       TLNN    ARG,TAGF        ;IT BETTER BE A LABEL\r
+       JRST    RELBL1          ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE\r
+       TLZ     ARG,UNDF!EXTF!PNTF      ;CLEAR FLAGS NOW\r
+       POP     PP,RC           ;GET LITERAL RELOCATION\r
+       MOVE    V,(PP)          ;GET VALUE (LOC COUNTER)\r
+       PUSHJ   PP,UPDATE       ;UPDATE VALUE\r
+       POP     PP,AC0          ;RESTORE LITERAL COUNT\r
+       POPJ    PP,             ;RETURN\r
+       \r
+RELBL1:        POP     PP,RC           ;RESTORE RC\r
+       POP     PP,AC0  ;AND AC0\r
+       POPJ    PP,             ;JUST RETURN\r
+\fANGLB:        PUSH    PP,FR\r
+       TLZ     FR,INDSW\r
+       PUSHJ   PP,ATOM\r
+       TLNN    IO,NUMSW\r
+       CAIE    C,35\r
+       JRST    ANGLB1\r
+       PUSHJ   PP,ASSIG1\r
+       MOVE    AC0,V\r
+       JRST    ANGLB2\r
+\r
+ANGLB1:        PUSHJ   PP,EVALHA\r
+ANGLB2:        POP     PP,FR\r
+       CAIE    C,36\r
+       TRO     ER,ERRN\r
+       JRST    GETDEL\r
+\r
+PERIOD:        PUSHJ   PP,GETCHR       ;LOOK AT NEXT CHARACTER\r
+       TLNN    CS,2            ;ALPHABETIC?\r
+       JRST    PERNUM          ;NO, TEST NUMERIC\r
+       MOVSI   AC0,(SIXBIT /./)        ;YES, PUT PERIOD IN AC0\r
+       MOVSI   AC2,(POINT 6,AC0,5)     ;SET BYTE POINTER\r
+       JRST    LETTE2          ;AND TREAT AS SYMBOL\r
+\r
+PERNUM:        TLNE    CS,4            ;IS IT A NUMBER\r
+       JRST    NUM32           ;YES\r
+       MOVE    AC0,LOCA        ;NO. CURRENT LOC SYMBOL (.)\r
+       MOVE    RC,MODA         ;SET TO CURRENT ASSEMBLY MODE\r
+       JRST    GETDE1          ;GET DELIMITER\r
+NUMDF: TLO     FR,DCFSW        ;SET DECIMAL FRACTION FLAG\r
+NUM:   PUSHJ   PP,GETCHR       ;GET A CHARACTER\r
+       TLNN    CS,4            ;NUMERIC?\r
+       JRST    NUM10           ;NO\r
+NUM1:  SUBI    C,20            ;CONVERT TO OCTAL\r
+       PUSH    PP,C            ;STACK FOR FLOATING POINT\r
+       MOVE    AC0,AC1\r
+       MULI    AC0,0(RX)\r
+       ADD     AC1,C           ;ADD IN LAST VALUE\r
+       CAIL    C,0(RX)         ;IS NUMBER LESS THAN CURRENT RADIX?\r
+       TLO     FR,RADXSW       ;NO, SET FLAG\r
+       AOJA    AC2,NUM         ;YES, AC2=NO. OF DECIMAL PLACES\r
+\r
+\fNUM10:        CAIE    C,16            ;PERIOD?\r
+       TLNE    FR,DCFSW        ;OR DECIMAL FRACTION?\r
+       JRST    NUM30           ;YES, PROCESS FLOATING POINT\r
+       LSH     AC1,1           ;NO, CLEAR THE SIGN BIT\r
+       LSHC    AC0,^D35        ;AND SHIFT INTO AC0\r
+       MOVE    PP,PPTEMP       ;RESTORE PP\r
+       SOJE    AC2,GETDE1      ;NO RADIX ERROR TEST IF ONE DIGIT\r
+       TLNE    FR,RADXSW       ;WAS ILLEGAL NUMBER ENCOUNTERED?\r
+       TRO     ER,ERRN         ;YES, FLAG N ERROR\r
+       JRST    GETDE1\r
+\r
+NUM30: CAIE    C,"B"-40        ;IF "B" THEN MISSING  "."\r
+NUM31: PUSHJ   PP,GETCHR\r
+       TLNN    CS,4            ;NUMERIC?\r
+       JRST    NUM40           ;NO\r
+NUM32: SUBI    C,20\r
+       PUSH    PP,C\r
+       JRST    NUM31\r
+\r
+NUM40: PUSH    PP,FR           ;STACK VALUES\r
+       HRRI    RX,^D10\r
+       PUSH    PP,AC2\r
+       PUSH    PP,PPTEMP\r
+       CAIN    C,45            ;"E"?\r
+       JRST    [PUSHJ PP,PEEK  ;GET NEXT CHAR\r
+               PUSH PP,C       ;SAVE NEXT CHAR\r
+               PUSHJ PP,CELL   ;YES, GET EXPONENT\r
+               POP PP,C        ;GET FIRST CHAR. AFTER E\r
+               CAIN V,4        ;MUST HAVE NUMERICAL STATUS\r
+               JRST    .+2     ;SKIP RETURN\r
+               CAIN C,"<"      ;ALLOW <EXP>\r
+               JRST    .+2     ;SKIP RETURN\r
+               SKIPN   AC0     ;ERROR IF NON-ZERO EXPRESSION\r
+               TROA ER,ERRQ    ;ALLOW E+,E-\r
+               SETOM   RC      ;FORCE NUMERICAL ERROR\r
+               JRST    .+2]    ;SKIP RETURN\r
+       MOVEI   AC0,0           ;NO, ZERO EXPONENT\r
+       POP     PP,PPTEMP\r
+       POP     PP,SX\r
+       POP     PP,FR\r
+       HRRZ    V,PP\r
+       MOVE    PP,PPTEMP\r
+       JUMPN   RC,NUMER1       ;EXPONENT MUST BE ABSOLUTE\r
+       ADD     SX,AC0\r
+       HRRZ    ARG,PP\r
+       ADD     SX,ARG\r
+       SETZB   AC0,AC2\r
+       TLNE    FR,DCFSW\r
+       JRST    NUM60\r
+       JOV     NUM50           ;CLEAR OVERFLOW FLAG\r
+\f\r
+NUM50: JSP     SDEL,NUMUP      ;FLOATING POINT\r
+       JRST    NUM52           ;END OF WHOLE NUMBERS\r
+       FMPR    AC0,[10.0]      ;MULTIPLY BY 10\r
+       TLO     AC1,233000      ;CONVERT TO FLOATING POINT\r
+       FADR    AC0,AC1         ;ADD IT IN\r
+       JRST    NUM50\r
+\r
+NUM52: JSP     SDEL,NUMDN      ;PROCESS FRACTION\r
+       FADR    AC0,AC2\r
+       JOV     NUMER1          ;TEST FOR OVERFLOW\r
+       JRST    GETDE1\r
+\r
+       TLO     AC1,233000\r
+       TRNE    AC1,-1\r
+       FADR    AC2,AC1         ;ACCUMULATE FRACTION\r
+       FDVR    AC2,[10.0]\r
+       JRST    NUM52\r
+\r
+NUM60: JSP     SDEL,NUMUP\r
+       JRST    NUM62\r
+       IMULI   AC0,^D10\r
+       ADD     AC0,AC1\r
+       JRST    NUM60\r
+\r
+NUM62: LSHC    AC1,-^D36\r
+       JSP     SDEL,NUMDN\r
+       LSHC    AC1,^D37\r
+       PUSHJ   PP,BYPAS2\r
+       JRST    GETDE3\r
+\r
+       DIVI    AC1,^D10\r
+       JRST    NUM62\r
+\r
+NUMUP: MOVEI   AC1,0\r
+       CAML    ARG,SX\r
+       JRST    0(SDEL)\r
+       CAMGE   ARG,V\r
+       MOVE    AC1,1(ARG)\r
+       AOJA    ARG,1(SDEL)\r
+\r
+NUMDN: MOVEI   AC1,0\r
+       CAMG    V,SX\r
+       JRST    0(SDEL)\r
+       CAMLE   V,ARG\r
+       MOVE    AC1,0(V)\r
+       SOJA    V,3(SDEL)\r
+\fSUBTTL        GETSYM\r
+GETSYM:        MOVEI   AC0,0           ;CLEAR AC0\r
+       MOVSI   AC1,(POINT 6,AC0)       ;PUT POINTER IN AC1\r
+       PUSHJ   PP,BYPASS       ;SKIP LEADING BLANKS\r
+       TLNN    CS,2            ;ALPHABETIC?\r
+       JRST    GETSY1          ;NO, ERROR\r
+       CAIE    C,16            ;PERIOD?\r
+       JRST    GETSY2          ;NO, A VALID SYMBOL\r
+       IDPB    C,AC1           ;STORE THE CHARACTER\r
+       PUSHJ   PP,GETCHR       ;YES, TEST NEXT CHARACTER\r
+       TLNN    CS,2            ;ALPHABETIC?\r
+GETSY1:        TROA    ER,ERRA\r
+GETSY2:        AOS     0(PP)           ;YES, SET SKIP EXIT\r
+GETSY3:        TLNN    CS,6            ;ALPHA-NUMERIC?\r
+       JRST    BYPAS2          ;NO, GET DELIMITER\r
+       TLNE    AC1,770000      ;YES, HAVE WE STORED SIX?\r
+       IDPB    C,AC1           ;NO, STORE IT\r
+       PUSHJ   PP,GETCHR\r
+       JRST    GETSY3\r
+\r
+\fSUBTTL        EXPRESSION EVALUATOR\r
+CV==   AC0                     ;CURRENT VALUE\r
+PV==   AC1                     ;PREVIOUS VALUE\r
+RC==   RC                      ;CURRENT RELOCATABILITY\r
+PR==   AC2                     ;PREVIOUS RELOCATABILITY\r
+CS=    CS                      ;CURRENT STATUS\r
+PS==   SDEL                    ;PREVIOUS STATUS\r
+\r
+EVALHA:        TLO     FR,TMPSW\r
+EVALCM:        PUSHJ   PP,EVALEX       ;EVALUATE FIRST EXPRESSION\r
+       PUSH    PP,[0]          ;MARK PDL\r
+       JUMPCM  EVALC3          ;JUMP IF COMMA\r
+       TLO     IO,IORPTC       ;IT'S NOT,SO REPEAT\r
+       JRST    OP              ;PROCESS IN OP\r
+EVALC3:\r
+IFN FORMSW,<PUSH PP,INFORM     ;PUT FORM WORD ON STACK>\r
+       PUSH    PP,[0]          ;STORE ZERO'S ON PDL\r
+       PUSH    PP,[0]          ;.......\r
+       MOVSI   AC2,(POINT 4,(PP),12)\r
+       JRST    OP1B            ;PROCESS IN OP\r
+\r
+EVALEX:        TLO     IO,FLDSW\r
+       PUSH    PP,[XWD TNODE,0]        ;MARK THE LIST 200000,,0\r
+       TLZN    FR,TMPSW\r
+EVATOM:        PUSHJ   PP,ATOM         ;GET THE NEXT ATOM\r
+       JUMPE   AC0,EVGETD      ;TEST FOR NULL/ZERO\r
+       TLOE    IO,NUMSW        ;SET NUMERIC, WAS IT PREVIOUSLY?\r
+       JRST    EVGETD+1        ;YES, TREAT ACCORDINGLY\r
+       PUSHJ   PP,SEARCH       ;SEARCH FOR MACRO OR SYMBOL\r
+       JRST    EVOP            ;NOT FOUND, TRY FOR OP-CODE\r
+       JUMPL   ARG,.+2         ;SKIP IF OPERAND\r
+       PUSHJ   PP,SSRCH1       ;OPERATOR, TRY FOR SYMBOL (OPERAND)\r
+       PUSHJ   PP,QSRCH        ;PERFORM CROSS-REFERENCE\r
+       JUMPG   ARG,EVMAC       ;BRANCH IF OPERATOR\r
+       MOVE    AC0,V           ;SYMBOL, SET VALUE\r
+       JRST    EVTSTS          ;TEST STATUS\r
+\r
+EVMAC: TLNE    FR,NEGSW        ;UNARY MINUS?\r
+       JRST    EVERRZ          ;YES, INVALID BEFORE OPERATOR\r
+       LDB     SDEL,[POINT 3,ARG,5]    ;GET MACF/OPDF/SYNF\r
+       SOJL    SDEL,EVERRZ     ;ERROR IF NO FLAGS\r
+\r
+       JUMPE   C,.+2           ;NON-BLANK?\r
+       TLO     IO,IORPTC       ;YES, REPEAT CHARACTER\r
+       SOJE    SDEL,CALLM      ;MACRO IF 2\r
+       JUMPG   SDEL,EVOPS      ;SYNONYM IF 4\r
+\r
+       MOVE    AC0,V           ;OPDEF\r
+       MOVEI   V,OP            ;SET TRANSFER VECTOR\r
+       JRST    EVOPD\r
+\fEVOP: TLNE    FR,NEGSW        ;OPCODE, UNARY MINUS?\r
+       JRST    EVERRZ          ;YES, ERROR\r
+\r
+       PUSHJ   PP,OPTSCH       ;SEARCH SYMBOL TABLE\r
+       JRST    EVOPX           ;NOT FOUND\r
+EVOPS: TRZ     V,LITF          ;CLEAR LIT INVALID FLAG\r
+       TRZE    V,ADDF          ;SYNONYM\r
+       JRST    EVOPX           ;PSEUDO-OP THAT GENERATES NO DATA JUMPS\r
+       HLLZ    AC0,V\r
+EVOPD: JUMPE   C,.+2           ;OPDEF, NON-BLANK DELIMITER?\r
+       TLO     IO,IORPTC       ;YES, REPEAT CHARACTER\r
+       JSP     AC2,SVSTOW\r
+       PUSHJ   PP,0(V)\r
+       PUSHJ   PP,DSTOW\r
+       JSP     AC2,GTSTOW\r
+       TRNE    RC,-2\r
+       HRRM    RC,EXTPNT\r
+       TLNE RC,-2\r
+       HLLM RC,EXTPNT\r
+       JRST    EVNUM\r
+\r
+EVOPX: MOVSI   ARG,SYMF!UNDF\r
+       PUSHJ   PP,INSERZ\r
+EVERRZ:        SETZB   AC0,RC          ;CLEAR CODE AND RELOCATION\r
+EVERRU:        TRO     ER,ERRU\r
+       JRST    EVGETD\r
+\fEVTSTS:       TLNE    ARG,UNDF\r
+       JRST    [TRO    ER,ERRU ;SET UNDEF ERROR\r
+               JUMP1   EVGETD  ;TREAT AS UNDF ON PASS1\r
+               JRST    .+1]    ;TREAT AS EXTERNAL ON PASS2\r
+       TLNN    ARG,EXTF\r
+       JRST    EVTSTR\r
+       HRRZ RC,ARG     ;GET ADRES WFW\r
+       HRRZ ARG,EXTPNT ;SAVE IT WFW\r
+       HRRM RC,EXTPNT  ;WFW\r
+       TRNE ARG,-1     ;WFW\r
+       TRO     ER,ERRE\r
+       SETZB   AC0,ARG\r
+\r
+EVTSTR:        TLNE    ARG,MDFF        ;MULTIPLY DEFINED?\r
+       TRO     ER,ERRD         ;YES, FLAG IT\r
+       TLNE    FR,NEGSW        ;NEGATIVE ATOM?\r
+       PUSHJ   PP,GETDE2       ;YES, NEGATE AC0 AND RC\r
+\r
+EVGETD:        TLNE    IO,NUMSW        ;NON BLANK FIELD\r
+       TLO     FR,FSNSW        ;YES,SET FLAG\r
+       PUSHJ   PP,BYPAS2\r
+       TLNE    CS,6            ;ALPHA-NUMERIC?\r
+       TLO     IO,IORPTC       ;YES, REPEAT IT\r
+EVNUM: POP     PP,PS           ;POP THE PREVIOUS DELIMITER/TNODE\r
+       TLO     PS,4000\r
+       CAMGE   PS,CS           ;OPERATION REQUIRED?\r
+       JRST    EVPUSH          ;NO, PUT VALUES BACK ON STACK\r
+       TLNN    PS,TNODE        ;YES, HAVE WE REACHED TERMINAL NODE?\r
+       JRST    EVXCT           ;NO, EXECUTION REQUIRED\r
+       TLNN    CS,170000       ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)\r
+       POPJ    PP,             ;YES, EXIT\r
+                               ;NO,FALL INTO EVPUSH\r
+\r
+\fEVPUSH:       PUSH    PP,PS           ;STACK VALUES\r
+       PUSH    PP,CV\r
+       PUSH    PP,RC\r
+       PUSH    PP,CS\r
+       JRST    EVATOM          ;GET NEXT ATOM\r
+\r
+EVXCT: POP     PP,PR           ;POP PREVIOUS RELOCATABILITY\r
+       POP     PP,PV           ;AND PREVIOUS VALUE\r
+       LDB     PS,[POINT 3,PS,29]      ;TYPE OF OPERATION TO PS\r
+       JRST    .+1(PS)         ;PERFORM PROPER OPERATION\r
+       JRST    ASSEM1          ;0; SHOULD NEVER GET HERE ;DMN\r
+       JRST    XMUL            ;1;\r
+       JRST    XDIV            ;2;\r
+       JRST    XADD            ;3;\r
+       JRST    XSUB            ;4;\r
+       JRST    XLRW            ;5; "_"\r
+       TDOA    CV,PV           ;6; MERGE PV INTO CV\r
+       AND     CV,PV           ;7; AND PV INTO CV\r
+       JUMPN   RC,.+2          ;COMMON RELOCATION TEST\r
+EVXCT1:        JUMPE   PR,EVNUM\r
+       TRO     ER,ERRR         ;BOTH MUST BE FIXED\r
+       JRST    EVNUM           ;GO TRY AGAIN\r
+\r
+XSUB:  SUBM    PV,CV\r
+       SUBM    PR,RC\r
+       JRST    EVNUM\r
+\r
+XADD:  ADDM    PV,CV\r
+       ADDM    PR,RC\r
+       JRST    EVNUM\r
+\r
+XDIV:  IDIV    PR,CV           ;CORRECT RELOCATABILITY\r
+       IDIVM   PV,CV\r
+XDIV1: EXCH    PR,RC           ;TAKE RELOCATION OF NUMERATOR\r
+       JRST    EVXCT1\r
+\r
+XMUL:  JUMPE   PR,XMUL1        ;AT LEAST ONE OPERAND\r
+       JUMPE   RC,XMUL1        ;MUST BE FIXED\r
+       TRO     ER,ERRR\r
+XMUL1: IORM    PR,RC           ;GET RELOCATION TO RC\r
+       CAMGE   PV,CV           ;FIND THE GREATER\r
+       EXCH    PV,CV           ;FIX IN CASE CV=0,OR 1\r
+       IMULM   PV,RC\r
+       IMULM   PV,CV\r
+       JRST    EVNUM\r
+XLRW:  EXCH    PV,CV\r
+       LSH     CV,0(PV)\r
+       LSH     PR,0(PV)\r
+       JRST    XDIV1\r
+\f      SUBTTL  LITERAL STORAGE HANDLER\r
+       \r
+STOLER:\r
+IFE FORMSW,<   SETZB   AC0,RC  ;ERROR, NO CODE STORED\r
+       PUSHJ   PP,STOW         ;STOW ZERO>\r
+IFN FORMSW,<   MOVEI   AC0,0\r
+       PUSHJ   PP,STOWZ1>\r
+       TRO     ER,ERRL         ;AND FLAG THE ERROR\r
+\r
+STOLIT:        MOVE    SDEL,STPX\r
+       SUB     SDEL,STPY       ;COMPUTE NUMBER OF WORDS\r
+       JUMPE   SDEL,STOLER     ;ERROR IF NONE STORED\r
+       TRNN    ER,ERRORS       ;ANY ERRORS?\r
+       JRST    STOL06          ;NO\r
+       JUMP2   STOL22          ;YES, NO SEARCH.  BRANCH IF PASS2\r
+       ADDM    SDEL,LITCNT     ;PASS ONE, UPDATE COUNT\r
+       JRST    STOWI           ;INITIALIZE STOW\r
+\r
+STOL06:        MOVEI   SX,LITAB        ;PREPARE FOR SEARCH\r
+       MOVE    ARG,STPX        ;SAVE IN THE EVENT OF MULTIPLE-WORD\r
+       HRL     ARG,STPY\r
+       MOVE    AC2,LITNUM\r
+       MOVEI   SDEL,0\r
+STOL08:        PUSHJ   PP,DSTOW        ;GET VALUE WFW\r
+\r
+STOL10:        SOJL    AC2,STOL24      ;TEST FOR END\r
+       MOVE    SX,0(SX)        ;NO, GET NEXT STORAGE CELL\r
+       MOVE    V,-1(SX)                ;GET RELOCATION BITS WFW\r
+       CAMN    AC0,-2(SX)      ;DO CODES COMPARE? WFW\r
+       CAME    RC,V            ;YES, HOW ABOUT RELOCATION?\r
+       AOJA    SDEL,STOL10     ;NO, TRY AGAIN\r
+       SKIPGE  STPX            ;YES, MULTI-WORD?\r
+       JRST    STOL26          ;NO, JUST RETURN LOCATION\r
+       MOVEM   AC2,SAVBLK+AC2  ;YES, SAVE STARTING INFO\r
+       MOVEM   SX,SAVBLK+SX\r
+\r
+STOL12:        SOJL    AC2,STOL23      ;TEST FOR END\r
+       PUSHJ   PP,DSTOW        ;GET NEXT WORD WFW\r
+       MOVE    SX,0(SX)        ;UPDATE POINTER\r
+       MOVE    V,-1(SX)                ;GET RELOCATION WFW\r
+       CAMN    AC0,-2(SX)      ;COMPARE VALUE WFW\r
+       CAME    RC,V            ;AND RELOCATION\r
+       JRST    STOL14          ;NO MATCH, TRY AGAIN\r
+       SKIPL   STPX            ;MATCH, HAVE WE FINISHED SEARCH?\r
+       JRST    STOL12          ;NO, TRY NEXT WORD\r
+       JRST    STOL26          ;YES, RETURN LOCATION\r
+\r
+STOL14:        MOVE    AC2,SAVBLK+AC2  ;RESTORE STOW POINTERS\r
+       MOVE    SX,SAVBLK+SX\r
+       HRREM   ARG,STPX\r
+       HLREM   ARG,STPY\r
+       AOJA    SDEL,STOL08     ;BETTER LUCK NEXT TIME\r
+\f\r
+STOL22:        MOVE    SDEL,LITNUM\r
+STOL23:        PUSHJ   PP,DSTOW        ;DSTOW AND CONVERT\r
+STOL24:        MOVE    SX,LITABX       ;GET CURRENT STORAGE\r
+       PUSHJ   PP,GETTOP       ;GET NEXT CELL\r
+       MOVEM   AC0,-2(SX)      ;STORE CODE WFW\r
+       MOVEM   RC,-1(SX)       ;WFW\r
+IFN FORMSW,<\r
+       MOVE    AC0,FORM\r
+       MOVEM   AC0,-3(SX)>\r
+       MOVEM   SX,LITABX       ;SET POINTER TO CURRENT CELL\r
+       AOS     LITNUM          ;INCREMENT NUMBER STORED\r
+       AOS     LITCNT          ;INCREMENT NUMBER RESERVED\r
+       SKIPL   STPX            ;ANY MORE CODE?\r
+       JRST    STOL23          ;YES\r
+STOL26:        JUMP1   POPOUT          ;EXIT IF PASS ONE\r
+       MOVE    SX,LITHDX       ;GET HEADER BLOCK\r
+       HLRZ    RC,-1(SX)       ;GET BLOCK RELOCATION\r
+       HRRZ    AC0,-1(SX)\r
+       ADDI    AC0,0(SDEL)     ;COMPUTE ACTUAL LOCATION\r
+       POPJ    PP,             ;EXIT\r
+\r
+\fSUBTTL        INPUT ROUTINES\r
+GETCHR:        PUSHJ   PP,CHARAC       ;GET ASCII CHARACTER\r
+       CAIL    C,"A"+40        ;CHECK FOR LOWER CASE\r
+       CAILE   C,"Z"+40\r
+       JRST    .+2             ;NOT LOWER CASE\r
+IFN STANSW,<\r
+       SUBI C,40\r
+       CAIN C,32\r
+       MOVEI C,136             ;^\r
+       CAIN C,30\r
+       MOVEI C,137             ;_\r
+       CAIN C,176\r
+       MOVEI C,134             ;}\r
+       CAIN C,140\r
+       MOVEI C,100             ;@>\r
+IFE STANSW,<\r
+       TRZA    C,100           ;CONVERT LOWER CASE TO SIXBIT>\r
+       SUBI    C,40            ;CONVERT TO SIXBIT\r
+       CAIG    C,77            ;CHAR GREATER THAN SIXBIT?\r
+       JUMPGE  C,GETCS         ;TEST FOR VALID SIXBIT\r
+       ADDI    C,40            ;BACK TO ASCII\r
+       CAIN    C,HT            ;CHECK FOR TAB\r
+       JRST    GETCS2          ;MAKE IT LOOK LIKE SPACE\r
+       CAIG    C,CR            ;GREATER THAN CR\r
+       CAIG    C,HT            ;GREATER THAN TAB\r
+       JRST    GETCS1          ;IS NOT FF,VT,LF OR CR\r
+       MOVEI   C,EOL           ;LINE OR FORM FEED OR V TAB\r
+       TLOA    IO,IORPTC       ;REPEAT CHARACTER\r
+GETCS2:        MOVEI   C,0             ;BUT TREAT AS BLANK\r
+GETCS: MOVE    CS,CSTAT(C)     ;GET STATUS BITS\r
+       POPJ    PP,             ;EXIT\r
+\r
+GETCS1:        JUMPE   C,GETCS         ;IGNORE NULS\r
+       TRC     C,100           ;MAKE CHAR. VISIBLE\r
+       MOVEI   CS,"^"\r
+       DPB     CS,LBUFP        ;PUT ^ IN OUTPUT\r
+       PUSHJ   PP,RSW2         ;ALSO MODIFIED CHAR.\r
+       TRO     ER,ERRQ         ;FLAG Q ERROR\r
+       JRST    GETCHR          ;BUT IGNORE CHAR.\r
+\f\r
+CHARAC:        TLZE    IO,IORPTC       ;REPEAT REQUESTED?\r
+       JRST    CHARAX          ;YES\r
+RSW0:  JUMPN   MRP,MREAD       ;BRANCH IF TREE POINTER SET\r
+       PUSHJ   PP,READ\r
+RSW1:  SKIPE   RPOLVL          ;ARE WE IN "REPEAT ONCE"?\r
+       JRST    REPO1           ;YES\r
+RSW2:  MOVE    CS,LIMBO        ;GET LAST CHAR.\r
+       MOVEM   C,LIMBO ;STORE THIS CHAR. FOR RPTC\r
+       CAIN    C,LF            ;LF?\r
+       CAIE    CS,CR           ;YES,LAST CHAR. A CR?\r
+       JRST    RSW3            ;NO\r
+       HRROS   LIMBO           ;YES,FLAG\r
+       POPJ    PP,             ;AND EXIT\r
+\r
+RSW3:  TLNE    IO,IOSALL       ;MACRO SUPPRESS ALL?\r
+       JUMPN   MRP,CPOPJ       ;YES,DON'T LIST IN MACRO\r
+       SOSG    CPL             ;ANY ROOM IN THE IMAGE BUFFER?\r
+       PUSHJ   PP,OUTPL        ;NO, OUTPUT THE PARTIAL LINE\r
+       IDPB    C,LBUFP         ;YES, STORE IN PRINT AREA\r
+       CAIE    C,HT            ;TAB?\r
+       POPJ    PP,             ;NO, EXIT\r
+       MOVEI   C,7\r
+       ANDCAM  C,CPL           ;MASK\r
+CHARAX:        HRRZ    C,LIMBO         ;GET LAST CHARACTER\r
+       POPJ    PP,             ;EXIT\r
+\r
+CHARL: PUSHJ   PP,CHARAC       ;GET AND TEST 7-BIT ASCII\r
+       CAIG    C,FF            ;LINE OR FORM FEED OR VT?\r
+       CAIGE   C,LF\r
+       POPJ    PP,             ;NO,EXIT\r
+       SKIPE   LITLVL          ;IN LITERAL?\r
+       JRST    OUTIML          ;YES\r
+CHARL1:        PUSHJ   PP,SAVEXS       ;SAVE REGISTERS\r
+       PUSHJ   PP,OUTLIN       ;DUMP THE LINE\r
+       JRST    RSTRXS          ;RESTORE REGISTERS AND EXIT\r
+\fSUBTTL        CHARACTER STATUS TABLE\r
+\r
+       DEFINE  GENCS   (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)\r
+<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>\r
+\r
+       ;OPLVL  PRIORITY OF BINARY OPERATORS\r
+       ;ATOM   INDEX TO JUMP TABLE AT CELL1\r
+       ;AN     TYPE OF CHARACTER\r
+       ;       1=OTHER, 2=ALPHA, 4=NUMERIC\r
+       ;SQUOZ  VALUE IN RADIX 50\r
+       ;OPTYPE INDEX TO JUMP TABLE AT EVXCT\r
+       ;SEQNO  VALUE IN SIXBIT\r
+CSTAT:\r
+       GENCS   00,00,1,00,00,00        ; ' '\r
+       GENCS   04,12,1,00,06,01        ; '!'\r
+       GENCS   00,07,1,00,00,02        ; '"'\r
+       GENCS   00,12,1,00,00,03        ; '#'\r
+       GENCS   00,01,2,46,00,04        ; '$'\r
+       GENCS   00,01,2,47,00,05        ; '%'\r
+       GENCS   04,12,1,00,07,06        ; '&'\r
+       GENCS   00,07,1,00,00,07        ; '''\r
+\r
+       GENCS   00,01,1,00,00,10        ; '('\r
+       GENCS   00,01,1,00,00,11        ; ')'\r
+       GENCS   02,12,1,00,01,12        ; '*'\r
+       GENCS   01,00,1,00,03,13        ; '+'\r
+       GENCS   40,01,1,00,00,14        ; ','\r
+       GENCS   01,02,1,00,04,15        ; '-'\r
+       GENCS   00,11,2,45,00,16        ; '.'\r
+       GENCS   02,12,1,00,02,17        ; '/'\r
+\r
+       GENCS   00,04,4,01,00,20        ; '0'\r
+       GENCS   00,04,4,02,00,21        ; '1'\r
+       GENCS   00,04,4,03,00,22        ; '2'\r
+       GENCS   00,04,4,04,00,23        ; '3'\r
+       GENCS   00,04,4,05,00,24        ; '4'\r
+       GENCS   00,04,4,06,00,25        ; '5'\r
+       GENCS   00,04,4,07,00,26        ; '6'\r
+       GENCS   00,04,4,10,00,27        ; '7'\r
+\r
+       GENCS   00,04,4,11,00,30        ; '8'\r
+       GENCS   00,04,4,12,00,31        ; '9'\r
+       GENCS   00,12,1,00,00,32        ; ':'\r
+       GENCS   00,01,1,00,00,33        ; ';'\r
+       GENCS   00,05,1,00,00,34        ; '<'\r
+       GENCS   00,12,1,00,00,35        ; '='\r
+       GENCS   00,01,1,00,00,36        ; '>'\r
+       GENCS   00,12,1,00,00,37        ; '?'\r
+\f      GENCS   00,03,1,00,00,40        ; '@'\r
+       GENCS   00,01,2,13,00,41        ; 'A'\r
+       GENCS   00,01,2,14,00,42        ; 'B'\r
+       GENCS   00,01,2,15,00,43        ; 'C'\r
+       GENCS   00,01,2,16,00,44        ; 'D'\r
+       GENCS   00,01,2,17,00,45        ; 'E'\r
+       GENCS   00,01,2,20,00,46        ; 'F'\r
+       GENCS   00,01,2,21,00,47        ; 'G'\r
+\r
+       GENCS   00,01,2,22,00,50        ; 'H'\r
+       GENCS   00,01,2,23,00,51        ; 'I'\r
+       GENCS   00,01,2,24,00,52        ; 'J'\r
+       GENCS   00,01,2,25,00,53        ; 'K'\r
+       GENCS   00,01,2,26,00,54        ; 'L'\r
+       GENCS   00,01,2,27,00,55        ; 'M'\r
+       GENCS   00,01,2,30,00,56        ; 'N'\r
+       GENCS   00,01,2,31,00,57        ; 'O'\r
+\r
+       GENCS   00,01,2,32,00,60        ; 'P'\r
+       GENCS   00,01,2,33,00,61        ; 'Q'\r
+       GENCS   00,01,2,34,00,62        ; 'R'\r
+       GENCS   00,01,2,35,00,63        ; 'S'\r
+       GENCS   00,01,2,36,00,64        ; 'T'\r
+       GENCS   00,01,2,37,00,65        ; 'U'\r
+       GENCS   00,01,2,40,00,66        ; 'V'\r
+       GENCS   00,01,2,41,00,67        ; 'W'\r
+\r
+       GENCS   00,01,2,42,00,70        ; 'X'\r
+       GENCS   00,01,2,43,00,71        ; 'Y'\r
+       GENCS   00,01,2,44,00,72        ; 'Z'\r
+       GENCS   00,06,1,00,00,73        ; '['\r
+       GENCS   00,12,1,00,00,74        ; '\'\r
+       GENCS   00,01,1,00,00,75        ; ']'\r
+       GENCS   00,10,1,00,00,76        ; '^'\r
+       GENCS   10,12,1,00,05,77        ; '_'\r
+\fSUBTTL        LISTING ROUTINES\r
+\r
+OUTLIN:        TRNN    ER,ERRORS-ERRQ  ;ANY ERRORS?\r
+       TLNE    FR,ERRQSW       ;NO, IGNORE Q ERRORS?\r
+       TRZ     ER,ERRQ         ;YES, YES, ZERO THE Q ERROR\r
+       HRLZ    AC0,ER          ;PUT ERROR FLAGS IN AC0 LEFT\r
+       TDZ     ER,TYPERR\r
+       JUMP1   OUTL30          ;BRANCH IF PASS ONE\r
+       JUMPN   AC0,OUTL02      ;JUMP IF ANY ERRORS TO FORCE PRINTING\r
+       SKIPL   STPX            ;SKIP IF NO CODE, OTHERWISE\r
+       JRST    OUTL01          ;NO\r
+       TLNN    IO,IOSALL       ;YES,SUPPRESS ALL?\r
+       JRST    OUTL03          ;NO\r
+       JUMPN   MRP,CPOPJ       ;YES,EXIT IF IN MACRO\r
+       LDB     C,[XWD 350700,LBUF]\r
+       CAIE    C,15            ;FIRST CHAR CR?\r
+OUTL01:        TLZ     IO,IOMAC        ;FORCE MACRO PRINTING\r
+OUTL03:        TLNN    IO,IOMSTR!IOPROG!IOMAC\r
+OUTL02:        IOR     ER,OUTSW        ;FORCE IT.\r
+       IDPB    AC0,LBUFP       ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE\r
+       TLNN    FR,CREFSW       ;CREF?\r
+       PUSHJ   PP,CLSCRF       ;YES, WRITE END OF CREF DATA (177,003)\r
+       JUMPE   AC0,OUTL20      ;BRANCH IF NO ERRORS\r
+       TLZE    AC0,ERRM        ;M ERROR?\r
+       TLO     AC0,ERRP        ;M ERROR SET - SET P ERROR.\r
+       PUSHJ   PP,OUTLER       ;PROCESS ERRORS\r
+\r
+OUTL20:        SKIPN   RC,ASGBLK\r
+       SKIPE   CS,LOCBLK       ;\r
+       SKIPL   STPX            ;ANY BINARY?\r
+       JRST    OUTL23          ;YES, JUMP\r
+       JUMPE   RC,OUTL22       ;SEQUENCE BREAK AND NO BINARY JUMPS\r
+       ILDB    C,TABP          ;ASSIGNMENT FALLS THROUGH\r
+       PUSHJ   PP,OUTL         ;OUTPUT A TAB.\r
+       ILDB    C,TABP          ;OUTPUT 2ND TAB, LOCATION FIELD\r
+       PUSHJ   PP,OUTC         ;NEXT IS BINARY LISTING FIELD\r
+       HLLO    CS,LOCBLK       ;LEFT HALF OF A 36BIT VALUE\r
+       JUMPL   RC,.+2          ;SKIP IF LEFT HALF IS NOT RELOC\r
+       TRZA    CS,1            ;IT IS, SET THE FLAG\r
+       TLNE    CS,-1           ;SKIP IF ITS A 18BIT VALUE, OTHERWISE\r
+       PUSHJ PP,ONC1           ;PRINT LH OF A 36 BIT VALUE IN CS\r
+       HRLO    CS,LOCBLK       ;PICK UP THE RIGHT HALF (18BIT VALUE)\r
+       TRZ     CS,0(RC)        ;\r
+       PUSHJ   PP,ONC          ;PRINT IT\r
+       JRST    OUTL23          ;SKIP SINGLE QUOTE TEST\r
+\fOUTL22:       PUSHJ   PP,ONC          ;TAB TO RH AND PRINT IT\r
+       MOVEI   C,"'"\r
+       SKIPE   MODA\r
+       PUSHJ   PP,OUTC\r
+OUTL23:        SKIPL   STPX            ;ANY BINARY?\r
+       PUSHJ   PP,BOUT         ;YES, DUMP IT\r
+       MOVE    CS,@OUTLI2      ;[POINT 7,LBUF]\r
+OUTL24:        ILDB    C,CS\r
+       JUMPE   C,OUTL25\r
+       CAIG    C," "\r
+       JRST    OUTL24\r
+       MOVE    CS,TABP\r
+       PUSHJ   PP,OUTASC       ;OUTPUT TABS\r
+OUTL25:        MOVEI   CS,LBUF\r
+       PUSHJ   PP,OUTAS0       ;DUMP THE LINE\r
+       TLNE    IO,IOSALL       ;SUPPRESSING ALL\r
+       JUMPN   MRP,OUTL27      ;YES,EXTRA CR IF IN MACRO\r
+OUTL26:        SKIPGE  STPX            ;ANY BINARY?\r
+       JRST    OUTLI           ;NO, CLEAN UP AND EXIT\r
+       PUSHJ   PP,OUTLI2       ;YES, INITIALIZE FOR NEXT LINE\r
+       PUSHJ   PP,BOUT         ;YES, DUMP IT\r
+OUTL27:        PUSHJ   PP,OUTCR        ;OUTPUT CARRIAGE RETURN\r
+       JRST    OUTL26          ;TEST FOR MORE BINARY\r
+\r
+OUTPL: SKIPN   LITLVL          ;IF IN LITERAL\r
+       SKIPL   STPX            ;OR CODE GENERATED\r
+       JRST    OUTIM           ;JUST OUTPUT THE IMAGE\r
+       SKIPN   ASGBLK          ;SKIP IF AN ASSIGNMENT\r
+       JRST    OUTIM           ;OTHERWISE OUTPUT IMAGE\r
+       PUSH    PP,C            ;SAVE CHAR.\r
+       MOVEI   C,CR\r
+       IDPB    C,LBUFP\r
+       MOVEI   C,LF\r
+       IDPB    C,LBUFP         ;FINISH WITH CRLF\r
+       PUSHJ   PP,OUTLIN       ;OUTPUT PARTIAL LINE\r
+       POP     PP,C            ;RESTORE CHAR.\r
+       JRST    OUTLI2          ;INITIALISE REST OF LINE\r
+\fOUTL30:       AOS     CS,STPX         ;PASS ONE\r
+       ADDM    CS,LOCO         ;INCREMENT OUTPUT LOCATION\r
+       PUSHJ   PP,STOWI        ;INITIALIZE STOW\r
+       TLZ     AC0,ERRORS-ERRM-ERRP-ERRV\r
+       JUMPN   AC0,OUTL32      ;JUMP IF ERRORS\r
+       TLNE    IO,IOSALL       ;SUPPRESSING ALL/\r
+       JUMPN   MRP,CPOPJ       ;YES,EXIT\r
+       JRST    OUTLI1          ;NO,INIT LINE\r
+\r
+OUTL32:        IDPB    AC0,LBUFP       ;ZERO TERNIMATOR\r
+       IOR     ER,OUTSW        ;LIST ERRORS\r
+       MOVEI   CS,TAG\r
+       PUSHJ   PP,OUTSIX       ;OUTPUT TAG\r
+       HRRZ    C,TAGINC\r
+       PUSHJ   PP,DNC          ;CONVERT INCREMENT TO DECIMAL\r
+       PUSHJ   PP,OUTTAB       ;OUTPUT TAB\r
+       PUSHJ   PP,OUTLER       ;OUTPUT ERROR FLAGS\r
+       PUSHJ   PP,OUTTAB\r
+       MOVEI   CS,SEQNO        ;ADDRESS OF SEQUENCE NO.\r
+       SKIPE   SEQNO           ;FILE NOT SEQUENCED\r
+       PUSHJ   PP,OUTAS0       ;OUTPUT IT\r
+       JRST    OUTL25          ;OUTPUT BASIC LINE\r
+\r
+OUTLER:        PUSH PP,ER      ;SAVE LISTING SWITCHES FOR LATER\r
+       TRNE ER,TTYSW   ;IF THIS IS ON, LISTING IS ON TTY\r
+       TRZ ER,ERRORS   ;SO SUPPRESS ON TTY\r
+       TDZ ER,OUTSW    ;BUT THIS SHOULD ONLY GO TO THE TTY\r
+       MOVE CS,INDIR   ;GET FILE NAME\r
+       CAME CS,LSTFIL  ;AND SEE IF SAME\r
+       JRST    [MOVEM CS,LSTFIL        ;SAVE AS LAST ONE\r
+               MOVEI CS,LSTFIL\r
+               PUSHJ PP,OUTSIX ;LIST NAME\r
+               MOVEI C," "\r
+               PUSHJ PP,OUTL\r
+               MOVE CS,PAGENO  ;PRINT PAGE NUMBER TOO\r
+               JRST OUTLE8]\r
+       MOVE CS,PAGENO  ;NOW CHECK PAGE NUMBER\r
+       CAME CS,LSTPGN\r
+OUTLE8:        JRST    [MOVEM CS,LSTPGN\r
+               MOVEI CS,[ASCIZ /PAGE /]\r
+               PUSHJ PP,OUTAS0\r
+               MOVE C,PAGENO\r
+               PUSHJ PP,DNC\r
+               PUSHJ PP,OUTCR  ;AND NOW FOR THE ERROR LINE\r
+               JRST .+1]\r
+       HLLM ER,(PP)    ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)\r
+       POP PP,ER\r
+       MOVE    CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]\r
+OUTLE2:        ILDB    C,CS            ;GET ERROR MNEMONIC\r
+       JUMPGE  AC0,OUTLE4      ;BRANCH IF NOT FLAGGED\r
+       PUSHJ   PP,OUTL         ;OUTPUT THE CHARACTER\r
+       AOS     ERRCNT          ;INCREMENT ERROR COUNT\r
+OUTLE4:        LSH     AC0,1           ;SHIFT NEXT FLAG INTO SIGN BIT\r
+\f      JUMPN   AC0,OUTLE2      ;TEST FOR END\r
+       POPJ    PP,             ;EXIT\r
+\fOUTIM1:       TLOA    FR,IOSCR        ;SUPPRESS CRLF AFTER LINE\r
+OUTIM: TLZ     FR,IOSCR        ;DON'T FOR PARTIAL LINE\r
+       TLNE    IO,IOSALL       ;SUPPRESSING ALL?\r
+       JUMPN   MRP,CPOPJ       ;YES ,EXIT IF IN MACRO\r
+       JUMP1   OUTLI1          ;BYPASS IF PASS ONE\r
+       PUSH    PP,ER\r
+       TDZ     ER,TYPERR\r
+       TLNN    IO,IOMSTR!IOPROG!IOMAC\r
+       IOR     ER,OUTSW\r
+       PUSH    PP,C            ;OUTPUT IMAGE\r
+       TLNN    FR,CREFSW\r
+       PUSHJ   PP,CLSCRF\r
+OUTIM2:        MOVE    CS,TABP\r
+       PUSHJ   PP,OUTASC       ;OUTPUT TABS\r
+       IDPB    C,LBUFP         ;STORE ZERO TERMINATOR\r
+       MOVEI   CS,LBUF\r
+       PUSHJ   PP,OUTAS0       ;OUTPUT THE IMAGE\r
+       TLZN    FR,IOSCR        ;CRLF SUPPRESS?\r
+       PUSHJ   PP,OUTCR        ;NO,OUTPUT\r
+       POP     PP,C\r
+       HLLM    ER,0(PP)\r
+       POP     PP,ER\r
+       JRST    OUTLI2\r
+\r
+OUTLI: TLNE    IO,IOSALL       ;SUPPRESSING ALL\r
+       JUMPN   MRP,OUTLI3      ;YES,SET FLAG IN REPEATS ALSO\r
+       TLNE    IO,IOPALL       ;MACRO EXPANSION SUPRESS REQUESTED?\r
+       SKIPN   MACLVL          ;YES, ARE WE IN MACRO?\r
+       TLZA    IO,IOMAC        ;NO, CLEAR MAC FLAG\r
+OUTLI3:        TLO     IO,IOMAC        ;YES, SET FLAG\r
+\r
+OUTLI1:        TRZ     ER,ERRORS!LPTSW!TTYSW\r
+OUTLI2:        MOVE    CS,[POINT 7,LBUF]       ;INITIALIZE BUFFERS\r
+       MOVEM   CS,LBUFP\r
+IFN FORMSW,<MOVE CS,[POINT 7,TABI]\r
+       MOVSS   HWFMT           ;PUT FLAG IN LEFT HALF\r
+       SKIPGE  HWFMT           ;BUT IF ONLY HALF-WORD FORMAT>\r
+       MOVE    CS,[POINT 7,TABI,6]\r
+       MOVEM   CS,TABP\r
+       MOVEI   CS,.CPL\r
+IFN FORMSW,<SKIPL HWFMT                ;IF MULTI-FORMAT\r
+       SUBI    CS,8            ;LINE IS ONE TAB SHORTER\r
+       MOVSS   HWFMT           ;BACK AS IT WAS>\r
+       MOVEM   CS,CPL\r
+       MOVSI   CS,(ASCII /     /)\r
+       SKIPE   SEQNO           ;HAVE WE SEQUENCE NUMBERS?\r
+       MOVEM   CS,SEQNO        ;YES, STORE TAB IN CASE OF MACRO\r
+       MOVEM   CS,SEQNO+1      ;STORE TAB AND TERMINATOR\r
+       SETZM   ASGBLK\r
+       SETZM   LOCBLK\r
+       POPJ    PP,\r
+\fOUTIML:       TLNE    IO,IOSALL       ;SUPPRESSING ALL?\r
+       JUMPN   MRP,CPOPJ       ;YES,EXIT IF IN MACRO\r
+       TRNN ER,ERRORS-ERRQ     ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS\r
+       TLNE FR,ERRQSW\r
+       TRZ ER,ERRQ\r
+       HRLZ CS,ER\r
+       JUMP1 OUTML1    ;CHECK PASS1 ERRORS\r
+       TDZ ER,TYPERR\r
+       JUMPE CS,OUTIM1\r
+       PUSH PP,[0]     ;ERRORS SHOULD BE ZEROED\r
+       PUSH PP,C\r
+       PUSH    PP,AC0  ;SAVE AC0 IN CASE CALLED FROM ASCII\r
+       MOVE    AC0,CS  ;ERROR ROUTINE WANTS FLAGS IN AC0\r
+       IOR ER,OUTSW\r
+       TLNN FR,CREFSW\r
+       PUSHJ PP,CLSCRF ;FIX CREF\r
+       TLZE AC0,ERRM\r
+       TLO AC0,ERRP\r
+       PUSHJ PP,OUTLER ;OUTPUT THEM\r
+       POP     PP,AC0\r
+       JRST OUTIM2     ;AND LINE\r
+       \r
+OUTML1:        TLZ CS,ERRORS-ERRM-ERRP-ERRV\r
+       JUMPE CS,OUTLI2 ;NONE\r
+       TRZ ER,ERRM!ERRP!ERRV\r
+       TRO ER,ERRL\r
+       PUSH PP,ER      ;SAVE\r
+       PUSH PP,C       ;SAVE THIS\r
+       PUSH    PP,AC0  ;AS ABOVE\r
+       MOVE    AC0,CS          ;...\r
+       TDZ ER,TYPERR\r
+       IOR ER,OUTSW\r
+       MOVEI CS,TAG\r
+       PUSHJ PP,OUTSIX\r
+       HRRZ C,TAGINC\r
+       PUSHJ PP,DNC\r
+       PUSHJ PP,OUTTAB\r
+       PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS\r
+       PUSHJ PP,OUTTAB\r
+       MOVEI CS,LBUF   ;PRINT REST OF LINE\r
+       PUSHJ PP,SOUT20\r
+       POP     PP,AC0\r
+       POP PP,C\r
+       POP PP,ER\r
+       JRST OUTLI2\r
+\fSUBTTL        OUTPUT ROUTINES\r
+UOUT:  PUSHJ   PP,LOOKUP       ;SET FOR TABLE SCAN\r
+       TRNN ARG,PNTF   ;WFW\r
+       TRNN    ARG,UNDF\r
+       JRST    UOUT13          ;TEST FOR UNDF!EXTF!PNTF ON PASS2\r
+       JUMP2   UOUT10\r
+       TLNN    IO,IOIOPF       ;ANY IOP'S SEEN\r
+       JRST    UOUT12          ;NO,MAKE EXTERNAL\r
+       MOVSI   CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE\r
+UOUT1: CAME    AC0,PRMTBL(CS)  ;HAVE WE A MATCH?\r
+       AOBJN   CS,UOUT2        ;NO,INCREMENT AND JUMP\r
+       MOVE    ARG,PRMTBL+1(CS);YES,GET VALUE\r
+       MOVEM   ARG,(SX)        ;UPDATE SYMBOL TABLE\r
+       POPJ    PP,             ;EXIT\r
+UOUT2: AOBJN   CS,UOUT1        ;TEST FOR END\r
+\r
+UOUT12:        PUSHJ   PP,EXTER2       ;MAKE IT EXTERNAL\r
+       MOVSI   ARG,UNDF        ;BUT PUT UNDF BACK ON\r
+       IORM    ARG,(SX)        ;SO MESSAGE WILL COME OUT\r
+       POPJ    PP,             ;GET NEXT SYMBOL\r
+\r
+UOUT13:        JUMP1   CPOPJ   ;RECYCLE ON PASS1\r
+       TRC ARG,UNDF!EXTF!PNTF  ;CHECK FOR ALL THREE ON\r
+       TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?\r
+       POPJ    PP,             ;NO, RECYCLE\r
+UOUT10:        PUSHJ PP,OUTCR\r
+       PUSHJ   PP,OUTSYM       ;OUTPUT THE SYMBOL\r
+       MOVEI   CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]\r
+       JRST    OUTSIX          ;POPJ FOR NEXT SYMBOL\r
+\r
+UOUT30:        PUSHJ   PP,ONC1         ;OUTPUT THE LOCATION\r
+       JRST    HIGHQ           ;EXIT THROUGH HIGHQ\r
+\f                              ;OUTPUT THE ENTRIES\r
+\r
+EOUT:  MOVEI   C,0             ;INITIALIZE THE COUNT\r
+       MOVE    SX,SYMBOL\r
+       MOVE    SDEL,0(SX)\r
+EOUT1: SOJL    SDEL,EOUT2      ;TEST FOR END\r
+       ADDI    SX,2\r
+       HLRZ    ARG,0(SX)\r
+       ANDCAI  ARG,SYMF!INTF!ENTF\r
+       JUMPN   ARG,EOUT1       ;IF INVALID, DON'T COUNT\r
+       AOJA    C,EOUT1         ;BUMP COUNT\r
+\r
+EOUT2: HRLI    C,4             ;BLOCK TYPE 4\r
+       PUSHJ   PP,OUTBIN\r
+       SETZB   C,ARG\r
+       PUSHJ   PP,OUTBIN\r
+       MOVE    SX,SYMBOL\r
+       MOVE    SDEL,0(SX)\r
+       MOVEI   V,^D18\r
+\r
+EOUT3: SOJL    SDEL,POPOUT\r
+       ADDI    SX,2\r
+       HLRZ    C,0(SX)\r
+       ANDCAI  C,SYMF!INTF!ENTF\r
+       JUMPN   C,EOUT3\r
+       SOJGE   V,EOUT4         ;TEST END OF BLOCK\r
+       PUSHJ   PP,OUTBIN\r
+       MOVEI   V,^D17  ;WFW\r
+EOUT4: MOVE    AC0,-1(SX)\r
+       PUSHJ   PP,SQOZE\r
+       MOVE    C,AC0\r
+       PUSHJ   PP,OUTBIN\r
+       JRST    EOUT3\r
+\f                              ;OUTPUT THE SYMBOLS\r
+\r
+SOUT:  SKIPN   IONSYM          ;SKIP IF NOSYM SEEN\r
+       TRNN    ER,LPTSW!TTYSW  ;A LISTING REQUIRED?\r
+       JRST    SOUT1           ;NO\r
+       MOVEI   [ASCIZ /SYMBOL TABLE/]\r
+       HRRM    SUBTTX          ;SET NEW SUB-TITLE\r
+       PUSHJ   PP,OUTFF        ;FORCE NEW PAGE\r
+       MOVEI   ARG,NCOLS       ;SET UP FOR NCOLS ACROSS SYMBOL TABLE\r
+       TRNE    ER,TTYSW        ;IS TTY LISTING DEVICE?\r
+       MOVEI   ARG,2           ;YES,ONLY 2 COLLUMNS\r
+       MOVEM   ARG,NCOLLS      ;STORE ANSWER\r
+       MOVEM ARG,SYMCNT\r
+       PUSHJ PP,LOUT1          ;OUTPUT THEM\r
+       MOVE ARG,SYMCNT         ;SEE IF WE ENDED EVEN\r
+       CAME ARG,NCOLLS\r
+       PUSHJ   PP,OUTCR        ;NO, NEED CR\r
+       JRST    SOUT1           ;NOW FOR BLOCK TYPE 2\r
+\r
+LOUT1: PUSHJ   PP,LLUKUP       ;SET FOR TABLE SCAN\r
+       TRNN    ARG,SYMF\r
+       TRNN    ARG,MACF!SYNF\r
+       TDZA    MRP,MRP         ;SKIP AND CLEAR MRP\r
+       POPJ    PP,             ;NO, TRY AGAIN\r
+       TRNE    ARG,INTF\r
+       MOVEI   MRP,1\r
+       TRNE    ARG,EXTF\r
+       MOVNI   MRP,1           ;MRP=-1 FOR EXTERNAL\r
+       TRNE    ARG,SYNF        ;SYNONYM?\r
+       JUMPL   MRP,POPOUT      ;YES, DON'T OUTPUT IF EXTERNAL\r
+       TRNE ARG,SUPRBT         ;IF SUPRESSED\r
+;      JUMPGE MRP,POPOUT       ;DO NOT OUTPUT UNLESS EXTERNAL\r
+       POPJ    PP,             ;DO NOT OUTPUT\r
+       AOS     (PP)            ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED\r
+       JUMPGE  MRP,LOUT10      ;BRANCH IF NOT EXTERNAL\r
+       HLRZ    RC,V            ;PUT POINTER/FLAGS IN RC\r
+       TRNE    RC,-2           ;POINTER?\r
+       MOVS    RC,0(RC)        ;YES\r
+       HLL     V,RC            ;STORE LEFT VALUE\r
+\r
+LOUT10:        PUSH PP,RC      ;SAVE FOR LATER\r
+       PUSHJ   PP,OUTSYM       ;OUTPUT THE NAME\r
+       MOVE RC,(PP)    ;GET COPY\r
+       MOVEI   AC1,0\r
+       JUMPLE  MRP,LOUT15      ;SET DEFFERRED BITS IF EXTERNAL\r
+       TLNE    RC,-2           ;CHECK FOR LEFT FIXUP\r
+       IORI    AC1,40          ;AND SET BITS\r
+       TRNE    RC,-2           ;CHECK FOR RIGHT FIXUP\r
+       IORI    AC1,20          ;AND SET BITS\r
+LOUT15:        TLNE RC,-2      ;FIX RELOC AS 0 IF EXTERNAL\r
+       HRRZS RC\r
+       TRNE RC,-2\r
+       HLLZS RC\r
+       TLZE RC,-1\r
+       TRO RC,2\r
+       HRL MRP,RC\r
+       MOVEI RC,0\r
+       TRNE    ARG,ENTF        ;ENTRY DMN\r
+       HRRI    MRP,-5\r
+       TRNE ARG,NOOUTF         ;SUPRESS OUTPUT? WFW\r
+       ADDI MRP,3              ;YES WFW\r
+       TRNE    ARG,UNDF        ;UNDEFINED IS EXTERNAL\r
+       HRRI    MRP,2           ;SO FLAG AS UXT\r
+       IOR     AC1,SOUTC(MRP)\r
+       MOVE ARG,AC1\r
+       MOVEM AC0,SVSYM         ;SAVE IT\r
+       MOVE    AC0,V           ;GET THE VALUE\r
+       HLRZ    RC,MRP          ;AND THE RELOCATION\r
+       HLLO    CS,V\r
+       TRNE    RC,2            ;LEFT HALF RELOCATABLE?\r
+       TRZA    CS,1            ;NO, FLAG AND PRINT\r
+       TLNE    CS,-1           ;IS THE LEFT HALF ZERO?\r
+       PUSHJ   PP,ONC1         ;NO, OUTPUT IT\r
+LOUT11:        PUSHJ   PP,OUTTAB\r
+LOUT30:        HRLO    CS,V\r
+       TDZ     CS,RC           ;SET RELOCATION\r
+       PUSHJ   PP,ONC1\r
+       PUSHJ   PP,OUTTAB\r
+       POP PP,RC               ;GET BACK RELOC AND CHECK EXTERNAL\r
+LOUT60:        MOVEI   CS,SOUTC(MRP)\r
+       PUSHJ   PP,OUTAS0       ;EXT/INT\r
+       SOSLE SYMCNT    ;SEE IF WE HAVE RUN OUT\r
+       JRST    OUTTAB          ;NOT YET, PRINT ONE TAB\r
+LOUT64:        MOVE CS,NCOLLS          ;YES, RESET\r
+\f      MOVEM CS,SYMCNT\r
+       JRST    OUTCR           ;CARRIAGE RETURN AND TRY FOR ANOTHER\r
+\r
+\r
+\f      SYN IFBLK,SYMBLK        ;SOMEWHERE TO STORE THE POINTERS\r
+\r
+LLUKUP:        POP     PP,LOOKX        ;INTERCEPT RETURN POP\r
+       MOVE    SX,SYMBOL\r
+       MOVE    SDEL,(SX)\r
+       ADDI    SX,2            ;SKIP COUNT OF SYMBOLS\r
+LLUKP2:        HRLI    SX,-<.LPP-1>    ;LENGTH OF PAGE\r
+       MOVE    V,ARG           ;COPY OF ARG\r
+       MOVEM   SX,SYMBLK(V)    ;STORE SYMBOL POINTER IN TABLE\r
+       ADDI    SX,2*<.LPP-2>   ;SYMBOLS PER PAGE\r
+       SOJG    V,.-2           ;FOR ALL COLUMNS\r
+       MOVE    V,SYMCNT\r
+       HRRZ    SX,SYMBLK(V)\r
+       CAMGE   SX,SYMTOP\r
+       SOJG    V,.-2\r
+       ADDI    V,1\r
+       MOVEM   V,SYMBLK\r
+       JRST    LLUKP7          ;ENTER LOOP\r
+\r
+LLUKP1:        MOVEM   SX,SYMBLK(ARG)  ;SAVE IT \r
+       MOVE    AC0,-1(SX)\r
+       PUSHJ   PP,SRCH7\r
+       HLRZS   ARG\r
+       PUSHJ   PP,@LOOKX\r
+       JRST    [MOVE   ARG,SYMCNT\r
+               MOVEM SX,SYMBLK(ARG)\r
+               JRST    .+1]\r
+LLUKP7:        SOJL    SDEL,POPOUT     ;TEST FOR END\r
+LLUKP3:        MOVE    ARG,SYMCNT      ;GET PAGE POSITION\r
+       MOVE    SX,SYMBLK(ARG)  ;GET NEXT POINTER\r
+       AOBJP   SX,LLUKP4\r
+       HRRZ    V,SX\r
+       CAMG    V,SYMTOP\r
+       AOJA    SX,LLUKP1\r
+LLUKP6:        PUSHJ   PP,LOUT64       ;RESET SYMCNT\r
+       JUMPE   SDEL,POPOUT     ;EXIT IF ALL DONE\r
+       JRST    LLUKP3\r
+\r
+LLUKP4:        AOJ     SX,\r
+       MOVEM   SX,SYMBLK(ARG)\r
+       MOVE    V,NCOLLS\r
+       SKIPGE  SYMBLK(V)       ;TEST IF ALL FINISHED\r
+       JRST    LLUKP5          ;NO\r
+       SOJG    V,.-2           ;KEEP GOING\r
+       MOVE    SX,SYMBLK\r
+       MOVE    SX,SYMBLK(SX)\r
+       HLRZ    V,SX            ;GET NUMBER ADVANCED\r
+       LSH     V,1             ;2 WORDS PER SYMBOL\r
+       SUBI    SX,2(V)         ;BACK UP ONE SYMBOL\r
+       SKIPGE  LPP             ;IF PAGE FULL\r
+       JRST    .+3             ;DON'T FINISH WITH EXTRA CR-LF\r
+       SETZM   LPP             ;ENSURE END OF PAGE\r
+       PUSHJ   PP,LOUT64\r
+       MOVE    ARG,NCOLLS\r
+       MOVEM   ARG,SYMCNT      ;JUST IN CASE\r
+       JRST    LLUKP2\r
+\r
+LLUKP5:        SOSG    SYMCNT  ;ON LAST COL?\r
+       JRST    LLUKP6\r
+       SKIPGE  LPP             ;IF PAGE FULL\r
+       JRST    LLUKP3          ;NO MORE OUTPUT \r
+REPEAT 2,<PUSHJ PP,OUTAB2>     ;NO, TAB OUT TO NEXT COLUMN\r
+       JRST    LLUKP3\r
+\fSOUT1:        PUSHJ   PP,LOOKUP       ;SET FOR TABLE SCAN\r
+       TRNN    ARG,SYMF\r
+       TRNN    ARG,MACF!SYNF\r
+       TDZA    MRP,MRP         ;SKIP AND CLEAR MRP\r
+       POPJ    PP,             ;NO, TRY AGAIN\r
+       TRNE    ARG,INTF\r
+       MOVEI   MRP,1\r
+IFN WFWSW,<TRNE ARG,VARF       ;IF THIS FLAG IS ON SHOULD GO IN LOW SEG\r
+       JRST    SOUT1W  >\r
+       TRNE    ARG,EXTF\r
+       MOVNI   MRP,1           ;MRP=-1 FOR EXTERNAL\r
+       TRNE    ARG,SYNF        ;SYNONYM?\r
+       JUMPL   MRP,POPOUT      ;YES, DON'T OUTPUT IF EXTERNAL\r
+       TRNE ARG,SUPRBT         ;IF SUPRESSED\r
+;      JUMPGE MRP,POPOUT       ;DO NOT OUTPUT UNLESS EXTERNAL\r
+       POPJ    PP,             ;DO NOT OUTPUT\r
+       JUMPGE  MRP,SOUT10      ;BRANCH IF NOT EXTERNAL\r
+       HLRZ    RC,V            ;PUT POINTER/FLAGS IN RC\r
+       TRNE    RC,-2           ;POINTER?\r
+       MOVS    RC,0(RC)        ;YES\r
+       HLL     V,RC            ;STORE LEFT VALUE\r
+\r
+SOUT10:        PUSH PP,RC      ;SAVE FOR LATER\r
+       MOVEI   AC1,0\r
+       JUMPLE  MRP,SOUT15      ;SET DEFFERRED BITS IF EXTERNAL\r
+       TLNE    RC,-2           ;CHECK FOR LEFT FIXUP\r
+       IORI    AC1,40          ;AND SET BITS\r
+       TRNE    RC,-2           ;CHECK FOR RIGHT FIXUP\r
+       IORI    AC1,20          ;AND SET BITS\r
+IFN WFWSW,<TRNE ARG,VARF       ;IF SO THEN DEFERD\r
+       IORI AC1,20>\r
+SOUT15:        TLNE RC,-2      ;FIX RELOC AS 0 IF EXTERNAL\r
+       HRRZS RC\r
+       TRNE RC,-2\r
+       HLLZS RC\r
+       TLZE RC,-1\r
+       TRO RC,2\r
+       HRL MRP,RC\r
+       MOVEI RC,0\r
+       TRNE    ARG,ENTF        ;ENTRY DMN\r
+       HRRI    MRP,-5\r
+       TRNE ARG,NOOUTF         ;SUPRESS OUTPUT? WFW\r
+       ADDI MRP,3              ;YES WFW\r
+       IOR     AC1,SOUTC(MRP)\r
+       MOVE ARG,AC1\r
+       PUSHJ   PP,NOUT2        ;SQUOZE AND DUMP THE SYMBOL\r
+       MOVEM AC0,SVSYM         ;SAVE IT\r
+       MOVE    AC0,V           ;GET THE VALUE\r
+       HLRZ    RC,MRP          ;AND THE RELOCATION\r
+       PUSHJ   PP,COUT\r
+       POP PP,RC               ;GET BACK RELOC AND CHECK EXTERNAL\r
+       TRNN RC,-2              ;IS IT?\r
+       JRST SOUT50             ;NO\r
+       MOVE AC0,1(RC)          ;GET NAME\r
+IFN WFWSW,<JUMPE AC0,[MOVSI AC0,200000 ;RIGHT DEFERED\r
+               PUSHJ PP,INVRSF ;INSERT IN SYMBOL INFORMATION\r
+               JRST SOUT50]>\r
+       MOVEI ARG,60            ;EXTERNAL REQ\r
+       PUSHJ PP,SQOZE\r
+       HLLZS RC        ;NO RELOC\r
+       PUSHJ PP,COUT   ;OUTPUT IT\r
+       MOVE AC0,SVSYM  ;GET SYMBOL NAME\r
+       TLO AC0,500000  ;SET AS ADDITIVE SYMBOL\r
+       TLZ AC0,200000  ;BUT NOT LEFT HALF ETC\r
+       PUSHJ PP,COUT\r
+SOUT50:        MOVSS RC        ;CHECK LEFT HALF\r
+       TRNN RC,-2\r
+       JRST SOUT60\r
+       MOVE AC0,1(RC)\r
+IFN WFWSW,<JUMPE AC0,[MOVSI AC0,600000 ;LEFT DEFERED\r
+               PUSHJ PP,INVRSF\r
+               JRST SOUT60]>\r
+       MOVEI ARG,60\r
+       PUSHJ PP,SQOZE\r
+       MOVEI RC,0\r
+       PUSHJ PP,COUT\r
+       MOVE AC0,SVSYM\r
+       TLO AC0,700000\r
+       PUSHJ PP,COUT\r
+SOUT60:        POPJ    PP,\r
+\r
+SOUT20:        PUSHJ PP,OUTAS0\r
+       JRST OUTCR\r
+\r
+       <ASCII /ENT/>!04        ;DMN\r
+       Z\r
+       Z\r
+       <ASCII /SEN/>!44        ;SUPRESSED ENTRY\r
+       <ASCII /EXT/>!60\r
+SOUTC: EXP     10\r
+       <ASCII /INT/>!04\r
+       <ASCII /UXT/>!60        ;UNDEFINED EXTERNAL\r
+       <ASCII /SPD/>!50\r
+       <ASCII /SIN/>!44        ;DMN\r
+\fIFN WFWSW,<\r
+INVRSF:        MOVEI ARG,3     ;GET A BLOCK\r
+       ADDB ARG,FREE\r
+       CAML ARG,SYMBOL\r
+       PUSHJ PP,XCEEDS\r
+       MOVEM AC0,(ARG) ;SAVE WHICH HALF INFO\r
+       MOVE AC0,SVSYM  ;GET SYMBOL NAME\r
+       TLZ AC0,740000  ;GET RID OF CODE BITS\r
+       MOVEM AC0,-1(ARG)       ;SAVE IT\r
+       HLRZ AC0,(RC)           ;SYMBOL TABLE FIXUP POINTER\r
+       MOVEM AC0,-2(ARG)       ;LINK IN THIS BLOCK\r
+       SUBI ARG,2      ;POINT TO START OF BLOCK\r
+       HRLM ARG,(RC)\r
+       POPJ PP,\r
+\r
+SOUT1W:        HLRZS V         ;GET THE SYMBOL TABLE POINTER\r
+       MOVEI RC,3      ;SET UP A NEW BLOCK FOR THIS SYMBOL\r
+       ADDB RC,FREE\r
+       CAML RC,SYMBOL\r
+       PUSHJ PP,XCEEDS ;CHECK ON OUT OF ROOM\r
+       PUSH PP,ARG     ;SAVE ARG AND ACO\r
+       PUSH PP,AC0\r
+       MOVEI ARG,0     ;NO CODE BITS\r
+       PUSHJ PP,SQOZE  ;CONVERT TO RAD50\r
+       MOVEM AC0,-1(RC)        ;SYMBOL NAME\r
+       POP PP,AC0\r
+       POP PP,ARG      ;RESTORE\r
+       HRRZM V,-2(RC)  ;LINK TO NEXT BLOCK\r
+       MOVSI V,200000  ;FLAG AS SYMBOL TABLE FIXUP\r
+       MOVEM V,(RC)\r
+       HRRZ V,(SX)     ;GET POINTER TO HEADER BLOCK\r
+       SUBI RC,2       ;POINT TO HEAD OF BLOCK\r
+       HRLM RC,(V)     ;PUT IN LINK TO NEW BLOCK\r
+       MOVE RC,FIXLNK  ;ADD SYMBOL TO CHAIN OF ONES TO DO\r
+       MOVEM SX,FIXLNK ;CHAIN THROUGH SYMBOL ENTRY\r
+       MOVEM RC,-1(SX) ;WHICH IS NO LONGER NEEDED\r
+       SETZB RC,V      ;PUT OUT 0 FOR SYMBOL VALUE\r
+       JRST SOUT10>\r
+\f                              ;OUTPUT THE BINARY\r
+\r
+BOUT:  HRLO    CS,LOCO         ;PICKUP THE LOCATION\r
+       PUSHJ   PP,ONC          ;OUTPUT IT TO THE LISTING FILE\r
+       MOVEI   C,"'"\r
+       SKIPE   MODO            ;IF MODE IS NOT ABSOLUTE\r
+       PUSHJ   PP,OUTC         ;PRINT A SINGLE QUOTE\r
+       PUSHJ   PP,DSTOW        ;GET THE CODE\r
+       PUSH PP,RC      ;SAVE RELOC\r
+       PUSH    PP,RC   ;AND AGAIN\r
+IFE WFWSW,<TLNE RC,-2  ;CHECK LEFT EXTERNAL\r
+       HRRZS RC        ;MAKE LEFT NON-RELOC>\r
+IFN WFWSW,<TLNE FR,RIMSW!RIM1SW!R1BSW  ;CHECK FOR SPECIAL BIN OUT\r
+       JRST  BOUT30    ;AND LET HIM DISCOVER THE HORROR\r
+       TLNN RC,-2      ;LEFT HALF EXTERNAL??\r
+       JRST BOUT11     ;NO\r
+       HLRZ AC1,RC     ;GET POINTER\r
+       SKIPE 1(AC1)    ;IS IT SPECIAL LVAR KIND (NAME IS 0)\r
+       JRST    [HRRZS RC\r
+               JRST BOUT11]    ;IGNORE FOR NOW\r
+       PUSH PP,AC0     ;SAVE WORD\r
+       HLRZS AC0       ;GET OFFSET\r
+       PUSHJ PP,INCSRC ;FIND A MATCH OR INSERT NEW BLOCK\r
+       ADDI AC1,1      ;POINT ONE FURTHER IN BLOCK\r
+       PUSHJ PP,LVLINK ;AND SET INFORMATION\r
+       POP PP,AC0\r
+       HRLM RC,AC0     ;THE LINK\r
+       HLLM RC,-1(PP)  ;AND ITS RELOC\r
+       MOVE RC,-1(PP)  ;GET RELOC BACK\r
+BOUT11:>\r
+       TRNN RC,-2      ;RIGHT EXT?\r
+       JRST BOUT30     ;NO\r
+IFN WFWSW,<HRRZ AC1,RC ;GET POINTER\r
+       SKIPE 1(AC1)\r
+       JRST    [HRRZ AC1,AC0   ;ORDINARY EXTERNAL, HANDLE\r
+               JUMPE AC1,BOUT20\r
+               HLLZS RC        ;ADD EXTERNAL\r
+               JRST BOUT30]\r
+       PUSH PP,AC0     ;SAVE WORD\r
+       HRRZS AC0       ;GET OFFSET\r
+       PUSHJ PP,INCSRC\r
+       PUSHJ PP,LVLINK\r
+       POP PP,AC0\r
+       HRRM RC,AC0\r
+       HLRM RC,-1(PP)\r
+       MOVE RC,-1(PP)>\r
+IFE WFWSW,<HRRZ AC1,AC0        ;YES\r
+       JUMPE AC1,BOUT20        ;PROCESS IF ZERO CODE THERE\r
+       HLLZS RC        ;MAKE NON-RELOC>\r
+       JRST BOUT30     ;PROCESS\r
+\r
+\fBOUT20:\r
+       HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)\r
+       HRR     AC0,0(RC)       ;NO, SET ADDRESS LINK\r
+       MOVE    AC1,LOCO        ;GET CURRENT LOCATION\r
+       HRRM    AC1,0(RC)       ;SET NEW LINK\r
+       HLRZ    AC1,0(RC)       ;GET FLAGS/POINTER\r
+       TRNN    AC1,-2          ;POINTER?\r
+       HRR     AC1,RC          ;NO, SET TO FLAGS\r
+       HLR     RC,0(AC1)       ;PUT FLAGS IN RC\r
+       HRL     AC1,MODO        ;GET CURRENT MODE\r
+       TRZE    RC,-2           ;LEFT HALF RELOCATABLE+\r
+       TLO     AC1,2           ;YES, SET FLAG\r
+       HLLM    AC1,0(AC1)      ;STORE NEW FLAGS\r
+BOUT30:        HLLO    CS,AC0\r
+       TLZE    RC,1            ;PACK RELOCATION BITS\r
+       TRO     RC,2\r
+       TRNE    RC,2            ;LEFT HALF RELOCATABLE?\r
+       TRZ     CS,1            ;YES, RESET BIT\r
+       PUSH    PP,AC0          ;NEED AN AC\r
+       HLRZ    AC0,-1(PP)      ;AC0 = LEFT RELOCATION\r
+       CAILE   AC0,1           ;EXTERNAL?\r
+       XORI    CS,EXTF!1       ;YES, SET SWITCH\r
+\fIFN FORMSW,<\r
+       OR      AC0,HWFMT\r
+       JUMPN   AC0,BOUT3H      ;EDIT IN HALF WORD FORMAT IF NOT 0\r
+       MOVE    AC0,FORM        ;GET FORM WORD\r
+       MOVEI   C,0             ;ZERO FIELD SIZE\r
+BOUT3A:        JFFO    AC0,BOUT3B      ;AC1 = FIELD SIZE -1\r
+       JRST    BOUT3C          ;NO FIELDS LEFT, JUMP\r
+BOUT3B:        LSH     AC0,1(AC1)      ;SHIFT OFF FORM FIELD\r
+       MOVEI   AC1,6(AC1)\r
+       IDIVI   AC1,3           ;AC1 = COLUMNS USED + 1\r
+       ADDI    C,(AC1)         ;INCREMENT FIELD SIZE\r
+       CAIG    C,^D23          ;IS FIELD SIZE GTR 23?\r
+       JRST    BOUT3A          ;NO.  CONTINUE\r
+       MOVE    AC1,HWFORM      ;USE STANDARD FORM\r
+       MOVEM   AC1,FORM\r
+       MOVEI   C,^D13          ;SET FIELD SIZE TO 13\r
+BOUT3C:        MOVEM   C,FLDSIZ        ;STORE FIELD SIZE\r
+       MOVE    AC0,FORM        ;AC0 = FORM WORD\r
+       TRNN    RC,2            ;IS LEFT HALF RELOCATED?\r
+       CAMN    AC0,HWFORM      ;NO.  IS FORM HALF WORD?\r
+       JRST    BOUT3H          ;YES.  EDIT IN OLD WAY\r
+       CAMN    AC0,IOFORM      ;IS IT I/O WORD\r
+       SETOM   IOSEEN          ;YES,NEED MORE WORK\r
+       IBP     TABP\r
+       CAIL    C,^D16\r
+       IBP     TABP\r
+       ILDB    C,TABP          ;GET A TAB\r
+       PUSHJ   PP,OUTL         ;OUTPUT IT\r
+       MOVE    AC2,(PP)        ;AC2 = INFO TO BE EDITED\r
+       PUSH    PP,CS           ;SAVE CS = C+1\r
+BOUT3D:        JFFO    AC0,BOUT3E      ;AC1 = FIELD LENGTH - 1\r
+BOUT3E:        LSH     AC0,1(AC1)      ;SHIFT OFF FORM FIELD\r
+       MOVEI   C,3(AC1)\r
+       MOVEI   AC1,0\r
+       LSHC    AC1,-2(C)       ;AC1 = FIELD INFO\r
+       IDIVI   C,3             ;C = # OF OCTAL DIGITS\r
+       MOVE    C+1,AC0         ;SAVE AC0\r
+       SKIPE   IOSEEN          ;IS THIS A I/O INST.\r
+       PUSHJ   PP,BOUT3J       ;YES,SET FIELDS CORRECTLY\r
+       MOVNS   C\r
+       ROT     AC1,(C)\r
+       ROT     AC1,(C)\r
+       ROT     AC1,(C)\r
+       MOVNS   C\r
+\fBOUT3F:       MOVEI   AC0,6           ;EDIT A DIGIT\r
+       LSHC    AC0,3\r
+       EXCH    AC0,C\r
+       PUSHJ   PP,OUTC         ;OUTPUT IT\r
+       MOVE    C,AC0\r
+       SOJG    C,BOUT3F        ;IF MORE DIGITS,  GO BACK\r
+       JUMPE   C+1,BOUT3G      ;JUMP IF END OF WORD\r
+       MOVE    AC0,C+1         ;RESTORE AC0\r
+       MOVEI   C," "\r
+       PUSHJ   PP,OUTC         ;OUTPUT A SPACE\r
+       JRST    BOUT3D          ;PROCESS NEXT FIELD\r
+\r
+BOUT3G:        POP     PP,CS           ;RESTORE CS = C+1\r
+       MOVEI   C,0\r
+       TRNE    RC,1            ;RELOCATABLE?\r
+       MOVEI   C,"'"           ;YES\r
+       HRRZ    AC0,-1(PP)      ;AC0 = RIGHT RELOCATION\r
+       CAILE   AC0,1           ;EXTERNAL?\r
+       MOVEI   C,"*"           ;YES\r
+       PUSHJ   PP,ONC2         ;STORE POSSIBLE INDICATOR\r
+       POP     PP,AC0\r
+       JRST    BOUT3I          ;CONTINUE\r
+\r
+BOUT3H:        MOVEI   C,^D15          ;SET SIZE TO 15\r
+       MOVEM   C,FLDSIZ\r
+>\r
+       POP     PP,AC0          ;RESTORE\r
+       PUSHJ   PP,ONC\r
+       HRLO    CS,AC0\r
+       TDZ     CS,RC           ;SET RELOCATION\r
+       HRRZ    C,(PP)          ;C = RIGHT RELOCATION\r
+       CAILE   C,1             ;EXTERNAL\r
+       XORI    CS,EXTF!1       ;YES, SET SWITCH\r
+       PUSHJ   PP,ONC\r
+BOUT3I:        POP     PP,CS           ;GET RID OF ENTRY ON STACK\r
+       HRRZ    CS,LOCO\r
+       TLNE    FR,RIMSW!RIM1SW!R1BSW   ;RIM OUTPUT?\r
+       JRST    ROUT            ;YES, GO PROCESS\r
+\r
+       HRL     CS,MODO\r
+       CAME    CS,MODLOC       ;SEQUENCE OR RELOCATION BREAK?\r
+       PUSHJ   PP,COUTD        ;YES, DUMP THE BUFFER\r
+       SKIPL   COUTX           ;NEW BUFFER?\r
+       JRST    BOUT40          ;NO, STORE CODE AND EXIT\r
+       MOVEM   CS,MODLOC       ;YES, STORE NEW VALUES\r
+       EXCH    AC0,LOCO\r
+       EXCH    RC,MODO\r
+       PUSHJ   PP,COUT         ;STORE BLOCK LOCATION AND MODE\r
+       EXCH    RC,MODO         ;RESTORE CURRENT VALUES\r
+       EXCH    AC0,LOCO\r
+\r
+\fBOUT40:       PUSHJ PP,COUT   ;EMIT CODE\r
+       POP PP,RC       ;RETRIEVE EXTERNAL BITS\r
+       TRNN RC,-2      ;RIGHT EXTERNAL?\r
+       JRST BOUT50     ;TRY FOR LEFT\r
+       PUSHJ PP,COUTD\r
+       PUSH PP,BLKTYP  ;TERMINATE TYPE AND SAVE\r
+       MOVEI AC0,2     ;BLOCK TYPE 2\r
+       MOVEM AC0,BLKTYP\r
+       MOVE AC0,1(RC)  ;GET SYMBOL\r
+       MOVEI ARG,60    ;CODE BITS\r
+       PUSHJ PP,SQOZE  ;CONVERT TO RADIX 50\r
+       HLLZS RC        ;SYMBOL HAS NO RELOCATION\r
+       PUSHJ PP,COUT   ;EMIT\r
+       MOVE AC0,LOCO   ;GET CURRENT LOC\r
+       HRLI AC0,400000 ;ADDITIVE REQ\r
+       HRR RC,MODO     ;CURRENT MODE\r
+       PUSHJ PP,COUT   ;EMIT\r
+       MOVSS RC        ;NOW FOR LEFT\r
+       TRNN RC,-2\r
+       JRST BOUT60\r
+       JRST BOUT70\r
+BOUT50:        MOVSS RC        ;CHECK OTHER HALF\r
+       TRNN RC,-2              ;LEFT HALF EXTERNAL?\r
+       JRST BOUT80     ;NO, FALSE ALARM\r
+       PUSHJ PP,COUTD  ;CHANGE MODE\r
+       PUSH PP,BLKTYP\r
+       MOVEI AC0,2\r
+       MOVEM AC0,BLKTYP\r
+BOUT70:        MOVE AC0,1(RC)\r
+       MOVEI ARG,60\r
+       PUSHJ PP,SQOZE\r
+       HLLZS RC\r
+       PUSHJ PP,COUT\r
+       MOVE AC0,LOCO\r
+       HRLI AC0,600000 ;LEFT HALF ADD\r
+       HRR RC,MODO\r
+       PUSHJ PP,COUT   ;EMIT\r
+BOUT60:        PUSHJ PP,COUTD  ;CHANGE MODE\r
+       POP PP,BLKTYP   ;TO OLD ONE\r
+BOUT80:        AOS LOCO\r
+       AOS MODLOC\r
+       POPJ PP,\r
+\fIFN WFWSW,<\r
+INCSC1:        HLRZ RC,(AC1)   ;GET OFFSET OF NEXT BLOCK\r
+       CAMN RC,AC0     ;IS IT THE SAME??\r
+       POPJ PP,        ;YES, RETURN AC1 POINTS TO BLOCK\r
+INCSRC:        MOVE RC,AC1     ;CURRENT POINTER\r
+       HRRZ AC1,(AC1)  ;IN CASE THIS COMES UP 0\r
+       JUMPN AC1,INCSC1        ;SINCE 0 IS END OF CHAIN. ANY MORE??\r
+       MOVEI AC1,3     ;NO, GET A NEW BLOCK\r
+       ADDB AC1,FREE\r
+       CAML AC1,SYMBOL\r
+       PUSHJ PP,XCEED\r
+       SUBI AC1,2      ;WE MUST BE POINTING RIGHT WHEN WE GET OUT\r
+       HRRM AC1,(RC)   ;INSERT WHERE END OF CHAIN WAS\r
+       HRLZM AC0,(AC1) ;SET OFFSET AND END OF CHAIN\r
+       SETZM 1(AC1)\r
+       SETZM 2(AC1)    ;NO LEFT OR RIGHT HALF FIXUPS\r
+       POPJ PP,        ;DONE\r
+\r
+LVLINK:        MOVE RC,LOCO    ;GET CURRENT LOCATION\r
+       HRL RC,MODO     ;AND MODE\r
+       EXCH RC,1(AC1)  ;PUT IN AND GET PLACE TO LINK TO\r
+       POPJ PP,>\r
+\r
+IFN FORMSW,<\r
+BOUT3J:        MOVSS   IOSEEN          ;SWAP\r
+       SKIPGE  IOSEEN          ;SKIP IF NOT FIRST FIELD\r
+       JRST    [HLLZS IOSEEN   ;CLEAR RIGHT HALF\r
+               POPJ    PP,]    ;AND RETURN\r
+       MOVSS   IOSEEN          ;SWAP BACK\r
+       LSH     AC1,2           ;CORRECT  MNEMONIC AND OP CODE\r
+       CAIE    C,1             ;IS IT OP CODE?\r
+       POPJ    PP,             ;NO,JUST RETURN\r
+       MOVEI   C,2             ;TWO CHAR. WIDE NOW\r
+       SETZM   IOSEEN          ;DON'T COME AGAIN\r
+       POPJ    PP,             ;RETURN\r
+>\r
+\fNOUT: MOVE    V,[POINT 7,TBUF]        ;POINTER TO ASCII LINE\r
+       MOVSI   CS,(POINT 6,AC0)        ;POINTER TO SIXBIT AC0\r
+       SETZB   ARG,AC0\r
+NOUT1: ILDB    C,V             ;GET ASCII\r
+       CAIL C,"A"+40\r
+       CAILE C,"Z"+40\r
+       JRST    .+2\r
+       TRZA    C,100           ;LOWER CASE TO SIXBIT\r
+       SUBI    C,40            ;CONVERT TO SIXBIT\r
+       JUMPLE  C,NOUT3         ;TEST FORM NON-SIXBIT\r
+       CAILE   C,77            ;AND NOT GREATER THAN SIXBIT\r
+       JRST    NOUT3           ;...\r
+       IDPB    C,CS            ;DEPOSIT IN AC0\r
+       TLNE    CS,770000       ;TEST FOR SIX CHARACTERS\r
+       JRST    NOUT1           ;NO, GET ANOTHER\r
+NOUT3: SKIPGE  UNIVSN          ;IF A UNIVERSAL PROG\r
+       POPJ    PP,             ;RETURN TO PUT IT IN THE TABLE\r
+\r
+IFN CCLSW,<    TLNN IO,IOTLSN  ;AND IF WE HAVE NOT SEEN A TITLE\r
+       PUSHJ PP,PRNAM  ;THEN PRINT THE NAME>\r
+NOUT2: PUSHJ   PP,SQOZE        ;CONVERT TO SIXBIT\r
+       JRST    COUT            ;DUMP AND EXIT\r
+\r
+HOUT:\r
+       MOVEI   RC,1            ;RELOCATABLE\r
+IFN RENTSW,<\r
+       MOVE    AC0,HHIGH       ;GET HIGH SEG IF TWO SEGMENTS\r
+       JUMPE   AC0,.+2         ;NOT TWO SEGMENTS\r
+       PUSHJ   PP,COUT         ;OUTPUT IT >\r
+       MOVE    AC0,HIGH\r
+IFN RENTSW,<\r
+       SKIPE   HHIGH           ;ANY TWOSEG HIGH STUFF\r
+       JRST    COUT            ;YES,SO NO ABS.>\r
+       PUSHJ   PP,COUT         ;OUTPUT THE HIGHEST LOCATION\r
+       MOVE AC0,ABSHI\r
+                               ;PUT OUT ABS PORTION OF PROGRAM BREAK\r
+       SOJA    RC,COUT         ;OUTPUT A WORD OF ZERO AND EXIT\r
+\r
+\fIFN RENTSW,<\r
+HSOUT: SETZM   HISNSW          ;CLEAR FOR PASS2\r
+       MOVE    AC0,SVTYP3      ;GET HISEG ARG\r
+       JUMPGE  AC0,.+4         ;JUMP IF ONLY HISEG\r
+       HRL     AC0,HIGH1       ;GET BREAK FROM PASS 1\r
+       JUMPL   AC0,.+2         ;OK IF GREATER THAN 400000\r
+       HRLS    AC0             ;SIGNAL TWO SEGMENT TO LOADER\r
+       MOVEI   RC,1            ;ASSUME RELOCATABLE\r
+       JRST    COUT            ;OUTPUT THE WORD>\r
+\r
+VOUT:  SKIPN   RC,VECREL       ;IS VECTOR ABSOLUTE ZERO?\r
+       SKIPE   VECTOR          ;ALSO CHECK RELOCATION\r
+       JRST    .+2\r
+       POPJ    PP,             ;YES, EXIT\r
+       MOVE    AC0,VECTOR      ;AC0 SHOULD BE FLAGS\r
+\r
+COUT:  AOS     C,COUTX         ;INCREMENT INDEX\r
+       MOVEM   AC0,COUTDB(C)   ;STORE CODE\r
+       IDPB    RC,COUTP        ;STORE RELOCATION BITS\r
+       CAIE    C,^D17          ;IS THE BUFFER FULL?\r
+       POPJ    PP,             ;NO, EXIT\r
+\r
+COUTD: AOSG    C,COUTX         ;DUMP THE BUFFER\r
+       JRST    COUTI           ;BUFFER WAS EMPTY\r
+       HRL     C,BLKTYP        ;SET BLOCK TYPE\r
+       PUSHJ   PP,OUTBIN       ;OUTPUT COUNT AND TYPE\r
+       SETOB   C,COUTY         ;INITIALIZE INDEX\r
+\r
+COUTD2:        MOVE    C,COUTDB(C)     ;GET RELOCATION BITS/CODE\r
+       PUSHJ   PP,OUTBIN       ;DUMP IT\r
+       AOS     C,COUTY         ;INCREMENT INDEX\r
+       CAMGE   C,COUTX         ;TEST FOR END\r
+       JRST    COUTD2          ;NO, GET NEXT WORD\r
+\r
+COUTI: SETOM   COUTX           ;INITIALIZE BUFFER INDEX\r
+       SETZM   COUTRB          ;ZERO RELOCATION BITS\r
+       MOVE    C,[POINT 2,COUTRB]\r
+       MOVEM   C,COUTP         ;INITIALIZE BIT POINTER\r
+       POPJ    PP,             ;EXIT\r
+\fSTOWZ1:\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE STANDARD FORM>\r
+STOWZ: MOVEI   RC,0\r
+STOW:\r
+IFN FORMSW,<   MOVEM   AC1,FORM        ;STORE FORM WORD>\r
+       JUMP1   STOW20          ;SKIP TEST IF PASS ONE\r
+       TRNE    RC,-2           ;RIGHT HALF ZERO OR 1?\r
+       PUSHJ   PP,STOWT        ;NO, HANDLE EXTERNAL\r
+       TLNN    RC,-2           ;LEFT HALF ZERO OR 1? WFW\r
+       JRST    STOW10          ;YES, SKIP TEST\r
+       MOVSS   RC              ;SWAP HALVES\r
+       PUSHJ   PP,STOWT1       ;HANDLE EXTERNAL WFW\r
+       MOVSS   RC              ;RESTORE VALUES\r
+\r
+STOW10:        SKIPE   EXTPNT          ;ANY EXTERNALS REMAINING?\r
+       TRO     ER,ERRE         ;YES, SET EXTERNAL ERROR FLAG\r
+\r
+STOW20:        AOS     AC1,STPX        ;INCREMENT POINTER\r
+       MOVEM   AC0,STCODE(AC1) ;STOW CODE\r
+       MOVEM   RC,STOWRC(AC1)  ;STOW RELOCATION BITS\r
+IFN FORMSW,<\r
+       PUSH    PP,FORM\r
+       POP     PP,STFORM(AC1)  ;STORE FORM WORD\r
+>\r
+       SKIPN   LITLVL          ;ARE WE IN LITERAL?\r
+       AOS     LOCA            ;NO, INCREMENT ASSEMBLY LOCATION\r
+       CAIGE   AC1,.STP-1      ;OVERFLOW?\r
+       POPJ    PP,             ;NO, EXIT\r
+\r
+       SKIPE   LITLVL          ;ARE WE IN A LITERAL?\r
+       TROA    ER,ERRL         ;YES, FLAG ERROR BUT DON'T DUMP\r
+       JRST    CHARL1          ;NO, SAVE REGISTERS AND DUMP THE BUFFER\r
+       JRST    STOWI           ;INITIALIZE BUFFER\r
+\r
+DSTOW: AOS     AC1,STPY        ;INCREMENT POINTER\r
+       MOVE    AC0,STCODE(AC1) ;FETCH CODE\r
+       MOVE    RC,STOWRC(AC1)  ;FETCH RELOCATION BITS\r
+IFN FORMSW,<\r
+       PUSH    PP,STFORM(AC1)\r
+       POP     PP,FORM         ;GET FORM WORD\r
+>\r
+       CAMGE   AC1,STPX        ;IS THIS THE END?\r
+       POPJ    PP,             ;NO, EXIT\r
+\r
+STOWI: SETOM   STPX            ;INITIALIZE FOR INPUT\r
+       SETOM   STPY            ;INITIALIZE FOR OUTPUT\r
+       SETZM   EXTPNT\r
+       POPJ    PP,             ;EXIT\r
+\fSVSTOW:       AOS     LITLVL          ;NESTED LITERALS\r
+       PUSH    PP,STPX         ;MAKE ROOM FOR ANOTHER\r
+       PUSH    PP,STPY\r
+       MOVE    AC1,STPX\r
+       MOVEM   AC1,STPY\r
+       JRST    0(AC2)\r
+\r
+GTSTOW:        POP     PP,STPY         ;BACK UP A LEVEL\r
+       POP     PP,STPX\r
+       SOS     LITLVL\r
+       JRST    0(AC2)\r
+\r
+       ;EXTERNAL RIGHT\r
+STOWT: HRRZ    AC1,EXTPNT      ;GET RIGHT POINTER\r
+       CAIE    AC1,(RC)        ;DOES IT MATCH \r
+       PUSHJ   PP,QEXT         ;EXTERNAL OR RELOCATION ERROR\r
+       HLLZS   EXTPNT\r
+       POPJ    PP,             ;EXIT\r
+\r
+       ;EXTERNAL LEFT\r
+STOWT1:        HLRZ    AC1,EXTPNT      ;GET LEFT HALF\r
+       CAIE    AC1,(RC)        ;SEE ABOVE\r
+       PUSHJ   PP,QEXT\r
+       HRRZS   EXTPNT\r
+       POPJ    PP,             ;EXIT\r
+\fONC:  ILDB    C,TABP          ;ENTRY TO ADVANCE TAB POINTER\r
+       PUSHJ   PP,OUTL         ;OUTPUT A TAB\r
+                               ;OUTPUT 6 OCT NUMBERS FROM CS LEFT\r
+ONC1:  MOVEI   C,6             ;CONVERT TO ASCII\r
+       LSHC    C,3             ;SHIFT IN OCTAL\r
+       PUSHJ   PP,OUTL         ;OUTPUT ASCII FROM C\r
+       TRNE    CS,-1           ;ARE WE THROUGH?\r
+       JRST    ONC1            ;NO, GET ANOTHER\r
+       MOVEI   C,0             ;CLEAR C\r
+       TLNN    CS,1            ;RELOCATABLE?\r
+       MOVEI   C,"'"           ;YES\r
+       TLNN    CS,EXTF         ;OR EXTERNAL\r
+       MOVEI   C,"*"           ;YES\r
+ONC2:  JUMPN   C,OUTC          ;OUTPUT IF EXTERN OR RELOCATABLE\r
+IFN FORMSW,<   SOS     FLDSIZ  ;DECREMENT FIELD SIZE>\r
+       POPJ    PP,             ;EXIT\r
+\r
+DNC:   IDIVI   C,^D10\r
+       HRLM    CS,0(PP)\r
+       JUMPE   C,.+2\r
+       PUSHJ   PP,DNC          ;RECURSE IF NON-ZERO\r
+       HLRZ    C,0(PP)\r
+       ADDI    C,"0"           ;FORM ASCII\r
+       JRST    PRINT           ;DUMP AND TEST FOR END\r
+\r
+OUTAS0:        HRLI    CS,(POINT 7,,)  ;ENTRY TO SET POINTER\r
+OUTASC:        ILDB    C,CS            ;GET NEXT BYTE\r
+       JUMPE   C,POPOUT        ;EXIT ON ZERO DELIMITER\r
+       PUSHJ   PP,PRINT\r
+       JRST    OUTASC\r
+\r
+OUTSIX:        HRLI    CS,(POINT 6,,)  ;OUTPUT SIXBIT\r
+       ILDB    C,CS            ;GET SIXBIT\r
+       CAIN    C,40            ;"@" DELIMITER?\r
+       POPJ    PP,             ;YES, EXIT\r
+       ADDI    C,40            ;NO, FORM ASCII\r
+       PUSHJ   PP,OUTL         ;OUTPUT ASCII CHAR FROM C\r
+       JRST    OUTSIX+1\r
+\r
+OUTSYM:        MOVE    CS,AC0          ;PLACE NAME IN CS\r
+OUTSY1:        MOVEI   C,0             ;CLEAR C\r
+       LSHC    C,6             ;MOVE NEXT SIXBIT CHARACTER IN\r
+       JUMPE   C,OUTTAB        ;TEST FOR END\r
+       ADDI    C,40            ;CONVERT TO ASCII\r
+       PUSHJ   PP,OUTL         ;OUTPUT\r
+       JRST    OUTSY1          ;LOOP\r
+\fOUTSET:       AOS     SX,0(PP)        ;GET RETURN LOCATION\r
+       MOVE    SX,-1(SX)       ;GET XWD CODE\r
+       HLRM    SX,BLKTYP       ;SET BLOCK TYPE\r
+       SETZB   ARG,RC\r
+       PUSHJ   PP,0(SX)        ;GO TO PRESCRIBED ROUTINE\r
+       JRST    COUTD           ;TERMINATE BLOCK AND EXIT\r
+\r
+       ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE\r
+\r
+LOOKUP:        POP     PP,LOOKX        ;INTERCEPT RETURN POP\r
+       MOVE    SX,SYMBOL\r
+       MOVE    SDEL,0(SX)      ;SET FOR TABLE SCAN\r
+LOOKL: SOJL    SDEL,POPOUT     ;TEST FOR END\r
+       ADDI    SX,2\r
+       MOVE    AC0,-1(SX)\r
+       PUSHJ   PP,SRCH7        ;LOAD REGISTERS\r
+       HLRZS   ARG\r
+       PUSHJ   PP,@LOOKX       ;RETURN TO CALLING ROUTINE\r
+       JRST    LOOKL           ;TRY AGAIN\r
+\fEND0: PUSHJ   PP,EVALCM       ;GET A WORD\r
+       SKIPE   EXTPNT          ;ANY EXTERNALS?\r
+       TRO     ER,ERRE         ;YES, ERROR\r
+       SKIPN   V,AC0           ;NON-ZERO?\r
+       JUMPE   RC,.+2          ;OR RELOC?\r
+       PUSHJ   PP,ASSIG7       ;YES, LIST THE VALUE\r
+       MOVEM   AC0,VECTOR\r
+       MOVEM   RC,VECREL\r
+       PUSHJ   PP,VARA         ;FILL OUT SELF-DEFINED VARIABLES\r
+       PUSHJ   PP,STOUTS       ;DUMP THE LINE\r
+       PUSH    PP,IO           ;SAVE FLAGS\r
+       TLO     IO,IOPROG       ;XLIST LITS\r
+       PUSHJ   PP,LIT1\r
+       POP     PP,IO           ;GET FLAG BACK\r
+       JUMP2   ENDP2\r
+\r
+       PUSHJ   PP,UOUT\r
+       TLNN    IO,MFLSW        ;SKIP IF ONLY PSEND\r
+       PUSHJ   PP,REC2\r
+       MOVE    INDIR           ;SET UP FIRST AS LAST\r
+       MOVEM   LSTFIL          ;PRINTED\r
+       SETZM   LSTPGN\r
+       PUSHJ   PP,INZ\r
+       TLNE    IO,MFLSW        ;IF PSEND\r
+       POPJ    PP,             ;BACK TO PSEND0\r
+       SKIPE   PRGPTR          ;HAVE ANY PRGEND'S BEEN SEEN\r
+       JRST    PSEND3          ;YES,GO SET UP AGAIN\r
+\r
+PASS20:        SETZM   CTLSAV\r
+       PUSHJ   PP,COUTI\r
+       PUSHJ   PP,EOUT         ;OUTPUT THE ENTRIES\r
+       PUSHJ   PP,OUTSET\r
+       XWD     6,NOUT          ;OUTPUT THE NAME (BLKTYP-6)\r
+IFN RENTSW,<\r
+       SKIPN   HISNSW          ;PUT OUT BLOCK TYPE 3?\r
+       JRST    PASS21          ;NO\r
+       PUSHJ   PP,OUTSET\r
+       XWD     3,HSOUT         ;OUTPUT THE HISEG BLOCK\r
+PASS21:        >\r
+       MOVEI   1\r
+       HRRM    BLKTYP          ;SET FOR TYPE 1 BLOCK\r
+       TLZ     FR,P1           ;SET FOR PASS 2 AND TURN OFF FLAG\r
+       TLO     IO,IOPALL       ;PUT THESE BACK\r
+       TLZ     IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD\r
+       TLNN    FR,R1BSW\r
+       JRST    STOWI\r
+       \r
+       MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]\r
+       MOVE C,0(CS)\r
+       PUSHJ PP,PTPBIN\r
+       AOBJN CS,.-2\r
+       PUSHJ   PP,R1BI\r
+       JRST    STOWI\r
+\f      \r
+R1BLDR:\r
+       PHASE 0\r
+       IOWD $ADR,$ST\r
+$ST:   CONO PTR,60\r
+       HRRI $A,$RD+1\r
+$RD:   CONSO PTR,10\r
+       JRST .-1\r
+       DATAI PTR,@$TBL1-$RD+1($A)\r
+       XCT $TBL1-$RD+1($A)\r
+       XCT $TBL2-$RD+1($A)\r
+$A:    SOJA $A,\r
+$TBL1: CAME $CKSM,$ADR\r
+       ADD $CKSM,1($ADR)\r
+       SKIPL $CKSM,$ADR\r
+$TBL2: JRST 4,$ST\r
+       AOBJN $ADR,$RD\r
+$ADR:  JRST $ST+1\r
+$CKSM: \r
+       DEPHASE\r
+\r
+IF2,<  PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>\r
+\fENDP2:        PUSHJ   PP,COUTD        ;DUMP THE BUFFER\r
+       MOVE    AC0,LOCO        ;CHECK TO SEE IF LIT DIFFERED\r
+       SKIPN   MODO            ;AND USE SMALLER SINCE AT END\r
+       JRST    [CAMN   AC0,ABSHI\r
+               HRRZM   AC2,ABSHI\r
+               JRST    ENDP2W]\r
+IFN RENTSW,<SKIPE HHIGH                ;SKIP IF NOT TWO SEGMENTS\r
+       JRST    [CAMN   AC0,HHIGH\r
+               HRRZM   AC2,HHIGH\r
+               JRST    ENDP2W]>\r
+       CAMN    AC0,HIGH\r
+       HRRZM   AC2,HIGH\r
+ENDP2W:\r
+REPEAT 1,<TLNE IO,IOCREF       ;CLOSE CREF IF NECESSARY>\r
+REPEAT 0,<TLNE FR,CREFSW       ;IF CREFFING\r
+       JRST ENDP2Q\r
+       MOVEI SDEL,0\r
+       PUSH PP,DBUF+3  ;SO NO PAGE INFO\r
+       DPB SDEL,[POINT 7,DBUF+3,13]\r
+       IOR ER,OUTSW    ;MAKE SURE OF OUTPUT\r
+       PUSHJ PP,CREF\r
+       MOVEI C,20      ;CODE FOR TITLE\r
+       PUSHJ PP,OUTLST\r
+       PUSH PP,IO      ;SAVE THIS\r
+       TLZ IO,IOPAGE   ;AND PREVENT PAGE DURING TITLE\r
+       MOVEI CS,TBUF\r
+       PUSHJ PP,OUTAS0\r
+       MOVEI CS,VBUF\r
+       PUSHJ PP,OUTAS0\r
+       POP PP,IO       ;RESTORE THE IO WORD\r
+       POP PP,DBUF+3   >       ;NEEDS FIX TO CREF\r
+       PUSHJ   PP,CLSCR2       ;CLOSE IT UP\r
+ENDP2Q:        HRR     ER,OUTSW        ;SET OUTPUT SWITCH\r
+       SKIPN   TYPERR\r
+       TRO     ER,TTYSW\r
+       PUSHJ   PP,UOUT         ;OUTPUT UNDEFINEDS\r
+       TRO     ER,TTYSW\r
+       SKPINC  C       ;SEE IF WE CAN INPUT A CHAR.\r
+         JFCL          ;BUT ONLY TO DEFEAT ^O\r
+       SKIPG C,ERRCNT  ;GET ERROR COUNT AND CHECK FOR POSITIVE\r
+       JRST NOERW      ;PRINT NO ERROR MESSAGE\r
+IFN CCLSW,<ADDM C,JOBERR       ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>\r
+       PUSHJ PP,OUTCR\r
+       MOVE C,ERRCNT\r
+       CAIN C,1        ;1 IS A SPECIAL CASE\r
+       JRST ONERW      ;PRINT MESSAGE\r
+       MOVEI   C,"?"           ;? FOR BATCH\r
+       PUSHJ   PP,OUTL         ;...\r
+       MOVE C,ERRCNT   ;PRINT NUMBER OF ERRORS\r
+       PUSHJ PP,DNC\r
+       SKIPA CS,[EXP ERRMS1]   ;LOAD TO PRINT\r
+ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED\r
+ONERW1:        PUSHJ PP,OUTSIX ;PRINT\r
+       JRST ENDP2A\r
+NOERW: MOVEI CS,ERRMS3\r
+IFN CCLSW,<TLNE IO,CRPGSW!MFLSW        ;IF RPG, DON'T PRINT MESSAGE>\r
+IFE CCLSW,<TLNE        IO,MFLSW        ;NOR IF MULTI-FILE MODE>\r
+       TRZ     ER,TTYSW                ;NO TTY OUTPUT\r
+       IOR     ER,OUTSW        ;UNLESS NEEDED FOR LISTING\r
+       PUSHJ PP,OUTCR\r
+       JRST ONERW1\r
+\r
+\fENDP2A:       PUSHJ PP,OUTCR\r
+       TLNN    IO,MFLSW        ;IN A MULTI-PROG FILE?\r
+       JRST    ENDP2D          ;NO\r
+       SKIPE   ERRCNT          ;ANY ERROR?\r
+       PUSHJ   PP,[MOVEI CS,[ASCIZ /PROGRAM    /]\r
+               PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE\r
+               MOVEI   CS,TBUF ;AND TITLE\r
+               PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION\r
+               JRST    OUTCR]  ;AND A CR-LF\r
+       TRZA    ER,TTYSW        ;NO MORE OUTPUT NOW\r
+ENDP2D:\r
+IFN CCLSW,<TLNE IO,CRPGSW      ;IF RPG, DON'T PRINT PGM BREAK\r
+       TRZ     ER,TTYSW        ;...>\r
+IFE CCLSW,<    SKIPA           ;SO PRGEND CODE CAN WORK>\r
+       IOR     ER,OUTSW        ;...\r
+       PUSHJ   PP,OUTCR\r
+IFN RENTSW,<\r
+       MOVEI   CS,[SIXBIT /HI-SEG. BREAK IS @/]\r
+       SKIPN   HHIGH           ;DON'T PRINT IF ZERO\r
+       JRST    ENDP2C          ;IT WAS\r
+       PUSHJ   PP,OUTSIX\r
+       HRLO    CS,HHIGH        ;GET THE BREAK\r
+       PUSHJ   PP,ONC1\r
+       PUSHJ   PP,OUTCR\r
+ENDP2C:>\r
+       MOVEI   CS,[SIXBIT /PROGRAM BREAK IS @/]\r
+       PUSHJ   PP,OUTSIX       ;OUTPUT PROGRAM BREAK\r
+       HRRZ    CS,ABSHI        ;GET ABS. BREAK\r
+       CAIG    CS,140          ;ANY ABS. CODE\r
+       JRST    [HRLO CS,HIGH   ;NO\r
+               JRST    ENDP2B] ;SO DON'T PRINT\r
+       HRLO    CS,HIGH         ;GET PROGRAM BREAK\r
+       PUSHJ   PP,ONC1\r
+       PUSHJ   PP,OUTCR\r
+       MOVEI   CS,[SIXBIT /ABSLUTE BREAK IS @/]\r
+       PUSHJ   PP,OUTSIX\r
+       HRLO    CS,ABSHI\r
+ENDP2B:        PUSHJ   PP,ONC1\r
+       PUSHJ PP,OUTCR\r
+       TLNE    FR,RIMSW!R1BSW  ;RIM MODE?\r
+       PUSHJ   PP,RIMFIN       ;YES, FINISH IT\r
+IFN CCLSW,<TLNN        IO,CRPGSW!MFLSW ;IF NOT IN CCL MODE>\r
+IFE CCLSW,<TLNN        IO,MFLSW        ;NOR IF IN MULTI-FILE MODE>\r
+       TRO     ER,TTYSW        ;PRINT SIZE\r
+       PUSHJ   PP,OUTCR\r
+       MOVE    C,JOBREL\r
+       LSH     C,-^D10\r
+       ADDI    C,1\r
+       PUSHJ   PP,DNC\r
+       MOVEI   CS,[SIXBIT /K CORE USED@/]\r
+       PUSHJ   PP,OUTSIX\r
+       PUSHJ   PP,OUTCR        \r
+       HRR     ER,OUTSW\r
+       PUSHJ   PP,OUTSET\r
+       XWD     2,SOUT          ;OUTPUT THE SYMBOLS (BLKTYP-2)\r
+       PUSHJ   PP,OUTSET\r
+       XWD     7,VOUT          ;OUTPUT TRANSFER VECTOR (..-7)\r
+IFN WFWSW,<PUSHJ PP,OUTSET     ;OUTPUT THE LVAR FIXUPS\r
+       XWD 13,OUTB12>\r
+       PUSHJ   PP,OUTSET\r
+       XWD     5,HOUT          ;OUTPUT HIGHEST RELOCATABLE (..-5)\r
+       PUSHJ   PP,COUTD\r
+       TLNN    IO,MFLSW        ;IS IT PRGEND?\r
+       JRST    FINIS           ;ALAS, FINISHED\r
+       MOVEI   CS,SBUF         ;RESET SBUF POINTER\r
+       HRRM    CS,SUBTTX       ;TO SUBTTL\r
+       SETZM   PASS2I          ;CLEAR PASS2 VARIABLES\r
+       MOVE    [XWD PASS2I,PASS2I+1]\r
+       BLT     PASS2Z-1        ;BUT NOT ALL OF VARIABLES\r
+       JRST    INZ             ;RE-INITIALIZE FOR NEXT PROG\r
+\fIFN WFWSW,<\r
+OUTB12:        SKIPN ARG,FIXLNK        ;WERE THERE ANY??\r
+       POPJ PP,                ;JUST GO AWAY\r
+OUTB19:        HRRZ SX,(ARG)   ;POINTER TO HEADER BLOCK NOW IN SX\r
+       HRRZ AC1,(SX)   ;NOW AC1 HAS POINTER TO CODE FIXUPS\r
+       JUMPE AC1,OUTB13        ;NONE THERE\r
+OUTB16:        HLRZ AC0,(AC1)  ;GET LOCATION OFFSET\r
+       ADD AC0,2(SX)   ;ADD BASE LOCATION\r
+       SKIPN 1(AC1)    ;AND RIGHT HALF??\r
+       JRST OUTB14     ;NO\r
+       PUSH PP,AC0     ;SAVE FIXUP VALUE\r
+       SETZB AC0,RC\r
+       PUSHJ PP,OUTBWD ;OUTPUT A Z (SAYS RIGHT HALF CODE)\r
+       POP PP,AC0      ;GET VALUE BACK\r
+       HLRZ RC,1(AC1)  ;GET RELOC OF FIXUP CHAIN\r
+       LSH RC,1        ;GOES IN LEFT HALF\r
+       HRL AC0,1(AC1)  ;LOCATION OF CHAIN\r
+       PUSHJ PP,OUTBWD ;LEFT HALF LOCATION, RIGHT HALF VALUE\r
+OUTB14:        SKIPN 2(AC1)    ;ANY LEFT HALF??\r
+       JRST OUTB15     ;NO, GO LOOK FOR NEXT BLOCK\r
+       PUSH PP,AC0     ;SAVE VALUE\r
+       MOVEI RC,0\r
+       MOVSI AC0,400000        ;INDICATE LEFT HALF\r
+       PUSHJ PP,OUTBWD\r
+       POP PP,AC0\r
+       HLRZ RC,2(AC1)  ;GET RELOC FOR LEFT HALF\r
+       LSH RC,1\r
+       HRL AC0,2(AC1)\r
+       PUSHJ PP,OUTBWD\r
+OUTB15:        HRRZ AC1,(AC1)  ;NEXT LINK IN CHAIN\r
+       JUMPN AC1,OUTB16        ;IF NOT END, PROCESS\r
+OUTB13:        HLRZ AC1,(SX)   ;POINTER TO SYMBOL TABLE FIXUP CHAIN\r
+       JUMPE AC1,OUTB17        ;CHACK FOR SOME THERE\r
+OUTB18:        MOVE AC0,2(AC1) ;FLAGS\r
+       HRR AC0,2(SX)   ;VALUE IN RH\r
+       MOVEI RC,0      ;NO RELCO ON IT\r
+       PUSHJ PP,OUTBWD\r
+       MOVE AC0,1(AC1) ;THE SYMBOL NAME\r
+       PUSHJ PP,OUTBWD\r
+       HRRZ AC1,(AC1)  ;FOOLOW CHAIN\r
+       JUMPN AC1,OUTB18\r
+OUTB17:        HRRZ ARG,-1(ARG)        ;DONE WITH THIS SYMBOL GET NEXT\r
+       JUMPN ARG,OUTB19\r
+       POPJ PP,        ;ALL DONE\r
+\f\r
+OUTBWD:        SKIPL COUTX     ;IF WE ARE AT THE START\r
+       JRST COUT       ;NO PUT OUT\r
+       PUSH PP,AC0     ;WE NEED TO PUT NEW RELOC AND VAR LENGTH\r
+       PUSH PP,RC      ;AS FIRST TWO WORDS\r
+       MOVE AC0,HIGH\r
+       MOVEI RC,1      ;IT IS RELOC\r
+       PUSHJ PP,COUT\r
+       MOVE AC0,LVARLC ;THE LENGTH\r
+       MOVEI RC,0\r
+       PUSHJ PP,COUT\r
+       POP PP,RC\r
+       POP PP,AC0\r
+       JRST COUT       ;NOW PUT OUT THE ONE WE WANTED TO\r
+>\r
+\r
+RIMFIN:        TLNE FR,R1BSW\r
+       PUSHJ PP,R1BDMP\r
+       SKIPN   C,VECTOR\r
+       MOVSI   C,(JRST 4,)\r
+       TLNN    C,777000\r
+       TLO     C,(JRST)\r
+       PUSHJ   PP,PTPBIN\r
+       MOVEI   C,0\r
+       JRST    PTPBIN\r
+\fSUBTTL        PASS INITIALIZE\r
+INZ:   AOS     MODA\r
+       AOS     MODO\r
+       SETZM   SEQNO\r
+       SETZM   TAG\r
+       HRRI    RX,^D8\r
+       MOVEI   VARHD\r
+       MOVEM   VARHDX\r
+       MOVEI   LITHD\r
+       MOVEM   LITHDX\r
+       PUSHJ   PP,LITI\r
+       PUSHJ   PP,STOWI\r
+IFN FORMSW,<\r
+       HRRES   HWFMT           ;SET DEFAULT VALUE BACK>\r
+       JRST    OUTLI\r
+\r
+RCPNTR:        POINT   1,ARG,^L<RELF>-18       ;POINT 1,ARG,22\r
+\fSUBTTL        PSEUDO-OP HANDLERS\r
+\r
+TAPE0: PUSHJ   PP,STOUTS       ;FINISH THIS LINE\r
+       JRST    GOTEND          ;AND IGNORE THE REST OF THIS FILE\r
+\r
+RADIX0:        PUSHJ   PP,EVAL10       ;EVALUATE RADIX D10\r
+       CAIG    AC0,^D10        ;IF GREATER THAN 10\r
+       CAIG    AC0,1           ;OR LESS THAN 2,\r
+ERRAX: TROA    ER,ERRA         ;FLAG ERROR AND SKIP\r
+       HRR     RX,AC0          ;SET NEW RADIX\r
+       POPJ    PP,\r
+\r
+\r
+XALL0: TLZ     IO,IOSALL       ;TURN OFF MACRO SUPPRESS ALL\r
+IOSET: JUMP1   POPOUT          ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)\r
+       HLRZ    SX,AC0          ;STORE FLAGS\r
+       PUSHJ   PP,STOUTS       ;POLISH OFF LINE\r
+       TLO     IO,0(SX)        ;NOW SUPRESS PRINTING\r
+       POPJ    PP,\r
+\r
+IORSET:        TDZ     IO,AC0          ;RESET  FLAG IOPALL/IOPROG\r
+       TLNE    AC0,IONCRF      ;RESTORING CREFFING?\r
+       TLZ     IO,DEFCRS       ;YES, CLEAR ANY WAITING DEFINING OCCURENCES\r
+       POPJ    PP,\r
+\r
+BLOCK0:        PUSHJ   PP,HIGHQ\r
+       PUSHJ   PP,EVALEX       ;EVALUATE\r
+       TRZE    RC,-1           ;EXTERNAL OR RELOCATABLE?\r
+       PUSHJ   PP,QEXT         ;YES, DETERMINE TYPE\r
+       ADDM    AC0,LOCO        ;UPDATE ASSEMBLY LOCATION\r
+BLOCK1:        EXCH    AC0,LOCA        ;SAVE START OF BLOCK\r
+       ADDM    AC0,LOCA        ;UPDATE OUTPUT LOCATION\r
+BLOCK2:        HRLOM   AC0,LOCBLK\r
+       JUMP2   POPOUT\r
+       TRNE    ER,ERRU\r
+       TRO     ER,ERRV\r
+       POPJ    PP,\r
+\f\r
+PRNTX0:        TRO     ER,TTYSW        ;SET OUTPUT TO TTY\r
+       JUMP2   PRNTX2          ;PASS1?\r
+       TDOA    ER,OUTSW        ;YES,OUTPUT TO LSTDEV ALSO\r
+PRNTX2:        ANDCM   ER,OUTSW        ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV\r
+       PUSHJ   PP,BYPASS       ;GET FIRST CHAR.\r
+       TLOA    IO,IORPTC       ;REPEAT IT AND SKIP\r
+PRNTX4:        PUSHJ   PP,PRINT        ;PRINT THE CHAR.\r
+       PUSHJ   PP,CHARAC       ;GET ASCII CHAR.\r
+       CAIG    C,CR            ;IF GREATER THAN CR\r
+       CAIG    C,HT            ;OR LESS THAN LF\r
+       JRST    PRNTX4          ;THEN CONTINUE\r
+       PUSHJ   PP,OUTCR        ;OUTPUT A CRLF\r
+       TRZA    ER,TTYSW!LPTSW  ;TURN OF OUTPUT\r
+CPOPJ1:        AOS     (PP)            ;USEFUL TAG HAS TO GO SOMEWHERE\r
+CPOPJ: POPJ    PP,             ;EXIT\r
+\r
+REMAR0:        PUSHJ   PP,GETCHR       ;GET A CHARACTER\r
+       CAIE    C,EOL\r
+       JRST    REMAR0\r
+       POPJ    PP,             ;EXIT\r
+\fLIT0: PUSHJ   PP,BLOCK1\r
+       PUSHJ   PP,STOUTS\r
+LIT1:  JUMP2   LIT20\r
+\r
+;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR\r
+\r
+       MOVE    AC0,LITCNT\r
+       MOVE    SX,LITHDX\r
+       HRLM    AC0,0(SX)\r
+       MOVE    V,LOCA\r
+       HRL     V,MODA\r
+       MOVEM   V,-1(SX)\r
+       JRST    LIT24\r
+\r
+LIT20: PUSH    PP,LOCA\r
+       PUSH    PP,LOCO\r
+       SKIPN   LITNUM\r
+       JRST    LIT20A\r
+       MOVE    SX,LITHDX\r
+       HRRZ    AC0,-1(SX)\r
+       CAME    AC0,LOCA\r
+       TRO     ER,ERRP\r
+LIT20A:        MOVE    SX,LITAB\r
+LIT21: SOSGE   LITNUM\r
+       JRST    LIT22\r
+IFN FORMSW,<\r
+       MOVE    AC0,-3(SX)\r
+       MOVEM   AC0,FORM\r
+>\r
+       MOVE    AC0,-2(SX)      ;WFW\r
+       MOVE    RC,-1(SX)       ;WFW\r
+       MOVE SX,(SX)    ;WFW POINTER TO THE NEXT LIT\r
+       PUSHJ   PP,STOW20       ;STOW CODE\r
+       MOVEI   C,12            ;SET LINE FEED\r
+       IDPB    C,LBUFP\r
+       PUSHJ   PP,OUTLIN       ;OUTPUT THE LINE\r
+       JRST    LIT21\r
+\fLIT22:        HRRZ    AC2,LOCO\r
+       POP     PP,LOCO\r
+       POP     PP,LOCA\r
+       MOVE    SX,LITHDX\r
+       HLRZ    AC0,0(SX)\r
+       SUB AC2,LOCO    ;COMPUTE LENGTH USED\r
+       CAMGE AC0,AC2   ;USE LARGER\r
+       MOVE AC0,AC2\r
+       ADD AC2,LOCO\r
+LIT24: ADDM    AC0,LOCA\r
+       ADDM    AC0,LOCO\r
+       PUSHJ   PP,GETTOP\r
+       HRRM    SX,LITHDX\r
+LITI:  SETZM   LITCNT\r
+       SETZM   LITNUM\r
+       MOVEI   LITAB\r
+       MOVEM   LITABX\r
+       JRST    HIGHQ\r
+\r
+GETTOP:        HRRZ    AC1,SX          ;VARHD\r
+       HRRZ    SX,0(SX)\r
+       JUMPN   SX,POPOUT\r
+IFE FORMSW,<   MOVEI   SX,3    ;WFW>\r
+IFN FORMSW,<   MOVEI   SX,4    ;ICC>\r
+       ADDB    SX,FREE\r
+       CAML    SX,SYMBOL\r
+       PUSHJ   PP,XCEED\r
+       SUBI    SX,1            ;MAKE SX POINT TO LINK\r
+       SETZM   0(SX)           ;CLEAR FORWARD LINK\r
+       HRRM    SX,0(AC1)       ;STORE ADDRESS IN LAST LINK\r
+       POPJ    PP,\r
+\fVAR0: PUSHJ   PP,BLOCK1       ;PRINT LOCATION\r
+       PUSHJ PP,VARA\r
+       JRST STOUTS\r
+\r
+VARA:  MOVE    SX,VARHDX\r
+       MOVE AC0,LOCA   ;GET LOCATION FOR CHECK\r
+       JUMP1 VARB      ;DO NOT CHECK START ON PASS 1\r
+       CAME AC0,-1(SX) ;CHECK START OF VAR AREA\r
+       TRO ER,ERRP     ;AND GIVE ERROR\r
+VARB:  MOVEM AC0,-1(SX)        ;SAVE START FOR PASS 2\r
+       HLRZ    AC0,0(SX)\r
+       ADDM    AC0,LOCA\r
+       ADDM    AC0,LOCO\r
+       PUSHJ   PP,GETTOP\r
+       HRRM    SX,VARHDX\r
+       JUMP2   POPOUT\r
+\r
+       PUSHJ   PP,LOOKUP       ;SET FOR TABLE SCAN\r
+IFN WFWSW,<TRNN ARG,EXTF       ;IN CASE LVAR HAS BEEN THROUGH>\r
+       TRZN    ARG,VARF\r
+       POPJ    PP,             ;NO, EXIT\r
+       TRZ ARG,UNDF            ;TURN OFF FLAG NOW\r
+IFN WFWSW,<MOVSI AC0,1(V)      ;NUMBER TO ADD TO>\r
+IFE WFWSW,<MOVSI AC0,1         ;ADD 1>\r
+       ADDM    AC0,0(AC1)      ;UPDATE COUNT\r
+IFN WFWSW,<\r
+VARA1: ADDI V,1                ;GET LENGTH OF DESIRED BLOCK\r
+       ADDM V,LOCO\r
+       EXCH V,LOCA\r
+       ADDM V,LOCA\r
+       HRL ARG,V       ;GET STARTING LOCATION AND UPDAT PCS\r
+>\r
+\r
+       IOR     ARG,MODA        ;SET TO ASSEMBLY MODE\r
+IFE WFWSW,<HRL ARG,LOCA>\r
+       MOVSM   ARG,0(SX)       ;UPDATE 2ND WRD OF SYM TAB ENTRY\r
+IFE WFWSW,<AOS LOCA\r
+       AOS     LOCO>\r
+       JRST    HIGHQ1\r
+\fIF:   PUSH    PP,AC0          ;SAVE AC0\r
+       PUSH    PP,IO\r
+       PUSHJ   PP,EVALXQ       ;EVALUATE AND TEST EXTERNAL\r
+       POP     PP,AC1\r
+       JUMPL   AC1,IFPOP\r
+       TLZ     IO,FLDSW\r
+IFPOP: POP     PP,AC1          ;RETRIEVE SKIP INSTRUCTION\r
+IFSET: TLO IO,IORPTC           ;REPEAT CHARACTER\r
+IFXCT: XCT     AC1             ;EXECUTE INSTRUCTION\r
+       TDZA    AC0,AC0         ;FALSE\r
+       MOVEI   AC0,1           ;TRUE\r
+IFEXIT:        JUMPOC REPEA1           ;BRANCH IF IN OP-CODE FIELD\r
+IFEX1: PUSHJ PP,GETCHR         ;SEARCH FOR "<"\r
+       CAIN C,EOL              ;ERROR IF END OF LINE\r
+       JRST ERRAX\r
+       CAIE C,34\r
+       JRST IFEX1\r
+       JUMPE AC0,IFEX2         ;TEST FOR 0\r
+       TLO IO,IORPTC           ;NO, PROCESS AS CELL\r
+       PUSHJ PP,CELL\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE STANDARD FORM>\r
+       SETZM   INCND           ;NOT ANY MORE\r
+       JRST STOW               ;STOW CODE AND EXIT\r
+\r
+IFPASS:        HRRI    AC0,P1          ;MAKE IT TLNX IO,P1\r
+       MOVE    AC1,AC0         ;PLACE IT IN AC1\r
+       JRST    IFSET           ;EXECUTE INSTRUCTION\r
+\r
+IFB0:  HLLO    AC1,AC0         ;FORM AND STORE TEST INSTRUCTION\r
+IFB1:  PUSHJ   PP,CHARL        ;GET FIRST NON-BLANK\r
+       CAIE    C," "\r
+       CAIN    C,"     "\r
+       JRST    IFB1            ;SKIP BLANKS AND TABS\r
+       CAIG    C,CR            ;CHECK FOR CARRET AS DELIM.\r
+       CAIGE   C,LF\r
+       SKIPA   SX,SEQNO2\r
+       JRST    ERRAX\r
+       MOVEM   SX,CNDSEQ\r
+       MOVE    SX,PAGENO\r
+       MOVEM   SX,CNDPG\r
+       SETOM   INCND           ;SAVE INFO. FOR PASS 1 ERRORS\r
+       CAIN    C,"<"           ;LEFT BRACKET?\r
+       SETZB   C,RC            ;YES, PREPARE FOR OLD FORMAT\r
+       SKIPA   SX,C            ;SAVE FOR COMPARISON\r
+IFB3:  TRO     AC0,1           ;SET FLAG\r
+IFB2:  PUSHJ   PP,CHARL        ;GET ASCII CHARACTER AND LIST\r
+       CAMN    C,SX            ;TEST FOR DELIMITER\r
+       JRST    IFXCT           ;FOUND\r
+       CAIE    C," "           ;BLANK?\r
+       CAIN    C,"     "       ;OR TAB?\r
+       JRST    IFB2            ;YES\r
+       JUMPN   SX,IFB3         ;JUMP IF NEW FORMAT\r
+       CAIN    C,"<"           ;<?\r
+       AOJA    RC,IFB2         ;YES, INCREMENT COUNT\r
+       CAIN    C,">"           ;>?\r
+       SOJL    RC,IFXCT        ;YES, DECREMENT AND EXIT IF DONE\r
+       JRST    IFB3            ;GET NEXT CHARACTER\r
+\r
+\fIFDEF0:       HRRI    AC0,UNDF        ;MAKE IT TLNX ARG,UNDF\r
+       PUSH    PP,AC0          ;STACK IT\r
+       PUSHJ   PP,GETSYM       ;TAKES SKIP RETURN IF SYM NAME IS LEGAL\r
+       TROA    ER,ERRA         ;ILLEGAL!\r
+       PUSHJ   PP,SEARCH\r
+       JRST    [PUSHJ  PP,OPTSCH\r
+               TLO     ARG,UNDF\r
+               JRST    .+1]\r
+       PUSHJ PP,SSRCH3         ;EMIT TO CREF ANYWAY\r
+       JRST    IFPOP           ;POP AND EXECUTE INSTRUCTION\r
+\r
+\fIFIDN0:       HLRZS   AC0\r
+       MOVEI   V,2*.IFBLK-1\r
+       SETZM   IFBLK(V)        ;CLEAR COMPARISON BLOCK\r
+       SOJGE   V,.-1\r
+       SETZM   .TEMP           ;CLEAR STORED DELIMETER\r
+       MOVEI   RC,IFBLK        ;SET FOR FIRST BLOCK\r
+       PUSHJ   PP,IFCL         ;GET FIRST STRING\r
+       MOVEI   RC,IFBLKA\r
+       PUSHJ   PP,IFCL         ;GET SECOND STRING\r
+       MOVEI   V,.IFBLK-1\r
+       MOVE    SX,IFBLK(V)     ;GET WORD FROM FIRST STRING\r
+       CAMN    SX,IFBLKA(V)    ;COMPARE WITH SECOND STRING\r
+       SOJGE   V,.-2           ;EQUAL, TRY NEXT WORD\r
+       JUMPL   V,IFEXIT        ;DID WE FINISH STRING\r
+       XORI    AC0,1           ;NO, TOGGLE REQUEST\r
+       JRST    IFEXIT  ;DO NOT TURN ON IORPTC WFW\r
+\r
+IFCL:  PUSHJ   PP,CHARAC       ;GET AND LIST CHARACTER\r
+       CAIE    C," "           ;SKIP SPACES\r
+       CAIG    C,CR            ;ALSO SKIP CR-LF\r
+       CAIGE   C,HT            ;AND TAB\r
+       JRST    .+2             ;NOT ONE OF THEM\r
+       JRST    IFCL            ;SO LONG COMPARISONS WILL WORK\r
+;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK   ***\r
+       CAIE    C,","           ;IS IT A COMMA?\r
+       JRST    .+3             ;NO\r
+       SKIPN   .TEMP           ;YES, WAS PREVIOUS FIELD OLD METHOD?\r
+       JRST    IFCL            ;YES, IGNORE COMMA AND SPACES\r
+;      ***\r
+       CAIN    C,"<"           ;WAS IT LEFT BRACKET?\r
+       SETO    C,              ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET\r
+       MOVEM   C,.TEMP         ;STORE TERMINATOR FOR COMPARISON\r
+       MOVEI   SX,5*.IFBLK-1   ;LIMIT SEARCH\r
+       HRLI    RC,(POINT 7,,)  ;SET UP BYTE IN RC\r
+IFCLR: PUSHJ   PP,CHARAC\r
+       SKIPLE  .TEMP           ;NEW METHOD?\r
+       JRST    IFCLR1          ;YES, IGNORE ANGLE BRACKET COUNTING\r
+       CAIN    C,"<"           ;ANOTHER LEFT ANGLE?\r
+       SOS     .TEMP           ;YES, KEEP COUNT\r
+       CAIN    C,">"           ;CLOSING ANGLE\r
+       AOSGE   .TEMP           ;MATCHING COUNT?\r
+IFCLR1:        CAMN    C,.TEMP         ;TEST FOR DELIMITER\r
+       POPJ    PP,             ;EXIT ON RIGHT DELIMITER\r
+       SOJG    SX,.+2          ;ANY ROOM IN COMPARISON BLOCK?\r
+       TROA    ER,ERRA         ;NO, FLAG ERROR BUT KEEP ON GOING\r
+       IDPB    C,RC            ;DEPOSIT BYTE\r
+       JRST    IFCLR\r
+\r
+\f\r
+IFEX2: PUSHJ   PP,GETCHR\r
+       CAIN    C,EOL           ;EXIT WITH ERROR IF END OF LINE\r
+       JRST    ERRAX\r
+       CAIN    C,34            ;"<"?\r
+       AOJA    AC0,IFEX2       ;YES, INCREMENT COUNT\r
+       CAIE    C,36            ;">"?\r
+       JRST    IFEX2           ;NO, TRY AGAIN\r
+       SOJGE   AC0,IFEX2       ;YES, TEST FOR MATCH\r
+       PUSHJ   PP,BYPASS       ;YES, MOVE TO NEXT DELIMITER\r
+       SETZM   INCND           ;OUT OF CONDITIONAL NOW\r
+       AOJA    AC0,STOWZ1      ;STOW ZERO\r
+\r
+\r
+INTER0:        HLLZM   AC0,INTENT      ;AC0 CONTAINS INTF/ENTF FLAGS\r
+\r
+INTER1:        PUSHJ   PP,GETSYM       ;GET A SYMBOL\r
+       JRST    INTER3          ;INVALID, SKIP\r
+       PUSHJ   PP,SSRCH        ;SEARCH THE TABLE\r
+       MOVSI   ARG,SYMF!INTF!UNDF\r
+       TLNE    ARG,UNDF        ;UNDEFINED?\r
+       TRO     ER,ERRA         ;YES, FLAG ERROR\r
+IFN WFWSW,<TLNN ARG,VARF       ;LET HIM MAKE INTERNAL EVEN IF EXTF ON>\r
+       TLNN    ARG,SYNF!EXTF\r
+       TDOA    ARG,INTENT                      ;SET APPROPRIATE FLAGS\r
+INTER3:        TROA    ER,ERRA         ;FLAG ARG EROR AND SKIP\r
+       PUSHJ   PP,INSERQ       ;INSERT/UPDATE\r
+       JUMPCM  INTER1\r
+       SETZM EXTPNT    ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD\r
+       POPJ    PP,             ;NO, EXIT\r
+\fEXTER0:       PUSHJ   PP,GETSYM       ;GET A SYMBOL\r
+       JRST    EXTER4          ;INVALID, ERROR\r
+EXTER1:        TLO     IO,DEFCRS       ;FLAG THIS AS A DEFINITION\r
+       PUSHJ   PP,SSRCH        ;OK, SEARCH SYMBOL TABLE\r
+       JRST    EXTER2          ;NOT THERE, INSERT IT\r
+       TLNN    ARG,EXTF!VARF!UNDF\r
+       TROA    ER,ERRE         ;FLAG ERROR AND BYPASS\r
+       TLNE    ARG,EXTF        ;VALID, ALREADY DEFINED?\r
+       JRST    [JUMP1  EXTER3  ;YES, BYPASS\r
+               TLZN ARG,UNDF   ;SKIP IF UNDEFINED ALSO\r
+               JRST    EXTER3  ;CONTINUE\r
+               ANDM ARG,(SX)   ;CLEAR UNDF ON PASS 2\r
+               JRST    EXTER2] ;SET UP EXTERNAL NOW\r
+EXTER2:        MOVEI V,2               ;NO, GET 2 CELLS FROM THE TREE\r
+       ADDB V,FREE\r
+       CAML    V,SYMBOL        ;HAVE WE RUN OUT OF CORE?\r
+       PUSHJ   PP,XCEEDS       ;YES, TRY TO BORROW SOME MORE\r
+       SUBI    V,2             ;GET RIGHT CELL FOR POINTER\r
+       SETZB   RC,0(V)         ;ALL SET, ZERO VALUES\r
+       MOVSI   ARG,SYMF!EXTF\r
+       PUSHJ   PP,INSERT       ;INSERT/UPDATE IT\r
+       MOVSI   ARG,PNTF\r
+       IORM    ARG,0(SX)\r
+       SKIPA ARG,-1(SX)                ;GET THE SIXBIT FOR THE NAME\r
+EXTER4:        TROA ER,ERRA    ;FLAG AS ERROR\r
+       MOVEM ARG,1(V)          ;AND STORE THAT IN CASE SYMBOL TABLE MOVES\r
+EXTER3:        JUMPCM  EXTER0\r
+       POPJ    PP,             ;NO, EXIT\r
+\fEVAL10:       PUSH    PP,RX\r
+       HRRI    RX,^D10\r
+       PUSHJ   PP,EVALEX       ;EVALUATE\r
+       POP     PP,RX           ;RESET RADIX\r
+       JUMPE   RC,POPOUT       ;EXIT IF ABSOLUTE\r
+\r
+QEXT:  SKIPE   EXTPNT          ;ANY POSSIBILITIES?\r
+       TROA    ER,ERRE         ;YES, FLAG EXTERNAL ERROR\r
+       TRO     ER,ERRR         ;NO, FLAG RELOCATION ERROR\r
+       HLLZS   RC              ;CLEAR RELOCATION/EXTERNAL\r
+       POPJ    PP,\r
+\r
+EVALXQ:        PUSHJ   PP,EVALEX       ;EVALUATE EXPRESSION\r
+       TLZN RC,-2              ;LEFT HALF EXTERNAL\r
+       TRZE    RC,-2           ;WAS AN EXTERNAL FOUND?\r
+       TRO     ER,ERRE         ;YES, FLAG ERROR\r
+       POPJ    PP,             ;RETURN\r
+\fOPDEF0:       PUSHJ   PP,GETSYM       ;GET THE FIRST SYMBOL\r
+       POPJ    PP,             ;ERROR IF INVALID SYMBOL\r
+       CAIE    C,73            ;"["?\r
+       JRST    ERRAX           ;NO, ERROR\r
+       PUSH    PP,AC0          ;STACK MNEMONIC\r
+       AOS     LITLVL          ;SHORT OUT LOCATION INCREMENT\r
+       PUSHJ   PP,STMNT        ;EVALUATE STATEMENT\r
+       SKIPGE  STPX            ;CODE STORED?\r
+       TROA    ER,ERRA         ;NO,"A" ERROR\r
+       PUSHJ   PP,DSTOW        ;GET AND DECODE VALUE\r
+       SOS     LITLVL\r
+       EXCH    AC0,0(PP)       ;EXCHANGE VALUE FOR MNEMONIC\r
+       PUSH    PP,RC           ;STACK RELOCATION\r
+       TLO     IO,DEFCRS       ;SAY WE ARE DEFINING IT\r
+       PUSHJ   PP,MSRCH        ;SEARCH SYMBOL TABLE\r
+       MOVSI   ARG,OPDF        ;NOT FOUND\r
+       POP     PP,RC           ;RESTORE VALUES\r
+       POP     PP,V\r
+       TLNE    ARG,SYNF!MACF\r
+       TRO     ER,ERRA         ;YES "A" ERROR\r
+       TRNN    ER,ERRA         ;ERROR?\r
+       PUSHJ   PP,INSERT       ;NO, INSERT/UPDATE\r
+       TLZ IO,DEFCRS           ;JUST IN CASE\r
+       PUSHJ   PP,BYPASS\r
+       JRST    STOWI           ;BE SURE STOW IS RESET\r
+\r
+\r
+DEPHA0:        MOVE    AC0,LOCO\r
+       SKIPA   RC,MODO         ;SET TO OUTPUT VALUES AND SKIP\r
+PHASE0:        PUSHJ   PP,EVALXQ       ;EVALUATE AND CHECK FOR EXTERNAL\r
+       MOVEM   AC0,LOCA        ;SET ASSEMBLY LOCATION COUNTER\r
+       MOVEM   RC,MODA\r
+       JRST    BLOCK2\r
+\fASSIGN:       JUMPAD  ERRAX           ;NO, ERROR\r
+       PUSHJ   PP,ASSIG1\r
+       TLNE    IO,IOSALL       ;SUPPRESS ALL?\r
+       JUMPN   MRP,CPOPJ       ;IF IN MACRO\r
+ASSIG7:        MOVEM   RC,ASGBLK\r
+       TRNE    RC,-2           ;EXTERNAL\r
+       HLLZS   ASGBLK          ;YES,CLEAR RELOCATION\r
+       TLNE    RC,1            ;LEFT HALF NOT RELOC?\r
+       TLNE    RC,-2           ;...\r
+       HRROS   ASGBLK          ;YES, SET FLAG\r
+       MOVEM   V,LOCBLK\r
+       POPJ    PP,\r
+\r
+ASSIG1:        PUSH    PP,AC0          ;SAVE SYMBOL\r
+       SETZB AC0,EXTPNT        ;SPECIAL CHECK FOR == WFW\r
+       PUSHJ PP,PEEK           ;IS THE NEXT ON =\r
+       CAIE    C,"="\r
+       JRST    ASSIG5\r
+       TLO     AC0,NOOUTF      ;YES, NOT OUT TO DDT WFW\r
+       PUSHJ   PP,GETCHR       ;PROCESS THE CHAR.\r
+       PUSHJ   PP,PEEK         ;CHECK FOR ==: DMN\r
+ASSIG5:        CAIE    C,":"           ;IS IT\r
+       JRST    ASSIG6          ;NO\r
+       TLO     AC0,INTF        ;MAKE INTERNAL\r
+       PUSHJ   PP,GETCHR       ;REPEAT IT\r
+ASSIG6:        MOVEM AC0,HDAS          ;STORE THESE BITS WFW\r
+       PUSHJ   PP,EVALCM       ;EVALUATE EXPRESSION\r
+       EXCH    AC0,0(PP)       ;SWAP VALUE FOR SYMBOL\r
+       PUSH    PP,RC\r
+       TRNN RC,-2              ;CHECK EXTERNAL AGREEMENT\r
+       JRST ASSIG2\r
+       HRRZS RC\r
+       HRRZ ARG,EXTPNT\r
+       CAME RC,ARG\r
+       PUSHJ   PP,QEXT         ;EXTERNAL OR RELOCATION ERROR\r
+ASSIG2:        HLRZ RC,(PP)\r
+       TRNN RC,-2\r
+       JRST ASSIG3\r
+       HLRZ ARG,EXTPNT\r
+       CAME RC,ARG\r
+       PUSHJ   PP,QEXT\r
+ASSIG3:        TLO IO,DEFCRS\r
+       PUSHJ   PP,SSRCH\r
+       MOVSI   ARG,SYMF\r
+       IOR ARG,HDAS    ;WFW\r
+       TLNE    ARG,UNDF        ;WAS IT UNDEFINED\r
+       TLZ     ARG,EXTF!PNTF   ;YES,CLEAR EXTF NOW\r
+       TLZ     ARG,UNDF!VARF   ;CANCEL UNDEFINED AND VARIABLE FLAGS\r
+       SETZM EXTPNT            ;FOR REST OF WORLD\r
+       POP     PP,RC\r
+       TRNE    ER,ERRORS-ERRQ\r
+       SETZ    RC,             ;CLEAR RELOCATION\r
+       POP     PP,V\r
+       TRNE    ER,ERRU         ;WAS VALUE UNDEFINED?\r
+       TLO     ARG,UNDF        ;YES,SO TURN UNDF ON\r
+       TLNE    ARG,TAGF!EXTF\r
+       JRST    ERRAX\r
+       JRST    INSERT\r
+\r
+\fLOC0: PUSHJ   PP,HIGHQ        ;AC0=0,0\r
+       PUSH    PP,AC0          ;SAVE MODE REQUESTED\r
+       HLRZS   AC0             ;PUT MODE IN RIGHT HALF\r
+       JUMPN   AC0,RELOC0      ;RELOC PSEUDO-OP\r
+       CAMN    AC0,MODO        ;SAME AS PRESENT MODE?\r
+       JRST    [HRRZ AC0,LOCO  ;YES\r
+               EXCH AC0,ABSLOC ;EXCH VALUES\r
+               JRST    LOC01]\r
+       HRRZ    AC0,LOCO        ;NO, GET CURRENT VALUE\r
+       MOVEM   AC0,RELLOC      ;SAVE IT\r
+       MOVE    AC0,ABSLOC      ;GET LAST RELOC VALUE\r
+LOC01: PUSHJ   PP,BYPASS       ;SKIP BLANKS\r
+       TLO     IO,IORPTC\r
+       CAIE    C,EOL           ;USE PREVIOUS VALUE IF NULL ARGUMENT\r
+       PUSHJ   PP,EVALXQ       ;GET EXPRESSION AND TEST EXTERNAL\r
+       HRRM    AC0,(PP)        ;STORE NEW VALUE\r
+       POP     PP,AC0          ;RETRIEVE STORED MODE AND VALUE\r
+LOC10: HRRZM   AC0,LOCA        ;SET ASSEMBLY LOCATION\r
+       HRRZM   AC0,LOCO        ;AND OUTPUT LOCATION\r
+       HLRZM   AC0,MODA        ;SET MODE\r
+       HLRZM   AC0,MODO\r
+       JRST    BLOCK2\r
+\r
+RELOC0:        CAMN    AC0,MODO\r
+       JRST    [HRRZ   AC0,LOCO\r
+               EXCH    AC0,RELLOC\r
+               JRST    LOC01]\r
+       HRRZ    AC0,LOCO\r
+       MOVEM   AC0,ABSLOC\r
+       MOVE    AC0,RELLOC\r
+       JRST    LOC01\r
+\r
+\fIFN RENTSW,<\r
+HISEG1:        PUSHJ   PP,HIGHQ        ;SET CURRENT PROGRAM BREAK\r
+       PUSHJ   PP,COUTD        ;DUMP CURRENT TYPE OF BLOCK\r
+       SKIPN   HISNSW          ;IF WE HAVE SEEN IT BEFORE\r
+       SKIPE   HIGH            ;OR ANY RELOC CODE PUT OUT\r
+       TRO     ER,ERRQ         ;FLAG AS AN ERROR\r
+       PUSHJ   PP,BYPASS       ;GO GET EXPRESSION\r
+       TLO     IO,IORPTC\r
+       PUSHJ   PP,EVALXQ       ;CHECK FOR EXTERNAL\r
+       ANDCMI  AC0,1777        ;ONLY ALLOWED TO START ON NEW K BOUND\r
+       HRRZM   AC0,LOCA        ;SET LOC COUNTERS\r
+       HRRZM   AC0,LOCO\r
+       MOVEI   RC,1            ;ASSUME RELOCATABLE\r
+       POPJ    PP,\r
+\r
+TWSEG0:        PUSHJ   PP,HISEG1       ;COMMON CODE\r
+       JUMPN   AC0,.+2         ;ARGUMENT SEEN\r
+       MOVEI   AC0,400000      ;ASSUME 400000\r
+       HRRZM   AC0,HMIN        ;SET OFSET OF HIGH SEG.\r
+       HRRZM   AC0,HHIGH       ;INCASE NO HISEG CODE\r
+       TLOA    AC0,(1B0)       ;SIGNAL TWO SEGMENTS AND SKIP\r
+\r
+HISEG0:        PUSHJ   PP,HISEG1       ;COMMON CODE\r
+HISEG2:        MOVEM   AC0,SVTYP3      ;SAVE THE HISEG ARG\r
+       MOVEM   RC,MODA         ;SET MODES\r
+       MOVEM   RC,MODO\r
+       SETOM   HISNSW          ;WE HAVE ALREADY PUT ONE OUT\r
+       JRST    BLOCK2          ;MAKE LISTING HAPPEN RIGHT>\r
+\r
+IFE RENTSW,<\r
+       SYN     CPOPJ,HISEG0\r
+       SYN     CPOPJ,TWSEG0>\r
+\r
+IFN FORMSW,<\r
+ONFORM:        HRRES   HWFMT           ;ALLOW MULTI-FORMAT LISTING\r
+       POPJ    PP,\r
+OFFORM:        HRROS   HWFMT           ;HALF-WORD FORMAT ONLY\r
+       POPJ    PP,     >\r
+\r
+IFE FORMSW,<\r
+       SYN     CPOPJ,ONFORM\r
+       SYN     CPOPJ,OFFORM>\r
+\fHIGHQ:\r
+HIGHQ1:        MOVE    V,LOCO  ;GET ASSEMBLY LOCATION\r
+       SKIPN   MODO            ;IF ASSEMBLY MODE IS ABSOLUTE\r
+       JRST    [CAMLE V,ABSHI  ;RECORED ABS HIGHEST ALSO\r
+               MOVEM V,ABSHI\r
+               POPJ PP,]\r
+IFN RENTSW,<SKIPE      HMIN    ;IS IT A TWO SEGMENT PROGRAM?\r
+       JRST    [CAMGE  V,HMIN  ;YES,IS THIS HIGH SEG.?\r
+               JRST    .+1     ;NO,STORE LOW SEGMENT\r
+               CAMLE   V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?\r
+               MOVEM   V,HHIGH ;YES,REPLACE WITH LARGER VALUE\r
+               POPJ    PP,]>\r
+       CAMLE   V,HIGH          ;IS IT GREATER THAN "HIGH"?\r
+       MOVEM   V,HIGH          ;YES, REPLACE WITH LARGER VALUE\r
+       POPJ    PP,\r
+       \r
+ONML:  TLZA FR,MWLFLG          ;MULTI-WORD LITERALS OK\r
+OFFML: TLO FR,MWLFLG           ;NO\r
+       POPJ PP,\r
+\r
+OFFSYM:        SETOM   IONSYM  ;SUPRESS SYMBOL TABLE LISTING\r
+       POPJ    PP,\r
+\r
+SUPRE0:        PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES\r
+       JRST SUPRE1     ;ERROR\r
+       PUSHJ PP,SSRCH  ;SYMBOL ONLY\r
+       JRST SUPRE1     ;GIVE ERROR MESSAGE\r
+       TLOA ARG,SUPRBT ;SET THE SUPRESS BIT\r
+SUPRE1:        TROA ER,ERRA\r
+       IORM ARG,(SX)   ;PUT BACK\r
+       JUMPCM SUPRE0   ;ANY MORE?\r
+       JRST    SUPRS1\r
+\r
+SUPRSA:        PUSHJ PP,LOOKUP ;SUPRESS ALL\r
+       MOVSI ARG,SUPRBT\r
+       IORM ARG,(SX)\r
+SUPRS1:        SETZM EXTPNT    ;JUST IN CASE WE LOOKED ONE UP\r
+       POPJ PP,\r
+\r
+XPUNG0:        JUMP1   POPOUT\r
+       PUSHJ   PP,LOOKUP\r
+       MOVE    ARG,(SX)        ;GET SYMBOL FLAGS\r
+       TLNN    ARG,INTF!ENTF!EXTF!SPTR\r
+       TLOA    ARG,SUPRBT      ;LOCAL SYMBOL,SO SUPPRESS IT\r
+       SETZM   EXTPNT\r
+       MOVEM   ARG,(SX)        ;RESTORE FLAGS\r
+       POPJ    PP,\r
+\fTITLE0:       JUMP2   REMAR0\r
+       MOVEI   SX,.TBUF\r
+       HRRI    AC0,TBUF\r
+       PUSHJ PP,SUBTT1 ;GO READ IT\r
+       MOVEM   SX,TCNT         ;SAVE COUNT OF CHARS. WRITTEN\r
+       SKIPE   UNIVSN          ;WAS IT A UNIVERSAL?\r
+       PUSHJ   PP,ADDUNV       ;YES  ADD TO TABLE\r
+       TLOE IO,IOTLSN  ;HAVE WE SEEN ONE\r
+IFE CCLSW,<TRO ER,ERRM         ;YES, COMPLAIN>\r
+IFN CCLSW,<TROA        ER,ERRM         ;YES, MESSAGE\r
+       JRST    PRNAM           ;PRINT NAME IF FIRST ONE>\r
+       POPJ    PP,             ;EXIT OTHERWISE\r
+\r
+SUBTT0:        SKIPE   SBUF            ;STORE FIRST SUBTTL ON PASS1\r
+       JUMP1   REMAR0          ;OTHERWISE EXIT IF PASS ONE\r
+       MOVEI   SX,.SBUF\r
+       HRRI    AC0,SBUF\r
+\r
+SUBTT1:        PUSHJ   PP,BYPASS       ;BYPASS LEADING BLANKS\r
+       TLO     IO,IORPTC\r
+SUBTT3:        PUSHJ   PP,CHARAC       ;GET ASCII CHARACTER\r
+       IDPB    C,AC0           ;STORE IN BLOCK\r
+       CAIGE   C,40            ;TEST FOR TERMINATOR\r
+       CAIN    C,HT\r
+       SOJG    SX,SUBTT3       ;TEST FOR BUFFER FULL\r
+       DPB     RC,AC0          ;END, STORE TERMINATOR\r
+       SOJA    SX,CPOPJ        ;COUNT NUL AND EXIT\r
+\r
+IFN CCLSW,<\r
+PRNAM: TLNN IO,CRPGSW  ;NOT IF NOT RPG\r
+       POPJ PP,\r
+       PUSH    PP,AC0          ;SAVE AC0 DMN\r
+       PUSH    PP,RC           ;AND RC\r
+       MOVE AC0,[POINT 7,TBUF]\r
+       MOVE SX,[POINT 7,OTBUF]\r
+       MOVEI RC,6      ;MAX OF SIX CHRS\r
+PN1:   ILDB C,AC0\r
+       CAILE C," "     ;CHECK FOR LEGAL\r
+       CAILE C,"Z"+40  ;CHECK AGAINST LOWER CASE Z\r
+       JRST PN2\r
+       IDPB C,SX       ;PUT IN OUTPUT BUFFER\r
+       SOJG RC,PN1     ;GET MORE\r
+PN2:   MOVEI C,0\r
+       IDPB C,SX       ;TERMINATOR\r
+       TTCALL  3,OTBUF\r
+       TTCALL  3,[ASCIZ /\r
+/]\r
+       POP     PP,RC\r
+       POP     PP,AC0          ;RESTORE AC0 DMN\r
+       POPJ PP,\r
+>\r
+\fSYN0: PUSHJ   PP,GETSYM       ;GET THE FIRST SYMBOL\r
+       JRST    ERRAX           ;ERROR, EXIT\r
+       PUSHJ   PP,MSRCH        ;TRY FOR MACRO/OPDEF\r
+       JRST    SYN3            ;NO,0THRY FOR OPERAND\r
+SYN1:  MOVEI   SX,MSRCH        ;YES, SET FLAG\r
+SYN2:  PUSHJ   PP,SAVEXS       ;SAVE REGISTERS\r
+       JUMPNC  ERRAX           ;ERROR IF NO COMMA\r
+       PUSHJ   PP,GETSYM       ;GET THE SECOND SYMBOL\r
+       POPJ    PP,\r
+       PUSHJ   PP,@SAVBLK+SX   ;SEARCH FOR SECOND SYMBOL\r
+       JFCL\r
+       MOVE    ARG,SAVBLK+ARG  ;GET VALUES\r
+       MOVE    RC,SAVBLK+RC\r
+       MOVE    V,SAVBLK+V\r
+       TLNE    ARG,MACF        ;MACRO?\r
+       PUSHJ   PP,REFINC       ;YES, INCREMENT REFERENCE\r
+       JRST    INSERT          ;INSERT AND EXIT\r
+\r
+SYN3:  PUSHJ   PP,SSRCH        ;SEARCH FOR OPERAND\r
+       JRST    SYN4            ;NOT FOUND, TRY OP CODE\r
+       TLO     ARG,SYNF        ;FLAG AS SYNONYM\r
+       TLNE    ARG,EXTF        ;EXTERNAL?\r
+       HRRZ    V,ARG           ;YES, RELPACE WITH POINTER\r
+       MOVEI   SX,SSRCH        ;SET FLAG\r
+       TLNN ARG,VARF   ;DO NOT LET HIM SYN A VARIABLE\r
+       JRST    SYN2\r
+       JRST ERRAX\r
+\r
+SYN4:  PUSHJ   PP,OPTSCH       ;SEARCH FOR OP-CODE\r
+       JRST    ERRAX           ;NOT FOUND, EXIT WITH ERROR\r
+       MOVSI   ARG,SYNF        ;FLAG AS SYNONYM\r
+       JRST    SYN1\r
+\fPURGE0:       PUSHJ   PP,GETSYM       ;GET A MNEMONIC\r
+       JRST    [TRZ ER,ERRA    ;CLEAR ERROR\r
+               POPJ    PP,]    ;AND RETURN\r
+       PUSHJ   PP,MSRCH        ;SEARCH MACRO SYMBOL TABLE\r
+       JRST    PURGE2          ;NOT FOUND, TRY SYMBOLS\r
+       PUSH    PP,CS           ;SAVE CS AS IT MAY GET GARBAGED\r
+       TLNE    ARG,MACF        ;MACRO?\r
+       PUSHJ   PP,REFDEC       ;YES, DECREMENT THE REFERENCE\r
+       POP     PP,CS\r
+       JRST    PURGE4          ;REMOVE SYMBOL FROM TABLE\r
+\r
+PURGE2:        PUSHJ   PP,SSRCH        ;TRY OPERAND SYMBOL TABLE\r
+       JRST    PURGE5          ;NOT FOUND GET NEXT SYMBOL\r
+       TRNN RC,-2              ;CHECK COMPLEX EXTERNAL\r
+       TLNE RC,-2\r
+       TLNE ARG,SYNF\r
+       JRST    .+2\r
+       JRST PURGE3\r
+       TLNE    ARG,EXTF!UNDF   ;ERROR IF EXTERNAL OR UNDEFINED\r
+       TLNE    ARG,SYNF        ;BUT NOT A SYNONYM\r
+       JRST    PURGE4\r
+PURGE3:        TROA    ER,ERRA         ;NOT FOUND, ERROR\r
+PURGE4:        PUSHJ   PP,REMOVE       ;REMOVE FROM THE SYMBOL TABLE\r
+PURGE5:        JUMPCM  PURGE0\r
+       POPJ    PP,             ;EXIT\r
+\fOPD1: TLNE    ARG,UNDF        ;IF OPDEF IS UNDEFINED\r
+       TRO     ER,ERRO         ;GIVE "O" ERROR\r
+OPD:   MOVE    AC0,V           ;PUT VALUE IN AC0\r
+       JRST    OP\r
+IOP:   MOVSI   AC2,(POINT 9,0(PP),11)\r
+IFE FORMSW,<   TLOA    IO,IOIOPF       ;SET "IOP SEEN" AND SKIP>\r
+IFN FORMSW,<   PUSH    PP,IOFORM       ;USE I/O FORM\r
+       TLO     IO,IOIOPF       ;SET "IOP" SEEN\r
+       JRST    OP+2>\r
+OP:    MOVSI   AC2,(POINT 4,0(PP),12)\r
+IFN FORMSW,<   PUSH    PP,INFORM       ;USE INST. FORM>\r
+       PUSH    PP,RC\r
+       PUSH    PP,AC0          ;STACK CODE \r
+       PUSH    PP,AC2\r
+       PUSHJ   PP,EVALEX       ;EVALUATE FIRST EXPRESSION\r
+       POP     PP,AC2\r
+       JUMPNC  OP2\r
+OP1B:  PUSHJ   PP,GETCHR       ;GET A CHARACTER\r
+IFE FORMSW,<JUMPCM XWD5                ;PROCESS COMMA COMMA IN XWD>\r
+IFN FORMSW,<JUMPNC .+4         ;JUMP IF NO COMMA\r
+       MOVE    AC2,HWFORM      ;GET FORM WORD FOR XWD\r
+       MOVEM   AC2,-2(PP)      ;REPLACE INSTRUCTION FORM\r
+       JRST    XWD5            ;PROCESS COMMA COMMA IN XWD>\r
+       TLO     IO,IORPTC       ;NOT A COMMA,REPEAT IT\r
+       LDB     AC1,AC2\r
+       ADD     AC1,AC0\r
+       DPB     AC1,AC2\r
+       JUMPE   RC,OP1A         ;EXTERNAL OR RELOCATABLE?\r
+       PUSHJ   PP,QEXT         ;YES, DETERMINE WHICH AND FLAG AN ERROR\r
+\r
+OP1A:  PUSHJ   PP,EVALEX       ;GET ADDRESS PART\r
+OP2:   PUSHJ   PP,EVADR        ;EVALUATE STANDARD ADDRESS\r
+OP3:   POP     PP,AC0          ;PUT IN AC0\r
+       POP     PP,RC\r
+IFN FORMSW,<   POP     PP,AC1  ;GET FORM WORD>\r
+       SKIPE   (PP)            ;CAME FROM EVALCM?\r
+       JRST    STOW            ;NO,STOW CODE AND EXIT\r
+       POP     PP,AC1          ;YES,EXIT IMMEDIATELY\r
+       POPJ    PP,\r
+\r
+\fEVADR:                                ;EVALUATE STANDARD ADDRESS\r
+IFE IIISW,<TLNN        AC0,-1          ;OK IF ALL 0'S\r
+       JRST    .+4             ;IT WAS\r
+       TLC     AC0,-1          ;CHANGE ALL ONES TO ZEROS\r
+       TLCE    AC0,-1          ;OK IF ALL 1'S\r
+       TRO     ER,ERRQ         ;NO,FLAG Q ERROR>\r
+       ADD     AC0,-1(PP)      ;ADD ADDRESS PORTIONS\r
+       HLL     AC0,-1(PP)      ;GET LEFT HALF\r
+       TLZE    FR,INDSW        ;INDIRECT BIT?\r
+       TLO     AC0,(Z @)       ;YES, PUT IT IN\r
+       MOVEM   AC0,-1(PP)      ;RE-STACK CODE\r
+       ADD     RC,-2(PP)       ;UPDATE RELOCATION\r
+       HRRM    RC,-2(PP)       ;USE HALF WORD ADD\r
+       CAIE    C,10            ;"("?\r
+       POPJ    PP,             ;NO, EXIT\r
+\r
+       MOVSS   EXTPNT          ;WFW\r
+       PUSHJ   PP,EVALCM       ;EVALUATE\r
+       MOVSS   EXTPNT          ;WFW\r
+       MOVSS   V,AC0           ;SWAP HALVES\r
+IFE IIISW,<MOVSS SX,RC\r
+       IOR     SX,V            ;MERGE RELOCATION\r
+       TRNN    SX,-1           ;RIGHT HALF ZERO?\r
+       JRST    OP2A            ;YES, DO SIMPLE ADD\r
+       MOVE    ARG,RC          ;NO, SWAP RC INTO ARG>\r
+IFN IIISW,<MOVSS ARG,RC>\r
+       ADD     V,-1(PP)        ;ADD RIGHT HALVES\r
+       ADD     ARG,-2(PP)\r
+       HRRM    V,-1(PP)        ;UPDATE WITHOUT CARRY\r
+       HRRM    ARG,-2(PP)\r
+       HLLZS   AC0             ;PREPARE LEFT HALVES\r
+       HLLZS   RC\r
+IFE IIISW,<TLNE        SX,-1           ;IS LEFT HALF ZERO?\r
+       TRO     ER,ERRQ         ;NO FLAG FORMAT ERROR\r
+OP2A:  TLNE    RC,-1           ;RELOCATION FOR LEFT HALF?\r
+       PUSHJ   PP,OP2A1        ;YES,IS IT LEGAL?\r
+       TLNE    AC0,777000      ;OP CODE FIELD USED?\r
+       JRST    [EXCH AC0,-1(PP);YES, GET STORED CODE\r
+               TLNE AC0,777000 ;OP CODE FIELD BEEN SET?\r
+               TRO ER,ERRQ     ;YES, MOST LIKELY AN ERROR\r
+               EXCH AC0,-1(PP)\r
+               JRST    .+1]    ;RETURN TO ADD >\r
+       ADDM    AC0,-1(PP)      ;MERGE WITH PREVIOUS VALUE\r
+       ADDM    RC,-2(PP)\r
+       CAIE    C,11            ;")"?\r
+       JRST    ERRAX           ;NO, FLAG ERROR\r
+                               ;YES, BYPASS PARENTHESIS\r
+BYPASS:\r
+BYPAS1:        PUSHJ   PP,GETCHR\r
+BYPAS2:        JUMPE   C,.-1           ;SKIP TRAILING BLANKS\r
+       POPJ    PP,             ;EXIT\r
+\r
+\fIFE IIISW,<\r
+OP2A1: EXCH    RC,-2(PP)       ;GET STORED CODE\r
+       TLNN    RC,-1           ;OK IF ALL ZERO\r
+       JRST    OP2A2           ;OK SO RETURN\r
+       TLC     RC,-1           ;CHANGE ALL ONES TO ZEROS\r
+       TLCE    RC,-1           ;OK IF ALL ONES\r
+       TRO     ER,ERRQ         ;OTHERWISE A "Q" ERROR\r
+OP2A2: EXCH    RC,-2(PP)       ;GET RC,BACK\r
+       POPJ    PP,             ;AND RETURN>\r
+\r
+\r
+EXPRES:        HRLZ    AC0,RX          ;FUDGE FOR OCT0\r
+\r
+OCT0:  PUSH    PP,RX\r
+       HLR     RX,AC0\r
+OCT1:  PUSHJ   PP,EVALEX       ;EVALUATE\r
+IFN FORMSW,<   MOVE    AC1,HWFORM>\r
+       PUSHJ   PP,STOW         ;STOW CODE\r
+       JUMPCM  OCT1\r
+       POP     PP,RX           ;YES, RESTORE RADIX\r
+       POPJ    PP,             ;EXIT\r
+\fSIXB10:       MOVSI   RC,(POINT 6,AC0)        ;SET UP POINTER\r
+       MOVEI   AC0,0           ;CLEAR WORD\r
+\r
+SIXB20:        PUSHJ   PP,CHARL        ;GET NEXT CHARACTER\r
+       CAMN    C,SX            ;IS THIS PRESET DELIMITER?\r
+IFE FORMSW,<   JRST    ASC60           ;YES>\r
+IFN FORMSW,<\r
+       JRST    [PUSHJ  PP,BYPAS1\r
+               ANDCM   RC,STPX\r
+               MOVE    AC1,SXFORM\r
+               JUMPGE  RC,STOWZ\r
+               POPJ    PP,]>\r
+       CAIL C,"A"+40\r
+       CAILE C,"Z"+40\r
+       JRST    .+2\r
+       TRZA    C,100           ;CONVERT LOWER CASE TO SIXBIT\r
+       SUBI    C,40            ;CONVERT TO SIXBIT\r
+       JUMPL   C,ASC55         ;TEST FOR INVALID CHARACTER\r
+       IDPB    C,RC            ;NO, DEPOSIT THE BYTE\r
+       TLNE    RC,770000       ;IS THE WORD FULL?\r
+       JRST    SIXB20          ;NO, GET NEXT CHARACTER\r
+IFN FORMSW,<   MOVE    AC1,SXFORM      ;SIXBIT FORM>\r
+       PUSHJ   PP,STOWZ        ;YES, STORE\r
+       JRST    SIXB10          ;GET NEXT WORD\r
+\fASCII0:       HLLZ    SDEL,AC0        ;STORE ASCII/ASCIZ FLAG\r
+ASC10: PUSHJ   PP,CHARL        ;GET FIRST NON-BLANK\r
+       CAIE    C," "\r
+       CAIN    C,HT\r
+       JRST    ASC10\r
+       CAIG C,CR               ;CHECK FOR CRRET AS DELIM\r
+       CAIGE C,LF\r
+       SKIPA   SX,SEQNO2\r
+       JRST ERRAX\r
+       MOVEM SX,TXTSEQ         ;SAVE SEQ AND PAGE\r
+       MOVE SX,PAGENO\r
+       MOVEM SX,TXTPG\r
+       SETOM INTXT\r
+       MOVE    SX,C            ;SAVE FOR COMPARISON\r
+       JUMPG   SDEL,SIXB10     ;BRANCH IF SIXBIT\r
+\r
+ASC20: MOVSI   RC,(POINT 7,AC0)        ;SET UP POINTER\r
+       TLNE    SDEL,200000     ;THIS BIT (AND BIT0) IN FOR COMMENT\r
+       MOVSI RC,440000         ;SO NOTHING WILL BE DEPOSITED\r
+IFE IIISW,<MOVEI AC0,0         ;CLEAR WORD>\r
+IFN IIISW,<TLNE        SDEL,100000     ;ASCID?\r
+       TLZA    SDEL,400000     ;YES, ZERO ASCIZ BIT\r
+       TDZA    AC0,AC0         ;NO, ZERO WORD\r
+       MOVE    AC0,[BYTE (7) 10,10,10,10,10 (1) 1]     ;YES, A WORD FULL OF BACKSPACES>\r
+ASC30: PUSHJ   PP,CHARL        ;GET ASCII CHARACTER AND LIST\r
+       CAMN    C,SX            ;TEST FOR DELIMITER\r
+       JRST    ASC50           ;FOUND\r
+       IDPB    C,RC            ;DEPOSIT BYTE\r
+       TLNE    RC,760000       ;HAVE WE FINISHED WORD?\r
+       JRST    ASC30           ;NO,GET NEXT CHARACTER\r
+IFN FORMSW,<   MOVE    AC1,ASCIIF      ;USE ASCII FORM WORD>\r
+       PUSHJ   PP,STOWZ        ;YES, STOW IT\r
+       JRST    ASC20           ;GET NEXT WORD\r
+\r
+ASC55: TDZA    CS,CS           ;ZERO CS IN CASE NESTED\r
+ASC50: TDZA    RC,SDEL         ;TEST FOR ASCIIZ\r
+       TROA    ER,ERRA         ;SIXBIT ERROR EXIT\r
+ASC60: PUSHJ   PP,BYPAS1       ;POLISH OFF TERMINATOR\r
+       SETZM INTXT     ;WE ARE OUT OF IT\r
+IFN FORMSW,<   MOVE    AC1,ASCIIF      ;USE ASCII FORM WORD>\r
+IFN IIISW,<TLNN        SDEL,100000     ;NO EXTRA WORDS FOR ASCID>\r
+       ANDCM   RC,STPX         ;STORE AT LEAST ONE WORD\r
+       TLNN SDEL,200000        ;GET OUT WITHOUT STORING\r
+       JUMPGE  RC,STOWZ        ;STOW\r
+       POPJ    PP,             ;ASCII, NO BYTES STORED, SO EXIT\r
+\fPOINT0:\r
+IFN FORMSW,<   PUSH    PP,BPFORM       ;USE BYTE POINTER FORM WORD>\r
+       PUSH    PP,RC           ;STACK REGISTERS\r
+       PUSH    PP,AC0\r
+       PUSHJ   PP,EVAL10       ;EVALUATE RADIX 10\r
+       DPB     AC0,[POINT 6,0(PP),11]  ;STORE BYTE SIZE\r
+       JUMPNC  POINT2\r
+       PUSHJ   PP,EVALEX       ;NO, GET ADDRESS\r
+       PUSHJ   PP,EVADR        ;EVALUATE STANDARD ADDRESS\r
+       JUMPNC  POINT2\r
+       PUSHJ   PP,EVAL10       ;EVALUATE RADIX 10\r
+       TLNE    IO,NUMSW        ;IF NUMERIC\r
+       TDCA    AC0,[-1]        ;POSITION=D35-RHB\r
+POINT2:        MOVEI   AC0,0           ;OTHERWISE SET TO D36\r
+       ADDI    AC0,^D36\r
+       LSH     AC0,^D30\r
+       ADDM    AC0,0(PP)       ;UPDATE VALUE\r
+       JRST    OP3\r
+\fXWD0:\r
+IFN FORMSW,<   PUSH    PP,HWFORM       ;USE HALF WORD FORM>\r
+       PUSH    PP,RC\r
+       PUSH    PP,AC0          ;STORE ZERO ON STACK\r
+       PUSHJ   PP,EVALEX       ;EVALUATE EXPRESSION\r
+       JUMPNC  OP2\r
+XWD5:  SKIPN   (PP)            ;ANY CODE YET?\r
+       JRST    XWD10           ;NO,USE VALUE IN AC0\r
+       JUMPE   AC0,.+2         ;ANYTHING IN AC0?\r
+       TRO     ER,ERRQ         ;YES,FLAG "Q"ERROR\r
+       MOVE    AC0,(PP)        ;USE PREVIOUS VALUE\r
+       MOVE    RC,-1(PP)       ;AND RELOCATION\r
+XWD10: HRLZM   AC0,0(PP)       ;SET LEFT HALF\r
+       HRLZM   RC,-1(PP)\r
+       MOVSS EXTPNT    ;WFW\r
+       JRST    OP1A            ;EXIT THROUGH OP\r
+\r
+IOWD0: PUSHJ   PP,EVALXQ       ;EVALUATE AND TEST FOR EXTERNAL\r
+       CAIE    C,14            ;","?\r
+       JRST    [SKIPN  AC0     ;IF NZERO AND NO "," SEEN\r
+               TRO ER,ERRQ     ;TREAT AS Q ERROR\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE HALF WORD FORM>\r
+               SOJA AC0,STOW]  ;NO, TREAT AS RIGHT HALF\r
+       PUSH    PP,AC0          ;YES, STACK LEFT HALF\r
+       PUSHJ   PP,EVALEX       ;WFW\r
+       SUBI    AC0,1\r
+       POP     PP,AC1          ;RETRIEVE LEFT HALF\r
+       MOVNS   AC1\r
+       HRL     AC0,AC1\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE HALF WORD FORM>\r
+       JRST    STOW            ;STOW CODE AND EXIT\r
+\fBYTE0:        PUSHJ   PP,BYPASS       ;GET FIRST NON-BLANK\r
+       CAIE    C,10            ;"("?\r
+       JRST    ERRAX           ;NO, FLAG ERROR AND EXIT\r
+IFN FORMSW,<\r
+       PUSH    PP,[1]\r
+       MOVEI   AC0,0\r
+>\r
+       PUSH    PP,RC\r
+       PUSH    PP,AC0          ;INITIALIZE STACK TO ZERO\r
+       MOVSI   ARG,(POINT -1,(PP))\r
+\r
+BYTE1: PUSH    PP,ARG\r
+       PUSHJ   PP,EVAL10       ;EVALUATE RADIX 10\r
+       POP     PP,ARG\r
+       CAIG    AC0,^D36        ;TEST SIZE\r
+       JUMPGE  AC0,.+2\r
+       TRO     ER,ERRA\r
+       DPB     AC0,[POINT 6,ARG,11]    ;STORE BYTE SIZE\r
+\r
+BYTE2: IBP     ARG             ;INCREMENT BYTE\r
+       TRZN    ARG,-1          ;OVERFLOW?\r
+       JRST    BYTE3           ;NO\r
+       SETZB   AC0,RC          ;YES\r
+       EXCH    AC0,0(PP)       ;GET CURRENT VALUES\r
+       EXCH    RC,-1(PP)       ;AND STACK ZEROS\r
+IFN FORMSW,<\r
+       MOVE    AC1,HWFORM      ;USE STANDARD FORM\r
+       EXCH    AC1,-2(PP)      ;GET FORM WORD\r
+>\r
+       PUSHJ   PP,STOW         ;STOW FULL WORD\r
+\r
+BYTE3: PUSH    PP,ARG\r
+       PUSHJ   PP,EVALEX       ;COMPUTE NEXT BYTE\r
+       POP     PP,ARG\r
+       DPB     AC0,ARG         ;STORE BYTE\r
+       HLLO    AC0,ARG\r
+       DPB     RC,AC0          ;STORE RELOCATION\r
+\r
+IFN FORMSW,<\r
+       MOVEI   AC0,1\r
+       HRRI    ARG,-2\r
+       DPB     AC0,ARG         ;STORE FORM BYTE\r
+       HRRI    ARG,0\r
+>\r
+       JUMPCM  BYTE2\r
+       CAIN    C,10            ;"("?\r
+       JRST    BYTE1           ;YES, GET NEW BYTE SIZE\r
+       JRST    OP3             ;NO, EXIT\r
+\fRADX50:       PUSHJ   PP,EVALEX       ;EVALUATE CODE\r
+       JUMPN   RC,ERRAX                ;ERROR IF NOT ABSOLUTE\r
+       MOVE    ARG,AC0\r
+       JUMPNC  ERRAX\r
+       PUSHJ   PP,GETSYM       ;YES, GET SYMBOL\r
+       TRZ     ER,ERRA         ;CLEAR ERROR\r
+       PUSHJ   PP,SQOZE        ;SQUOZE SIXBIT AND ADD CODE\r
+IFN FORMSW,<   MOVE    AC1,HWFORM      ;USE STANDARD FORM>\r
+       JRST    STOW            ;STOW CODE AND EXIT\r
+\r
+\r
+SQOZE: MOVE    AC1+1,AC0       ;PUT SIXBIT IN AC1+1\r
+       MOVEI   AC0,0           ;CLEAR RESULT\r
+SQOZ1: MOVEI   AC1,0\r
+       LSHC    AC1,6           ;PUT 6-BIT CHARACTER IN AC1\r
+       LDB     AC1,[POINT 6,CSTAT(AC1),23]     ;CONVERT TO RADIX50\r
+       IMULI   AC0,50          ;MULTIPLY PREVIOUS RESULT\r
+       ADD     AC0,AC1         ;ADD NEW CHARACTER\r
+       JUMPN   AC1+1,SQOZ1     ;TEST FOR END\r
+       LSH     ARG,^D30        ;LEFT-JUSTIFY CODE\r
+       IOR     AC0,ARG         ;MERGE WITH RESULT\r
+       POPJ    PP,\r
+\fREPEAT 0,<    EXPLANATION OF ARRAY AND LVAR FEATURES\r
+\r
+WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY\r
+THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD)\r
+IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS\r
+ASSIGNED BY THE VAR PSEUDO OP.\r
+\r
+WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE\r
+FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS\r
+LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE\r
+VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER\r
+(RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS\r
+TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS:\r
+WORD 1:        LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS\r
+       RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS\r
+WORD 2:        0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS\r
+               WHICH HAVE THE SYMBOL NAME HERE\r
+WORD 3:        THE LOCATION RELATIVE TO THE START OF THE LOW CORE\r
+               VARIABLES\r
+\r
+CORE FIXUP BLOCKS ARE SET UP BY BOUT\r
+\r
+WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN\r
+       LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE\r
+       FIXUP IS DONE\r
+WORD 2:        POINTER TO A FIXUP CHAIN FOR RIGHT HALVES\r
+       LEFT HALF IS RELOCATION RH IS ADDRESS\r
+WORD 3:        SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS\r
+\r
+NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF.\r
+SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED\r
+\r
+SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT\r
+AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE\r
+NOT CHAINED.\r
+\r
+WORD 1:        RH LINK TO NEXT BLOCK\r
+       LH 0\r
+WORD 2:        RADIX50 FOR THE SYMBOL\r
+WORD 3:        200000,,0 IF RH FIXUP\r
+       600000,,0 IF LH FIXUP\r
+\r
+SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF\r
+ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD\r
+\fOF A 2 WORD BLOCK\r
+\r
+WORD 1:        LINK TO 2ND WORD OF NEXT BLOCK 0 IF END\r
+WORD 2:        RH POINTER TO A HEADER BLOCK\r
+       LH GARBAGE\r
+\r
+FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS\r
+WORD 1:        THE PROGRAM BREAK (AS BLOCK TYPE 5)\r
+WORD 2:        THE NUMBER OF LOCATION USED FOR VARIABLES IN THE\r
+       LOW SEGMENT+1\r
+\r
+REMAINING WORDS COME IN PAIRS AS FOLLOWS:\r
+1ST WORD       BIT 0=0 RH FIXUP\r
+               BIT 0=1 LH FIXUP\r
+               BIT 1=0 CORE FIXUP\r
+                       WORD 2 LH POINTER TO CHAIN\r
+                       WORD 2 RH VALUE\r
+               BIT 1=1 SYMBOL FIXUP\r
+                       WORD 1 RH VALUE\r
+                       WORD 2 SYMBOL\r
+>\r
+\r
+REPEAT 0,<     EXPLANATION OF ICC FEATURES\r
+\r
+       IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT\r
+       IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:-\r
+\r
+       IF INSTRUCTION          BYTE 9,4,1,4,18\r
+       IF I/O INSTRUCTION      BYTE 3,7,3,1,4,18\r
+       IF BYTE POINTER         BYTE 6,6,2,4,18\r
+       IF ASCII                BYTE 7,7,7,7,7\r
+       IF SIXBIT               BYTE 6,6,6,6,6,6\r
+\r
+       ALL OTHERS ARE STANDARD HALF WORD\r
+\r
+       THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH\r
+       STANDARD HALF WORD FORM IS THEN USED.\r
+       HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE\r
+       TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE\r
+       >\r
+\fIFN WFWSW,<\r
+%INTEG:        PUSHJ PP,GETSYM ;GET A SYMBOL\r
+       JRST INTG2      ;BAD SYMBOL ERROR\r
+       TLO IO,DEFCRS   ;THIS IS A DEFINTION\r
+       PUSHJ PP,SSRCH  ;SEE IF THERE\r
+       MOVSI ARG,SYMF!UNDF     ;SET SYMBOL AND UNDEFINED IF NOT\r
+       TLNN ARG,UNDF   ;IF ALREADY DEFINED\r
+       JRST INTG1      ;JUST IGNORE\r
+       TLOA ARG,VARF   ;SET VARIABLE FLAG\r
+INTG2: TROA ER,ERRA    ;SYMBOL ERROR\r
+       PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1)\r
+INTG1: JUMPCM %INTEG\r
+       POPJ PP,\r
+\r
+%ARAY: MOVEM PP,ARAYP  ;SAVE PUSHDOW POINTER\r
+ARAY2: PUSHJ PP,GETSYM\r
+       JRST ARAY1      ;BAD SYMBOL GIVE ERROR AND ABORT\r
+       PUSH PP,AC0     ;SAVE NAME\r
+       JUMPCM ARAY2    ;AND GO ON IF A COMMA\r
+       CAIE C,"["-40   ;MUST BE A [\r
+       JRST ARAY1\r
+       PUSHJ PP,BYPASS ;OH, WELL\r
+       TLO IO,IORPTC\r
+       PUSHJ PP,EVALXQ ;GET A SIZE\r
+       CAIE C,"]"-40   ;MUST END RIGHT\r
+       JRST ARAY1\r
+       PUSHJ PP,BYPASS ;??\r
+       HRRZ V,AC0      ;GET VALUE\r
+       SUBI V,1\r
+NXTVAL:        POP PP,AC0\r
+       PUSH PP,V       ;SAVE OVER SEARCH\r
+       TLO IO,DEFCRS\r
+       PUSHJ PP,SSRCH  ;FIND IT\r
+       MOVSI ARG,SYMF!UNDF\r
+       POP PP,V        ;GET VALUE BACK\r
+       TLNN ARG,UNDF\r
+       JRST ARAY3\r
+       TLO ARG,VARF\r
+       MOVEI RC,0      ;NO RELOC\r
+       PUSHJ PP,INSERT\r
+ARAY3: CAME PP,ARAYP\r
+       JRST NXTVAL     ;STILL NAMES STACKED\r
+       JUMPCM ARAY2\r
+       POPJ PP,\r
+\r
+ARAY1: TRO ER,ERRA     ;ERROR EXIT\r
+       MOVE PP,ARAYP\r
+       POPJ PP,        ;RESET PDL AND GO\r
+>\r
+\fIFN WFWSW,<\r
+%LVAR: JUMP2 POPOUT    ;IGNORE ON PASS2\r
+       PUSHJ PP,LOOKUP ;SCAN SYMBOL TABLE\r
+       TRNN ARG,EXTF   ;THESE ARE LVARS WE HAVE DONE ONCE\r
+       TRNN ARG,VARF   ;FOR VARIABLES\r
+       POPJ PP,        ;IGNORE ALL OTHERS\r
+       TRZ ARG,UNDF    ;SET AS DEFINED\r
+       MOVEI RC,3\r
+       ADDB RC,FREE\r
+       CAML RC,SYMBOL  ;GET BLOCK\r
+       PUSHJ PP,XCEEDS\r
+       SUBI RC,2       ;POINT TO START OF BLOCK\r
+       ADDI V,1\r
+       EXCH V,LVARLC   ;GET CORRECT VARIABLE LOCATION\r
+       MOVEM V,2(RC)   ;SAVE IT\r
+       ADDM V,LVARLC   ;AND UPDATE BASE\r
+       SETZM (RC)\r
+       SETZM 1(RC)     ;NO NAME TO IDENT AN LVAR AND NO FIXUPS\r
+       HRL ARG,RC      ;POINTER\r
+       TRO ARG,EXTF!PNTF       ;FLAG AS EXTERNAL AND POINTER\r
+       MOVSM ARG,(SX)  ;PUT IT AWAY\r
+       POPJ PP,\r
+>\r
+\f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY\r
+\r
+; HERE IF PRGEND (PASS 1)\r
+PSEND0:        TLO     IO,MFLSW        ;PSEND SEEN\r
+       PUSHJ   PP,END0         ;AS IF END STATEMENT\r
+       HLLZS   IO              ;CLEAR ER(RH)\r
+       SETZM   ERRCNT          ;CLEAR ERROR COUNT FOR EACH PROG.\r
+       JUMP2   PSEND2          ;DIFFERENT ON PASS2\r
+       SKIPE   UNIVSN          ;SEEN A UNIVERSAL\r
+       PUSHJ   PP,UNISYM       ;YES, STORE SYMBOLS\r
+       PUSHJ   PP,PSEND4       ;SAVE SYMBOLS, POINTERS AND TITLE\r
+       TLZ     IO,IOTLSN       ;CLEAR TITLE SEEN FLAG\r
+PSEND1:        TLZ     IO,MFLSW         ;FOR NEXT FILE\r
+       SETZM   UNISCH          ;CLEAR UNIVERSAL SEARCH TABLE\r
+       MOVE    AC0,[UNISCH,,UNISCH+1]\r
+       BLT     AC0,UNISCH+.UNIV-1\r
+       PUSHJ   PP,OUTFF        ;RESET PAGE COUNT\r
+       MOVSI   AC0,1           ;SET SO RELOC 0 WORKS\r
+       JRST    LOC10           ;FOR RELOC 0\r
+\r
+; HERE IF PRGEND (PASS 2)\r
+PSEND2:        SETZM   SBUF            ;SO SUBTTL IS NOT WRONG\r
+       PUSHJ   PP,PSEND5       ;PUT TITLE BACK\r
+       PUSHJ   PP,PSEND1       ;COMMON  CODE\r
+       JRST    PASS20          ;OUTPUT THE ENTRIES\r
+\r
+; HERE IF END (PASS 1)\r
+PSEND3:        PUSHJ   PP,PSEND4       ;SAVE LAST PROGRAM \r
+       HLRS    PRGPTR          ;REINITIALIZE POINTER\r
+       PUSHJ   PP,PSEND5       ;READ BACK FIRST PROGRAM\r
+       JRST    PASS20\r
+\f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS\r
+       XTRA==4                 ;NUMBER OF OTHER LOCATIONS TO SAVE\r
+\r
+PSEND4:        MOVE    V,FREE          ;GET  NEXT FREE LOCATION\r
+       ADDI    V,LENGTH+.TBUF/5+XTRA\r
+       CAML    V,SYMBOL        ;WILL WORST CASE FIT?\r
+       PUSHJ   PP,XCEED        ;NO, EXPAND\r
+       MOVS    V,FREE\r
+       HRR     V,PRGPTR        ;LAST PRGEND BLOCK\r
+       HLRM    V,(V)           ;LINK THIS BLOCK\r
+       SKIPN   PRGPTR          ;IF FIRST TIME\r
+       HLLZM   V,PRGPTR        ;SET LINK TO START OF CHAIN\r
+       HLRM    V,PRGPTR        ;POINTER TO IT\r
+       SETZM   @FREE           ;CLEAR LINK WORD\r
+       AOS     FREE            ;THIS LOCATION USED NOW\r
+       MOVS    AC0,SYMBOL      ;BOTTOM OF SYMBOL TABLE\r
+       HRR     AC0,FREE        ;FREE SPACE\r
+       MOVE    V,@SYMBOL       ;GET NUMBER OF SYMBOLS\r
+       ASH     V,1             ;TWO WORDS PER SYMBOL\r
+       ADDI    V,1             ;ONE MORE FOR COUNT\r
+       ADDB    V,FREE          ;END OF TABLE WHEN MOVED\r
+       BLT     AC0,(V)         ;MOVE TABLE\r
+       HRRZ    AC0,JOBREL      ;TOP OF CORE\r
+       SUBI    AC0,1\r
+       MOVEM   AC0,SYMTOP      ;FOR NEXT SYMBOL TABLE\r
+       SUBI    AC0,LENGTH      ;LENGTH OF INITIAL SYMBOLS\r
+       MOVEM   AC0,SYMBOL      ;SET POINTER TO COUNT OF SYMBOLS\r
+       HRLI    AC0,SYMNUM      ;BLT POINTER\r
+       BLT     AC0,@SYMTOP     ;SET UP INITIAL SYMBOL TABLE\r
+       PUSHJ   PP,SRCHI        ;SET UP SEARCH POINTER\r
+       MOVEI   AC0,.TBUF       ;MAX NUMBER OF CHARS. IN TITLE\r
+       SUB     AC0,TCNT        ;ACTUAL NUMBER\r
+       IDIVI   AC0,5           ;NUMBER OF WORDS\r
+       SKIPE   AC1             ;REMAINDER?\r
+       ADDI    AC0,1           ;YES\r
+       MOVEM   AC0,@FREE       ;STORE COUNT\r
+       AOS     FREE            ;THIS LOCATION USED NOW\r
+       EXCH    AC0,FREE        ;SET UP AC0 FOR BLT\r
+       ADDM    AC0,FREE        ;WILL BE AFTER TITLE MOVES\r
+       HRLI    AC0,TBUF        ;BLT POINTER\r
+       BLT     AC0,@FREE       ;MOVE TITLE\r
+       MOVE    AC2,LITHDX      ;POINTER TO LIT INFO.\r
+       MOVE    AC0,-1(AC2)     ;SIZE OF PASS1 LOCO\r
+       PUSHJ   PP,STORIT       ;SAVE IT IN SYMBOL TABLE\r
+       MOVE    AC2,VARHDX      ;SAME FOR VARS\r
+       MOVE    AC0,-1(AC2)\r
+       PUSHJ   PP,STORIT\r
+IFN RENTSW,<\r
+       MOVE    AC0,HISNSW      ;GET TWOSEG/HISEG FLAG\r
+       HRR     AC0,HIGH1       ;AND PASS1 BREAK\r
+       PUSHJ   PP,STORIT\r
+       JUMPGE  AC0,PSEND6      ;NOT TWOSEG\r
+       MOVE    AC0,SVTYP3      ;HIGH SEGMENT OFFSET\r
+       PUSHJ   PP,STORIT       ;SAVE IT ALSO>\r
+PSEND6:        MOVE    AC0,FREE        ;GET NEXT FREE LOCATION\r
+       SUBI    AC0,1           ;LAST ONE USED\r
+       HRRZ    V,PRGPTR        ;POINTER TO START OF DATA BLOCK\r
+       HRLM    AC0,(V)         ;LINK TO END OF BLOCK\r
+       POPJ    PP,             ;RETURN\r
+\r
+\fPSENDX:       PUSHJ   PP,XCEED        ;NEED TO EXPAND CORE FIRST\r
+PSEND5:        HRRZ    AC0,JOBREL      ;GET TOP OF CORE\r
+       SUBI    AC0,1\r
+       MOVEM   AC0,SYMTOP      ;TOP OF NEW SYMBOL TABLE\r
+       HRRZ    V,PRGPTR        ;ADDRESS OF THIS BLOCK\r
+       JUMPE   V,PSNDER        ;ERROR LINK NOT SET UP\r
+       MOVE    AC1,(V)         ;NEXT LINK\r
+       MOVE    V,1(V)          ;GET ITS SYMBOL COUNT\r
+       ASH     V,1             ;NUMBER OF WORDS\r
+       ADDI    V,1             ;PLUS ONE FOR COUNT\r
+       SUBI    AC0,(V)         ;START OF NEW SYMBOL TABLE\r
+       CAMG    AC0,FREE        ;WILL IT FIT\r
+       JRST    PSENDX          ;NO, NEED TO EXPAND AND RESET AC0\r
+       ADD     V,PRGPTR        ;POINT TO END OF SYMBOL TABLE\r
+       MOVEI   V,1(V)          ;THEN TO BEG OF TITLE\r
+       MOVEM   AC0,SYMBOL      ;BOTTOM OF NEW TABLE\r
+       HRL     AC0,PRGPTR      ;ADDRESS OF FIRST WORD OF BLOCK\r
+       ADD     AC0,[1,,0]      ;MAKE BLT POINTER\r
+       HRRM    AC1,PRGPTR      ;POINT TO NEXT BLOCK\r
+       BLT     AC0,@SYMTOP     ;MOVE TABLE\r
+       PUSHJ   PP,SRCHI        ;SET UP POINTER\r
+       MOVE    AC1,(V)         ;NUMBER OF WORDS OF TITLE\r
+       MOVEI   AC0,1(V)        ;START OF STORED TITLE\r
+       ADD     V,AC1           ;INCREMENT PAST TITLE\r
+       ADDI    AC1,TBUF-1      ;END OF TITLE\r
+       HRLI    AC0,TBUF        ;WHERE TO PUT IT\r
+       MOVSS   AC0             ;BLT POINTER\r
+       BLT     AC0,(AC1)       ;MOVE TITLE\r
+       TLO     IO,IOTLSN       ;SET AS IF TITLE SEEN\r
+       MOVE    AC2,LITHDX      ;INVERSE OF ABOVE\r
+       PUSHJ   PP,GETIT\r
+       MOVEM   AC0,-1(AC2)\r
+       MOVE    AC2,VARHDX      ;SAME FOR VARS\r
+       PUSHJ   PP,GETIT\r
+       MOVEM   AC0,-1(AC2)\r
+IFN RENTSW,<\r
+       PUSHJ   PP,GETIT        ;GET TWO HALF WORDS\r
+       HRRZM   AC0,HIGH1       ;PASS1 BREAK\r
+       HLLEM   AC0,HISNSW      ;TWOSEG/HISEG FLAG\r
+       JUMPGE  AC0,CPOPJ       ;NOT TWOSEG\r
+       PUSHJ   PP,GETIT\r
+       MOVEM   AC0,SVTYP3      ;BLOCK 3 WORD>\r
+       POPJ    PP,\r
+\r
+STORIT:        MOVEM   AC0,@FREE       ;STORE IT IN DATA BLOCK\r
+       AOS     FREE            ;ADVANCE POINTER\r
+       POPJ    PP,\r
+\r
+GETIT: MOVE    AC0,1(V)        ;FILL AC0 OUT OF PRGEND BLOCK\r
+       AOJA    V,CPOPJ         ;INCREMENT AND RETURN\r
+\r
+PSNDER:        HRROI   RC,[SIXBIT      /PRGEND ERROR @/]\r
+       JRST    ERRFIN\r
+\f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS\r
+\r
+UNIV0: JUMP2   TITLE0          ;DO IT ALL ON PASS 1\r
+       HRRZ    SX,UNIVNO       ;GET NUMBER OF UNIVERSALS SEEN\r
+       CAIL    SX,.UNIV        ;ALLOW ONE MORE?\r
+       JRST    UNVERR          ;NO, GIVE FATAL ERROR\r
+       AOS     UNIVNO          ;ONE MORE NOW\r
+       SETOM   UNIVSN          ;AND SET SEEN A UNIVERSAL\r
+       JRST    TITLE0          ;CONTINUE AS IF TITLE\r
+\r
+\r
+ADDUNV:        PUSH    PP,RC           ;AN AC TO USE\r
+       PUSHJ   PP,NOUT         ;CONVERT TO SIXBIT\r
+       HRRZ    RC,UNIVNO       ;GET ENTRY INDEX\r
+       MOVEM   AC0,UNITBL(RC)  ;STORE SIXBIT NAME IN TABLE\r
+       HRRZS   UNIVSN          ;ONLY DO IT ONCE\r
+       POP     PP,RC           ;RESTORE RC\r
+       POPJ    PP,             ;AND RETURN\r
+\r
+UNVERR:        HRROI   RC,[SIXBIT /TOO MANY UNIVERSALS@/]\r
+       JRST    ERRFIN\r
+\r
+UNISYM:        HRRZ    AC0,FREE        ;GET HIGHEST FREE LOCATION\r
+       MOVEM   AC0,JOBFF       ;INTO JOBFF\r
+       PUSHJ   PP,SUPRSA       ;TURN ON SUPPRESS BIT\r
+       PUSH    PP,SYMBOL       ;NEED TO SAVE INCASE PRGEND\r
+       MOVE    AC0,SYMTOP      ;TOP OF TABLE\r
+       SUB     AC0,SYMBOL      ;GET LENGTH OF TABLE\r
+       HRL     ARG,SYMBOL      ;BOTTOM OF TABLE\r
+       HRR     ARG,JOBFF       ;WHERE TO GO\r
+       HRRZ    RC,UNIVNO       ;GET TABLE INDEX\r
+       HRRM    ARG,SYMBOL      ;WILL BE THERE SOON\r
+       HRRZM   ARG,UNIPTR(RC)  ;STORE IN CORRESPONDING PLACE\r
+       ADDB    AC0,JOBFF       ;WHERE TO END\r
+       HRLM    AC0,UNIPTR(RC)  ;SAVE NEW SYMTOP\r
+       BLT     ARG,@JOBFF      ;MOVE TABLE\r
+       HRRZM   AC0,UNITOP      ;SAVE TOP OF TABLES+1\r
+       CAMLE   AC0,MACSIZ      ;IN CASE OVER A K BOUND\r
+       MOVEM   AC0,MACSIZ      ;DON'T REDUCE SO FAR NOW\r
+       MOVEM   AC0,FREE        ;JUST IN CASE IN MACRO\r
+       MOVE    AC0,SRCHX       ;SAVE OLD SEARCH POINTER\r
+       PUSHJ   PP,SRCHI        ;GET SEARCH POINTER\r
+       EXCH    AC0,SRCHX\r
+       MOVEM   AC0,UNISHX(RC)  ;SAVE IT\r
+       SETZM   UNIVSN          ;CLEAR FLAG INCASE PRGEND\r
+       POP     PP,SYMBOL       ;RESTORE OLD VALUE\r
+       POPJ    PP,             ;RETURN\r
+\r
+\fSERCH0:       PUSHJ   PP,GETSYM       ;GET A SYMBOL\r
+       JRST    ERRAX           ;ERROR IF NOT VALID\r
+       MOVEI   RC,1            ;START AT ENTRY ONE\r
+       CAIL    RC,.UNIV        ;CHECK FOR CONSISTENCY ERROR\r
+       JRST    SCHERR          ;CANNOT FIND THIS ONE\r
+       CAME    AC0,UNITBL(RC)  ;LOOK FOR MATCH\r
+       AOJA    RC,.-3          ;NOT FOUND YET\r
+       MOVE    AC0,RC          ;STORE TABLE ENTRY NUMBER\r
+       MOVEI   RC,1            ;START AT ENTRY ONE\r
+       CAIL    RC,.UNIV        ;CHECK FOR CONSISTENCY ERROR\r
+       JRST    SCHERR          ;SHOULD NEVER HAPPEN!!\r
+       SKIPE   UNISCH(RC)      ;LOOK FOR AN EMPTY SLOT\r
+       AOJA    RC,.-3          ;NOT FOUND YET\r
+       MOVEM   AC0,UNISCH(RC)  ;STORE INDEX IN TABLE\r
+       JUMPCM  SERCH0          ;LOOK FOR MORE NAMES\r
+       POPJ    PP,             ;FINISHED\r
+\r
+SCHERR:        MOVSI   RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]\r
+       JRST    ERRFIN          ;NAME IN AC0\r
+\r
+;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL\r
+UNIERR:        HRROI   RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]\r
+       JRST    ERRFIN\r
+\fSUBTTL        MACRO/REPEAT HANDLERS\r
+\r
+REPEA0:        PUSHJ   PP,EVALXQ       ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.\r
+       JUMPNC  ERRAX\r
+\r
+REPEA1:        JUMPLE  AC0,REPZ        ;PASS THE EXP., DONT PROCESS\r
+       SOJE    AC0,REPO        ;REPEAT ONCE\r
+REPEA2:        PUSHJ   PP,GCHARQ       ;GET STARTING "<"\r
+       CAIE    C,"<"\r
+       JRST    REPEA2\r
+       PUSHJ   PP,SKELI1       ;INITIALIZE SKELETON\r
+       PUSH    MP,REPEXP\r
+       MOVEM   AC0,REPEXP\r
+       PUSH    MP,REPPNT       ;STACK PREVIOUS REPEAT POINTER\r
+       MOVEM   ARG,REPPNT      ;STORE NEW POINTER\r
+       TDZA    SDEL,SDEL       ;YES, INITIALIZE BRACKET COUNT AND SKIP\r
+\r
+REPEA4:        PUSHJ   PP,WCHARQ       ;WRITE A CHARACTER\r
+       PUSHJ   PP,GCHARQ       ;GET A CHARACTER\r
+       CAIN    C,"<"           ;"<"?\r
+       AOJA    SDEL,REPEA4     ;YES, INCREMENT AND WRITE\r
+       CAIE    C,">"           ;">"?\r
+       JRST    REPEA4          ;NO, WRITE THE CHARACTER\r
+       SOJGE   SDEL,REPEA4     ;YES, WRITE IF NON-NEGATIVE COUNT\r
+       MOVSI   CS,(BYTE (7) 177,3)     ;SET "REPEAT" END\r
+       PUSHJ   PP,WWRXE        ;WRITE END\r
+       SKIPN   LITLVL          ;LITERAL MIGHT END ON LINE\r
+       SKIPE   MACLVL          ;IF IN MACRO DARE NOT PROCESS\r
+       JRST    .+3             ;REST OF LINE SINCE MACRO MIGHT END ON IT\r
+       PUSHJ   PP,BYPASS       ;BYPASS\r
+       PUSHJ   PP,STOUTS       ;POLISH OF LINE BEFORE PROCESSING REPEAT\r
+       PUSH    MP,MRP          ;STACK PREVIOUS READ POINTER\r
+       PUSH    MP,RCOUNT       ;SAVE WORD COUNT\r
+       HRRZ    MRP,REPPNT      ;SET UP READ POINTER\r
+       SKIPN   MACLVL          ;IF IN MACRO GIVE CR-LF FIRST\r
+       SKIPE   LITLVL          ;SAME FOR LITERAL\r
+       JRST    REPEA7\r
+       AOJA    MRP,POPOUT      ;BYPASS ARG COUNT\r
+\r
+REPEA7:        HRRZ    MRP,REPPNT      ;SET UP READ POINTER\r
+       ADDI    MRP,1           ;BYPASS ARG COUNT\r
+REPEA8:        MOVEI   C,CR\r
+       JRST    RSW1\r
+\r
+REPEND:        SOSL    REPEXP\r
+       JRST    REPEA7\r
+       HRRZ    V,REPPNT        ;GET START OF TREE\r
+       PUSHJ   PP,REFDEC       ;DECREMENT REFERENCE\r
+       POP     MP,RCOUNT\r
+       POP     MP,MRP\r
+       POP     MP,REPPNT\r
+       POP     MP,REPEXP\r
+       SKIPN   LITLVL          ;IF IN LITERAL OR\r
+       SKIPE   MACLVL          ;IF IN MACRO\r
+       JRST    RSW0            ;FINISH OF LINE NOW\r
+       JRST    REPEA8\r
+\r
+\fREPZ: MOVE SDEL,SEQNO2        ;SAVE IN CASE OF END OF FILE\r
+       MOVEM SDEL,REPSEQ\r
+       MOVE SDEL,PAGENO\r
+       MOVEM SDEL,REPPG\r
+       SETOM INREP\r
+       MOVEI SDEL,0    ;SET COUNT\r
+REPZ1: PUSHJ   PP,GCHAR        ;GET NEXT CHARACTER\r
+       CAIN    C,"<"           ;"<"?\r
+       AOJA    SDEL,REPZ1      ;YES, INCREMENT COUNT\r
+       CAIN    C,">"           ;">"?\r
+       SOJLE   SDEL,REPZ2      ;YES, EXIT IF MATCHING\r
+       JRST    REPZ1           ;NO, RECYCLE\r
+REPZ2: SETZM   INREP   ;FLAG OUT OF IT\r
+       SETZM   INCND   ;AND CONDITIONAL ALSO\r
+       JRST    STMNT   ;AND EXIT\r
+\r
+REPO:  PUSHJ   PP,GCHAR        ;GET "<"\r
+       CAIE    C,"<"\r
+       JRST    REPO\r
+       SKIPE   RPOLVL          ;ARE WE NESTED?\r
+       AOS     RPOLVL          ;YES, DECREMENT CURRENT\r
+       PUSH    MP,RPOLVL\r
+       SETOM   RPOLVL\r
+       JRST    STMNT\r
+\r
+REPO1: CAIN    C,"<"\r
+       SOS     RPOLVL\r
+       CAIN    C,">"\r
+       AOSE    RPOLVL\r
+       JRST    RSW2\r
+       POP     MP,RPOLVL\r
+       PUSHJ   PP,RSW2\r
+       JRST    RSW0\r
+\fDEFIN0:       PUSHJ   PP,GETSYM       ;GET MACRO NAME\r
+       JRST    ERRAX           ;EXIT ON ERROR\r
+       MOVEM   PP,PPTMP1       ;SAVE POINTER\r
+       MOVEM   AC0,PPTMP2      ;SAVE NAME\r
+       TLO     IO,IORPTC\r
+       MOVE SX,SEQNO2  ;SAVE IN CASE OF EOF\r
+       MOVEM SX,DEFSEQ\r
+       MOVE SX,PAGENO\r
+       MOVEM SX,DEFPG\r
+       SETOM INDEF     ;AND FLAG IN DEFINE\r
+       SYN     .TEMP,COMSW     ;SAVE SPACE\r
+       SETZB   SX,COMSW        ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH\r
+DEF02: PUSHJ   PP,GCHAR        ;SEARCH FOR "(" OR "<"\r
+       CAIG    C,FF            ;SEARCH FOR END OF LINE\r
+       CAIGE   C,LF            ;LF,VT, OR FF\r
+       JRST    .+2             ;WASN'T ANY OF THEM\r
+       SETZM   COMSW           ;RESET COMMENT SWITCH\r
+       CAIN    C,";"           ;COMMENT?\r
+       SETOM   COMSW           ;YES, SET COMMENT SWITCH\r
+       SKIPE   COMSW           ;INSIDE A COMMENT?\r
+       JRST    DEF02           ;YES, IGNORE CHARACTER\r
+       CAIN    C,"<"           ;"<"?\r
+       JRST    DEF20           ;YES\r
+       CAIE    C,"("           ;"("?\r
+       JRST    DEF02           ;NO\r
+DEF10: PUSHJ   PP,GETSYM       ;YES, GET DUMMY SYMBOL\r
+       TRO     ER,ERRA         ;FLAG ERROR\r
+       ADDI    SX,1            ;INCREMENT ARG COUNT\r
+       PUSH    PP,AC0          ;STACK IT\r
+       CAIN    C,'<'           ;A DEFAULT ARGUMENT COMING UP?\r
+       JRST    DEF80           ;YES, STORE IT AWAY\r
+       CAIE    C,11            ;")"?\r
+       JRST    DEF10           ;NO, GET NEXT DUMMY SYMBOL\r
+DEF12: PUSHJ   PP,GCHAR\r
+       CAIE    C,"<"           ;"<"?\r
+       JRST    DEF12           ;NO\r
+DEF20: PUSH    PP,[0]          ;YES, MARK THE LIST\r
+       LSH     SX,9            ;SHIFT ARG COUNT\r
+       AOS     ARG,SX\r
+       PUSHJ   PP,SKELI        ;INITIALIZE MACRO SKELETON\r
+       MOVE    AC0,PPTMP2      ;GET NAME\r
+       TLO IO,DEFCRS\r
+       PUSHJ   PP,MSRCH        ;SEARCH THE TABLE\r
+       JRST    DEF24           ;NOT FOUND\r
+       TLNN    ARG,MACF        ;FOUND, IS IT A MACRO?\r
+       TROA    ER,ERRX         ;NO, FLAG ERROR AND SKIP\r
+       PUSHJ   PP,REFDEC       ;YES, DECREMENT THE REFERENCE\r
+DEF24: HRRZ    V,WWRXX         ;GET START OF TREE\r
+       SKIPN   .TEMP           ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?\r
+       JRST    DEF25           ;NO\r
+       HRRZ    C,1(V)          ;GET SHIFTED ARG COUNT\r
+       LSH     C,-9            ;GET ARG COUNT BACK\r
+       ADDI    C,1             ;ONE MORE FOR TERMINAL ZERO\r
+       ADD     C,.TEMP         ;NUMBER OF ITEMS IN STACK\r
+       HRLS    C               ;MAKE XWD\r
+       SUB     PP,C            ;BACK UP STACK\r
+       MOVE    SDEL,.TEMP      ;NUMBER OF WORDS NEEDED\r
+       ADDB    SDEL,FREE       ;FROM FREE CORE\r
+       CAML    SDEL,SYMBOL     ;MORE CORE NEEDED\r
+       PUSHJ   PP,XCEEDS       ;YES, TRY TO GET IT\r
+       SUB     SDEL,.TEMP      ;FORM POINTER\r
+       HRLM    SDEL,1(V)       ;STORE IT WITH ARG COUNT IN MACRO\r
+       SUBI    SDEL,1          ;TO USE FOR PUSHING POINTER INTO STORAGE\r
+       MOVEI   C,1(PP)         ;POINT TO START OF STACK\r
+DEF26: MOVE    ARG,(C)         ;GET AN ITEM OFF STACK\r
+       TLNN    ARG,-40         ;A POINTER?\r
+       JUMPN   ARG,[PUSH SDEL,ARG      ;YES, STORE IT\r
+\f              AOJA    C,DEF26]        ;GET NEXT\r
+       PUSH    PP,ARG          ;RESTACK ARGUMENT\r
+       SKIPE   ARG             ;FINISHED IF ZERO\r
+       AOJA    C,DEF26 ;GET NEXT\r
+       PUSH    SDEL,ARG        ;STORE ZERO IN DEFAULT LIST ALSO\r
+\fDEF25:        MOVSI   ARG,MACF\r
+       MOVEM   PP,PPTMP2       ;STORE TEMP STORAGE POINTER\r
+       PUSHJ   PP,INSERT       ;INSERT/UPDATE\r
+       TLZ IO,DEFCRS   ;JUST IN CASE\r
+       SETZM   ARGF            ;NO ARGUMENT SEEN\r
+       SETZM   SQFLG           ;AND NO ' SEEN\r
+       TDZA    SDEL,SDEL       ;CLEAR BRACKET COUNT\r
+DEF30: PUSHJ   PP,WCHAR        ;WRITE CHARACTER\r
+DEF31: PUSHJ   PP,GCHAR        ;GET A CHARACTER\r
+DEF32: MOVE    CS,C            ;GET A COPY\r
+       CAIN    C,";"           ;IS IT A COMMENT\r
+       JRST    CPEEK           ;YES CHECK FOR ;;\r
+DEF33: CAIG CS,"Z"+40          ;CONVERT LOWER CASE\r
+       CAIGE CS,"A"+40\r
+       JRST    .+2\r
+       SUBI CS,40\r
+\f      CAIGE CS,40             ;TEST FOR CONTROL CHAR.\r
+       JRST    [SKIPN  SQFLG   ;HAS SINGLE QUOTE BEEN SEEN?\r
+               JRST    DEF30   ;NO, OUTPUT THIS CHAR.\r
+               PUSH    PP,C    ;YES, SAVE CURRENT CHAR\r
+               MOVEI   C,47    ;SET UP QUOTE\r
+               PUSHJ   PP,WCHAR;WRITE IT\r
+               POP     PP,C    ;GET BACK CURRENT CHAR.\r
+               SETZM   SQFLG   ;RESET FLAG\r
+               JRST    DEF30]  ;AND CONTINUE \r
+       CAILE CS,77+40\r
+       JRST    DEF30           ;TEST FOR SPECIAL\r
+       MOVE    CS,CSTAT-40(CS) ;GET STATUS BITS\r
+\f      TLNE    CS,6            ;ALPHA-NUMERIC?\r
+       JRST    DEF40           ;YES\r
+       SKIPN   SQFLG           ;WAS A ' SEEN?\r
+       JRST    DEF36           ;NO, PROCESH\r
+       PUSH    PP,C            ;YES, SAVE CURRENT CHARACTER\r
+       MOVEI   C,47            ;AND PUT IN A '\r
+       PUSHJ   PP,WCHAR        ;...\r
+       POP     PP,C            ;RESTORE CURRENT CHARACTER\r
+       SETZM   SQFLG           ;AND RESET FLAG\r
+DEF36: CAIE    C,47            ;IS THIS A '?\r
+       JRST    DEF35           ;NOPE\r
+       SKIPN   ARGF            ;YES, WAS LAST THING SEEN AN ARG?\r
+       SETOM   SQFLG           ;IF NOT, SET SNGL QUOT FLAG\r
+       SETZM   ARGF            ;BUT NOT ARGUMENT IN ANY CASE\r
+       JRST    DEF31           ;GO GET NEXT CHARACTER\r
+\fDEF35:        SETZM   ARGF            ;THIS IS NOT AN ARGUMENT\r
+       CAIN    C,"<"           ;"<"?\r
+       AOJA    SDEL,DEF30      ;YES, INCREMENT COUNT AND WRITE\r
+       CAIN    C,">"           ;">"?\r
+       SOJL    SDEL,DEF70      ;YES, TEST FOR END\r
+       JRST    DEF30           ;NO, WRITE IT\r
+\r
+CPEEK: TLNN    IO,IOPALL       ;IF LALL IS ON\r
+       JRST    DEF33           ;JUST RETURN\r
+       PUSHJ   PP,PEEK         ;LOOK AT NEXT CHAR.\r
+       CAIN    C,";"           ;IS IT ;;?\r
+       JRST    CPEEK1          ;YES\r
+       MOVE    C,CS            ;RESTORE C\r
+       JRST    DEF33           ;AND RETURN\r
+\r
+CPEEK1:        PUSHJ   PP,GCHAR        ;GET THE CHAR.\r
+       CAIE    C,">"           ;RETURN IF END OF MACRO\r
+       CAIG    C,CR            ;IS CHAR ONE OF\r
+       CAIGE   C,LF            ;LF,VT,FF,CR\r
+       JRST    CPEEK1          ;NO,SO GET NEXT CHAR.\r
+       JRST    DEF32           ;YES,RETURN AND STORE\r
+\fDEF40:        MOVEI   AC0,0           ;CLEAR ATOM\r
+       MOVSI   AC1,(POINT 6,AC0)       ;SET POINTER\r
+DEF42: PUSH    PP,C            ;STACK CHARACTER\r
+       TLNE    AC1,770000      ;HAVE WE STORED 6?\r
+       IDPB    CS,AC1          ;NO, STORE IN ATOM\r
+       PUSHJ   PP,GCHAR        ;GET NEXT CHARACTER\r
+       MOVE    CS,C\r
+       CAIG CS,"Z"+40\r
+       CAIGE CS,"A"+40\r
+       JRST    .+2\r
+       SUBI CS,40              ;CONVERT LOWER TO UPPER\r
+       CAIL CS,40\r
+       CAILE CS,77+40\r
+       JRST    DEF44           ;TEST SPECIAL\r
+       MOVE    CS,CSTAT-40(CS) ;GET STATUS\r
+       TLNE    CS,6            ;ALPHA-NUMERIC?\r
+       JRST    DEF42           ;YES, GET ANOTHER\r
+DEF44: PUSH    PP,[0]          ;NO, MARK THE LIST\r
+       MOVE    SX,PPTMP1       ;GET POINTER TO TOP\r
+\r
+DEF46: SKIPN   1(SX)           ;END OF LIST?\r
+       JRST    DEF50           ;YES\r
+       CAME    AC0,1(SX)       ;NO, DO THEY COMPARE?\r
+       AOJA    SX,DEF46        ;NO, TRY AGAIN\r
+       SUB     SX,PPTMP1       ;YES, GET DUMMY SYMBOL NUMBER\r
+       LSH SX,4\r
+       MOVSI   CS,<(BYTE (7) 177,101)>(SX)     ;SET ESCAPE CODE MACEND\r
+       LSH     AC0,-^D30\r
+       CAIN    AC0,5           ;"%"?\r
+       TLO     CS,1000         ;YES, SET CRESYM FLAG\r
+       PUSHJ   PP,WWORD        ;WRITE THE WORD\r
+       SETOM ARGF              ;SET ARGUMENT SEEN FLAG\r
+       SETZM SQFLG             ;AND IGNORE ANY ' WAITING TO GET INTO STRING\r
+DEF48: MOVE    PP,PPTMP2       ;RESET PUSHDOWN POINTER\r
+       TLO     IO,IORPTC       ;ECHO LAST CHARACTER\r
+       JRST    DEF31           ;RECYCLE\r
+\r
+DEF50:\r
+       SKIPN   SQFLG           ;HAVE WE SEEN A '?\r
+       JRST    DEF51           ;NOPE\r
+       MOVEI   C,47            ;YES, PUT IT IN\r
+       PUSHJ   PP,WCHAR        ;...\r
+       SETZM   SQFLG           ;AND CLEAR FLAG\r
+DEF51: MOVE    C,2(SX)         ;GET CHARACTER\r
+       JUMPE   C,DEF48         ;CLEAN UP IF END\r
+       PUSHJ   PP,WCHAR        ;WRITE THE CHARACTER\r
+       AOJA    SX,DEF51        ;GET NEXT\r
+\r
+DEF70: MOVE    PP,PPTMP1       ;RESTORE PUSHDOWN POINTER\r
+       MOVSI   CS,(BYTE (7) 177,1)\r
+       PUSHJ   PP,WWRXE        ;WRITE END\r
+       SETZM INDEF     ;OUT OF IT\r
+       JRST    BYPASS\r
+\f; HERE TO STORE DEFAULT ARGUMENTS\r
+\r
+DEF80: AOS     .TEMP           ;COUNT ONE MORE\r
+       PUSHJ   PP,SKELI1       ;INITIALIZE SKELETON\r
+       HRL     V,SX            ;SYMBOL NUMBER\r
+       PUSH    PP,V            ;STORE POINTER\r
+       TDZA    SDEL,SDEL       ;ZERO BRACKET COUNT\r
+DEF81: PUSHJ   PP,WCHARQ       ;WRITE A CHARACTER\r
+       PUSHJ   PP,GCHARQ       ;GET A CHARACTER\r
+       CAIN    C,"<"           ;ANOTHER "<"?\r
+       AOJA    SDEL,DEF81      ;YES, INCREMENT AND WRITE\r
+       CAIE    C,">"           ;CLOSING ANGLE?\r
+       JRST    DEF81           ;NO, JUST WRITE THE CHAR.\r
+       SOJGE   SDEL,DEF81      ;YES, WRITE IF NOT END\r
+       MOVSI   CS,(BYTE (7) 177,2)\r
+       PUSHJ   PP,WWRXE        ;WRITE END OF DUMMY ARGUMENT\r
+       PUSHJ   PP,GCHAR        ;READ AT NEXT CHAR.\r
+       CAIE    C,")"           ;END OF ARGUMENT LIST?\r
+       JRST    DEF10           ;NO, GET NEXT SYMBOL\r
+       JRST    DEF12           ;YES, LOOK FOR "<"\r
+\fSUBTTL        MACRO CALL PROCESSOR\r
+CALLM: SKIPGE  MACENL          ;ARE WE TRYING TO RE-ENTER?\r
+       JRST    ERRAX           ;YES, BOMB OUT WITH ERROR\r
+       HRROS   MACENL          ;FLAG "CALLM IN PROGRESS"\r
+       EXCH    MP,RP\r
+       PUSH    MP,V            ;STACK FOR REFDEC\r
+       EXCH    MP,RP\r
+       MOVEM   AC0,CALNAM      ;SAVE MACRO NAME INCASE OF ERROR\r
+       MOVE SDEL,SEQNO2        ;SAVE IN CASE OF EOF\r
+       MOVEM SDEL,CALSEQ\r
+       MOVE SDEL,PAGENO\r
+       MOVEM SDEL,CALPG\r
+       ADDI    V,1             ;POINT TO DUMMY SYMBOL COUNT\r
+       AOS     SDEL,0(V)       ;INCREMENT ARG COUNT\r
+       HLLZM   SDEL,.TEMP      ;DEFAULT ARG POINTER IF NON-ZERO\r
+       LSHC    SDEL,-^D<9+36>  ;ZERO SDEL, GET ARG COUNT IN SX\r
+       ANDI    SX,777          ;MASK\r
+       SKIPE   .TEMP           ;IF AT LEAST ONE DEFAULT ARG\r
+       HRRM    SX,.TEMP        ;STORE COUNT OF ARGS\r
+       PUSH    PP,V            ;STACK FOR MRP\r
+       PUSH    PP,RP           ;STACK FOR MACPNT\r
+       JUMPE   SX,MAC20        ;TEST FOR NO ARGS\r
+       PUSHJ   PP,CHARAC\r
+       CAIE    C,"("           ;"("\r
+       TROA    SDEL,-1         ;NO, FUDGE PAREN COUNT AND SKIP\r
+\r
+MAC10: PUSHJ   PP,GCHAR        ;GET A CHARACTER, LOOK FOR AN ARG\r
+       CAIG C,CR\r
+       CAIGE C,LF\r
+       CAIN    C,";"           ;";"?\r
+       JRST    MAC21           ;YES, END OF ARGUMENT STRING\r
+\r
+       PUSHJ   PP,SKELI1       ;NO, INITIALIZE SKELETON\r
+       CAIN    C,"<"           ;"<"?\r
+       JRST    MAC30           ;YES, PROCESS AS SPECIAL\r
+       CAIE C,176\r
+       CAIN    C,134           ;"\"\r
+       JRST    MAC40           ;YES, PROCESS SYMBOL\r
+\r
+MAC14: CAIN    C,","           ;","?\r
+       JRST    MAC16           ;YES; NULL SYMBOL\r
+       CAIN    C,"("           ;"("?\r
+       ADDI    SDEL,1          ;YES, INCREMENT COUNT\r
+       CAIN    C,")"           ;")"?\r
+       SOJL    SDEL,MAC16      ;YES, TEST FOR END\r
+       PUSHJ   PP,WCHAR        ;WRITE INTO SKELETON\r
+MAC14A:        PUSHJ   PP,CHARAC       ;GET NEXT CHARACTER\r
+       CAIG C,CR\r
+       CAIGE C,LF\r
+       JRST    .+2\r
+       JRST    MAC15           ;TEST FOR END OF LINE\r
+       CAIE    C,";"           ;";"?\r
+       JRST    MAC14           ;YES, END OF LINE\r
+\r
+MAC15: TLO     IO,IORPTC\r
+MAC16: MOVSI   CS,(BYTE (7) 177,2)\r
+       PUSHJ   PP,WWRXE        ;WRITE END\r
+       EXCH    MP,RP\r
+       PUSH    MP,WWRXX\r
+       EXCH    MP,RP\r
+       SOJLE   SX,MAC20        ;BRANCH IF NO MORE ARGS\r
+       JUMPGE  SDEL,MAC10      ;HAVEN'T SEEN TERMINAL ")" YET\r
+\fMAC20:        TLZN    IO,IORPTC\r
+       PUSHJ   PP,CHARAC\r
+MAC21: EXCH    MP,RP\r
+       JUMPE   SX,MAC21B       ;NO MISSING ARGS\r
+MAC21A:        PUSH    MP,[-1]         ;FILL IN MISSING ARGS\r
+       SKIPN   .TEMP           ;ANY DEFAULT ARGS?\r
+       JRST    MAC21C          ;NO\r
+       HRRZ    C,.TEMP         ;GET ARG COUNT\r
+       SUBI    C,-1(SX)        ;ACCOUNT FOR THOSE GIVEN\r
+       HRLZS   C               ;PUT IN LEFT HALF\r
+       HLRZ    SDEL,.TEMP      ;ADDRESS OF TABLE\r
+MAC21D:        SKIPN   (SDEL)          ;END OF LIST\r
+       JRST    MAC21C          ;YES\r
+       XOR     C,(SDEL)        ;TEST FOR CORRECT ARG\r
+       TLNN    C,-1            ;WAS IT?\r
+       JRST    MAC21E          ;YES\r
+       XOR     C,(SDEL)        ;BACK THE WAY IT WAS\r
+       AOJA    SDEL,MAC21D     ;AND TRY AGAIN\r
+\r
+MAC21E:        MOVEM   C,(MP)          ;REPLACE -1 WITH TREE POINTER\r
+       AOS     1(C)            ;INCREMENT REFERENCE\r
+MAC21C:        SOJG    SX,MAC21A\r
+MAC21B:        PUSH    MP,[0]          ;SET TERMINAL\r
+       HRRZ    C,LIMBO\r
+       TLNN    IO,IOSALL       ;SUPPRESSING ALL?\r
+       JRST    MAC23           ;NO\r
+       JUMPN   MRP,MAC27       ;IN MACRO?\r
+       CAIE    C,";"           ;NO,IN COMMENT?\r
+       JRST    MAC26           ;NO\r
+MAC22: PUSHJ   PP,CHARAC       ;YES,GET IT INTO THE LBUF\r
+       CAIG    C,CR            ;LESS THAN CR?\r
+       CAIGE   C,LF            ;AND GREATER THAN LF?\r
+       JRST    MAC22           ;NO GET ANOTHER\r
+MAC26: HRLZI   SX,70000        ;DECREMENT BYTE POINTER\r
+       ADDB    SX,LBUFP\r
+       JUMPGE  SX,MAC27\r
+       HRLOI   SX,347777\r
+       ADDM    SX,LBUFP\r
+MAC27: HRLI    C,-1            ;SET FLAG\r
+       JRST    MAC25\r
+\r
+MAC23: MOVEI   SX,"^"\r
+       JUMPAD  MAC24           ;BRANCH IF ADDRESS FIELD\r
+       CAIN    C,";"           ;IF SEMI-COLON\r
+       SKIPE   LITLVL          ;AND NOT IN A LITERAL\r
+       JRST    MAC24           ;NOT BOTH TRUE\r
+       JUMPN   MRP,MAC24       ;OR IN A MACRO\r
+       PUSHJ   PP,STOUT        ;LIST COMMENT OR CR-LF\r
+       TLNE    IO,IOPALL       ;MACRO EXPANSION SUPPRESSION?\r
+       TLO     IO,IOMAC        ;  NO, SET TEMP BIT\r
+       TDOA    C,[-1]          ;FLAG LAST CHARACTER\r
+MAC24: DPB     SX,LBUFP        ;SET ^ INTO LINE BUFFER\r
+MAC25: PUSH    MP,MACPNT\r
+       POP     PP,MACPNT\r
+       PUSH    MP,C\r
+       PUSH    MP,RCOUNT       ;STACK WORD COUNT\r
+       PUSH    MP,MRP          ;STACK MACRO POINTER\r
+       POP     PP,MRP          ;SET NEW READ POINTER\r
+       EXCH    MP,RP\r
+       AOS     MACLVL\r
+       HRRZS   MACENL          ;RESET "CALLM IN PROGRESS"\r
+       JUMPOC  STMNT2          ;OP-CODE FIELD\r
+       JRST    EVATOM          ;ADDRESS FIELD\r
+\r
+\fMAC30:        MOVEI   AC0,0           ;INITIALIZE BRACKET COUNTER\r
+MAC31: PUSHJ   PP,GCHAR        ;GET A CHARACTER\r
+       CAIN    C,"<"           ;"<"?\r
+       ADDI    AC0,1           ;YES, INCREMENT COUNT\r
+       CAIN    C,">"           ;">"?\r
+       SOJL    AC0,MAC14A      ;YES, EXIT IF MATCHING\r
+       PUSHJ   PP,WCHAR        ;WRITE INTO SKELETON\r
+       JRST    MAC31           ;GO BACK FOR ANOTHER\r
+\r
+MAC40: PUSH    PP,SX           ;STACK REGISTERS\r
+       PUSH    PP,SDEL\r
+       HLLM    IO,TAGINC       ;SAVE IO FLAGS\r
+       PUSHJ   PP,CELL         ;GET AN ATOM\r
+       MOVE    V,AC0           ;ASSUME NUMERIC\r
+       TLNE    IO,NUMSW        ;GOOD GUESS?\r
+       JRST    MAC41           ;YES\r
+       PUSHJ   PP,SSRCH        ;SEARCH THE SYMBOL TABLE\r
+       TROA    ER,ERRX         ;NOT FOUND, ERROR\r
+MAC41: PUSHJ   PP,MAC42        ;FORM ASCII STRING\r
+       HLL     IO,TAGINC       ;RESTORE IO FLAGS\r
+       POP     PP,SDEL\r
+       POP     PP,SX\r
+       TLO     IO,IORPTC       ;REPEAT LAST CHARACTER\r
+       JRST    MAC14A          ;RETURN TO MAIN SCAN\r
+\r
+MAC42: MOVE    C,V\r
+MAC44: LSHC    C,-^D35\r
+       LSH     CS,-1\r
+       DIVI    C,0(RX)         ;DIVIDE BY CURRENT RADIX\r
+       HRLM    CS,0(PP)\r
+       JUMPE   C,.+2           ;TEST FOR END\r
+       PUSHJ   PP,MAC44\r
+       HLRZ    C,0(PP)\r
+       ADDI    C,"0"           ;FORM TEXT\r
+       JRST    WCHAR           ;WRITE INTO SKELETON\r
+\fMACEN0:       SOS     MACENL\r
+MACEND:        SKIPGE  C,MACENL        ;TEST "CALLM IN PROGRESS"\r
+       AOS     MACENL          ;INCREMENT END LEVEL AND EXIT\r
+       JUMPL   C,REPEA8\r
+       EXCH    MP,RP\r
+       POP     MP,MRP          ;RETRIEVE READ POINTER\r
+       POP     MP,RCOUNT       ;AND WORD COUNT\r
+       MOVEI   C,"^"\r
+       SKIPL   0(MP)           ;TEST FLAG\r
+       PUSHJ   PP,RSW2         ;MARK END OF SUBSTITUTION\r
+       POP     MP,C\r
+       POP     MP,ARG\r
+       SKIPA   MP,MACPNT       ;RESET MP AND SKIP\r
+MACEN1:        PUSHJ   PP,REFDEC       ;DECREMENT REFERENCE\r
+MACEN2:        AOS     V,MACPNT        ;GET POINTER\r
+       MOVE    V,0(V)\r
+       JUMPG   V,MACEN1        ;IF >0, DECREMENT REFERENCE\r
+       JUMPL   V,MACEN2        ;IF <0, BYPASS\r
+       POP     MP,V            ;IF=0, RETRIEVE POINTER\r
+       PUSHJ   PP,REFDEC       ;DECREMENT REFERENCE\r
+       MOVEM   ARG,MACPNT\r
+       EXCH    MP,RP\r
+       SOS     MACLVL\r
+       SKIPN   MACENL          ;CHECK UNPROCESSED END LEVEL\r
+       JRST    MACEN3          ;NONE TO PROCESS\r
+       TRNN    MRP,-1          ;MRP AT END OF TEXT\r
+       JRST    MACEN0          ;THEN POP THE MACRO STACK NOW\r
+MACEN3:        TRNN    C,77400         ;SALL FLAG?\r
+       HRLI    C,0             ;YES,TURN IT OFF\r
+       JUMPL   C,REPEA8        ;IF FLAG SET SUBSTITUTE\r
+       JRST    RSW1\r
+\fIRP0: SKIPN   MACLVL          ;ARE WE IN A MACRO?\r
+       JRST    ERRAX           ;NO, BOMB OUT\r
+IRP10: PUSHJ   PP,MREADS       ;YES, GET DATA SPEC\r
+       CAIE C,40               ;SKIP LEADING BLANKS\r
+       CAIN    C,"("           ;"("?\r
+       JRST    IRP10           ;YES, BYPASS\r
+       CAIN C,11\r
+       JRST IRP10\r
+       CAIE    C,177           ;NO, IS IT SPECIAL?\r
+       JRST    ERRAX           ;NO, ERROR\r
+       PUSHJ   PP,MREADS       ;YES\r
+       TRZN C,100              ;CREATED?\r
+       JRST ERRAX\r
+       CAIL C,40               ;TOO BIG?\r
+       JRST ERRAX\r
+       ADD     C,MACPNT        ;NO, FORM POINTER TO STACK\r
+       PUSH    MP,IRPCF        ;STACK PREVIOUS POINTERS\r
+       PUSH    MP,IRPSW\r
+       PUSH    MP,IRPARP\r
+       PUSH    MP,IRPARG\r
+       PUSH    MP,IRPCNT\r
+       PUSH    MP,0(C)\r
+       PUSH    MP,IRPPOI\r
+\r
+       HRRZM   C,IRPARP\r
+       MOVEM   AC0,IRPCF       ;IRPC FLAG FOUND IN AC0\r
+       SETOM   IRPSW           ;RESET IRP SWITCH\r
+       MOVE    CS,0(C)\r
+       MOVEM   CS,IRPARG\r
+\r
+       PUSHJ   PP,MREADS\r
+       CAIE    C,"<"           ;"<"?\r
+       JRST    .-2             ;NO, SEARCH UNTIL FOUND\r
+       PUSHJ   PP,SKELI1       ;INITIALIZE NEW STRING\r
+       MOVEM   ARG,IRPPOI      ;SET NEW POINTER\r
+\r
+       TDZA    SDEL,SDEL       ;ZERO BRACKET COUNT AND SKIP\r
+IRP20: PUSHJ   PP,WCHAR1\r
+       PUSHJ   PP,MREADS\r
+       CAIN    C,"<"           ;"<"?\r
+       AOJA    SDEL,IRP20      ;YES, INCREMENT COUNT AND WRITE\r
+       CAIE    C,">"           ;">"?\r
+       JRST    IRP20           ;NO, JUST WRITE IT\r
+       SOJGE   SDEL,IRP20      ;YES, WRITE IF NOT MATCHING\r
+       MOVE    CS,[BYTE (7) 15,177,4]\r
+       PUSHJ   PP,WWRXE        ;WRITE END\r
+       PUSH    MP,MRP          ;STACK PREVIOUS READ POINTER\r
+       PUSH    MP,RCOUNT       ;AND WORD COUNT\r
+       SKIPG   CS,IRPARG\r
+       JRST    IRPPOP          ;EXIT IF NOT VALID ARGUMENT\r
+       MOVEI   C,1(CS)         ;INITIALIZE POINTER\r
+       MOVEM   C,IRPARG\r
+\fIRPSET:       EXCH    MRP,IRPARG      ;SWAP READ POINTERS\r
+       MOVE    SX,RCOUNT       ;SWAP COUNT OF WORDS TO READ\r
+       EXCH    SX,IRPCNT\r
+       MOVEM   SX,RCOUNT\r
+       PUSHJ   PP,SKELI1       ;INITIALIZE SKELETON FOR DATA\r
+       HRRZM   ARG,@IRPARP     ;STORE NEW DS POINTER\r
+       SETZB   SX,SDEL         ;ZERO FOUND FLAG AND BRACKET COUNT\r
+       LDB     C,MRP           ;GET LAST CHAR\r
+       CAIN    C,","\r
+       SKIPE   IRPCF           ;IN IRPC\r
+       JRST    IRPSE1          ;NO\r
+       MOVEI   SX,1            ;FORCE ARGUMENT\r
+IRPSE1:        PUSHJ   PP,MREADS\r
+       CAIE    C,177           ;SPECIAL?\r
+       AOJA    SX,IRPSE2       ;NO, FLAG AS FOUND\r
+       PUSHJ   PP,PEEKM        ;LOOK AT NEXT CHARACTER\r
+       SETZM   IRPSW           ;SET IRP SWITCH\r
+       JUMPG   SX,IRPSE4       ;IF ARG FOUND, PROCESS IT\r
+       JRST    IRPPOP          ;NO, CLEAN UP AND EXIT\r
+\r
+IRPSE2:        SKIPE   IRPCF           ;IRPC?\r
+       JRST    IRPSE3          ;YES, WRITE IT\r
+       CAIN    C,","           ;NO, IS IT A COMMA?\r
+       JUMPE   SDEL,IRPSE4     ;YES, EXIT IF NOT NESTED\r
+       CAIN    C,"<"           ;"<"?\r
+       ADDI    SDEL,1          ;YES, INCREMENT COUNT\r
+       CAIN    C,">"           ;">"?\r
+       SUBI    SDEL,1          ;YES, DECREMENT COUNT\r
+\r
+IRPSE3:        PUSHJ   PP,WCHAR\r
+       SKIPN   IRPCF           ;IRPC?\r
+       JRST    IRPSE1          ;NO, GET NEXT CHARACTER\r
+\r
+IRPSE4:        MOVSI   CS,(BYTE (7) 177,2)\r
+       PUSHJ   PP,WWRXE        ;WRITE END\r
+       MOVEM   MRP,IRPARG      ;SAVE POINTER\r
+       MOVE    MRP,RCOUNT      ;SAVE COUNT\r
+       MOVEM   MRP,IRPCNT\r
+       HRRZ    MRP,IRPPOI      ;SET FOR NEW SCAN\r
+       AOJA    MRP,REPEA8      ;ON ARG COUNT\r
+\fSTOPI0:       SKIPN   IRPARP          ;IRP IN PROGRESS?\r
+       JRST    ERRAX           ;NO, ERROR\r
+       SETZM   IRPSW           ;YES, SET SWITCH\r
+       POPJ    PP,\r
+\r
+IRPEND:        MOVE    V,@IRPARP\r
+       PUSHJ   PP,REFDEC\r
+       SKIPE   IRPSW           ;MORE TO COME?\r
+       JRST    IRPSET          ;YES\r
+\r
+IRPPOP:        MOVE    V,IRPPOI\r
+       PUSHJ   PP,REFDEC       ;DECREMENT REFERENCE\r
+       POP     MP,RCOUNT\r
+       POP     MP,MRP          ;RESTORE CELLS\r
+       POP     MP,IRPPOI\r
+       POP     MP,@IRPARP\r
+       POP     MP,IRPCNT\r
+       POP     MP,IRPARG\r
+       POP     MP,IRPARP\r
+       POP     MP,IRPSW\r
+       POP     MP,IRPCF\r
+       JRST    REPEA8\r
+\fGETDS:                                ;GET DUMMY SYMBOL NUMBER\r
+       MOVE    CS,C            ;USE CS FOR WORK REGISTER\r
+       ANDI    CS,37           ;MASK\r
+       ADD     CS,MACPNT       ;ADD BASE ADDRESS\r
+       MOVE    V,0(CS)         ;GET POINTER FLAG\r
+       JUMPG   V,GETDS1        ;BRANCH IF POINTER\r
+       TRNN    C,40            ;NOT POINTER, SHOULD WE CREATE?\r
+       JRST    RSW0            ;NO, FORGET THIS ARG\r
+       PUSH    PP,WWRXX\r
+       PUSH    PP,MWP          ;STACK MACRO WRITE POINTER\r
+       PUSH    PP,WCOUNT       ;SAVE WORD  COUNT\r
+       PUSHJ   PP,SKELI1       ;INITIALIZE SKELETON\r
+       MOVEM   ARG,0(CS)       ;STORE POINTER\r
+       MOVE    CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL\r
+       ADD     CS,LSTSYM               ;LSTSYM= # OF LAST CREATED\r
+       TDZ     CS,[BYTE (7) 0,170,170,170,170]\r
+       MOVEM   CS,LSTSYM\r
+       IOR     CS,[ASCII /.0000/]\r
+       MOVEI C,"."\r
+       PUSHJ PP,WCHAR\r
+       PUSHJ   PP,WWORD        ;WRITE INTO SKELETON\r
+       MOVSI   CS,(BYTE (7) 177,2)\r
+       PUSHJ   PP,WWRXE        ;WRITE END CODE\r
+       POP     PP,WCOUNT       ;RESTORE WORD COUNT\r
+       POP     PP,MWP          ;RESTORE MACRO WRITE POINTER\r
+       POP     PP,WWRXX\r
+       MOVE    V,ARG           ;SET UP FOR REFINC\r
+\r
+GETDS1:        PUSHJ   PP,REFINC       ;INCREMENT REFERENCE\r
+       HRL     V,RCOUNT        ;SAVE WORD COUNT\r
+       PUSH    MP,V            ;STACK V FOR DECREMENT\r
+       PUSH    MP,MRP          ;STACK READ POINTER\r
+       MOVEI   MRP,1(V)        ;FORM READ POINTER\r
+       JRST    RSW0            ;EXIT\r
+\r
+DSEND: POP     MP,MRP\r
+       POP     MP,V\r
+       HLREM   V,RCOUNT        ;RESTORE WORD COUNT\r
+       HRRZS   V               ;CLEAR COUNT\r
+       PUSHJ   PP,REFDEC       ;DECREMENT REFERENCE\r
+       JRST    RSW0            ;EXIT\r
+\fSKELI1:       MOVEI   ARG,1           ;ENTRY FOR SINGLE ARG\r
+SKELI: SETZ    MWP,            ;SIGNAL FIRST TIME THROUGH\r
+       PUSHJ   PP,SKELWL       ;GET POINTER WORD\r
+       HRRZM   MWP,WWRXX       ;SAVE FIRST ADDRESS\r
+       HRRZM   MWP,LADR        ;SAVE START OF LINKED LIST\r
+       HRRZM   ARG,1(MWP)      ;STORE COUNT\r
+       SOS     WCOUNT          ;ACCOUNT FOR WORD\r
+       HRRZ    ARG,WWRXX       ;SET FIRST ADDRESS\r
+       ADDI    MWP,2           ;BUMP POINTER\r
+       HRLI    MWP,(POINT 7)   ;SET FOR 5 ASCII BYTES\r
+       ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)\r
+\r
+SKELW: SOSLE   WCOUNT          ;STILL SOME SPACE IN LEAF?\r
+       POPJ    PP,             ;YES, RETURN\r
+SKELWL:        SKIPE   V,NEXT          ;GET FIRST FREE ADDRESS\r
+       JRST    SKELW1          ;IF NON-ZERO, UPDATE FREE\r
+       MOVE    V,FREE          ;GET FREE\r
+       ADDI    V,.LEAF         ;INCREMENT BY LEAF SIZE\r
+       CAML    V,SYMBOL        ;OVERFLOW?\r
+       PUSHJ   PP,XCEED        ;YES, BOMB OUT\r
+       EXCH    V,FREE          ;UPDATE FREE\r
+       SETZM   (V)             ;CLEAR LINK\r
+\r
+SKELW1:        HLL     V,0(V)          ;GET ADDRESS\r
+       HLRM    V,NEXT          ;UPDATE NEXT\r
+       SKIPE   MWP             ;IF FIRST TIME\r
+       HRLM    V,1-.LEAF(MWP)  ;STORE LINK IN FIRST WORD OF LEAF\r
+       MOVEI   MWP,.LEAF       ;SIZE OF LEAF\r
+       MOVEM   MWP,WCOUNT      ;STORE FOR COUNT DOWN\r
+       MOVEI   MWP,(V)         ;SET UP WRITE POINTER\r
+       TLO     MWP,(POINT 7,,21)       ;2 ASCII CHARS\r
+       POPJ    PP,\r
+\r
+       ;WWRXX  POINTS TO END OF TREE\r
+       ;MWP    IDPB POINTER TO NEXT HOLE\r
+       ;NEXT   FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)\r
+       ;FREE   POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE\r
+       ;LADR   POINTS TO BEG OF LINKED PORTION.\r
+\fGCHARQ:       JUMPN   MRP,MREADS      ;IF GETTING CHAR. FROM TREE\r
+GCHAR: PUSHJ   PP,CHARAC       ;GET ASCII CHARACTER\r
+       CAIG    C,FF            ;TEST FOR LF, VT OR FF\r
+       CAIGE   C,LF\r
+       POPJ    PP,             ;NO\r
+       JRST    OUTIM1          ;YES, LIST IT\r
+\r
+WCHARQ:\r
+WCHAR: \r
+WCHAR1:        TLNN    MWP,760000      ;END OF WORD?\r
+       PUSHJ   PP,SKELW        ;YES, GET ANOTHER\r
+       IDPB    C,MWP           ;STORE CHARACTER\r
+       POPJ    PP,\r
+\r
+WWORD: LSHC    C,7             ;MOVE ASCII INTO C\r
+       PUSHJ   PP,WCHAR1       ;STORE IT\r
+       JUMPN   CS,WWORD        ;TEST FOR END\r
+       POPJ    PP,             ;YES, EXIT\r
+\r
+WWRXE: PUSHJ   PP,WWORD        ;WRITE LAST WORD\r
+       ADD     MWP,WCOUNT      ;GET TO END OF LEAF\r
+       SUBI    MWP,.LEAF       ;NOW POINT TO START OF IT\r
+       HRRZS   (MWP)           ;ZERO LEFT HALF OF LAST LEAF\r
+       HRRM    MWP,@WWRXX      ;SET POINTER TO END\r
+       POPJ    PP,\r
+\fMREAD:        PUSHJ   PP,MREADS       ;READ ONE CHARACTER\r
+       CAIE    C,177           ;SPECIAL?\r
+       JRST    RSW1            ;NO, EXIT\r
+       PUSHJ   PP,MREADS       ;YES, GET CODE WORD\r
+       TRZE C,100              ;SYMBOL?\r
+       JRST GETDS              ;YES\r
+       CAILE C,4               ;POSSIBLY ILLEGAL\r
+       JRST ERRAX              ;YUP\r
+       HRRI    MRP,0           ;NO, SIGNAL END OF TEXT\r
+       JRST    .+1(C)\r
+       PUSHJ   PP,XCEED\r
+       JRST    MACEND          ;1; END OF MACRO\r
+       JRST    DSEND           ;2; END OF DUMMY SYMBOL\r
+       JRST    REPEND          ;3; END OF REPEAT\r
+       JRST    IRPEND          ;4; END OF IRP\r
+\r
+MREADI:        HRLI    MRP,700         ;SET UP BYTE POINTER\r
+       MOVEI   C,.LEAF-1       ;NUMBER OF WORDS\r
+       MOVEM   C,RCOUNT\r
+MREADS:        TLNN    MRP,-1          ;FIRST TIME HERE?\r
+       JRST    MREADI          ;YES, SET UP MRP AND RCOUNT\r
+       TLNN    MRP,760000      ;HAVE WE FINISHED WORD?\r
+       SOSLE   RCOUNT          ;YES, STILL ROOM IN LEAF?\r
+       JRST    MREADC          ;STILL CHAR. IN LEAF\r
+       HLRZ    MRP,1-.LEAF(MRP);YES, GET LINK\r
+       HRLI    MRP,(POINT 7,,21)       ;SET POINTER\r
+       MOVEI   C,.LEAF         ;RESET COUNT\r
+       MOVEM   C,RCOUNT\r
+MREADC:        ILDB    C,MRP           ;GET CHARACTER\r
+       POPJ    PP,\r
+\r
+PEEK:  JUMPN   MRP,PEEKM       ;THIS IS A MACRO READ\r
+       PUSHJ   PP,CHARAC       ;READ AN ASCII CHAR.\r
+       TLO     IO,IORPTC       ;REPEAT  FOR NEXT\r
+       POPJ    PP,             ;AND RETURN\r
+\r
+PEEKM: PUSH    PP,MRP          ;SAVE MACRO READ POINTER\r
+       PUSH    PP,RCOUNT       ;SAVE WORD COUNT\r
+       PUSHJ   PP,MREADS       ;READ IN A CHAR.\r
+       POP     PP,RCOUNT       ;RESTORE WORD COUNT\r
+       POP     PP,MRP          ;RESET READ POINTER\r
+       POPJ    PP,             ;IORPTC IS NOT SET\r
+\fREFINC:       MOVEI   CS,1(V)         ;GET POINTER TO TREE\r
+       AOS     0(CS)           ;INCREMENT REFERENCE\r
+       POPJ    PP,\r
+\r
+REFDEC:        JUMPLE  V,DECERR        ;CATASTROPHIC ERROR SOMEWHERE\r
+       MOVEI   CS,1(V)         ;GET POINTER TO TREE\r
+       SOS     CS,0(CS)        ;DECREMENT REFERENCE\r
+       TRNE    CS,000777       ;IS IT ZERO?\r
+       POPJ    PP,             ;NO, EXIT\r
+       HRRZ    CS,0(V)         ;YES, GET POINTER TO END\r
+       HRL     CS,NEXT         ;GET POINTER TO NEXT RE-USABLE\r
+       HLLM    CS,0(CS)        ;SET LINK\r
+       HRRM    V,NEXT          ;RESET NEXT\r
+       POPJ    PP,\r
+\r
+DECERR:        MOVE    AC0,CALNAM      ;GET MACRO NAME\r
+       MOVSI   RC,[SIXBIT /ERROR WHILE EXPANDING@/]\r
+       PUSHJ   PP,TYPMSG\r
+       JRST    ERRNE2          ;COMMON MESSAGE\r
+\fA==   0                       ;ASCII MODE\r
+AL==   1                       ;ASCII LINE MODE\r
+IB==   13                      ;IMAGE BINARY MODE\r
+B==    14                      ;BINARY MODE\r
+IFE RUNSW,<DMP==16             ;DUMP MODE>\r
+\r
+CTL==  0                       ;CONTROL DEVICE NUMBER\r
+IFN CCLSW,<CTL2==4             ;INPUT DEV FOR CCL FILE>\r
+BIN==  1                       ;BINARY DEVICE NUMBER\r
+CHAR== 2                       ;INPUT DEVICE NUMBER\r
+LST==  3                       ;LISTING DEVICE NUMBER\r
+\r
+;      COMMAND STRING ACCUMULATORS\r
+\r
+ACDEV==        1                       ;DEVICE\r
+ACFILE==2                      ;FILE\r
+ACEXT==        3                       ;EXTENSION\r
+ACPPN== 4                      ;PPN\r
+ACDEL==        4                       ;DELIMITER\r
+ACPNTR==5                      ;BYTE POINTER\r
+\r
+TIO==  6\r
+\r
+TIORW==        1000\r
+TIOLE==        2000\r
+TIOCLD==20000\r
+\r
+DIRBIT==4              ;DIRECTORY DEVICE\r
+TTYBIT==10             ;TTY\r
+MTABIT==20             ;MTA\r
+DTABIT==100            ;DTA\r
+DISBIT==2000           ;DISPLAY\r
+CONBIT==20000          ;CONTROLING TTY\r
+LPTBIT==40000          ;LPT\r
+DSKBIT==200000         ;DSK\r
+\r
+;GETSTS ERROR BITS\r
+\r
+IOIMPM==400000         ;IMPROPER MODE (WRITE LOCK)\r
+IODERR==200000         ;DEVICE DATA ERROR\r
+IODTER==100000         ;CHECKSUM OR PARITY ERROR\r
+IOBKTL== 40000         ;BLOCK TOO LARGE\r
+ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL\r
+\r
+SYN    .TEMP,PPN\r
+\fSUBTTL        I/O ROUTINES\r
+BEG:\r
+IFN CCLSW,<TLZA        IO,ARPGSW       ;DON'T ALLOW RAPID PROGRAM GENERATION\r
+       TLO     IO,ARPGSW       ;ALLOW RAPID PROGRAM GENERATION>\r
+IFN PURESW,<\r
+       MOVE    MRP,[XWD LOWL,LOWL+1]   ;START OF DATA\r
+       SETZM   LOWL            ;ZERO FIRST WORD\r
+       BLT     MRP,LOWEND      ;AND THE REST\r
+       MOVE    MRP,[XWD LOWH,LOWL] ;PHASED CODE\r
+       BLT     MRP,LOWL+LENLOW ;MOVE IT IN>\r
+       HRRZ    MRP,JOBREL      ;GET LOWSEG SIZE\r
+       MOVEM   MRP,MACSIZ      ;SAVE CORE SIZE\r
+                               ;DECODE VERSION NUMBER\r
+       MOVEI   PP,JOBFFI       ;TEMP PUSH DOWN STACK\r
+       PUSH    PP,[0]          ;MARK BOTTOM OF STACK\r
+       LDB     0,[POINT 3,JOBVER,2]    ;GET USER BITS\r
+       JUMPE   0,GETE          ;NOT SET IF ZERO\r
+       ADDI    0,"0"           ;FORM NUMBER\r
+       PUSH    PP,0            ;STACK IT\r
+       MOVEI   0,"-"           ;SEPARATE BY HYPHEN\r
+       PUSH    PP,0            ;STACK IT ALSO\r
+GETE:  HRRZ    0,JOBVER        ;GET EDIT NUMBER\r
+       JUMPE   0,GETU          ;SKIP ALL THIS IF ZERO\r
+       MOVEI   1,")"           ;ENCLOSE IN PARENS.\r
+       PUSH    PP,1\r
+GETED: IDIVI   0,8             ;GET OCTAL DIGITS\r
+       ADDI    1,"0"           ;MAKE ASCII\r
+       PUSH    PP,1            ;STACK IT\r
+       JUMPN   0,GETED         ;LOOP TIL DONE\r
+       MOVEI   0,"("           ;OTHER PAREN.\r
+       PUSH    PP,0\r
+GETU:  LDB     0,[POINT 6,JOBVER,17]   ;UPDATE NUMBER\r
+       JUMPE   0,GETV          ;SKIP IF ZERO\r
+       IDIVI   0,8             ;MIGHT BE TWO DIGITS\r
+       ADDI    1,"@"           ;FORM ALPHA\r
+       PUSH    PP,1\r
+       JUMPN   0,GETU+1        ;LOOP IF NOT DONE\r
+GETV:  LDB     0,[POINT 9,JOBVER,11]   ;GET VERSION NUMBER\r
+       IDIVI   0,8             ;GET DIGIT\r
+       ADDI    1,"0"           ;TO ASCII\r
+       PUSH    PP,1            ;STACK\r
+       JUMPN   0,GETV+1        ;LOOP\r
+       MOVE    1,[POINT 7,VBUF+1,13]   ;POINTER TO DEPOSIT IN VBUF\r
+       POP     PP,0            ;GET CHARACTER\r
+       IDPB    0,1             ;DEPOSIT IT\r
+       JUMPN   0,.-2           ;KEEP GOING IF NOT ZERO\r
+IFN FORMSW,<IFE DFRMSW,<\r
+       SETOM   PHWFMT          ;HALF WORD UNLESS CHANGED BY SWITCH>>\r
+\fIFN CCLSW,<\r
+       TLZA    IO,CRPGSW       ;SET TO INIT NEW COMMAND FILE\r
+M:     TLNN    IO,CRPGSW       ;CURRENTLY DOING RPG?>\r
+IFE CCLSW,<M:>\r
+       RESET                   ;INITIALIZE PROGRAM\r
+       SETZM   BINDEV          ;CLEAR INCASE NOT USED NEXT TIME\r
+       SETZM   LSTDEV          ;SAME REASON\r
+       SETZM   INDEV           ;INCASE OF ERROR\r
+       HRRZ    MRP,MACSIZ      ;GET INITIAL SIZE\r
+       CORE    MRP,            ;BACK TO ORIGINAL SIZ4\r
+       JFCL                    ;SHOULD NEVER FAIL\r
+       SETZB   MRP,PASS1I\r
+       MOVE    [XWD PASS1I,PASS1I+1]\r
+       BLT     PASS2X-1        ;ZERO THE PASS1 AND PASS2 VARIABLES\r
+       MOVEI   PP,JOBFFI       ;SET TEMP PUSH-DOWN POINTER\r
+       MOVE    CS,[POINT 7,DBUF,6]     ;INITIALIZE FOR DATE\r
+       MSTIME  2,              ;GET TIME FROM MONITOR\r
+       PUSHJ   PP,TIMOUT       ;TIME FORMAT OUTPUT\r
+       DATE    1,              ;GET DATE\r
+       IBP     CS              ;PASS OVER PRESET SPACE\r
+       PUSHJ   PP,DATOUT       ;DATE FORMAT OUTPUT\r
+       MOVSI   FR,P1!CREFSW\r
+IFN CCLSW,<TLNE        IO,CRPGSW       ;RPG IN PROGRESS?\r
+       JRST    GOSET           ;YES, GO READ NEXT COMMAND\r
+       TLNE    IO,ARPGSW       ;NO, RPG ALLOWED?\r
+       JRST    RPGSET          ;YES, GO TRY\r
+CTLSET:        RELEASE CTL2,           ;IN CASE OF LOOKUP FAILURE>\r
+IFE CCLSW,<CTLSET:>\r
+       MOVSI   IO,IOPALL       ;ZERO FLAGS\r
+       INIT    CTL,AL          ;INITIALIZE USER CONSOLE\r
+       SIXBIT  /TTY/\r
+       XWD     CTOBUF,CTIBUF\r
+       EXIT                    ;NO TTY, NO ASSEMBLY\r
+       MOVSI   C,(SIXBIT /TTY/)\r
+       DEVCHR  C,              ;GET CHARACTERISTICS\r
+       TLNN    C,10            ;IS IT REALLY A TTY\r
+       EXIT                    ;NO\r
+       INBUF   CTL,1           ;INITIALIZE SINGLE CONTROL\r
+       OUTBUF  CTL,1           ;BUFFERS\r
+       PUSHJ   PP,CRLF         ;OUTPUT CARRIAGE RETURN - LINE FEED\r
+       MOVEI   C,"*"\r
+       IDPB    C,CTOBUF+1\r
+       OUTPUT  CTL,\r
+       INPUT   CTL,\r
+\fIFN CCLSW,<JRST BINSET                ;BEGIN WITH BINARY FILE\r
+\r
+RPGSET:\r
+IFN TEMP,<HRRZ 3,JOBFF         ;GET START OF BUFFER AREA\r
+       HRRZ 0,JOBREL           ;GET TOP OF CORE\r
+       CAIGE 0,200(3)          ;WILL BUFFER FIT?\r
+       JRST [ADDI 0,200        ;NO, GET ENUF CORE\r
+               CORE 0,         ;CORE UUO\r
+               JRST XCEED2     ;FAILED, SO GIVE UP\r
+               JRST .+1]       ;CONTINUE\r
+       HRRM 3,TMPFIL+1         ;STORE IN TMPCOR UUO IOWD\r
+       SOS TMPFIL+1            ;MAKE IT THE PROPER IOWD FORMAT\r
+       HRRM 3,CTLBLK+1         ;DUMMY UP BUFFER HEADER\r
+       MOVE 0,[XWD 2,TMPFIL]   ;SET UP FOR TEMP CORE READ\r
+       TMPCOR                  ;READ AND DELETE FILE "MAC"\r
+       JRST RPGTMP             ;NO SUCH FILE IN CORE TRY DISK\r
+       ADD 3,0                 ;CALCULATE END OF BUFFER\r
+       MOVEM 3,JOBFF           ;FIX JOBFF SO FILE WONT BE KILLED\r
+       IMULI 0,5               ;CALCULATE CHARACTER COUNT\r
+       ADDI 0,1                ;SINCE SOSG HAPPENS AFTER NOT BEFORE\r
+       MOVEM 0,CTLBLK+2        ;SET UP CHAR CNT IN BUFFER HEADER\r
+       MOVEI 0,440700          ;SET UP BYTE POINTER IN HEADER\r
+       HRLM 0,CTLBLK+1         ;BUFFER HEADER NOW SET UP\r
+       SETOM TMPFLG            ;MARK THAT A TMPCOR UUO WAS DONE\r
+       JRST RPGS2A             ;CONTINUE IN MAIN STREAM\r
+RPGTMP:        SETZM   TMPFLG          ;JUST IN CASE>\r
+       INIT    CTL2,AL         ;LOOK FOR DISK\r
+       SIXBIT  /DSK/           ;...\r
+       XWD     0,CTLBLK        ;...\r
+       JRST    CTLSET          ;DSK NOT THERE\r
+\r
+IFE STANSW,<\r
+       HRLZI   3,(SIXBIT /MAC/)        ;###MAC\r
+       MOVEI   3                       ;COUNT\r
+       PJOB    AC1,                    ;RETURNS JOB NO. TO AC1\r
+RPGLUP:        IDIVI   AC1,12                  ;CONVERT\r
+       ADDI    AC2,"0"-40              ;SIXBITIZE IT\r
+       LSHC    AC2,-6                  ;\r
+       SOJG    0,RPGLUP                ;3 TIMES\r
+       MOVEM   3,CTLBUF                ;###MAC\r
+       HRLZI   (SIXBIT /TMP/)          ;\r
+>\r
+IFN STANSW,<\r
+       MOVE    3,['QQMACR']\r
+       MOVEM   3,CTLBUF\r
+       MOVSI   0,'RPG'\r
+>\r
+       MOVEM   CTLBUF+1                ;TMP\r
+       SETZM   CTLBUF+3                ;PROG-PRO\r
+       LOOKUP  CTL2,CTLBUF             ;COMMAND FILE\r
+       JRST    CTLSET                  ;NOT THERE\r
+       HLRM    EXTMP                   ;SAVE THE EXTENSION\r
+\r
+RPGS2: INBUF   CTL2,1          ;SINGLE BUFFERED\r
+RPGS2A:        INIT    CTL,AL          ;TTY FOR CONSOLE MESSAGES\r
+       SIXBIT  /TTY/           ;...\r
+       XWD     CTOBUF,0        ;...\r
+       EXIT                    ;NO TTY, NO ASSEMBLY\r
+       OUTBUF  CTL,1           ;SINGLE BUFFERED\r
+       MOVE    JOBFF           ;REMEMBER WHERE BINARY BUFFERS BEGIN\r
+       MOVEM   SAVFF           ;...\r
+       HRRZ    JOBREL          ;TOP OF CORE\r
+       CAMLE   MACSIZ          ;SEE IF IT HAS GROWN\r
+       MOVEM   MACSIZ          ;PREVENTS ADDRESS CHECK ON EXIT\r
+       TLNE IO,CRPGSW  ;ARE WE ALREADY IN RPG MODE?\r
+       JRST M  ;MUST HAVE COME FROM @ COMMAND, RESET\r
+\r
+\fGOSET:        MOVSI   IO,IOPALL!CRPGSW        ;SET INITIAL FLAGS\r
+       MOVEI   CS,CTLSIZ       ;MAXIMUM CHARS IN A LINE\r
+       MOVE    AC1,CTLBLK+2    ;NUMBER OF CHARACTERS\r
+       MOVEM   AC1,CTIBUF+2    ;SAVE FOR PASS 2\r
+       MOVE    AC1,[POINT 7,CTLBUF]    ;WHERE TO STASH CHARS\r
+       MOVEM   AC1,CTIBUF+1    ;...\r
+GOSET1:        SOSG    CTLBLK+2        ;ANY MORE CHARS?\r
+       PUSHJ   PP,[IFN TEMP,<SKIPE TMPFLG      ;TMPCOR UUO IN PROGRESS?\r
+                  EXIT         ;YES EXIT>\r
+                  IN CTL2,             ;READ ANOTHER BUFFERFUL\r
+                  POPJ PP,             ;EVERYTHING OK, RETURN\r
+                  STATO CTL2,20000     ;EOF?\r
+                  JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]\r
+                       JRST ERRFIN]            ;GO COMPLAIN\r
+                  PUSHJ PP,DELETE      ;CMD FILE\r
+                  EXIT]                ;EOF AND FINISHED\r
+       ILDB    C,CTLBLK+1      ;GET NEXT CHAR\r
+       MOVE    RC,@CTLBLK+1    ;CHECK FOR SEQUENCE NUMBERS\r
+       TRNE    RC,1            ;...\r
+       JRST    [AOS    CTLBLK+1        ;SKIP OVER ANOTHER 5 CHARS\r
+               MOVNI   RC,5            ;...\r
+               ADDM    RC,CTLBLK+2     ;...\r
+               JRST    GOSET1  ]       ;GO READ ANOTHER CHAR\r
+       JUMPE   C,GOSET1        ;IGNORE NULLS\r
+       IDPB    C,CTIBUF+1      ;STASH AWAY\r
+       AOS     CTIBUF+2        ;INCREMENT CHAR. COUNT\r
+       CAIE    C,12            ;LINE FEED OR\r
+       CAIN    C,175           ;ALTMODE?\r
+       JRST    GOSET2          ;YES, FINISHED WITH COMMAND\r
+       CAIE    C,176\r
+       CAIN    C,33\r
+       JRST    GOSET2          ;ALTMODE.\r
+       SOJG    CS,GOSET1       ;GO READ ANOTHER\r
+       HRROI   RC,[SIXBIT /COMMAND LINE TOO LONG@/]\r
+       JRST    ERRFIN          ;GO COMPLAIN\r
+GOSET2:        MOVEI   C,12            ;MAKE SURE THERE'S A LF\r
+       IDPB    C,CTIBUF+1      ;...\r
+       MOVEM   AC1,CTIBUF+1    ;SET POINTER TO BEGINNING\r
+       AOS     CTIBUF+2        ;ADD I TO COUNT\r
+       MOVE    SAVFF           ;RESET JOBFF FOR NEW BINARY\r
+       MOVEM   JOBFF           ;...\r
+       JRST BINSET\r
+\f\r
+RPGS1: PUSHJ   PP,DELETE       ;DELETE COMMAND FILE\r
+       MOVEM   ACDEV,RPGDEV    ;GET SET TO INIT\r
+       OPEN    CTL2,RPGINI     ;DO IT\r
+       JRST    EINIT           ;ERROR\r
+       MOVEM   ACFILE,INDIR    ;USE INPUT BLOCK\r
+       MOVEM   ACPPN,INDIR+3   ;SET PPN \r
+       MOVEM   ACEXT,INDIR+1\r
+       LOOKUP  CTL2,INDIR\r
+       JRST    [JUMPN  ACEXT,RPGLOS    ;GIVE UP ,EXPLICIT EXTENSION\r
+IFE STANSW,<   MOVSI   ACEXT,(SIXBIT /CCL/)    ;IF BLANK TRY CCL>\r
+IFN STANSW,<   MOVSI   ACEXT,(SIXBIT /RPG/)    ;IF BLANK TRY RPG>\r
+               JRST    .-2     ]\r
+       HLRM    ACEXT,EXTMP     ;SAVE THE EXTENSION\r
+       HLRZ    JOBSA           ;RESET JOBFF TO ORIGINAL\r
+       MOVEM   JOBFF\r
+       TLO     IO,CRPGSW       ;TURN ON SWITCH SO WE RESET WORLD\r
+       JRST    RPGS2           ;AND GO\r
+RPGLOS:        RELEAS  CTL2,0\r
+       TLZ     IO,CRPGSW       ;STOPS IO TO UNASGD CHAN\r
+       JRST    ERRCF           ;NO FILE FOUND\r
+>\r
+\fBINSET:       PUSHJ   PP,NAME1        ;GET FIRST NAME\r
+IFN CCLSW,<CAIN        C,"!"           ;WAS THIS AN IMPERATIVE?\r
+       JRST    NUNSET          ;GET THEE TO A NUNNERY\r
+       CAIN C,"@"      ;CHEK FOR A NEW RPG FILE\r
+       JRST RPGS1>\r
+       TLNN    FR,CREFSW       ;CROSS REF REQUESTED?\r
+       JRST    LSTSE1          ;YES, SKIP BINARY\r
+       CAIN    C,","           ;COMMA?\r
+       JUMPE   ACDEV,LSTSET    ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+       CAIN    C,"_"           ;LEFT ARROW?\r
+       JUMPE   ACDEV,LSTSE1    ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+       JUMPE   ACDEV,M         ;IGNORE IF JUST <CR-LF>\r
+       TLO     FR,PNCHSW       ;OK, SET SWITCH\r
+       MOVEM   ACDEV,BINDEV    ;STORE DEVICE NAME\r
+       MOVEM   ACFILE,BINDIR   ;STORE FILE NAME IN DIRECTORY\r
+       JUMPN   ACEXT,.+2       ;EXTENSION SPECIFIED?\r
+       MOVSI   ACEXT,(SIXBIT /REL/)    ;NO, ASSUME RELOCATABLE BINARY\r
+       MOVEM   ACEXT,BINDIR+1  ;STORE IN DIRECTORY\r
+       MOVEM   ACPPN,BINDIR+3  ;SET PPN\r
+       OPEN    BIN,BININI      ;INITIALIZE BINARY\r
+       JRST    EINIT           ;ERROR\r
+       TLZE TIO,TIOLE          ;SKIP TO EOT\r
+       MTAPE BIN,10\r
+       TLZE    TIO,TIORW       ;REWIND REQUESTED?\r
+       MTAPE   BIN,1           ;YES\r
+       JUMPGE  CS,BINSE2       ;BRANCH IF NO BACK-SPACE\r
+       MTAPE   BIN,17          ;BACK-SPACE A FILE\r
+       AOJL    CS,.-1          ;TEST FOR END\r
+       WAIT    BIN,\r
+       STATO   BIN,1B24        ;LOAD POINT?\r
+       MTAPE   BIN,16          ;NO, GO FORWARD ONE\r
+BINSE2:        SOJG    CS,.-1          ;TEST FORWARD SPACING\r
+\r
+       TLNE    TIO,TIOCLD      ;DIRECTORY CLEAR REQUESTED?\r
+       UTPCLR  BIN,            ;YES, CLEAR IT\r
+       OUTBUF  BIN,2           ;SET UP TWO RING BUFFER\r
+       CAIN    C,"_"\r
+       JRST    GETSET          ;NO LISTING\r
+\fLSTSET:       PUSHJ   PP,NAME1        ;GET NEXT DEVICE\r
+LSTSE1:        CAIE    C,"_"\r
+       JRST    ERRCM\r
+       TLNE    FR,CREFSW       ;CROSS-REF REQUESTED?\r
+       JRST    LSTSE2          ;NO, BRANCH\r
+       JUMPN   ACDEV,.+2       ;YES, WAS DEVICE SPECIFIED?\r
+       MOVSI   ACDEV,(SIXBIT /DSK/)    ;NO, ASSUME DSK\r
+       JUMPN   ACFILE,.+2\r
+       MOVE    ACFILE,[SIXBIT /CREF/]\r
+       JUMPN   ACEXT,.+2\r
+IFE STANSW,<MOVSI      ACEXT,(SIXBIT /CRF/)   >\r
+IFN STANSW,<MOVSI      ACEXT,'LST'>\r
+LSTSE2:        JUMPE   ACDEV,GETSET    ;FORGET LISTING IF NO DEVICE SPECIFIED\r
+       MOVE    AC0,ACDEV\r
+       DEVCHR  AC0,            ;GET CHARACTERISTICS\r
+       TLNE    AC0,LPTBIT!DISBIT!TTYBIT\r
+       TLNE    FR,CREFSW       ; WAS CROSS-REF REQUESTED?\r
+       AOSA    OUTSW+0*TTYSW   ;NO, ASSUME TTY\r
+       JRST    ERRCM           ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY\r
+       TLNE    AC0,CONBIT      ;CONTROLING TELETYPE LISTING?\r
+       JRST    GETSET          ;YES, BUFFER ALREADY SET\r
+       MOVEM   ACDEV,LSTDEV    ;STORE DEVICE NAME\r
+       AOS     OUTSW+0*LPTSW   ;SET FOR LPT\r
+       MOVEM   ACFILE,LSTDIR   ;STORE FILE NAME\r
+       JUMPN   ACEXT,.+2\r
+       MOVSI   ACEXT,(SIXBIT /LST/)\r
+       MOVEM   ACEXT,LSTDIR+1\r
+       MOVEM   ACPPN,LSTDIR+3  ;SET PPN\r
+       OPEN    LST,LSTINI      ;INITIALIZE LISTING OUTPUT\r
+       JRST    EINIT           ;ERROR\r
+       TLZE TIO,TIOLE\r
+       MTAPE LST,10\r
+       TLZE    TIO,TIORW       ;REWIND REQUESTED?\r
+       MTAPE   LST,1           ;YES\r
+       JUMPGE  CS,LSTSE3\r
+       MTAPE   LST,17\r
+       AOJL    CS,.-1\r
+       WAIT    LST,\r
+       STATO   LST,1B24\r
+       MTAPE   LST,16\r
+LSTSE3:        SOJG    CS,.-1\r
+       TLNE    TIO,TIOCLD      ;DIRECTORY CLEAR REQUESTED?\r
+       UTPCLR  LST,            ;YES, CLEAR IT\r
+       OUTBUF  LST,2           ;SET UP A TWO RING BUFFER\r
+\fGETSET:       MOVEI   3,PDPERR\r
+       HRRM    3,JOBAPR        ;SET TRAP LOCATION\r
+       MOVEI   3,1B19          ;SET FOR PUSH-DOWN OVERFLOW\r
+       APRENB  3,\r
+       SOS     3,PDP           ;GET PDP REQUEST MINUS 1\r
+       IMULI   3,.PDP          ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)\r
+       HRLZ    MP,3\r
+       HRR     MP,JOBFF        ;SET BASIC POINTER\r
+       MOVE    PP,MP\r
+       SUB     PP,3\r
+       MOVEM   PP,RP           ;SET RP\r
+       SUB     PP,3\r
+       ASH     3,1             ;DOUBLE SIZE OF BASIC POINTER\r
+       HRL     PP,3\r
+       SUBM    PP,3            ;COMPUTE TOP LOCATION\r
+       SKIPN   UNITOP          ;IF ANY UNIVERSALS HAVE BEEN SEEN\r
+       JRST    GETSE0          ;NO\r
+       HRRZS   3               ;GET TOP OF BUFFERS AND STACKS\r
+       CAMLE   3,UNISIZ        ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE\r
+       JRST    UNIERR          ;IT WAS, YOU LOSE\r
+       SKIPA   3,UNITOP        ;DON'T LOSE THEM\r
+GETSE0:        HRRZM   3,UNISIZ        ;STORE UNTIL A UNIVERSAL IS SEEN\r
+       HRRZM   3,LADR          ;SET START OF MACRO TREE\r
+       HRRZM   3,FREE\r
+\r
+GETSE1:        HRRZ    JOBREL\r
+       SUBI    1\r
+       MOVEM   SYMTOP          ;SET TOP OF SYMBOL TABLE\r
+       SUBI    LENGTH          ;SET POINTER FOR INITIAL SYMBOLS\r
+       CAMLE   LADR            ;HAVE WE ROOM?\r
+       JRST    GETSE2          ;YES\r
+\r
+       HRRZ    2,JOBREL        ;NO, TRY FOR MORE CORE\r
+       ADDI    2,2000\r
+       CORE    2,\r
+       JRST    XCEED2  ;NO MORE, INFORM USER\r
+       JRST    GETSE1          ;TRY AGAIN\r
+\r
+GETSE2:        MOVEM   SYMBOL          ;SET START OF SYMBOL TABLE\r
+       HRLI    SYMNUM\r
+       BLT     @SYMTOP         ;STORE SYMBOLS\r
+       PUSHJ   PP,SRCHI        ;INITIALIZE TABLE\r
+       MOVE    [XWD CTIBUF+1,CTLSAV]   ;SAVE CONTROL INPUT BUFFER\r
+       BLT     CTLS1           ;FOR RESCAN ON PASS 2\r
+IFN FTDISK,<MOVSI (SIXBIT /DSK/)       ;SET INPUT TO TAKE DSK AS DEV\r
+       MOVEM ACDEVX>\r
+       PUSHJ PP,COUTI  ;INIT OUTPUT JUST IN CASE\r
+       PUSHJ   PP,INSET        ;GET FIRST INPUT FILE\r
+\r
+IFN CCLSW,<TLNE        IO,CRPGSW       ;BUT ONLY IF DOING RPG\r
+       TTCALL  3,[ASCIZ /MACRO: /]     ;PUBLISH COMPILER NAME>\r
+       MOVE CS,INDIR   ;SET UP NAME OF FIRST FILE\r
+       MOVEM CS,LSTFIL ;AS LAST PRINTED\r
+       SETZM   LSTPGN\r
+       JRST    ASSEMB          ;START ASSEMBLY\r
+\fFINIS:        CLOSE   BIN,            ;DUMP BUFFER\r
+       TLNE    FR,PNCHSW       ;PUNCH REQUESTED?\r
+       PUSHJ   PP,TSTBIN       ;YES, TEST FOR ERRORS\r
+       RELEAS  BIN,\r
+       CLOSE   LST,\r
+       SOSLE   OUTSW+0*LPTSW   ;LPT TYPE OUTPUT?\r
+       PUSHJ   PP,TSTLST       ;YES, TEST FOR ERRORS\r
+       RELEAS  LST,\r
+       RELEAS  CHAR,\r
+       OUTPUT CTL,0    ;FLUSH TTY OUTPUT\r
+       SKIPE   UNIVSN          ;SKIP IF NOT ASSEMBLING UNIVERSAL\r
+       PUSHJ   PP,UNISYM       ;STORE SYMBOLS ETC. FIRST\r
+       JRST    M               ;RETURN FOR NEXT ASSEMBLY\r
+\fINSET:        MOVEI   JOBFFI          ;POINTER TO INPUT BUFFER\r
+       HRRM    JOBFF           ;INFORM SYSTEM OF BUFFER AREA\r
+       PUSHJ   PP,NAME2        ;GET NEXT COMMAND NAME\r
+       JUMPE   ACDEV,ERRNE     ;ERROR  IF NONE LEFT\r
+       MOVEM   ACDEV,INDEV     ;STORE DEVICE\r
+       MOVEM   ACFILE,INDIR    ;STORE FILE IN DIRECTORY\r
+       MOVEM   ACPPN,INDIR+3   ;STORE PPN BEFORE WE LOSE IT\r
+       OPEN    CHAR,INDEVI\r
+       JRST    EINIT           ;ERROR\r
+       DEVCHR  ACDEV,          ;TEST CHARACTERISTICS\r
+       TLNN    ACDEV,MTABIT    ;MAG TAPE?\r
+       JRST    INSET3          ;NO\r
+       TLZN    FR,MTAPSW       ;FIRST MAG TAPE IN PASS 2?\r
+       JRST    INSET1          ;NO\r
+       TLNN    TIO,TIORW       ;YES, REWIND REQUESTED?\r
+       SUB     CS,RECCNT       ;NO, PREPARE TO BACK-SPACE TAPE\r
+INSET1:        AOS     RECCNT          ;INCREMENT FILE COUNTER\r
+       ADDM    CS,RECCNT       ;UPDATE  COUNT\r
+       TLZE TIO,TIOLE\r
+       MTAPE CHAR,10\r
+       TLZE    TIO,TIORW       ;REWIND?\r
+       MTAPE   CHAR,1          ;YES\r
+       JUMPGE  CS,INSET2\r
+       MTAPE   CHAR,17\r
+       MTAPE   CHAR,17\r
+       AOJL    CS,.-1\r
+       WAIT    CHAR,\r
+       STATO   CHAR,1B24\r
+       MTAPE   CHAR,16\r
+INSET2:        SOJGE   CS,.-1\r
+\r
+INSET3:        INBUF CHAR,1\r
+       MOVEI ACPNTR,JOBFFI\r
+       EXCH ACPNTR,JOBFF\r
+       SUBI ACPNTR,JOBFFI\r
+       MOVEI ACDEL,NUMBUF*203+1\r
+       IDIV ACDEL,ACPNTR\r
+       INBUF CHAR,(ACDEL)\r
+       JUMPN   ACEXT,INSET4    ;TAKE USER'S EXTENSION IF NON-BLANK\r
+       MOVSI   ACEXT,(SIXBIT /MAC/)    ;BLANK, TRY .MAC FIRST\r
+       PUSHJ   PP,INSETI\r
+INSET4:        PUSHJ   PP,INSETI\r
+       JUMPE   ACEXT,ERRCF     ;ERROR IF ZERO\r
+       TLNE    ACDEV,TTYBIT    ;TELETYPE?\r
+       SETSTS  CHAR,AL         ;YES, CHANGE TO ASCII LINE\r
+\f                              ;DO ALL ENTERS HERE FOR LEVEL D\r
+       SKIPE   ENTERS          ;HAVE ENTERS BEEN DONE ALREADY?\r
+       JRST    ENTRDN          ;YES, DON'T DO TWICE\r
+       SKIPN   ACEXT,LSTDEV    ;IS THERE A LIST DEVICE?\r
+       JRST    LSTSE5          ;NO SO DON'T DO ENTER\r
+       SKIPN   ACFILE,LSTDIR   ;GET FILE NAME INCASE OF ERROR\r
+       JRST    [DEVCHR ACEXT,  \r
+               TLNE    ACEXT,DIRBIT    ;DOES IT HAVE A DIRECTORY?\r
+               JRST    LSTSE4          ;YES, GIVE UP BEFORE HARM IS DONE\r
+               SKIPE   ACFILE,INDIR    ;USE INPUT FILE NAME\r
+               MOVEM   ACFILE,LSTDIR   ;TOO BAD IF ZERO ALSO\r
+               JRST    LSTSE4]\r
+       HLLZ    ACEXT,LSTDIR+1  ;EXT ALSO\r
+       MOVE    ACPPN,LSTDIR+3  ;SAVE PPN\r
+       LOOKUP  LST,LSTDIR      ;PREVIOUS ONE STILL THERE\r
+       JRST    LSTSE4          ;NO\r
+       SETZM   LSTDIR          ;YES,CLEAR NAME\r
+       MOVEM   ACPPN,LSTDIR+3  ;RESET PPN\r
+       RENAME  LST,LSTDIR\r
+       CLOSE   LST,            ;IGNORE FAILURE\r
+       MOVEM   ACFILE,LSTDIR   ;RESTORE NAME\r
+       HLLZS   LSTDIR+1        ;BH 11/19/74 FOR DATE75.  CLEAR RH.\r
+       SETZM   LSTDIR+2        ;CLEAR PROTECTION AND DATE\r
+       MOVEM   ACPPN,LSTDIR+3  ;SET PPN AGAIN\r
+LSTSE4:        \r
+IFN STANSW,<\r
+       MOVSI   ACEXT,400000\r
+       MOVEM   ACEXT,LSTDIR+2  ;SET DUMP NEVER BIT.\r
+>\r
+       ENTER   LST,LSTDIR      ;SET UP DIRECTORY\r
+       JRST    ERRCL           ;ERROR\r
+LSTSE5:        SKIPN   ACEXT,BINDEV    ;A BINARY DEVICE THEN ?\r
+       JRST    ENTRDN          ;NO\r
+       SKIPN   ACFILE,BINDIR   ;INCASE OF ERROR\r
+       JRST    [DEVCHR ACEXT,  \r
+               TLNE    ACEXT,DIRBIT    ;DOES IT HAVE A DIRECTORY?\r
+               JRST    .+1             ;YES, GIVE UP BEFORE HARM IS DONE\r
+               SKIPE   ACFILE,INDIR    ;USE INPUT FILE NAME\r
+               MOVEM   ACFILE,BINDIR   ;TOO BAD IF ZERO ALSO\r
+               JRST    .+1]\r
+IFN STANSW,<\r
+       MOVSI   ACEXT,400000\r
+       MOVEM   ACEXT,BINDIR+2\r
+>\r
+       HLLZS   ACEXT,BINDIR+1  ;BH 11/19/74 DATE75.  WAS HLLZ.\r
+       ENTER   BIN,BINDIR      ;ENTER FILE NAME\r
+       JRST    ERRCB           ;ERROR\r
+\r
+ENTRDN:        SETOM   ENTERS          ;MAKE SURE ONLY DONE ONCE\r
+       MOVE    CS,[POINT 7,DEVBUF]\r
+       PUSH    PP,1            ;SAVE THE ACCS\r
+       PUSH    PP,2\r
+       PUSH    PP,3\r
+       SKIPN   2,INDIR         ;GET INPUT NAME\r
+       JRST    FINDEV          ;FINISHED WITH DEVICE\r
+       SETZ    1,              ;CLEAR FOR RECEIVING\r
+       LSHC    1,6             ;SHIFT ONE CHAR. IN\r
+       ADDI    1,40            ;FORM ASCII\r
+       IDPB    1,CS            ;STORE CHAR.\r
+       JUMPN   2,.-4           ;MORE TO DO?\r
+       MOVEI   1,"     "       ;SEPARATE BY TAB\r
+       IDPB    1,CS\r
+       HLLZ    2,INDIR+1       ;GET EXT\r
+       JUMPE   2,FINEXT        ;NO EXT\r
+       SETZ    1,\r
+       LSHC    1,6             ;SAME LOOP AS ABOVE\r
+       ADDI    1,40\r
+       IDPB    1,CS\r
+       JUMPN   2,.-4\r
+FINEXT:        MOVEI   1,"     "\r
+       IDPB    1,CS            ;SEPARATE BY TAB\r
+       LDB     1,[POINT 12,INDIR+2,35] ;GET DATE\r
+       LDB     2,[POINT 3,INDIR+1,20]  ;BH 11/19/74 DATE75.\r
+       DPB     2,[POINT 3,1,23]        ;BH 11/19/74 DATE75.\r
+       JUMPE   1,FINDEV        ;NO DATE?\r
+       PUSHJ   PP,DATOUT       ;STORE IT\r
+       LDB     2,[POINT 11,INDIR+2,23] ;GET CREATION TIME\r
+       JUMPE   2,FINDEV        ;NO TIME (DECTAPE)\r
+       MOVEI   1," "           ;SEPARATE BY SPACE\r
+       IDPB    1,CS\r
+       PUSHJ   PP,TIMOU1       ;STORE TIME\r
+FINDEV:        SETZ    1,\r
+       MOVEI   2,"     "       ;FINAL TAB\r
+       IDPB    2,CS\r
+       IDPB    1,CS            ;TERMINATE FOR NOW\r
+       POP     PP,3            ;RESTORE ACCS\r
+       POP     PP,2\r
+       POP     PP,1\r
+       SKIPN   PAGENO          ;IF FIRST TIME THRU\r
+       JRST    OUTFF           ;START NEW PAGE\r
+       SETZM PAGENO            ;ON NEW FILE, RESET PAGES\r
+       JRST    OUTFF2          ;DON'T START NEW PAGE UNLESS FF\r
+\r
+INSETI:        HLLZM   ACEXT,INDIR+1   ;STORE EXTENSION\r
+       MOVE    ACPPN,INDIR+3   ;SAVE PPN\r
+       LOOKUP  CHAR,INDIR\r
+       SKIPA   ACEXT,INDIR+1   ;GET ERROR CODE\r
+       JRST    CPOPJ1          ;SKIP-RETURN IF FOUND\r
+       TRNE    ACEXT,-1        ;ERROR CODE OF 0 IS FILE NOT FOUND\r
+       JRST    ERRCF           ;FILE THERE BUT NOT READABLE\r
+       SETZ    ACEXT,          ;CLEAR EXT AND TRY AGAIN\r
+       MOVEM   ACPPN,INDIR+3   ;RESTORE PPN\r
+       POPJ    PP,\r
+\fREC2: MOVS    [XWD CTIBUF+1,CTLSAV]   ;RESCAN CONTROL (FROM PASS1 END STMNT)\r
+       BLT     CTIBUF+2        ;INPUT BUFFER\r
+       MOVEI   "_"\r
+       HRLM    ACDELX          ;FUDGE PREVIOUS DELIMITER\r
+IFN RENTSW,<MOVE HHIGH ;GET HI-SEG BREAK\r
+       MOVEM   HIGH1   ;SAVE THE ONE WE GOT ON PASS1 (FOR HISEG)>\r
+       SETZM   PASS2I\r
+       MOVE    [XWD PASS2I,PASS2I+1]\r
+       BLT     PASS2X-1                ;ZERO PASS2 VARIABLES\r
+       TLO     FR,MTAPSW!LOADSW        ;SET FLAGS \r
+\r
+GOTEND:        MOVE    INDEV           ;GET LAST DEVICE\r
+       DEVCHR                  ;GET ITS CHARACTERISTICS\r
+       TLNE    4               ;TEST FOR DIRECTORY (DSK OR DTA)\r
+       JRST    EOT             ;YES, SO DON'T WASTE TIME\r
+       JRST    .+3             ;NO, INPUT BUFFER BY BUFFER\r
+       IN      CHAR,\r
+       JRST    .-1             ;NO ERRORS\r
+       STATO   CHAR,1B22       ;TEST FOR EOF\r
+       JRST    .-3             ;IGNORE ERRORS\r
+\r
+EOT:   PUSHJ   PP,SAVEXS       ;SAVE REGISTERS\r
+       PUSHJ   PP,INSET        ;GET THE NEXT INPUT DEVICE\r
+       HRROI   RC,[SIXBIT /END OF PASS 1@/]    ;ASSUME END OF PASS\r
+       TLZN    FR,LOADSW       ;ZERO ONLY ON END OF PASS 1\r
+       HRROI   RC,[SIXBIT /LOAD THE NEXT FILE@/]       ;NOT END OF PASS\r
+       TLNN    ACDEV,(1B13!1B15)       ;WAS ALL THAT WORK NECESSARY?\r
+       PUSHJ   PP,TYPMSG       ;YES\r
+\r
+RSTRXS:        MOVSI   RC,SAVBLK       ;SET POINTER\r
+       BLT     RC,RC-1         ;RESTORE REGISTERS\r
+       MOVE    RC,SAVERC       ;RESTORE RC\r
+       POPJ    PP,             ;EXIT\r
+\r
+SAVEXS:        MOVEM   RC,SAVERC       ;SAVE RC\r
+       MOVEI   RC,SAVBLK       ;SET POINTER\r
+       BLT     RC,SAVBLK+RC-1  ;BLT ALL REGISTERS BELOW RC\r
+       POPJ    PP,             ;EXIT\r
+\fNAME1:        SETZM   ACDEVX          ;ENTRY FOR DESTINATION\r
+NAME2: SETZB   ACDEV,INDIR+2   ;ENTRY FOR SOURCE\r
+       MOVEI   ACFILE,0        ;CLEAR FILE\r
+       HLRZ    ACDEL,ACDELX    ;GET PREVIOUS DELIMITER\r
+       SETZB   TIO,CS\r
+       SETZB   ACEXT,INDIR+3   ;RESET EXTENSION AND PROGRAM-NUMBER PAIR\r
+       SETZM   PPN             ;CLEAR PPN\r
+NAME3: MOVSI   ACPNTR,(POINT 6,AC0)    ;SET POINTER\r
+       TDZA    AC0,AC0         ;CLEAR SYMBOL\r
+\r
+SLASH: PUSHJ   PP,SW0\r
+GETIOC:        PUSHJ   PP,TTYIN        ;GET INPUT CHARACTER\r
+       CAIN    C,"/"\r
+       JRST    SLASH\r
+       CAIN    C,"("\r
+       JRST    SWITCH\r
+       CAIN    C,":"\r
+       JRST    DEVICE\r
+       CAIN    C,"."\r
+       JRST    NAME\r
+IFN CCLSW,<CAIE        C,"!"           ;IS CHAR AN IMPERATIVE?\r
+       CAIN    C,"@"\r
+       JRST    TERM            ;YES, GO DO IT>\r
+       CAIE    C,33            ;CHECK FOR THREE FLAVORS OF ALT-MODE\r
+       CAIN    C,176           ;...\r
+       JRST    TERM            ;...\r
+       CAIG    C,CR            ;LESS THAN CR?\r
+       CAIGE   C,LF            ;AND GREATER THAN LF?\r
+       CAIN    C,175           ;OR 3RD ALTMOD\r
+       JRST    TERM            ;YES\r
+IFN FTDISK,<CAIN C,"["\r
+       JRST    PROGNP          ;GET PROGRAMER NUMBER PAIR>\r
+       CAIN    C,"="           ;EQUALS IS SAME AS LEFT ARROW\r
+       TRCA    C,142           ;SO MAKE IT A "_" AND SKIP\r
+       CAIE    C,","\r
+       CAIN    C,"_"\r
+       JRST    TERM\r
+       CAIGE   C,40            ;VALID AS SIXBIT?\r
+       JRST    [CAIN C,"Z"-100 ;NO,IS IT ^Z\r
+               EXIT            ;YES,EXIT FOR BATCH\r
+               JRST    GETIOC] ;JUST IGNORE\r
+       SUBI    C,40            ;CONVERT TO 6-BIT\r
+       TLNE    ACPNTR,770000   ;HAVE WE STORED SIX BYTES?\r
+       IDPB    C,ACPNTR        ;NO, STORE IT\r
+       JRST    GETIOC          ;GET NEXT CHARACTER\r
+\r
+DEVICE:        JUMPN   ACDEV,ERRCM     ;ERROR IF ALREADY SET\r
+       MOVE    ACDEV,AC0       ;DEVICE NAME\r
+       JRST    DEVNAM          ;COMMON CODE\r
+\r
+NAME:  JUMPN   ACFILE,ERRCM    ;ERROR IF ALREADY SET\r
+       MOVE    ACFILE,AC0      ;FILE NAME\r
+DEVNAM:        MOVE    ACDEL,C         ;SET DELIMITER\r
+       JRST    NAME3           ;GET NEXT SYMBOL\r
+\r
+TERM:  JUMPE   ACDEL,TERM1     ;IF NO PREVIOUS TERMINATOR, THEN FILENAME\r
+       CAIN    ACDEL,"_"       ;...\r
+       JRST    TERM1           ;...\r
+       CAIE    ACDEL,":"       ;IF PREVIOUS DELIMITER\r
+       CAIN    ACDEL,","       ;WAS COLON OR COMMA\r
+TERM1: MOVE    ACFILE,AC0      ;SET FILE\r
+       CAIN    ACDEL,"."       ;IF PERIOD,\r
+       HLLZ    ACEXT,AC0       ;SET EXTENSION\r
+       HRLM    C,ACDELX        ;SAVE PREVIOUS DELIMITER\r
+       JUMPN   ACDEV,.+2       ;IF DEVICE SET USE IT\r
+       SKIPA   ACDEV,ACDEVX    ;OTHERWISE USE LAST DEVICE\r
+       MOVEM   ACDEV,ACDEVX    ;AND DEVICE\r
+       MOVE    ACPPN,PPN       ;PUT PPN IN RIGHT PLACE\r
+IFN FTDISK,<CAIN C,"!"         ;IMPERATIVE?\r
+       POPJ    PP,             ;YES, DON'T ASSUME DEV\r
+       JUMPE   ACFILE,CPOPJ    ;IF THERE IS A FILE,\r
+       JUMPN   ACDEV,.+2       ;BUT NO DEVICE\r
+       MOVSI   ACDEV,(SIXBIT /DSK/)    ;THEN ASSUME DISK>\r
+       POPJ    PP,             ;EXIT\r
+\fERRCM:        HRROI   RC,[SIXBIT /COMMAND ERROR@/]\r
+       JRST    ERRFIN\r
+\r
+IFN FTDISK,<PROGNP:\r
+PROGN1:        HRLZM   RC,PPN          ;COMMA, STORE LEFT HALF\r
+PROGN2:        MOVEI   RC,0            ;CLEAR AC\r
+PROGN3:        PUSHJ   PP,TTYIN\r
+       CAIN    C,","\r
+       JRST    PROGN1          ;STORE LEFT HALF\r
+       HRRM    RC,PPN          ;ASSUME TERMINAL\r
+       CAIN    C,"]"\r
+       JRST    GETIOC          ;YES, RETURN TO MAIN SCAN\r
+IFE STANSW,<\r
+       CAIL    C,"0"           ;CHECK FOR VALID NUMBERS\r
+       CAILE   C,"7"\r
+       JRST    ERRCM           ;NOT VALID\r
+       LSH     RC,3            ;SHIFT PREVIOUS RESULT\r
+       ADDI    RC,-"0"(C)      ;ADD IN NEW NUMBER>\r
+IFN STANSW,<LSH        RC,6            ;SHIFT PREVIOUS RESULT\r
+       ADDI    RC,-40(C)       ;PUT IN NEW CHARACTER>\r
+       JRST    PROGN3          ;GET NEXT CHARACTER>\r
+\fSWITC0:       PUSHJ   PP,SW1          ;PROCESS CHARACTER\r
+SWITCH:        PUSHJ   PP,TTYIN        ;GET NEXT CHARACTER\r
+       CAIE    C,")"           ;END OF STRING?\r
+       JRST    SWITC0          ;NO\r
+       JRST    GETIOC          ;YES\r
+\r
+SW0:   PUSHJ   PP,TTYIN\r
+SW1:   MOVEI   C,-"A"(C)       ;CONVERT FROM ASCII TO NUMERIC\r
+       CAILE   C,"Z"-"A"       ;WITHIN BOUNDS? (IS IT ALPHA?)\r
+       JRST    ERRCM           ;NO, ERROR\r
+       MOVE    RC,[POINT 4,BYTAB]\r
+       IBP     RC\r
+       SOJGE   C,.-1           ;MOVE TO PROPER BYTE\r
+       LDB     C,RC            ;PICK UP BYTE\r
+       JUMPE   C,ERRCM         ;TEST FOR VALID SWITCH\r
+       CAIG    C,SWTABT-SWTAB  ;LEGAL ON SOURCE?\r
+       JUMPL   PP,ERRCM        ;NO, TEST FOR SOURCE\r
+       LDB     RC,[POINT 4,SWTAB-1(C),12]\r
+       CAIN    RC,IO\r
+       SKIPN   CTLSAV          ;IF PASS2 OR IO SWITCH,\r
+       XCT     SWTAB-1(C)      ;EXECUTE INSTRUCTION\r
+       POPJ    PP,             ;EXIT\r
+       TLZ     IO,IOSALL       ;TAKE CARE OF /X\r
+       POPJ    PP,\r
+\r
+DEFINE HELP (TEXT)<\r
+       XLIST\r
+       ASCIZ ?TEXT?\r
+       LIST>\r
+\r
+HLPMES:        HELP <\r
+Switches are :-\r
+/A advance one file\r
+/B backspace one file\r
+/C produce a cref listing\r
+/E list macro expansions (LALL)\r
+/F list in new format (.MFRMT)\r
+/G list in old format (.HWFRMT)\r
+/H type this text\r
+/L reinstate listing (LIST)\r
+/M suppress ascii in macro and repeat expansion (SALL)\r
+/N suppress error printout on tty\r
+/O set MLOFF pseudo-op\r
+/P increase size of the pushdown stack\r
+/Q suppress Q errors on the listing\r
+/S suppress listing (XLIST)\r
+/T rewind device\r
+/X suppress all macro expansions (XALL)\r
+/Z zero the directory\r
+Switches A,B,C,T,W,X, and Z must immediately follow\r
+the device or file to which they refer.\r
+>\r
+\f      DEFINE  SETSW   (LETTER,INSTRUCTION) <  INSTRUCTION\r
+J=     <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>\r
+       SETCOD  \I,J>\r
+\r
+       DEFINE  SETCOD          (I,J)\r
+       <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>\r
+\r
+BYTAB0=        0                       ;INITIALIZE TABLE\r
+BYTAB1=        0\r
+BYTAB2=        0\r
+\r
+SWTAB:\r
+       SETSW   Z,<TLO  TIO,TIOCLD      >\r
+       SETSW   C,<TLZ  FR,CREFSW       >\r
+       SETSW   P,<SOS  PDP             >\r
+SWTABT:                                ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY\r
+       SETSW   A,<ADDI CS,1            >\r
+       SETSW   B,<SUBI CS,1            >\r
+       SETSW   E,<TLZ  IO,IOPALL!IOSALL        >\r
+IFN FORMSW,<   SETSW   F,<SETZM        HWFMT>\r
+               SETSW   G,<SETOM        HWFMT>>\r
+       SETSW   H,<OUTSTR       HLPMES>\r
+       SETSW   L,<TLZ  IO,IOMSTR       >\r
+       SETSW   M,<TLO  IO,IOPALL!IOSALL        >\r
+       SETSW   N,<HLLOS   TYPERR       >\r
+       SETSW   O,<XCT  OFFML           >\r
+       SETSW   Q,<TLO  FR,ERRQSW       >\r
+       SETSW   S,<TLO  IO,IOMSTR       >\r
+       SETSW   T,<TLO  TIO,TIOLE       >\r
+       SETSW   W,<TLO  TIO,TIORW       >\r
+       SETSW   X,<TLOA IO,IOPALL       >\r
+\r
+BYTAB:                         ;BYTAB CONTAINS AN INDEX TO SWTAB\r
+                               ;IT CONSIST OF 9 4BIT BYTES/WORD\r
+                               ;OR ONE BYTE FOR EACH LETTER\r
+\r
+       +BYTAB0                 ;A-I    BYTE = 1 THROUGH 17 = INDEX\r
+       +BYTAB1                 ;J-R    BYTE = 0 = COMMAND ERROR\r
+       +BYTAB2                 ;S-Z\r
+\r
+IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>\r
+\fTTYIN:        SOSGE   CTIBUF+2        ;ENUF CHAR.?\r
+       JRST    TTYERR          ;NO\r
+       ILDB    C,CTIBUF+1      ;GET CHARACTER\r
+       CAIE    C," "           ;SKIP BLANKS\r
+       CAIN    C,HT            ;AND TABS\r
+       JRST    TTYIN\r
+       CAIN    C,15            ;CR?\r
+       SETZM   CTIBUF+2        ;YES,IGNORE REST OF LINE\r
+       CAIG C,"Z"+40           ;CHECK FOR LOWER CASE\r
+       CAIGE C,"A"+40\r
+       POPJ    PP,             ;NO,EXIT\r
+       SUBI C,40\r
+       POPJ    PP,             ;YES, EXIT\r
+\r
+TTYERR:        SKIPN   INDEV           ;INPUT DEVICE SEEN?\r
+       JRST    ERRCM           ;NO, SO MISSING "_"\r
+ERRNE: HRROI   RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]\r
+ERRNE0:        SKPINC  V       ;SEE IF WE CAN INPUT A CHAR.\r
+         JFCL          ;BUT ONLY TO DEFEAT ^O\r
+       PUSHJ PP,TYPMSG ;OUTPUT IT\r
+       SKIPE LITLVL    ;SEE IF IN LITERAL\r
+       SKIPN   LITPG   ;PAGE 0 MEANS NOT IN A LITERAL REALY\r
+       JRST ERRNE1     ;NO, TRY OTHERS\r
+       MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]\r
+       PUSHJ PP,PRNUM  ;GO PRINT INFORMATION\r
+ERRNE1:        MOVEI V,0       ;CHECK FOR OTHER PLACES\r
+       SKIPE INDEF\r
+       MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]\r
+       SKIPE INTXT\r
+       MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]\r
+       SKIPE INREP\r
+       MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]\r
+       SKIPE INCND\r
+       MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]\r
+       SKIPGE MACENL\r
+ERRNE2:        MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]\r
+       JUMPN V,ERRNE3\r
+       SKIPN   LITLVL          ;HAD ONE PAGE NUMBER ALREADY\r
+       SKIPA   V,[XWD [SIXBIT /@/],PAGENO]     ;BETTER THAN NOTHING\r
+       JRST    .+2\r
+ERRNE3:        PUSHJ PP,PRNUM\r
+       HRROI RC,[SIXBIT /@/]   ;WILL GET A RETURN\r
+       JRST ERRFIN\r
+\r
+ERRMS1:        SIXBIT / ERRORS DETECTED@/\r
+ERRMS2:        SIXBIT /?1 ERROR DETECTED@/\r
+ERRMS3:        SIXBIT /NO ERRORS DETECTED@/\r
+EINIT: MOVE    RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]\r
+       JRST    ERRFIN\r
+\fERRCL:        HRRZ    RC,LSTDIR+1     ;GET LST DEV ERROR CODE\r
+       JRST    .+2             ;GET ERROR MESSAGE\r
+ERRCB: HRRZ    RC,BINDIR+1     ;GET BIN DEV ERROR CODE\r
+       JUMPN   RC,ERRTYP\r
+       SOJA    RC,ERRTYP       ;SPECIAL CASE IF ERROR CODE 0\r
+\r
+ERRCF: HRRZ    RC,INDIR+1      ;GET INPUT DEV ERROR CODE\r
+       HLLZ    ACEXT,INDIR+1   ;SET UP EXT\r
+\r
+ERRTYP:        CAIL    RC,TABLND-TABLE ;IS ERROR CODE LEGAL?\r
+       SKIPA   RC,TABLND       ;NO, GIVE CATCH ALL MESSAGE\r
+       MOVE    RC,TABLE(RC)    ;YES, PICK UP MESSAGE\r
+\r
+ERRFIN:        SKPINC  C               ;SEE IN WE CAN INPUT A CHAR.\r
+         JFCL                  ;BUT ONLY TO DEFEAT ^O\r
+       PUSHJ   PP,CRLF\r
+       MOVEI   C,"?"\r
+       PUSHJ   PP,TYO\r
+       PUSHJ   PP,TYPMS1\r
+       CLOSE   LST,            ;GIVE USER A PARTIAL LISTING\r
+       CLOSE   BIN,40          ;BUT NEVER A BUM REL FILE\r
+IFN CCLSW,<AOS JOBERR          ;RECORD ERROR SO EXECUTION DELETED>\r
+       JRST    M\r
+\r
+       [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE\r
+TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE\r
+       [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE\r
+       [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE\r
+       [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE\r
+       [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE\r
+       [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE\r
+       [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE\r
+       [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE\r
+       [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE\r
+       [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE\r
+       [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE\r
+       [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE\r
+       [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE\r
+       [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE\r
+       [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE\r
+       [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE\r
+       [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE\r
+       [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE\r
+       [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE\r
+       [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE\r
+       [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE\r
+       [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE\r
+       [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE\r
+\r
+TABLND:        [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE\r
+\fTYPMSG:       PUSHJ   PP,CRLF         ;MOVE TO NEXT LINE\r
+TYPMS1:        HLRZ    CS,RC           ;GET FIRST MESSAGE\r
+       CAIE    CS,-1           ;SKIP IF MINUS ONE\r
+       PUSHJ   PP,TYPM2        ;TYPE MESSAGE\r
+       HRRZ    CS,RC           ;GET SECOND HALF\r
+       PUSHJ   PP,TYPM2\r
+\r
+CRLF:  MOVEI   C,CR            ;OUTPUT CARRIAGE RETURN\r
+       PUSHJ   PP,TYO\r
+       MOVEI   C,LF            ;AND LINE FEED\r
+\r
+TYO:   SOSG    CTOBUF+2        ;BUFFER FULL?\r
+       OUTPUT  CTL,0           ;YES, DUMP IT\r
+       IDPB    C,CTOBUF+1      ;STORE BYTE\r
+       CAIG    C,FF            ;FORM FEED?\r
+       CAIGE   C,LF            ;V TAB OR LINE FEED?\r
+       POPJ    PP,             ;NO\r
+       OUTPUT  CTL,0           ;YES\r
+       POPJ    PP,             ;AND EXIT\r
+\r
+TYPM2: MOVSI   C,(1B0)         ;ANTICIPATE REGISTER WORD\r
+       CAIN    CS,ACFILE       ;FILE NAME ?\r
+       JRST    [JUMPE  ACEXT,.+1       ;YES, TEST FOR EXT\r
+               LSH     ACEXT,-6        ;MAKE SPACE FOR "."\r
+               IOR     ACEXT,[SIXBIT /.   @/]\r
+               JRST    TYPM2A]\r
+       CAIG    CS,17           ;IS IT?\r
+       MOVEM   C,1(CS)\r
+TYPM2A:        HRLI    CS,(POINT 6,,)  ;FORM BYTE POINTER\r
+\r
+TYPM3: ILDB    C,CS            ;GET A SIXBIT BYTE\r
+       CAIN    C,40            ;"@"?\r
+       JRST    TYO             ;YES, TYPE SPACE AND EXIT\r
+       ADDI    C,40            ;NO, FORM 7-BIT ASCII\r
+       PUSHJ   PP,TYO          ;OUTPUT CHARACTER\r
+       JRST    TYPM3\r
+\r
+\fXCEEDS:       ADDI SX,2000            ;ADJUST SYMBOL POINTER\r
+XCEED: PUSHJ   PP,SAVEXS       ;SAVE THE REGISTERS\r
+       HRRZ    1,JOBREL        ;GET CURRENT TOP\r
+       MOVEI   0,2000(1)\r
+       CORE    0,              ;REQUEST MORE CORE\r
+       JRST    XCEED2          ;ERROR, BOMB OUT\r
+       HRRZ    2,JOBREL        ;GET NEW TOP\r
+\r
+XCEED1:        MOVE    0,0(1)          ;GET ORIGIONAL\r
+       MOVEM   0,0(2)          ;STORE IN NEW LOCATION\r
+       SUBI    2,1             ;DECREMENT UPPER\r
+       CAMLE   1,SYMBOL        ;HAVE WE ARRIVED?\r
+       SOJA    1,XCEED1        ;NO, GET ANOTHER\r
+       MOVEI   1,2000\r
+       ADDM    1,SYMBOL\r
+       ADDM    1,SYMTOP\r
+       PUSHJ   PP,SRCHI        ;RE-INITIALIZE SYMBOL TABLE\r
+       JRST    RSTRXS          ;RESTORE REGISTERS AND EXIT\r
+\r
+XCEED2:        HRROI   RC,[SIXBIT /INSUFFICIENT CORE@/]\r
+       JRST    ERRNE0\r
+PDPERR:        HRROI   RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]\r
+       JRST    ERRNE0\r
+\r
+PRNUM: HLRZ CS,V       ;GET MESSAGE\r
+       PUSHJ PP,TYPM2\r
+       MOVEI   CS,[SIXBIT /ON PAGE@/]\r
+       PUSHJ   PP,TYPM2\r
+       MOVE AC0,(V)    ;GET PAGE\r
+       PUSHJ PP,DP1    ;PRINT NUMBER\r
+       MOVEI C,40\r
+       PUSHJ PP,TYO\r
+       SKIPN AC1,1(V)  ;GET SEQ NUM IF THERE\r
+       POPJ PP,        ;NO, RETURN\r
+       MOVEM AC1,OUTSQ\r
+       MOVEI   CS,[SIXBIT /LINE@/]\r
+       PUSHJ   PP,TYPM2\r
+       MOVEI AC0,OUTSQ ;PRINT IT\r
+       OUTPUT CTL,0    ;TO MAKE THINGS PRINT IN RIGHT ORDER\r
+       DDTOUT AC0,\r
+       MOVEI C,40\r
+       JRST TYO        ;AND RETURN\r
+\r
+DP1:   IDIVI AC0,^D10\r
+       HRLM AC1,(PP)\r
+       JUMPE   AC0,.+2\r
+       PUSHJ PP,DP1\r
+       HLRZ C,(PP)\r
+       ADDI C,"0"\r
+       JRST TYO\r
+\fRIM0: TDO     FR,AC0          ;SET RIM/RIM10 FLAG\r
+       TLNE    FR,PNCHSW       ;FORGET IT IF PUNCH RESET\r
+       SETSTS  BIN,IB          ;SET TO IMAGE BINARY MODE\r
+       POPJ    PP,\r
+\r
+ROUT:  EXCH CS,RIMLOC\r
+       SUB PP,[XWD 1,1]        ;CLEAR OUT STACK WFW\r
+       TLNE FR,R1BSW\r
+       JRST ROUT6\r
+       TLNN    FR,RIM1SW\r
+       JRST    ROUT1\r
+       JUMPE   CS,ROUT1        ;RIM10 OUTPUT\r
+       SUB     CS,RIMLOC\r
+       JUMPE   CS,ROUT1\r
+       JUMPG   CS,ERRAX\r
+       MOVEI   C,0\r
+       PUSHJ   PP,PTPBIN\r
+       AOJL    CS,.-1\r
+ROUT1: MOVSI   C,(DATAI PTR,)  ;RIM OUTPUT\r
+       HRR C,LOCO              ;GET ADDRESS\r
+       TLNE    FR,RIM1SW       ;NO DATAI IF RIM10\r
+       AOSA    RIMLOC\r
+       PUSHJ   PP,PTPBIN       ;OUTPUT\r
+       MOVE    C,AC0           ;CODE\r
+       AOSA    LOCO            ;INCREMENT CURRENT LOCATION\r
+\r
+OUTBIN:        TLNN    FR,RIMSW!RIM1SW!R1BSW   ;EXIT IF RIM MODE\r
+PTPBIN:        TLNN    FR,PNCHSW       ;EXIT IF PUNCH NOT REQUESTED\r
+       POPJ    PP,\r
+       SOSG    BINBUF+2        ;TEST FOR BUFFER FULL\r
+       PUSHJ   PP,DMPBIN       ;YES, DUMP IT\r
+       IDPB    C,BINBUF+1      ;DEPOSIT BYTE\r
+       POPJ    PP,             ;EXIT\r
+\r
+\fDMPBIN:       OUT     BIN,0           ;DUMP THE BUFFER\r
+       POPJ    PP,             ;NO ERRORS\r
+TSTBIN:        GETSTS  BIN,C           ;GET STSTUS BITS\r
+       TRNN    C,ERRBIT        ;ERROR?\r
+       POPJ    PP,             ;NO, EXIT\r
+       MOVE    AC0,BINDEV      ;YES, GET TAG\r
+       JRST    ERRLST          ;TYPE MESSAGE AND ABORT\r
+\r
+DMPLST:        OUT     LST,0           ;OUTPUT BUFFER\r
+       POPJ    PP,             ;NO ERRORS\r
+TSTLST:        GETSTS  LST,C           ;ANY ERRORS?\r
+       TRNN    C,ERRBIT\r
+       POPJ    PP,             ;NO, EXIT\r
+       MOVE    AC0,LSTDEV\r
+ERRLST:        MOVSI   RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]\r
+       TRNE    C,IOIMPM        ;IMPROPER MODE?\r
+       JRST    ERRFIN          ;YES\r
+       MOVSI   RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]\r
+       TRNE    C,IODERR        ;DEVICE DATA ERROR?\r
+       JRST    ERRFIN          ;YES\r
+       MOVSI   RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
+       TRNE    C,IODTER        ;IS IT\r
+       JRST    ERRFIN          ;YES\r
+       MOVE    CS,AC0          ;GET DEVICE\r
+       DEVCHR  CS,             ;FIND OUT WHAT IT IS\r
+       MOVSI   RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]\r
+       TLNN    CS,DSKBIT       ;SKIP IF DSK OUTPUT\r
+       MOVSI   RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]\r
+       JRST    ERRFIN\r
+\f      \r
+R1BDMP:        SETCM CS,R1BCNT\r
+       JUMPE CS,R1BI\r
+       HRLZS C,CS\r
+       HRR C,R1BLOC\r
+       HRRI C,-1(C)\r
+       MOVEM C,R1BCHK\r
+       PUSHJ PP,PTPBIN\r
+       HRRI CS,R1BBLK\r
+R1BDM1:        MOVE C,0(CS)\r
+       ADDM C,R1BCHK\r
+       PUSHJ PP,PTPBIN\r
+       AOBJN CS,R1BDM1\r
+       MOVE C,R1BCHK\r
+       PUSHJ PP,PTPBIN\r
+R1BI:  SETOM R1BCNT\r
+       PUSH PP,LOCO\r
+       POP PP,R1BLOC\r
+       POPJ PP,\r
+\r
+ROUT6: CAME CS,RIMLOC\r
+       PUSHJ PP,R1BDMP\r
+       AOS C,R1BCNT\r
+       MOVEM AC0,R1BBLK(C)\r
+       AOS LOCO\r
+       CAIN C,.R1B-1\r
+       PUSHJ PP,R1BDMP\r
+       AOS RIMLOC\r
+       POPJ PP,\r
+       \r
+\r
+\fREAD0:        PUSHJ   PP,EOT          ;END OF TAPE\r
+\r
+READ:  SOSGE   IBUF+2          ;BUFFER EMPTY?\r
+       JRST    READ3           ;YES\r
+READ1: ILDB    C,IBUF+1        ;PLACE CHARACTER IN C\r
+       MOVE CS,@IBUF+1         ;CHECK FOR SEQUENCE NUMBER\r
+       TRNN CS,1\r
+       JRST READ1A\r
+       CAIN CS,1               ;CHECK FOR SPECIAL\r
+       MOVE CS,[<ASCII/     />+1]\r
+       MOVEM CS,SEQNO\r
+       MOVEM CS,SEQNO2\r
+       MOVNI CS,4\r
+       ADDM CS,IBUF+2          ;ADJUST WORD COUNT\r
+REPEAT 4,<     IBP IBUF+1>     ;SKIP SEQ NO\r
+       PUSHJ PP,READ   ;AND THE TAB\r
+       JRST    READ            ;GET NEXT CHARACTER\r
+\r
+READ1A:        JUMPE   C,READ          ;IGNORE NULL\r
+       CAIN    C,32            ;IF IT'S A "^Z"\r
+       MOVEI   C,LF            ;TREAT IT AS A "LF"\r
+       CAIE    C,37            ;CONTROL _\r
+       POPJ    PP,\r
+       MOVEI   C,"^"           ;MAKE CONTROL-SHIFT _ VISIBLE\r
+       PUSHJ   PP,RSW2\r
+       MOVEI   C,"_"\r
+       PUSHJ   PP,RSW2\r
+READ2: PUSHJ   PP,READ         ;YES, TEST FOR LINE FEED\r
+       PUSHJ   PP,RSW2         ;LIST IN ANY EVENT\r
+       CAIG    C,FF            ;IS IT ONE OF\r
+       CAIGE   C,LF            ;LF, VT, OR FF?\r
+       JRST    READ2           ;NO\r
+       PUSHJ   PP,OUTIM1       ;YES, DUMP THE LINE\r
+       JRST    READ            ;RETURN NEXT CHARACTER\r
+\r
+READ3: IN      CHAR,0          ;GET NEXT BUFFER\r
+       JRST    READ            ;NO ERRORS\r
+       GETSTS  CHAR,C\r
+       TRNN    C,ERRBIT!2000   ;ERRORS?\r
+       JRST    READ0           ;EOF\r
+       MOVE    AC0,INDEV\r
+       MOVSI   RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]\r
+       TRNE    C,2000\r
+       JRST    ERRFIN          ;E-O-T\r
+       MOVSI   RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]\r
+       TRNE    C,IOIMPM        ;IMPROPER MODE?\r
+       JRST    ERRFIN          ;YES\r
+       MOVSI   RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]\r
+       TRNE    C,IODERR        ;DEVICE DATA ERROR?\r
+       JRST    ERRFIN          ;YES\r
+       MOVSI   RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
+       TRNN    C,IODTER\r
+       MOVSI   RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]\r
+       JRST    ERRFIN\r
+\r
+\fOUTAB2:       PUSHJ   PP,OUTTAB       ;PRINT TWO TABS\r
+OUTTAB:        MOVEI   C,HT\r
+PRINT: CAIE    C,CR            ;IS THIS A CR?\r
+       CAIN    C,LF            ;OR LF?\r
+       JRST    OUTCR           ;YES, GO PROCESS\r
+       CAIN    C,FF            ;FORM FEED?\r
+       JRST    OUTFF           ;YES, FORCE NEW PAGE\r
+       JRST    OUTL\r
+\r
+OUTCR: TRNN    ER,ERRORS!LPTSW!TTYSW\r
+       POPJ    PP,\r
+       MOVEI   C,CR            ;CARRIAGE RETURN, LINE FEED\r
+       PUSHJ   PP,OUTL\r
+       SOSGE   LPP             ;END OF PAGE?\r
+       TLO     IO,IOPAGE       ;YES, SET FLAG\r
+       TRCA    C,7             ;FORM LINE FEED AND SKIP\r
+\r
+OUTL:  TLZN    IO,IOPAGE       ;NEW PAGE REQUESTED?\r
+       JRST    OUTC            ;NO\r
+       JUMP1   OUTC            ;YES, BYPASS IF PASS ONE\r
+       PUSH    PP,C            ;SAVE C AND CS\r
+       PUSH    PP,CS\r
+       PUSH    PP,ER\r
+       TLNN    IO,IOMSTR!IOPROG\r
+       HRR     ER,OUTSW\r
+       TLNE    IO,IOCREF       ;IF DOING CREF OUTPUT NOW\r
+       TLNE    FR,CREFSW       ;AND CREFFING (JUST IN CASE)\r
+       JRST    .+2\r
+       PUSHJ   PP,CLSC3        ;CLOSE IT OUT\r
+       HLLM    IO,(PP)         ;SAVE THIS NEW STATE OF IO\r
+       MOVEI   C,.LPP\r
+       MOVEM   C,LPP           ;SET NEW COUNTER\r
+       MOVEI   C,CR\r
+       PUSHJ   PP,OUTC\r
+       MOVEI   C,FF\r
+       PUSHJ   PP,OUTC         ;OUTPUT FORM FEED\r
+       MOVEI   CS,TBUF\r
+       PUSHJ   PP,OUTAS0       ;OUTPUT TITLE\r
+       MOVEI   CS,VBUF\r
+       PUSHJ   PP,OUTAS0       ;OUTPUT VERSION\r
+       MOVEI   CS,DBUF\r
+       PUSHJ   PP,OUTAS0       ; AND DATE\r
+       MOVE    C,PAGENO\r
+       PUSHJ   PP,DNC          ;OUTPUT PAGE NUMBER\r
+       AOSG    PAGEN.          ;FIRST PAGE OF THIS NUMBER?\r
+       JRST    OUTL1           ;YES\r
+       MOVEI   C,"-"           ;NO, PUT OUT MODIFIER\r
+       PUSHJ   PP,OUTC\r
+       MOVE    C,PAGEN.\r
+       PUSHJ   PP,DNC\r
+OUTL1: PUSHJ   PP,OUTCR\r
+       MOVEI CS,DEVBUF\r
+       PUSHJ PP,OUTAS0\r
+       HRRZ    CS,SUBTTX       ;SWITCH FOR SUB-TITLE\r
+       SKIPE   0(CS)           ;IS THERE A SUB-TITLE?\r
+       PUSHJ   PP,OUTTAB       ;YES, OUTPUT A TAB\r
+       PUSHJ   PP,SOUT20       ;OUTPUT ASCII WITH CARRIAGE RETURN\r
+       PUSHJ   PP,OUTCR\r
+       POP     PP,ER\r
+       POP     PP,CS           ;RESTORE REGISTERS\r
+       POP     PP,C\r
+\r
+OUTC:  TRNE    ER,ERRORS!TTYSW\r
+       PUSHJ   PP,TYO\r
+       TRNN    ER,LPTSW\r
+       POPJ    PP,\r
+OUTLST:        SOSG    LSTBUF+2        ;BUFFER FULL?\r
+       PUSHJ   PP,DMPLST       ;YES, DUMP IT\r
+COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72\r
+IFN STANSW,< CAIN C,"@"\r
+       MOVEI C,140\r
+       CAIN C,"_"\r
+       MOVEI C,30\r
+       CAIN C,"^"\r
+       MOVEI C,32\r
+       CAIE C,"\"\r
+       JRST OUTLSS\r
+       MOVEI C,177\r
+       IDPB C,LSTBUF+1\r
+       JRST OUTLST\r
+OUTLSS:        >\r
+$\r
+       IDPB    C,LSTBUF+1      ;STORE BYTE\r
+       POPJ    PP,             ;EXIT\r
+\r
+\fPAGE0:        PUSHJ   PP,STOUTS       ;PAGE PSEUDO-OP\r
+OUTFF1:        TLNE    IO,IOCREF       ;CURRENTLY DOING CREF?\r
+       TLNE    IO,IOPROG       ;AND NOT XLISTED?\r
+       JRST    OUTFF           ;NO\r
+       HRR     ER,OUTSW\r
+       PUSHJ   PP,CLSCRF\r
+       PUSHJ   PP,OUTCR\r
+       HRRI    ER,0\r
+OUTFF: TLO     IO,IOPAGE\r
+OUTFF2:        SETOM   PAGEN.\r
+       AOS     PAGENO\r
+       POPJ    PP,\r
+\r
+TIMOUT:        IDIVI   2,^D60*^D1000\r
+TIMOU1:        IDIVI   2,^D60\r
+       PUSH    PP,3            ;SAVE MINUTES\r
+       PUSHJ   PP,OTOD         ;STORE HOURS\r
+       MOVEI   3,":"           ;SEPARATE BY COLON\r
+       IDPB    3,CS\r
+       POP     PP,2            ;STORE MINUTES\r
+OTOD:  IDIVI   2,^D10\r
+       ADDI    2,60            ;FORM ASCII\r
+       IDPB    2,CS\r
+       ADDI    3,60\r
+       IDPB    3,CS\r
+       POPJ    PP,\r
+\r
+DATOUT:        IDIVI   1,^D31          ;GET DAY\r
+       ADDI    2,1\r
+       CAIG    2,^D9           ;TWO DIGITS?\r
+       ADDI    2,7760*^D10     ;NO, PUT IN SPACE\r
+       PUSHJ   PP,OTOD         ;STORE DAY\r
+       IDIVI   1,^D12          ;GET MONTH\r
+       MOVE    2,DTAB(2)       ;GET MNEMONIC\r
+       IDPB    2,CS            ;DEPOSIT RIGHT MOST 7 BITS\r
+       LSH     2,-7            ;SHIFT NEXT IN\r
+       JUMPN   2,.-2           ;DEPOSIT IFIT EXISTS\r
+       MOVEI   2,^D64(1)       ;GET YEAR\r
+       JRST    OTOD            ;STORE IT\r
+\r
+DTAB:  "-NAJ-"\r
+       "-BEF-"\r
+       "-RAM-"\r
+       "-RPA-"\r
+       "-YAM-"\r
+       "-NUJ-"\r
+       "-LUJ-"\r
+       "-GUA-"\r
+       "-PES-"\r
+       "-TCO-"\r
+       "-VON-"\r
+       "-CED-"\r
+\fSUBTTL        MACHINE INSTRUCTION SEARCH ROUTINES\r
+IFE OPHSH,<\r
+OPTSCH:        MOVEI   RC,0\r
+       MOVEI   ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX\r
+       MOVEI   V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT\r
+\r
+OPT1A: CAMN    AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?\r
+       JRST    OPT1D           ;YES, GET THE CODE\r
+       JUMPE   V,POPOUT        ;TEST FOR END\r
+       CAML    AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?\r
+       TDOA    ARG,V           ;NO, INCREMENT\r
+OPT1B: SUB     ARG,V           ;YES, DECREMENT\r
+       ASH     V,-1            ;HALVE INCREMENT\r
+       CAIG    ARG,OP1END-OP1TOP       ;ARE WE OUT OF BOUNDS?\r
+       JRST    OPT1A           ;NO, TRY AGAIN\r
+       JRST    OPT1B           ;YES, BRING IT DOWN A PEG\r
+>\r
+\r
+IFN OPHSH,<\r
+OPTSCH:        MOVE    ARG,AC0         ;GET SIXBIT NAME\r
+       TLZ     ARG,400000      ;CLEAR SIGN BIT\r
+       IDIVI   ARG,PRIME       ;REM. GOES IN V\r
+       CAMN    AC0,OP1TOP(V)   ;ARE WE POINTING AT SYMBOL?\r
+       JRST    OPT1D           ;YES\r
+       SKIPN   OP1TOP(V)       ;TEST FOR END\r
+       POPJ    PP,             ;SYMBOL NOT FOUND\r
+       HLRZ    RC,ARG          ;SAVE LHS OF QUOTIENT\r
+       SKIPA   ARG,RC          ;GET IT BACK\r
+OPT1A: ADDI    ARG,(RC)        ;INCREMENT ARG\r
+       ADDI    V,(ARG)         ;QUADRATIC INCREASE TO V\r
+       CAIL    V,PRIME         ;V IS MODULO PRIME\r
+       JRST    [SUBI   V,PRIME\r
+               JRST    .-1]\r
+       CAMN    AC0,OP1TOP(V)   ;IS THIS IT?\r
+       JRST    OPT1D           ;YES\r
+       SKIPE   OP1TOP(V)       ;END?\r
+       JRST    OPT1A           ;TRY AGAIN\r
+       POPJ    PP,             ;FAILED\r
+>\r
+OPT1D:\r
+IFN OPHSH,<    SETZ    RC,     ;CLEAR RELOCATION\r
+       MOVE    ARG,V           ;GET INDEX IN RIGHT ACC.>\r
+       IDIVI   ARG,4           ;ARG HAS INDEX USED IN OPTTAB\r
+       LDB     V,OPTTAB(V)     ;V HAS INDEX TO OPTTAB\r
+       CAIL    V,700           ;PSEUDO-OP OR IO INSTRUCTION?\r
+       JRST    OPT1G           ;YES\r
+       ROT     V,-^D9          ;LEFT JUSTIFY\r
+       HRRI    V,OP            ;POINT TO BASIC FORMAT\r
+OPT1F: AOS     0(PP)           ;SET FOR SKIP EXIT\r
+       MOVEI   SDEL,%OP        ;SET OP-CODE CROSS-REF FLAG\r
+       JRST    CREF            ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE\r
+\r
+OPT1G: JUMPG   AC0,.+3         ;IF ".","$",OR "%" USE TABLE 1\r
+       TLNN    AC0,200000      ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE\r
+       SKIPA   V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"\r
+       MOVE    V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"\r
+       JRST    OPT1F           ;EXIT\r
+\r
+OPTTAB:\r
+IFE OPHSH,<    POINT   9,OP1COD-1(ARG),35>\r
+       POINT   9,OP1COD  (ARG), 8\r
+       POINT   9,OP1COD  (ARG),17\r
+       POINT   9,OP1COD  (ARG),26\r
+IFN OPHSH,<    POINT   9,OP1COD  (ARG),35>\r
+\r
+\fIFDEF .XCREF,<        .XCREF  ;DON'T CREF THIS MESS>\r
+IFE OPHSH,<\r
+       RELOC   .-1\r
+OP1TOP:\r
+       RELOC\r
+\r
+       IF1,<N1=0\r
+       DEFINE  X  <N1=N1+1 ;>>\r
+\r
+       IF2, <\r
+       N2=^D36\r
+       CC=0\r
+       RELOC   OP1COD\r
+       RELOC\r
+DEFINE X (SYMBOL,CODE) \r
+<SIXBIT /SYMBOL/\r
+CC=CC+CODE_<N2=N2-9>\r
+IFE N2, <OUTLIT>>\r
+\r
+DEFINE OUTLIT  <\r
+       RELOC\r
+       +CC\r
+       RELOC\r
+N2=^D36+<CC=0>>>\r
+       SYN X,XX                ;JUST THE SAME MACRO>\r
+\f\r
+IFN OPHSH,<\r
+DEFINE XX (SB,CD)<>            ;A NUL MACRO\r
+OP1TOP:        IF1,<   BLOCK PRIME>\r
+IF1,<DEFINE X (SB,CD)<>>\r
+IF2,<\r
+DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>\r
+\r
+DEFINE X (SB,CD)<\r
+SXB=<SIXBIT /SB/>\r
+Q=SXB&-1_-1/PRIME\r
+R=SXB&-1_-1-Q*PRIME\r
+H=Q_-22&777\r
+TRY=1\r
+OPCODE=CD\r
+ITEM Q,\R\r
+IFL PRIME-TRY,<PRINTX HASH FAILURE>>\r
+\r
+DEFINE ITEM (QT,RM)<\r
+IFN .%'RM,<R=R+H\r
+IFL PRIME-R,<R=R-R/PRIME*PRIME>\r
+H=H+Q_-22&777\r
+IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>\r
+IFE .%'RM,<.%'RM=SXB\r
+OPSTOR \<R/4>>>>\r
+IF1,<\r
+DEFINE GETSYM (N)<.%'N=0>\r
+\r
+N=0\r
+       XLIST\r
+REPEAT PRIME,<GETSYM \N\r
+N=N+1>\r
+DEFINE GETSYM (N)<.$'N=0>\r
+N=0\r
+REPEAT <PRIME/4+1>,<GETSYM \N\r
+N=N+1>\r
+>\r
+       LIST>\r
+\r
+;MACRO TO HANDLE KI10 OP-CODES\r
+IFE KI10,<\r
+DEFINE XK (SB,CD) <>           ;NUL MACRO>\r
+IFN KI10,<SYN X,XK             ;USUAL X MACRO>\r
+\fIFN OPHSH,<           ;PUT THE MOST USED OP CODES FIRST\r
+X      JRST  , 254\r
+X      PUSHJ , 260\r
+X      POPJ  , 263\r
+X      PUSH  , 261\r
+X      POP   , 262\r
+X      AOS   , 350\r
+X      ASCIZ , 701\r
+X      CALLI , 047\r
+X      EXTERN, 724\r
+X      INTERN, 744\r
+X      JFCL  , 255\r
+X      JSP   , 265\r
+X      MOVE  , 200\r
+X      MOVEI , 201\r
+X      MOVEM , 202\r
+X      SETZM , 402\r
+X      SIXBIT, 717\r
+X      SOS   , 370\r
+X      TLNE  , 603\r
+X      TLNN  , 607\r
+X      TLO   , 661\r
+X      TLZ   , 621\r
+X      TLZA  , 625\r
+X      TLZE  , 623\r
+X      TLZN  , 627\r
+X      TRNE  , 602\r
+X      TRNN  , 606\r
+X      TRZ   , 620\r
+>\r
+\fX     ADD   , 270\r
+X      ADDB  , 273\r
+X      ADDI  , 271\r
+X      ADDM  , 272\r
+\r
+X      AND   , 404\r
+X      ANDB  , 407\r
+X      ANDCA , 410\r
+X      ANDCAB, 413\r
+X      ANDCAI, 411\r
+X      ANDCAM, 412\r
+X      ANDCB , 440\r
+X      ANDCBB, 443\r
+X      ANDCBI, 441\r
+X      ANDCBM, 442\r
+X      ANDCM , 420\r
+X      ANDCMB, 423\r
+X      ANDCMI, 421\r
+X      ANDCMM, 422\r
+X      ANDI  , 405\r
+X      ANDM  , 406\r
+\r
+X      AOBJN , 253\r
+X      AOBJP , 252\r
+\r
+X      AOJ   , 340\r
+X      AOJA  , 344\r
+X      AOJE  , 342\r
+X      AOJG  , 347\r
+X      AOJGE , 345\r
+X      AOJL  , 341\r
+X      AOJLE , 343\r
+X      AOJN  , 346\r
+\r
+XX     AOS   , 350\r
+X      AOSA  , 354\r
+X      AOSE  , 352\r
+X      AOSG  , 357\r
+X      AOSGE , 355\r
+X      AOSL  , 351\r
+X      AOSLE , 353\r
+X      AOSN  , 356\r
+X      ARG   , 320\r
+IFN WFWSW,<X   ARRAY ,  772>\r
+IFN IIISW,<X   ASCID , 771>\r
+X      ASCII , 700\r
+XX     ASCIZ , 701\r
+\r
+X      ASH   , 240\r
+X      ASHC  , 244\r
+\r
+X      ASUPPR, 705\r
+X      BLKI  , 702\r
+X      BLKO  , 703\r
+X      BLOCK , 704\r
+\r
+X      BLT   , 251\r
+\r
+X      BYTE  , 707\r
+\r
+XX     CAI   , 300\r
+X      CAIA  , 304\r
+X      CAIE  , 302\r
+X      CAIG  , 307\r
+X      CAIGE , 305\r
+X      CAIL  , 301\r
+X      CAILE , 303\r
+X      CAIN  , 306\r
+\r
+X      CALL  , 040\r
+XX     CALLI , 047\r
+\r
+XX     CAM   , 310\r
+X      CAMA  , 314\r
+X      CAME  , 312\r
+X      CAMG  , 317\r
+X      CAMGE , 315\r
+X      CAML  , 311\r
+X      CAMLE , 313\r
+X      CAMN  , 316\r
+\r
+XX     CLEAR , 400\r
+XX     CLEARB, 403\r
+XX     CLEARI, 401\r
+XX     CLEARM, 402\r
+\r
+X      CLOSE , 070\r
+X      COMMEN, 770\r
+\r
+\r
+X      CONI  , 710\r
+X      CONO  , 711\r
+IFN STANSW,<X  CONS,257>\r
+X      CONSO , 712\r
+X      CONSZ , 713\r
+\r
+XX     DATA. , 020\r
+\r
+X      DATAI , 714\r
+X      DATAO , 715\r
+X      DEC   , 716\r
+X      DEFINE, 717\r
+X      DEPHAS, 720\r
+\r
+XK     DFAD  , 110\r
+XK     DFDV  , 113\r
+XK     DFMP  , 112\r
+X      DFN   , 131\r
+XK     DFSB  , 111\r
+\r
+X      DIV   , 234\r
+X      DIVB  , 237\r
+X      DIVI  , 235\r
+X      DIVM  , 236\r
+\r
+XK     DMOVE , 120\r
+XK     DMOVEM, 124\r
+XK     DMOVN , 121\r
+XK     DMOVNM, 125\r
+\r
+X      DPB   , 137\r
+\r
+X      END   , 721\r
+\r
+X      ENTER , 077\r
+\r
+X      ENTRY , 722\r
+\r
+X      EQV   , 444\r
+X      EQVB  , 447\r
+X      EQVI  , 445\r
+X      EQVM  , 446\r
+\r
+X      EXCH  , 250\r
+\r
+X      EXP   , 723\r
+XX     EXTERN, 724\r
+\r
+X      FAD   , 140\r
+X      FADB  , 143\r
+X      FADL  , 141\r
+X      FADM  , 142\r
+\r
+X      FADR  , 144\r
+X      FADRB , 147\r
+X      FADRI , 145\r
+X      FADRM , 146\r
+\r
+X      FDV   , 170\r
+X      FDVB  , 173\r
+X      FDVL  , 171\r
+X      FDVM  , 172\r
+\r
+X      FDVR  , 174\r
+X      FDVRB , 177\r
+X      FDVRI , 175\r
+X      FDVRM , 176\r
+\r
+XX     FIN.  , 021\r
+\r
+IFN STANSW,<X  FIX   , 247>\r
+IFE STANSW,<XK FIX   , 122>\r
+XK     FIXR  , 126\r
+XK     FLTR  , 127\r
+\r
+X      FMP   , 160\r
+X      FMPB  , 163\r
+X      FMPL  , 161\r
+X      FMPM  , 162\r
+\r
+\fX     FMPR  , 164\r
+X      FMPRB , 167\r
+X      FMPRI , 165\r
+X      FMPRM , 166\r
+\r
+X      FSB   , 150\r
+X      FSBB  , 153\r
+X      FSBL  , 151\r
+X      FSBM  , 152\r
+\r
+X      FSBR  , 154\r
+X      FSBRB , 157\r
+X      FSBRI , 155\r
+X      FSBRM , 156\r
+\r
+X      FSC   , 132\r
+\r
+X      GETSTS, 062\r
+\r
+\fX     HALT  , 725\r
+X      HISEG , 706\r
+\r
+X      HLL   , 500\r
+X      HLLE  , 530\r
+X      HLLEI , 531\r
+X      HLLEM , 532\r
+X      HLLES , 533\r
+X      HLLI  , 501\r
+X      HLLM  , 502\r
+X      HLLO  , 520\r
+X      HLLOI , 521\r
+X      HLLOM , 522\r
+X      HLLOS , 523\r
+X      HLLS  , 503\r
+X      HLLZ  , 510\r
+X      HLLZI , 511\r
+X      HLLZM , 512\r
+X      HLLZS , 513\r
+\r
+X      HLR   , 544\r
+X      HLRE  , 574\r
+X      HLREI , 575\r
+X      HLREM , 576\r
+X      HLRES , 577\r
+X      HLRI  , 545\r
+X      HLRM  , 546\r
+X      HLRO  , 564\r
+X      HLROI , 565\r
+X      HLROM , 566\r
+X      HLROS , 567\r
+X      HLRS  , 547\r
+X      HLRZ  , 554\r
+X      HLRZI , 555\r
+X      HLRZM , 556\r
+X      HLRZS , 557\r
+\r
+\fX     HRL   , 504\r
+X      HRLE  , 534\r
+X      HRLEI , 535\r
+X      HRLEM , 536\r
+X      HRLES , 537\r
+X      HRLI  , 505\r
+X      HRLM  , 506\r
+X      HRLO  , 524\r
+X      HRLOI , 525\r
+X      HRLOM , 526\r
+X      HRLOS , 527\r
+X      HRLS  , 507\r
+X      HRLZ  , 514\r
+X      HRLZI , 515\r
+X      HRLZM , 516\r
+X      HRLZS , 517\r
+\r
+X      HRR   , 540\r
+X      HRRE  , 570\r
+X      HRREI , 571\r
+X      HRREM , 572\r
+X      HRRES , 573\r
+X      HRRI  , 541\r
+X      HRRM  , 542\r
+X      HRRO  , 560\r
+X      HRROI , 561\r
+X      HRROM , 562\r
+X      HRROS , 563\r
+X      HRRS  , 543\r
+X      HRRZ  , 550\r
+X      HRRZI , 551\r
+X      HRRZM , 552\r
+X      HRRZS , 553\r
+\r
+X      IBP   , 133\r
+\r
+X      IDIV  , 230\r
+X      IDIVB , 233\r
+X      IDIVI , 231\r
+X      IDIVM , 232\r
+\r
+X      IDPB  , 136\r
+\r
+X      IF1   , 726\r
+X      IF2   , 727\r
+X      IFB   , 730\r
+X      IFDEF , 731\r
+X      IFDIF , 732\r
+X      IFE   , 733\r
+X      IFG   , 734\r
+X      IFGE  , 735\r
+X      IFIDN , 736\r
+X      IFL   , 737\r
+X      IFLE  , 740\r
+X      IFN   , 741\r
+X      IFNB  , 742\r
+X      IFNDEF, 743\r
+\r
+X      ILDB  , 134\r
+\r
+X      IMUL  , 220\r
+X      IMULB , 223\r
+X      IMULI , 221\r
+X      IMULM , 222\r
+\r
+X      IN    , 056\r
+XX     IN.   , 016\r
+X      INBUF , 064\r
+XX     INF.  , 026\r
+X      INIT  , 041\r
+X      INPUT , 066\r
+IFN WFWSW,<X   INTEGE, 773>\r
+\r
+XX     INTERN, 744\r
+\r
+X      IOR   , 434\r
+X      IORB  , 437\r
+X      IORI  , 435\r
+X      IORM  , 436\r
+\r
+\r
+X      IOWD  , 745\r
+X      IRP   , 746\r
+X      IRPC  , 747\r
+X      JCRY  , 750\r
+X      JCRY0 , 751\r
+X      JCRY1 , 752\r
+X      JEN   , 753\r
+\r
+XX     JFCL  , 255\r
+\r
+X      JFFO  , 243\r
+X      JFOV  , 765\r
+X      JOV   , 754\r
+\r
+X      JRA   , 267\r
+XX     JRST  , 254\r
+\r
+X      JRSTF , 755\r
+\r
+X      JSA   , 266\r
+XX     JSP   , 265\r
+X      JSR   , 264\r
+\r
+XX     JUMP  , 320\r
+XX     JUMPA , 324\r
+X      JUMPE , 322\r
+X      JUMPG , 327\r
+X      JUMPGE, 325\r
+X      JUMPL , 321\r
+X      JUMPLE, 323\r
+X      JUMPN , 326\r
+\r
+X      LALL  , 756\r
+\r
+X      LDB   , 135\r
+\r
+X      LIST  , 757\r
+X      LIT   , 760\r
+X      LOC   , 761\r
+\r
+X      LOOKUP, 076\r
+\r
+X      LSH   , 242\r
+X      LSHC  , 246\r
+IFN WFWSW,<X   LVAR  , 774>\r
+XK     MAP   , 257\r
+X      MLOFF , 767\r
+X      MLON  , 766\r
+XX     MOVE  , 200\r
+XX     MOVEI , 201\r
+XX     MOVEM , 202\r
+X      MOVES , 203\r
+X      MOVM  , 214\r
+X      MOVMI , 215\r
+X      MOVMM , 216\r
+X      MOVMS , 217\r
+X      MOVN  , 210\r
+X      MOVNI , 211\r
+X      MOVNM , 212\r
+X      MOVNS , 213\r
+X      MOVS  , 204\r
+X      MOVSI , 205\r
+X      MOVSM , 206\r
+X      MOVSS , 207\r
+\r
+\r
+X      MTAPE , 072\r
+XX     MTOP. , 024\r
+\r
+X      MUL   , 224\r
+X      MULB  , 227\r
+X      MULI  , 225\r
+X      MULM  , 226\r
+XX     NLI.  , 031\r
+XX     NLO.  , 032\r
+\r
+X      NOSYM , 762\r
+\r
+\fX     OCT   , 763\r
+X      OPDEF , 764\r
+\r
+X      OPEN  , 050\r
+\r
+X      OR    , 434\r
+X      ORB   , 437\r
+X      ORCA  , 454\r
+X      ORCAB , 457\r
+X      ORCAI , 455\r
+X      ORCAM , 456\r
+X      ORCB  , 470\r
+X      ORCBB , 473\r
+\r
+X      ORCBI , 471\r
+X      ORCBM , 472\r
+X      ORCM  , 464\r
+X      ORCMB , 467\r
+X      ORCMI , 465\r
+X      ORCMM , 466\r
+X      ORI   , 435\r
+X      ORM   , 436\r
+\r
+X      OUT   , 057\r
+XX     OUT.  , 017\r
+X      OUTBUF, 065\r
+XX     OUTF. , 027\r
+X      OUTPUT, 067\r
+\r
+\fX     PAGE  , 700\r
+X      PASS2 , 701\r
+X      PHASE , 702\r
+X      POINT , 703\r
+\r
+XX     POP   , 262\r
+XX     POPJ  , 263\r
+\r
+X      PRGEND, 714\r
+X      PRINTX, 704\r
+X      PURGE , 705\r
+\r
+XX     PUSH  , 261\r
+XX     PUSHJ , 260\r
+\r
+X      RADIX , 706\r
+X      RADIX5, 707\r
+\r
+X      RELEAS, 071\r
+\r
+X      RELOC , 710\r
+X      REMARK, 711\r
+\r
+X      RENAME, 055\r
+\r
+X      REPEAT, 712\r
+\r
+XX     RESET., 015\r
+X      RIM   , 715\r
+X      RIM10 , 735\r
+X      RIM10B, 736\r
+\r
+X      ROT   , 241\r
+X      ROTC  , 245\r
+\r
+X      RSW   , 716\r
+XX     RTB.  , 022\r
+X      SALL  , 720\r
+X      SEARCH, 721\r
+\r
+X      SETA  , 424\r
+X      SETAB , 427\r
+X      SETAI , 425\r
+X      SETAM , 426\r
+X      SETCA , 450\r
+X      SETCAB, 453\r
+X      SETCAI, 451\r
+X      SETCAM, 452\r
+X      SETCM , 460\r
+X      SETCMB, 463\r
+X      SETCMI, 461\r
+X      SETCMM, 462\r
+X      SETM  , 414\r
+X      SETMB , 417\r
+X      SETMI , 415\r
+X      SETMM , 416\r
+X      SETO  , 474\r
+X      SETOB , 477\r
+X      SETOI , 475\r
+X      SETOM , 476\r
+X      SETSTS, 060\r
+X      SETZ  , 400\r
+X      SETZB , 403\r
+X      SETZI , 401\r
+XX     SETZM , 402\r
+\r
+XX     SIXBIT, 717\r
+\r
+XX     SKIP  , 330\r
+X      SKIPA , 334\r
+X      SKIPE , 332\r
+X      SKIPG , 337\r
+X      SKIPGE, 335\r
+X      SKIPL , 331\r
+X      SKIPLE, 333\r
+X      SKIPN , 336\r
+\r
+XX     SLIST., 025\r
+\r
+X      SOJ   , 360\r
+X      SOJA  , 364\r
+X      SOJE  , 362\r
+X      SOJG  , 367\r
+X      SOJGE , 365\r
+X      SOJL  , 361\r
+X      SOJLE , 363\r
+X      SOJN  , 366\r
+\r
+XX     SOS   , 370\r
+X      SOSA  , 374\r
+X      SOSE  , 372\r
+X      SOSG  , 377\r
+X      SOSGE , 375\r
+X      SOSL  , 371\r
+X      SOSLE , 373\r
+X      SOSN  , 376\r
+\r
+IFN STANSW,<X SPCWAR,43>\r
+X      SQUOZE, 707\r
+\r
+X      STATO , 061\r
+X      STATUS, 062\r
+X      STATZ , 063\r
+\r
+X      STOPI , 722\r
+\r
+X      SUB   , 274\r
+X      SUBB  , 277\r
+X      SUBI  , 275\r
+X      SUBM  , 276\r
+\r
+IF2,<IFE OPHSH,<SUBTL:>>\r
+X      SUBTTL, 723\r
+X      SUPPRE, 713\r
+X      SYN   , 724\r
+X      TAPE  , 725\r
+\r
+\fX     TDC   , 650\r
+X      TDCA  , 654\r
+X      TDCE  , 652\r
+X      TDCN  , 656\r
+X      TDN   , 610\r
+X      TDNA  , 614\r
+X      TDNE  , 612\r
+X      TDNN  , 616\r
+X      TDO   , 670\r
+X      TDOA  , 674\r
+X      TDOE  , 672\r
+X      TDON  , 676\r
+X      TDZ   , 630\r
+X      TDZA  , 634\r
+X      TDZE  , 632\r
+X      TDZN  , 636\r
+\r
+X      TITLE , 726\r
+\r
+X      TLC   , 641\r
+X      TLCA  , 645\r
+X      TLCE  , 643\r
+X      TLCN  , 647\r
+X      TLN   , 601\r
+X      TLNA  , 605\r
+XX     TLNE  , 603\r
+XX     TLNN  , 607\r
+XX     TLO   , 661\r
+X      TLOA  , 665\r
+X      TLOE  , 663\r
+X      TLON  , 667\r
+XX     TLZ   , 621\r
+XX     TLZA  , 625\r
+XX     TLZE  , 623\r
+XX     TLZN  , 627\r
+\r
+\fX     TRC   , 640\r
+X      TRCA  , 644\r
+X      TRCE  , 642\r
+X      TRCN  , 646\r
+X      TRN   , 600\r
+X      TRNA  , 604\r
+XX     TRNE  , 602\r
+XX     TRNN  , 606\r
+X      TRO   , 660\r
+X      TROA  , 664\r
+X      TROE  , 662\r
+X      TRON  , 666\r
+XX     TRZ   , 620\r
+X      TRZA  , 624\r
+X      TRZE  , 622\r
+X      TRZN  , 626\r
+\r
+X      TSC   , 651\r
+X      TSCA  , 655\r
+X      TSCE  , 653\r
+X      TSCN  , 657\r
+X      TSN   , 611\r
+X      TSNA  , 615\r
+X      TSNE  , 613\r
+\r
+X      TSNN  , 617\r
+X      TSO   , 671\r
+X      TSOA  , 675\r
+X      TSOE  , 673\r
+X      TSON  , 677\r
+X      TSZ   , 631\r
+X      TSZA  , 635\r
+X      TSZE  , 633\r
+X      TSZN  , 637\r
+X      TTCALL, 051\r
+X      TWOSEG, 731\r
+X      UFA   , 130\r
+X      UGETF , 073\r
+X      UJEN  , 100\r
+X      UNIVER, 737\r
+X      USETI , 074\r
+X      USETO , 075\r
+\r
+X      VAR   , 727\r
+\r
+XX     WTB.  , 023\r
+\r
+X      XALL  , 732\r
+\r
+X      XCT   , 256\r
+\r
+X      XLIST , 733\r
+\r
+X      XOR   , 430\r
+X      XORB  , 433\r
+X      XORI  , 431\r
+X      XORM  , 432\r
+\r
+X      XPUNGE, 730\r
+X      XWD   , 734\r
+\r
+X      Z     , 000\r
+\r
+X      .CREF , 740\r
+X      .HWFRM, 742\r
+X      .MFRMT, 743\r
+X      .XCREF, 741\r
+\r
+\r
+\fIFN OPHSH,<           ;NO-OPS, OLD MNEMONICS,F4 UUOS\r
+X      CAI   , 300\r
+X      CAM   , 310\r
+X      CLEAR , 400\r
+X      CLEARB, 403\r
+X      CLEARI, 401\r
+X      CLEARM, 402\r
+X      JUMP  , 320\r
+X      JUMPA , 324\r
+X      SKIP  , 330\r
+X      RESET., 015\r
+X      IN.   , 016\r
+X      OUT.  , 017\r
+X      DATA. , 020\r
+X      FIN.  , 021\r
+X      RTB.  , 022\r
+X      WTB.  , 023\r
+X      MTOP. , 024\r
+X      SLIST., 025\r
+X      INF.  , 026\r
+X      OUTF. , 027\r
+X      NLI.  , 031\r
+X      NLO.  , 032\r
+>\r
+\fIFE OPHSH,<\r
+IF1, < BLOCK   N1>\r
+OP1END:        -1B36\r
+OP1COD:        BLOCK   N1/4\r
+       CC>\r
+IFN OPHSH,<\r
+IF2,<\r
+DEFINE SETVAL (N)<EXP  .%'N\r
+PURGE .%'N>\r
+N=0\r
+XLIST\r
+REPEAT PRIME,<SETVAL \N\r
+N=N+1>\r
+LIST\r
+>\r
+OP1COD:        IF1,<   BLOCK <PRIME/4+1>>\r
+IF2,<\r
+DEFINE SETVAL (N)<EXP  .$'N\r
+PURGE .$'N>\r
+N=0\r
+XLIST\r
+REPEAT <PRIME/4+1>,<SETVAL     \N\r
+N=N+1>\r
+>\r
+LIST>\r
+\r
+IFDEF .CREF,<  .CREF   ;START CREFFING AGAIN>\r
+\fSUBTTL        PERMANENT SYMBOLS\r
+SYMNUM:        EXP     LENGTH/2        ;NUMBER OF PERMANENT SYMBOLS\r
+DEFINE P       (A,B)<\r
+       SIXBIT  /A/\r
+       XWD     SYMF!NOOUTF,B>\r
+\r
+P      @,      0(SUPRBT)\r
+P      ??????, 0(SUPRBT)\r
+\r
+LENGTH= .-SYMNUM-1                     ;LENGTH OF INITIAL SYMBOLS\r
+\r
+PRMTBL:                        ;PERMANENT SYMBOLS\r
+P      ADC,    24\r
+P      APR,    0\r
+P      CCI,    14\r
+P      CDP,    110\r
+P      CDR,    114\r
+P      CPA,    0\r
+P      CR,     150\r
+P      DC,     200\r
+P      DCSA,   300\r
+P      DCSB,   304\r
+P      DF,     270\r
+P      DIS,    130\r
+P      DLS,    240\r
+P      DPC,    250\r
+P      DSK,    170\r
+P      DTC,    320\r
+P      DTS,    324\r
+P      LPT,    124\r
+P      MDF,    260\r
+P      MTC,    220\r
+P      MTM,    230\r
+P      MTS,    224\r
+P      PAG,    10\r
+P      PI,     4\r
+P      PLT,    140\r
+P      PTP,    100\r
+P      PTR,    104\r
+\r
+P      TMC,    340\r
+P      TMS,    344\r
+P      TTY,    120\r
+P      UTC,    210\r
+P      UTS,    214\r
+IFE LNSSW,<    XLIST   >\r
+IFN LNSSW,<    ;SPECIAL DEVICES FOR PEPR\r
+P .A,550\r
+P .AB,434\r
+P .ANG,440\r
+P .B,554\r
+P .BITE,470\r
+P .FA,564\r
+P .GAIN,520\r
+P .GATE,444\r
+P .IA,560\r
+P .INC,514\r
+P .LC,474\r
+P .LG,570\r
+P .PEPR,400\r
+P .RG,574\r
+P .SCON,430\r
+P .STAT,410\r
+P .TC,500\r
+P .TED,540\r
+P .THR,544\r
+P .TRK,404\r
+P .VIEW,524>\r
+       LIST\r
+PRMEND:                                ;END OF PERMANENT SYMBOLS\r
+\r
+\f      OPDEF   ZL      [Z      LITF]   ;INVALID IN LITERALS\r
+       OPDEF   ZA      [Z      ADDF]   ;INVALID IN ADDRESSES\r
+       OPDEF   ZAL     [Z      ADDF!LITF]\r
+\r
+OP1TAB:\r
+\r
+       ZA      PAGE0                   ;PAGE\r
+       ZAL     PASS20                  ;PASS2\r
+       ZAL     PHASE0                  ;PHASE\r
+       Z       POINT0                  ;POINT\r
+       ZA      PRNTX0                  ;PRINTX\r
+       ZA      PURGE0                  ;PURGE\r
+       ZA      RADIX0                  ;RADIX\r
+       Z       RADX50                  ;RADIX50,SQUOZE\r
+       ZAL     LOC0    (1)             ;RELOC\r
+       ZAL     REMAR0                  ;REMARK\r
+       ZA      REPEA0                  ;REPEAT\r
+       ZA      SUPRE0                  ;SUPRESS\r
+       ZAL     PSEND0                  ;PRGEND\r
+       ZAL     RIM0    (RIMSW)         ;RIM\r
+       DATAI   0,IOP                   ;RSW\r
+       Z       ASCII0  (1)             ;SIXBIT\r
+       ZAL     IOSET   (IOPALL!IOSALL) ;SALL\r
+       ZAL     SERCH0                  ;SEARCH\r
+       ZA      STOPI0                  ;STOPI\r
+       ZA      SUBTT0  (Z (POINT 7,,)) ;SUBTTL\r
+       ZA      SYN0                    ;SYN\r
+       ZAL     TAPE0                   ;TAPE\r
+       ZA      TITLE0  (Z (POINT 7,,)) ;TITLE\r
+       ZAL     VAR0                    ;VAR\r
+\r
+       Z       XPUNG0                  ;XPUNGE\r
+       ZAL     TWSEG0                  ;TWOSEGMENTS\r
+       ZAL     XALL0   (IOPALL)        ;XALL\r
+       ZAL     IOSET   (IOPROG)        ;XLIST\r
+       Z       XWD0                    ;XWD\r
+       ZAL     RIM0    (RIM1SW)        ;RIM10\r
+       ZAL     RIM0    (R1BSW)         ;RIM10B\r
+       ZA      UNIV0   (Z (POINT 7,,)) ;UNIVERSAL\r
+       ZAL     IORSET  (IONCRF)        ;.CREF\r
+       ZAL     IOSET   (IONCRF)        ;.XCREF\r
+       ZA      OFFORM                  ;.HWFRMT\r
+       ZA      ONFORM                  ;.MFRMT\r
+\fOP2TAB:\r
+\r
+       Z       ASCII0  (0)             ;ASCII\r
+       Z       ASCII0  (1B18)          ;ASCIZ\r
+       BLKI    IOP                     ;BLKI\r
+       BLKO    IOP                     ;BLKO\r
+       ZAL     BLOCK0                  ;BLOCK\r
+       ZA      SUPRSA                  ;ASUPPRESS\r
+       ZAL     HISEG0                  ;HISEG\r
+       Z       BYTE0                   ;BYTE\r
+       CONI    IOP                     ;CONI\r
+       CONO    IOP                     ;CONO\r
+       CONSO   IOP                     ;CONSO\r
+       CONSZ   IOP                     ;CONSZ\r
+       DATAI   IOP                     ;DATAI\r
+       DATAO   IOP                     ;DATAO\r
+       Z       OCT0    (^D10)          ;DEC\r
+       ZA      DEFIN0                  ;DEFINE\r
+\r
+       ZAL     DEPHA0                  ;DEPHASE\r
+       ZAL     END0                    ;END\r
+       ZA      INTER0  (INTF!ENTF)     ;ENTRY\r
+       Z       EXPRES                  ;EXP\r
+       ZA      EXTER0                  ;EXTERN\r
+       JRST    4,OP                    ;HALT\r
+       TLNN    FR,IFPASS               ;IF1\r
+       TLNE    FR,IFPASS               ;IF2\r
+\r
+       TRNE    AC0,IFB0                ;IFB\r
+       TLNE    ARG,IFDEF0              ;IFDEF\r
+       Z       IFIDN0  (0)             ;IFDIF\r
+       SKIPE   IF                      ;IFE\r
+       SKIPG   IF                      ;IFG\r
+       SKIPGE  IF                      ;IFGE\r
+       Z       IFIDN0  (1)             ;IFIDN\r
+       SKIPL   IF                      ;IFL\r
+\r
+       SKIPLE  IF                      ;IFLE\r
+       SKIPN   IF                      ;IFN\r
+       TRNN    AC0,IFB0                ;IFNB\r
+       TLNN    ARG,IFDEF0              ;IFNDEF\r
+       ZA      INTER0  (INTF)          ;INTERN\r
+       Z       IOWD0                   ;IOWD\r
+       Z       IRP0    (0)             ;IRP\r
+       Z       IRP0    (400000)        ;IRPC\r
+\r
+       JFCL    6,OP                    ;JCRY\r
+       JFCL    4,OP                    ;JCRY0\r
+       JFCL    2,OP                    ;JCRY1\r
+       JRST    12,OP                   ;JEN\r
+       JFCL    10,OP                   ;JOV\r
+       JRST    2,OP                    ;JRSTF\r
+       ZAL     IORSET  (IOPALL!IOSALL) ;LALL\r
+       ZAL     IORSET  (IOPROG)        ;LIST\r
+       ZAL     LIT0                    ;LIT\r
+       ZAL     LOC0    (0)             ;LOC\r
+       ZA      OFFSYM                  ;NOSYM\r
+       Z       OCT0    (^D8)           ;OCT\r
+       ZA      OPDEF0                  ;OPDEF\r
+       JFCL    1,OP                    ;JFOV\r
+       ZA      ONML                    ;MLON\r
+       ZA      OFFML                   ;MLOFF\r
+       Z       ASCII0  (3B19)          ;COMMENT\r
+IFN IIISW!WFWSW,<\r
+       Z       ASCII0  (5B20)          ;ASCID\r
+IFN WFWSW,<\r
+       ZAL     %ARAY                   ;ARRAY\r
+       ZAL     %INTEG                  ;INTEGER\r
+       ZAL     %LVAR                   ;LVAR>>\r
+\f\r
+CALTBL:\r
+                               ;USER DEFINED CALLI'S GO HERE\r
+       SIXBIT  /LIGHTS/        ;-1\r
+CALLI0:        SIXBIT  /RESET/         ; 0\r
+       SIXBIT  /DDTIN/         ; 1\r
+       SIXBIT  /SETDDT/        ; 2\r
+       SIXBIT  /DDTOUT/        ; 3\r
+       SIXBIT  /DEVCHR/        ; 4\r
+       SIXBIT  /DDTGT/         ; 5\r
+       SIXBIT  /GETCHR/        ; 6\r
+       SIXBIT  /DDTRL/         ; 7\r
+       SIXBIT  /WAIT/          ;10\r
+       SIXBIT  /CORE/          ;11\r
+       SIXBIT  /EXIT/          ;12\r
+       SIXBIT  /UTPCLR/        ;13\r
+       SIXBIT  /DATE/          ;14\r
+       SIXBIT  /LOGIN/         ;15\r
+       SIXBIT  /APRENB/        ;16\r
+       SIXBIT  /LOGOUT/        ;17\r
+       SIXBIT  /SWITCH/        ;20\r
+       SIXBIT  /REASSI/        ;21\r
+       SIXBIT  /TIMER/         ;22\r
+       SIXBIT  /MSTIME/        ;23\r
+       SIXBIT  /GETPPN/        ;24\r
+       SIXBIT  /TRPSET/        ;25\r
+       SIXBIT  /TRPJEN/        ;26\r
+       SIXBIT  /RUNTIM/        ;27\r
+       SIXBIT  /PJOB/          ;30\r
+       SIXBIT  /SLEEP/         ;31\r
+       SIXBIT  /SETPOV/        ;32\r
+       SIXBIT  /PEEK/          ;33\r
+       SIXBIT  /GETLIN/        ;34\r
+       SIXBIT  /RUN/           ;35\r
+       SIXBIT  /SETUWP/        ;36\r
+       SIXBIT  /REMAP/         ;37\r
+       SIXBIT  /GETSEG/        ;40\r
+       SIXBIT  /GETTAB/        ;41\r
+       SIXBIT  /SPY/           ;42\r
+       SIXBIT  /SETNAM/        ;43\r
+       SIXBIT  /TMPCOR/        ;44\r
+       SIXBIT  /DSKCHR/        ;45\r
+       SIXBIT  /SYSSTR/        ;46\r
+       SIXBIT  /JOBSTR/        ;47\r
+       SIXBIT  /STRUUO/        ;50\r
+       SIXBIT  /SYSPHY/        ;51\r
+       SIXBIT  /FRECHN/        ;52\r
+       SIXBIT  /DEVTYP/        ;53\r
+       SIXBIT  /DEVSTS/        ;54\r
+       SIXBIT  /DEVPPN/        ;55\r
+       SIXBIT  /SEEK/          ;56\r
+       SIXBIT  /RTTRP/         ;57\r
+       SIXBIT  /LOCK/          ;60\r
+       SIXBIT  /JOBSTS/        ;61\r
+       SIXBIT  /LOCATE/        ;62\r
+       SIXBIT  /WHERE/         ;63\r
+       SIXBIT  /DEVNAM/        ;64\r
+       SIXBIT  /CTLJOB/        ;65\r
+       SIXBIT  /GOBSTR/        ;66\r
+       0                       ;67\r
+       0                       ;70\r
+       SIXBIT  /HPQ/           ;71\r
+       SIXBIT  /HIBER/         ;72\r
+       SIXBIT  /WAKE/          ;73\r
+       SIXBIT  /CHGPPN/        ;74\r
+       SIXBIT  /SETUUO/        ;75\r
+       SIXBIT  /DEVGEN/        ;76\r
+       SIXBIT  /OTHUSR/        ;77\r
+       SIXBIT  /CHKACC/        ;100\r
+       SIXBIT  /DEVSIZ/        ;101\r
+       SIXBIT  /DAEMON/        ;102\r
+       SIXBIT  /JOBPEK/        ;103\r
+       SIXBIT  /ATTACH/        ;104\r
+       SIXBIT  /DAEFIN/        ;105\r
+       SIXBIT  /FRCUUO/        ;106\r
+       SIXBIT  /DEVLNM/        ;107\r
+       SIXBIT  /PATH./         ;110\r
+\r
+CALNTH==.-CALTBL\r
+NEGCAL==CALLI0-CALTBL          ;NUMBER OF NEGATIVE CALLI'S\r
+\r
+TTCTBL:        SIXBIT  /INCHRW/        ; 0     INPUT A CHAR. AND WAIT\r
+       SIXBIT  /OUTCHR/        ; 1     OUTPUT A CHAR.\r
+       SIXBIT  /INCHRS/        ; 2     INPUT A CHAR. AND SKIP\r
+       SIXBIT  /OUTSTR/        ; 3     OUTPUT A STRING\r
+       SIXBIT  /INCHWL/        ; 4     INPUT CHAR., WAIT, LINE MODE\r
+       SIXBIT  /INCHSL/        ; 5     INPUT CHAR., SKIP, LINE MODE\r
+       SIXBIT  /GETLCH/        ; 6     GET LINE CHARACTERISTICS\r
+       SIXBIT  /SETLCH/        ; 7     SET LINE CHARACTERISTICS\r
+       SIXBIT  /RESCAN/        ;10     RESET INPUT STREAM TO COMMAND\r
+       SIXBIT  /CLRBFI/        ;11     CLEAR TYPEIN BUFFER\r
+       SIXBIT  /CLRBFO/        ;12     CLEAR TYPEOUT BUFFER\r
+       SIXBIT  /SKPINC/        ;13     SKIPS IF A CHAR. CAN BE INPUT\r
+       SIXBIT  /SKPINL/        ;14     SKIPS IF A LINE CAN BE INPUT\r
+       SIXBIT  /IONEOU/        ;15     OUTPUT AS AN IMAGE CHAR.\r
+\r
+TTCLTH==.-TTCTBL\r
+       SUBTTL  USER-DEFINED SYMBOL SEARCH ROUTINES\r
+MSRCH: PUSHJ   PP,SEARCH       ;PERFORM GENERAL SEARCH\r
+       POPJ    PP,             ;NOT FOUND, EXIT\r
+       JUMPG   ARG,MSRCH2      ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+       CAME    AC0,1(SX)       ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE\r
+       POPJ    PP,             ;NO, EXIT\r
+       ADDI    SX,2            ;YES, POINT TO IT\r
+       PUSHJ   PP,SRCH5        ;LOAD REGISTERS\r
+MSRCH2:        AOSA    0(PP)           ;SET SKIP-EXIT\r
+QSRCH: JUMPL   ARG,SSRCH3      ;BRANCH IF OPERAND\r
+       MOVEI   SDEL,%MAC       ;SET OPERATOR FLAG\r
+       TLZE IO,DEFCRS  ;IS IT A DEFINITION?\r
+       MOVEI SDEL,%DMAC        ;YES\r
+       JRST    CREF            ;CROSS-REF AND EXIT\r
+\r
+SSRCH: PUSHJ   PP,SEARCH       ;PERFORM GENERAL SEARCH\r
+       POPJ    PP,             ;NOT FOUND, EXIT\r
+       JUMPL   ARG,SSRCH2      ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+SSRCH1:        CAME    AC0,-3(SX)      ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW\r
+       POPJ    PP,             ;NO DICE, EXIT\r
+       SUBI    SX,2            ;YES, POINT TO IT\r
+       PUSHJ   PP,SRCH5        ;LOAD REGISTERS\r
+SSRCH2:        AOS     0(PP)           ;SET FOR SKIP-EXIT\r
+SSRCH3:        MOVEI   SDEL,%SYM       ;SET OPERAND FLAG\r
+\r
+CREF:  TLNN    IO,IONCRF       ;NO CREFFING FOR THIS SYMBOL?\r
+       TLNE    FR,P1!CREFSW    ;PASS ONE OR CROSS-REF SUPPRESSION?\r
+       POPJ    PP,             ;YES, EXIT\r
+       EXCH    SDEL,C          ;PUT FLAG IN C, SACE C\r
+       PUSH    PP,CS\r
+       TLNE IO,IOCREF          ;HAVE WE PUT OUT THE 177,102\r
+       JRST CREF3              ;YES\r
+       PUSH PP,C               ;START OF CREF DATA\r
+\r
+\fREPEAT 0,<    ;NEEDS CHANGE TO CREF\r
+       MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+       MOVEI C,102\r
+       PUSHJ PP,OUTLST\r
+       TLO IO,IOCREF   ;WE NOW ARE IN THAT STATE\r
+       POP PP,C        ;WE HAVE NOW\r
+CREF3: JUMPE C,NOFLG           ;JUST CLOSE IT\r
+       PUSHJ   PP,OUTLST       ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+       MOVSI CS,770000         ;COUNT CHRS\r
+       TDZA C,C        ;STARTING AT 0\r
+       LSH CS,-6       ;TRY NEXT\r
+       TDNE AC0,CS     ;IS THAT ONE THERE?\r
+       AOJA C,.-2      ;YES\r
+       PUSHJ PP,OUTLST         ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+       MOVE    CS,AC0\r
+\r
+CREF2: MOVEI   C,0\r
+       LSHC    C,6\r
+       ADDI    C,40\r
+       PUSHJ   PP,OUTLST       ;THE ASCII SYMBOL\r
+       JUMPN   CS,CREF2\r
+       MOVEI   C,%DSYM\r
+       TLZE    IO,DEFCRS\r
+       PUSHJ   PP,OUTLST       ;MARK IT AS A DEFINING OCCURENCE\r
+NOFLG: MOVE    C,SDEL\r
+       POP     PP,CS\r
+       POPJ    PP,\r
+\r
+CLSCRF:        TRNN ER,LPTSW\r
+       POPJ PP,        ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2:        MOVEI C,177\r
+       PUSHJ PP,PRINT\r
+       TLZE IO,IOCREF  ;WAS IT OPEN?\r
+       JRST CLSCR1     ;YES, JUST CLOSE IT\r
+       MOVEI C,102     ;NO, OPEN IT FIRST\r
+       PUSHJ PP,OUTLST         ;MARK BEGINNING OF CREF DATA\r
+       MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+CLSCR1:        MOVEI C,103\r
+       JRST OUTLST             ;MARK END OF CREF DATA\r
+\r
+CLSC3: TLZ IO,IOCREF\r
+       MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+       MOVEI C,104\r
+       JRST OUTLST     ;177,104 CLOSES IT FOR NOW\r
+>      ;END OF REPEAT 0\r
+\fREPEAT 1,<                    ;WORKS WITH EXISTING CREF\r
+       TLNE IO,IOPAGE\r
+       PUSHJ PP,CRFHDR         ;GET CORRECT SUBTTL\r
+       MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+       MOVEI C,102\r
+       PUSHJ PP,OUTLST\r
+       TLO IO,IOCREF   ;WE NOW ARE IN THAT STATE\r
+       POP PP,C        ;WE HAVE NOW\r
+CREF3: PUSHJ   PP,OUTLST       ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+       MOVSI CS,770000         ;COUNT CHRS\r
+       TDZA C,C        ;STARTING AT 0\r
+       LSH CS,-6       ;TRY NEXT\r
+       TDNE AC0,CS     ;IS THAT ONE THERE?\r
+       AOJA C,.-2      ;YES\r
+       PUSHJ PP,OUTLST         ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+       MOVE    CS,AC0\r
+\r
+CREF2: MOVEI   C,0\r
+       LSHC    C,6\r
+       ADDI    C,40\r
+       PUSHJ   PP,OUTLST       ;THE ASCII SYMBOL\r
+       JUMPN   CS,CREF2\r
+       MOVEI   C,%DSYM\r
+       TLZE    IO,DEFCRS\r
+       PUSHJ   PP,OUTLST       ;MARK IT AS A DEFINING OCCURENCE\r
+       MOVE    C,SDEL\r
+       POP     PP,CS\r
+       POPJ    PP,\r
+\r
+IFN OPHSH,<\r
+SUBTL: SIXBIT  /SUBTTL/>\r
+CRFHDR:        CAME    AC0,SUBTL       ;IS FIRST SYMBOL "SUBTTL"\r
+       JRST    CRFHD1          ;NO\r
+       HLLZ    AC0,V\r
+       PUSHJ   PP,SUBTT0       ;UPDATE SUBTTL\r
+       MOVE    AC0,SUBTL       ;RESTORE ARG.\r
+       MOVEI   V,CPOPJ\r
+CRFHD1:        MOVEI   C,0\r
+       JRST    OUTL\r
+\r
+CLSC3:\r
+CLSCRF:        TRNN ER,LPTSW\r
+       POPJ PP,        ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2:        TLZE IO,IOCREF  ;FINISH UP LINE\r
+       JRST CLSCR1\r
+       MOVEI   C,0\r
+       TLNE    IO,IOPAGE       ;NEW PAGE?\r
+       PUSHJ   PP,OUTL         ;YES,GIVE IT A ROUSING SENDOFF!\r
+       MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+       MOVEI C,102\r
+       PUSHJ PP,OUTLST         ;MARK BEGINNING OF CREF DATA\r
+CLSCR1:        MOVEI C,177\r
+       PUSHJ PP,OUTLST\r
+       MOVEI C,103\r
+       JRST OUTLST             ;MARK END OF CREF DATA\r
+>      ;END OF REPEAT 1\r
+\fSEARCH:       HLRZ    SX,SRCHX\r
+       HRRZ    SDEL,SRCHX\r
+\r
+SRCH1: CAML    AC0,-1(SX)\r
+       JRST    SRCH3\r
+SRCH2: SUB     SX,SDEL\r
+       LSH     SDEL,-1\r
+       CAMG    SX,SYMTOP\r
+       JUMPN   SDEL,SRCH1\r
+       JUMPN   SDEL,SRCH2\r
+       SOJA    SX,SRCHNO       ;NOT FOUND\r
+\r
+SRCH3: CAMN    AC0,-1(SX)\r
+       JRST    SRCH4           ;NORMAL / FOUND EXIT\r
+       ADD     SX,SDEL\r
+       LSH     SDEL,-1\r
+       CAMG    SX,SYMTOP\r
+       JUMPN   SDEL,SRCH1\r
+       JUMPN   SDEL,SRCH2\r
+       SOJA    SX,SRCHNO       ;NOT FOUND\r
+\r
+SRCH4: AOS     0(PP)           ;SET FOR SKIP EXIT\r
+SRCH5: MOVSI ARG,SUPRBT        ;HE IS USING IT, TURN OFF BIT\r
+       ANDCAM ARG,(SX) ; IN THE TABLE\r
+SRCH7: MOVE ARG,0(SX)          ;FLAG AND VALUE TO ARG\r
+       LDB     RC,RCPNTR       ;POINT 1,ARG,17\r
+       TLNE ARG,LELF   ;CHECK LEFT RELOCATE\r
+       TLO RC,1\r
+       HRRZ    V,ARG\r
+       TLNE ARG,SPTR   ;CHECK SPECIAL EXTESN POINTER\r
+       JRST SRCH6\r
+       TLNE    ARG,PNTF\r
+       MOVE    V,0(ARG)                ;36BIT VALUE TO V\r
+       JRST    SRCHOK\r
+       \r
+SRCH6: MOVE V,0(ARG)   ;VALUE\r
+       MOVE RC,1(ARG)  ;AND RELOC\r
+       TLNE RC,-2      ;CHECK AND SET EXTPNT\r
+       HLLM RC,EXTPNT\r
+       TRNE RC,-2      \r
+       HRRM RC,EXTPNT\r
+       JRST    SRCHOK\r
+SRCHNO:        SKIPN   UNISCH+1        ;ALLOWED TO SEARCH OTHER TABLES\r
+       POPJ    PP,             ;NO, JUST RETURN\r
+       AOS     V,UNISCH        ;GET NEXT INDEX TO TABLE\r
+       CAIE    V,1             ;FIRST TIME IN\r
+       JRST    SRCHN1          ;YES, SAVE SYMBOL INFO\r
+       HRLM    SX,UNISCH       ;SAVE SX AND SET FLAG\r
+       MOVE    ARG,SRCHX       ;SEARCH POINTER\r
+       MOVEM   ARG,UNISHX      ;TO A SAFE PLACE\r
+       HRR     ARG,SYMBOL\r
+       HRL     ARG,SYMTOP\r
+       MOVEM   ARG,UNIPTR      ;STORE ALSO\r
+SRCHN1:        MOVE    V,UNISCH(V)     ;GET TRUE INDEX\r
+       JUMPE   V,SRCHKO        ;IF ZERO ALL TABLE SCANNED\r
+       MOVE    ARG,UNISHX(V)   ;NEW SRCHX\r
+       MOVEM   ARG,SRCHX       ;SET IT UP\r
+       MOVE    ARG,UNIPTR(V)   ;SYMTOP,,SYMBOL\r
+       HRRZM   ARG,SYMBOL\r
+       HLRZM   ARG,SYMTOP\r
+       JRST    SEARCH          ;TRY AGAIN\r
+\r
+SRCHKO:        SETZ    ARG,            ;CLEAR ARG SO ZERO STORED\r
+SRCHOK:        SKIPN   UNISCH          ;HAVE WE SEARCH OTHER TABLES\r
+       POPJ    PP,             ;NO, JUST RETURN\r
+SYMBCK:        HLRZ    SX,UNISCH       ;RESTORE SX\r
+       SETZM   UNISCH          ;CLEAR SYMBCK FLAG\r
+       PUSH    PP,V            ;SAVE AN AC\r
+       MOVE    V,UNISHX        ;SRCHX\r
+       MOVEM   V,SRCHX         ;RESTORE ORIGINAL\r
+       MOVE    V,UNIPTR        ;SYMTOP,,SYMBOL\r
+       HRRZM   V,SYMBOL\r
+       HLRZM   V,SYMTOP\r
+       JUMPE   ARG,SRCHK2      ;TOTALLY UNDEFINED\r
+       PUSH    PP,RC           ;SAVE SOME ACCS\r
+       PUSH    PP,ARG\r
+       PUSH    PP,EXTPNT\r
+       SETZB   ARG,EXTPNT      ;CLEAR ALL SYMBOL DATA\r
+       SETZB   RC,V\r
+       PUSHJ   PP,INSERT       ;INSERT SYMBOL IN TABLE\r
+       POP     PP,EXTPNT       ;RESTORE ACCS ETC.\r
+       POP     PP,ARG\r
+       POP     PP,RC\r
+       MOVEM   ARG,(SX)        ;SET FLAGS AND VALUE AS IT SHOULD BE\r
+SRCHK2:        POP     PP,V\r
+       POPJ    PP,             ;RETURN\r
+\r
+\fINSERQ:       TLNE    ARG,UNDF!VARF\r
+INSERZ:        SETZB   RC,V\r
+INSERT:        CAME    AC0,-1(SX)      ;ARE WE LOOKING AT MATCHING MNEMONIC?\r
+       JRST    INSRT2          ;NO, JUST INSERT\r
+       JUMPL   ARG,INSRT1      ;YES, BRANCH IF OPERAND\r
+       SKIPL   0(SX)           ;OPERATOR, ARE WE LOOKING AT ONE?\r
+       JRST    UPDATE          ;YES, UPDATE\r
+       JRST    INSRT2          ;NO, INSERT\r
+\r
+INSRT1:        SKIPG   0(SX)           ;OPERAND, ARE WE LOOKING AT ONE?\r
+       JRST    UPDATE          ;YES, UPDATE\r
+       SUBI    SX,2            ;NO, MOVE UNDER OPERATOR AND INSERT\r
+INSRT2:        MOVE    SDEL,SYMBOL\r
+       SUBI    SDEL,2\r
+       CAMLE   SDEL,FREE\r
+       JRST    INSRT3\r
+       PUSHJ   PP,XCEEDS\r
+       ADDI    SDEL,2000\r
+INSRT3:        MOVEM   SDEL,SYMBOL     ;MAKE ROOM FOR A TWO WORD ENTRY\r
+       HRLI    SDEL,2(SDEL)\r
+       BLT     SDEL,-2(SX)     ;PUSH EVERYONE DOWN TWO LOACTIONS\r
+       AOS     @SYMBOL         ;INCREMENT THE SYMBOL COUNT\r
+       TLNN RC,-2      ;NEED SPECIAL?\r
+       TRNE RC,-2      ;LEFT OR RIGHT EXTERNAL?\r
+       JRST INSRT5     ;YES, JUMP\r
+       TLNN    V,-1            ;SKIP IF V IS A 36BIT VALUE\r
+       JRST    INSRT4          ;JUMP, ITS A 18BIT VALUE\r
+       AOS     SDEL,FREE       ;36BIT, SO GET A CELL FROM FREE CORE\r
+       CAML    SDEL,SYMBOL     ;MORE CORE NEEDED?\r
+       PUSHJ   PP,XCEEDS       ;YES\r
+       HRRI    ARG,-1(SDEL)    ;POINTER TO ARG\r
+       MOVEM   V,0(ARG)        ;36BIT VALUE TO FREE CORE\r
+       TLOA    ARG,PNTF        ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE\r
+\r
+INSRT4:        HRR     ARG,V           ;18BIT VALUE TO ARG\r
+       DPB     RC,RCPNTR       ;FIX RIGHT RELOCATION\r
+       TLNE RC,1\r
+       TLO ARG,LELF    ;FIX LEFT RELOCATION\r
+INSRT6:        MOVEM   ARG,0(SX)       ;INSERT FLAGS AND VALUE.\r
+       MOVEM   AC0,-1(SX)      ;INSERT SYMBOL NAME.\r
+       PUSHJ   PP,SRCHI        ;INITILIAZE SRCHX\r
+       JRST    QSRCH           ;EXIT THROUGH CREF\r
+       \r
+INSRT5:        MOVEI SDEL,2    ;GET TWO CELLS FROM FREE CORE\r
+       ADDB SDEL,FREE\r
+       CAML SDEL,SYMBOL;MORE CORE NEEDED?\r
+       PUSHJ PP,XCEEDS ;YES\r
+       MOVEM RC,-1(SDEL)\r
+       HRRI ARG,-2(SDEL)       ;POINTER TO ARG\r
+       MOVEM V,0(ARG)\r
+       TLO ARG,SPTR    ;SET SPECIAL POINTER, POINTS TO TWO CELLS\r
+       JRST INSRT6\r
+\fREMOVE:       SUBI    SX,2            ;MOVE EVERYONE UP TWO LOCATIONS\r
+REMOV1:        MOVE    0(SX)\r
+       MOVEM   2(SX)           ;OVERWRITE THE DELETED SYMBOL\r
+       CAME    SX,SYMBOL       ;SKIP WHEN DONE\r
+       SOJA    SX,REMOV1\r
+       ADDI    SX,2\r
+       MOVEM   SX,SYMBOL\r
+       SOS     0(SX)           ;DECREMENT THE SYMBOL COUNT\r
+\r
+SRCHI: MOVEI   AC2,0           ;THIS CODE SETS UP SRCHX\r
+       FAD     AC2,@SYMBOL\r
+       LSH     AC2,-^D27\r
+       MOVEI   AC1,1000\r
+       LSH     AC1,-357(AC2)\r
+       HRRM    AC1,SRCHX\r
+       LSH     AC1,1\r
+       ADD     AC1,SYMBOL\r
+       HRLM    AC1,SRCHX\r
+       POPJ    PP,             ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4\r
+\r
+\fUPDATE:       DPB     RC,RCPNTR       ;FIX RIGHT RELOCATION\r
+       TLNE ARG,SPTR   ;SKIP IF THERE IS NO SPECIAL POINTER\r
+       JRST UPDAT4     ;YES, USE THE TWO CELLS\r
+       TLNN RC,-2      ;NEED TO CHANGE\r
+       TRNE RC,-2      ;ANY CURRENT EXTERNS?\r
+       JRST UPDAT5     ;YES ,JUMP\r
+       TLZ ARG,LELF    ;CLEAR LELF\r
+       TLNE RC,1       ;LEFT RELOCATABLE?\r
+       TLO ARG,LELF    ;YES, SET THE FLAG\r
+       TLNE    ARG,PNTF        ;WAS THERE A 36BIT VALUE?\r
+       JRST    UPDAT2          ;YES, USE IT.\r
+       TLNE    V,-1            ;NO,IS THERE A 36BIT VALUE?\r
+       JRST    UPDAT1          ;YES, GET A CELL\r
+       HRR     ARG,V           ;NO, USE RH OF ARG\r
+UPDAT3:        MOVEM   ARG,0(SX)       ;OVERWRITE THE ONE IN THE TABLE\r
+       POPJ    PP,             ;AND EXIT\r
+\r
+UPDAT1:        AOS     SDEL,FREE       ;GET ONE CELL\r
+       CAML    SDEL,SYMBOL     ;NEED MORE CORE?\r
+       PUSHJ   PP,XCEEDS       ;YES\r
+       HRRI    ARG,-1(SDEL)    ;POINTER TO ARG\r
+       TLO     ARG,PNTF        ;AND NOTE IT.\r
+UPDAT2:        TLNE ARG,EXTF   ;IS THERE A EXTERNAL?\r
+       JRST UPDAT3             ;YES, - JUST SAVE A LOCATION\r
+       MOVEM   ARG,0(SX)       ;NO, OVERWRITE THE POINTER IN THE TABLE\r
+       MOVEM   V,0(ARG)        ;STORE VALUE AS A 36BIT VALUE\r
+       POPJ    PP,             ;AND EXIT\r
+       \r
+UPDAT4:        MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM\r
+       MOVEM V,0(ARG)  ;SAVE AS 36BIT VALUE\r
+       MOVEM RC,1(ARG) ;SAVE RELOCATION BITS\r
+       POPJ PP,                ;AND EXIT\r
+\r
+UPDAT5:        MOVEI SDEL,2            ;THERE IS A EXTERNAL\r
+       ADDB SDEL,FREE          ;SO WE NEED TWO LOACTIONS\r
+       CAML SDEL,SYMBOL        ;NEED MORE CORE?\r
+       PUSHJ PP,XCEEDS         ;YES\r
+       MOVEM RC,-1(SDEL)       ;SAVE RELOCATION BITS\r
+       HRRI ARG,-2(SDEL)       ;SAVE THE POINTER IN ARG\r
+       MOVEM V,0(ARG)          ;SAVE A 36BIT VALUE\r
+       TLO ARG,SPTR            ;SET SPECIAL PNTR FLAG\r
+       TLZ ARG,PNTF            ;CLEAR POINTER FLAG\r
+       JRST UPDAT3             ;SAVE THE POINTER AND EXIT\r
+\r
+\f      SUBTTL  CONSTANTS\r
+\r
+\r
+IFN FORMSW,<\r
+HWFORM:        BYTE    (18) 1,1\r
+INFORM:        BYTE    (9) 1 (4) 1 (1) 1 (4) 1 (18) 1\r
+IOFORM:        BYTE    (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1\r
+BPFORM:        BYTE    (6) 1,1 (2) 1 (4) 1 (18) 1\r
+ASCIIF:        BYTE    (7) 1,1,1,1,1\r
+SXFORM:        BYTE    (6) 1,1,1,1,1,1\r
+>\r
+\r
+\f      SUBTTL PHASED CODE\r
+\r
+IFN PURESW,<LOWH:\r
+IFE SEG2SW,<   PHASE   140>\r
+IFN SEG2SW,<   PHASE   LOWL>\r
+>\r
+IFN TEMP,<TMPFIL: SIXBIT /MAC/\r
+       XWD     -200,0>\r
+LSTFIL:        BLOCK 1\r
+       SIXBIT /@/      ;SYMBOL TO STOP PRINTING\r
+TAG:   BLOCK   1\r
+       SIXBIT  / + @/\r
+TABI:\r
+IFE FORMSW,<   BYTE    (7) 0, 11, 11, 11, 11>\r
+IFN FORMSW,<   BYTE    (7) 11,11, 11, 11, 11>\r
+SEQNO: BLOCK   1\r
+       ASCIZ   /       /\r
+BININI:        EXP     B\r
+BINDEV:        BLOCK   1\r
+       XWD     BINBUF,0\r
+LSTINI:        EXP     AL\r
+LSTDEV:        BLOCK   1\r
+       XWD     LSTBUF,0\r
+IFN CCLSW,<\r
+IFE RUNSW,<\r
+NUNINI:        EXP     DMP\r
+NUNDEV:        BLOCK   1\r
+       XWD     0,0>\r
+RPGINI:        EXP     AL\r
+RPGDEV:        BLOCK 1\r
+       XWD 0,CTLBLK\r
+>\r
+INDEVI:        EXP     A\r
+INDEV: BLOCK   1\r
+       XWD     0,IBUF\r
+DBUF:  ASCIZ   / TI:ME DY-MON-YR PAGE /\r
+VBUF:  ASCIZ   /       MACRO / ;MUST BE LAST LOCATIONS IN BLOCK\r
+IFE PURESW,<   BLOCK   3       ;ALLOW FOR LONG TITLE>\r
+IFN PURESW,<   DEPHASE\r
+       LENLOW==.-LOWH>\r
+\r
+\fSUBTTL        STORAGE CELLS\r
+\r
+IFN PURESW,<\r
+IFE SEG2SW,<   LOC     140>\r
+IFN SEG2SW,<   RELOC   LOWL>\r
+LOWL:  BLOCK LENLOW+3 >\r
+PASS1I:\r
+\r
+RP:    BLOCK   1\r
+\r
+IFE CCLSW,<CTIBUF:     BLOCK   3\r
+CTOBUF:        BLOCK   3\r
+>\r
+IFN CCLSW,<CTLBUF:     BLOCK   <CTLSIZ+5>/5\r
+IFN RUNSW,<RUNDEV:     BLOCK   1\r
+RUNFIL:        BLOCK   3\r
+RUNPP: BLOCK   2>>\r
+LSTBUF:        BLOCK   3\r
+BINBUF:        BLOCK   3\r
+IBUF:  BLOCK   3\r
+IFN CCLSW,<IFE RUNSW,<NUNDIR:>>\r
+LSTDIR:        BLOCK   4\r
+BINDIR:        BLOCK   4\r
+INDIR: BLOCK   4\r
+\r
+ACDELX:                                ;LEFT HALF\r
+BLKTYP:        BLOCK   1               ;RIGHT HALF\r
+\r
+COUTX: BLOCK   1\r
+COUTY: BLOCK   1\r
+COUTP: BLOCK   1\r
+COUTRB:        BLOCK   1\r
+COUTDB:        BLOCK   ^D18\r
+\r
+ERRCNT:        BLOCK   1\r
+FREE:  BLOCK   1\r
+IFN RENTSW,<HIGH1:     BLOCK 1\r
+HISNSW:        BLOCK   1\r
+SVTYP3:        BLOCK   1\r
+HMIN:  BLOCK   1       ;START OF HIGH SEG. IN TWO SEG. PROG.>\r
+IFBLK: BLOCK   .IFBLK\r
+IFBLKA:        BLOCK   .IFBLK\r
+LADR:  BLOCK   1\r
+NCOLLS:        BLOCK   1\r
+LIMBO: BLOCK   1\r
+LBUFP: BLOCK   1\r
+LBUF:  BLOCK   <.CPL+5>/5\r
+       BLOCK 1\r
+VARHD: BLOCK   1\r
+VARHDX:        BLOCK   1\r
+IFN WFWSW,<LVARLC:     BLOCK 1>\r
+\r
+LITAB: BLOCK   1\r
+LITABX:        BLOCK   1\r
+       BLOCK   1\r
+LITHD: BLOCK   1\r
+LITHDX:        BLOCK   1\r
+LITCNT:        BLOCK   1\r
+LITNUM:        BLOCK   1\r
+\r
+LOOKX: BLOCK   1\r
+NEXT:  BLOCK   1\r
+OUTSW: BLOCK   1\r
+PDP:   BLOCK   1\r
+RECCNT:        BLOCK   1\r
+SAVBLK:        BLOCK   RC\r
+SAVERC:        BLOCK   1\r
+SBUF:  BLOCK   .SBUF/5\r
+SRCHX: BLOCK   1\r
+SUBTTX:        BLOCK   1\r
+SVSYM: BLOCK   1\r
+SYMBOL:        BLOCK   1\r
+SYMTOP:        BLOCK   1\r
+SYMCNT:        BLOCK 1\r
+\r
+STPX:  BLOCK   1\r
+STPY:  BLOCK   1\r
+STCODE:        BLOCK   .STP\r
+STOWRC:        BLOCK   .STP\r
+\r
+IFN FORMSW,<\r
+STFORM:        BLOCK   .STP\r
+FORM:  BLOCK   1\r
+HWFMT: BLOCK   1\r
+FLDSIZ:        BLOCK   1\r
+IOSEEN:        BLOCK   1\r
+>\r
+TABP:  BLOCK   1\r
+TCNT:  BLOCK   1               ;COUNT OF CHARS. LEFT IN TBUF\r
+TBUF:  BLOCK   .TBUF/5\r
+DEVBUF:        BLOCK   6               ;STORE NAME.EXT CREATION DATE AND TIME\r
+TYPERR:        BLOCK   1\r
+IONSYM:        BLOCK   1       ;-1 SUPRESS LISTING OF SYMBOLS\r
+PRGPTR:        BLOCK   1       ;POINTER TO CHAIN OF PRGEND BLOCKS\r
+ENTERS:        BLOCK   1       ;-1 WHEN ENTERS HAVE BEEN DONE\r
+UNIVSN:        BLOCK   1       ;-1 WHEN A UNIVERSAL SEEN\r
+\r
+\fPASS2I:\r
+\r
+ABSHI: BLOCK 1\r
+HIGH:  BLOCK   1\r
+IFN RENTSW,<HHIGH: BLOCK 1     ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>\r
+ACDEVX:        BLOCK   1\r
+CPL:   BLOCK   1\r
+CTLSAV:        BLOCK   1\r
+CTLS1: BLOCK   1\r
+EXTPNT:        BLOCK   1\r
+INTENT:        BLOCK   1\r
+INREP: BLOCK 1\r
+INDEF: BLOCK 1\r
+INTXT: BLOCK 1\r
+INCND: BLOCK   1\r
+CALNAM:        BLOCK   1\r
+CALPG: BLOCK 1\r
+CALSEQ:        BLOCK 1\r
+DEFPG: BLOCK 1\r
+DEFSEQ:        BLOCK 1\r
+LITPG: BLOCK 1\r
+LITSEQ:        BLOCK 1\r
+REPPG: BLOCK 1\r
+REPSEQ:        BLOCK 1\r
+TXTPG: BLOCK 1\r
+TXTSEQ:        BLOCK 1\r
+CNDPG: BLOCK   1\r
+CNDSEQ:        BLOCK   1\r
+IRPCNT:        BLOCK   1\r
+IRPARG:        BLOCK   1\r
+IRPARP:        BLOCK   1\r
+IRPCF: BLOCK   1\r
+IRPPOI:        BLOCK   1\r
+IRPSW: BLOCK   1\r
+IFN WFWSW,<FIXLNK:     BLOCK 1>\r
+LITLVL:        BLOCK   1\r
+LITLBL:        BLOCK   1               ;NAME OF LABEL DEFINED INSIDE A LITERAL\r
+\r
+ASGBLK:        BLOCK   1\r
+LOCBLK:        BLOCK   1\r
+\r
+LOCA:  BLOCK   1\r
+LOCO:  BLOCK   1\r
+RELLOC:        BLOCK   1\r
+ABSLOC:        BLOCK   1\r
+LPP:   BLOCK   1\r
+MODA:  BLOCK   1\r
+MODLOC:        BLOCK   1\r
+MODO:  BLOCK   1\r
+IFN CCLSW,<OTBUF:      BLOCK 2>\r
+OUTSQ: BLOCK 2\r
+PAGEN.:        BLOCK   1\r
+PPTEMP:        BLOCK   1\r
+PPTMP1:        BLOCK   1\r
+PPTMP2:        BLOCK   1\r
+\r
+REPCNT:        BLOCK   1\r
+REPEXP:        BLOCK   1\r
+REPPNT:        BLOCK   1\r
+RPOLVL:        BLOCK   1\r
+R1BCNT:        BLOCK 1\r
+R1BCHK:        BLOCK 1\r
+R1BBLK:        BLOCK .R1B\r
+R1BLOC:        BLOCK 1\r
+RIMLOC:        BLOCK   1\r
+TAGINC:        BLOCK   1\r
+VECREL:        BLOCK   1\r
+VECTOR:        BLOCK   1\r
+.TEMP: BLOCK   1               ;TEMPORARY STORAGE\r
+UNISCH:        BLOCK   .UNIV           ;SEARCH TABLE FOR UNIVERSALS\r
+SQFLG: BLOCK 1\r
+ARGF:  BLOCK   1\r
+MACENL:        BLOCK   1\r
+MACLVL:        BLOCK   1\r
+MACPNT:        BLOCK   1\r
+WWRXX: BLOCK   1\r
+RCOUNT:        BLOCK   1               ;COUNT OF WORDS STILL TO READ IN LEAF\r
+WCOUNT:        BLOCK   1               ;COUNT OF WORDS STILL FREE IN LEAF\r
+PASS2Z:                                ;ONLY CLEAR TO HERE ON PRGEND\r
+LSTSYM:        BLOCK   1\r
+PAGENO:        BLOCK   1\r
+SEQNO2:        BLOCK 1\r
+PASS2X:\r
+\r
+\fSUBTTL        MULTI-ASSEMBLY STORAGE CELLS\r
+\r
+LSTPGN:        BLOCK 1\r
+IFN WFWSW,<ARAYP:      BLOCK 1>\r
+HDAS:  BLOCK 1\r
+IFN CCLSW,<EXTMP:      BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)\r
+SAVFF: BLOCK   1\r
+CTLBLK:        BLOCK   3\r
+CTIBUF:        BLOCK   3\r
+CTOBUF:        BLOCK   3>\r
+IFN TEMP,<TMPFLG:      BLOCK 1>\r
+IFN FORMSW,<PHWFMT:    BLOCK 1>\r
+MACSIZ:        BLOCK   1               ;INITIAL SIZE OF LOW SEG\r
+UNISIZ:        BLOCK   1               ;TOP OF BUFFERS AND STACKS\r
+UNITOP:        BLOCK   1               ;TOP OF UNIVERSAL SYMBOL TABLE\r
+UNIVNO:        BLOCK   1               ;NUMBER OF UNIVERSALS SEEN\r
+UNITBL:        BLOCK   .UNIV           ;TABLE OF UNIVERSAL NAMES\r
+UNIPTR:        BLOCK   .UNIV           ;TABLE OF SYMBOL POINTERS\r
+UNISHX:        BLOCK   .UNIV           ;TABLE OF SRCHX POINTERS\r
+       VAR                     ;CLEAR VARIABLES\r
+\r
+JOBFFI:        BLOCK   203*NUMBUF+1            ;INPUT BUFFER PLUS ONE\r
+IFN PURESW,<LOWEND==.-1\r
+       RELOC >\r
+\r
+       END     BEG\r
+\f\r
diff --git a/src/mongen.mac b/src/mongen.mac
new file mode 100644 (file)
index 0000000..db2d765
--- /dev/null
@@ -0,0 +1,1131 @@
+TITLE MONGEN - DIALOG PROGRAM TO DEFINE A 10/40 OR 10/50 T.S. CONFIGURATION - V041\r
+SUBTTL T.HASTINGS/TNM/TW/PFC/GDR/KWB/RCC   TS  05 MAR 71\r
+VMONGN==040\r
+\r
+JOBVER=137\r
+       LOC JOBVER\r
+       EXP VMONGN\r
+                               ;PUT VERSION NUMBER IN JOB DATA AREA\r
+                                       ;ALSO OUTPUT-SEE NEXT PAGE\r
+       RELOC\r
+\r
+;HOW MONGEN IS ORGANIZED:\r
+;ALL SYMBOLS FOR CONFIG.MAC ARE DEFINED USING XP MACRO DEFINED IN S.MAC\r
+;XP DEFINES FIRST ARGUMENT TO BE EQUAL TO THE SECOND ARG\r
+;AND DECLARES THE FIRST ARG TO BE INTERVAL\r
+\r
+;RULE:  ALL SYMBOLS ARE GENERATED ALL THE TIME, NO MATTER HOW DIALOG IS ANSWERED\r
+;WHY - SO USER READING CONFIG+COMMON NEVER NEEDS TO LOOK AT\r
+; MONGEN PROGRAM TO UNDERSTAND MONITOR\r
+\r
+;THE ONLY LOCAL STORAGE IN MONGEN IS USED TO STORE ANSWERS\r
+;WHICH DETERMINE WHETHER A SECOND QUESTION IS TO BE ASKED\r
+;THESE TEMP STORAGE HAVE SAME NAME AS THE SYMBOL WHICH THEY ARE ASSOCIATED WITH\r
+\r
+;RULE:  ALL SYMBOLS WHICH ARE GENERATED BY MONGEN, END IN LETTER N OR NN.\r
+;POLICY:  MONGEN IS STUPID AND SIMPLE MINDED.  IT KNOWS AS LITTLE ABOUT THE MONITOR\r
+;AS POSSIBLE. IT NEVER ADDS TWO ANSWERS TOGETHER, FOR EXAMPLE.  IT ALWAYS GENERATES\r
+;ALL SYMBOLS ALL THE TIME, NO MATTER HOW THE QUESTIONS ARE ANSWERED.  THE SYMBOL\r
+;VALUES ARE ALWAYS WHAT THE USER ANSWERED.  (AS LONG AS SYNTACTICALLY CORRECT).\r
+;IF DEC OFFERS JUST 2 DIFFERENT FORMS OF A DEVICE\r
+; ONLY ONE QUESTION WILL BE ASKED (EX. DECTAPE - 551 OR TD10).\r
+; HOWEVER TWO SYMBOLS ENDING IN N WILL BE GENERATED.\r
+; THIS IS SO A THIRD DEVICE CAN BE ADDED WITH MINIMAL\r
+; CHANGE TO BOTH MONGEN AND COMMON.\r
+;RULE:  ASK RELATED QUESTIONS (EG, 3-WAY BRANCH) SO THAT IF THE FIRST\r
+;ANSWER IS YES, THE SECOND QUESTION IS NOT ASKED.\r
+;RULE:  ASK THE QUESTIONS SO THAT YES IS THE CURRENT STANDARD RESPONSE.\r
+;FOR EACH VARIABLE OUTPUT, THERE IS A CORRESPONDING LOCATION IN MONGEN WITH SAME NAME\r
+;ALL SUCH LOCATIONS ARE INITIALLY SET TO 0 WHEN MONGEN IS STARTED\r
+;EACH QUESTION OR SET OF RELATED QUESTIONS HAS THE FOLLOWING FORM:\r
+; ONE OR MORE QUESTIONS FOLLOWED BY OUTPUT OF THE APPROPRIATE MACRO SOURCE.\r
+; THE FIRST QUESTION IN A SEG ARE OF FORM TAG1,TAG2,ECT.\r
+; ALL JUMPS TO OTHER QUESTIONS IN SEG ARE OF FORM TAG1,TAG2, ETC.\r
+; THE OUTPUT SECTION OF A SEG IS LABELED TAGOUT:  EVEN THOUGH IT MAY\r
+; NEVER BE JRSTED TO.  NOTE:  THERE ARE NO OTHER TAGS IN OUTPUT SECTION\r
+; BECAUSE ALL SYMBOLS ARE ALWAYS OUTPUT, SO THERE IS NO BRANCHING IN OUTPUT SECTION.\r
+\r
+\r
+;ANY TTY OUTPUT ENCLOSED IN []'S WILL BE TYPED ONLY IF LONG DIALOG IS IN EFFECT\r
+\f;ACS\r
+P=17                           ;PUSHDOWN POINTER\r
+N=1                            ;NUMERICAL VALUE OF ASKED QUESTION\r
+                               ;0=N,1=Y, HIGHER NO. IS VALUE OF OCTAL OR DECIMAL ANSWER\r
+                               ;VALUE RETURNED BY ASKYN, ASKOCT,ASKDEC ROUTINES\r
+T=2                            ;TEMPORARY AC\r
+T1=T+1\r
+CH=4                           ;CHARACTER AC\r
+WD=CH+1                                ;WORD AC\r
+                               ;FIRST ARGUMENT PASSED TO OUTXP\r
+B=6                            ;BYTE POINTER TO INPUT STRING\r
+R=7                            ;RADIX FOR INPUT\r
+CHN=10\r
+CHN1=11\r
+CHN2=12\r
+TTYCHN=0\r
+TOCHN=0                                ;TTY OUTPUT CHANNEL\r
+FOCHN=1                                ;FILE OUTPUT CHANNEL\r
+OUTCHN=1\r
+\r
+MLON           ;MULTI LINE LITERAL\r
+\r
+\r
+MAXCHN=8       ;MAXIMUM NUMBER OF DISK CHANNELS\r
+\r
+MAXFHU=8       ;MAXIMUM NUMBER OF UNITS ON FIXED HEAD CONTROLLERS\r
+MAXDPU=8       ;MAXIMUM NUMBEROF UNITS ON DISK PACK CONTROLLERS\r
+MAXMFU=2       ;MAXIMUM NUMBER OF UNITS ON MASS FILE CONTROLLERS\r
+\r
+;THE FOLLOWING SIMPLE ROUTINES ARE USED TO ASK QUESTIONS:\r
+;ASKYN - ANSWER -(Y,N,) OR (1,0)\r
+;ASKDEC - ANSWER - DECIMAL NUMBER\r
+;ASKOCT - ANSWER - OCTAL NUMBER\r
+;ASKACZ - ANSWER - LOC ASCSTR...VASCSTR+5(ASCIZ)\r
+;ASKSIX - ANSWER - LOC ASCSTR...ASCSTR=1(ASCIZ)(ONLY 6 CHAR ALLOWED)\r
+;OUTFIL - OUTPUT TO CONFIG.MAC ONLY\r
+;OUTBTH - OUTPUT TO TTY AND CONFIG.MAC(;IS REMOVED BEFORE GOING TO TTY)\r
+;OUTXP - SUBSTITUTES VALUE IN N FOR * IN ASCIZ\r
+;OUTSTR - SUBSTITUTE ASCIZ STRING IN ASCSTR FOR * IN ASCIZ ARG\r
+;OUTTTY - OUTPUT TO TTY ONLY (ERROR MESSAGE)\r
+\r
+\r
+XALL                           ;DO NOT LIST ASCII EXPANSIONS\r
+\r
+DEFINE ASCIIZ (A)\r
+<\r
+       XLIST\r
+       ASCIZ &A\r
+&\r
+       LIST>\r
+\f      SUBTTL  INITIALIZATION\r
+MONGEN:        CALLI 0                         ;RESET\r
+       MOVE    P,[IOWD 12,PDLIST]\r
+       SETZM VARBEG\r
+       MOVE N,[XWD VARBEG,VARBEG+1]\r
+       BLT N,VAREND                    ;CLEAR VARIABLE STORAGE\r
+\r
+       INIT TTYCHN,1\r
+       SIXBIT /TTY/\r
+       XWD TOBUF,TIBUF\r
+       HALT .-3\r
+MON1:  PUSHJ P,OUTTTY\r
+       ASCIIZ <;TYPE "DEVICE:NAME.EXT<CR>" FOR WHERE TO PUT RESULTS OF THIS DIALOG\r
+;CR ASSUMES "DSK:CONFIG.MAC">\r
+       PUSHJ P,TTYIN\r
+       PUSHJ   P,GETWRD\r
+       SETZ    N,\r
+       CAIE    CH,":"\r
+       EXCH    WD,N\r
+       SKIPN   WD\r
+       MOVSI   WD,(SIXBIT .DSK.)\r
+       MOVEM   WD,.+2\r
+       INIT OUTCHN,1\r
+       SIXBIT /DSK/\r
+       XWD FOBUF,0             ;INIT OUTPUT DEVICE 'OUTP'\r
+       JRST .+2\r
+       JRST OUTOK              ;LOGICAL DEVICE WAS ASSIGNED\r
+       PUSHJ P,OUTTTY\r
+       ASCIIZ <DEVICE NOT AVAILABLE>\r
+       JRST MON1               ;ASK AGAIN\r
+\r
+OUTDIR:        SIXBIT  /CONFIG/\r
+OUTDR1:        SIXBIT  /MAC/\r
+       BLOCK   2\r
+\r
+OUTOK: CAIE    CH,":"\r
+       SKIPA   WD,N\r
+       PUSHJ   P,GETWRD\r
+       SKIPN   WD\r
+       MOVE    WD,[SIXBIT .CONFIG.]\r
+       MOVEM   WD,OUTDIR\r
+       CAIE    CH,"."\r
+       PUSHJ   P,GETWRD\r
+       CAIN    CH,"."\r
+       JRST    .+3\r
+       MOVSI   WD,(SIXBIT/MAC/)\r
+       JRST    .+2\r
+       PUSHJ   P,GETWRD\r
+       MOVEM   WD,OUTDR1\r
+       ENTER   OUTCHN,OUTDIR\r
+       JRST ENTERR\r
+\f      SUBTTL  DETERMIN GENERAL TYPE OF SYSTEM ,ETC.\r
+       PUSHJ P,OUTFIL          ;WRITE ON OUTPUT FILE ONLY\r
+       ASCIIZ <SUBTTL  CONFIG - CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN DIALOG\r
+\r
+\r
+>\r
+       PUSHJ P,OUTBTH          ;BOTH TTY AND OUTPUT FILE(AS COMMENT)\r
+       ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER>\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;SHORT DIALOG?[N = LONGER QUESTIONS]>\r
+       MOVEM   N,SHORT         ;REMEMBER FOR QUTTTY ROUT.\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM]>\r
+       JUMPN N,.+2\r
+       JRST    SYSASK+1\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM]>\r
+       JUMPN N,SYS1\r
+       JRST    SYSASK\r
+\r
+ENTERR:        PUSHJ P,OUTTTY\r
+       ASCIIZ <ENTER FAILURE>\r
+       JRST MON1\r
+\fSYSASK:       AOS     SYS40N\r
+       PUSHJ P,ASKYN                   ;FIND OUT IF 10/40 WITH DISK\r
+       ASCIIZ <;DISK?>\r
+       JUMPE N,SYSOUT                  ;DISK SYSTEM?\r
+SYS1:  AOS SYS50N\r
+       AOS DSKN\r
+       AOS LOGINN\r
+SYSOUT:        MOVE N,SYS40N                   ;DEFINE 10/40 SYSTEM SYMBOL\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP SYS40N,*>\r
+       MOVEI N,SYS50N  \r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP SYS50N,*>\r
+       MOVE N,DSKN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DSKN,*>\r
+       MOVE N,LOGINN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP LOGINN,*>\r
+\r
+\f      SUBTTL  SET-UP DISK CONFIGURATION\r
+DSKASK:        SKIPN N,DSKN            ;NEED A DISK?\r
+       JRST    JOBASK          ;NO DISK - NO QUESTION\r
+\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES,\r
+;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING]>\r
+       MOVEM N,RD10N\r
+SYS1A: PUSHJ P,OUTXP\r
+       ASCIIZ <XP RD10N,*>\r
+       SKIPN N,RD10N           ;RD10 REQUESTED?\r
+       JRST SYS1B              ;NO.\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE]>\r
+       MOVEM N,SWPYES\r
+SYS1B: PUSHJ P,OUTXP\r
+       ASCIIZ <XP RDSWPN,*>\r
+       SKIPN N,DSKN\r
+       JRST SYS2A\r
+       PUSHJ P,ASKDEC\r
+       ASCIIZ  <;HOW MANY RP01 OR RP02 (MEMOREX) DISK PACK DRIVES?[0 IF NONE]>\r
+SYS2A: MOVEM N,RP10N\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP RP10N,*>\r
+       SKIPE   N,RP10N\r
+       SKIPE SWPYES\r
+       JRST SYS2B              ;AVOID QUESTION IF NO RP10 OR ALREADY HAVE SWAP DEV\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;RP10 FOR SWAPPING?>\r
+       MOVEM N,SWPYES\r
+SYS2B: PUSHJ P,OUTXP\r
+       ASCIIZ <XP RPSWPN,*>\r
+\f      SKIPN N,RP10N\r
+       JRST SYS3\r
+       MOVE N,RP10N\r
+       SOJE N,SYS2D            ;AVOID QUESTION IF ONLY 1 PACK\r
+SYS2C: PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY PRIVATE DRIVES?>\r
+       CAML N,RP10N\r
+       JRST SYS2C\r
+SYS2D: MOVNS N\r
+       ADD N,RP10N\r
+SYS3:  PUSHJ P,OUTXP\r
+       ASCIIZ <DPCPNO=*>\r
+\f      SKIPN N,DSKN\r
+       JRST SYS3A\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;RA10 (BRYANT) DISK?>\r
+       MOVEM N,RA10N\r
+SYS3A: PUSHJ P,OUTXP\r
+       ASCIIZ <XP RA10N,*>\r
+       SETCM N,SWPYES\r
+       AND N,RA10N                     ;RA10 AND NO SWAP DEVICE?\r
+       JUMPE N,SYS3B                   ;NO. AVOID QUESTION\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;RA10 FOR SWAPPING?>\r
+SYS3B: PUSHJ P,OUTXP\r
+       ASCIIZ <XP RASWPN,*>\r
+       SKIPN N,DSKN\r
+       JRST SYS4A\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;DPD (DATA PRODUCTS) DISK?>\r
+       MOVEM N,DPDN\r
+SYS4A: PUSHJ P,OUTXP\r
+       ASCIIZ <XP DPDN,*>\r
+       SETCM N,SWPYES\r
+       AND N,DPDN                      ;DPDN AND NO SWAP DEVICE?\r
+       JUMPE N,SYS4B                   ;NO. AVOID QUESTION\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;DPD FOR SWAPPING?>\r
+       MOVEM N,SWPYES\r
+SYS4B: PUSHJ P,OUTXP\r
+       ASCIIZ <XP DPSWPN,*>\r
+\f      SUBTTL  DETERMIN JOB AND APR CONFIGURATION\r
+JOBASK:        PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB]>\r
+       JUMPE   N,JOBASK\r
+       CAILE   N,^D128\r
+       JRST    JOBASK\r
+JOBOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP JOBN,*>\r
+\r
+MXKASK:        PUSHJ   P,ASKDEC\r
+       ASCIIZ  <;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER?\r
+;0 MEANS ALL OF CORE>\r
+MXKOUT:        PUSHJ   P,OUTXP\r
+       ASCIIZ  <XP COREN,*>\r
+\r
+PDPASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;PDP-10 PROCESSOR?[N = PDP-6]>\r
+PDPOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP PDP10N,*>\r
+\r
+RELASK:        JUMPE N, REL1                   ;PDP-10?\r
+       PUSHJ P,ASKYN                   ;YES,ASK ABOUT 2 RELOC SOFTWARE\r
+       ASCIIZ <;2 RELOCATION REG. SOFTWARE?[Y = MUST HAVE KT10A,\r
+;N = JUST 1 RELOC. REG.]>\r
+REL1:  PUSHJ P,OUTXP\r
+       ASCIIZ <XP KT10AN,*>\r
+\r
+       JUMPE N,REL2                    ;SEGN=0 IF PDP-6 OR NOT 2 RELOC. SOFT\r
+       PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU\r
+;ANTICIPATE A LOT OF DORMANT SEGMENTS]>\r
+REL2:  PUSHJ P,OUTXP\r
+       ASCIIZ <XP SEGN,*>\r
+\r
+DDTASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE]>\r
+DDTOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP DDTN,*>\r
+\r
+SYM:   PUSHJ P,ASKYN\r
+       ASCIIZ <;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE]>\r
+SYMOUT:        MOVEM N,LOCALN                  ;SAVE ANSWER FOR LATER INSTRUCTION\r
+UDTASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER,\r
+;USE USER DDT FOR PATCHING UNDER TIME SHARING]>\r
+UDTOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP UDDTN,*>\r
+NAMASK:        PUSHJ P,ASKST2                  ;STORE ANSWER IN LOC "ASCSTR"\r
+       ASCIIZ <;NAME OF THIS SYSTEM (24 CHARS OR LESS)?>\r
+NAMOUT:        PUSHJ P,OUTSTR                  ;SUBSTITUTE ANSWER FOR *\r
+       ASCIIZ <DEFINE SYSNAM\r
+<      ASCIZ \*\>>\r
+SERASK:        PUSHJ   P,ASKDEC        ;GET SERIAL NUMBER OF KA10\r
+       ASCIIZ <;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR?>\r
+SEROUT:        PUSHJ   P,OUTXP\r
+       ASCIIZ <XP APRSN,*>\r
+       SETZM ASCSTR                    ;INITIALIZE THIS CELL\r
+DEVASK:        PUSHJ P,ASKST2                  ;STORE ANSWER IN LOC "ASCSTC" (UP TO SIX CHAR)\r
+       ASCIIZ <;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM,\r
+;DSK USUAL FOR 10/50 SYSTEM]>\r
+       SKIPE   ASCSTR\r
+       JRST    DEVOUT\r
+       MOVE    WD,[ASCIZ /DSK/]\r
+       SKIPN   DSKN\r
+       MOVE    WD,[ASCIZ /DTA0/]\r
+       MOVEM   WD,ASCSTR\r
+DEVOUT:        PUSHJ P,OUTSTR                  ;SUBSTUTITE ANSWER FOR *\r
+       ASCIIZ <DEFINE SYSDEV\r
+<      SIXBIT "*">>\r
+\f      PUSHJ   P,OUTFIL\r
+       ASCIZ   &DEFINE SYSDAT\r
+<      ASCIZ /&\r
+       CALL    N,[SIXBIT /DATE/]\r
+       IDIVI   N,^D12*^D31\r
+       ADDI    N,^D64\r
+       PUSH    P,N\r
+       IDIVI   T,^D31\r
+       MOVEI   N,1(T)\r
+       MOVEI   R,12\r
+       PUSHJ   P,XPSUB1\r
+       MOVEI   CH,"-"\r
+       PUSHJ   P,FILPUT\r
+       MOVEI   N,1(T1)\r
+       PUSHJ   P,XPSUB1\r
+       MOVEI   CH,"-"\r
+       PUSHJ   P,FILPUT\r
+       POP     P,N\r
+       PUSHJ   P,XPSUB1\r
+       PUSHJ   P,OUTFIL\r
+       ASCIIZ  </>>\r
+\r
+\f      SUBTTL  SET-UP TTY CONFIGURATION\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630]>\r
+       MOVEM N,DLSN\r
+       JUMPN N,DLSOUT\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;PDP-8 680 COMMUNICATIONS SYSTEM?[Y = 680I TOO, N = WILL ASK FOR 630]>\r
+       MOVEM N,CCIN\r
+       JUMPN N,DLSOUT\r
+       PUSHJ P,ASKYN\r
+       ASCIIZ <;630 COMMUNICATION SYSTEM?>\r
+       MOVEM N,DCSN\r
+       JUMPE N,DLSASK                  ;LOOP UNTIL HE SAYS Y TO ONE\r
+DLSOUT:        MOVE N,DLSN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DLSN,*>\r
+       MOVE N,CCIN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP CCIN,*>\r
+       MOVE N,DCSN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DCSN,*>\r
+\fTTNASK:       SKIPE CCIN              ;JUST 680?\r
+       JRST TTN1               ;YES. NO DC10B,E, OR 632\r
+       PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY DC10B (OR 632) 8-LINE DATA GROUPS?[\r
+;1=TTY0-7, 2=TTY0-17, ... , 8=TTY0-77]>\r
+       MOVEM N,TTGRPN\r
+       SKIPN BTHN\r
+       SKIPE DLSN\r
+       SKIPA\r
+       JRST TTN1\r
+       PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY DC10E DATASET CONTROL GROUPS?>\r
+       MOVEM N,DSGRPN\r
+TTN1:  SKIPN BTHN\r
+       SKIPE CCIN\r
+       SKIPA\r
+       JRST TTN2\r
+       PUSHJ P,ASKOCT\r
+       ASCIIZ <;HOW MANY (OCTAL) LINES ON YOUR 680(I), INCLUDING\r
+;ITS CONSOLE TELETYPE?>\r
+       MOVEM N,CCILN\r
+TTN2:\r
+TTNOUT:        MOVE N,TTGRPN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP TTGRPN,*>\r
+       MOVE N,DSGRPN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DSGRPN,*>\r
+       MOVE N,CCILN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP CCILN,*>\r
+TTNEND:\r
+\fTTYASK:       PUSHJ P,OUTBTH\r
+       ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS ABOUT YOUR TELETYPE LINES:\r
+;[TYPE OCTAL LINE NUMBERS, ONE PER LINE.\r
+;TYPE EXTRA CR WHEN DONE.]\r
+>\r
+TTY0:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;DATA SET LINES?[PROJECT 1 CAN'T LOGIN, LOGIN RESETS\r
+;LINE TO COMPUTER ECHOING AND NO HARDWARE TABS]>\r
+TTY0A: PUSHJ P,TTYIN1\r
+       JRST TTY1\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP DSD*,1>\r
+       JRST TTY0A\r
+\r
+TTY1:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;LINES WITH HARDWARE TABS?[MONITOR SIMULATES REST WITH SPACES]>\r
+TTY1A: PUSHJ P,TTYIN1\r
+       JRST TTY2               ;CR\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP TAB*,1>\r
+       JRST TTY1A\r
+\r
+TTY2:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;REMOTE LINES?[PROJECT 1 CAN'T LOGIN,]>\r
+TTY2A: PUSHJ P,TTYIN1\r
+       JRST TTY21              ;CR\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP RMT*,1>\r
+       JRST TTY2A\r
+\r
+TTY21: PUSHJ P,OUTBTH          ;ASK ABOUT LOCAL COPY LINES\r
+       ASCIIZ <;LOCAL COPY LINES? [ECHOING PROVIDED BY TERMINAL RATHER\r
+;THAN BY COMPUTER. OFTEN (INCORRECTLY) CALLED "HALF DUPLEX".]>\r
+TTY21A:        PUSHJ P,TTYIN1          ;GET A LINE NUMBER\r
+         JRST TTY3             ;JUST A CARRIAGE RETURN\r
+       PUSHJ P,OUTSTR          ;PUT LINE NUMBER IN THE FILE\r
+       ASCIIZ <XP LCP*,1>\r
+       JRST TTY21A             ;SEE IF ANY MORE LOCAL COPY LINES\r
+\r
+TTY3:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;HALF DUPLEX LINES?[TWX OR HALF DUPLEX WIRED SCANNER(DC10C)]>\r
+TTY3A: PUSHJ P,TTYIN1\r
+       JRST TTY4\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP HLF*,1>\r
+       JRST TTY3A\r
+\fTTY4: PUSHJ P,OUTBTH\r
+       ASCIIZ <;SLAVES? [NO COMMANDS MAY BE TYPED]>\r
+TTY4A: PUSHJ P,TTYIN1\r
+       JRST TTY5\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP SLV*,1>\r
+       JRST TTY4A\r
+TTY5:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;LINES WITH HARDWARE FORMFEED? [LEAVE OUT IF USERS WOULD RATHER\r
+;NOT GET FORMFEEDS UNTIL THEY DO TTY FORM COMMAND]>\r
+TTY5A: PUSHJ P,TTYIN1\r
+       JRST TTY6\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP FRM*,1>\r
+       JRST TTY5A\r
+TTY6:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;LINES WHICH RUN INITIA AT STARTUP?>\r
+TTY6A: PUSHJ P,TTYIN1\r
+       JRST TTY7\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <XP INI*,1>\r
+       JRST TTY6A\r
+TTY7:\r
+\r
+EDTASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION?[\r
+;N = WILL ALLOW YOU TO DEFINE NOW]>\r
+EDTOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP EDITN,*>\r
+       JUMPN N,TTYEND  ;DO NOT ASK QUESTIONS ABOUT TTY IF EDITED\r
+\r
+\fDSCASK:       SKIPN DSGRPN            ;ANY DC10E'S?\r
+       JRST DSCEND             ;NO\r
+       PUSHJ P,OUTBTH\r
+       ASCIIZ <;WHAT IS THE CORRESPONDENCE BETWEEN THE DC10E LINES\r
+;AND THE DC10B LINES? TYPE "#,#" FOR EACH DATASET. FIRST # IS\r
+;DC10E LINE, SECOND # IS DC10B LINE.[# IS AN OCTAL NUMBER.\r
+;TYPE ONE #,# PER LINE, EXTRA CR WHEN DONE.]>\r
+\r
+\r
+       PUSHJ P,OUTFIL\r
+       ASCIZ /DEFINE DSASOC <\r
+/\r
+DSC1:  PUSHJ P,TTYIN1\r
+       JRST DSC2               ;CR ONLY\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <GENLIN *>\r
+       JRST DSC1               ;LOOP FOR MORE\r
+DSC2:  PUSHJ P,OUTFIL\r
+       ASCIZ />\r
+/\r
+DSCEND:\r
+TTYEND:\r
+\f      SUBTTL  SET-UP GENERAL PERIPHERAL CONFIGURATION\r
+PTRASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;PT READER?>\r
+PTROUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <PTRN==*         ;NOT GLOBAL BECAUSE OF DSKSER USE>\r
+\r
+PTPASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;PT PUNCH?>\r
+PTPOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP PTPN,*>\r
+\r
+PLTASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;PLOTTER?>\r
+PLTOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP PLTN,*>\r
+\r
+LPTASK:        PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY LINE PRINTERS?[0,1 OR 2]>\r
+       CAILE   N,2\r
+       JRST    LPTASK\r
+       MOVEM N,LPTN\r
+LPTOUT:        MOVE N,LPTN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP LPTN,*>\r
+\r
+CDRASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;CARD READER?>\r
+       MOVEM N,CDRN\r
+       JUMPE N,CDROUT\r
+CDR1:  PUSHJ P,ASKYN\r
+       ASCIIZ <;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER]>\r
+       MOVEM N,CR10N\r
+CDROUT:        MOVE N,CDRN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP CDRN,*>\r
+       MOVE N,CR10N\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP CR10N,*>\r
+CDPASK:        PUSHJ P,ASKYN\r
+       ASCIIZ <;CARD PUNCH?>\r
+CDPOUT:        PUSHJ P,OUTXP\r
+       ASCIIZ <XP CDPN,*>\r
+\fDISASK:       PUSHJ P,ASKYN\r
+       ASCIIZ <;DISPLAY?>\r
+       JUMPE N,DISOUT\r
+       MOVEM N,DISN\r
+DIS1:  PUSHJ P,ASKYN\r
+       ASCIIZ <;TYPE 340?>\r
+       MOVEM N,T340N\r
+DISOUT:        MOVE N,DISN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DISN,*>\r
+       MOVE    N,DISN\r
+       PUSHJ P,OUTXP           ;ASSUME PEN IF DISPLAY\r
+       ASCIIZ <XP PENN,*>\r
+       MOVE N,T340N\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP T340N,*>\r
+\fDTAASK:       PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY DECTAPES?[0 TO 8]>\r
+       JUMPE N,DTAOUT\r
+       CAILE   N,^D8\r
+       JRST    DTAASK\r
+       MOVEM N, DTANN\r
+DTA1:  PUSHJ P,ASKYN\r
+       ASCIIZ <;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE]>\r
+       MOVE T,DTANN\r
+       SKIPE N\r
+       MOVEM T,DTAN\r
+       SKIPN N\r
+       MOVEM T,DTCN\r
+DTAOUT:        MOVE N,DTAN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DTAN,*>\r
+       MOVE N,DTCN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP DTCN,*>\r
+\fMTAASK:       PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY MAGTAPES?[0 TO 8]>\r
+       JUMPE N,MTAOUT\r
+       CAILE   N,^D8\r
+       JRST    MTAASK\r
+       MOVEM N,MTANN\r
+MTA1:  PUSHJ P,ASKYN\r
+       ASCIIZ <;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES]>\r
+       JUMPE N,MTA2\r
+       MOVE N,MTANN\r
+       MOVEM N,MTAN\r
+       JRST MTAOUT\r
+\r
+MTA2:  PUSHJ P,ASKYN\r
+       ASCIIZ <;TM-10B CONTROL?>\r
+       JUMPE N,MTA3\r
+       MOVE N,MTANN\r
+       MOVEM N,MTBN\r
+       JRST MTAOUT\r
+\r
+MTA3:  PUSHJ P,ASKYN\r
+       ASCIIZ <;PDP-6 MAGTAPE?>\r
+       JUMPE N,MTAASK          ;LOOP UNTIL HE PICKS ONE\r
+       MOVE N,MTANN\r
+       MOVEM N,MTCN\r
+MTAOUT:        MOVE N,MTAN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP MTAN,*>\r
+       MOVE N,MTBN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP MTBN,*>\r
+       MOVE N,MTCN\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP MTCN,*>\r
+PTYASK:        PUSHJ P,ASKDEC\r
+       ASCIIZ <;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE]>\r
+       CAILE   N,^D64\r
+       JRST    PTYASK\r
+       PUSHJ P,OUTXP\r
+       ASCIIZ <XP PTYN,*>\r
+\f      SUBTTL  DETERMIN MISC. PARAMETERS\r
+\fASKSYM:       PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED.  NEXT QUESTION WILL ASK FOR OCTAL DEFINITION.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+       PUSHJ P,OUTFIL          ;MAKE MACRO CONVERT IN DECIMAL RADIX WHEN COMMON ASS.\r
+       ASCIIZ <RADIX 10>\r
+GETSYM:        PUSHJ   P,TTYIN\r
+       ILDB    CH,B\r
+       CAIN    CH,12\r
+       JRST    SYMDON\r
+       PUSHJ   P,OUTSTR\r
+       ASCIIZ  <XP *>\r
+       JRST    GETSYM\r
+SYMDON:        PUSHJ P,OUTFIL          ;PSEUDO OP BACK TO OCTAL\r
+       ASCIIZ <RADIX 8>\r
+\r
+ASKSY8:        PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;TYPE "SYMBOL,VALUE" (VALUE IN OCTAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED.  TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+GETSY8:        PUSHJ   P,TTYIN\r
+       ILDB    CH,B\r
+       CAIN    CH,12\r
+       JRST    OCTDON\r
+       PUSHJ   P,OUTSTR\r
+       ASCIIZ  <XP *>\r
+       JRST    GETSY8\r
+OCTDON:\r
+\fASKDEV:       PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES[\r
+;WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK.\r
+;"DEVICE" MUST BE 3 CHARACTERS OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+       PUSHJ   P,OUTFIL\r
+       ASCIZ   /DEFINE SPCINT\r
+<\r
+/\r
+DEV0:  PUSHJ P,TTYIN\r
+       ILDB CH,B\r
+       CAIN CH,12              ;LF\r
+       JRST DEV1\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <        SPASGINT *>\r
+       JRST DEV0\r
+\r
+DEV1:  PUSHJ P,OUTFIL\r
+       ASCIZ />/\r
+       PUSHJ P,OUTBTH\r
+       ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,NO.-OF-DEVICES"[\r
+;FOR SPECIAL DEVICE WITH DEVICE DATA BLOCKS\r
+;"DEVICE" MUST BE 3 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+       PUSHJ P,OUTFIL\r
+       ASCIZ /DEFINE SPCDDB\r
+<\r
+/\r
+DEV2:  PUSHJ P,TTYIN\r
+       ILDB CH,B\r
+       CAIN CH,12\r
+       JRST DEV3\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <        SPASGDDB *>\r
+       JRST DEV2\r
+DEV3:  PUSHJ P,OUTFIL\r
+       ASCIZ />/\r
+\f      PUSHJ P,OUTBTH\r
+       ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,HIGHEST-AC-TO-SAVE[\r
+;FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES TO SAVE AC'S UP TO\r
+;"HIGHEST-AC-TO-SAVE".  "DEVICE" MUST BE 3 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+       PUSHJ P,OUTFIL\r
+       ASCIZ /DEFINE SPCSAV\r
+<\r
+/\r
+DEV4:  PUSHJ P,TTYIN\r
+       ILDB CH,B\r
+       CAIN CH,12\r
+       JRST DEV5\r
+       PUSHJ P,OUTSTR\r
+       ASCIIZ <        SPASGSAV *>\r
+       JRST DEV4\r
+DEV5:  PUSHJ P,OUTFIL\r
+       ASCIZ />/\r
+\r
+REMEND:\r
+\f      SUBTTL  FINISH OFF THE JOB\r
+       PUSHJ P,OUTBTH\r
+       ASCIIZ  <;[MONGEN FINISHED\r
+;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO>\r
+       SKIPN   LEVDN\r
+       JRST    ASSEM1\r
+       PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;AND COMMOD>\r
+ASSEM1:        PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;THEN LOAD IT AND REST OF MONITOR WITH LOADER\r
+;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE\r
+\r
+;[TO ASSEMBLE COMMON, TYPE:\r
+;R MACRO\r
+;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON>\r
+       PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;TO LOAD NEW MONITOR, TYPE:\r
+;R LOADER>\r
+       SKIPN   LOCALN\r
+       JRST    NOLCLS\r
+       PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;/S>\r
+NOLCLS:        SKIPN SYS40N            ;10/40 SYSTEM?\r
+       JRST SYS40A             ;NO\r
+       PUSHJ P,OUTBTH          ;YES, TYPE PROPER LIBRARY NAME\r
+       ASCIIZ <;BIN:COMMON,BIN:SYS50/L>\r
+       JRST SYS40B\r
+\r
+SYS40A:        PUSHJ   P,OUTBTH\r
+       ASCIIZ  <;DSK:COMMON,COMMOD,DSK:SYS40/L>\r
+SYS40B:        PUSHJ P,OUTBTH\r
+       ASCIIZ <;LPT:_/W/D/A/M/P/G>\r
+DDT1:  PUSHJ P,OUTBTH\r
+       ASCIIZ <;TO SAVE MONITOR, TYPE:\r
+;SAVE DSK MONITOR\r
+;]\r
+;      END OF CONFIGURATION DEFINITION\r
+       SUBTTL\r
+;]>\r
+       MOVEI CH,14             ;OUTPUT FORMFEED FOR END OF CONFIG.MAC FILE\r
+       PUSHJ P,FILPUT\r
+       RELEASE OUTCHN,         ;RELEASE OUTPUT FILE\r
+       CALL [SIXBIT /EXIT/]\r
+\f      SUBTTL  VARIABLE AND PARAMETER STORAGE\r
+;VARIABLE STORAGE\r
+TOBUF: BLOCK 3                 ;TTY OUTPUT BUFFER HEADER\r
+TIBUF: BLOCK 3                 ;TTY INPUT BUFFER HEADER\r
+FOBUF: BLOCK 3                 ;FILE OUTPUT BUFFER HEADER\r
+\r
+PDLIST:        BLOCK   12\r
+\r
+RC10S: BLOCK   1\r
+RP10S: BLOCK   1\r
+RA10S: BLOCK   1\r
+\f;VARIABLES WHICH ARE ALSO OUTPUT IN CONFIG.MAC\r
+;NONE OF THE VALUES OF THESE VARIABLES ARE USED OUTSIDE OF THE QUESTION IN WHICH THEY ARE ASKED.\r
+VARBEG:                        ;BEGINNING OF AREA TO BE CLEARED\r
+SHORT: 0                       ;NON-ZERO IF SHORT DIALOG(OMIT STUFF IN [])\r
+LEFTBK:        0                       ;NON-ZERO IF LEFT BRACKET SEEN\r
+SYS40N:        0                       ;\r
+DSKN:  0\r
+LEVDN: 0                       ;LEVEL D VS LEVEL C\r
+CHNN:  0\r
+LOGINN:        0\r
+RD10N: 0                       ;\r
+RP10N: 0                       ;\r
+RA10N: 0                       ;\r
+DPDN:  0                       ;\r
+SWPYES:        0\r
+LOCALN:        0                       ;\r
+BTHN:  0                       ;BOTH 680 AND DC10\r
+DLSN:  0                       ;\r
+CCIN:  0                       ;\r
+DCSN:  0                       ;\r
+TTGRPN:        0                       ;GROUPS OF DC10B OR 632\r
+DSGRPN:        0                       ;GROUPS OF DC10E\r
+CCILN: 0                       ;LINES OF 680\r
+CDRN:  0                       ;\r
+CR10N: 0                       ;\r
+DISN:  0                       ;\r
+T340N: 0                       ;\r
+TVP10N:        0                       ;\r
+T30N:  0                       ;\r
+DTANN: 0                       ;\r
+DTAN:  0                       ;\r
+DTCN:  0                       ;\r
+MTANN: 0                       ;\r
+MTAN:  0                       ;\r
+MTBN:  0                       ;\r
+MTCN:  0                       ;\r
+SPCDEV:        0                       ;SET NONZERO IF ANY SPECIAL DEVICES\r
+TEMPN: 0                       ;\r
+TMPN:  0                       ;\r
+TMPLN: 0                       ;\r
+LPTN:  0\r
+MOVIEN:        0                       ;\r
+LOKN:  0\r
+VAREND=.-1                     ;END OF AREA TO BE CLEARED\r
+\f      SUBTTL  SUBROUTINES\r
+;ROUTINE TO WRITE IN-LINE STRING ON OUTPUT FILE\r
+;CALL: PUSHJ P,OUTFIL\r
+;      ASCIIZ <MESSAGE>\r
+;      RETURN\r
+\r
+OUTFIL:        MOVE T,(P)\r
+       PUSHJ P,FILO\r
+       POP P,CH\r
+       JRST 1(T)\r
+\r
+\r
+\r
+;ROUTINE TO WRITE OUT-OF-LINE STRING ON OUTPUT FILE\r
+;CALL: MOVEI T,[ASCIZ /MESSAGE/]\r
+;      PUSHJ P,FILO\r
+;      RETURN\r
+\r
+FILO:  HRLI T,440700\r
+FILOLP:        ILDB CH,T\r
+       JUMPE CH,CPOPJ\r
+       PUSHJ P,FILPUT\r
+       JRST FILOLP\r
+\r
+;ROUTINE TO OUTPUT AN IN LINE STRING TO BOTH FILE AND TTY\r
+;CALL: PUSHJ P,OUTBTH\r
+;      ASCIZ /STRING/\r
+;      RETURN\r
+\r
+OUTBTH:        MOVE T,(P)\r
+       PUSHJ P,FILO\r
+                               ;FALL INTO OUTTTY\r
+;ROUTINE TO OUTPUT AN IN-LINE STRING TO TTY\r
+;CALL: PUSHJ P,OUTBTH\r
+;      ASCIZ /STRING/\r
+;      RETURN\r
+\r
+OUTTTY:        MOVE T,(P)\r
+       PUSHJ P,TTYO\r
+       POP P,CH\r
+       JRST 1(T)\r
+\f;ROUTINE TO OUTPUT AN OUT-OF-LINE STRING ON TTY\r
+;CALL: MOVEI T,[ASCIZ /STRING/]\r
+;      PUSHJ P,TTYO\r
+;      RETURN\r
+\r
+TTYO:  HRLI T,440700\r
+TTYOLP:        ILDB CH,T\r
+       JUMPE CH,TTYFIN\r
+       CAIE CH,"["             ;IS THIS A LEFT BRACKET?\r
+       JRST TTYO1              ;NO,\r
+       SKIPE SHORT             ;YES, IS SHORT DIALOG WANTED?\r
+       SETOM LEFTBK            ;YES, SET LEFT BRACKET SO OUTPUT SUPPRESSED\r
+TTYO1: SKIPE LEFTBK            ;OUTPUT SUPPRESSED BECAUSE INSIDE []?\r
+       JRST TTYO2              ;YES\r
+       CAIE CH,";"             ;NO, DO NOT TYPE ";" ON TTY\r
+       PUSHJ P,TTYPUT\r
+TTYO2: CAIN CH,"]"             ;END OF LONG STUFF?\r
+       SETZM LEFTBK            ;YES, TURN OFF TTY SUPPRESS FLAG\r
+       JRST TTYOLP\r
+\r
+TTYFIN:        OUTPUT TOCHN,\r
+CPOPJ: POPJ P,\r
+\f;ROUTINE TO ASK A QUESTION AND ACCEPT Y OR N (1 OR 0)\r
+;CALL: PUSHJ P,ASKYN\r
+;      ASCIZ /QUESTION?/\r
+;      RETURN\r
+\r
+ASKYN: PUSHJ P,FCRLF           ;PUT CRLF IN FILE ONLY\r
+       HRRZ T,(P)\r
+       PUSHJ P,FILO\r
+YN1:   HRRZ T,(P)\r
+       HRLS    (P)\r
+       PUSHJ P,TTYO\r
+       AOS     T\r
+       HRRM    T,(P)\r
+       PUSHJ P,TTYIN\r
+       PUSHJ P,GETWRD\r
+       MOVEI N,0\r
+       CAME WD,[SIXBIT /0/]\r
+       CAMN WD,[SIXBIT /N/]\r
+       JRST YNOK\r
+       CAMN WD,[SIXBIT /NO/]\r
+       JRST YNOK\r
+       MOVEI N,1\r
+       CAME WD,[SIXBIT /1/]\r
+       CAMN WD,[SIXBIT /Y/]\r
+       JRST YNOK\r
+       CAME WD,[SIXBIT /YES/]\r
+       JRST YN2\r
+YNOK:  PUSHJ P,OUTSTR\r
+       ASCIIZ <;*>\r
+       POPJ P,\r
+\r
+YN2:   HLRS    (P)\r
+       JRST    YN1\r
+\f;ROUTINE TO OUTPUT ON FILE ASCIZ STRING IN ASCSTR\r
+; SUBSTITUTED FOR "*"\r
+;CALL: PUSHJ P,OUTSTR\r
+;      ASCIIZ <MESSAGE*MESSAGE>\r
+OUTSTR:        MOVE T,(P)\r
+       PUSHJ P,STRO\r
+       POP P,CH\r
+       JRST 1(T)\r
+\r
+STRO:  HRLI T,440700\r
+STROLP:        ILDB CH,T\r
+       JUMPE CH,CPOPJ\r
+       CAIN CH,"*"\r
+       JRST STRSUB\r
+       PUSHJ P,FILPUT\r
+       JRST STROLP\r
+\r
+STRSUB:        PUSH P,T\r
+       MOVEI T,ASCSTR\r
+       PUSHJ P,FILO\r
+       POP P,T\r
+       JRST FILOLP\r
+\f;ROUTINE TO SUBSTITUTE OCTAL VALUE OF N FOR * IN STRING\r
+; AND OUTPUT ON FILE\r
+;      MOVE N,OCTAL NUMBER\r
+;CALL: PUSHJ P,OUTXP\r
+;      ASCIZ /MESSAGE*MESSAGE/\r
+;RETURN WITH N PRESERVED\r
+\r
+OUTXP: MOVE T,(P)\r
+       PUSHJ P,XPO\r
+       POP P,CH\r
+       JRST 1(T)\r
+\r
+XPO:   HRLI T,440700\r
+XPOLP: ILDB CH,T\r
+       JUMPE CH,CPOPJ\r
+       CAIN CH,"*"\r
+       JRST XPSUB\r
+       PUSHJ P,FILPUT\r
+       JRST XPOLP\r
+\r
+XPSUB: PUSH P,T\r
+       PUSH P,N\r
+       MOVEI   R,10\r
+       PUSHJ P,XPSUB1\r
+       POP P,N\r
+       POP P,T\r
+       JRST    FILOLP\r
+XPSUB1:        IDIVI   N,(R)\r
+       HRLM    T,(P)\r
+       JUMPE N,.+2\r
+       PUSHJ P,XPSUB1\r
+       HLRZ T,(P)\r
+       MOVEI CH,"0"(T)\r
+       JRST FILPUT\r
+\f;ROUTINE TO PUT 1 CHAR IN OUTPUT FILE\r
+;CALL: MOVEI CH,CHAR\r
+;      PUSHJ P,FILPUT\r
+\r
+FILPUT:        CAIN    CH,15           ;CARRIAGE RETURN?\r
+       POPJ    P,0             ;YES. THROW IT AWAY\r
+       CAIN    CH,12           ;LINE FEED?\r
+       JRST    FILPU1          ;YES. TURN INTO CR-LF\r
+FILPU2:        SOSG FOBUF+2\r
+       OUTPUT FOCHN,\r
+       IDPB CH,FOBUF+1\r
+       POPJ P,\r
+\r
+FILPU1:        MOVEI   CH,15           ;OUTPUT A CR\r
+       PUSHJ   P,FILPU2\r
+       MOVEI   CH,12           ;AND A LINEFEED\r
+       JRST    FILPU2\r
+\r
+;ROUTINE TO PUT 1 CHAR IN OUTPUT TTY\r
+;CALL: MOVEI CH,CHAR\r
+;      PUSHJ P,TTYPUT\r
+\r
+TTYPUT:        SOSG TOBUF+2\r
+       OUTPUT TOCHN,\r
+       IDPB CH,TOBUF+1\r
+       POPJ P,\r
+\f;ROUTINE TO ASK FOR A STRING AND DELETE THE CR-LF FROM THE ANSWER\r
+;CALL: PUSHJ   P,ASKST2\r
+       ASCIIZ  <QUESTION>\r
+\r
+ASKST2:        PUSHJ   P,ASKSTZ\r
+       PUSHJ   P,TTYIN\r
+       ILDB    T,B\r
+ASKST4:        CAIE    T,12\r
+       JUMPN   T,.-2\r
+       DPB     CH,B\r
+       POPJ    P,\r
+\r
+;ROUTINE TO ASK FOR A STRING\r
+;CALL: PUSHJ PDP,ASKSTR\r
+;      ASCIIZ <QUESTION>\r
+\r
+ASKSTR:        PUSHJ   P,ASKSTZ\r
+       JRST    TTYIN\r
+\r
+\r
+ASKSTZ:        PUSHJ P,FCRLF           ;PUT CRLF IN FILE ONLY\r
+       HRRZ T,-1(P)\r
+       PUSHJ P,FILO\r
+       HRRZ T,-1(P)\r
+       PUSHJ P,TTYO\r
+       AOS     T\r
+       EXCH    T,(P)\r
+       JRST    (T)\r
+\f;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND\r
+; APPEND A NULL CHAR.\r
+;CALL: PUSHJ P,TTYIN\r
+\r
+TTYIN: MOVE T,[XWD 440700,ASCSTR]\r
+ASCLP: PUSHJ P,TTYGET\r
+       JRST ASCEND\r
+       IDPB CH,T\r
+       JRST ASCLP\r
+\r
+ASCEND:        IDPB    CH,T\r
+       MOVEI CH,0\r
+       IDPB CH,T\r
+       MOVE B,[XWD 440700,ASCSTR]\r
+       POPJ P,\r
+\r
+;ROUTINE TO GET 1 CHAR FROM TTY\r
+;CALL: PUSHJ P,TTYGET\r
+;      RETURN1 WITH CR IN AC CH\r
+;      RETURN2 WITH ANY OTHER  CHAR IN AC CH\r
+\r
+TTYGET:        SOSG TIBUF+2\r
+       INPUT TTYCHN,\r
+       ILDB CH,TIBUF+1\r
+       JUMPE   CH,TTYGET\r
+       CAIN    CH,15\r
+       JRST    TTYGET\r
+       CAIE CH,12\r
+       AOS (P)\r
+       POPJ P,\r
+\r
+\r
+;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND APPEND NULL\r
+;SAME AS TTYIN, SKIP RETURN IF NON-BLANK LINE\r
+;CALL: PUSHJ P,TTYIN1\r
+;      BLANK LINE RETURN\r
+;      NON-BLANK LINE RETUNR\r
+\r
+TTYIN1:        PUSHJ P,TTYIN           ;GET LINE\r
+       ILDB T,B                ;LF?\r
+       CAIE T,12\r
+       AOS (P)         ;NO,\r
+       JRST ASKST4             ;REMOVE CR-LF FROM END OF STRING\r
+\f;ROUTINE TO GET FIRST 6 CHAR TYPED IN A RETURN AS SIXBIT\r
+; LEFT JUSTIFIED IN AC WD\r
+\r
+GETWRD:        MOVE T,[XWD 440600,WD]\r
+       MOVEI WD,0\r
+GETWDL:        ILDB CH,B\r
+       JUMPE CH,CPOPJ\r
+       CAIG    CH,15\r
+       CAIGE   CH,12\r
+       SKIPA\r
+       POPJ    P,\r
+       CAIE    CH,":"\r
+       CAIN    CH,"."\r
+       POPJ    P,\r
+       CAIGE   CH,140\r
+       TRC CH,40\r
+       IDPB    CH,T\r
+       TRNN WD,77\r
+       JRST GETWDL\r
+       POPJ P,\r
+ASCSTR:        BLOCK 20                ;ASCIZ STRING\r
+\r
+;ROUTINE TO ASK A QUESTION AND ACCEPT A DECIMAL ANSWER\r
+;CALL: PUSHJ P,ASKDEC\r
+;      ASCIIZ <QUESTION>\r
+\r
+ASKDEC:        MOVEI R,12\r
+       JRST ASKNUM\r
+ASKDC1:        MOVEI   R,12\r
+       JRST    ASKNM1\r
+\f;ROUTINE TO ASK A QUESTION AND ACCEPT AN OCTAL NUMBER\r
+;CALL: PUSHJ P,ASKOCT\r
+;      ASCIZ /QUESTION/\r
+\r
+ASKOCT:        MOVEI R,10\r
+ASKNUM:        PUSHJ P,FCRLF           ;PRECEDE WITH CRLF IN FILE ONLY\r
+ASKNM1:        HRRZ T,(P)\r
+       PUSHJ P,FILO\r
+       MOVEI   CH,";"\r
+       PUSHJ   P,FILPUT\r
+ASKNE: HRRZ T,(P)\r
+       PUSHJ P,TTYO\r
+       MOVEI N,0\r
+ASKNL: PUSHJ P,TTYGET\r
+       JRST    ASKNXT\r
+       CAIL CH,"0"\r
+       CAIL CH,"0"(R)\r
+       JRST ASKERR\r
+       IMUL N,R\r
+       ADDI N,-"0"(CH)\r
+       PUSHJ   P,FILPUT\r
+       JRST ASKNL\r
+ASKNXT:        PUSHJ P,FCRLF\r
+       POP     P,T1\r
+       JRST    1(T)\r
+ASKERR:        PUSHJ   P,TTYGET\r
+       JRST    ASKNE\r
+       JRST    .-2\r
+\r
+\r
+\r
+;ROUTINE TO OUTPUT CRLF IN OUTPUT FILE\r
+;CALL: PUSHJ P,FCRLF\r
+;USED TO SEPARATE QUESTION FROM PREVIOUS MACRO CALL\r
+\r
+FCRLF: MOVEI CH,15\r
+       PUSHJ P,FILPUT\r
+       MOVEI CH,12\r
+       JRST FILPUT\r
+\f      END     MONGEN\r
+\r
+\f\r
diff --git a/src/mongen.rno b/src/mongen.rno
new file mode 100644 (file)
index 0000000..fb68223
Binary files /dev/null and b/src/mongen.rno differ
diff --git a/src/mtasrx.mac b/src/mtasrx.mac
new file mode 100644 (file)
index 0000000..87e7435
--- /dev/null
@@ -0,0 +1,536 @@
+       TITLE   MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420\r
+SUBTTL T. WACHS/TH  TS  20 MAY 69\r
+       XP      VMTASR,420      ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP\r
+\r
+ENTRY MTASRX\r
+MTASRX:\r
+\r
+INTERNAL MTADSP\r
+\r
+;DISPATCH TABLE\r
+       JRST    MTAINI\r
+       JRST    HUNGTP          ;HUNG DEVICE\r
+MTADSP:        JRST    MTAREL          ;RELEASE\r
+       JRST    MTCLOS          ;CLOSE\r
+       JRST    MTOUT\r
+       JRST    MTIN\r
+       JRST    SAVCHK          ;ENTER\r
+       JRST    SAVCHK          ;LOOKUP\r
+       JRST    MTDMPO\r
+       JRST    MTDMPI\r
+       POPJ    PDP,            ;USETO\r
+       POPJ    PDP,            ;USETI\r
+       JRST    CPOPJ1          ;RENAME\r
+       POPJ    PDP,            ;CLOSE INPUT\r
+       POPJ    PDP,            ;UTPCLR\r
+       JRST    MTAP0T\r
+\r
+MTC=340\r
+MTS=344\r
+\r
+;MTACHN=FLAG CHANNEL\r
+;MTOCHN=DATA CHANNEL\r
+;MTFLAG=10*MTACHN + 400\r
+;MTBOTH=10*MTACHN+MTDCHN\r
+;MTALOC=40 + 2*MTDCHN\r
+;MTLOC1=MTALOC+1\r
+       INTERN  MTAINI,MTADDS,MTADDB\r
+       EXTERN  ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC\r
+       EXTERN  STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT\r
+       EXTERN  CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK\r
+       EXTERN  PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK\r
+\r
+COMPAT=1000                    ;IBM COMPATABLE 9-TRACK\r
+DMPMOD=20000                   ;DUMP MODE FLAG\r
+MTREW=40000                    ;MAGTAPE IS REWINDING\r
+\r
+MTTRY=3                                ;NO. OF TIMES TO RETRY ON AN ERROR\r
+QUANT=3                                ;NO. OF RECORDS TO READ UNINTERRUPTED\r
+\fTP=DAT\r
+;DDB\r
+MTADDB:        SIXBIT  /MTA0/\r
+       XWD     ^D30*HUNGST,MTSIZ+1\r
+       0\r
+       MTADSP\r
+       XWD     1023,154403\r
+       0\r
+       0\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       XP      MTADDS,.-MTADB  ;SIZE OF DDB (FOR BUILD)\r
+\f;INITIALIZE\r
+MTAINI:        SETOM   NMTREW          ;RESET FLAGS\r
+       SETOM   UNIT\r
+       SETZM   ERRFLG\r
+       SETZM   REMNDR\r
+       CONO    MTC,0           ;TURN OFF MTC\r
+       MOVE    TAC,[JSR MTDEND] ;SET UP END-CONDITION\r
+       MOVEM   TAC,MTLOC1      ;FOR BLKI/BLKO\r
+       POPJ    PDP,\r
+\r
+;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16\r
+SAVCHK:        LDB     TAC,PIOMOD      ;GET MODE\r
+       CAIN    TAC,0           ;SAVE MODE?\r
+       TRO     IOS,16          ;YES, CHANGE TO DUMP-MODE\r
+       MOVEM   IOS,DEVIOS(DEVDAT)\r
+       JRST    CPOPJ1          ;GIVE GOOD RETURN FROM LOOKUP/ENTER\r
+;CLOSE\r
+MTCLOS:        TLNN    DEVDAT,OUTPB    ;OUTPUT BEEN DONE?\r
+       POPJ    PDP,            ;NO. GO AWAY\r
+\r
+       LDB     TAC,PIOMOD\r
+       CAIGE   TAC,16          ;DUMP MODE?\r
+       PUSHJ   PDP,OUT         ;NO. EMPTY LAST PARTIAL BUFFER\r
+       PUSHJ   PDP,WSYNC       ;WAIT FOR IO TO STOP\r
+       MOVEI   UUO,3           ;WRITE 2 ENDS-OF FILE\r
+       PUSHJ   PDP,MTAP1\r
+       TRNE    IOS,IOIMPM      ;WRITE LOCK?\r
+       POPJ    PDP,            ;YES RETURN\r
+       PUSHJ   PDP,SETACT\r
+       PUSHJ   PDP,WSYNC\r
+       MOVEI   UUO,3\r
+       PUSHJ   PDP,MTAP1\r
+       PUSHJ   PDP,SETACT\r
+       PUSHJ   PDP,WSYNC\r
+       MOVEI   UUO,7           ;AND BACKSPACE OVER ONE OF THEM\r
+       JRST    MTAP1\r
+\r
+HUNGTP:        TLZN    IOS,MTREW       ;TAPE REWINDING?\r
+       JRST    THRUTP  ;NO. GIVE UP CONTROL\r
+       SOS     NMTREW  ;YES. DECREASE COUNT OF TAPES IN REW\r
+       AOS     MTREQ           ;THRUTP WILL SOS THIS BACK\r
+       JRST    THRUPT  ;TURN OFF TM10\r
+\f;CONNECT CONTROL TO A TRANSPORT\r
+CONECT:        MOVEI   TAC,440102      ;SET UP INTERRUPT CONDITIONS\r
+       HRRM    TAC,MTAINT\r
+       HRRM    DEVDAT,USEWRD   ;SAVE DEVDAT FOR INTERRUPT\r
+       LDB     TP,PUNIT        ;GET UNIT\r
+       CAMN    TP,UNIT         ;ALREADY CONNECTED TO IT?\r
+       JRST    ONECT3          ;YES\r
+       LSH     TP,17           ;NO. SET FOR CONO\r
+       CONSZ   MTS,2           ;CONTROL FREE?\r
+       JRST    ONECT2          ;YES. DO A NO-OP CONO\r
+       TRO     TP,MTFLAG       ;NO. SET CONTROL FREE ENABLE\r
+       TLNN    IOS,MTREW       ;CONNECTING TO A REWINDING TAPE?\r
+       PUSHJ   PDP,ONECT4      ;NO.CHANGE RETURN\r
+ONECT2:        HRLM    TP,USEWRD       ;MIGHT NEED ON INTERRUPT LEVEL\r
+       CONO    MTC,(TP)        ;CONO TO MTC\r
+       LSH     TP,3            ;SAVE UNIT\r
+       HLRZM   TP,UNIT\r
+ONECT3:        JUMPGE  IOS,WSYNC       ;WAIT FOR DEV TO FREE IF NOT REWINDING\r
+       TRNN    TP,4000         ;REWINDING, CONTROL FREE ENABLE?\r
+       AOS     (PDP)           ;NO. SKIP RETURN\r
+       POPJ    PDP,            ;YES. IMMEDIATE RETURN\r
+ONECT4:        MOVEI   TAC,TPREDY      ;SET DEVICE ACTIVE\r
+       HRRM    TAC,-1(PDP)     ;AGAIN WHEN INACTIVE\r
+       JRST    SETACT          ;SET DEVICE ACTIVE\r
+\r
+;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL\r
+DLYRDY:        SETOM   MTAVAL\r
+       PUSHJ   PDP,WSYNC       ;WAIT FOR IO TO STOP\r
+\r
+;GET MTC, CONNECT TAPE TO CONTROL\r
+TPREDY:        AOSE    MTREQ           ;GET CONTROL\r
+       PUSHJ   PDP,MTWAIT      ;WAIT FOR IT\r
+       MOVEI   TAC,QUANT       ;SET QUANTUM TIME\r
+       MOVEM   TAC,QUANTM\r
+TPRDY2:        MOVEM   PROG,USEPRG\r
+       PUSHJ   PDP,CONECT      ;CONECT CONTROL TO TAPE\r
+\r
+;SET TP FOR THIS TAPE\r
+TPSET: LDB     TP,[POINT 2,IOS,28] ;PARITY\r
+       SKIPN   TP              ;USE STANDARD IF 0\r
+       MOVEI   TP,STDENS       ;NOT SPECIFIED, USE STANDARD FOR SYS.\r
+       SOS     TP              ;SET TO USER'S REQUEST\r
+       LSH     TP,6\r
+       TRNN    IOS,IOPAR       ;PARITY\r
+       TRO     TP,40000        ;ODD\r
+       MOVE    TAC1,UNIT       ;UNIT\r
+       DPB     TAC1,[POINT 3,TP,20] ;INTO COMMAND\r
+       TRO     TP,MTBOTH       ;PI CHANNELS\r
+       MOVEI   TAC,MTTRY       ;SET ERROR COUNT\r
+       MOVNM   TAC,ERCNT\r
+       CONSZ   MTS,4           ;7 OR 9 TRACK?\r
+       JRST    RDYCHK          ;7 TRACK\r
+       TLNN    IOS,COMPAT      ;9 TRACK. CORE DUMP?\r
+       TROA    TP,20030        ;YES\r
+       TRO     TP,40300        ;NO. SET 800 BPI, ODD PARITY\r
+\f;MAKE SURE TAPE IS READY\r
+RDYCHK:        CONSZ   MTS,40          ;READY?\r
+       POPJ    PDP,            ;YES\r
+       CONSO   MTS,20000       ;REWINDING?\r
+       POPJ    PDP,            ;NO. LET XPORT HUNG INTERRUPT HANDLE IT\r
+       TLO     IOS,MTREW       ;YES. MUST BE REWINDING\r
+       PUSHJ   PDP,SETACT      ;DEVICE ACTIVE\r
+       AOS     NMTREW          ;BUMP COUNT OF REWINDING DRIVES\r
+       SOSL    MTREQ           ;LET SOMEONE ELSE USE TAPES\r
+       JRST    DLYRDY          ;NOONE ELSE WANTS CONTROL\r
+       PUSHJ   PDP,CLOKRQ      ;PUT IN A TIME REQUEST\r
+       JRST    DLYRDY+1                ;AND WAIT\r
+\fMTCLOK:       XWD     .+1,JIFSC2\r
+       SETZM   CLKREQ          ;INDICATE  NO CLOCK REQUEST IN NOW\r
+       SKIPL   MTREQ           ;CONTROL FREF?\r
+       POPJ    PDP,            ;NO. COME BACK LATER\r
+MTCLK2:        SETOM   NMTREW          ;COUNT NO. OF TAPES REWINDING\r
+       MOVEM   DEVDAT,SAVDEV\r
+       MOVEI   DEVDAT,MTADDR   ;START AT MTA0\r
+       AOS     MTREQ           ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW\r
+REWCHK:        MOVE    IOS,DEVIOS(DEVDAT)\r
+       JUMPGE  IOS,REWCK2      ;TAPE NOT REWINDING\r
+       PUSHJ   PDP,CONECT      ;REWINDING - CONECT TO IT\r
+       POPJ    PDP,            ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL\r
+REWCKA:        CONSO   MTS,40          ;STILL REWINDING?\r
+       JRST    REWCK1          ;YES\r
+       TLZE    IOS,IOW         ;NO, TAKE OUT OF IO WAIT\r
+       PUSHJ   PDP,SETIOD\r
+       TLZ     IOS,MTREQ\r
+       PUSHJ   PDP,CLRACT      ;NO LONGER ACTIVE\r
+       JRST    REWCK2\r
+       \r
+REWCK1:        AOS     NMTREW          ;COUNT REWINDING TAPE\r
+       MOVEI   TAC,36  \r
+       CONSZ   MTS,20000       ;IF TAPE IS STILL REWINDING\r
+       DPB     TAC,PDVCNT      ;MAKE SURE IT DOESN'T GET A HUNG DEVICE\r
+REWCK2:        HLRZ    DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE\r
+       HLRZ    TAC,DEVNAM(DEVDAT) ;A MAG TAPE?\r
+       CAIN    TAC,(SIXBIT .MTA.)\r
+       JRST    REWCHK          ;YES. CHECK IT\r
+       MOVE    DEVDAT,SAVDEV   ;PICK UP DEVDAT AGAIN\r
+       SOSL    MTREQ           ;FREE MTASER AGAIN\r
+       SETOM   MTAVAL          ;SOMEONE WAITING FOR CONTROL\r
+       SKIPGE  NMTREW          ;ANY TAPE REWINDING?\r
+       JRST    THRUT3          ;NO\r
+\r
+CLOKRQ:        MOVE    TAC,MTCLOK      ;PUT A CLOCK REQUEST IN\r
+       CONO    PI,PIOFF        ;HAVE MONITOR WAKE UP\r
+       SKIPL   CLKREQ          ;IF NO CLOCK REQUEST IN ASK TO WAKE UP\r
+       IDPB    TAC,CLOCK       ;IN HALF A SECOND\r
+       SETOM   CLKREQ          ;NOW WE HAVE ONE\r
+       CONO    PI,PION\r
+       JRST    THRUT3\r
+SAVDEV:        0                       ;TEMPORARY STORAGE FOR DEVDAT\r
+\f;MTAPE\r
+MTAP0: TRNE    UUO,100         ;SETTING 7 TRACK MODE?\r
+       JRST    SET9TK          ;YES\r
+\r
+MTAP:  TRZ     IOS,776000      ;TURN OFF ERROR BITS\r
+       MOVEM   IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
+MTAP1: PUSHJ   PDP,TPREDY      ;GET CONTROL FOR THIS TAPE\r
+MTAP3: TRZ     TP,7            ;NO DATA TRANSFER\r
+       ANDI    UUO,17          ;GET FUNCTION\r
+       ROT     UUO,-1          ;TRANSLATE FROM TABLE\r
+       SKIPL   UUO\r
+       SKIPA   TAC,MTPTBL(UUO)\r
+       HLRZ    TAC,MTPTBL(UUO)\r
+       TRZE    TAC,100         ;MOVE TAPE BACKWORD?\r
+       CONSO   MTS,100000      ;YES, TAPE AT LOAD POINT?\r
+       TRNN    TAC,-1          ;OR NO-OP?\r
+       JRST    THRUTA           ;YES, GO CHECK FOR BOT\r
+       TRZE    TAC,200         ;SKIP TO LOGICAL EOT?\r
+       JRST    LEOT            ;YES\r
+       TRZN    TAC,400 ;TRY TO WRITE TAPE?\r
+       JRST    MTAGO           ;NO.\r
+       CONSZ   MTS,10          ;YES. WRITE LOCKED?\r
+       JRST    ILLOP           ;YES. LIGHT ERROR BIT\r
+MTAGO: DPB     TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND\r
+       HRLM    TP,USEWRD       ;SAVE COMMAND\r
+       CONO    MTC,(TP)        ;START TAPE MOVING\r
+       JRST    CLRACT          ;AND RETURN\r
+\r
+;SET 9-TRACK TAPE\r
+SET9TK:        TRNE UUO,1\r
+       TLOA    IOS,COMPAT      ;SET IBM COMPAT.\r
+MTAREL:        TLZ     IOS,COMPAT      ;NOT IBM COMPAT\r
+       JRST STOIOS\r
+;SKIP TO LOGICAL EOT\r
+LEOT:  CONSZ   MTS,100000      ;TAPE AT BOT?\r
+       JRST    LEOT2           ;YES, DONT BACKSPACE\r
+       PUSHJ   PDP,MTAG0       ;BACKSPACE RECORD\r
+       PUSHJ   PDP,EOTWT       ;WAIT FOR IT\r
+LEOT2: MOVEI   UUO,16          ;SKIP A FILE\r
+       PUSHJ   PDP,MTAP2\r
+       MOVEI   UUO,6           ;SKIP A RECORD\r
+       PUSHJ   PDP,MTAP\r
+       PUSHJ   PDP,EOTWT       ;WAIT FOR IT\r
+       MOVE    IOS,DEVIOS(DEVDAT)\r
+       TRNN    IOS,IODENT      ;END OF FILE SEEN?\r
+       JRST    LEOT2           ;NO. SKIP TO NEXT FILE\r
+       MOVEI   UUO,7           ;YES. BACKSPACE RECORD\r
+\r
+MTAP2: PUSHJ   PDP,TPRDY2\r
+       JRST    MTAP3\r
+;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION\r
+EOTWT: AOSE    MTREQ\r
+       PUSHJ   PDP,MTWAIT      ;WAIT TILL MTREQ IS COUNTED DOWN\r
+       POPJ    PDP,\r
+\fMTPTBL:       XWD     101,0           ;REW,NOP\r
+       XWD     405,0           ;WRITE EOF.\r
+       XWD     0,0\r
+       XWD     107,6           ;BACKSPACE REC,SKIP REC\r
+       XWD     111,207         ;REW,UNLOAD,LOG EOT\r
+       XWD     415,0           ;WRITE BLANK TAPE,\r
+       XWD     0,0\r
+       XWD     117,16          ;BACK FILE,SKIP FILE\r
+\f;OUTPUT UUO\r
+MTOUT: PUSHJ   PDP,TPREDY      ;GET CONTROL SETUP TP\r
+       CONSZ   MTS,10          ;WRITE LOCK?\r
+       JRST    ILLOP           ;YES, SET IOIMPM AND RETURN\r
+       CONSZ   MTS,4000        ;EOT?\r
+       TROA    IOS,IOTEND+IOBKTL ;YES. LIGHT BIT\r
+       TLOA    IOS,IO          ;NO. INDICATE OUTPUT\r
+       JRST    ADVOUT          ;DONE IF EOT\r
+MTOUT1:        MOVEI   TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER\r
+       MOVN    TAC1,1(TAC)     ;-WORD COUNT\r
+       HRL     TAC,TAC1        ;IN LH OF COMMAND\r
+       AOJG    TAC,ADVOUT      ;SKIP IF 0 WORDS\r
+MTOUT2:        TRO     TP,4000         ;FUNCTION = WRITE\r
+       MOVSI   TAC1,(BLKO MTC,) ;SETUP BLKO\r
+MTDTGO:        MOVEM   TAC,PNTR        ;SAVE BLKI/BLKO POINTER\r
+       MOVEM   TAC,SVNPTR      \r
+       HRRI    TAC1,PNTR       ;BLKI/BLKO PNTR\r
+       MOVEM   TAC1,MTALOC     ;INTO INTERRUPT LOC\r
+       HRLM    TP,USEWRD       ;SAVE COMMAND\r
+\r
+       CONO    MTC,(TP)        ;START TAPE MOVING\r
+       TRO     IOS,IOACT       ;SETACT CLEARS IOW\r
+       JRST    STOIOS          ;STORE IOS AND RETURN\r
+\r
+;INPUT UUO\r
+MTIN:  PUSHJ   PDP,TPREDY      ;SETUP TP FOR THIS DRIVE\r
+       TLZ     IOS,IO          ;INPUT\r
+MTIN1: SETCM   TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT\r
+       HRRI    TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS\r
+       ADD     TAC,[XWD 2,1]   ;MAKE REAL IOWD\r
+MTIN2: TRO     TP,2000         ;FUNCTION = READ\r
+       MOVSI   TAC1,(BLKI MTC,) ;SETUP BLKI\r
+       JRST    MTDTGO          ;GO START TAPE\r
+\fMTAINT:       CONSO   MTS,440102      ;INTERRUPT FOR MAG TAPE?\r
+       JRST    .               ;NO. GO AWAY\r
+       CONSO   MTC,400         ;HAS CONTROL FREE ENABLED?\r
+       CONSZ   MTS,440100      ;NO. CONTROL FREE ERRONEOUSLY ON?\r
+       JRST    +2              ;REAL MTA INTERRUPT\r
+       JRST    MTAINT+1        ;THIS INTERRUPT NOT REALLY FOR MTA\r
+       JSR     MTASAV          ;YES. SAVE ACS\r
+       HRRZ    DEVDAT,USEWRD   ;RESET DEVDAT\r
+       MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
+       JUMPL   IOS,REWCKA      ;CNTRL FREE INTERRUPT ON A REW TAPE\r
+       MOVE    PROG,USEPRG\r
+       SKIPE   TAC,ERRFLG      ;BACKSPACE FROM ERROR?\r
+       JRST    TRYAGN          ;YES. REISSUE COMMAND\r
+       CONSZ   MTS,440000      ;ERROR?\r
+       JRST    ERROR           ;YES. ILLEGAL OP OR HUNG DEVICE\r
+       CONSZ   MTC,7           ;DATA OPERATION?\r
+       JRST    DATEND          ;YES\r
+       LDB     TP,[POINT 4,USEWRD,8] ;GET FUNCTION\r
+       CAIN    TP,6            ;SKIPPING A RECORD?\r
+       CONSO   MTS,10000       ;YES. SEEN AN EOF?\r
+       SKIPA                   ;NO.\r
+       TRO     IOS,IODEND      ;YES. TURN ON EOF BIT\r
+THRUTA:        CONSZ   MTS,300000      ;NO. BOT OR REWINDING?\r
+       TROA    IOS,IOBOT       ;YES. SET BOT BIT FOR USER TO SEE\r
+       TRZ     IOS,IOBOT       ;NO. TURN OFF BOT BIT\r
+THRUTP:        CONSZ   MTS,4000        ;NO. EOT?\r
+       TRO     IOS,IOTEND      ;YES\r
+       TLZE    IOS,IOW         ;JOB IN IO WAIT?\r
+       PUSHJ   PDP,SETIOD      ;YES. TAKE IT OUT\r
+       TLZ     IOS,DMPMOD\r
+       PUSHJ   PDP,CLRACT\r
+                                ;CONTROL FREE INTERRUPT?\r
+                                ;YES. DONT COUNT DOWN MTREQ\r
+       SOSGE   MTREQ           ;COUNT DOWN REQUEST COUNT\r
+       JRST    THRUT2          ;NOONE ELSE WAITING\r
+       SKIPL   NMTREW          ;IF THERE ARE TAPES REWINDING\r
+       SKIPE   CLKREQ          ;WHICH HAVEN'T BEEN CHECKED IN\r
+       SKIPA                   ;MORE THAN 1/2 A SECOND\r
+       JRST    MTCLK2          ;GO CHECK THEM NOW\r
+       SETOM   MTAVAL          ;SOMEONE ELSE WANTS IT\r
+       JRST    THRUT3          ;DISMISS INTERRUPT AND RETURN\r
+\f;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED\r
+THRUT2:        SKIPL   NMTREW          ;ANY DRIVES REWINDING?\r
+       JRST    MTCLK2          ;YES. CHECK IF ANY THROUGH\r
+THRUT3:        HLRZ    TP,USEWRD       ;GET UNIT\r
+       TRZ     TP,17777        ;MASK OUT FUNCTION\r
+       CONO    MTC,(TP)        ;DISMISS INTERRUPT\r
+       HLLZS   MTAINT          ;DONT LOOK AT ANY MORE INTERRUPTS\r
+       POPJ    PDP,            ;AND EXIT\r
+\r
+;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO\r
+MTDEND:        0\r
+       CONO    MTS,1           ;GIVE A FUNCTION STOP\r
+       JEN     @MTDEND         ;AND EXIT\r
+\fDATENO:       CONSZ   MTS,20600       ;RECORD OK?\r
+       JRST    RETRY           ;PARITY, DATA LATE OR BAD TAPE\r
+DATND2:        TLNE    IOS,DMPMOD      ;DUMP MODE?\r
+       JRST    CMPEND          ;YES\r
+       TLNN    IOS,IO          ;READING?\r
+       JRST    INPTND          ;YES, FINISH INPUT\r
+ADVOUT:        PUHSJ   PDP,ADVBFE      ;WRITING, ADVANCE BUFFERS\r
+                               ;END OF TAPE?\r
+       JRST    THRUTP          ;YES, DONT WRITE ANY MORE\r
+NXTREC:        TLZE    IOS,IOW         ;IN IO WAIT?\r
+       PUSHJ   PDP,GETIOD      ;RESTART JOB\r
+       SOSG    QUANTM          ;COUNT DOWN PROTECT TIME\r
+       SKIPG   MTREQ           ;ANYONE ELSE WANT CONTROL?\r
+       CONSZ   MTS,4000        ;NO. KEEP GOING UNLESS EOT\r
+       JRST    THRUTP          ;YES, GIVE UP CONTROL\r
+       MOVNI   TAC,MTTRY       ;RESET ERROR COUNT\r
+       MOVEM   TAC,ERCNT\r
+       HLRZ    TP,USEWRD       ;PICK UP COMMAND\r
+       TLNE    IOS,IO          ;AND DO NEXT RECORD\r
+       JRST    MTOUT1\r
+       HLRZ    TAC,@DEVIAD(DEVDAT)     ;PICK MAX. SIZE OF BUFFER\r
+       ADDI    TAC,@DEVIAD(DEVDAT)     ;AND IN FIRST ADDRESS\r
+       PUSHJ   PDP,IADRCK              ;CHECK IT'S O.K.\r
+       JRST    THRUTP                  ;NO - RELEASE CONTROL\r
+       JRST    MTIN1                   ;O.K. DO NEXT INPUT.\r
+\r
+;HERE WHEN THROUGH AN INPUT RECORD\r
+INPTND:        CONSZ   MTS,10000       ;EOF?\r
+       JRST    DATEOF          ;YES\r
+       MOVEI   TAC,@DEVIAD(DEVDAT) ;START OF RECORD\r
+       HRRZ    TAC1,PNTR       ;WHERE WE ARE NOW\r
+       SUBI    TAC1,1(TAC)     ;LAST LOC-FIRST LOC\r
+       HRRM    TAC1,1(TAC)     ;=WORD COUNT\r
+       PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
+       JRST    THRUTP          ;NONE FREE\r
+       JRST    NXTREC          ;CONTINUE WITH NEXT RECORD\r
+\r
+; HERE AT THE END OF A DUMP MODE RECORD\r
+DMPEND:        HLRZ    TP,USEWRD       ;SET UP COMMAND AGAIN\r
+       CONSO   MTS,14000       ;EOF OR EOT?\r
+       JRST    DMPBLK          ;NO,GET NEXT COMMAND\r
+       CONSO   MTS,4000        ;EOF?\r
+       TRO     IOS,IODEND      ;YES,SET EOF BIT\r
+       JRST    THRUTP          ;AND RETURN TO USER\r
+\fMTDMPO:       TLOA    IOS,IO          ;DUMP OUTPUT\r
+MTDMPI:        TLZ     IOS,IO          ;DUMP INPUT\r
+       HRLI    UUO,PROG\r
+       PUSHJ   PDP,COMCHK      ;CHECK VALIDIT OF LIST\r
+       JRST    ADRERR          ;NOT VALID\r
+       PUSH    PDP,IOS         ;WSYNC WILL CLOBBER IOS\r
+       PUSHJ   PDP,TPREDY      ;GET CONTROL, SETUP TP\r
+       POP     PDP,IOS\r
+       TLNE    IOS,IO          ;CHECK WRITE LOCK\r
+       CONSO   MTS,4010        ;AND EOT IF WRITING\r
+       JRST    MTDMP2\r
+       CONSO   MTS,4000        ;ERROR\r
+       TROA    IOS,IOIMPM      ;WRITE LOCK\r
+       TRO     IOS,IOTEND+IOBKTL  ;EOT\r
+       JRST    THRUTP          ;GIVE UP TAPE AND RETURN\r
+MTDMP2:        TLO     IOS,DMPMOD      ;INDICATE DUMP-MODE\r
+       SOS     UUO             ;WILL COUNT IT UP LATER\r
+       MOVEM   UUO,LSTLOC      ;SAVE LOC OF LIST\r
+DMPBLK:        PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
+\r
+       ADDI    TAC,(PROG)      ;ADD RELOCATION FACTOR\r
+       TLNE    IOS,IO          ;WRITING?\r
+       JRST    MTOUT2          ;YES. GO WRITE RECORD\r
+       TRMN    IOS,1\r
+       TRO     TP,10000        ;OR - READ ACROSS RECORD BOUNDARIES\r
+       JRST    MTIN2           ;GO READ RECORD(S)\r
+\r
+NXTCOM:        SKIPE   TAC,REMNDR      ;PARTIAL IOWD LEFT TO DO?\r
+       JRST    NXTCM3          ;YES, CONTINUE WITH IT\r
+       AOSA    TAC,LSTLOC      ;GET NEXT COMMAND LOC\r
+       HRRM    TAC,LSTLOC\r
+       MOVE    TAC,@TAC        ;PICK UP COMMAND\r
+       JUMPL   TAC,NXTCM2      ;REAL COMMAND\r
+       JUMPG   TAC,NXTCOM+1    ;GO-TO-WORD\r
+       POP     PDP,TAC         ;0 - THROUGH\r
+       JRST    THRUTP\r
+\r
+       EXTERN  MMTSIZ          ;-MTSIZ\r
+NXTCM2:        TLNE    IOS,IO          ;WRITING?\r
+       TRNE    IOS,1           ;YES, MODE 16?\r
+       POPJ    PDP,            ;NO. USE IOWD AS OBTAINED\r
+NXTCM3:        HLRE    TAC1,TAC        ;YES. GET WORDCOUNT\r
+       SETZM   REMNDR\r
+       CAML    TAC1,MTSZ       ;RECORD TOO LARGE?\r
+       POPJ    PDP,            ;NO, GO WRITE\r
+       ADD     TAC,[XWD MTSIZ,MTSIZ] ;YES.\r
+       MOVEM   TAC,REMNDR      ;IOWD TO USE FOR NEXT RECORD\r
+       SUBI    TAC,MTSIZE      ;ADDRESS FOR THIS IOWD\r
+       HRLI    TAC,MMTSIZ      ;WRITE -MTSIZE WORD RECORDS\r
+       POPJ    PDP,            ;RETURN THE IOWD\r
+REMNDR:        0\r
+MTSZ:  XWD -1,MMTSIZ           ;NEG. OF RECORD SIZE IN WORDS\r
+\fMTHUNG:       PUSHJ   PDP,THRUT3      ;TURN OFF ERROR PI BIT\r
+       PUSHJ   PDP,SETACT      ;TURN ON IOACT\r
+       MOVEI   TAC,1           ;SET HUNG-TIME TO 1 MORE TICK\r
+       DPB     TAC,PDVCNT      ;SET HUNG TIME\r
+       POPJ    PDP,            ;AND EXIT\r
+\r
+\r
+ERROR: CONSZ   MTS,400000      ;HUNG DEVICE?\r
+       JRST    MTHUNG          ;YES\r
+\r
+;ILLEGAL OP INTERRUPT\r
+       TRNN    IOS,IOACT       ;DATA OPERATION?\r
+       JRST    ILLOP           ;NO. LIGHT ERROR BIT, GIVE UP CONTROL\r
+       TRO     IOS,IOIMPM      ;YES. LIGHT IOIMPM\r
+       MOVEM   IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE\r
+       JRST    THRUT2          ;COUNT DOWN MTRWQ ON HUNG CALL\r
+\r
+ILLOP: TROA    IOS,IOIMPM\r
+DATEOF:        TLO     IOS,IOEND       ;EOF - LIGHT BIT\r
+       JRST    THRUTP          ;AND GIVE UP CONTROL\r
+\r
+;TRY AGAIN ON PARITY ERROR OR BAD TAPE\r
+RETRY: TRNN    IOS,ONRCK       ;WANT TO STOP ON ERROR?\r
+       AOSL    TAC,ERCNT       ;OR TRIED ENOUGH?\r
+       JRST    PERMER          ;YES. PERMANENT ERROR\r
+RETRY1:        MOVEI   TAC,2           ;SET RETRY SWITCH\r
+       MOVEM   TAC,ERRFLG\r
+RETRY2:        HLRZ    TP,USEWRD       ;PICK UP COMMAND\r
+       ANDI    TP,760770       ;SET FOR BACKSPACE\r
+       CONO    MTC,7000(TP)    ;BACKSPACE RECORD\r
+       POPJ    PDP,            ;AND GO AWAY\r
+\r
+;COME HERE AFTER BACKSPACE IS THROUGH\r
+TRYAGN:        SOJLE   TAC,TRYSKP      ;GO IF NOT 2ND BACKSPACE\r
+       CONSO   MTS,100000      ;BOT?\r
+       JRST    RETRY2-1        ;NO. BACKSPACE AGAIN\r
+TRYNXT:                                ;READ RECORD AGAIN\r
+       MOVE    TAC,SVPNTR      ;RESET POINTER\r
+       MOVEM   TAC,PNTR\r
+       HRLZ    TP,USEWRD       ;GET COMMMAND\r
+       CONO    MTC,(TP)        ;EXECUTE IT AGAIN\r
+       SETZM   ERRFLG\r
+       POPJ    PDP,            ;AND GO AWAY\r
+\r
+;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR\r
+TRYSKP:        JUMPL   TAC,TRYNXT      ;AFTER FORWARD SKIP IF NEGATIVE\r
+       HLRZ    TP,USEWRD       ;AFTER 2ND BACKSPACE - SKIPA RECORD\r
+       ANDI    TP,760770\r
+       CONO    MTC,6000(TP)    ;SKIP A RECORD\r
+       SETOM   ERRFLG          ;INDICATE FORWARD SKIP\r
+       POPJ    PDP,            ;AND GO AWAY\r
+\fPERMER:       TLNE    IOS,IO          ;READING?\r
+       TRNE    IOS,IONRCK      ;NO RECOVERY WANTED?\r
+       JRST    SETIOS          ;REALLY PERMANENT\r
+       CAILE   TAC,100         ;TRIED TO REWRITE 100 TIMES\r
+       JRST    SETIOS          ;YES. REALLY PERMANENT\r
+       JUMPG   TAC,RETRY2      ;TRY WRITING WITH 3 INCHES OF\r
+       MOVSI   TAC,10000       ;BLANK TAPE TO ERASE BAD SPOT\r
+       ORM     TAC,USEWRD      ;SET COMMAND TO 14 (FROM 4)\r
+       JRST    RETRY1          ;AND TRY AGAIN\r
+\r
+SETIOS:        CONSZ   MTS,400         ;DATA MISSED OR BAD TAPE?\r
+       TRO     IOS,IODERR      ;YES\r
+       CONSZ   MTS,20200       ;PARITY ERROR?\r
+       TRO     IOS,IODTER      ;YES\r
+       JRST    DATND2          ;SAVE ERROR WORD AND GO AWAY\r
+NMTREW:        0\r
+USEWRD:        0\r
+USEPRG:        0\r
+CLKREQ:        0\r
+       \r
+UNIT:  0\r
+ERCNT: 0\r
+ERRFLG:        0\r
+QUANTM:        0\r
+LSTLOC:        0\r
+PNTR:  0\r
+SVPNTR:        0\r
+MTAEND:        END\r
+\f\r
diff --git a/src/mtcsr6.mac b/src/mtcsr6.mac
new file mode 100644 (file)
index 0000000..215a429
--- /dev/null
@@ -0,0 +1,654 @@
+TITLE  MTCSR6 - MAGNETIC TAPE ROUTINES FOR 516 CONTROL\r
+SUBTTL C.WHITE 27-APR-69 V406\r
+       XP      VMTCSR,406      ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP\r
+\r
+ENTRY MTCSR6\r
+MTCSR6:\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL MTCDDB,MTCDDS,MTECNT,MTRKCN\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+INTERNAL MTCDDB,MTCDSP\r
+\r
+;MTC  DEVICE DATA BLOCK\r
+;REMAINING MTA DDB'S  (IF ANY) ARE\r
+;GENERATED OUT OF LINE AT BUILD TIME\r
+       ZZ=.\r
+MTCDDB:        SIXBIT  /MTA0/\r
+       XWD     2*HUNGST,MTSIZ+1\r
+       0\r
+       EXP     MTCDSP\r
+       XWD     DVMTA+DVIN+DVOUT+DVLNG,154407\r
+       0\r
+       0\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       XP      MTECNT,.-ZZ\r
+       0                               ;CUMMULATIVE ERROR COUNT FOR THIS UNIT\r
+                                       ;BITS 0-8=LONG, PARITY ERROR COUNT\r
+                                       ;BITS 9-17=LAT, PARITY ERROR COUNT\r
+                                       ;BITS 18-26=ILL. OP. COUNT\r
+                                       ;BITS 27-35=DATA MISSED COUNT\r
+       XP      MTBKCN,.-ZZ\r
+       0                               ;CUMMULATIVE RECORD COUNTER FOR THIS UNIT\r
+       XP      MTCDDS,.-ZZ             ;SIUZE OF MTC DDB\r
+\r
+>\r
+\f      T=ITEM\r
+;MAKE TAPE SERVICE SUBROUTINES\r
+\r
+       JRST MTCINI             ;INITIALIZATION\r
+       JRST MTHUNG             ;MTA HUNG TIMEOUT. RELEASE DATA CONTROL.\r
+                               ;MAGTAPE CONTROL. PRINT ERROR AND STOP JOB.\r
+MTCDSP:        POPJ PDP,               ;RELEASE\r
+       JRST MTCLSO             ;CLOSE OUTPUT\r
+       JRST MTOUT              ;OUTPUT\r
+       JRST MTIN               ;INTPUT\r
+       JRST CPOPJ1             ;ENTER IN DIRECTORY\r
+       JRST CPOPJ1             ;LOOKUP IN DIRECTORY\r
+       JRST MTDMPO             ;DUMP OUTPUT\r
+       JRST MTDMPI             ;DUMP INPUT\r
+       POPJ PDP,               ;SETO\r
+       POPJ PDP,               ;SETO\r
+       POPJ PDP,               ;GETF\r
+       JRST CPOPJ1             ;RENAME\r
+       POPJ PDP,               ;CLOSE INPUT\r
+       POPJ PDP,               ;UTPCLR\r
+                               ;MTAPE UUO (FALL INTO THIS CODE WHICH FOLLOWS)\r
+\r
+DEFINE MTAPE (A)       ;MARCO TO DEFINE LEGAL MTAPE UUO EFFECTIVE ADDRESSES.\r
+<      CODES=0\r
+       IRP     A, <\r
+       CODES=CODES!<1B<^D35-^0'A>>>>\r
+\r
+       MTAPES  <0,1,11,7,17,3,6,13,16,10>      ;DEFINE WHICH CODES ARE LEGAL\r
+\r
+       MOVEI   T,1             ;CHECK FOR LEGAL MTAPE UUO\r
+       LSH     T,(UUO)         ;SHIFT BIT ACCORDING TO THE USER'S UUO\r
+       TRNN    T,CODES         ;DID HE SPECIFY A LEGAL CODE ?\r
+       JRST    UUOERR          ;NO--TYPE MONITOR ERROR MESSAGE.\r
+       SOJE    T,MTP0          ;CHECK FOR MTAPE 0 (SPECIAL SYNC WAIT NO-OP)\r
+\r
+       PUSHJ PDP,MTCHK2\r
+       TRZ IOS,776000          ;CLEAR ERROR BITS ,IOF.\r
+                               ;IOACT, IOBOT AND IOTEND.\r
+       SKIPA T,UUO             ;CALL MTAPE2\r
+\fMTAPE:        PUSHJ PDP,MTCHK2        ;CHECK IF MAG TAPE CONTROL AVAIL.\r
+MTAPE2:        TDZ IOS,[XWD IODT!IOSEOF,IOACT]\r
+       TRNN T,SLICE            ;SET SLICE LEVEL THIS UUO?\r
+       JRST NOSFT              ;NO\r
+       TLZ IOS,IOSLIC          ;YES, CLEAR LEVEL\r
+       TRNE T,SLEVEL           ;SET TO 1?\r
+       TLO IOS,IOSLIC          ;YES\r
+NOSET:\r
+       LSH T,^D8               ;MOVE TO FUNCTION\r
+       ANDI T,7400             ;MODE BITS\r
+       CAIN T,4000             ;LOGICAL EOT?\r
+       JRST MTLEOT\r
+       CAIE T,1400             ;WRITE EOF\r
+       CAIN T,5400             ;OR WRITE BLANK TAPE?\r
+       JRST CHKLOC             ;YES, CHECK WRITE-LOCK\r
+       CONSO 224,4000          ;AT LOAD POINT?\r
+       JRST MTGO0              ;NO\r
+       CAIE T,3400             ;YES, BACKSPACE RECORD?\r
+\r
+       CAIN T,400              ;NO, REW?\r
+       JRST MTFIN              ;YES\r
+       CAIN T,7400             ;NO, BACKSPACE FILE?\r
+       JRST MTFIN              ;YES\r
+MTGO0: MOVSI TAC,TCF           ;LOOK FOR TAPE CONTROL FREE ONLY\r
+\f;HERE FROM INPUT AND OUTPUT UUOS AND INTERRUPT TO DO NEXT RECORD.\r
+\r
+MTGO1: LDB TAC1,PUNIT          ;UNIT\r
+       DPB TAC1,[POINT 3,T,31] ;UNIT\r
+       LDB TAC1, [POINT 3, IOS,28]     ;DENSITY PARITY\r
+       TRNN TAC1,7             ;NO DENSITY OR PARITY SPECIFIED?\r
+       IORI TAC1,STDENS                ;YES, USE STANDARD\r
+       XORI TAC1, 5            ;ODD, 556\r
+       DPB TAC1,[POINT 3,T,23]\r
+       HRRI TAC,MTCCHN(T)      ;CHANNEL\r
+       TRO TAC,200             ;INHIBIT RETURN TO POOL\r
+       TLNE IOS,IOSLIC         ;SLICE LEVEL A 1?\r
+       TRO TAC,100000          ;YES, SET COMMAND.\r
+       HRRM DEVDAT,MTDEV       ;COMMAND, DVDB\r
+       HRLM TAC,MTDEV\r
+MTGO3: MOVEI TAC1,MTPOUN\r
+       HRRM TAC1,MTIDSP\r
+       SETZM MTEOFF            ;CLEAR EOF FLAG\r
+       TLNN IOS,IODT           ;IS THIS A DATA TRANSFER OPERATION\r
+                               ;REQUIRING DATA CONTROL\r
+       JRST MTGO2              ;NO, MUST BE SPACING OPERATION\r
+       CONO DC,@MDCSAV         ;YES, ATTACH DC TO MAGTAPE\r
+       CONO PI,DCON            ;TURN DC PI CHANNEL ON\r
+MTGO2: SETZM MISSED            ;CLEAR DATA MISSED FLAG\r
+       STARTDV MTC\r
+       HLRZS TAC\r
+       CONO 224,(TAC)          ;ENABLE FOR TCF OR ERF\r
+       JRST STOIOS             ;STORE HUNG COUNT, EXIT\r
+\r
+;READ\r
+MTIN:  PUSHJ PDP,MTCHECK       ;IS SYSTEM AVAILABLE?>\r
+       TLZ IOS,IO              ;READING.\r
+MTIN1: SETCM TAC,@DEVIAD(DEVDAT)       ;-SIZE-1\r
+       HRRI TAC,@DEVIAD(DEVDAT)        ;BUFFER ADDRESS,PROG INCLUDED\r
+       ADD TAC,[XWD 2,1]       ;-SIZE+1,BUFFER+1\r
+       MOVEI T,2400    ;READ\r
+MTIN2: MOVE TAC1,[BLKI DC,4000+MTDC*10]\r
+       JRST MTINDC\r
+\f;IS SYSTEM AVAILABLE\r
+MTCHEK:        PUSHJ PDP,GETDCMT       ;GET DATA AND MAG TAPE CONTROLS\r
+       AOSE MTREQ              ;ARGUMENT\r
+       MOVE IOS,DEVIOS(DEVDAT)\r
+       TLO IOS,IODT            ;FLAG DATA TRANSFER\r
+       XCT @(PDP)\r
+       PUSHJ PDP,MTCHK4        ;WAIT FOR REWIND\r
+       JRST MTCHEK             ;GET DC & MT AGAIN\r
+\r
+MTCHK2:        AOSE MTREQ\r
+       PUSHJ PDP,MTWAIT\r
+       MOVE IOS,DEVIOS(DEVDAT)\r
+       TLZ IOS,IO              ;CLEAR IUO INDICATION SO "REWCK" WILL WORK\r
+       PUSHJ PDP,MTCHK4        ;CHECK STATUS\r
+       JRST MTCHK2             ;GET MT AGAIN\r
+\r
+MTCHK4:        TLO IOS,HASMT           ;THIS JOB NOW HAS MTC\r
+       TLZE IOS,IOBEG          ;FIRST OPERATION AFTER INIT OR SETSTS\r
+\r
+       TLZ IOS,IUOSLIC         ;YES, SET SLICE LEVEL TO 0.\r
+       TLZ IOS,IOREW           ;CLEAR MAG TAPE REWINDING\r
+       PUSHJ PDP,REWCK         ;CHECK IF REWINDING?\r
+       JRST TPOPJ              ;NO - STATUS OK\r
+       JRST QSTAT              ;QUERY STATUS\r
+       PUSHJ PDP,DETMDC        ;REWINDING- DETACH MTC, DC AND TURN OFF\r
+                               ;IODT AND HASMT\r
+       TLO IOS,IOREW           ;SET DEVICE ACTIVE AND IN REWIND WAIT\r
+       PUSHJ PDP,ORACT\r
+       AOSG MTREWN             ;ADD 1 TO REWIND WAIT COUNT\r
+       PUSHJ PDP,MTCLK         ;PUT IN CLOCK REQUEST.\r
+                               ;(NO OTHER UNITS IN REWIND WAIT)\r
+\r
+       JRST WSYNC\r
+\r
+QSTAT: PUSHJ PDP,DETMDC        ;DETACH MTC AND DC\r
+       JRST HNGSTP             ;CHECK STATUS (PULL FINGERS OUT, ETC)\r
+\f;MTAPE 0 WAITS UNTIL THE CONTROL IS FREE\r
+;THUS MTAPE 0 PROVIDES THE ONLY WAY FOR A USER TO WAIT UNTIL A SPACING OPERATION\r
+; (I.E., SKIP, BACKSPACE, OR REWIND) IS COMPLETED.\r
+\r
+MTP0:  PUSHJ   PDP,MTCHK2      ;WAIT FOR CONTROL TO BECOME FREE,\r
+                               ; THEN GIVE IT BACK IMMEDIATELY,\r
+                               ; AND RETURN TO THE USER.\r
+\r
+\r
+;DETMDC-\r
+;      DETACH MTC, AND TURN OFF HASMT.\r
+;      THEN (IFF IODT ON)\r
+;      TURN OFF IODT AND DETACH DC\r
+\r
+DETMDC:\r
+MTHUNG:\r
+       TLZN IOS,HASMT          ;THIS JOB HAS MTC?\r
+       JRST STOIOS             ;NO\r
+       PUSHJ PDP,RELCON\r
+       SOSL MTREQ              ;YES- ANYONE ELSE WAITING FOR IT?\r
+       SETOM MTAVAL            ;YES- FLAG AS JUST BECOME AVAILABLE\r
+DETDC: TLZN IOS,IODT           ;DOES JOB HAVE DATA CONTROL?\r
+       JRST STOIOS             ;NO- EXIT\r
+       CONO DC,0\r
+       CONO PD,DCOFF\r
+       SOSL DCREQ              ;ANYONE ELSE WAITING FOR IT?\r
+       SETOM DCAVAL            ;YES- FLAG AS JUST BECOME AVAILABLE\r
+       JRST STOIOS             ;AND EXIT\r
+\r
+RELCON:        CONO 220,0\r
+       CONO 224,0\r
+       SETZM MTCCON\r
+       POPJ PDP,\r
+\f;ROUTINE TO SEE IF UNIT IS REWINDING\r
+;CALL  MOVE DEVDAT,ADDRESS OF DDB\r
+;      PUSHJ PDP,REWCK\r
+;      UNIT READY\r
+;      UNIT OFF OR WRITE LOCKED\r
+;      UNIT REWINDING\r
+\r
+REWCK: LDB TAC,PUNIT\r
+       ROT TAC,4\r
+       CONO MTC,200(TAC)\r
+       CONO MTS1,SEL           ;JAM UNIT INTO COMMAND BUFFER\r
+       CONSZ MTS1,20000        ;SKIP IF REWIND MOTION OFF\r
+       JRST CPOPJ2             ;RETURN TO CALL+2 IF TAPE REWINDING\r
+       TLNE IOS,IO             ;OUTPUT ?\r
+       CONSO MTS1,200          ;YES-WRITE LOCKED ?\r
+       CONSO MTS1,2            ;NO-IS UNIT READY?\r
+       AOS (PDP)\r
+       POPJ PDP,               ;YES- RETURN TO CALL+1\r
+\r
+REPEAT 0,<\r
+THIS WORKS WITH THE FOLLOWING MOD TO 545 TRANSPORT:\r
+\r
+DELETE 1023K TO ??\r
+\r
+ADD    1B18H TO 1B08K          REW(1)(GND)\r
+       1B19S TO 1B08L          FWD/LP(1)(GND)\r
+       1B08N TO 1B23K          (REW(1).OR.FWD/LP(1))\r
+\r
+THIS MODE SETS IOP22(1) WHILE MAGTAPE IS REWINDING OR SPACING FORWARD\r
+TO LOAD POINT- IF ENABLES THE PROCESSOR TO DISTINGUISH BETWEEN A\r
+TAPE WHICH IS AT THE END OF A REWIND COMMAND, AND A TAPE WHICH IS\r
+SWITCHED TO LOCAL, OR OFF>\r
+\f;WRITE\r
+MTOUT: PUSHJ PDP,MTCHEK\r
+       TLO IOS,IO              ;WRITING\r
+MTOUT1:        MOVEI TAC,@DEVOAD(DEVDAT)       ;BUFFER ADDRESS, PROG INCLUDED\r
+       MOVN TAC1,1(TAC)        ;-WD COUNT\r
+       HRL TAC,TAC1            ;-WD CMT,BUFFER\r
+       AOJG TAC,MTNOTI         ;BUFFER+1, TEST FOR ZERO WORD COUNT\r
+MTOUT2:        MOVE TAC1,[BLKO DC,3400+MTDC*10]\r
+       MOVEI T,1000            ;WRITE\r
+MTINDC:        MOVEM TAC,MTDCCN        ;BLKO POINTER\r
+       IORI TAC1,DCTCHN                ;DC PI CHANNEL NO.\r
+       MOVEM TAC,DCWRD\r
+       HRRZM TAC1, MDCSAV      ;SAVE DC COMMAND\r
+       HRRI TAC1,DCWRD\r
+       CONO PI,DCOFF           ;TURN DC PI CHANNEL OFF\r
+       MOVEM TAC1,DCLOC        ;BLK COMMAND\r
+       MOVE TAC1,JSR MTDCND]\r
+       MOVEM TAC1,DCLOC1\r
+       TRO IOS,IOACT           ;SET IOACT\r
+       MOVSI TAC, ERF          ;ENABLE FOR EOR IF EOR FLAG NOT ON.\r
+       CONSZ 224,ERF           ;END OF RECORD?\r
+       MOVSI TAC,XNC           ;NO. COME BACK WHEN COMMAND BUFFER IS EMPTY\r
+       JRST MTGO1\r
+\r
+CHKLOK:        CONSO 224,200           ;WRITE LOCKED?\r
+       JRST MTGO0              ;NO, DO MTAPE\r
+       PUSHJ PDP,QSTAT\r
+       JRST CHKLOK\r
+\f;CLOSE OUTPUT\r
+\r
+MTCLSO:        TLNN DEVDAT,OUTPB       ;HAS ANB OUTPUT BEEN DONE?\r
+       POPJ PDP,               ;NO. DON'T WRITE ON TAPE.\r
+       LDB TAC,PIOMOD          ;DUMP MODE?\r
+       CAIGE TAC,16\r
+       PUSHJ PDP,OUT           ;NO. OUTPUT LAST PARIAL BUFFER\r
+       PUSHJ PDP,WAIT1         ;WAIT FOR OUTPUT TO FINISH\r
+MWLEOT:        MOVEI T,3               ;WRITE EOF\r
+       PUSHJ PDP, MTAPE\r
+       MOVEI T,3               ;WRITE EOF\r
+       PUSHJ PDP, MTAPE\r
+       MOVEI T,7               ;BSP\r
+       JRST MTAPE\r
+\r
+MTCINI:        PUSHJ PDP,RELCON\r
+       SETOM MRTEWN            ;SET CLOCK REQUEST COUNT TO -1\r
+       JRST MTNIO1\r
+\r
+\r
+;BLK COUNTED OUT\r
+IFE FTCHECK+FTMONP,<\r
+MTDCND:        0\r
+>\r
+MTDCN1:        CONO PI,DCOFF           ;SHUT OFF DC CHANNEL\r
+       CONSZ DC,10000\r
+       SETOM MISSED\r
+       JEN @MTDCND\r
+\f;FLAG FROM TAPE CONTROL. SET UP BY INSERT MACRO\r
+MTCINT:        CONSO 224,@MTCCON\r
+       JRST .\r
+       JSR MTCSAV              ;SAVE AC'S\r
+       HRRZ DEVDAT,MTDEV       ;DVDB\r
+       LDB PROG,PJOBM;         JOB NUMBER\r
+       MOVE PROG,JBTADR(PROG)\r
+       MOVE IOS, DEVIOS(DEVDAT)\r
+       CONSO 224,TCF           ;TAPE CONTROL FREE\r
+       JRST MTEOR\r
+       XCT MTIDSP\r
+       JRST MTBSP              ;AFTER BACKSPACE\r
+       JRST MTERR              ;IF ERROR FOUND\r
+MTPDUN:        TLNN IOS,IODT\r
+       JRST MTNIO2\r
+       LDB TAC,PIOMOD\r
+       CAIL TAC,16\r
+       JRST DMPDUN             ;DUMP\r
+       TLNE IOS,IO\r
+       JRST MTNOTI             ;WRITING\r
+       SKIPF MTEOFF            ;NOT EOF?\r
+       JRST MTEOF\r
+       MOVEI TAC,@DEVIAD(DEVDAT)       ;BUFFER ADDRESS\r
+       MOVN TAC1,MTDCCN        ;WD CNT-1\r
+       AOBJ TAC1, .+1          ;WD CNT\r
+       HLLZS TAC1              ;CLR RT HALF\r
+       ADD TAC1,DCWRD          ;ADD CURRENT COUNT=NO, OF WDS\r
+       HLRM TAC1,1(TAC)        ;STORE AT WORD COUNT\r
+       PUSHJ PDP,ADVBFF\r
+       JRST MTEND1             ;NEXT BUFFER FULL\r
+       JRST MTCON              ;CONTINUE MODE\r
+\r
+DMPDUN:        TLNN IOS,IO\r
+       SKIPN MTEOFF\r
+       JRST MTEOF+1\r
+       TROA IOS,IODEND\r
+\r
+MTEOF: TLO IOS,IOEND\r
+       SETZM MTEOFF            ;CLEAR EOF FLAG\r
+\r
+;AND FALL INTO MTEND1\r
+\fMTEND1:       PUSHJ PDP,DETDO         ;DETACH DC (IF ASSIGNED)\r
+       PUSHJ PDP,ETCHK         ;CHECK FOR END OF TAPE (FOR DUMP MODE OUT)\r
+       PUSHJ PDP,CLRACT\r
+       CONSO 224,TCF           ;TAPE CONTROL FREE?\r
+       JRST MTION              ;NO. WAIT FOR IT.\r
+MTFIN:\r
+MTNIO: TLZE IOS,IOW            ;CLEAR WAIT\r
+       PUSHJ PDP,SETIOD\r
+       PUSHJ PDP,DETMOC        ;DETACH MTC (IF HASMT SET) AND DC (IF IODT)\r
+       PUSHJ PDP,ETCHK         ;CHECK FOR END OF TAPE\r
+       PUSHJ PDP,CLRACT        ;RESTORE BITS,CLEAR IOACT\r
+\r
+;AND FALL INTO MTNIO1\r
+\fMTIO1:        MOVN TAC,MTREDO         ;REPEAT COUNTER\r
+       HRREM TAC,MTERCN\r
+       SKIPGE MTREWN           ;IS ANY OTHER UNIT REWINDING AND\r
+                               ;A SECOND COMMAND HELD UP?\r
+       POPJ PDP,               ;NO, DISMISS INTERRUPT\r
+\r
+;SOME UNIT IS REWINDING AND HAS HAD ANOTHER COMMAND HELD UP.\r
+;CHECK ALL UNITS\r
+\r
+EXTERNAL SETIOD\r
+\r
+MTREWW:        SETOM MTREWN            ;SET COUNT TO NO. UNITS IN REW WAIT\r
+       PUSH PDP,DEVDAT\r
+       MOVEI DEVDAT,MTCDDB     ;GET BEGINNING OF MT DATA BLOCK CHAIN\r
+\r
+REWLP: MOVE IOS,DEVIOS(DEVDAT)\r
+       JUMPGE IOS,REW2         ;IS UNIT IN A REW WAIT?\r
+       PUSHJ PDP,REWCK         ;YES,SEE IF FINISHED REW.\r
+       JRST .+3                ;HAS FINISHED\r
+       JRST REW1               ;OFF- LET HUNG LOGICA TAKE CARE OF IT\r
+       JRST REW2               ;STILL REWINDING\r
+       TDZ IOS,[XWD IOREW,IOACT];GET JOB OUT OF IO WAIT\r
+       TLZE IOS,IOW\r
+       PUSHJ PDP,SETIOD        ;START JOB UP AGAIN\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       JRST REW2\r
+\r
+REW0:  PUSHJ   PDP,STOIOS      ;RESET HUNG COUNT IF STILL REWINDING\r
+REW1:  AOS MTREWN              ;INCREMENT COUNT OF REW WAIT UNITS\r
+REW2:  HLRZ DEVDAT,DEVSER(DEVDAT)              ;DEVDAT TO NEXT DDB\r
+       JUMPE DEVDAT,REW3               ;LAST ONE?\r
+       HRLZ DAT,DEVNAM(DEVDAT)         ;NO,GET LH OF NAME\r
+       CAIN DAT,(SIZBIT /MTA/)         ;STILL A MAGTAPE?\r
+       JRST REWLP              ;YES, CONTINUE\r
+REW3:  POP PDP,DEVDAT\r
+       POPJ PDP,               ;YES, DISMISS INTERRUPT OF RETURN TO MTC OK\r
+\r
+ETCHK: CONSZ MTS1,10000        ;EOT SEEN?\r
+       TRO IOS,IOIMPM+IOTEND   ;YES-SET FLAGS\r
+       TDZ IOS,[XWD IOREW,IOBOT];NO LONGER REWINDING\r
+       CONSZ MTS1,24002        ;UNLESSS\r
+       TRO IOS,IOBOT           ;IS REALLY REWINDING\r
+       POPJ PDP,               ;EXIT\r
+\f;ROUTINE CALLED AT CLOCK LEVEL TO SEE IF ANY UNITS WHICH ARE IN A\r
+;REW WAIT HAVE FINISHED REWIND.\r
+\r
+INTERNAL MTCLOK\r
+\r
+MTCLOK:        SKIPGE MTREQ            ;IS ANY JOB USING ANY UNIT NOW?\r
+       PUSHJ PDP,MTREWW        ;NO, CHECK ALL MAG TAPE\r
+                               ;UNITS TO SEE IF JUST FINISHED\r
+                               ;REWINDING(WHICH WERE IN REW WAIT)\r
+       SKIPGE MTREWN           ;YES,ARE ANY UNITS STILL IN REW WAIT?\r
+       POPJ PDP,               ;NO, RETURN TO CLOCK ROUTINE WITHOUT\r
+                               ;PUTTING IN CLOCK REQUEST\r
+\r
+;ROUTINE TO PUT IN A CLOCK REQUEST\r
+\r
+EXTERNAL JIFSC2\r
+\r
+MTCLK: MOVEI TAC1,JIFSC2       ;CHECK EVERY HALF SECOND\r
+       HRLI TAC1,MTCLOK        ;DISPATCH ADDRESS\r
+       \r
+\r
+       CONO PI,400             ;TURN OFF PI\r
+       IDPB TAC1,CLOCK         ;STORE CLOCK REQUEST\r
+       CONO PI,200             ;TURN ON PI\r
+       POPJ PDP,\r
+\fMTNOTI:       PUSHJ PDP,ADVBFE                ;WRITING\r
+       JRST MTEND1\r
+MTCON: CONSZ 224,10000         ;END OF TAPE?\r
+       JRST MTEND1             ;YES - B/SP , EOF & EXIT\r
+       CONO DC,0\r
+       TLZE IOS,IOW\r
+       PUSHJ PDP,SETIOD\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       MOVN TAC,MTREDO\r
+       HRREM TAC,MTERCN\r
+       TLNN IOS,IO             ;INPUT OR OUTPUT?\r
+       JRST MTIN1              ;CALL INPUT SUBROUTINE\r
+       JRST MTOUT1             ;CALL OUTPUT SUBROUTINE\r
+MTNIO2:        HLRZ TAC,MTDEV          ;COMMAND\r
+       ANDI TAC,7400\r
+       CAIE TAC,3000           ;NO. SPACING ONE RECORD?\r
+       JRST MTNIO              ;YES, EXIT\r
+       CONSZ 224, 400          ;EOF?\r
+       TDO IOS,[XWD IOSEOF,IODEND]\r
+       JRST MTNIO              ;EXIT\r
+\fMTEOR:        MOVEI TAC,ERF\r
+       CONSO 224,ERF           ;END OF RECORD FLAG ON?\r
+       JRST MTIGN1             ;NO. WAIT FOR IT.\r
+       CONSZ DC,1000           ;DATA MISSED\r
+       SETOM MISSED            ;YES\r
+       CONSO DC,1600000        ;ANY CHARS. LEFT?\r
+       JRST MTEOR1             ;NO\r
+       MOVE T,DCWRD            ;GET IOWD\r
+       TLNN IOS,IO             ;O/P\r
+       SKIPE MISSED            ;NO, DATA MISSED\r
+       JRST MTEOR2             ;YES\r
+       CONI DC,TAC1            ;FETCH DC STATUS BITS\r
+       LSH TAC1,-15            ;SHIFT CHARACTER COUNT TO LSBITS\r
+       IMULI TAC1,-6           ;-NO OF BITS TO FAR RIGHT\r
+       CONO DC,@MDCSAV         ;?? IF DON SAYS SO, WELL, OK (JUST)\r
+       DATAI DC,TAC            ;FETCH LAST PART-WORD OF DATA\r
+       CONO DC,0               ;SHUT DOWN DC\r
+       LSH TAC,44(TAC1)        ;SHIFT LAST CHARACTERS TO LEFT END\r
+       JUMPG T,MTEOR1\r
+\r
+       AOBJN T,.+1             ;BUMP DATA POINTER\r
+       MOVEM TAC,(T)           ;STORE LAST WORD\r
+       MOVEM T,DCWRD           ;AND BUMPED POINTER\r
+\r
+MTEOR1:        CONSZ 224,LPE!CPE!400100        ;IF END OF RECORD. CHECK\r
+                               ;PARITY,DATA MISSED, AND ILLEGAL FLAG\r
+       JRST    MTEOR2          ;IF ERROR CAUSED INTERRUPT TO\r
+                               ;ERROR ROUTINE VIA TCF\r
+MTECON:        CONSZ 224, 400          ;EOF?\r
+       SETOM MTEOFF            ;SET EOF FLAG\r
+       AOS     MTBKCN(DEVDAT)  ;COUNT NO. OF BLKS READ OR WRITTENE\r
+                               ;INCLUDING RETRIES\r
+       JRST @MTIDSP            ;YES.\r
+\r
+MTEOR2:        SOS     MTIDSP          ;POINT TO ERROR ROUTINE\r
+       MOVEI   T,0\r
+       CONSZ   MTS1,20         ;LONGITUDINAL PARITY ERROR?\r
+       TLO     T,1000          ;YES, COUNT IN QUARTER 1\r
+       CONSZ   MTS1,10         ;LATERAL PARITY ERROR?\r
+       TLO     T,1             ;YES, COUNT IN QUARTER 2\r
+       CONSZ   MTS1,400000     ;ILLEGAL OP?\r
+       TRO     T,1000          ;YES, COUNT IN QUARTER 3\r
+       CONSO MTS1,100\r
+       SKIPF   MISSFD          ;DATA MISSED?\r
+       TRO     T,1             ;YES, COUNT IN QUARTER 4\r
+       ADDM    T,MTECNT(DEVDAT);ADD TO ERROR COUNTS FOR THIS DRIVE\r
+       JRST    MTECON          ;CHECK EOF\r
+\fMTERR:        HLRZ TAC,MTDEV          ;COMMAND\r
+       ANDI TAC,7400\r
+       TRNE IOS,IONRCK\r
+       JRST MTERR2\r
+       AOSLE TAC1,MTERCN\r
+       CAIL TAC1,3\r
+       JRST MTERR2\r
+       HLRZ TAC,MTDEV          ;COMMAND\r
+       ANDI TAC,770377\r
+       CONO 220,3400(TAC)      ;BSP\r
+       SOS MTIDSP\r
+MTIGN: MOVEI   TAC,TCF\r
+MTIGN1:        CONO    224,(TAC)\r
+       HRRZM   TAC,MTCCON\r
+       JRST    MTCRET\r
+\r
+MTERR2:        CONSO 224,400100        ;SET IODERR IF ILLEG OR MISSED CHAR FLAGS\r
+       SKIPE MISSED            ;SET IODERR IF DATA MISSED\r
+       TRO IOS,IODERR\r
+       CONSZ 224,30            ;SET IODTER IF LONG OR LAT PARITY\r
+       TRO IOS,IODTER\r
+       JRST MTPDUN\r
+\r
+MTBSP: MOVE TAC,MTDCCN         ;POINTER\r
+       MOVEM TAC,DOWRD         ;RESET POINTER WORD\r
+       HLRZ TAC,MTDEV          ;COMMAND\r
+       CONSO 224,XNC           ;WAIT FOR XNC\r
+       JRST .-1                ;SHOULD ADD A COUNT(RUNAWAY TAPE TURNED OFF)\r
+       SKIPLE TAC1,MTERCN\r
+       JRST MTBSP3\r
+MTBSP2:        TRO IOS,IOACT\r
+       HRLI TAC,ERF\r
+       JRST MTGO3\r
+MTBSP3:        TRNN TAC,1000           ;READING\r
+       TRCA TAC,100000         ;YES-CHANGE SLICE LEVEL\r
+       TRNN TAC1,1             ;NO\r
+       JRST MTBSP2\r
+       CONO 220,4400(TAC)      ;WRITE BLANK TAPE\r
+       AOS     MTERCN\r
+       JRST MTIGN\r
+\fMTC=220               ;MAG TAPE CONTROL DEVICE NUMBER\r
+\r
+MTS1=224               ;MAG TAPE CONTROL STATUS REG 1\r
+XNC=40000      ;TRANSFER NEW COMMAND\r
+MTDC=2         ;MAG TAPE DATA CONTROL DEVICE NO.\r
+TCF=1          ;TAPE CONTROL FREE\r
+ERF=4          ;END OF RECORD FLAG\r
+LPE=20         ;LONG. PARITY ERROR\r
+CRE=10         ;CHAR. PARITY ERROR\r
+SEL=2          ;UNIT TO COMMAND BUFFER\r
+IOSEOF=4000    ;SPACING ONE RECORD FORWARD FOUND EOF\r
+IOTEND=2000    ;EOT INDICATION\r
+IONRCK=100     ;DO NOT RE-TRY ON ERRORS\r
+IOBOT=4000     ;TAPE AT LOAD POINT\r
+IODT=10000     ;A 1 FOR A DATA TRANSFER TYPE COMMAND\r
+IOSLIC=2000    ;A 1 IF SLICE LEVEL IS 1, OTHERWISE 0.\r
+HASMT=4000     ;IF A 1, THIS JOB HAS THE MAG TAPE CONTROL\r
+IOREW=40000    ;A 1 IF UNIT IS REWINDING AND ANOTHER OPERATIONS\r
+               ;IS ATTEMPTED ON SAME UNIT. MUST BE SIGN BIT.\r
+\r
+EXTERNAL ADVBFF,ADVBFE,DCREQ,MTCSAV,SETACT,CLRACT,ORACT,GETDCMT\r
+EXTERNAL MTCRET, DCAVAL, MTAVAL, MTCCHN, MTREQ\r
+EXTERNAL MTWAIT,OUT,SETIOD,CLOCK,HNGSTP,MTSIZ\r
+EXTERNAL WSYNC,USRREL,WAIT1,ADRERR,PUNIT,PIOMOD,PJOBN\r
+EXTERNAL JOBPD1,JOBSAV\r
+EXTERNAL JBTADR,JOBPFI,STDENS,CPOPJ1,CPOPJ2,UUOERR\r
+EXTERNAL DCTCHN,DCLOC,DCLOC1,DCOFF,DCON,STOIOS,TPOPJ\r
+\r
+INTERNAL MTCINT,DETMDC,DETDC\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL MTEOFF,MTDEV,MTDCCN,DCWRD,MDCSAV,MISSED,MTERCN\r
+EXTERNAL MTREN,MTCMDP,SVCNTR,MTCCON,MTIOSP,MTOCND\r
+INTERNAL MTDCN1,MTPDUN\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;CONTROL DATA\r
+\r
+MTEOFF:        0       ;EOF FLAG\r
+MTDEV: 0       ;XWD COMMAND,DEVICE DATA BLOCK\r
+MTDCCN:        0       ;BLKI/O POINTER FOR REDO\r
+DCWRD: 0       ;BLKI/O POINTER FOR DC\r
+MDCSAV:        0       ;DC COMMAND\r
+MISSED:        0       ;-1 IF DC CONTAINS PARTIAL WORD\r
+MTERCN:        0       ;ERROR COUNTER\r
+MTREWN:        0       ;NO. OF MAG TAPE UNITS-1 IN IO WAIT DOING REWINDS\r
+               ;BECAUSE THEY REQUESTED OTHER OPERATIONS BEFORE REW\r
+               ;FINISHED. -1 MEANS NONE, 0 MEANS 1 IN QUEUE\r
+MTCMDP:        0       ;DUMP COMMAND LIST POINTER\r
+SVCNTR:        0       ;DUMP COMMAND IOWD NEGATIVE WORD COUNT\r
+MTCCON:        0       ;INTERRUPT FLAGS\r
+MTIDSP:        JRST MTPDUN\r
+\r
+>\r
+\f;LOGICAL EBND OF TAPE LOOP\r
+MTLEOT:        MOVEI T,7               ;BACKSPACE\r
+       PUSHJ PDP,MTAPC2\r
+       PUSHJ PDP,MTCHK2        ;CALL INTERLOCK, PICKUP IOS\r
+                               ;AFTER PREVIOS TASK FINISHED.\r
+MTEOT2:        MOVEI T,16              ;SAVE ONE FILE\r
+       PUSHJ PDP,MTAPE2\r
+       MOVEI T,6               ;SPAVE ONE RECORD\r
+       PUSHJ PDP, MTAPE\r
+       PUSHJ PDP,MTCHK2        ;CALL INTERLOCK, RETURN WHEN\r
+                               ;SPACING FINISHED WITH NEW IOS\r
+       TLNN IOS, IOSEOF        ;WAS EOF DETECTED?\r
+       JRST MTEOT2             ;NO, RESUME SPACING.\r
+       MOVEI T,7               ;PREPARE FOR BACKSPACE MTAPE\r
+       JRST MTAPE2             ;BACKSPACE, LOGICAL EOT FOUND\r
+                               ;RETURN TO MAKE PROGRAM\r
+MTREDO:        12                      ;NUMBER OF TIUMES TO RE-EXECUTE\r
+\f;DEVICE DEPENDENT DUMP MODES, MODE 16.\r
+;OUTPUT\r
+MTDMPO:        PUSH    PDP,UUO\r
+MTDPO1:        PUSHJ PDP,MTCHEK        ;IS SYSTEM AVAILABLE\r
+       TLO IOS,IO              ;WRITING\r
+       PUSHJ PDP,SAVCHK\r
+       MOVE TAC1, @MTOUT2      ;BLKO AND DATA CONTROL COMMAND\r
+       MOVEI T,1000            ;WRITING COMMAND\r
+MTDMP1: HTLI TAC, PROG         ;ACTUAL ADDRESS OF COMMAND LIST\r
+       MOVEM TAC, MTDUMP       ;COMMAND POINTER\r
+       SKIPN TAC,@TAC          ;COMMAND WORD\r
+       JRST MTEND1\r
+       JUMPG TAC, MTDMP1       ;CHANGE COMMAND SEQUENCE\r
+       HLREM TAC, SVCNT        ;SAVE COUNTER\r
+       HRRZS TAC               ;GET ADDRESS ALONE\r
+       CAMGE TAC,AC1\r
+       JRST MTDMP2\r
+       SUB TAC, SVCNTR         ;GET LAST ADDRESS\r
+       CAMLE TAC, USRREL       ;LESS THAN END?\r
+       JRST MTDMP2             ;OUT OF BOUNDS\r
+       MOVE TAC, @MTCMDP       ;PICK UP POINTER AGAIN\r
+       ADDI TAC,(PROG)         ;GET ACTUAL ADDRESS\r
+       AOS     MTCMDP\r
+       PUSH    PDP,MTCMDP\r
+       PUSHJ PDP,MTINDC        ;MOVE TAPE\r
+       PUSHJ PDP,WAIT1\r
+       TLNN IOS, IO            ;WRITING?\r
+       JRST MTDPI1             ;READING\r
+       LDB AC2,PIOMOD          ;GET MODE\r
+       CAIE    AC2,2\r
+       JRST    MTDPO1\r
+       PUSHJ   PDP,MWLEOT\r
+       PUSHJ   PDP,MTCHK2\r
+       JRST    MTEND1\r
+\r
+SAVCHK:        MOVEI AC1,JOBPFI\r
+       MOVE TAC,JOBPD1(JDAT)\r
+       TLNN    TAC,USRMOD\r
+       MOVEI AC1,JOBSAV\r
+       POP     PDP,TAC1\r
+       POP     PDP,TAC\r
+       JRST    (TAC1)\r
+;INPUT\r
+MTDMPI:        PUSH    PDP,UUO\r
+MTDPI1:        TRNE IOS,IODEND\r
+       JRST    TPOPJ\r
+       PUSHJ PDP,MTCHECK\r
+       TLZ IOS,IO              ;READING\r
+       PUSHJ PDP,SAVCHK\r
+       MOVE TAC1,@MTIN2        ;BLKI AND DATA CONTROL COMMAND\r
+       MOVEI T,2400            ;READ COMMAND\r
+       JRST MTDMP1             ;DUMP\r
+;ADDRESS ERROR\r
+MTDMP2:        PUSHJ PDP,MTEND1\r
+       JRST ADRERR\r
+\r
+       END\r
+\f\r
diff --git a/src/nulseg.mac b/src/nulseg.mac
new file mode 100644 (file)
index 0000000..adbdfa3
--- /dev/null
@@ -0,0 +1,119 @@
+TITLE  NULSEG - DUMMY HIGH SEGMENT ROUTINES FOR MACHINE WITH JUST ONE REG - V406\r
+SUBTTL T.HASTINGS/TH   TS  2 JUNE 69\r
+XP VNULSG,406\r
+               ;PUT VERSION NUMBER IN LOADER STORAGE MAP AND GLOB LISTING\r
+\r
+       ENTRY NULSEG\r
+NULSEG:                        ;ENTRY POINT SYMBOL TO CAUSE LOAD OF NULSEG IF REQUIRED\r
+                       ;(IE INSTEAD OF SEGCON OR NEITHER)\r
+\r
+;INITIALIZE LOC TWOREG TO 0(FLAG SOFTWARE OR HARDWARE ONLY 1 REG CAPABILITY)\r
+;AND1 AND2RG EXECUTED FROM ONCE AFTER HARDWARE EXAMINED FOR 2 REG CAPABILITY.\r
+\r
+       INTERN AND2RG\r
+\r
+AND2RG=0       ;FLAG SYSTEM DOES NOT HAVE 2 REG. CAPABILITY\r
+               ;SINCE AT LEAST SOFTWARE DOES NOT BECAUSE THIS DUMMY\r
+               ;ROUTINE LOADD\r
+\r
+;CLOCK1\r
+\r
+       INTERN SETHGH\r
+\r
+SETHGH:        TLZ PROG,1777   ;CLEAR OUT PROTECTION FOR HIGH SEG IN CASE THIS\r
+       POPJ PDP,       ;IS A 2 REG MACHINE\r
+\r
+XP CHGHGH,R0           ;CHARGE CURRENT USER FOR HIGH SEG\r
+\r
+;COMCSS\r
+\r
+XP PRTHGH,R0           ;PRINT HIGH SEG CORE\r
+XP ASGHGH,R0           ;CLEAR HIGH SEG NAMES ON ASSIGN COMMAND\r
+XP CHKMED,R0           ;CHECK FOR MEDDLING\r
+XP ANYSAV,R1           ;NAY JOB DOING A SAVE INVOLVING HIGH SEG?\r
+\f;CORE1\r
+\r
+XP HGHDEP,R0           ;DEPOSIT HIGH SEG(ERROR)\r
+XP KILHGH,R0           ;REMOVE HIGH SEG FROM LOGICAL ADR SPACE\r
+XP UREMAP,R0           ;REMAPO UUO\r
+XP CURHGH,R0           ;CHANGE RELOC HARD IF CURRENT USER AFFECTED\r
+XP FRECOR,R0           ;FREE CORE IN NON-SWAP SYSTEMS\r
+XP FRECR1,R1           ;FREE CORE IN SWAPPING SYSTEMS\r
+\r
+       INTERN UCORHI,SUMSEG\r
+       EXTERN CORMAX,USRREL\r
+\r
+UCORHI:        CAMLE TAC,USRREL        ;TRYING TO ASSIGN CORE TO HIGH SEG?\r
+       POPJ PDP,               ;YES, ERROR RETURN\r
+                               ; NO, GIVE OK RETURN\r
+SUMSEG:        CAMGE TAC,CORMAX        ;ARG GE MAX LENGTH (HIGHEST+1)?\r
+R1:    AOS (PDP)               ;NO, GIVE OK RETURN\r
+R0:    POPJ PDP,               ;YES, GIVE ERROR RETURN\r
+\r
+;ERRCON\r
+\r
+XP SEGILM,R1           ;WILD TRANSFER RETURN\r
+\r
+;SAVGET\r
+\r
+XP SETEXT,R0\r
+XP SETEX1,R0\r
+XP SAVDDL,R0           ;DIDDLE RELOC, DURING DUMP MODE O/P FOR HISEG\r
+\r
+       INTERN UGETHI\r
+       EXTERN UGTERR\r
+\r
+UGETHI:        JRST UGTERR             ;ERROR RETURN TO USER UNLESS HALT IN LH OF UUO+1\r
+\r
+       INTERN SAVHGH,GETHGH\r
+       EXTERN SGERRA,SGAMOD,SG3\r
+\r
+SAVHGH:\r
+GETHGH: OPEN 0,SGAMOD          ;TRY TO INIT DEVICE\r
+       JRST SGERRA             ;ERROR\r
+       AOS (PDP)               ;SKIP RETURN\r
+       JRST SG3                ;AND GO SETUP LOWER CORE\r
+\f;SWAP\r
+\r
+       INTERN FTSWAP\r
+\r
+IFN FTSWAP,<\r
+XP FININ,R1            ;FINFISH SWAPPING IN\r
+XP FINOT,R1            ;FINISH LOW SEG OUTPUT - NOTHING MORE TO DO\r
+XP FORSIZ,R0           ;SIZE OF JOB FREED UP\r
+XP FRESWP,R1           ;FREE DISK SPACE - NO DORMANT SEG FOUTND RETURN\r
+XP FITHGH,R0           ;CHECK IF HISEG BEING SWAPPED IN\r
+\r
+       INTERN FITSIZ\r
+       EXTERN CORTAL\r
+\r
+FITSIZ:        CAMG AC1,CORTAL         ;WILL LOW SET FIT IN CORE?\r
+       AOS (PDP)               ;YES, SWAP HIM IN\r
+       POPJ PDP,               ;NO, MUST SWAP SOMEONE ELSE OUT FIRST   \r
+\r
+       INTERN FORHGH\r
+       EXTERN JBTSTS\r
+\r
+FORHGH:        MOVSI TAC,SHF   ;STOP IO AFTER NEXT BUFFERFUL IF ACTIVE\r
+       IORM TAC,JBTSTS(ITEM)   ;CHECKED BY ADVBFF,ADVBFE ROUTINES\r
+       POPJ PDP,\r
+>\r
+\r
+;SYSINI\r
+\r
+XP SEGINI,R0           ;INITIALIZE HIGH SEGS\r
+\r
+;UUOCON\r
+XP RELSEG,R0           ;SUPERCEDE HIGH SEGS ON RECREATE\r
+XP RELSG1,R1           ;RENAME UUO\r
+XP HGHWRD,R0           ;GET WORD FROM HIGH SEG - ERROR RETURN\r
+XP HRESET,R0\r
+\r
+       INTERN USTUWP\r
+       EXTERN RTZER\r
+\r
+USTUWP:        JRST RTZER\r
+\r
+XP HGHWRD,R0           ;GET WORD FROM HIGH SEG -ERROR\r
+XP USPY,R0             ;SPY UUO - ERROR\r
+       END\r
diff --git a/src/onceb.mac b/src/onceb.mac
new file mode 100644 (file)
index 0000000..9fa9d75
--- /dev/null
@@ -0,0 +1,1749 @@
+IFE FTDISK+FTRC10+2,<\r
+TITLE  ONCEB - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(BURROUGHS DISK)\r
+>\r
+IFE FTDISK+FTRC10+1,<\r
+TITLE  ONCED - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(DATA PRODUCTS DISK)\r
+>\r
+IFE FTDISK+FTRC10+0,<\r
+TITLE  ONCEN - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(NO DISK)\r
+>\r
+SUBTTL T. HASTINGS/RCC/CHW  TS  04 JUN 69  V414\r
+XP VONCE,414\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL       FTRC10  ;THIS SINGLE SOURCE FILE MAY BE ASSEMBLED FOR EITHER\r
+                       ; THE NEW PDP-10 (BURROUGHS) DISK, OR THE OLD PDP-6 (DATA\r
+                       ; PRODUCTS) DISK (FTRC10 = -1 OR 0, RESPECTIVELY, IN S).\r
+\r
+;"ONCE" SHOULD BE THE LAST LOADED PROGRAM BEFORE SYSMAK AND DDT\r
+;THUS IF IT OVERFLOWS INTO THE USER AREA NO HARM IS DONE.\r
+\r
+;ONCE ONLY CODE IS DIVIDED INTO 3 PARTS\r
+; 1. MANDITORY ONCE ONLY(LINKSR) - NO CTY NEEDED\r
+;      (GOOD REPEATED STARTUPS DURING DEBUGGING\r
+; 2. USUAL SHROT ONCE ONLY CODE(ONCE) - CTY FOR DATE AND TIME\r
+; 3. OPTIONAL ONCE ONLY CODE - CTY DIALOG TO CHANGE MONITOR\r
+;      OR REFRESH DISK(ALT-MODE INSTEAD OF CR AFTER TIME)\r
+\r
+;INITIALIZE PRIORITY CHANNELS AND SETUP INTERRUPT SERVICE ROUTINE CHAIN\r
+\r
+T=TAC                  ;DEFINE ACCUMULATOR T\r
+\r
+;LINK TO SERVICE ROUTINES\r
+\r
+INTERNAL LINKSR,FT2REL\r
+EXTERNAL JOBSYM,JOBPFI,XJBPFI\r
+\r
+LINKSR:        0                       ;CALLED WITH JSR FROM SYSINI\r
+       MOVSI T,JOBPFI          ;SET LH OF XJBPFI WITH JOBPFI\r
+       MOVEM T,XJBPFI          ;LOADER DORES NOT HANDLE GLOBALS IN LH\r
+IFN FT2REL,<\r
+       JSP TSTREG              ;GO TEST IF TWO RELOC REGISTERS EXIST\r
+>\r
+\r
+                               ;HIGHEST LOC. IN JOB AREA PROTECTED FROM IO\r
+\r
+;MOVE SYMBOL TABLE UP IN MEMORY\r
+;EXEC MUST BE LOADED IN 15K OR LESS IF GOING INTO 16K MACHINE\r
+;FIRST FIND THE FIRST LOCATION OF NON-EXISTENT MEMORY\r
+\r
+       EXTERN DDTSYM\r
+\r
+       SETZB   DAT,IOS         ;(ACCUMULATOR IOS MUST ALSO BE CLEARED FOR SCNSER)\r
+       CONO APR,NXM            ;CLEAR NON-EX MEM FLAG\r
+       MOVEI   TAC,^D256       ;IN CASE MEMORY HAS NO NON EXISTANT BANKS\r
+       ADDI DAT,2000           ;TRY NEXT 1K BLOCK\r
+       MOVE TAC1,(DAT)         ;REFERENCE THIS LOCATION\r
+       CONSO APR,NXM           ;NON-EXISTENT?\r
+       SOJG TAC, .-3           ;NO,KEEP LOOKING AS LONG AS NOT TOP OF MEMORY\r
+       SUBI    DAT,700         ;MAKE ROOM FOR TENDUMP AT TOP OF CORE\r
+                               ; (DDTSYM=36) WHERE EXEC DDT EXPECTS IT.\r
+                               ; IF NOT ALREADY MOVED THERE. RETURN POINTER IN UUO\r
+       HLRE TAC1,UUO           ;-LENGTH OF S. T.\r
+                       ;NOTE THAT THE SYMBOL TABLE POINTER IS MOVED FROM\r
+                       ; JOBSYM(JDAT) TO DDTSYM(JDAT) BY SYSMAK WHEN THE SYSTEM\r
+                       ; IS FIRST CREATED.\r
+       JUMPE TAC1,JRSTI1       ;0 IF NO S. T. TO MOVE UP\r
+       MOVNS TAC1              ;+LENGTH\r
+       HRRZ TAC,UUO            ;FIRST ADDRESS\r
+       ADDI TAC,(TAC1)         ;LENGTH+FIRST ADDRESS\r
+       HRL TAC,TAC1            ;XWD LENGTH,LENGTH+FIRST ADDRESS        \r
+       SUBI DAT,1(TAC)         ;NEW LAST+1-OLD LAST+1\r
+       HRRM DAT,STO1           ;DIST, TO MOVE\r
+       MOVE TAC1,UUO           ;L-N,FIRST ADD.\r
+       ADDI TAC1,1(DAT)        ;FROM NEW S.T. POINTER\r
+       MOVEM TAC1,DDTSYM       ;STORE IN LOWER CORE\r
+       MOVE TAC1,-1(TAC)\r
+STO1:  MOVEM TAC1,.(TAC)\r
+       SUB TAC,[XWD 1,1]\r
+       JUMPGE TAC,.-3\r
+\r
+       EXTERN DEVLST,INTNUM,INTTAB\r
+;SETUP LOCATIONS 40 THRU 61\r
+\r
+JRSTI1:        MOVE TAC,[XWD LOC40,40] ;SET UP LOWER CORE PI LOCATIONS\r
+       BLT TAC,61\r
+\r
+;LINK DEVICE SERVICE ROUTINES TOGETHER - IF NOT LOADED BY BUILD\r
+\r
+       SKIPE DEVLST            ;HAS SERVICE ROUTINES ALREADY BEEN CHAINED TOGETHER?\r
+       JRST ALRCHN             ;YES, MUST HAVE BEEN LOADD WITH BUILD\r
+       MOVSI TAC,INTNUM        ;NO, NEG. NO. OF SERVICE ROTUINES*2\r
+INTLOP:        HLRZ DAT,INTTAB(TAC)    ;GET NEXT PI NUMBER\r
+       ANDI DAT,7              ;MASIC OUT NUMBER OF DDB'S\r
+       LSH DAT,1               ;SHIFT LEFT ONE SO MATCH PI LOCATIONS\r
+       JUMPE DAT,NOPICH        ;DOES THIS DEVICE HAVE A PI CHANNEL (PTY)?\r
+       MOVE DAT,ITEM           ;YES, PICK UP JSR CH'N FROM LOWER CORE\r
+INTLP1:        MOVE DAT,ITEM           ;SAVE IT IN DAT (EITHER A JRST DEV'NT OR\r
+                               ; JEN @CH'N\r
+       MOVE ITEM,1(DAT)        ;PICK UP INSTR. FOLLOWING INTERRUPT CONSO\r
+\r
+       TLNN ITEM,00740         ;IS IT A JEN?\r
+       JRST INTLP1             ;NO, KEEP LOOKING\r
+       MOVE TAC1,INTTAB(TAC)   ;YES, LAST DEVICE SO FAR, GET DEV'NT\r
+       HRLI TAC1,(JRST)        ;MAKE JRST INSTR.\r
+       MOVEM TAC1,1(DAT)       ;CHANGE JEN @CH'N TO JRST DEV'NT\r
+       MOVEM ITEM,1(TAC)       ;MAKE DEV'NT+1 BE JEN @CH'N\r
+NOPICH:        AOBJN TAC,.+1           ;PICKUP EVERY OTHER WORD?\r
+       AOBJN TAC,INTLOP        ;ANY MOVE INTERRUPT SERVICE ROUTINES?\r
+ALRCHN:\r
+IFN FTDISK,<\r
+\r
+;INITIALIZE DISK\r
+\r
+       EXTERN NULPDL,DSKINI\r
+\r
+       MOVEI PDP,NULPDL\r
+       PUSHJ PDP,DSKINT        ;INITIALIZE THE DISK\r
+                               ; AFTER SETTING UP CHANNEL LOC\r
+                               ; BUT BEFORE OVERWRITTING ONCE WITH DDB'S\r
+>\r
+       MOVE TAC,JRSTI\r
+       MOVEM TAC,LINKSR+1      ;DO ONCE ONLY\r
+       SKIPN DEVLST    ;HAVE DEVICE DATA BLOCKS BEEN LINKED?\r
+       JRST LINKDB     ;NO, GO LINK DATA BLOCKS\r
+                       ;RETURN @LINKSR\r
+                       ;MULTIPLE DEVICE DATA BLOCKS ARE CREATED\r
+                       ;AS SPECIFIED BY SYSSIZ AND MAY ERASE PART\r
+                       ;OF ONCE ONLY CODE\r
+JRST1: JRST @LINKSR    ;YES,RETURN\r
+\r
+EXTERN UUO0,ERROR,UUO2,LINKDR,DEVLST\r
+EXTERN CH1,CH2,CH3,CH4,CH5,CH6,CH7\r
+\r
+LOC40: 0                       ;UUO PC\r
+INTERNAL UUOTRP\r
+UUOTRP:        JSR UUO0                ;TO UUO HANDLER\r
+       JSR CH1\r
+       JSP DAT,ERROR\r
+       JSR CH2\r
+       JSP DAT,ERROR\r
+       JSR CH3\r
+       JSP DAT,ERROR\r
+       JSR CH4\r
+       JSP DAT,ERROR\r
+       JSR CH5\r
+       JSP DAT,ERROR\r
+       JSR CH6\r
+       JSP DAT,ERROR\r
+       JSR CH7\r
+       JSP DAT,ERROR\r
+       0               ;LOC 60/61 TRAPPED TO FOR UNIMPLEMENTED OP CODES ON PDP-10\r
+                       ;OP CODE 100 IS USED TO DISMISS USER MODE INTERRUPTS(SEE TRPSET UUO)\r
+       JSR UUO2        ;GO SEE IF OP CODE 100 OR SOME OTHER ONE\r
+\r
+IFN FT2REL,<\r
+;SET LOC TWOREG TO -1 IF MACHINE HAS TWO RELOC REG,0 IF ONLY ONE RELOC REG\r
+       EXTERN TWOREG,SEGN,SEGPTR,AND2RG,JOBN\r
+\r
+TSTREG:        0\r
+       MOVE TAC,[JSR TSTAPR]   ;REPLACE UUO JSR WIT A JSR HERE IN ONCE\r
+       MOVEM TAC,41\r
+       CONO APR,ILM!1          ;TURN ON PI & ASSIGN ILM FLAG\r
+                               ;FOR POSSIBLE ILLEGAL MEMORY REF BELOW\r
+       MOVEM TAC,42            ;PUT A JSR IN CHAN 1 INT. LOC.\r
+       CONO PI,12300           ;CLR PI SYSTEM, ACTIVATE PI SYSTEM. TURN ON CHAN 1\r
+       DATAO APR,[XWD 376776,000400]   ;SET LOW AND HIGH SEG TO 128K LONG\r
+                               ; EACH STARTING AT ABS LOC 0\r
+                               ; RELOC. FOR HIGH SEG IS 400000 TO DO THIS\r
+       JRST 1,.+1              ;ENTER USER MODE .+1\r
+       MOVE TAC,400100         ;TRY TO REFERENCE REL LOC 100 IN HIGH SEG\r
+                               ; AVOID SHADOW ACS WHICH LIKELY HAVE BAD\r
+                               ;PARITY CAUSED BY POWER TURN ON AND TURN OFF\r
+       MOVEI 17,400000         ;MOVE HARDWARE ACS INTO SHADOW ACS TO CLEAR PARITY\r
+                               ;IF HARDWARE ACS TURNED OFF, ACS WILL BE PRESERVED\r
+       BLT 17,400017           ;STOP WITH SHADOW AC 17\r
+       CALL                    ;COME BACK TO EXEC MODE AT TSTAPR\r
+\r
+TSTAPR:        0                       ;PLACE TO SIDE JSR PC\r
+       SETZM TWOREG            ;ASSUME NO SECOND REG.\r
+       CONSO APR,ILM           ;WAS MEMORY REF OUT OF BOUNDS?\r
+       SETOM TWOREG            ;NO, MUST HAVE SECOND REG. HARDWARE, SET -1\r
+       CONO APR,ILM            ;CLEAR APR FLAGS AGAIN\r
+       MOVEI TAC,AND2RG        ;=0 IF SOFTWARE CANNOT HANDLE 2 SEG(NULSEG LOADED)\r
+       ANDM TAC,TWOREG         ;=-1 IF IT CAN(SEGCON LOADED)\r
+                               ;TWOSEG SET TO AND OF SOFTWARE AND HARDWARE CAPABILITES\r
+       MOVNI TAC,SEGN          ;SET LH OF POINTER TO FIRST SEG IN JBTXX TABLES\r
+       HRLI TAC,JOBN           ;SET RH OF POINTER TO FIRST HIGH SEG\r
+                               ;THIS MUST BE DONE HERE BECAUSE SEGPTR APPEARS IN FIRST\r
+                               ; WHICH BUILD FORBITS FROM HAVING EXTERNALS\r
+       MOVSM TAC,SEGPTR        ;POINTER USED FOR AOBJN LOOPS\r
+       CONO PI,10000           ;CLEAR PI SYSTEM\r
+       JRST @TSTREG\r
+>\r
+\r
+;ROUTINE TO FIND THE EXEC DDT SYMBOL TABLE POINTER AND MOVE IT TO THE PLACE\r
+;WHERE EXEC DDT EXPECTS IT(DDTSYM=36)\r
+;THE MONITOR CAN BE LOADED IN ANY OF 3 WAYS(IN ORDER OF PERFERNCE):\r
+;  1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON\r
+;  2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER AND COMMON\r
+;  3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD\r
+\r
+;THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116),T30SYM(131) IN DIFFERENT STATES:\r
+;      DDTSYM(36)      JOBSYM(116)     T30SYM(131)\r
+;  1.  JUNK            S.T.PTR         JUNK\r
+;  2.  JUNK            JUNK(NON-NEG)   S.T.PTR\r
+;  3.  S.T.PTR         S.T.PTR         JUNK\r
+\r
+;CALL: JSP MOVSTP\r
+;      RETURN WITH AC UUO SET TO SYMBOL TABLE POINTER\r
+;CALLED FROM MANDATORY ONCE ONLY CODE AND 141 START CODE(WHICHEVER OCCURS FIRST)\r
+\r
+       INTERN MOVTP\r
+       EXTERN T30SYM,JOBSYM,DDTSYM,DDTX,SYSDDT\r
+\r
+MOVSTR:        0                       ;JSR HERE FROM MANDATORY ONCE ONLY CODE AND\r
+                               ; FIRST JUMP TO EXEC DDT IF BEFORE MONITOR STARTED\r
+MOVJMP:        JRST .+1                ;PATCHED TO SETUUO AFTER FIRST EXECUTION\r
+       MOVE UUO,T30SYM         ;ASSUME LOADED BY REGULAR 10/30\r
+       SKIPL JOBSYM            ;OR IS JOBSYM NEGATIVE(MEANING IT IS S.T.PTR)?\r
+       JRST REGT30             ;WAS LOADED BY REGULAR 10/30\r
+       MOVE UUO,JOBSYM         ;ASSUME LOADED BY TIME SHARING MONITOR AND LOADER\r
+       SKIPE DEVLST            ;OR HAS BUILD PATCHED THE DDB CHAIN?\r
+       MOVE UUO,DDTSYM         ;YES, DDTSYM HAS SYMBOL TABLE POINTER AS STORED\r
+                               ; BY SPMON\r
+REGT30:        MOVEM UUO,DDTSYM        ;STORE THE SYMBOL TABLE POINTER FOR EXEC DDT\r
+       MOVEI TAC,DDTX          ;MAKE SYSTEM STARTUP LOC(141) GO DIRECTLY  TO EXEC\r
+                               ; DDT AND BY PASS THIS FOOLISHNESS\r
+       HRRM TAC,SYSDDT\r
+       MOVEI TAC,SETUUO        ;MAKE SURE THIS IS DONE ONLY ONCE\r
+       HRRM TAC,MOVJMP\r
+SETUUO:        MOVE UUO,DDTSYM         ;RETURN THE CORRECT(MAYBEUPDATED IF\r
+                               ; EXEC DDT PATCHES MADE BEFORE MONITOR SAVED OR\r
+                               ; STARTED) SYMBOL TABLE POINTER\r
+       JRST @MOVSTR            ;RETURN\r
+\r
+;HERE IF EXEC DDT IS STARTED UP BEFORE MONITOR(TO MAKE A PATCH FOR EXAMPLE)\r
+\r
+       INTERN PATSYM\r
+       EXTERN DDTX\r
+\r
+PATSYM:        JSR MOVSTP              ;MOVE DDT SYMBOL TABLE POINTER SO EXEC DDT WILL\r
+                               ; FIND IT AND PATCH 141 TO GO DIRECTLY TO EXEC DDT\r
+       JRST DDTX               ;AND GO DIRECTLY TO EXEC DDT\r
+\r
+IFN    FTRC10, <\r
+ENTRY  RCXWNZ                  ;THIS SYMBOL IS SOLELY TO PERMIT THE SYSTEM\r
+RCXWNZ:                                ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+INTERNAL       ONCE\r
+>\r
+IFE    FTRC10, <\r
+ENTRY  ONCE\r
+>\r
+\r
+EXTERNAL CONMES,RADX10,CRLF,DECIN1,OCTPNT\r
+EXTERNAL CONFIG,SYSDAT\r
+INTERN FTTTYSER\r
+IFE FTTTYSER,<\r
+       DEFINE SETTYO <MOVE DAT,LINEP>\r
+       DEFINE TYPE <IDBP CHREC,DAT>\r
+\r
+       DEFINE NEXTC <ILDB CHREC,TAC>>\r
+IFN FTTTYSER,<\r
+       DEFINE SETTYO <PUSHJ PDP,OTSET>\r
+       DEFINE TYPE <PUSHJ PDP,OUTCHS>\r
+       DEFINE NEXTC <PUSHJ PDP,GETCHR>\r
+EXTERN TSETBF,SETBFI,SCNDDB,TTIBUF,TTOBUF,OUTCHS,GETCHR,TIBF,TOBF\r
+>\r
+\r
+       INTERN PATSIZ\r
+       EXTERN PATCH\r
+\r
+ONCE:  0       \r
+PATSIZ:        MOVEI TAC,PATCH         ;SET SIZE OF SYSTEM TO BEGINING OF PATCH\r
+       MOVEM TAC,SYSSIZ        ;IN CASE ONCE ONLY DIALOG RESTARTD BEFORE OVERWRITTEN\r
+\r
+                               ;PATSIZ SHOULG BE UPDATED EVERY TIME A PATCH\r
+                               ; IS MADE. SYSSIZ SHOULD ALSO BE UPDATED IF 146\r
+                               ; START IS GOING TO BE USED(DDT DEBUGGIN OR CTY DOWN)\r
+\r
+       MOVE PDP,[XWD -ONCEPN,ONCEPD]\r
+       SETTYO\r
+       PUSHJ PDP,CRLF\r
+       MOVEI TAC,CONFIG\r
+       PUSHJ PDP,CONMES\r
+       MOVEI TAC,[ASCIZ / /]\r
+       PUSHJ PDP,CONMES\r
+       MOVEI TAC,SYSDAT\r
+       PUSHJ PDP,CONMES\r
+       MOVEI TAC,TSEXEC\r
+       PUSHJ PDP,CONMES\r
+       PUSHJ PDP,OPOUT\r
+\r
+\r
+;ASK FOR TODAY'S DATE AND CONVERT \r
+;DATE STORED AS ((Y-64)*12.+M-1)*31.+D-1\r
+\r
+EXTERNAL       THSDAT,JUFMIN,SKIPS\r
+\r
+       PUSHJ PDP,DATLOP\r
+       JRST .-1\r
+DATLOP:        SETZM THSDAT\r
+       MOVEI TAC,TODATE\r
+       PUSHJ PDP,ICONM\r
+       PUSHJ PDP,OPOUT\r
+       PUSHJ PDP,GETLIN\r
+       JRST DATLOP\r
+       PUSHJ PDP,SKIPS\r
+       PUSHJ PDP,DECIN1        ;MONTH\r
+       JRST DATLOP\r
+       JRST DATLOP             ;ERROR\r
+       SKIPE TAC1\r
+       CAILE TAC1,^D12\r
+       JRST DATLOP\r
+       SUBI TAC1,1\r
+       IMULI TAC1,^D31\r
+       ADDM TAC1,THSDAT\r
+       NEXTC\r
+       PUSHJ PDP,DECIN1        ;DAY\r
+       JRST DATLOP\r
+       JRST DATLOP\r
+       SKIPE TAC1\r
+       CAILE TAC1,^D31\r
+       JRST DATLOP\r
+       SUBI TAC1,1\r
+       ADDM TAC1,THSDAT\r
+       NEXTC\r
+       PUSHJ PDP,DECIN1        ;YEAR\r
+       JRST DATLOP\r
+       JRST DATLOP\r
+       CAIL TAC1,^D69\r
+       CAILE TAC1,^D99\r
+       JRST DATLOP\r
+       SUBI TAC1,^D64          ;YEAR ZERO\r
+       IMULI TAC1,^D12*^D31\r
+       ADDM TAC1,THSDAT\r
+\r
+\r
+;GET TIME OF DAY\r
+\r
+EXTERNAL       TIME\r
+\r
+       POP PDP,TC\r
+       PUSHJ PDP,TIMLOP\r
+       JRST .-1\r
+TIMLOP:        SETZM TIME\r
+       MOVEI TAC,TIMEM\r
+       PUSHJ PDP,IOCONM\r
+       PUSHJ PDP,OPOUT\r
+       PUSHJ PDP,GETLIN\r
+       JRST TIMLOP             ;JUST A CR\r
+       PUSHJ PDP,SKIPS\r
+       PUSHJ   PDP,DECIN1      ;READ THE TIME (1-4 CHARACTERS)\r
+       JRST    TIMLOP  ;NO ARGUMENT\r
+       JRST    TIMLOP  ;ILLEGAL CHARACTER\r
+       MOVE    TAC,TAC1\r
+       IDIVI   TYAC,^D100      ;TAC=HRS.TAC1=MINS\r
+\r
+       SKIPL   TAC     ;HRS NEGATIVE?\r
+       CAILE   TAC,^D23        ;OR .G. 23?\r
+       JRST    TIMLOP  ;OUT OF BOUNDS\r
+       CAILE   TAC1,^D59       ;MINUTES .G. 59\r
+       JRST    TIMLOP  ;OUT OF BOUNDS\r
+       IMULI   TAC,^D60        ;CONVERT TO MINUTES\r
+       ADD     TAC,TAC1        ;MINUTES SINCE MIDNIGHT\r
+       IMULI   TAC,JIFMIN      ;JIFFIES SINCE MIDNIGHT\r
+       MOVEM   TAC,TIME        ;TIME=JIFFIES SINCE MIDNIGHT\r
+\r
+       JUMPGE  ITEM,QUICK      ;SKIP NEXT PART OF DIALOGUE UNLESS THE LAST ITEM\r
+                               ; TYPED IN (NAMELY TIME OF DAT) WAS TERMINATED BY\r
+                               ; AN "ALT MODE". (ACCUMULATOR "ITEM" IS SET UP\r
+                               ; IUN THE "GETLIN" SUBROUTINE CALLED ABOVE.)\r
+\r
+\r
+;PRINT IO CONFIGURATION\r
+\r
+EXTERNAL DEVLST,TCONLN,INLMES,PRENAME,INTTB1,INTTAB\r
+EXTERNAL OCTPNT\r
+\r
+IFN FT2REL,<\r
+       JSR TSTREG              ;TEST IF 2 RELOC REG SET TWOSEG 0 OK-1\r
+       MOVEI TAC,CRLFMS        ;PRINT CRLF\r
+       PUSHJ PDP,ICONM\r
+       MOVEI TAC,1             ;ASSUME 1\r
+       SKIPE TWOREG\r
+       MOVEI TAC,2\r
+       PUSHJ PDP,RADX10        ;NO. SECOND REG EXISTS.\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ /RELOC. REG.\r
+/\r
+       PUSHJ PDP,OPOUT\r
+>\r
+       MOVEI TAC,IOCONF\r
+       PUSHJ PDP,IOCNM\r
+       HLRZ AC1,DEVLST\r
+       JUMPN AC1,ALRLNK        ;DEVICE DATA BLOCK ALREADY LINKED?\r
+       MOVESI PROG,INTNUM      ;NO, NOT LOADED BY BULD,-NO. OF DEVICES*2\r
+CONFLP:        SKIPN AC1,INTTB1(PROG)  ;INT LOC HAVE DEV DATA BLOCK?\r
+       JRST NODDB              ;NO, GO GET NEXT DEVICE DATA BLOCK\r
+       LDB UUO,[POINT 8,INTTAB(PROG),8]        ;YES. NO. OF DEV DATA BLKS\r
+       HRRZ TAC,UUO            ;PRINT\r
+       PUSHJ PDP,RADX10        ;IN DECIMAL\r
+       PUSHJ PDP,INLMES        ;PRINT 1 SPACE\r
+       ASCIZ / /\r
+       HLLZ TAC1,DEVNAME(AC)   ;DEVICE NAME\r
+       PUSHJ PDP,PRNAME        ;PRINT IT\r
+       SOJLE UUO,SINGLE                ;IS THIS JUST A SIGNLE DEVICE?\r
+       PUSHJ PDP,INLMES        ;NO, APPEND 'S TO DEVICE NAME\r
+       ASCIZ /'S/\r
+SINGLE:        PUSHJ PDP,CRLF          ;PRINT CR LF\r
+NODDB: AOBJN PROG,.+1          ;\r
+       AOBJN PROG,CONFLP       ;FINISHED ALL DEVICES?\r
+       JRST ONCE7A             ;YES\r
+ALRLNK:\r
+ONCE5: MOVEI TAC,1\r
+       HLLZ ITEM,DEVNAM(AC1)\r
+ONCE4: HLRZ AC1,DEVSER(AC1)\r
+       JUMPE AC1,ONCE6\r
+       HLLZ TAC1,DEVNAM(AC1)\r
+       CAMN TAC1,ITEM\r
+       AOJA TAC,ONCE4\r
+ONCE6: MOVE PROG,TAC           ;SAVE NO.\r
+       PUSHJ PDP,RADX10\r
+       MOVEI CHREC," "\r
+       TYPE\r
+       MOVEI UUO,3\r
+       MOVE TAC,[POINT 6,ITEM]\r
+ONCE7: ILDB CHREC,TAC\r
+       ADDI CHREC,40\r
+       TYPE\r
+       SOJG UUO,ONCE7\r
+       MOVEI TAC,[ASCIZ /'S/]\r
+       CAILE PROG,1\r
+       PUSHJ PDP,CONMES\r
+       PUSHJ PDP,CRLF\r
+       JUMPN AC1,ONCE5\r
+ONCE7A:        PUSHJ PDP,OPOUT\r
+       MOVEI TAC,CRLFMS\r
+       PUSHJ PDP,ICONM\r
+       MOVEI TAC,TCONLN        ;PRINT NO, OF TTY SCANNER LINES\r
+       PUSHJ PDP,OCTPNT\r
+       PUSHJ PDP,INLMES\r
+       ASCIZ / (OCTAL) TTY SCANNER LINES\r
+/\r
+       PUSHJ PDP,OPOUT\r
+\r
+;ASK FOR OPERATORS CONSOLE TO BE SPECIFIED\r
+\r
+EXTERNAL INLMES,DEVOPR,CTEXT,DEVPHY\r
+\r
+ONCEOP:        MOVEI TAC,OPRM\r
+       PUSHJ PDP,ICONM\r
+       PUSHJ PDP,OPOUT\r
+       PUSHJ PDP,GETLIN\r
+       JRST ONCE8              ;JUST CR\r
+       PUSHJ PDP,CTEXT\r
+       MOVE TAC,TAC1\r
+       CAMN TAC,[SIXBIT /CTY/]         ;CTY?\r
+       JRST .+3                        ;YES. JUST STORE IT.\r
+       PUSHJ PDP,DEVPHY\r
+       JRST ONCEP              ;PHYSICAL NAME NOT FOUND\r
+       MOVEM TAC,DEVOPR        ;SET FOR SYSTEM\r
+                               ;DEVICE "OPR" WILL BE SAME AS THIS\r
+\r
+;ASK IF SYSMAK IS WANTED\r
+\r
+       EXTERN MAKEND,SYSSIZ\r
+\r
+ONCE8: MOVEI TAC,SYSM\r
+       PUSHJ PDP,YESNO\r
+       JRST ONCE2              ;NO SYSMAK\r
+       MOVEI TAC,MAKEND        ;YES\r
+       MOVEM TAC,SYSSIZ\r
+\r
+;IS EXEC DDT WANTED?\r
+\r
+EXTERNAL       DDTEND\r
+\r
+ONCE2: MOVEI TAC,SYSDM\r
+       PUSHJ PDP,YESNO\r
+       JRST ONCE3              ;NO\r
+       MOVEI TAC,DDTEND        ;FIRST FREE LOC. ABOVE EXEC DDT\r
+       MOVEM TAC,SYSSIZ        ;SET NEW MONITOR SIZE\r
+;FIND CORE TO BE USED FOR MULTIPLE DEVICE DATA BLOCKS\r
+; INCLUDING DISK\r
+\r
+EXTERNAL CNTDB\r
+\r
+ONCE3: PUSHJ PDP,SYSSIZ ;SAVE CURRENT VALUE\r
+       JSP TAC,CNTDB    ;UPDATE SYSSIZ BY SPACE USED\r
+                               ; FOR DEVICE DATA BLOCKS FOR DSK,DTA,MTA,TTY,PTY)\r
+\r
+;PRINT OCTAL SIZE OF MONITOR\r
+\r
+       MOVEI TAC,EXECIS\r
+       PUSHJ PDP,ICONM\r
+       MOVE TAC,SYSSIZ\r
+       PUSHJ PDP,OCTPNT\r
+       MOVEI TAC,LENGTH\r
+       PUSHJ PDP,CONMES\r
+       PUSHJ PDP,CRLF\r
+       PUSHJ PDP,OPOUT\r
+       POP PDP,SYSSIZ  ;RESTORE SYSSIZ PRIOR TO ACTUAL CREATION\r
+                               ; OF DEVICE DATA BLOCKS\r
+       EXTERN DECIN,CORLIM,USRLIM,RADX10\r
+\r
+ONCE4A:        MOVEI TAC,MXKMES        ;PRINT "MAX. K CORE FOR SINGLE USER IS "\r
+       PUSHJ PDP,ICONM\r
+       MOVEI TAC,USRLIM\r
+       PUSHJ PDP,RADX10\r
+       PUSHJ PDP,CRLF\r
+       PUSHJ PDP,OPOUT\r
+\r
+       MOVEI TAC,DESMES        ;PRINT "TYPE DESIRED MAX.(DEC). CR IF OK AS IS\r
+       PUSHJ PDP,ICONM ;"\r
+       PUSHJ PDP,OPOUT\r
+       PUSHJ PDP,GETLIN\r
+       JRST ONCE5A             ;LEAVE LIMIT AS SET BY BUILDER QUESTION.\r
+IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+       PUSHJ PDP,DECIN\r
+       JRST ONCE4A\r
+       JRST ONCE4A\r
+       SKIPE TAC1              ;UNLESS HE SAID 0 LIKE IN MONGEN.\r
+       HRRM TAC1,CORLIM        ;PATCH CORLIM FOR USER CORE SIZE LIMIT\r
+                               ; IF NOT PATCHED, LEAVE COMMON'S VALUE\r
+ONCE5A:\r
+\r
+INTERNAL       FTDISK\r
+IFN FTDISK,<\r
+       PUSHJ PDP,REF           ;GO THROUGH THE REFRESH DIALOG.\r
+>\r
+\r
+QUICK:                 ;THIS IS THE SHORT-CUT EXIT TO BY-PASS MOST OF THE DIALOGUE\r
+\r
+INTERNAL       FTCHECK\r
+\r
+IFN FTCHECK,<\r
+       PUSHJ PDP,OK    ;CHECKSUM MONITOR AND SAVE THE ANSWER.\r
+>\r
+\r
+       JRST @ONCE              ;***EXIT FROM THE "ONCE-ONLY CODE"***\r
+\r
+\r
+IFN FTNDISK,<\r
+EXTERNAL OCTIN,MFDBLK,SATXWD,NUMPLK,SYSPP,REFLAG\r
+\r
+;REFRESH DIALOGUE\r
+\r
+REF:   MOVEI TAC,REF1M ;DO YOU WANT TO REFRESH?\r
+       PUSHJ PDP,YESNO\r
+       POPJ PDP,               ;NO\r
+       MOVEI TAC,REF2M ;YES, ARE YOU SURE?\r
+       PUSHJ PDP,YESNO\r
+       POPJ PDP,               ;NO\r
+REF6:                          ;YES. DO YOU WANT TO CHANGE THE LOC\r
+       MOVEI TAC,REF3M         ;OF THE MFD?\r
+       PUSHJ PDP,YESNO\r
+       JRST REF3               ;NO\r
+REF2:                  ;YES\r
+       MOVEI TAC,REF4M         ;TYPE LOGICAL DISK ADDRESS OF MFD RETR, INFO\r
+       PUSHJ PDP,ICONM\r
+       PUSHJ PDP,OPOUT\r
+\r
+       PUSHJ PDP,GETLIN\r
+       JRST REF2\r
+       IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+       PUSHJ PDP,OCTIN\r
+       JRST REF2\r
+       JRET REF2\r
+IFE    FTRC10, <\r
+       PUSH PDP,TAC1           ;IS IT A MULTIPLE OF NUMBLK?\r
+       MOVEI TAC,(TAC1)\r
+       IDIVI TAC,NUMBLK\r
+       JUMPN TAC1,REF4         ;NO\r
+       POP PDP,TAC1\r
+>\r
+       HRRZM TAC1,MFDBLK\r
+       AOS TAC1\r
+       HRRM TAC1,SATXWD\r
+REF3:\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<IFN FTRC10, <\r
+       MOVEI   TAC,REF9M       ;HOW MANY 1K BLOCKS ON THE ISK FOR SWAPPING ?\r
+       PUSHJ   PDP,ICONM\r
+       PUSHJ   PDP,OPOUT\r
+       MOVEI   TAC,^D200       ;THE DEFAULT ANSWER IS 200 DECIMAL.\r
+       MOVEM   TAC,K4SWAP\r
+       PUSHJ   PDP,GETLIN\r
+       JRST    REF3A           ;JUST A CARRIAGE RETURN INVOKES DEFAULT\r
+       IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+       PUSHJ   PDP,DECIN\r
+       JRST    REF3\r
+       JRST    REF3\r
+       CAILE   TAC1,MXK2SWP    ;ANSWER TOO BIG?\r
+       JRST    REF3            ;YES, REPEAT QUESTION\r
+       HRRZM   TAC1,K4SWAP     ;NO. SAVE THIS CRUCIAL PARAMETER.\r
+REF3A:\r
+>>\r
+\r
+       PUSHJ PDP,REFRES        ;REFRESH.\r
+       JRST REF5               ;ERROR\r
+\r
+       MOVEI TAC,REF6M         ;REFRESHING SUCCESSFULLY COMPLETED !\r
+       PUSHJ PDP,ICONM\r
+       PUSHJ PDP,OPOUT         ;TYPE "REFRESHED !"\r
+\r
+       MOVE    TAC,SYSPP\r
+       MOVEM   TAC,REFLAG      ;TO PERMIT AUTOMATIC LOG-IN UNDER\r
+                               ; PROJ-PROG NUMBER [1,1] EVEN\r
+       MOVEI   TAC,REF8M       ; THOUGH THE LOG-IN CUSP IS CLEARLY NOT\r
+       PUSHJ   PDP,ICONM       ; ON THE NEWLY REFRESHED DISK.\r
+       PUSHJ   PDP,OPOUT\r
+       POPJ PDP,\r
+\r
+IFE    FTRC10, <\r
+REF4:  POP PDP,TAC1\r
+       MOVEI TAC,REF5M\r
+       PUSHJ PDP,ICONM\r
+       PUSHJ PDP,OPOUT\r
+       JRST REF2\r
+>\r
+\r
+REF5:  PUSH PDP,TAC            ;ERROR. ON COMMING HERE, TAC HAS LOGICAL BLOCK\r
+                               ; NUMBER WHICH COULD NOT BE WRITTEN\r
+       MOVEI TAC,REF7M\r
+       PUSHJ PDP,IOCONM\r
+       POP PDP,TAC\r
+       PUSHJ PDP,OCTPNT\r
+       PUSHJ PDP,CRLF\r
+       PUSHJ PDP,OPOUT\r
+       JRST REF6               ;GO BACK TO TRY AGAIN.,\r
+\r
+REF1M: ASCIZ /DO YOU WANT TO REFRESH THE DISK ? (Y OR CR)\r
+/\r
+REF2M: ASCIZ /ARE YOU SURE(Y OR CR)?\r
+/\r
+REF3M: ASCIZ /DO YOU WANT TO CHANGE THE LOCATION OF THE MFD(Y OR CR)?\r
+/\r
+REF4M: ASCIZ /TYPE THE LOGICAL DISK ADDRESS OF THE MFT RETREIVAL INFORMATION\r
+/\r
+IFE    FTRC10, <\r
+REF5M: ASCIZ /MUST BE A MULTIPLE OF NUMBLK.\r
+/\r
+>\r
+REF6M: ASCIZ /REFRESHED !\r
+/\r
+REF7M: ASCIZ /ERROR WHILE WRITING BLOCK /\r
+REF8M: ASCIZ   /TO AUTOMATICALLY LOG-IN UNDER [1,1], TYPE "LOGIN"\r
+/\r
+IFN    FTRC10, <\r
+REF9M: ASCIZ   /HOW MANY (DECIMAL) 1K DISK BLOCKS ARE TO BE ALLOCATED FOR SWAPPING ?\r
+/\r
+>\r
+>              ;THIS CLOSES AN FTDISK CONDITIONAL SERVAL PAGES BACK.\r
+\r
+;ROUTINE TO READ A LINE FROM OPERATORS CONSOLE\r
+;CALL: PUSHJ PDP,GETLIN\r
+;      JUST A CR TYPED IN\r
+;      A LINE TYPED IN,TAC SEYT AS BYTE POINTER\r
+\r
+CHREC=TEM              ;CHAR TO TYPE OUT (MUST BE SAME AS SCNSER ROUTINE)\r
+LINE=TAC1              ;TTY LINE NO. (ALSO SAME AS SCNSER)\r
+\r
+IFN FTTTYSER,<EXTERN TSETBF,SETBFI,SCNDDB,DCPUTR,PUTCHI>\r
+\r
+EXTNERAL       CPOPJ\r
+\r
+GETLIN:        IFE FTTTYSER,<MOVE TAC,LINEP>\r
+       IFN FTTTYSER,< PUSHJ PDP,SETBFI>\r
+       SETZB ITEM,CHREC\r
+GET1:  PUSHJ PDP,TYI\r
+       DATAI TTY,CHREC\r
+       ANDI CHREC,177\r
+       CAIN CHREC,177          ;RUBOUT?\r
+       JRST DELETE\r
+       CAIN    CHREC,33                ;ALTMODE ?\r
+       JRST    GETLN1          ;YES\r
+       CAIE    CHREC,175       ;VARIATION OF ALT-MODE ?\r
+       CAIN    CHREC,176       ;OR YET THIS THIRD VARIATION ?\r
+       JRST    GETLN1          ;YES\r
+GET2:  PUSHJ PDP,TYO           ;ECHO CHARACTER\r
+       CAIL    CHREC,140       ;IS THIS LOWER CASE?\r
+       TRZ     CHREC,40                ;YES,MAKE IT UPPER CASE\r
+IFE FTTTYSER,<IDPB CHREC,TAC>\r
+IFN FTTTYSER,<PUSHJ PDP,PUTCHI ;STORE CHARACTER\r
+       JFCL            ;IGNORE ERROR RETURN\r
+>\r
+       CAIE CHREC,15\r
+       AOJA ITEM,GET1\r
+       MOVEI CHREC,12          ;OUTPUT LF\r
+       PUSHJ PDP,TYO           ;TYPE OUT\r
+IFE FTTTYSER,<  MOVE TAC,LINEP         ;RESET BYTE POINTER>\r
+       JUMPN ITEM,CPOPJ1       ;NULL LINE?\r
+       POPJ PDP,               ;YES, DON'T SKIP RETURN\r
+\r
+DELETE:        IFN FTTTYSER,< PUSHJ PDP,DCPUTR\r
+       JRST DELET1>\r
+IFE FTTTYSER,<\r
+       JUMPE ITEM,DELET1       ;AT BEGINNING OF LINE?>\r
+       ADD TAC,[XWD 070000,0]  ;NO, BACK UP BYTE POINTER\r
+       TLNE TAC,400000         ;FINISHED THIS WORD YET?\r
+       ADD TAC,[XWD 347777,-1] ;YES, BACK UP ADDRESS>\r
+       MOVEI CHREC,134\r
+       PUSHJ PDP,TYO\r
+       SOJA ITEM,GET1\r
+\r
+DELET1:        MOVEI CHREC,15\r
+       PUSHJ PDP,TYO\r
+       MOVEI CHREC,12\r
+       PUSHJ PDP,TYO\r
+       JRST GETLIN\r
+\r
+GETLN1:        SETOM   ITEM            ;MECHANISM USED TO BY-PASS PART OF DIALOGUE\r
+       MOVEI   CHREC,15                ;WHEN ALTMODEIS TYPED.\r
+       JRST    GET2\r
+\r
+;ROUTINE TO TYPE A LINE ON OPERATOR CONSOLE\r
+;ECHO CHECK STOPS LINE AND RETURNS\r
+;CALL:  DAT SET TO END OF MESSAGE\r
+\r
+IFN FTTTYSER,<EXTERNAL CPOPJ>\r
+\r
+OPOUT: IFE FTTTYSER,<MOVE TAC,LINEP>\r
+       IFN FTTTYSER,<MOVEI DAT,TTOBUF(DEVDAT)>\r
+       CONO TTY,1000           ;CLEAR INPUT\r
+OPOUT1:        IFE FTTYSER,<\r
+       CAMN TAC,DAT\r
+       POPJ PDP,>\r
+       CONSZ TTY,40\r
+       JRST OPOUT2             ;ECHO CHECK\r
+       MEXTC\r
+IFN FTTTYSER,< JUMPE CHREC,CPOPJ>\r
+       PUSHJ PDP,TYO\r
+       JRST OPOUT1\r
+\r
+OPOUT2:        MOVEI CHREC,15\r
+       PUSHJ PDP,TYO\r
+       MOVEI CHREC,12\r
+       PUSHJ PDP,TYO\r
+       CONO TTY,1000           ;CLEAR INPUT\r
+\r
+;WAIT TILL OUTPUT BUSY OFF BEFORE TYPING OUT CHAR.\r
+\r
+EXTERNAL TCONLN,TYPL\r
+\r
+TYO:   PUSHJ PDP,APRCHK        ;CHECK CLOCK\r
+       CONSZ TTY,20\r
+       JRST TYO\r
+       PUSH PDP,TAC\r
+       PUSH PDP,LINE\r
+       MOVE TAC,CHREC\r
+       IMULI TAC,200401\r
+       AND TAC,[OCT 11111111]\r
+       IMUL TAC,[OCT 11111111]\r
+       TLNE TAC,10\r
+       TRO CHREC,200\r
+       DATAO TTY,CHREC\r
+       TRZ CHREC,200\r
+       POP PDP,LINE\r
+       POP PDP,TAC\r
+       POPJ PDP,\r
+\r
+;WAIT TIL INPUT DONE ONE BEFORE RETURNING WITH NEXT CHAR.\r
+\r
+TYI:   PUSHJ PDP,APRCHK\r
+       CONSO TTY,40\r
+       JRST TYI\r
+       POPJ PDP,\r
+\r
+;CHECK APR FOR CLOCK FLAG SO TIME USER TYPES IN WILL BE ACCURATE\r
+\r
+APRCHK:        CONSO APR,1000          ;IS CLOCK FLAG ON?\r
+       POPJ PDP,               ;NO\r
+       CONO APR,1000           ;YES, CLEAR CLOCK FLAG\r
+       AOS TIME                ;INCREMENT TIME\r
+       POPJ PDP,\r
+\r
+ICONM: PUSH    PDP,TAC\r
+       SETTTYO ;INITIALIZE LINE BUFFER\r
+       POP     PDP,TAC\r
+       JRST    CONMES  ;OUTPUT MESSAGE\r
+\r
+IFN FTTTYSER,<\r
+OTSET: MOVEI   DEVDAT,SCNDDB\r
+       MOVSI   TEM,120 ;TTYCHR\r
+       HRRI    TEM,TIBF(DEVDAT)\r
+       MOVEM   TEM,TTIBUF(DEVDAT)      ;INIT INPUT POINTER\r
+       HRRI    TEM,TDBF(DEVDAT)        ;AND OUTPUT POINTER\r
+       MOVEM   TEM,TTOBUF(DEVDAT)\r
+       JRST    TSETBF          ;NOW CLEAR THE BUFFERS\r
+>\r
+\r
+YESNO: PUSHJ   PDP,ICONM       ;FIRST OUTPUT THE QUESTION\r
+       PUSHJ   PDP,OPOUT\r
+       PUSHJ   PDP,GETLIN      ;NOW GET RESPONSE\r
+       POPJ    PDP,0   ;JUST A C-R\r
+       NEXTC\r
+       TRZ     CHREC,40        ;FIRST CHAR OF RESPONSE (U.C.)\r
+       CAIN    CHREC,"Y"       ;WAS IT A Y?\r
+       AOS     0(PDP)  ;YES, SKIP\r
+       POPJ    PDP,    ;NO. MAYBE IT WAS "N", SO DONT SKIP\r
+\r
+;CONSTANTS AND PUSH DOWN LIST\r
+\r
+ONCEPN=20\r
+ONCEPD:        BLOCK ONCEPN            ;PUSH DOWN LIST\r
+\r
+LINEP: POINT 7,LINBUF          ;INPUT AND OUTPUT LINE BUFFERE\r
+LINBUF:        BLOCK 30\r
+\r
+;MESSAGES\r
+\r
+TSEXEC:        ASCIZ /MONITOR JUST LOADED\r
+/\r
+TODATE:        ASCIZ /\r
+TYPE TODAY'S DATE AS MM-DD-YY\r
+/\r
+\r
+TIMEM: ASCIZ /\r
+TYPE TIME AS HHMM\r
+/\r
+IOCONF:        ASCIZ /\r
+IO CONFIGURATION\r
+/\r
+OPRM:  ASCIZ /\r
+TYPE NAME OF OPR CONSOLE.\r
+/\r
+SYSM:  ASCIZ /\r
+DO YOU WANT SYSMAK (TYPE Y IF YES, CR IF NO)?\r
+/\r
+SYSDM: ASCIZ /\r
+EXEC DDT?\r
+/\r
+EXECIS:        ASCIZ /\r
+EXEC IS /\r
+LENGTH: ASCIZ / OCTAL LOCATIONS LONG.\r
+/\r
+MXKMES:        ASCIZ /MAX K CORE FOR SINGLE USER IS /\r
+DESMES: ASCIZ /TYPE DESIRED MAX,(DEC), CR IF OK AS IS\r
+/\r
+CRLFMS:        ASCIZ /\r
+/\r
+\r
+\r
+;INITIALIZE SAT SEARCH ENTRIES\r
+\r
+;THIS "DFWUNS" ROUTINE IS CALLED BY MANDATORY ONCE ONLY CODE(LINKSR)\r
+;  AFTER ALL MULTIPLE DEVICE DATA BLOCKS HAVE BEEN GENERATED IN CORE\r
+;  ABOVE C(SYSSIZ)( AND SYSSIZ HAS BEEN INCREMENTED)\r
+;    IT IS CALLED WHETHER OR NOT THE DISK WAS REFRESHED.  IF REFRESHING WAS\r
+;  PERFORMED, DFWUNS IS CALLED AFTER REFRES SINCE SYSINI CALLS LINKSR AFTER ONCE.\r
+\r
+INTERNAL FTDISK\r
+IFN FTDISK,\r
+\r
+INTERNAL DFWUNS\r
+EXTERNAL SAT05,JSAT06,SATENT,SATPTR,SATBK2,SATXWD,SATPTR\r
+EXTERNAL SAT,SENTSZ,DSKDDB,DSKBUF,WSYNC,MQIN,MQOUT,DFGETF,SETFRE\r
+EXTERNAL WLBIT,NUMBIT,DSKCNT\r
+\r
+DFWUNS:\r
+IFN    FTRC10, <\r
+       PUSHJ   PDP,WRITLK      ;FORCE THE WRITE-LOCK SWITCH SETTINGS  TO BE ZERO.\r
+\r
+       PUSHJ   PDP,RDSTAT      ;READ VITAL DISK STATISTICS BLOCK, STORE PARAMETERS\r
+       PUSHJ   PDP,CAPCTY      ;DETERMINE CURRENT SYSTEM CAPACITY (HOW MANY DISKS).\r
+       CAMN    TAC,LBHIGH      ;HAS CAPACITY CHANGED SINCE LAST REFRESH ?\r
+       JRST    DFWNZ1          ;NO, EVERYTHING APPPEARS TO BE OKAY.\r
+       SETTTYO                 ;YES, PRINT WARNING MESSAGE...\r
+       PUSHJ   PDP,INLMES\r
+       ASCIZ   /DISK CAPACITY HAS CHANGED SINCE LAST REFRESHING.\r
+EITHER RESTORE PREVIOUS DISK CONFIGURATION OR REFRESH.\r
+/\r
+       PUSHJ   PDP,OPOUT       ;START TTY\r
+       PUSHJ   PDP,REF         ;GO THROUGH THE REFRESH DIALOGUE\r
+       JRST    DFWUNS          ;NOW TRY AGAIN.\r
+DFWNZ1:\r
+>\r
+       MOVEI TAC,SETENT\r
+       MOVEM TAC,SATPTR\r
+       MOVEI PROG,0\r
+       MOVEI DEVDAT,DSKDDB\r
+       MOVE TAC1,SATBK2\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       PUSH PDP,WSYNC\r
+       MOVE TAC,JSAT06\r
+       MOVEM TAC,WSYNC\r
+       SKIPA TAC,SATXWD\r
+\r
+;READ EACH SAT BLOCK FROM THE DISK AND SET SATENT TABLE TO MATCH INFO ON DISK.\r
+\r
+SETS1: ADDM TAC1,SATPTR\r
+SETS2: PUSH PDP,TAC\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,MQIN          ;READ A SAT BLOCK\r
+       JRST 4,SETS6            ;ERROR HALT\r
+       MOVE DAT,SATPTR         ;RESET THE ENTRY\r
+       MOVE TAC,SATBK2\r
+       MOVEM TAC,2(DAT)\r
+       MOVSI TAC1,400000\r
+       MOVEM TAC1,1(DSAT)\r
+       MOVEI DAT,0\r
+SETS3: MOVE AC1,(TAC)          ;COUNT ONE-BITS\r
+       AOJN AC1,SETS3A         ;IS THE WORD = -1?\r
+       ADDI DAT,44             ;YES\r
+       JRST SETS5\r
+\r
+SETS3A:        SOJE AC1,SETS5          ;NO, IS IT = 0?\r
+SETS4: TDNE TAC1,(TAC)         ;NO, COUNT THE BITS\r
+       ADDI DAT,1\r
+       ROT TAC1,-1\r
+       JUMPGE TAC1,SETS4\r
+\r
+SETS5: AOBJN TAC,SETS3         ;LOOP THRU ENTIRE BLOCK\r
+       HRRM DAT,@SATPTR\r
+\r
+IFE    FTRC10, <\r
+;BITS HAVE BEEN COUNTED, CHECK FOR WRITE-LOCK\r
+       CAIL DAT,NUMBIT         ;BLOCK FULL?\r
+       JRST SETS8\r
+       PUSHJ PDP,DEGETF        ;NO. GET A FREE BLOCK\r
+\r
+       PUSHJ PDP,SETS7         ;WRITE\r
+       PUSHJ PDP,SETFRE        ;FREE THE BLOCK\r
+>\r
+\r
+SETS5B:        MOVEI TAC1,SENTSZ       ;PREPARE TO BUMP SATPTR\r
+       POP PDP,TAC\r
+       AOBJN TAC,SETS1         ;DO ALL SAT BLOCKS\r
+\r
+IFE    FTRC10, <\r
+       JRST SAT05              ;RETURN\r
+>\r
+\r
+IFN    FTRC10, <\r
+       HRRZ    TAC,SATPTR\r
+SETS5X:        CAIL TAC,SATTOP\r
+       JRST    SAT05           ;EXIT FROM DFWUNS BACK TO DSKINI IN DSKSER........\r
+       ADDI    TAC,SENTSZ\r
+       MOVEI   TAC1,411000     ;ON THE NEW PDP-10 DISK SYSTEM SET THE SAT ENTRY\r
+       HRRM    TAC1,(TAC)      ; TABLE TO SHOW ALL NON-EXISTENT DISKS AS\r
+       JRST    SETS5X          ; BOTH WRITE-LOCKED AND FULL.\r
+>\r
+\r
+IFE    FTRC10, <\r
+\r
+;WRITE-LOCK DETERMINATION ON THE OLD PDP-6 (DATA PRODUCTS) DISK --\r
+\r
+SETS7: PUSH PDP,TAC            ;SAVE BLOCK ADDRESS\r
+SETS7A:        PUSHJ PDP,MQOUT\r
+       JRST SETS7C             ;ERROR\r
+SETS7B:        POP PDP,TAC\r
+       POPJ PDP,\r
+SETS7C:        MOVE TAC,(PDP)\r
+       MOVE TAC1,DSKCNT(DEVDAT)\r
+       TRNN TAC1,IOIMPM        ;WRITE LOCK?\r
+       JRST 4,SETS7A           ;NO\r
+       MOVEI TAC,WLBIT         ;YES. SET BIT\r
+       ORM TAC,@SATPTR\r
+       JRST SETS7B\r
+\r
+SETS8: MOVEI TAC,SETS9         ;BLOCK FULL, READ FIRST ONE\r
+       HRRM TAC,DSKBUF(DEVDAT)\r
+       HLRZ TAC,@SATPTR\r
+       PUSHJ PDP,MQIN\r
+       JRST 4,.-2              ;ERROR\r
+       HLRZ TAC,@SATPTR        ;WRITE IT BACK\r
+       PUSHJ PDP,SETS7\r
+       MOVEI TAC,SAT           ;RESET\r
+       HRRM TAC,DSKBUF(DEVDAT) \r
+       JRST SETS5B\r
+\r
+SETS9: BLOCK 204\r
+\r
+>              ;CLOSE THE IFE FTRC10\r
+>              ;CLOSES AN IFN FTDISK A COUPLE PAGES BACK.\r
+\r
+IFN FTDISK,<\r
+\r
+;DISK REFRESHING ROUTINES ---\r
+\r
+IFE    FTRC10, <\r
+;DISK REFRESHER FOR THE OLD PDP-6 (DATA PRODUCTS) DISK --\r
+\r
+\r
+EXTERNAL MFDBLK,NUMSAT,CHKCNT,CHKSUM,NUMBLK,DSKINI,SETSAT,DSKCHN,DSKCHL\r
+\r
+REFRESH:       MOVEI PROG,0            ;SETUP IO\r
+       MOVEI DEVDAT,DSKDDB\r
+       PUSH PDP,SETSAT\r
+       MOVE TAC,RPOPJ\r
+       MOVEM TAC,SETSET\r
+       PUSHJ PDP,DSKINI\r
+       POP PDP,SETSAT\r
+       MOVEI TAC,DSKCHN\r
+       LSH TAC,1\r
+\r
+       ADDI TAC,40\r
+       MOVE TAC1,[JSR DSKCHL]\r
+       MOVEM TAC1,(TAC)\r
+       PUSH PDP,WSYNC\r
+       MOVE TAC,JSAT06\r
+       MOVEM TAC,WSYNC\r
+\r
+;SETUP NULL SAT BLOCK\r
+\r
+       SETOM DAT\r
+       MOVE TAC1,[XWD NULBLK,NULBLK+1]\r
+       SETZM NULBLK\r
+       BLT TAC1,NULBLK+177\r
+       MOVEI TAC,NUMBLK                ;END OF BLOCK BYTE POINTER\r
+       IDIVI TAC,^D36\r
+       SUBI TAC1,^D36\r
+       MOVMS TAC1\r
+       ROT TAC1,-6\r
+       ADDI TAC,NULBLK\r
+       HLL TAC,TAC1\r
+       TLOA TAC,100\r
+       IDPB DAT,TAC\r
+       TLNE TAC,770000\r
+       JRST .-2\r
+       AOS TAC\r
+       MOVEM DAT,(TAC)\r
+       HRLS TAC\r
+       AOS TAC\r
+       BLT TAC,NULBLK+177\r
+\r
+;SET UP SAT BLOCK WITH MFD AND SAT BLOCKS ALLOCATED\r
+\r
+       MOVE TAC,[XWD NULBLK,SATBL1]\r
+       BLT TAC,SATBL1+177\r
+       MOVE TAC,[POINT 1,SATBL1]\r
+       MOVEI TAC1,NUMSAT\r
+       HRLM TAC1,SATRET+3\r
+       ADDI TAC1,3\r
+       IDPB DAT,TAC\r
+       SOJG TAC1,.-1\r
+\r
+;COMPUTE CHECKSUMS IF REQUIRED\r
+\r
+       MOVEI DAT,CHKCNT\r
+       JUMPE DAT,REFR1\r
+       MOVE TAC,[XWD -200,MFD1]\r
+       PUSHJ PDP,CHKSUM\r
+       HRLM TAC1,MFDRET+4\r
+       MOVE TAC,[XWD -200,NULBLK]\r
+       PUSHJ PDP,CHKSUM\r
+       HRLM TAC1,SATRET+4\r
+       MOVE TAC,[XWD -200,SATBL1]\r
+       PUSHJ PDP,CHKSUM\r
+       MOVE DAT,TAC1\r
+\r
+;RELOCATE POINTERS RELATIVE TO MFDBLK\r
+\r
+REFR1: MOVE TAC,MFDBLK\r
+       HRRM TAC,MFDRET+177\r
+       HRRM TAC,MFD1+1\r
+       ADDI TAC,NUMSAT\r
+       AOS TAC\r
+       HRRM TAC,SATRET+177\r
+       HRRM TAC,MFD1+3\r
+       AOS TAC\r
+       HRRM TAC,MFDRET+4\r
+       MOVNI TAC1,NUMSAT\r
+       MOVSS TAC1\r
+       HRRI TAC1,1\r
+       MOVE TAC,MFDBLK\r
+       HLL TAC,SATRET+4\r
+       HRRZM TAC1,SATRET+3(TAC1)\r
+       ADDM TAC,SATRET+3(TAC1)\r
+       AOBJN TAC1,.-2\r
+\r
+;FIX CHECKSUM FOR SATBL1\r
+\r
+       MOVE TAC,MFDBLK\r
+       IDIVI TAC,NUMBLK\r
+       HRLM DAT,SATRET+3(TAC)\r
+       MOVE DAT,TAC\r
+\r
+;WRITE BLOCKS ON DISK\r
+\r
+       MOVE TAC,MFDBLK         ;MFD RETREIVAL INFORMATION\r
+       MOVE TAC1,[XWD -200,MFDRET]\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,MQOUT\r
+       JRST REFER              ;ERROR\r
+       MOVEI TAC,1\r
+REFR2: MOVE TAC1,[XWD -200,NULBLK]     ;SAT BLOCKS\r
+       CAMN TAC,DAT\r
+       MOVE TAC1,[XWD -200,SATBL1]\r
+       PUSH PDP,TAC\r
+       ADD TAC,MFDBLK\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       PUSHJ PDP,MQOUT\r
+       JRST REFER1             ;ERROR\r
+       POP PDP,TAC\r
+       CAIGE TAC,NUMSAT\r
+       AOJA TAC,REFR2\r
+       AOS TAC                 ;SAT RETREIVAL INFORMATION\r
+       ADD TAC,MFDBLK\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+\r
+       MOVE TAC1,[XWD -200,SATRET]\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       PUSHJ PDP,MQOUT\r
+       JRST REFER              ;ERROR\r
+       MOVE TAC,MFDBLK         ;MFD\r
+       ADDI TAC,NUMSAT\r
+       ADDI TAC,2\r
+       MOVE TAC1,[XWD -200,MFD1]\r
+       MOVEM TAC1,DSKBUF(DEVDAT)\r
+       SETZB IOS,DEVIOS(DEVDAT)\r
+       PUSHJ PDP,MQOUT\r
+       JRST REFER              ;ERROR\r
+       POP PDP,WSYNC\r
+       JRST CPOPJ1\r
+\r
+REFER1:        POP PDP,TAC1\r
+REFER: POP PDP,WSYNC\r
+RPOPJ: POPJ PDP,\r
+\r
+DEFINE ZEROS (A),<XLIST\r
+       REPEAT A,<0>\r
+       LIST>\r
+\r
+DEFINE ONES (A),<XLIST\r
+       REPEAT A,<-1>\r
+       LIST>\r
+\r
+DEFINE BLOCKR (NAME,EXT,PROT,PROGX,B,F,Z),<\r
+       NAME\r
+       EXT\r
+       EXP PROT*1B8+14812\r
+       XWD 1,PROGX\r
+       EXP Z\r
+       ZEROES 172\r
+       BYTE (4) F (14) 0 (18) B >\r
+\r
+MFDRET:        BLOCKR <XWD 1,1>,<SIXBIT /UFD/>,45,1,0,4,20     ;MFD RETREIVAL INFO\r
+\r
+SATBL1:        XWD 777776,0            ;THIS SAT BLOCK CONTAINSS\r
+       ZERSO 5400/44-1         ;ALLOCATION FOR MFD AND SAT BLOCKS\r
+       XWD 001777,-1\r
+       ONES 200+SATBL1-.\r
+\r
+SATRET:        BLOCKR <SIXBIT /*SAT*/>,<SIXBIT /SYS/>,555,1,0,1,16\r
+\r
+MFD1:  XWD 1,1                 ;MFD\r
+       XWD 654644,0\r
+       SIXBIT /*SAT*/\r
+       XWD 637163,17           ;RELOCATED\r
+       ZEROS 174\r
+\r
+NULBLK:        ZEROS 5400/44-1         ;NULL SAT BLOCK\r
+       XWD 001777,-1\r
+       ONES 200+NULBLK-.\r
+\r
+>              ;END OF THE REFRESHER FOR THE OLD PDP-6 DISK.\r
+\r
+\r
+IFN    FTRC10, <\r
+\r
+;DISK REFRESHER FOR THE NEW PDP-10 MODEL RC-10 (BURROUGHS) DISK--\r
+\r
+       EXTERNAL        CPOPJ1,THSDAT,TIME\r
+       EXTERNAL        MFDBLK,SATXWD,NUMSAT,NUMBLK,SATTOP,SENTSZ\r
+       EXTERNAL        DISKUP,DFREF,DFWRT,DSKFDG,CHKSUM,RCXCCW,RCXFIN\r
+       EXTERNAL        K4SWAP\r
+IFN FTSWAP,<\r
+       EXTNERAL        MAXSWP,MXK2SWP,BLKSPK\r
+>\r
+EXTERNAL LBHIGH\r
+       INTERNAL        STATBK\r
+\r
+STATBK=1       ;FIXED LOGICAL BLOCK NUMBER FOR THE "VITAL\r
+               ;  STATISTICS" BLOCK OF THE DISK.\r
+DSK=170                ;DEFINE DEVICE NUMBER OF THE MODEL RC-10 DISK SYNCHRONIZER.\r
+\r
+\r
+;THESE NEXT TWO PAGES ARE LIFED DIRECTLY FROM "DSKINIT" IN ORDER TO DEFINE THE\r
+;  CONO AND CONI BITS USED HERE IN "ONCE".\r
+\r
+;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  MAINTENANCE PANEL SWITCH SETTINGS INDICATORS --\r
+       ;BITS 00 - 04   UNUSED\r
+MSS=1B5                ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81),\r
+PLGSW=1B6      ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY,\r
+               ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY,\r
+               ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER\r
+               ;  DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY.\r
+       ;BITS 07 - 17   THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY.\r
+DTOP=1B18      ;SET INDICATES DATA TRANSFER IN PROGRESS.\r
+;BITS 19 -29   ERROR CONDITIONS INDICATORS (ERROR WHEN SET) --\r
+       SRCHE=1B19      ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!)\r
+       DDE=1B20        ;DISK DESIGNATION ERROR\r
+       TSE=1B21        ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY)\r
+       MRDY=1B22       ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED)\r
+       PSF=1B23        ;POWER SUPPLY FAILURE\r
+       DPAR=1B24       ;DISK PARITY ERROR\r
+       CHDPAR=1B25     ;CHANNEL DATA PARITY ERROR\r
+       CHCPAR=1B26     ;CHANNEL CONTROL PARITY ERROR\r
+       NXMEM=1B27      ;NON-EXISTENT MEMORY REFERENCED\r
+       WRPE=1B28       ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17)\r
+       OVR=1B29        ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH\r
+;BIT  30       CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS\r
+               ;TURNED ON ON ALMOST ALL TERMINATIONS.)\r
+BUSYRT=1B31    ;BUSY (SYNCHRONIZER PERFORMING A COMMAND  SEQUENCE)\r
+DONEFLG=1B32   ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT.\r
+;BITS 33 - 35  PI CHANNEL SELECTION BITS.\r
+\r
+;COMBINATIONS OF ERRO BITS GROUPED BY TYPE --\r
+DATERR=DPAR!CHDPAR             ;DATA ERRORS.\r
+DEVERR=SRCHE!PSF!CHCPAR!OVR    ;DEVICE ERRORS.\r
+SETERR=DDE!TSE!NRDY!NXMEM      ;SOFTWARE-PREVENTABLE ERRORS.\r
+\r
+\r
+;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER\r
+\r
+;BITS 00 - 17  UNUSED\r
+;BITS 18 - 19  SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35)\r
+;BITS 20 - 29  RESET THE CORRESPONDING CONI ERROR BIT\r
+               ;(BUT PSE MAY REFUSE TO BE RESET)\r
+WRCCWD=1B30    ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!)\r
+STPBIT=1B31    ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL.\r
+RESETB=1B32    ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT\r
+;BITS 33 - 35  PI CHANNEL SELECTION BITS\r
+\r
+;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  UNUSED\r
+;BITS 18 - 23  PARITY REGISTER\r
+;BITS 24 - 25  UNUSED\r
+;BITS 26 - 27  DISK SELECTED BY BITS 18-19 OF LAST CONO\r
+;BITS 28 - 35  CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!)\r
+\r
+;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17  DISK ADDRESS ELECTION\r
+       ;BITS 00 - 01   DISK SELECT\r
+       ;BITS 02 - 10   TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT)\r
+       ;BITS 11 - 17   SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS)\r
+;BITS 18 - 23  INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS)\r
+DDSKPE=1B24    ;DISABLE DISK PARITY ERROR STOP\r
+DCHNPE=1B25    ;DISABLE CHANNEL DATA PARITY ERROR STOP\r
+WRBIT=1B16     ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK\r
+;BITS 27 - 34  ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE,\r
+               ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY!\r
+;BIT 35                ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!)\r
+\r
+\r
+REFRESH:\r
+       PUSHJ   PDP,DISKUP      ;BE SURE THE DISK IS UP AND READY.\r
+       PUSHJ   PDP,WRITLK      ;BE SURE WRITE-LOCK SWITCHES ARE OFF.\r
+       PUSHJ   PDP,CAPCTY      ;DETERMINE THE CURRENT DISK CAPACITY OF THE\r
+                               ; SYSTEM, I.E. HOW MANY DISKS ARE ATTACHED TODAY ?\r
+       MOVEM   TAC,LBHIGH      ;STORE HIGHEST LEGAL LOGICAL BLOCK NUMBER\r
+       AOS     TAC\r
+IFN FTSWAP,<\r
+       MOVE    TAC1,K4SWAP\r
+       LSH     TAC1,BLKSPK     ;COMPUTE AND SAVE THE LOWEST LOGICAL BLOCK\r
+       SUBM    TAC,TAC1        ; NUMBER RESERVED FOR SWAPPING.\r
+       MOVEM   TAC1,LOWSWP\r
+       CAIG    TAC1,STATBK     ;SWAPPING AREA MUST NOT OVERLAY THE\r
+       JRST    RFRSHE          ; VITAL STATISTICS BLOCK.\r
+>\r
+       IDIVI   TAC1,NUMBLK\r
+       MOVN    TAC1,TAC        ;SET SATXWD TO SHOW ONLY THE NUMBER OF\r
+       HRLM    TAC1,SATXWD     ; SAT BLOCKS ACTUALLY IN EXISTENCE.\r
+       HRRZ    TAC1,MFDBLK\r
+       ADDI    TAC,2(TAC1)\r
+IFN FTSWAP,<\r
+       CAML            TAC,LOWSWP      ;MAKE VARIOUS CONSISTENCY CHECK TO DETERMINE\r
+       JRST    RFRSHE          ; THAT THE DISK PARAMETERS SPECIFIED DURING THE\r
+>\r
+       CAIG    TAC1,STATBK     ; ONCE-ONLY DIALOGUE DO NOT CAUS THE DISK\r
+       CAIGE   TAC,STATBK      ; SWAPPING AREA, VITAL STATISTICS BLOCK, AND/OR\r
+       JRST    RFRSH1          ; THE MFD AND SAT BLOCK TO OVERLAP ONE ANOTHER.\r
+RFRSHE:        MOVEI   TAC,RFSHME\r
+                               ;IF THERE IS SOME OVERLAPPING OF\r
+       PUSHJ   PDP,IOCON       ; THESE DISK STORAGE AREAS, PRING AN\r
+       PUSHJ   PDP,OPOUT       ; ERROR MESSAGE AND THEN GO BACK TO THE\r
+       POP     PDP,TAC         ; DIALOGUE TO AK THE PARAMETER SPECIFICATION\r
+       JRST    REF6            ; QUESTIONS AGAIN.\r
+\r
+RFSHME:        ACSIZ   /PARAMETER SPECIFICATION ERROR. TRY AGAIN.\r
+/\r
+\r
+RFRSH1:        PUSHJ   PDP,WRSTAT      ;WRITE OUT THE VITAL STATISTICS BLOCK ON THE DISK.\r
+       JRST    REFERR          ; AN ERROR ON THIS WRITE IS BAD TROUBLE !!\r
+\r
+;NEXT WRITE THE MFD (MASTER FILE DIRECTORY) ONTO THE DISK\r
+\r
+       PUSHJ   PDP,WNZCLR      ;CLEAR THE OUTPUT BUFFER\r
+       MOVE    TAC,[XWD 1,1]   ;THE FIRST ENTRY IN THE MFD IS FOR\r
+       MOVEM   TAC,WNZBUF      ; THE MFD ITSELF.\r
+       MOVE    TAC,[SIXBIT/UFD/]\r
+       HRR     TC,MFDBLK       ;POINTER TO MFD RETRIEVAL INFORMATION\r
+       MOVEM   TAC,WNZBUF+1\r
+       MOVE    TAC,[SIXBIT/*SAT*/]     ;THE ONLY OTHER ENTRY INITIALLY IN THE\r
+       MOVEM   TAC,WNZBUF+2            ; MFD IS FOR THE FILE NAMED *SAT*.SYS WHICH\r
+       HLRZ    TAC1,SATXWD             ; PERMITS ACCESS TO THE SAT BLOCKS FOR\r
+       HRRZ    TAC,MFDBLK              ; ANYONE WHO WANTS TO LOOK AT THEM.\r
+       SUBI    TAC,-1(TAC1)    ;COMPUTE POINTER TO THE RETRIEVAL INFORMATION\r
+       HLL     TAC,[SIXBIT/SYS/]       ; FOR THE *SAT*.SYS FILE.\r
+       MOVEM   TAC,WNZBYUF+3\r
+       HRRZS   TAC\r
+       ADDI    TAC,1           ;COMPUTE LOGICAL BLOCK NUMBER OF THE MFD.\r
+       PUSHJ   PDP,WNZWR       ;WRITE THE MFD OUT ONTO THE DISK.\r
+       \r
+       JRST    REFERR          ;ERROR\r
+\r
+       MOVE    TAC,[XWD -200,WNZBUF]\r
+       PUSHJ   PDP,CHKSUM\r
+       HRRZM   TAC1,CHKSAV     ;SAVE CHECKSUM TO GO INTO RETRIEVAL INFORMATION.\r
+\r
+;NEXT WRITE MFD RETRIEVAL INFORMATION BLOCK ONTO THE DISK\r
+\r
+       PUSHJ   PDP,WNZCLR      ;CLEAR OUTPUT BUFFER\r
+       MOVE    TAC,[XWD 1,1]\r
+       MOVEM   TAC,WNZBUF      ;FILE NAME\r
+       HRRZ    TAC,THSDAT\r
+       HLL     TAC,[SIXBIT /UFD/]\r
+       MOVEM   TAC,WNZBUF+1    ;FILE EXTENSION, DATE\r
+       HRLZI   TAC,045000      ;PROTECTION (ANY PROJECT 1 USER MAY WRITE IN MFD)\r
+       PUSHJ   PDP,MDTMDT      ;FILL IN TIME, DATE, AND MODE\r
+       MOVEM   TAC,WNZBUF+2\r
+       MOVE    TAC,[XWD -200,1]        ;NEGATIVE WORD COUNT AND PROGRAMMER NUMBER\r
+       MOVEM   TAC,WNZBUF+3    ;GO INTO WORD 4 OF RETRIEVAL INFO\r
+       HLRZ    TAC1,SATXWD\r
+       MOVE    TAC,MFDBLK\r
+       SUBI    TAC,-2(TAC1)    ;COMPUTE POINTER TO THE MFD.\r
+       HRL     TAC,CHKSAV      ;RETRIEVE SAVED CHECKSUM OF MFD.\r
+       MOVEM   TAC,WNZBUF+4\r
+       MOVE    TAC,MFDBLK      ;THE LAST WORD OF ANY BLOCK OF RETRIEVAL INFORMATION\r
+       MOVEM   TAC,WNZBUF+177  ; MUST CONTAIN ITS OWN BLOCK NUMBER.\r
+       PUSHJ   PDP,WNZWR       ;WRITE MFD RETRIEVAL INFOMRATION ONTO THE  DISK\r
+       JRST    REFERR          ;ERROR\r
+\r
+;NEXT CREATE THE NECESSARY SAT BLOCKS ON THE DISK\r
+\r
+       PUSH    PDP,SATXWD      ;SATXWD CONTROLS THE OUTER LOOP\r
+       MOVEI   TAC,SATENT      ;SET UP SATPTR TO SHUFFLE THROUGH THE BLOCKS\r
+\r
+REFST1:        MOVEM   TAC,SATPTR\r
+       PUSHJ   PDP,WNZCLR      ;CLEAR THE BUFFER\r
+       MOVEI   TAC1,NUMBIT\r
+       SUBI    TAC1,NUMBLK\r
+       MOVEI   TAC,NUMBLK\r
+       PUSHJ   PDP,SETWNZ      ;MARK UNAVAILABLE BITS AT END OF THE BLOCK\r
+IFN FTSWAP,<\r
+       HLRZ    TAC1,@SATPTR    ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK\r
+       CAMGE   TAC1,LOWSWP     ;IS ENTIRE BLOCK WITHIN SWAPPING AREA?\r
+       JRST    REFST2          ;NO, JUMP AHEAD\r
+       MOVEI   TAC1,NUMBIT     ;YES, MARK IT ALL OFF LIMITS\r
+       MOVEI   TAC,0\r
+       PUSHJ   PDP,SETWNZ\r
+       JRST    REFST7          ;HAVING SET ALL BITS, NO FURTHER TESTING IS NEEDED,\r
+>\r
+REFST2:        MOVN    TAC,TAC1\r
+       ADDI    TAC1,NUMBLK\r
+       SUB     TAC1,LOWSWP     ;IS ANY OF SWAPPING AREA WITHIN THIS SAT BLOCK?\r
+       JUMPLE  TAC1,REFST3     ;NO, JUMP AHEAD\r
+       ADD     TAC,LOWSWP      ;YES, MARK SWAPPING AREA AS UNAVAILABLE.\r
+       PUSHJ   PDP,SETWNZ\r
+>\r
+REFST3:        HLRZ    TAC1,@SATPTR    ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK.\r
+       JUMPN   TAC1,RFST3A     ;ONLY FOR FIRST SAT BLOCK--\r
+       HRLZI   TAC,400000      ;MARK LOGICAL BLOCK 0 AS BEING IN USE.\r
+       IORM    TAC,WNZBUF\r
+RFST3A:        HRRZI   TAC,STATBK\r
+       CAIL    TAC,(TAC1)      ;IS THE VITAL STATISTICS BLOCK WITHIN\r
+       CAIL    TAC,NUMBLK(TAC1)        ; THE RANGE OF THIS SAT BLOCK ?\r
+       JRST    REFST4          ;NO, JUMP AHEAD\r
+       SUB     TAC,TAC1\r
+       MOVEI   TAC1,1          ;YES, MARK IT UNAVAILABLE,\r
+       PUSHJ   PDP,SETWNZ\r
+\r
+REFST4:        MOVE    TAC,SATXWD      ;SET UP TO LOOP THRU LOGICAL BLOCK NUMBERS FOR MFD.\r
+       SUB     TAC,[XWD 3,1]   ; MFD RETRVL INFO. SAT BLOCKS, AND SAT RETRVL INFO.\r
+\r
+REFST5:        PUSH    PDP,TAC\r
+       HRRZS   TAC\r
+       HLRZ    TAC1,@SATPTR\r
+       CAIL    TAC,(TAC1)      ;IS THE INDICATED LOGICAL BLOCK NUMBER WITHIN\r
+       CAIL    TAC,NUMBLK(TAC1)        ; THIS PARTICULAR SAT BLOCK ?\r
+       JRST    REFST6          ;NO, JUMP AHEAD\r
+       SUB     TAC,TAC1\r
+       MOVEI   TAC1,1          ;YES, MARK IN-USE BIT.\r
+       PUSHJ   PDP,SETWNZ\r
+\r
+REFST6:        POP     PDP,TAC         ;LOOP THROUGH THE WHOLE SET OF SPECIAL BLOCKS\r
+       AOBJN   TAC,REFST5      ; WHICH MUST BE MARKED UNAVAILABLE.\r
+\r
+REFST7:        MOVE    TAC,[XWD -200,WNZBUF]\r
+\r
+       PUSHJ   PDP,CHKSUM      ;COMPUTE CHECKSUM\r
+       MOVE    TAC,SATPTR\r
+       HRRZM   TAC1,1(TAC)     ;STORE IT TEMPORARILY IN THE SATENT TABLE.\r
+\r
+       HRRZ    TAC,(PDP)       ;LOGICAL BLOCK NUMBER TO BE WRITTEN\r
+       PUSHJ   PDP,WNZWR       ;WRITE THIS SAT BLOCK ONTO THE DISK\r
+       JRST    REFER1          ;ERROR\r
+\r
+       POP     PDP,TAC\r
+       AOBJN   TAC,.+2         ;LAST SAT BLOCK WRITTEN ?\r
+\r
+       JRST    REFSRF          ;YES, GO WRITE SAT RETRIEVAL INFORMATION.\r
+\r
+       PUSH    PDP,TAC         ;NO, ADVANCE SATPTR AND LOOP\r
+       MOVE    TAC,SATPTR      ; BACK TO DO NEXT SAT BLOCK.\r
+       ADDI    TAC,SENTSZ\r
+       JRST    REFST1\r
+\r
+;FINALLY, WRITE OUT THE RETRIEVAL INFORMATION FOR THE FILE *SAT*.SYS\r
+\r
+REFSRF:        PUSHJ   PDP,WNZCLR      ;CLEAR THE BUFFER\r
+       MOVE    TAC,[SIXBIT /*SAT*/]\r
+       MOVEM   TAC,WNZBUF      ;STORE FILE NAME\r
+       HRRZ    TAC,THSDAT\r
+       HLL     TAC,[SIXBIT /SYS/]\r
+       MOVEM   TAC,WNZBUF+1    ;STORE EXTENSION AND DATE\r
+       HRLZI   TAC,555000      ;PROTECTION CODE (UNTOUCHABLE FILE ! )\r
+       PUSHJ   PDP.MDTMDT      ;FILL IN TIME, DATE AND MODE\r
+       MOVEM   TAC,WNZBUF+2\r
+       HLLZ    TAC,SATXWD      ;COMPUTE NEGATIVE WORD COUNT\r
+       LSH     TAC,7\r
+       HRRI    TAC,1           ;PROGRAMMER NUMBER=1\r
+       MOVEM   TAC,WNZBUF+3\r
+\r
+       MOVEI   TAC,SATENT      ;PREPARE TO STORE POINTERS TO ALL THE SAT BLOCKS.\r
+       MOVE    TAC1,SATXWD\r
+       MOVEI   AC2,0\r
+\r
+REFSRL:        HRRZ    AC1,TAC1        ;GET LOGICAL BLOCK NUMBER OF SAT BLOCK.\r
+       HRL     AC1,1(TAC)      ;RETRIEVE THE CORRESPONDING CHECK-SUM.\r
+       MOVEM   AC1,WNZBUF+4(AC2)       ;STORE A POINTER WORD IN THE BUFFER.\r
+       MOVSI   AC1,400000      ;RESTORE SATENT ENTRY TO CORRECT INITIAL VALUE.\r
+       MOVEM   AC1,1(TAC)\r
+       AOS     AC2\r
+       ADDI    TAC,SENTSZ\r
+       AOBJN   TAC1,REFSRL     ;IS THAT ALL THE POINTERS ?  IF NOT, LOOP BACK.\r
+\r
+       MOVE    TAC,MFDBLK      ;YES.\r
+       ADDI    TAC,1(AC2)      ;NOW COMPUTE LOGICAL BLOCK NUMBER OF THIS SAT\r
+       MOVEM   TAC,WNZBUF+177          ; RETRIEVAL INFORMATION, AND STORE IT IN\r
+                                       ; THE LAST WORD OF THE BLOCK (THIS IS\r
+                                       ; REQUIRED FORMAT OF ALL RETRVL INFO).\r
+\r
+       PUSHJ   PDP,WNZWR       ;WRITE THE *SAT*.SYS RETRVL INFO ONTO THE DISK.\r
+       JRST    REFERR          ;ERROR\r
+\r
+       JRST    CPOPJ1          ;***EXIT FROM PDP-10 DISK REFRESHER.***.........\r
+\r
+\r
+;ROUTINE TO WRITE THE FIXED BLOCK OF VITAL STATISTICS ONTO THE DISK.\r
+\r
+WRSTAT:        PUSHJ   PDPWNZCLR               ;CLEAR THE OUTPUT BUFFER\r
+       MOVE    TAC,[XWD -WRSTSZ,0]\r
+WRSTA1:        MOVE    TAC1,@WRSTA9(TAC)       ;STORE KEY QUANTITIES IN THE OUTPUT BUFFER\r
+       MOVEM   TAC1,WNZBUF(TAC)\r
+       AOBJN   TAC,WRSTA1\r
+\r
+       MOVE    TAC,[SIXBIT/STATBK/]    ;STORE AN IDENTIFIER NEAR THE \r
+       MOVEM   TAC,WNZBUF+^D126        ; END OF THE VITAL STATISTICS BLOCK.\r
+\r
+       MOVEI   TAC,STATBK\r
+       PUSHJ   PDP,WNZWR       ;WRITE THIS VITAL STATISTICS BLOCK ONTO THE DISK.\r
+       JRST    WRSTA2          ;WRITE ERROR\r
+       JRST    CPOPJ1          ;GOOD WRITE.    ***SUBROUTINE EXIT***...........\r
+\r
+\r
+WRSTA2:        MOVEI   TAC,WRSTM1\r
+       PUSHJ   PDP,ICONM       ;PRINT ERROR MESSAGE IF THIS VITAL WRITE FAILS.\r
+       PUSHJ   PDP,OPOUT\r
+       POPJ    PDP,            ;THEN ALSO GIVE AN ERROR RETURN FOR FURTHER ACTION.\r
+\r
+WRSTM1:        ASCIZ   /CANNOT WRITE VITAL STATISTICS BLOCK ON DISK.   HELP!!\r
+/\r
+\r
+;TABLE OF POINTERS TO THE VITAL STATISTICS THAT ARE STORED IN "STATBK" ON THE DISK.\r
+\r
+WRSTA9:        XWD     ,MFDBLK         ;LOGICAL BLOCK NUMBER OF MFD RETRIEVAL INFORMATION\r
+       XWD     ,SATXWD         ;LH = - NUMBER OF SAT BLOCKS ACTUALLY IN EXISTENCE.\r
+                               ;RH = LOGICAL BLOCK NUMBER OF FIRST SAT BLOCK\r
+       XWD     ,LBHIGH         ;HIGHEST LEGAL LOGICAL BLOCK NUMBER ON DISK(S)\r
+       XWD     ,LOWSWP         ;LOWEST LOGICAL BLOCK NUMBER ALLOCATED FOR SWAPPING\r
+       XWD     ,K4SWAP         ;NUMBER OF 1K BLOCKS OF DISK SPACE FOR SWAPPING\r
+IFN FTSWAP,<\r
+       XWD     ,MAXSWP         ;MAXIMUM NUMBER OF THOSE 1K BLOCKS ACTUALLY\r
+                               ; USED SINCE THE DISK WAS LAST REFRESHED.\r
+>\r
+IFE FTSWAP,<\r
+       XWD     0,LOWSWP        ;LOWSWP DOES DOUBLE DUMMY DUTY IN\r
+                               ; NON-SWAPPING SYSTEM\r
+>\r
+       WRSTSZ=.-WRSTA9\r
+\r
+;ROUTINE TO READ IN THE FIXED BLOCK OF "VITAL STATISTICS" FROM\r
+;  THE DISK AND DISTRUBUTE THEM TO THE APPROPRIATE CORE LOCATIONS.\r
+\r
+RDSTAT:        MOVEI   TAC,STATBK\r
+       PUSHJ   PDP,WNZRD       ;READ IN THE VITAL STATISTICS BLOCK.\r
+       JRST    RDSTA2          ;ERROR\r
+       MOVE    TAC,WNZBUF+^D126                ;CHECK THE IDENTIFIER TO VERIFY THAT\r
+       CAME    TAC,[SIXBIT     /STATBK/]       ; THE CORRECT BLOCK WAS READ.\r
+       JRST    RDSTA2          ;ERROR, STATISTICS BLOCK APPARENTLY WAS CLOBBERED.\r
+\r
+       MOVE    TAC,[XWD -WRSTSZ,0]     ;STORE AWAY THESE IMPORTANT PARAMETERS\r
+RDSTA1;        MOVE    TAC1,WNZBUF(TAC)        ; UNDER CONTROL OF A TABLE IN THE "WRSTAT"\r
+       MOVEM   TAC1,@WRSTA9(TAC)       ; ROUTINE WHICH WRITES OUT THE VITAL\r
+       AOBJN   TAC,RDSTA1              ; STATISTICS BLOCK ONTO THE DISK.\r
+\r
+       POPJ    PDP,            ;***SUBROUTINE EXIT***........\r
+\r
+RDSTA2:        MOVEI   TAC,RDTM1\r
+                               ;PRINT ERROR MESSAGE IF THE VITAL\r
+       PUSHJ   PDP,ICONM       ; STATISTICS BLOCK CANNOT BE READ\r
+       PUSHJ   PDP,OPOUT\r
+       PUSHJ   PDP,REF         ;GO THRU THE REFRESH DIALOGUE IN "ONCE".\r
+       JRST    RDSTAT          ;NOW TRY AGAIN.\r
+\r
+RDSTM1:        ASCIZ   /VITAL DISK STATISTICS LOST, SUGGEST REFRESHING!\r
+/\r
+\r
+;ROUTINE TO DETERMINE THE CURRENT SYSTEM'S DISK CAPACITY. I.E., THE NUMBER OF\r
+;  DISKS ATTACHED TO THE RC-10 DISK SYNCHRONIZER TODAY.\r
+\r
+;ON EXIT FROM THIS SUBROUTINE\r
+;                 C(TAC) = HIGHEST LOGICAL DISK BLOCK NUMBER NOW EXTANT.\r
+\r
+CAPCTY:        MOVEI   TAC,NUMSAT\r
+       IMULI   TAC,NUMBLK      ;COMPUTE AND SAVE MAXIMUM POSSIBLE CAPACITY.\r
+       PUSH    PDP,LBHIGH      ;SAVE EXISTING VALUE OF HIGHEST LEGAL BLOCK NUMBER.\r
+       MOVEM   TAC,LBHIGH      ;TEMPORARILY CHANGE THIS VALYUE SO THAT THE VALIDITY\r
+                               ; CHECK IN "DSKINT" WILL NOT FAIL SPURIOUSLY.\r
+\r
+       MOVEI   TAC,3\r
+CPCT1; PUSH    PDP,TAC\r
+       PUSHJ   PDP,WNZRD       ;ATTEMPT TO READ FIRST BLOK OF EACH SUCCESSIVE DISK.,\r
+       JRST    CPCT3           ;ERROR\r
+       POP     PDP,TAC\r
+       ADDI    TAC,NUMBLK\r
+       CAMGE   TAC,LBHIGH      ;ALREADY TRIED ALL DISKS (MAXIMUM CAPACITY) ?\r
+       JRST    CPCT1           ;NO, GO TRY THE NEXT ONE.\r
+\r
+CPCT2: SUBI    TAC,1   \r
+       POP     PDP,LBHIGH      ;RESTORE PREVIOUSLY EXISTING VALUE OF THE HIGHEST\r
+                               ; LEGAL LOGICAL DISK BLOCK NUMBER.\r
+       POPJ    PDP,            ;***SUBROUTINE EXIT***.......\r
+\r
+CPCT3: POP     PDP,TAC\r
+       CONSZ   DSK,NRDY        ;NON-EXISTENT DISK?\r
+       JUMPN   TAC,CPCT2       ;YES, THE LIMIT OF DISK STORAGE HAS BEEN FOUND.\r
+                               ; HOWEVER, DISK 0 MUST ALWAYS BE PRESENT.\r
+\r
+       MOVEI   TAC,CPCTM1      ;NO, SOME OTHER TYPE OF READ ERROR.\r
+       PUSHJ   PDP,IOCONM      \r
+       PUSHJ   PDP,OPOUT       ;PRINT ERROR MESSAGE\r
+       POP     PDP,LBHIGH\r
+       JRST    CAPCTY          ;TRY AGAIN\r
+CPCTM1:        ACSIZ   /DISK READ ERROR DURING CAPACITY SEARCH INITIALIZATION\r
+/\r
+\r
+\r
+;ROUTINE TO ASSURE THAT THE STATUS OF THE WRITE-LOCK SWITCHES ON THE\r
+;  DISK MAINTENANCE PANEL IS SUCH THAT THEY ARE PROTECTING "LESS THAN 0000".\r
+\r
+;THIS ROUTINE LOOPS PRINTING AN ERROR MESSAGE UNTIL THE SWITCHES ARE O.K.\r
+\r
+WRITLK:        CONI    DSK,TAC\r
+       TLNN    TAC,13777       ;BOUNDARY ZERO AND MAINTENANCE-SEGMENT OFF ?\r
+       TLNN    TAC,<PLGW>B53   ;YES, IS ROTARY SWITCH SET\r
+                               ; TO EITHER X UNDER OR OVER(AS OPPOSED\r
+                               ; TO UNDER OR X OVER)\r
+       JRST    WRLK8           ;NO. GO PRINT ERROR MESSAGE AND LOOP.\r
+\r
+;AN UNFORTUNATE HARDWARE OVERSIGHT MAKES IT IMPOSSIBLE TO SENSE THE DIFFERENCE\r
+;  BETWEEN "PROTECT LESS THAN" AND "PROTECT LESS THAN OR EQUAL".  THEREFORE\r
+;  THIS ROUTINE MUST ACTUALLY TRY WRITING ON TRACK 0000.\r
+       MOVE    TAC,[252525252525]\r
+       MOVEM   TAC,WNZBUF\r
+       MOVE    TAC,[XWD WNZBUF,WNZBUF+1]\r
+\r
+       BLT     TAC,WNZBUF+177\r
+       MOVEI   TAC,0\r
+       PUSHJ   PDP,WNZWR       ;WRITE PATTERN IN BLOCK 0.\r
+       JRST    WRLK2           ;ERROR\r
+       POPJ    PDP,            ;***GOOD EXIT FROM WRITLK SUBROUTINE***.........\r
+\r
+WRLK2: MOVEI   TAC,WRLKM1\r
+       CONSZ   DSK,WRPE        ;WRITE-PROTECTION ERROR ?\r
+                               ;YES, PROTECT SWITCH ERRONEOUSLY SET ON "LESS THAN\r
+                               ; OR EQUAL" INSTEAD OF "LESS THAN".\r
+                               ;NO, SOME OTHER FAILURE DURING THE WRITE OF BLOCK 0.\r
+WRLK8: MOVEI   TAC,WRLKM2      ;WRITE-LOCK SWITCHES SET INCORRECTLY.\r
+WRLK9: PUSHJ   PDP,ICONM       ;PRINT ERROR MESSAGE\r
+       PUSHJ   PDP,OPOUT\r
+       JRST    WRITLK          ;GO TRY AGAIN\r
+\r
+WRLKM1:        ASCIZ   /DISK BLOCK 0 WRITE ERROR DURING WRITE-LOCK CHECK.\r
+/\r
+WRLKM2:        ASCIZ   /"MAINTENANCE SEGMENT" SWITCH MUST BE OFF. AND\r
+DIS WRITE PROTECTION SWITCHES MUST BE SET TO 0000 AND "LESS THAN",\r
+FIX THEM ! !\r
+/\r
+\r
+;DISK READING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE.\r
+;  AVOIDS USING THE MONITOR OUFUFS AND INTERRUPT STRUCTURE.\r
+\r
+;ON ENTRY TO THIS SUBROUTINE, TAG CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK\r
+;  BLOCK WHICH IS TO BE READ INTO THE ONCE-ONLY DISK BUFFER AREA.\r
+\r
+WNZRD: CONO    DSK,DATERR!DEVERR!SETERR!RESETB         ;CLEAR THE DISK SYNCHRONIZER\r
+       CONSZ   DSK,BUSYBT!DONEFLG\r
+       JRST    WNZRD           ;DON'T PROCEED UNLESS THE CLEAR WORKED.\r
+\r
+       PUSH    PDP,DSKFDG      ;SAVE THIS INSTRUCTION FROM "DSKINT"\r
+       MOVE    TAC1,[HRRZI TAC,0]      ;NOW TAMPER WITH THAT SAVED LOCATION SO\r
+       MOVEM   TAC1,DSKFDG     ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL.\r
+       MOVE    TAC1,[XWD -200,WNZBUF-1]\r
+       PUSHJ   PDP,DFRED       ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY.\r
+WNZRDC:        POP     PDP,DSKFDG      ;RESTORE THE MOLESTED INSTRUCTION IN DSKINT.\r
+       \r
+       PUSHJ   PDP,WNZWAT      ;WAIT UNTIL THE READ IS FINISHED.\r
+\r
+       CONSZ   DSK,DATERR!DEVERR!SETERR                ;ANY ERRORS ?\r
+       JRST    WNZRDX          ;YES, GIVE ERROR RETURN.\r
+       MOVE    TAC1,RCXCCW     ;NO, BUT CHECK THAT THE FINAL VALUE OF THE\r
+       CAMN    TAC1,RCXFIX     ; CHANNEL CONTROL WORD WAS AS EXCPECTED ALSO.\r
+       AOS     (PDP)           ;***GOOD RETURN***........\r
+WNZRDX:        POPJ    PDP,            ;ERROR RETURN,\r
+\r
+\r
+;DISK WRITING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE.\r
+;  AVOIDS USING THE MONITOR QUEUES AND INTERRUPT STRUCTURE.\r
+\r
+;ON ENTRY TO THIS SUBROUTINE, TAC CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK\r
+;  BLOCK WHICH IS TO BE WRITTEN ONTO THE DISK FROM THE ONCE-ONLY DISK BUFFER AREA.\r
+\r
+WNZWR: CONO    DSK,DATERR!DEVERR!SETERR!RESCIG         ;CLEAR THE DISK SYNCHRONIZER.\r
+       CONSZ   DSK,BUSYBT!DONEFLG\r
+       JRST    WNZWR           ;DON'T PROCEED UNLESS THAE CLEAR WORKED.\r
+\r
+       MOVEM   TAC,LBSAVE      ;SAVE LOGICAL BLOCK NUMBER IN CASE AN ERROR RETURN\r
+                               ; MUST BE TAKEN FROM THE "REFRESH" SUBROUTINE.\r
+       PUSH    POP,DSKFDG      ;SAVE THIS ISNTRUCTION FROM "DSKINT".\r
+       MOVE    TAC1,[HRRZI TAC,0]      ;NOW TAMPER WITH THAT SAVED LOCATION SO\r
+       MOVEM   TAC1,DSKFDG     ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL.\r
+       MOVE    TAC1,[XWD -200,WNZPUT-1]\r
+       PUSHJ   PDP,DFWRT       ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY.\r
+\r
+       JRST    WNZRDC          ;THE REMAINDER OF THE WRITE ROUTINE IS IDENTICAL\r
+                               ; TO THE READ ROUTINE\r
+\r
+;SUBROUTINE TO WATCH FOR THE DONE FLAG TO COME ON AND TIME OUT IF\r
+; IT DOESN'T COME UP SOON ENOUGH (SAY 5 SEC OR SO).\r
+\r
+WNZWAT:        MOVE    TAC,[^D1000000] ;AT MOST ONE MILLION TIMES THRU THE CONSZ-SOJG LOOP\r
+WNZWTL:        CONSZ   DSK,DONEFLG     ;DONE FLAG ON YET ?\r
+       POPJ    PDP,            ;YES, GOOD EXIT.......\r
+       SOJG    TAC,WNZWTL      ;NO, TIMED OUT YET ?\r
+                               ;YES, PRINT "DISK HUNG" ERROR MESSAGE.\r
+       MOVEI   TAC,WATMSG\r
+       PUSHJ   PDP,ICONM\r
+       PUSHJ   PDP,OPOUT\r
+       POP     PDP,TAC         ;SKIP UP A SUBROUTINE LEVEL, AND GIVE AN\r
+       POPJ    PDP,            ; ERROR RETURN FROM WNZRD OR WNZWR.......\r
+WATMSG:        ASCIZ   /DISK HUNG.\r
+/\r
+\r
+;SUBROUTINE TO SET SPECIFIED BITS IN A SAT BLOCK WHILE FORMING IT IN WNZBUF\r
+\r
+;ENTRY CONDITIONS --   C(TAC) = FIRST BIT NUMBER TO SET (NUMBERED BEGINNING AT 0)\r
+;                      C(TAC1) = NUMBER OF BITS TO SET\r
+\r
+SETWNZ:        MOVE    AC1,TAC1\r
+       IDIVI   TAC,^D36\r
+       MOVSI   AC2,400000\r
+       MOVNS   TAC1\r
+       ROT     AC2,(TAC1)\r
+STWNZ1:        ORM     AC2,WNZBUF(TAC)\r
+       ROT     AC2,-1\r
+       JUMPG   AC2,STWNZ2\r
+       ADDI    TAC,1\r
+STWNZ2: SOJN   AC1,STWNZ1\r
+       POPJ    PDP,            ;SUBROUTINE EXIT...........\r
+\r
+;SUBROUTINE TO CLEAR THE ONCE-ONLY OUTPUT BUFFER, WNZBUF\r
+WNZCLR:        SETZM   WNZBUF\r
+       MOVE    TAC,[XWD WNZBUF,WNZBUF+1]\r
+       BLT     TAC,WNZBUF+177\r
+       POPJ    PDP,            ;SUBROUTINE EXIT...........\r
+\r
+;SUBROUTINE TO MASK THE TIME, DATE, AND DATA MODE (=14 FOR BINARY MODE0 INTO ACCUMU-\r
+;  LATOR TAC IN THE FORMAT USED IN WORD 3 OF A DISK RETRIEVAL INFORMATION BLOCK.\r
+\r
+MDTMDT:        PUSH    PDP,TAC\r
+       MOVE    TAC,TIME        ;GET TIME IN JIFFIES.\r
+       IDIVI   TAC,JIFMIN      ;CONVERT TO MINUTES\r
+       LSH     TAC,^D12\r
+       IOR     TAC,THSDAT      ;TODAY'S DATE\r
+       TLO     TAC,14B<^D12*^D18>      ;BINARY MODE\r
+       IORM    TAC,(PDP)\r
+       POP     PDP,TAC\r
+       POPJ    PDP,            ;SUBROUTINE EXIT............\r
+\r
+\r
+;ERROR EXIT FROM "REFRESH" WHEN A BAD WRITE ON THE DISK OCCURS DURING REFREHSING.\r
+\r
+REFER1:        POP     PDP,TAC         ;CORRECT PDP IF EXTRA PUSH HAD OCCURRED.\r
+\r
+REFERR:        MOVE    TAC,LBSAVE      ;GET BLOCK NUMBER FOR THE ERROR MESSAGE AT REF4.\r
+       POPJ    PDP,            ;THIS NO-SKIP RETURN RE-ENTERS THE REFRESH DIALOGUE.\r
+\r
+\r
+\r
+;MISCELLANEOUS STORAGE SPACE USED BY THE PDP-10 DISK REFRESHING ROUTINE.\r
+\r
+CHKSAV: 0\r
+LBSAVE:        0\r
+\r
+WNZBUF:        BLOCK   200     ;BUFFER FOR READING AND WRITING DISK\r
+                       ; BLOCKS DURING THE ONCE-ONLY CODE.\r
+\r
+LOWSWP:        0               ;LOWEST LOGICAL BLOCK FOR SWAPPING\r
+\r
+       >               ;END OF REFRESH PROCEDURE FOR THE RD10 DISK.\r
+\r
+       >               ;CLOSE AN EVEN EARLIER FTDISK CONDITIONAL.\r
+\r
+INTERNAL FTCHECK\r
+IFN FTCHEC,<\r
+\r
+EXTERNAL CHKREG,CHKEND,CHECK,MONPTR,MONSUM\r
+\r
+CK:    MOVEI TAC,CHKBEG\r
+       SUBI TAC,CHKEND\r
+       HRLI TAC,CHKBEG\r
+       MOVSS TAC\r
+       PUSHJ PDP,CHECK         ;COMPUTE AND STORE CHECKSUM OF THE PURE AREA OF \r
+       MOVEM TAC1,MONSUM       ; THE TIME-SHARING MONITOR.\r
+       POPJ PDP,\r
+\r
+>\r
+\r
+ONCEND:        END\r
+\f\r
diff --git a/src/patch.mac b/src/patch.mac
new file mode 100644 (file)
index 0000000..5b30e08
--- /dev/null
@@ -0,0 +1,18 @@
+TITLE  PATCH - PATCH AREA FOR T.S. MONITOR\r
+SUBTTL A. FRANZ/RAP  TS3.19  6 SEP 68  V001\r
+\r
+;THIS PROGRAM SHOULD BE LOADED AFTER LAST NEEDED PROGRAM\r
+;BUT BEFORE SYSMAK,EXEC DDT,USER DDT AND ONCE\r
+\r
+ENTRY PATCH\r
+PATCH: BLOCK 300\r
+\r
+;SET JOBDDT NON-ZERO SO SYMBOLS WILL BE SAVED.\r
+\r
+ZZ=.\r
+LOC 74\r
+       EXP 141\r
+RELOC ZZ\r
+\r
+       END\r
+\f\r
diff --git a/src/pltser.mac b/src/pltser.mac
new file mode 100644 (file)
index 0000000..8af014f
--- /dev/null
@@ -0,0 +1,120 @@
+TITLE PLTSER - PLOTTER SERVICE ROUTINE\r
+SUBTTL T. EGGERS/GBH/TNM    20 MAY 1969   V012\r
+XP     VPLTSR,012              ;PUT VERSION NUMBER IN STORAGE MAP AND GLOB LISTING\r
+\r
+PLT=140                ;DEFINE DEVICE CODE\r
+PLTUP=200000   ;LIFT PEN WHEN OUTPUT FINISHED\r
+\r
+ENTRY PLTSER\r
+PLTSER:\r
+\r
+;PLOTTER DEVICE DATA BLOCK\r
+PLTDDB:        SIXBIT /PLT/\r
+PLTCHR:        XWD HUNGST*12,^D36      ;XWD (HUNG TIMEOUT),(BUFFER SIZE)\r
+PLTIOS:        0\r
+       PLTDSP                  ;DISPATCH TABLE ADDRESS\r
+       XWD DVOUT,14403         ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL)\r
+       0\r
+       0\r
+PLTPTR:        0                       ;OUTPUT BYTE POINTER\r
+PLTADR: XWD PROG,0\r
+PLTCTR:        0                       ;OUTPUT BYTE COUNTER\r
+\r
+EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1\r
+EXTERNAL SETIOD,STOIOS,CLRACT,IULLINP,PLTSAV,IADRCK\r
+\r
+INTERN PLTDDB,PLTINT,PLTDSP\r
+\f;DISPATCH TABLE\r
+\r
+       JRST PLTINT             ;INITIALIZE\r
+       JRST PLTHNG             ;HUNG DEVICE ERROR\r
+PLTDSP:        JRST PLTREL             ;RELEASE\r
+       JRST PLTCLS             ;CLOSE\r
+       JRST PLTOUT             ;OUTPUT\r
+       JRST ILLINP             ;INPUT\r
+\r
+PLTCLS:        TLO IOS,PLTUP           ;PLOTTER END FLAG SET\r
+       MOVEM IOS,PLTIOS\r
+       JRST OUT                ;DO AN OUTPUT\r
+\r
+PLTINI:\r
+PLTHNG:\r
+PLTREL:        CONO PLT,0              ;DEASSIGN PI CHANNEL, CLEAR DONE\r
+       HLLZS PLTINT            ;REMOVE PLOTTER FROM DEVICE CHAIN\r
+       POPJ PDP,\r
+\r
+\f;HERE BEGINS THE "OUTPUT" UUO\r
+\r
+PLTOUT:        PUSHJ PDP,PLTSET        ;SETUP BYTE POINTER AND COUNTER\r
+        JRST ADRERR            ;ADDRESS ERR RETURN FROM PLTSET\r
+       PUSHJ PDP,SETACT        ;SET DEVICE ACTIVE BIT\r
+       TLO IOS,IO\r
+       CONO PLT,PLTCHN         ;ASSIGN PRIORITY CHANNEL\r
+       MOVSI TAC,10\r
+       HLRM TAC,PLTINT         ;PUT PLOTTER INTO DEVICE CHAIN\r
+       TLZN IOS,IOBEG          ;FIRST OUTPUT UUO?\r
+       JRST .+3                ;NO\r
+       MOVEI TAC,40            ;YES, START PLOTTER WITH PEN UP\r
+       TLZ IOS,PLTUP           ;INIT "CLOSE" BIT\r
+       MOVE IOS,PLTIOS\r
+       DATAO PLT,TAC           ;START PLOTTER BY SENDING 0 OR 40\r
+       POPJ PDP,\r
+\f;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE\r
+\r
+PLTINT:        CONSO PLT,10            ;PLOTTER DONE FLAG SET?\r
+       JRST .-1                ;NO, CHAIN TO NEXT DEVICE\r
+       SOSGE PLTCTR            ;OUTPUT CHARACTERS LEFT?\r
+       JRST PLT1               ;NO\r
+       MOVEM TAC,TACSAV#       ;YES, SAVE TAC\r
+       ILDB TAC,PLTPTR         ;GET NEXT CHARACTER\r
+       DATAO PLT,TAC           ;SEND CHARACTER\r
+       MOVE TAC,TACSAV#        ;RESTORE TAC\r
+       JEN @PLTCHL             ;DISMISS INTERRUPT\r
+\r
+PLT1:  JSR PLTSAV              ;SAVE AC'S. SET UP PUSH DOWN POINTER\r
+       MOVEI DEVDAT,PLTDDB\r
+       PUSHJ PDP,IOSET         ;SETS UP PROG AND IOS\r
+       PUSHJ PDP,ADVBFE        ;ADVANCE AND LOOK AT NEXT BUFFERE\r
+        JRST PLTOFF            ;NO MORE DATA AVAILABLE\r
+       PUSHJ PDP,PLTSET        ;SETUP BYTE POINTER AND COUNTER\r
+        JRST PLTOFF            ;ADDRESS ERROR RET FROM PLTSET\r
+PLT2:  TLZE IOS,IOW\r
+       PUSHJ PDP,SETIUOD       ;LET JOB START AGAIN\r
+       JRST STOIOS             ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE\r
+                               ;FOUND MORE DATA (IT SKIPPED), ANOTHER\r
+                               ;INTERRUPT WILL IMMEDIATELY OCCUR BUT\r
+                               ;IT WILL BE HANDLED WITHOUT GOING TO PLT1\r
+\r
+PLTOFF:        CONO PLT,0              ;SHUT DOWN PLOTTER\r
+       HLLSZ PLTINT            ;REMOVE PLOTTER FROM CHAIN\r
+       PUSHJ PDP,CLRACT\r
+       TLZE IOS,PLTUP          ;HAS THE "CLOSE" BEEN DONE?\r
+       DATAO PLT,[40]          ;YES, LIFT PEN\r
+       JRST PLT2\r
+\f;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR\r
+;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA\r
+;      PUSHJ PDP,PLTSET\r
+;         RETURN 1     ;ADDRESS ERROR RETURN\r
+;         RETURN 2     ;GOOD RETURN\r
+\r
+PLTSET:        MOVEI TAC,@PLTADR       ;GET ADDRESS OF CURRENT BUFFER\r
+       ADD TAC,[POINT 6,1,35]  ;CONVERT TO 6 BIT BYTE POINTER WITH\r
+                               ;ADDRESS OF BUFFER WORD COUNT\r
+       TRNN IOS,16             ;IS THIS A TEST DATA MODE?\r
+       TLO TAC,[POINT 7,0,35]  ;YES, CONVERT TO 7 BIT BYTE POINTER\r
+       MOVEM TAC,PLTPTR        ;SAVE BYTE POINTER\r
+       HRRZ TAC,@TAC           ;GET BUFFER WORD COUNT\r
+       MOVEM TAC,PLTCTR        ;SAVE AS POSITIVE WORD COUNT\r
+       ADD TAC,PLTADR          ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE)\r
+       MOVEI TAC,1(TAC)        ;GET LAST ADR IN BUF (RELATIVE)\r
+       PUSHJ PDP,IADRCK        ;ADDRESS CHECK. OK?\r
+        POPJ PDP,              ;NO, OUTSIDE. RETURN WITH NO SKIP\r
+       MOVEI TAC,6             ;IMAGE OR BIN MODES - 6 BYTES/WORD\r
+       TRNN IOS,16             ;IS OUTPUT A TEXT MODE (0 OR 1)?\r
+       MOVEI TAC,5             ;YES, 5 BYTES/WORD\r
+       IMULM TAC,PLTCTR        ;CHANGE WORD COUNT TO BYTE COUNT\r
+       JRST CPOPJ1             ;RETURN WITH A SKIP\r
+\r
+       LIT\r
+       VAR\r
+PLTEND:        END\r
diff --git a/src/ptpser.mac b/src/ptpser.mac
new file mode 100644 (file)
index 0000000..9eca6b3
--- /dev/null
@@ -0,0 +1,246 @@
+TITLE  PTPSER - PAPER TAPE PUNCH SERVICE ROUTINE\r
+SUBTTL /RCC  TS 15 APR 69 V401 (FROM 002)\r
+XP     VPTPSR,401\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+EXTERNAL PTPCHN, PTPSAV, ADVBFE, ITMCT1, SETIOD, SETBYT, IOSET, CKS12\r
+EXTERNAL ILLINP,  OUT, WAIT1,PTPCHL,PIOMOD\r
+EXTERNAL SETACTSTOIOS\r
+INTERNAL PTPINI,PTPDSP\r
+\r
+;PTP DEVICE DATA BLOCK LINKAGE\r
+\r
+ENTRY PTPSER\r
+\r
+PTPSER:\r
+\f, PARAMETER ASSIGMENTS\r
+\r
+,   PTP CONTROL REGISTER\r
+       PTPDON=10\r
+\r
+,   FORMAT CONTROL\r
+       PDPFDN=200\r
+\r
+,   SPECIAL IO STATUS WORD ASSIGNMENTS\r
+       IODISC=400000\r
+       PTPFED=200000\r
+       PTPEOL=20000\r
+       PTPBIN=4000     ;CHECKSUM BINARY\r
+       PTPIB=2000      ;IMAGE BINARY\r
+\r
+;   SPECIAL ASCII CHARACTERS\r
+;   DEFINED WITH THE CORRECT PARITY\r
+       RUBOUT=377\r
+       HORTAB=11\r
+       VERTAB=213\r
+       FORMED=14\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTPDDB,PTPIOS,PTPPTR,PTPADR,PTPCTR,PTPCNT,PTPCHA,PTPSIO,PTPCON\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PTP DEVICE DATA BLOCK\r
+\r
+       INTERN PTPDDB\r
+PTPDDB:\r
+       SIXBIT  /PTP/\r
+       XWD     ^D10*HUNGST,41\r
+PTPIOS:        0\r
+       EXP     PTPDSP\r
+       XWD     DVPTP+DVOUT,14403\r
+       0\r
+       0\r
+PTPPTR:        0\r
+PTPADR:        XWD     PROG,0\r
+PTPCTR:        0\r
+PTPCNT:        0\r
+PTPCHA:        0\r
+PTPSIO:        0\r
+PTPCON:        0\r
+>\r
+\f,PTP SERVICE DISPATCH TABLE\r
+       JRST PTPINI     ;INITILIZE\r
+       JRST    PTPREL  ;HUNG DEVICE TIME-OUT ERROR,\r
+PTPDSP:        JRST PTPREL     ;RELEASE\r
+       JRST PTPCLS     ;CLOSE\r
+       JRST PTPOUT     ;OUTPUT\r
+       JRST ILLINP     ;INPUT\r
+\fPTPINI:\r
+PTPREL:        CONO PTP,0\r
+       HLLZS PTPCON            ;CLEAR CONSO FLAGS BITS\r
+       POPJ PDP,               ;RETURN\r
+\r
+\r
+PTPCLS:        PUSHJ PDP,OUT           ;OUTPUT REMAINING BUFFERS\r
+       PUSHJ PDP,WAIT1         ;WAIT FOR IOACT=0.\r
+       MOVE IOS,PTPIOS         ;C(IOS):=C(PTPIOS)\r
+       TLO IOS,IODISC+PTPFED+IOW       ;IODISC:=IOW:=PTPFED:=1\r
+       PUSHJ PDP,SETACT        ;SET ACTIVE FLAG,STORE IOS,AND\r
+                               ;RESET HUNG DEVICE TIMEOUT COUNT\r
+       MOVEI TAC,200\r
+       MOVEM TAC,PTRCNT        ;PTPCNT:=200\r
+       MOVEI TAC,PTPDON        ;SET CONSO FLAG\r
+       HRRM TAC,PTPCON\r
+       MOVEI TAC,PTPCHN        ;TAC:=PTPCHN,PI CHANNEL ASSIGNMENT\r
+       CONO PTP,PTPDON(TAC)    ;DONE FLAG:=1, ASSIGN PI CHANNEL\r
+       JRST WAIT1              ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED\r
+\fPTPOUT:       TLZE IOS,IOBEG          ;VIRGIN DEVICE?> (IOBEG:=0)\r
+       JRST PTPIN0             ;YES\r
+\r
+PTPIN1:        \r
+       TLZ IOS,IODISC          ;CLEAR DISCONNECT BIT\r
+       PUSHJ PDP,SETACT        ;SET ACTIVE FLAG,STORE IOS, AND\r
+                               ;RESET HUNG DEVICE TIMEOUT COUNT\r
+       HRLI TAC,PTPDON         ;CONSO FLAG\r
+       HRRI TAC,PTPCHN         ;CONO FLAGS\r
+       TRO TAC,PTPDON\r
+       STARTDV PTP\r
+       POPJ PDP,               ;RETURN\r
+\r
+PTPIN2:        LDB TAC,PIOMOD\r
+\r
+       TLO IOS, IOFST+PTPFED+IO        ;IOFST:=PTPFED:=IO:=1\r
+       TLZ IOS,PTPBIN+PTPIB    ;CLEAR BINARY AND IMAGE BINARY BITS\r
+       CAIN TAC,IB             ;IMAGE BINARY\r
+       TLO IOS,PTPIB           ;YES\r
+       CAIN TAC,B              ;MODE=BINARY?\r
+       TLO IOS,PTPBIN          ;YES, PTPBIN:=1\r
+       MOVEI TAC,PTPFDN        ;PTPCNT:=PTPFDN\r
+       MOVEM TAC,PTPCNT\r
+       PUSHJ PDP,SETBYT        ;SETBYT\r
+       HLLM TAC,PTPPTR         ;PTPPTR0-5:=PTPPTR12-13:=0,PTPPTR6-11:=BYTE\r
+                               ;SIZE; PTPPTR14-17:=PROG\r
+       JRST PTPIN1\r
+\f,PUNCH INTERRUPT SERVICE\r
+\r
+PTPINT:        CONSO PTP,@PTPCON\r
+       JRST PTPINT\r
+       MOVEM IOS,PTPSIO        ;PTPSIO:=C(IOS)  SAVE IOS\r
+       MOVE IOS,PTPIOS         ;IOS:=C(PTPIOS)\r
+       TLNE IOS,PTPFED         ;FEED REQUEST> (PTPFED=1?)\r
+       JRST PTPS2              ;YES\r
+       MOVE IOS,PTPSIO         ;RESTORE IUOS\r
+       JSR PTPSAV              ;SAVE ACS AND ESTABLISH PDP\r
+       MOVEI DEVDAT,PTPDDB\r
+       PUSHJ PDP,IOSET         ;PROG:=(JBTADR 18-35),ITEM:=C(DEVCTR)\r
+                               ;IOS:=C(PTRIOS)\r
+       TLZE IOS,IODISC         ;DISCONNECT?  (IODISC=1?)\r
+       JRST PTPADV             ;YES\r
+       TLZE IOS,IOFST          ;IOFST=1? IOFST:=0\r
+       JRST PTP9               ;YES\r
+       TLNN IOS,PTPBIN+PTPIB   ;BINARY PUNCH MOD?\r
+       JRST PTP3               ;NO\r
+\r
+       MOVE TAC,PTPCHA         ;BINARY OUTPUT BYTE SIZE=36\r
+       ROT TAC,6\r
+       MOVEM TAC,PTPCHA\r
+       ANDI TAC,77             ;TAC:=XX, SIXBIT SUB-BYTE\r
+       ADDI TAC,200\r
+       DATAO PTP,TAC           ;PUNCH 2XX\r
+       SOSL PTPCNT             ;C(PTPCNT):=C(PTPCNT)-1,   WORD DONE?\r
+       JRST PTPXIT             ;NO\r
+       SOSL PTPCTR             ;C(PTPCTR):=C(PTPCTR)-1,   ITEM COUNT < 0?\r
+       JRST PTPB1              ;NO\r
+       TLNE IOS,PTPIB          ;IMAGE BINARY?\r
+       TLOA IOS,IODISC         ;YES, SUPPRESS TAPE FEED.\r
+       TLO IOS,IODISC+PTPFED   ;IODISC:=PTPFED:=1\r
+       MOVEI TAC,10\r
+       MOVEM TAC,PTPCNT        ;PTPCNT:=10\r
+       JRST PTPXIT\r
+\r
+PTPB1: MOVEI TAC,5             ;PTPCNT:=5\r
+       MOVEM TAC,PTPCNT\r
+       MOVE DAT,@PTPPTR        ;PTPCHA:=OUTPUT DATA WORD\r
+       AOS PTPPTR              ;PTRPTR:=C(PTRPTR)+1. ADVANCE ITEM POINTER.\r
+       MOVEM DAT,PTRCHA\r
+       JRST PTPXIT\r
+\fPTP3: DATA PTP,PTPCHA         ;PUNCH CHARACTER\r
+       TRNE IOS,14             ;IS MODE AN ALPHA MODE\r
+       JRST PTP1               ;NO\r
+       MOVE DAT,PTPCHA\r
+       CAIE DAT,HORTAB         ;HORIZONTAL OR VERTICAL TAB?\r
+       CAIN DAT,VERTAB\r
+       JRST PTPP1              ;YES\r
+       CAIE DAT,FORMFD         ;FORM FEED?\r
+       JRST PTP1               ;NO\r
+       TLO IOS,PTPFED+PTPEOL   ;PTPFED:=PTPEOL:=1\r
+       MOVEI DAT,20\r
+       MOVEM DAT,PTPCNT        ;PTPCNT:=20\r
+       JRST PTPXIT\r
+\f      EXTERNAL PEVEN8         ;IN IOCSS, FOR PARITY IN ASCII\r
+\r
+PTP1:  SOSGE   PTPCTR          ;C(PTPCTR):=C(PTPCTR)-1,  IS C(PTPCTR)<0?\r
+       JRST PTP5               ;YES\r
+       ILDB TEM,PTPPTR         ;TEM:=OUTPUT ITEM\r
+       LDB TAC,PIOMOD\r
+       CAIN TAC,I              ;MODE=IMAGE?\r
+       JRST PTP6               ;YES\r
+       IORI TEM,200            ;NO, INSERT EIGHTH HOLD\r
+       TRNN    TAC,14          ;AN ASCII MODE?\r
+       PUSHJ   PDP,PEVEN8      ;YES, TURN EIGHTH HOLE OFF IF\r
+                               ; APPROPRIATE TO GET EVEN PARITY\r
+       JUMPE   TEM,PTP1        ;IF AN ASCII NULL, IGNORE IT\r
+                               ; THEY ARE PUT IN BY PTPFED STUFF\r
+                               ; ELSE FALL INTO PTP6\r
+\r
+PTP6:  MOVEM TEM,PTPCHA        ;PTPCHA:=OUTPUT ITEM\r
+       JRST PTPXIT\r
+\r
+PTPS2: CLEARM  PTPCHA          ;PUNCH FEED\r
+       DATAO PTP,PTPCHA\r
+       SOSG PTPCNT             ;COUNT FEED LINES\r
+       TLZ IOS,PTPFED          ;PTPFED:=0\r
+       MOVEM IOS, PTPIOS       ;PTPIOS:=C(IOS)\r
+       MOVE IOS,PTPSIO         ;RESTORE IOS\r
+       JEN @PTPCHL             ;DISMISS\r
+\r
+\r
+PTP5:  TLO IOS,IODISC          ;IODISC:=1\r
+       JRST PTPXIT\r
+\r
+PTPBN: HRRZ TAC1,PTPADR        ;TAC1:=BUFFER ADDRESS\r
+       PUSHJ PDP,CKS12         ;TAC:=CALCULATE CHECKSUM\r
+       ADD TAC1, PTPADR\r
+       HLLM TAC,@TAC1          ;STORE CHECKSUM IN LEFT HALF OF FIRST BUFFER WORD,\r
+\r
+       JRST PTPB1\r
+\fPTPADV:       PUSHJ PDP,ADVBFE        ;ADVANCE BUFFER\r
+       JRST PTPDSC             ;EXIT1.  NEXT BUFFER EMPTY\r
+       TLZE IOS,IOW            ;IN A WAIT?  IOW:=0\r
+       PUSHJ PDP,SETIOD        ;YES.  IOWS:=1\r
+PTP9:  TLZ IOS,IOFST           ;IOFST:=0\r
+       MOVE TAC,PTPADR\r
+       AOS TAC\r
+       HRRM TAC,PTPPTR         ;PTPTR18-35:=C(PTPADR18-35)+1\r
+       HRRZ ITEM,@TAC          ;ITEM:=WORD COUNT\r
+       LDB TAC1,PTP91          ;PICK UP BYTE SIZE\r
+       PUSHJ PDP,ITMCT1        ;ITEM:=WORD COUNT*[36/BYTE SIZE]\r
+       MOVEM ITEM,PTPCTR       ;PTPCTR:=C(ITEM)\r
+       JUMPE ITEM,PTPADV       ;IS ITEM COUNT=0?\r
+       TLNE IOS,PTPBIN         ;BINARY PUNCH MODE?\r
+       JRST PTPBN              ;YES\r
+       TLNN IOS,PTPIB          ;IMAGE BINARY?\r
+       JRST PTP1\r
+       AOS PTPPTR              ;YES\r
+\r
+       SOS PTPCTR\r
+       JRST PTPB1\r
+\r
+PTP91: POINT 6,PTRPTR,11\r
+\r
+PTRP1: MOVEI DAT,RUBOUT        ;PTPCHA:=RUBOUT\r
+       MOVEM DAT,PTPCHA        \r
+       TLO IOS,PTPEOL          ;PTPEOL:=1\r
+       JRST PTPXIT\r
+\r
+PTPDSC:        PUSHJ PDP,PTPREL        ;CLEAR PTP CONTROL REG AND CONSO BITS\r
+       TRZ IOS,IOACT           ;IOACT:=0\r
+       TLO IOS,IOFST           ;IOFST:=1\r
+       TLZE IOS,IOW            ;IN A WAIT?  IOW:=0\r
+       PUSHJ PDP,SETIOD        ;YES.  IOWS:=1\r
+\r
+PTPXIT:        JRST STOIOS             ;STORE IOS, RESET HUNG TIMEOUT COUNT AND\r
+                               ;DISMISS INTERRUPT\r
+\r
+END\r
+\f\r
diff --git a/src/ptrser.mac b/src/ptrser.mac
new file mode 100644 (file)
index 0000000..fd8b81e
--- /dev/null
@@ -0,0 +1,157 @@
+TITLE PTRSER - PAPER TAPE READER SERVICE ROUTINE FOR BOTH PDP-6 AND PDP-10\r
+SUBTTL  /GBH/TNM  TS 14 APR 69 V004\r
+XP     VPTRSR,004\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+EXTERNAL  STOSQD,ILLOUT\r
+EXTERNAL STODAT, IOSET, SETBYT, ADVBFF\r
+EXTERNAL SETIOD, PTRSAV, PTRCHN,PIOMOD\r
+EXTERNAL SETACT,STOIOS,CPOPJ1,PTRMSK\r
+INTERNAL PTRINT,PRTDSP\r
+\r
+;PTR DEVICE DATA BLOCK LINKAGE\r
+\r
+ENTRY PTRSER\r
+PTRSER:\r
+\f,PARAMETER ASSIGNMENTS\r
+,   PTR CONTROL REGISTER\r
+       PTRDON=10               ;DONE FLAG\r
+       PTRBSY=20               ;BUSY FLAG\r
+       PTRBIN=40               ;BINARY READ MODE\r
+       POW=400                 ;POWER,  ON=1\r
+\r
+,   SPECIAL IO STATUS WORD ASSIGNMENTS\r
+       IODISC=400000\r
+       PTRFCI=200000\r
+       PTRPOW=100000\r
+,   SPECIAL ASCII CHARACTERS\r
+       RUBOUT=177\r
+\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTRDDB,PTRIOS,PTRADR,PTRPTR,PTRCTR,PTRSVC,PTRSV1,PTRCON\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PTR DEVICE DATA BLOCK\r
+       INTERN  PTRDDB\r
+\r
+PTRDDB:\r
+PTRDAT:        SIXBIT  /PTR/\r
+       XWD     ^D30*HUNGST,41\r
+PTRIOS:        0\r
+       EXP     PTRDSP\r
+       XWD     DVPTR+DVIN,14403\r
+       0\r
+       0\r
+PTRADR:        XWD     PROG,0\r
+PTRPTR:        0\r
+PTRCTR:        0\r
+PTRSVC:        0\r
+PTRSV1:        0\r
+PTRCON:        0\r
+>\r
+\f,PTR SERVICE DISPATCH TABLE\r
+       JRST PTRINI     ;INITILIZE\r
+       JRST    PTRREL          ;HUNG DEVICE TIME-OUT ERROR.\r
+PTRDSP:        JRST PTRREL             ;RELEASE\r
+       POPJ PDP,               ;CLOSE\r
+       JRST ILLOUT             ;OUTPUT\r
+\f      TLNN IOS,IOBEG          ;INPUT, VIRGIN DEVICE?\r
+       JRST PTRIN1             ;NO\r
+       TLO IOS,IOFST           ;IOFST:=1. NEXT ITEM WILL BE FIRST ITEM OF A BUFFER\r
+       TLZ IOS,PTRPOW+PTRFCI+IODISC\r
+       PUSHJ PDP,SETBYT        ;TAC0-5:=TAC12-13:=0,TAC6-11:=BYTE SIZE\r
+                               ;TAC14-17:=PROG\r
+       MOVEM TAC,PTRPTR        ;PTRPTR:=C(TAC)\r
+       CONSZ PTR,POW           ;IS POWER ON?>\r
+       TLO IOS,PTRPOW          LYES. PTRPOW:=1\r
+PTRIN1:\r
+       MOVEI TAC1,PTRBSY\r
+       TLZN IOS,IOBEG          ;VIRGIN?\r
+       MOVEI TAC1,PTRDON       ;NO\r
+\r
+       TLNN    IOS,PTRPOW\r
+       ANDI TAC1,PTRMSK                ;PTRMSK IUS DEFINED IN BUILD AS -1 PDP-6 AND 0 PDP-10\r
+       PUSHJ PDP,SETACT        ;IOACT:=1\r
+       MOVEI TAC,PTRCHN(TAC1)\r
+       LDB TAC1,PIOMOD\r
+       CAIE TAC1,1B            ;IMAGE BINARY?\r
+       CAIN TAC1,B             ;OR BINARY\r
+       IORI TAC,PTRBIN\r
+       HRLI TAC,PTRDON\r
+       STARTDV PTR\r
+       POPJ PDP,\r
+\fPTRINT:       CONSO PTR,@PTRCON\r
+       JRST    PTRINT\r
+       SKIPL PTRIOS            ;DISCONNECT REQUEST? (IODISC=1?)\r
+       DATAI PTR,PTRSV1        ;PTRSV1:=DATA ITEM.\r
+       JSR PTRSAV              ;SAVE ACCUMULATORS AND ESTABLISH PDP\r
+       MOVEI DEVDAT,PTRDDB     ;SET UP DEVDAT\r
+       PUSHJ PDP,IOSET         ;PROG:=C(JBTADR18-35),ITEM:=C(DEVCTR)\r
+                               ;IOS=C(PTRIOS)\r
+       MOVE DAT,PTRSV1         ;DAT:=DATA ITEM\r
+       CONSO PTR,POW           ;PTR POWER ON?\r
+       JRST PTREND             ;NO\r
+       TLON IOS,PTRPOW         ;PTRPOW=1? PTRPOW:=1\r
+       JRST PTREX1             ;NO\r
+       TLZE IOS,IODISC         ;DISCONNECT REQUEST?\r
+       TLZE IOS,PTRFCI         ;IS PTRFCI=1?\r
+       MOVE DAT,PTRSVC         ;YES.  DAT:=C(PTRSVC)\r
+PTRIN0:        TRNE IOS,B              ;MODE=BINARY?\r
+       JRST PTRI0              ;YES\r
+       ANDI DAT,177            ;MASK OUT PARITY BIT\r
+       CAIN DAT,RUBOUT         ;LAST CHAR A RUBOUT?\r
+       JRST PTREX1             ;YES\r
+       JUMPE DAT,PTREX1        ;DAT=0?\r
+\r
+PTRIO: PUSHJ PDP,STODAT        ;NO STORE DATA WORD.\r
+       JFCL                    ;CHECKSUM ERROR\r
+       JRST PTRI1              ;BLOCK FULL OR BLOCK COMPLETE\r
+       JRST PTREX1             ;DATA STORED CORRECTLY.\r
+\r
+PTRI1: PUSHJ PDP,ADVBFF        ;ADVANCE BUFFER\r
+       TLO IOS,IODISC          ;NEXT BUFFER IS FULL.  IODISC:=1\r
+PTRI2: TLO IOS,IOFST           ;IOFST:=1, NEXT ITEM IS FIRST ITEM OF A BUFFER.\r
+       TLZE IOS,IOW            ;IN A WAIT? IOW:=0\r
+       PUSHJ PDP,SETIOD        ;IOWS:=1\r
+       JRST PTREX1\r
+\f,COME HERE WHEN THE READER IS SHUT OFF\r
+\r
+PTREND:        TDZ IOS,[XWD PTRPOW,IOACT]      ;PTRPWO:=0,IOACT:=0\r
+       PUSHJ PDP,PTRREL        ;CLEAR PTR AND CONSO FLAG\r
+       LDB TAC,IOMOD\r
+       TLO IOS,IOEND+IOREG\r
+       CAIE TAC,B              ;CHECKSUM BINARY BLOCK ..OF?\r
+       JRST PTREI              ;NO\r
+       TLNN IOS,IOEST          ;IOEST=1?\r
+       TRO IOS,IOIMPM          ;NO. BINARY BLOCK INCOMPLETE.\r
+       JRST PTRI2\r
+PTREI: PUSHJ PDP,STOSQD        ;FINISH THE BUFFERE, STORE WORD COUNT\r
+       JFCL\r
+       PUSHJ PDP,ADVBFF        ;ADVANCE BUFFERE\r
+       JFCL\r
+       JRST PTRI2\r
+\f,DISCONNECT PTR\r
+PTREX: SKIPG @PTRADR           ;IOUSE=1?\r
+       JRST PTREX0             ;YES.\r
+       DATAI PTR,DAT\r
+       JRST PTRIN0\r
+\r
+PTREX0:        DATAI PTR,PTRSVC        ;SAVE LAST DATA WORD FROM PTR\r
+       TLZE IOS,IOW            ;JOB IN AN IO WAIT FOR PTR?\r
+       PUSHJ PDP,SETIOD                ;YES, WAKE UP JOB\r
+       PUSHJ PDP,PTRREL        ;CLEAR PTR AND CONSO FLAG\r
+       TLO IOS,PTRFCI          ;PTRFCI:=1\r
+       TRZ IOS,IOACT           ;IOACT:=0\r
+\r
+PTREX1:        MOVEM ITEM,PTRCTR       ;PTRCTR:=C(ITEM)\r
+       JRST STOIOS             ;STORE IOS,RESET HUNG DEVICE\r
+                               ;TIMEOUT COUNT AND DISMISS\r
+\r
+PTRINI:\r
+PTRREL:        CONO PTR,0              ;CLEAR PTR CONTROL\r
+       HLLZS PTRCON            ;CLEAR CONSO FLAG\r
+       POPJ PDP,\r
+\r
+       END\r
+\f\r
diff --git a/src/ptysrf.mac b/src/ptysrf.mac
new file mode 100644 (file)
index 0000000..176ef20
--- /dev/null
@@ -0,0 +1,286 @@
+TITLE  PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
+SUBTTL M. FREDRIKSEN/RCC  TS  06 DEC 68 V006\r
+XP     VPTYSF,006\r
+               ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
+\r
+ENTRY PTYSRF           ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
+PTYSRF:\r
+\r
+\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+       DDB=DEVDAT\r
+       LINE=TAC1\r
+\r
+       CHREC=TEM\r
+       PIOS=13\r
+       PDDB=14\r
+\r
+;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS\r
+; MUST AGREE WITH THOSE IN SCNSRF\r
+\r
+       BREAKB=20000\r
+       FCSBRK=4000\r
+       TOIP=400000             ;SIGN OF TTYPTR IN TTY DDB\r
+       SYNC=20000              ;BREAK CHARACTER SEEN---FROM SCNSER\r
+\r
+;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
+\r
+IOPTW=4000             ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
+IOPTRE=2000            ;PTY RESPONSE IS READY\r
+MONMOD=1000            ;PTY IS IN MONITOR MODE\r
+\r
+INTERNAL FTTTYSER\r
+\r
+FTTTYSER=-1            ;FORCE MULT DEF GLOBAL IF WRONG APRSER\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
+EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
+INTERNAL PTYSA0,PTYRE0,ACSAV0\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PSEUDO CONSOLE DEVICE DATA BLOCK\r
+;REMAINING PTY DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME\r
+       INTERN  PTYDDB\r
+       ZZ=.\r
+PTYDDB:        SIXBIT  /PTY0/\r
+       XWD     0,10000+STTYBF+1        ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
+       Z\r
+       EXP     PTYDSP\r
+       Z\r
+       Z\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       Z\r
+       XP      PTYDDS,.-ZZ     ;SIZE OF PTY DDB\r
+>\r
+\fINTERNAL PTYDSP\r
+EXTERNAL OUT\r
+       POPJ    PDP,    ;INITIALIZE\r
+       POPJ    PDP,            ;PRINT ERROR, STOP JOB\r
+PTYDSP:        JRST PTYREL\r
+       JRST OUT\r
+       JRST PTYOUT\r
+       JRST PTYIN\r
+\r
+EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT\r
+\r
+PTYREL:        LDB LINE,PUNIT\r
+       ADDI LINE,TCONLN\r
+       SKIPN TTYTAB(LINE)\r
+       POPJ PDP,\r
+       PUSH PDP,DDB\r
+       HRRZ DDB,TTYTAB(LINE)\r
+       PUSHJ PDP,TTYKIL\r
+       POP PDP,DDB\r
+\r
+       LDB LINE,PUNIT\r
+       SETZM PTYTAB(LINE)\r
+       POPJ PDP,\r
+\f;PTY OUTPUT\r
+;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED\r
+;IF A TTY DATA BLOCK IS AVAILABLE.  IF NONE IS AVAILABLE,\r
+;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED.\r
+\r
+;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
+;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS\r
+;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS\r
+;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
+;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
+;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
+;UNTIL THEY ARE EMPTY.\r
+\r
+;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
+;DOES AN "OUTPUT" UUO.  IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
+;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
+;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
+;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
+;SET IN THE OF IOS)\r
+\r
+\r
+EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD\r
+EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI\r
+EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL\r
+\r
+PTYOUT:        LDB     LINE,PUNIT\r
+       HRRZM   DDB,PTYTAB(LINE)\r
+       ADDI    LINE,TCONLN\r
+       HLL     LINE,LINTAB(LINE)\r
+\r
+       SKIPE   PDDB,TTYTAB(LINE)\r
+       JRST    PTYOU1\r
+       PUSHJ   PDP,PTEXCH\r
+       PUSHJ   PDP,DDBSRC\r
+       TROA    PIOS,IODERR\r
+       JRST    PTYOU2\r
+       MOVEM   PIOS,DEVIOS(RDDB)\r
+\r
+PTEXCH:        EXCH    IOS,PIOS\r
+       EXCH    DDB,PDDB\r
+       POPJ    PDP,\r
+\fPTYOU1:       MOVE    PIOS,DEVIOS(PDDB)\r
+       PUSHJ   PDP,PTEXCH\r
+\r
+PTYOU2:        MOVEI   AC2,@DEVOAD(PDDB)\r
+       MOVE    AC2,1(AC2)\r
+       IMULI   AC2,5\r
+       HRRZ    AC1,DEVOAD(PDDB)\r
+       ADD     AC1,[XWD 700+PROG,1]\r
+       MOVEI   DAT,TTIBUF(DDB)\r
+\r
+PTYOU3:        ILDB    CHREC,AC1\r
+       JUMPE   CHREC,PTYOU5\r
+       PUSHJ   PDP,SPCHEK\r
+       JRST    PTYOU4\r
+       CAIE    CHREC,176\r
+       CAIN    CHREC,33\r
+       MOVEI   CHREC,175\r
+       MOVEI   IOS,0\r
+       TLNE    TAC,BREAKB+FCSBRK\r
+\r
+       MOVSI   IOS,SYNC\r
+       IORB    IOS,DEVIOS(DDB)\r
+       CAIN    CHREC,3         ;CONTROL C\r
+       PUSHJ   PDP,CNCTST      ;SEE IF SECOND, STOP JOB IF SO\r
+\r
+PTYOU4:        MOVEI   DAT,TTIBUF(DDB)         ;MAY HAVE SWITCHED TO TIOBUF\r
+       PUSHJ   PDP,PUTCHI\r
+       JRST    PTYOUW\r
+       MOVE    TAC,TIFCTR(DDB)         ;SEE IF BUFFER FILLING UP\r
+       CAIL    TAC,10                  ;WAKE JOB IF SO\r
+       TLNE    IOS,SYNC\r
+       PUSHJ   PDP,RECIN3              ;CLOBBERS DAT AND TAC\r
+PTYOU5:        SOJG    AC2,PTYOU3\r
+PTYOU6:        PUSHJ   PDP,PTEXCH\r
+       PUSHJ   PDP,ADVBFE\r
+       JFCL\r
+       TRZ     IOS,IOPTW\r
+       TLO     IOS,IOFST\r
+       MOVEM   IOS,DEVIOS(DDB)\r
+       POPJ    PDP,\r
+\r
+PTYOUW:        PUSHJ   PDP,INBFUL              ;TURN OFF SYNC, CHECK FOR\r
+                                       ; PANIC CONTROL C.\r
+       TRO     PIOS,IOBKTL     ;CANT PUT BATCH IN IOW\r
+       JRST    PTYOU6          ;ABORT BUFFER AND RETURN TO BATCH\r
+\fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,ADRERR,TTYPTR\r
+EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF\r
+\r
+PTYIN: LDB DAT,PUNIT\r
+       SKIPF PDDB,TPYTAB(DAT)  ;TTY DDB ADDRESS\r
+       JRST    PTYIN1\r
+       TRO IOS,IOIMPM          ;YES, THAT'S ALL.\r
+       JRST PTYIN3\r
+\r
+PTYIN1:        MOVE    PIOS,DEVIOS(PDDB)\r
+       TRZA    IOS,IOPTRE\r
+PTYIN4:        TRO     IOS,IOPTRE\r
+       HRRZ    TAC,DEVIAD(DDB)\r
+       PUSHJ   PDP,BUFCLR\r
+       JRST    ADRERR\r
+       MOVEI   LINE,TCONLN(DAT)\r
+       PUSHJ   PDP,PTEXCH\r
+       MOVEI   AC2,TTYCHR\r
+       MOVEI   AC1,@DEVIAD(PDDB)\r
+       ADD     AC1,[XWD 700,1]\r
+       MOVEM   IOS,DEVIOS(DDB)\r
+       MOVSI   IOS,TOIP        ;MARK TYPE-OUT ACTIVE\r
+       IORM    IOS,TTYPTR(DDB)\r
+       PUSHJ   PDP,XMITINT\r
+       SKIPA\r
+\r
+PTYIN2:        PUSHJ   PDP,PTYGET              ;SHOULD BE XMITIN1+1\r
+       SKIPL   TTYPTR(DDB)     ;STILL GOING?\r
+       JRST    PTYIN5          ;NO. END OF STRING FROM TTY\r
+       IDPB    CHREC,AC1\r
+       SOJG    AC2,PTYIN2\r
+PTYIN5:        PUSHJ   PDP,PTEXCH\r
+       MOVEI   AC3,@DEVIAD(DDB)\r
+       SUBI    AC1,1(AC3)\r
+       HRRM    AC1,1(AC3)      ;WORD COUNT TO BATCH\r
+       PUSHJ   PDP,ADVBFF\r
+       JRST    PTYIN3\r
+       SKIPGE  TTYPTR(PDDB)    ;STILL MORE TO COME?\r
+       JRST    PTYIN6          ;YES. SEE IF ROOM\r
+\r
+PTYIN3:        MOVEM   IOS,DEVIOS(DDB)\r
+       POPJ    PDP,\r
+\r
+PTYIN6:        MOVSI   TAC,TOIP        ;CLEAR ACTIVE BIT IN CASE STOPPED\r
+       ANDCAM  TAC,TTYPTR(PDDB)\r
+       SOJG    AC2,PTYIN4      ;COUNT, GO ON IF ROOM\r
+       JRST    PTYIN3          ;NO ROOM, STOP\r
+\f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
+;TTY OUTPUT WITH PTY INPUT\r
+\r
+\r
+INTERNAL PTYPE\r
+EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
+\r
+PTYPE: PUSH    PDP,PDDB\r
+       MOVE PDDB,LINE\r
+       SUBI PDDB,TCONLN\r
+       HRRZ PDDB,PTYTAB(PDDB)\r
+       PUSH    PDP,PIOS\r
+       MOVEM IOS,DEVIOS(DDB)\r
+       MOVEI PIOS,IOPTRE\r
+       IORB PIOS,DEVIOS(PDDB)\r
+       PUSHJ   PDP,PTWAKE\r
+       POP     PDP,PIOS\r
+       POP     PDP,PDDB\r
+       POPJ    PDP,0\r
+\r
+PTWAKE:        PUSH    PDP,TAC1        ;SAVE LINE\r
+       PUSH    PDP,TEM\r
+       LDB     TAC,[POINT 6,DEVCHR(PDDB),5]    ;PTY JOB NR\r
+       HRRZ    TAC1,CLOCK              ;LAST JOB IN CLOCK QUEUE\r
+PTWAK2:        CAIN    TAC1,CIPWTM1            ;LOOKED AT ALL JOBS\r
+       JRST PTWAK1                     ;YES, WAS NOT SLEEPING\r
+       HLRZ    TEM,(TAC1)              ;SLEEPING JOB?\r
+       CAIE    TEM,WAKE\r
+       SOJA    TAC1,PTWAK2             ;NO, IN QUEUE FOR SOME OTHER REASON\r
+       LDB     TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
+       CAME    TEM,TAC                 ;IS IT THIS ONE?\r
+       SOJA    TAC1,PTWAK2             ;LNO, LOOP TILL DONE\r
+       MOVE    TEM,(TAC1)              ;YES, ZERO TIME LEFT TO SLEEP\r
+       TRZ     TEM,7777\r
+       AOS     TEM                     ;LADD ONE SO NEXT TICK WILL MAKE 0\r
+       MOVEM   TEM,(TAC1)\r
+PTWAK1:        POP     PDP,TEM\r
+       POP     PDP,TAC1        ;RESTORE LINE\r
+       POPJ    PDP,\r
+\f;ROUTINES TO SET VARIOUS BITS\r
+;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
+\r
+INTERNAL PTYOW,PTMNMD,PTMNMZ\r
+\r
+PTMNMD:        PUSH    PDP,PIOS\r
+       MOVEI   PIOS,MONMOD     ;PTY INTO MONITOR MODE\r
+       JRST    PTYSET\r
+\r
+PTMNMZ:        PUSH    PDP,PIOS\r
+       HRROI   PIOS,MONMOD     ;PTY OUT OF MONITOR MODE\r
+       JRST    PTYSET\r
+\r
+PTYOW: PUSH    PDP,PIOS\r
+       MOVEI   PIOS,IOPTW      ;PTY IN OUTPUT WAIT\r
+\r
+PTYSET:        PUSH    PDP,PDDB\r
+       MOVE    PDDB,LINE\r
+       SUBI    PDDB,TCONLN     ;FIND PTY THAT TTY IS LINKED TO\r
+       HRRZ    PDDB,PTYTAB(PDDB)\r
+       JUMPE   PDDB,PTYST1             ;PREVENT CATASTROPHE\r
+       TLZE    PIOS,-1         ;BIT TO BE SET OR ZEEROED\r
+       ANDCAB  PIOS,DEVIOS(PDDB)       ;ZEROED\r
+       IORB    PIOS,DEVIOS(PDDB)\r
+       TRNE    PIOS,IOPTW      ;IS LINKED TTY JOB IN INPUT WAIT?\r
+       PUSHJ   PDP,PTWAKE      ;YES, WAKE UP CONTROL JOB\r
+PTYST1:        POP     PDP,PDDB\r
+       POP     PDP,PIOS\r
+       \r
+       POPJ    PDP,0\r
+\fPTYEND:       END\r
+\f\r
diff --git a/src/ptysrh.mac b/src/ptysrh.mac
new file mode 100644 (file)
index 0000000..1e2b1e5
--- /dev/null
@@ -0,0 +1,357 @@
+TITLE  PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
+SUBTTL D. WITCRAFT/RAP  TS3.19  24 SEP 68  V004\r
+XP     VPTYSF,004\r
+               ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
+\r
+ENTRY PTYSRH           ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
+PTYSRH:\r
+\r
+\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+       DDB=DEVDAT\r
+       LINE=TAC1\r
+\r
+       CHREC=TEM\r
+       SCNHAC=12\r
+       PIOS=13\r
+       PDDB=14\r
+       RPTB=400\r
+\r
+       SP=2000                 ;SPECIAL TTY CHARACTER\r
+       T37=10000               ;MODEL 37-FULL CHARACTER SET\r
+SYNC=40000             ;BREAK CHARACTER SEEN---FROM SCNSER\r
+\r
+;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
+\r
+IOPTW=4000             ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
+IOPTRE=2000            ;PTY RESPONSE IS READY\r
+MONMOD=1000            ;PTY IS IN MONITOR MODE\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
+EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
+INTERNAL PTYSA0,PTYRE0,ACSAV0\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PSEUDO CONSOLE DEVICE DATA BLOCK\r
+;REMAINING PTY DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME\r
+       INTERN  PTYDDB\r
+       ZZ=.\r
+PTYDDB:        SIXBIT  /PTY0/\r
+       XWD     0,10000+STTYBF+1        ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
+       Z\r
+       EXP     PTYDSP\r
+       XWD     DVIN+DVOUT,3\r
+       Z\r
+       XWD     PROG,0\r
+       XWD     PROG,0\r
+       Z\r
+       XP      PTYCSV,.-ZZ\r
+       Z\r
+       XP      PTYDDS,.-ZZ\r
+       BLOCK   13\r
+       XP      PTYBND,PTYSAC+12\r
+       XP      PTYDM1,PTYBND-1\r
+       XP      PTYDDS,.-ZZ     ;SIZE OF PTY DDB\r
+\r
+PTYSA2:        BLT     SCNHAC,0\r
+PIOSAV:        0\r
+PDDSAV:        0\r
+>\r
+\fINTERNAL PTYDSP\r
+EXTERNAL OUT\r
+       POPJ    PDP,    ;INITIALIZE\r
+       POPJ    PDP,            ;PRINT ERROR, STOP JOB\r
+PTYDSP:        JRST PTYREL\r
+       JRST OUT\r
+       JRST PTYOUT\r
+       JRST PTYIN\r
+\fEXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL\r
+\r
+PTYREL:        LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
+       SETZM PTYTAB(LINE)\r
+       ADDI LINE,TCONLN\r
+       SKIPN TTYTAB(LINE)\r
+       POPJ PDP,\r
+       PUSH PDP,DDB\r
+       HRRZ DDB,TTYTAB(LINE)\r
+       PUSHJ PDP,TTYKIL\r
+       POP PDP,DDB\r
+       POPJ PDP,\r
+\f;PTY OUTPUT\r
+;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS\r
+;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF\r
+;A TTY DATA BLOCK IS AVAILABLE.  IF NONE IS AVAILABLE,\r
+;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS\r
+;AND OUTPUT IS TERMINATED.\r
+\r
+;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
+;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED\r
+;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS\r
+;ADVANCED IOPTRE IS SET IN PTY STATUS , AND CONTROL RETURNS\r
+;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
+;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
+;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
+;UNTIL THEY ARE EMPTY.\r
+\r
+;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
+;DOES AN "OUTPUT" UUO.  IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
+;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
+;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
+;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
+;SET IN THE OF IOS)\r
+\r
+\r
+EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD\r
+EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI\r
+EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL\r
+\r
+PTYOUT:        LDB LINE,PUNIT\r
+       JSR PTYSAV\r
+       SKIPN PTYTAB(LINE)\r
+       HRRZM DDB,PTYTAB(LINE)\r
+       SKIPE TPYTAB(LINE)      ;HAS A TTY DDB BEEN ASSIGNED?\r
+       JRST PTYOU0-1           ;YES\r
+       ADDI LINE,TCONLN\r
+       MOVEI CHREC,240         ;NO\r
+       PUSHJ PDP,TCOMM\r
+       CAIE CHREC,"X"          ;ANY AVAILABLE?\r
+       JRST PTYOU6             ;YES\r
+       JSR PTYRET\r
+       TRO IOS,DEVIOS(DDB)     ;NO\r
+       MOVEM IOS,DEVIOS(DDB)\r
+       POPJ PDP,\r
+\r
+PTYOU6:        TLO     IOS,T37+IOFST   ;FORCE BUFFER RESET\r
+                               ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERRO OTHERWI)\r
+       MOVEM IOS,DEVIOS(DDB)\r
+       JSR PTYRET              ;RESTORE ACS\r
+\r
+PTYOU0:        TRNE    IOS,IOPTRE\r
+       POPJ    PDP,\r
+       TLZE IOS,IOBEG          ;FIRST IO\r
+       TLO IOS,IOFST           ;YES\r
+       TLZN IOS,IOFST          ;FIRST ITEM IN BUFFER?\r
+       JRST PTYOU1             ;NO\r
+       TLO IOS,IO              ;YES. INITIALIZE POINTER & COUNT\r
+       HRRZ TAC,DEVOAD(DDB)\r
+       ADD TAC,[XWD 700,1]\r
+       ADDI TAC,(PROG)\r
+       MOVEM TAC,DEVOAD(DDB)\r
+       HRRZ ITEM,@TAC\r
+       JUMPE ITEM,PTYOU8       ;BUFFER EMPTY>\r
+\f      PUSHJ PDP,ITMCNT\r
+       MOVEM ITEM,DEVCTR(DDB)\r
+\fPTYOU1:       TRO IOS,IOACT\r
+       TRZ IOS,IOPTRE\r
+       JSR PTYSAV              ;SAVE ACS\r
+       LDB     LINE,PUNIT\r
+       ADDI LINE,TCONLN\r
+       EXCH    IOS,PIOS\r
+\r
+PTYOU2:        SOSGE DEVCTR(PDDB)      ;BUFFER EMTY?\r
+       JRST PTYOU3             ;YES\r
+       ILDB CHREC,DEVOAD(PDDB) ;NO\r
+PTYOU7:        PUSHJ PDP,TCOMM         ;SEND NEXT CHARACTER\r
+       TLNE IOS,IOFST\r
+       JRST PTYOU3\r
+       TLNE    IOS,SP          ;SPECIAL CHARACTER ECHO?\r
+       JRST    PTYOU4          ;YES, SEE IF CONTROL CHAR ECHO\r
+       TLNE    IOS,SYNC        ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT?\r
+       JRST    PTYOU3          ;YES, BUFFER NOT MOVED INTO OBJECT\r
+                               ;JOB TTY IN BUFFER \r
+       JRST PTYOU2             ;NO\r
+\r
+PTYOU4:        CAIE CHREC,"^"\r
+       JRST PTYOU7\r
+       MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT\r
+       MOVEM IOS,DEVIOS(DDB)   ;SAVE TTY STATE\r
+       TRO PIOS,IOPTRE         ;LET USER KNOW\r
+\r
+PTYOU3:        JRS PTYRET              ;RESTORE ACS\r
+       EXCH    IOS,PIOS\r
+PTYOU8:        TLZE IOS,IOW\r
+       PUSHJ PDP,SETIOD        ;START PTY JOB\r
+       HRLI    TAC,PROG\r
+       HRL     TAC,DEVBUF(DDB)\r
+       HRR     TAC,@TAC\r
+       MOVEM   TAC,DEVOAD(DDB)\r
+       PUSHJ PDP,ADVBFE        ;ADVANCE PTY OUTPUT BUFFER\r
+       JRST PTYOU5             ;NEXT BUFFER IS EMPTY.\r
+       TRNN PIOS,IOPTRE        ;RESPONSE?\r
+       JRST PTYOU0             ;NO\r
+       TRO IOS,IOPTRE          ;YES, SET RESPONSE FLAG AND RETURN TO USER\r
+PTYOU5:        TRZ IOS,IOACT+IOPTW     ;CONSIDER OUTPUT COMPLETED\r
+       TLO IOS,IOFST\r
+       MOVEM IOS,DEVIOS(DDB)\r
+       POPJ PDP,\r
+\fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,STOSQD,ADRERR\r
+\r
+PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
+       ADDI LINE,TCONLN\r
+       HRRZ PDDB,TTYTAB(LINE)  ;TTY DDB ADDRESS\r
+       JUMPN PDDB,PTYIN1       ;HAS TTY DDB BEEN LOST?\r
+       TRO IOS,IOIMPM          ;YES, THAT'S ALL.\r
+       JRST PTYIN8\r
+\r
+PTYIN1:        PUSH PDP,LINE\r
+       TLO IOS,IOFST\r
+       TDZ IOS,[XWD IO,IOPTRE]\r
+       MOVEI   TAC,440700+PROG\r
+       HLLM    TAC,DEVPTR(DDB)\r
+\r
+       TRO IOS,IOACT\r
+       MOVE PIOS,DEVIOS(PDDB)\r
+       TLNN PIOS,IO+SP\r
+       JRST PTYI10\r
+       SETZM CHREC\r
+       EXCH CHREC,PTYCSV(DDB)  ;HAS FIRST CHAR BEEN REC?\r
+       JUMPE CHREC,PTYIN5+1    ;NO\r
+                               ;YES,SAVE LINE NO.\r
+PTYIN4:        TLNN PIOS,IO+SP         ;IS TTY DONE?\r
+       JRST PTYI38             ;YES. THATS ALL\r
+       MOVE DAT,CHREC\r
+       PUSHJ PDP,STODAT        ;STORE CHARACTER\r
+       JRST    ADRERR\r
+       JRST PTYIN6             ;BUFFER FULL\r
+\r
+PTYIN5:        JUMPE ITEM,PTYI3A       ;IF COUNT RUNS OUT\r
+       EXCH PIOS,IOS           ;NO. GET NEXT CHAR.\r
+       EXCH PDDB,DDB           ;SET IOS AND DBD FOR TTY\r
+       POP PDP,LINE            ;RESTORE LINE NO.\r
+       PUSH PDP,ITEM           ;SAVE ITEM COUNT\r
+       PUSH PDP,PROG\r
+       PUSHJ PDP,TCOMM\r
+       POP PDP,PROG\r
+       POP PDP,ITEM            ;RESTORE ITEM COUNT\r
+       EXCH PIOS,IOS\r
+       EXCH PDDB,DDB\r
+       PUSH PDP,LINE\r
+       JRST PTYIN4\r
+\fPTYI3A:       TRZ     IOS,IOBKTL\r
+       TRO     IOS,IOPTRE      ;INPUT READY\r
+PTYI3B:        PUSHJ PDP,STOSQD\r
+       JRST    ADRERR\r
+       TLOA IOS,IOFST\r
+\r
+PTYIN6:        TRO     IOS,IOPTRE+RPTB\r
+       PUSHJ PDP,ADVBFF        ;ADVANCE PTY BUFFER\r
+       JRST PTYI10             ;NEXT BUFFER IS FULL.\r
+       TLO IOS,IOFST\r
+       TRZE IOS,RPTB\r
+       JRST PTYIN5+1\r
+PTYI10:        TLZE IOS, IOW\r
+       PUSHJ PDP, SETIOD\r
+       TRZ IOS,IOACT+RPTB\r
+       POP PDP, LINE\r
+PTYIN8:        MOVEM IOS, DEVIOS(DDB)\r
+       POPJ PDP,\r
+\f;SAVE ACCUMULATORS\r
+;CALL  MOVEI DDB,ADDRESS OF PTYDB\r
+;      JSR PTYSAV\r
+\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PTYSAV:        0\r
+>\r
+PTYSA0:        MOVEM SCHHAC,PTYBDN(DDB)        ;SAVE HIGH AC\r
+       HRRZ SCNHAC,DDB\r
+       ADDI SCHNHAC,PTYBM1\r
+       HRRM SCNHAC,PTYSA2\r
+       SUBI SCNHAC,SCNHAC-1\r
+       XCT     PTYSA2          ;DO BLT SCNHAC\r
+       MOVE PDDB,DDB\r
+       JRST @PTYSAV\r
+\r
+;RESTORE ACCUMULATORS\r
+;CALL  MOVEI PDDB,PTY DATA BLOCK ADDRESS\r
+;      JSR PTYRET\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PTYRET:        0\r
+>\r
+PTYRE0:        HRRZ SCNHAC,PDDB\r
+       ADDI SCNHAC,PTYSAC\r
+       HRLZS   SCNHAC\r
+       BLT SCNHAC,SCNHAC\r
+       JRST @PTYRET\r
+\r
+;SAVE ONLY PIOS AND PDDB\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PACSAV:        0\r
+>\r
+ACSAV0:        MOVEM   PIOS,PIOSAV\r
+       MOVEM   PDDB,PDDSAV\r
+       JRST    @PACSAV\r
+\r
+ACRET: MOVE    PIOS,PIOSAV\r
+       MOVE    PDDB,PDDSAV\r
+       POPJ    PDP,\r
+\f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
+;TTY OUTPUT WITH PTY INPUT\r
+\r
+\r
+INTERNAL PTYPE\r
+EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
+\r
+PTYPE: MOVE PDDB,LINE\r
+       SUBI PDDB,TCONLN\r
+       HRRZ PDDB,PTYTAB(PDDB)\r
+       TRO     IOS,IOACT       ;FORCE RESCHED TO CONTROL JOB\r
+       MOVEM IOS,DEVIOS(DDB)\r
+       MOVEI TAC,IOPTRE\r
+       IORB TAC,DEVIOS(PDDB)\r
+       MOVEM CHREC,PTYCSV(PDDB)        ;SAVE CHARACTER\r
+\r
+PTWAKE:        PUSH PDP,TEM\r
+       PUSH    PDP,TAC1\r
+       LDB     TAC,[POINT 6,DEVCHR(PDDB),5]    ;PTY JOB NR\r
+\r
+       HRRZ    TAC1,CLOCK              ;LAST JOB IN CLOCK QUEUE\r
+PTWAK2:        CAIN    TAC1,CIPWTM1            ;LOOKED AT ALL JOBS\r
+       JRST PTWAK1                     ;YES, WAS NOT SLEEPING\r
+       HLRZ    TEM,(TAC1)              ;SLEEPING JOB?\r
+       CAIE    TEM,WAKE\r
+       SOJA    TAC1,PTWAK2             ;NO, IN QUEUE FOR SOME OTHER REASON\r
+       LDB     TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
+       CAME    TEM,TAC                 ;IS IT THIS ONE?\r
+       SOJA    TAC1,PTWAK2             ;LNO, LOOP TILL DONE\r
+       MOVE    TEM,(TAC1)              ;YES, ZERO TIME LEFT TO SLEEP\r
+       TRZ     TEM,7777\r
+       AOS     TEM                     ;LADD ONE SO NEXT TICK WILL MAKE 0\r
+       MOVEM   TEM,(TAC1)\r
+PTWAK1:        POP     PDP,TAC1\r
+       POP     PDP,TEM\r
+       POPJ    PDP,\r
+\f;ROUTINES TO SET VARIOUS BITS\r
+;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
+\r
+INTERNAL PTYOW,PTMNMD,PTMNMZ\r
+\r
+PTMNMD:        PUSH    PDP,PIOS\r
+       MOVEI   PIOS,MONMOD     ;PTY INTO MONITOR MODE\r
+       JRST    PTYSET\r
+\r
+PTMNMZ:        PUSH    PDP,PIOS\r
+       HRROI   PIOS,MONMOD     ;PTY OUT OF MONITOR MODE\r
+       JRST    PTYSET\r
+\r
+PTYOW: PUSH    PDP,PIOS\r
+       MOVEI   PIOS,IOPTW      ;PTY IN OUTPUT WAIT\r
+\r
+PTYSET:        MOVE    PDDB,LINE\r
+       SUBI    PDDB,TCONLN     ;FIND PTY THAT TTY IS LINKED TO\r
+       HRRZ    PDDB,PTYTAB(PDDB)\r
+       TLZE    PIOS,-1         ;BIT TO BE SET OR ZEEROED\r
+       ANDCAB  PIOS,DEVIOS(PDDB)       ;ZEROED\r
+       IORB    PIOS,DEVIOS(PDDB)\r
+       TRNE    PIOS,IOPTW      ;IS LINKED TTY JOB IN INPUT WAIT?\r
+       PUSHJ PDP,PTWAKE        ;YES, WAKE UP CONTROL JOB\r
+       JSRT ACRET\r
+\f      END\r
+\f\r
diff --git a/src/s.mac b/src/s.mac
new file mode 100644 (file)
index 0000000..617380c
--- /dev/null
+++ b/src/s.mac
@@ -0,0 +1,529 @@
+;***COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***\r
+\r
+\r
+;THIS SUB-PROGRAM ASSEMBLED WITH SYSTEM PAREMETER FILE - S.MAC(V414)\r
+       XLIST\r
+IFDEF LISTSN, < IFN LISTSN, <LIST      ;LIST S.MAC IN COMMON ONLY>>\r
+\r
+;      S - SYSTEM PARAMETER DEFINITIONS FOR PDP-6 AND PDP-10 TIME SHARING MONITORS\r
+;      TH/TH/TNM/RCC  04 JUN 69\r
+\r
+;THIS IS ASSEMBLED IN FRONT OF EACH SUBPROGRAM IN MONITOR\r
+\r
+\r
+DEFINE XP(A,B)         ;SYSTEM PARAMETER\r
+       <A=B\r
+       INTERNAL A\r
+>\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+;* MEANS LOADED BY UUO HANDLER ON ALL UUOS\r
+\r
+XP IOS,0       ;*IO DEVICE STATUS WORD(SEE BELOW FOR BITS)\r
+XP TAC,1       ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.)\r
+XP TAC1,2      ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.)\r
+XP PDP,3       ;*PUSH DOWN POINTER(SEPARATE LIST FOR EACH PI\r
+               ; CHANNEL AND EACH USER JOB\r
+XP ITEM,4      ;BUFFER ITEM COUNT, OR JOB NUMBER\r
+XP DAT,5       ;TTY OUTPUT BUFFER POINTER FOR COMMANDS,ERROR\r
+               ; MESSAG                ;OR TEMPORARY\r
+XP JBUF,DAT    ;ADDRESS OF 3 WORD BUFFER HEADER IN USER AREA\r
+XP DEVDAT,6    ;*LH=UUOS DONE SO FAR FOR THIS DEVICE(SEE BELOW)\r
+               ; RH=ADDRESS OF DEVICE DATA BLOCK\r
+XP PROG,7      ;*LH=HIGHEST REL. LOC. IN USER AREA\r
+               ; RH=ABSOLUTE ADDRESS OF USER AREA\r
+XP JDAT,PROG   ;*RH=ADDRESS OF JOB DATA AREA\r
+               ; LH=HIGHEST REL. LOC. IN USER AREA\r
+XP TEM,10      ;TEMPORARY USED ONLY SCNSER IO ROUTINE\r
+\r
+;ONLY 0 THRU 10 SAVED FOR INTERRUPT SERVICE\r
+\r
+XP DSER,11     ;*ADDRESS OF DEVICE SERVICE ROUT. DISPATCH TABLE\r
+XP BUFPNT,12   ;CONTENTS OF FIRST WORD OF 3 WORD USER BUFFER HEADER\r
+XP UCHN,BUFPNT ;*USER IO CHANNEL NO.\r
+XP BUFWRD,13   ;CONTENTS OF 2ND WORD OF USER BUFFER\r
+XP UUO,14      ;*CURRENT UUO IN PROGRESS\r
+               ; PROG IN INDEX FIELD FOR RELOCATION\r
+XP AC1,15      ;TEMPORARY ACS(MORE TEMPORARY THAN TAC,TAC1)\r
+XP AC2,16\r
+XP AC3,17\r
+;REDEFINE SO THAT ONLY THE ABOVE ACS WILL OCCUR IN DDT PRINTOUTS\r
+\r
+DEFINE XP(A,B)<\r
+A==B\r
+INTERNAL A\r
+>\r
+;DEFINE REST OF SYMBOLS SO THAT THEY WILL NOT BE PRINTED BY EXEC DDT ON OUTPUT\r
+\f; DEVICE DATA BLOCK NAMES\r
+       XP DEVNAM,0             ;NAME IN SIXBIT ASCII\r
+                               ; C(LH)=DEVICE MNEMONIC\r
+                               ; C(RH)=DEVICE NUMBER, LEFT JUSTIFIED\r
+       XP DEVCHR,1             ;CHARACTERISTIC\r
+                               ; BITS 0-5=JOB NUMBER(BYTE POINTER=PJOBN)\r
+                               ; ZERO VALUE IMPLIES NOT ASSIGNED\r
+       XP HUNGCT,100           ;BITS 6-11=HUNG DEVICE COUNT. SET WHEN\r
+                               ; DEVICE BECOMES ACTIVE. DECREMENTED EVERY SECOND.\r
+       XP HUNGST,1             ;BITS 12-17=HUNG DEVICE COUNT\r
+                               ; SETTING. 0 MEANS DEVICE CAN NEVER BE HUNG.\r
+                               ; BITS 18-23=DEVICE NUMBER,BINARY(BYTE POINTER=PUNIT)\r
+                               ; BITS 24-35=BUFFER SIZE\r
+       XP DEVIOS,2             ;STATUS WORD.  SEE BELOW\r
+       XP DEVSER,3             ;C(LH)=NEXT DEVICE DATA BLOCK\r
+                               ; C(RH)=DEVICE SERVICE DISPATCH TABLE\r
+;  DEVICE SERVICE DISPATCH TABLE ASSIGNMENTS\r
+       XP DINI,-2              ;DEVICE INITILIZATION\r
+       XP DHNG,-1              ;DEVICE IS HUNG\r
+       XP DRL,0                ;RELEASE\r
+       XP DCL,1                ;CLOSE\r
+       XP DCLO,DCL             ;CLOSE OUTPUT\r
+       ;IMMEDIATE ADDRESS PART OF CLOSE UUO\r
+               XP CLSOUT,1     ;INHIBIT CLOSING OUTPUT\r
+               XP CLSIN,2      ;INHIBIT CLOSING INPUT\r
+       XP DOU,2                ;OUTPUT\r
+       XP DIN,3                ;INPUT. SHORT DISPATCH TABLE\r
+       XP DEN,4                ;ENTER\r
+       XP DLK,5                ;LOOKUP\r
+       XP DDO,6                ;DUMP MODE OUTPUT\r
+       XP DDI,7                ;DUMP MODE INPUT\r
+       XP DSO,10               ;SETO\r
+       XP DSI,11               ;SETI\r
+       XP DGF,12               ;GETF UUO\r
+       XP DRN,13               ;RENAME\r
+       XP DCLI,14              ;CLOSE INPUT\r
+       XP DCLR,15              ;CALL D,[SIXBIT /UTPCLR/]\r
+       XP DMT,16               ;MTAPE\r
+               ; END OF LONG DISPATCH TABLE\r
+\f\r
+       XP DEVMOD,4             ;BITS 6-11=LEFT HALF OF IMAGE MODE BYTE POINTER\r
+                               ; BIT 35-J=1 IF MODE J IS LEGAL FOR THIS DEVICE\r
+                               ; BIT 18 DEVICE ASSIGNED BY CONSOLE COMMAND\r
+                               ; BIT 19 DEVICE ASSIGNED BY PROGRAM (INIT)\r
+\r
+;RIGHT HALF OF DEVICE CHARACTERISTICS WORD(DEVCHR UUO)\r
+       XP ASSCON,400000        ;ASSIGNED BY CONSOLE COMMAND ASSIGN\r
+       XP ASSPRG,200000        ;ASSIGNED BY PROGRAM(INIT UUO)\r
+;LEFT HALF DEVICE CHARACTERISTICS(DEVCHR UUO)\r
+       XP DVOUT,1              ;OUTPUT DEVICE\r
+       XP DVIN,2               ;INPUT DEVICE\r
+       XP DVDIR,4              ;HAS A DIRECTORY\r
+       XP DVTTY,10             ;IS A TTY\r
+       XP DVMTA,20             ;IS A MAG TAPE(REWIND)\r
+       XP DVAVAL,40            ;1 IF DEVICE IS AVAILABLE TO THIS JOB\r
+                               ; SET BY DEVCHR UUO\r
+       XP DVDTA,100            ;IT IS A DECTAPE\r
+       XP DVPTR,200            ;IS A PAPER TAPE READER\r
+       XP DVPTP,400            ;IS A PAPER TAPE PUNCH\r
+       XP DVLNG,1000           ;DEVICE HAS LONG DISPATCH TABLE\r
+                               ; (OTHER UUOS BESIDES INPUT,OUTPUT,CLOSE,RELEASE)\r
+       XP DVDIS,2000           ;IS A DISPLAY\r
+       XP TTYBIU,4000          ;TTY DDB IN USE (AS IO DEV. EVEN IF\r
+                               ; NOT AS USER CONSOLE)\r
+       XP TTYUSE,10000         ;TTY DDB IN USE FLAG\r
+       XP TTYATC,20000         ;TTY ATTACHED TO JOB IF 1\r
+       XP DVLPT,40000          ;IS A LPT (CARRIAGE CONTROL IN FORTRAN)\r
+       XP DVCDR,100000         ;IS A CARD READER(TRAILING SPACES FOR MACRO)\r
+       XP DVDSK,200000         ;IS A DISK\r
+       XP DVDIRIN,400000       ;DECTAPE DIRECTORY IN CORE IF 1(MUST BE SIGN BIT)\r
+\r
+       XP DEVLOG,5             ;LOGICAL NAME FOR JOB DEVICE\r
+       XP DEVBUF,6             ;C(LH)=REL. ADR. OF 3 WORD OUTPUT BUFFER HEADER\r
+                               ; C(RH)=REL. ADR. OF 3 WORD INPUT BUFFER HEADER\r
+       XP DEVIAD,7             ;C(LH)=PROG IN INDEX FIELD\r
+       XP DEVADR,DEVIAD\r
+                               ; C(RH)=REL. INPUT BUFFER ADD. SERVICE ROUT. IS FILLING\r
+       XP DEVOAD,10            ;C(LH)=PROG IN INDEX FIELD\r
+       XP DEVPTR,DEVOAD\r
+                               ; C(RH)=REL. OUTPUT BUFFER ADR. SERVICE ROU. IS EMPTYING\r
+       XP DEVCTR,11\r
+;FOR LONG DISPATCH TABLE DEVICES ONLY:\r
+       XP DEVFIL,11            ;FILE NAME IN SIXBIT\r
+       XP DEVEXT,12            ;LH=EXTENSION, RH=UNUSED\r
+       XP DEVPPN,13            ;PROJECT PROGRAMMER NO. (DISK ONLY)\r
+                               ; OTHER DEVICES NEED NOT HAVE THIS LOCATION IN THEM.\r
+\f; I/0 STATUS WORD ASSIGNMENTS\r
+;DATA MODES: BITS 32-35(BYTE POINTER=PIOMOD)\r
+       XP A,0                  ;ASCII\r
+       XP AL,1                 ;ASCII LINE\r
+       XP I,10                 ;IMAGE\r
+       XP IB,13                ;IMAGE BINARY\r
+       XP B,14                 ;BINARY\r
+       XP SD,15                ;SCOPE DUMP MODE\r
+       XP DR,16                ;DUMP BY RECORDS\r
+       XP D,17                 ;DUMP ACROSS RECORDS\r
+; STATUS BITS\r
+;RIGHT HALF (USER)\r
+       XP IOWC,20              ;DON'T COMPUTE WORD COUNT\r
+       XP IOCON,40             ;CONTINUOUS (CONT=0)\r
+       XP IONRCK,100           ;READ WITH NO. REREAD CHECK\r
+;BITS 27,28    DENSITY OF MAG TAPE\r
+;              00=INSTALATION STANDARD\r
+;              01=200 BPI\r
+;              10=556 BPI\r
+;              11=800 BPI\r
+       XP IOPAR,1000           ;WRITE EVEN PARITY (BCD) IF 1 ON MAG TAPE\r
+       XP IOTEND,2000          ;END OF MAG TAPE\r
+       XP IOBOT,4000           ;BEGINNING OF MAG TAPE\r
+       XP IOACT,10000          ;DEVICE ACTIVE\r
+       XP IODEND,20000         ;DATA END ENCOUNTERED\r
+       XP IOBKTL,40000         ;BLOCK TOO LARGE\r
+       XP IODTER,100000        ;DATA ERROR\r
+       XP IODERR,200000        ;DEVICE ERROR\r
+       XP IOIMPM,400000        ;IMPROPER MODE DETECTED BY\r
+                               ; INPUT SERVICE ROUTINE\r
+; LEFT HALF (SYSTEM)\r
+       XP IOW,1                ;I/O WAIT\r
+       XP IOBEG,2              ;VIRGIN DEVICE\r
+       XP IOFST,4              ;NEXT ITEM WILL BE THE FIRST ITEM OF A BUFFER\r
+       XP IO,20                ;OUT=1, IN=0\r
+       XP IOEND,40             ;SERVICE ROUTINE HAS TRANSMITTED LAST DATA\r
+\r
+;REST OF BITS IN LH ARE DEVICE DEPENDENT EXCEPT BIT 14(XP 10) WHICK IS KEPT AS A SPARE\r
+\r
+\r
+;COMMAND DECODER USE OF AC IOS:\r
+\r
+;RH=DISPATCH ADDRESS - SAVJOB,GETJOB,RUNJOB\r
+;LH:\r
+       XP NSRBIT,400000        ;HIGH SEG TO BE FLAGGED NON-SHARABLE(SAVE VS SSAVE COMMAND)\r
+                               ; DO NOT CONFUSE WITH SIGN BIT OF JBTSTS\r
+                               ; WHICH SAYS SEG IS SHARABLE\r
+\r
+\r
+;HARDWARE BITS:\r
+\r
+       XP UWP,1                ;POSITION IN LH OF DATAO APR TO TURN USER-MODE WRITE PROTECT ON\r
+       XP USRMOD,10000 ;LH PC WORD, MACHINE WAS IN USER MODE WHEN PC STORED\r
+       XP UIOMOD,4000  ;LY PC WORD, MACHINE WAS IN USER IO MODE WHEN PC STORED\r
+       NXM=10000               ;NON EX MEMORY\r
+       POV=200000              ;PUSH DOWN OVERFLOW\r
+       ILM=20000               ;ILLEGAL MEMORY\r
+                       ; IE ALL INSTRUCTIONS WERE LEGAL\r
+\f\r
+;LEFT HALF USRJDA (JOB DEVICE ASSIGNMENTS) UUO'S FOR THIS CHANNEL SINCE LAST INIT\r
+       XP INITB,400000         ;INIT-SAVEGET DEPENDS ON THIS BEING SIGN BIT\r
+       XP IBUFB,200000         ;INIT WITH INPUT BUFFER SPECIFIED\r
+       XP OBUFB,100000         ;INIT WITH OUTPUT BUFFER SPECIFIED\r
+       XP LOOKB,40000          ;LOOKUP\r
+       XP ENTRB,20000          ;ENTER\r
+       XP INPB,10000           ;INPUT\r
+       XP OUTPB,4000           ;OUTPUT\r
+       XP ICLOSB,2000          ;INPUT CLOSE\r
+       XP OCLOSB,1000          ;OUTPUT CLOSE\r
+       XP INBFB,400            ;INBUF\r
+       XP OUTBFB,200           ;OUTBUF\r
+       XP SYSDEV,100           ;THIS DEVICE IS SYSTEM TAPE\r
+                               ; PROJ.PROG. NO 1,1 ON DSK\r
+       XP RENMB,40             ;RENAME UUO\r
+       XP DSKRLB,20            ;TO DISTINGUISH RELEASE FROM RESET UUO IN DSKSER.\r
+                               ; RELEASE CLEARS THEM ALL\r
+\r
+;MTAPE UUO BITS\r
+       XP SLICE,40             ;SET SLICE LEVEL IF A 1 ACCORDING TO SLEVEL\r
+       XP SLEVEL,20            ;VALUE OF SLICE LEVEL IF SLICE A 1\r
+\r
+\r
+;ERROR CODES RETURNED TO USERS ON LOOKUP AND ENTER AND RENAME FAILURES(DISK ONLY)\r
+;IN 2ND WORD OF 4 WROD ARGUMENT BLOCK(RH)\r
+;THE SAME ERROR CODES ARE RETURNED ON RUN AND GETSEG UUOS FOR ALL DEVICES\r
+\r
+       XP FNFERR,0     ;FILE NOT FOUND OR 0 FILE NAME\r
+       XP IPPERR,1     ;INCORRECT PROJECT,PROGRAMMER NO.\r
+       XP PRTERR,2     ;PROTECTION FAILURE(OR DIRECTORY FULL ON DTA)\r
+       XP FBMERR,3     ;FILE BEING MODIFIED\r
+       XP AEFERR,4     ;ALREADY EXISTING FILE(RENAME ONLY)\r
+       XP NLEERR,5     ;NEITHER LOOKUP NOR ENTER(RENAME ONLY)\r
+       XP TRNERR,6     ;TRANSMISSION ERROR(RUN,GETSEG UUO ONLY)\r
+       XP NSFERR,7     ;NOT A SAVE FILE(RUN,GETSEG UUO ONLY)\r
+       XP NECERR,10    ;NOT ENOUGH CORE(RUN,GETSEG UUO ONLY)\r
+       XP DNAERR,11    ;DEVICE NOT AVAILABLE(RUN,GETSEG UUO ONLY)\r
+       XP NSDERR,12    ;NO SUCH DEVICE(RUN,GETSEG UUO ONLY)\r
+       XP ILUERR,13    ;ILLEGAL UUO (GETSEG ONLY) NOT TWO RELOC REG. CAPABILITY\r
+\f; JOB BUFFER AREA HEADER\r
+       XP JBFADR,0             ;BIT 0=1 IF THIS BUFFER RING HAS NEVER BEEN\r
+                               ; REFERENCED FROM THE USER'S PROGRAM BY\r
+                               ; AN INPUT OR OUTPUT COMMAND.\r
+                               ; BITS 1-17=UNUSED\r
+                               ; BITS 18-35=CURRENT BUFFER ADDRESS\r
+       XP JBFPTR,1             ;BYTE POINTER TO NEXT BYTE -1\r
+       XP JBFCTR,2             ;POSITIVE ITEM COUNT\r
+; JOB BUFFER HEADER\r
+       XP IOUSE,400000         ;1 IF BUFFER IS FULL (OR BEING EMPTIED)\r
+                               ; 0 IF BUFFER IS EMPTY (OR BEING FILLED)\r
+                               ; BITS 1-17=BUFFER SIZE\r
+                               ; BITS 18-35=NEXT BUFFER ADDRESS\r
+\f;JOB STATUS WORD(JBTSTS TABLE), ONE WORD FOR EACH JOB(SOME BITS ALSO APPEAR IN HIGH SEG STATUS WORD)\r
+\r
+\r
+       XP RUN,400000           ;USER WANTS JOB TO RUN(MUST BE SIGN BIT)\r
+       XP SNA,400000           ;HIGH SEG NUMBER ASSIGNED (ANALOGOUS TO JNA EXCEPT\r
+                               ; MUST BE SIGN BIT)\r
+       XP CMWB,200000          ;JOB TYPED A COMMAND WHICH NEEDS CORE\r
+                               ; WHICH IS ON DISK.  SET BY COMMAND DECODER\r
+                               ; CLEARED WHEN JOB IN CORE AGAIN.\r
+       XP SHRSEG,200000        ;HIGH SEG IS SHARABLE (ALTHOUGH NAME MAY BE 0\r
+                               ; IG IT HAS BEEN SUPERSEDED)\r
+                               ; THIS BIT ALSO APPEARS IN SAME PLACE IN LH OF\r
+                               ; OF JBTSGN FOR EACH USER TO INDICATE USER IS USING A SHARABLE\r
+                               ; HIGH SEG (ALSO APPEARS IN LH OF AC ITEM WHEN\r
+                               ; RH IS SEG NUMBER FOR A PARTICULAR JOB\r
+       XP JACCT,100000         ;PRIVILEGED SYSTEM CUSP IS BEING RUN WHICH CANNOT\r
+                               ; BE STOPPED (E.G., LOGIN\r
+                               ; OR LOGOUT).  PROTECT IT FROM CURIOUS EYES.\r
+                               ; DISABLE CONTROL C, MADE IT ACT LIKE ALT-MODE\r
+       XP JNA,40000            ;THIS JOB NUMBER IS ASSIGNED(JOB INITIALIZED)\r
+       XP JERR,20000           ;A MONITOR DETECTED ERROR HAS OCCURRED\r
+                               ; JOB CAN NOT CONTINUE\r
+       XP NSWP,10000           ;JOB OR HIGH SEG IS NOT TO BE SWAPPED(REALTIME OR DISPLAY)\r
+                               ; (CAN BE SHUFFLED OR NOT ACCORDING TO NSHF)\r
+                               ; HIGH SEG CANNOT BE SWAPPED DURING SAVE\r
+       XP SHF,4000             ;MONITOR IS WAITING FOR DEVICES FOR THIS\r
+                               ; JOB TO STOP AFTER CURRENT BUFFERFULL\r
+                               ; SO JOB CAN BE SHUFFLED IN CORE OR SWAPPED OUT\r
+                               ; IF JOB ONLY HAS LOW SEG\r
+       XP SWP,2000             ;0 IF JOB IN CORE, 1 IF SWAPPED OUT OR ON WAY\r
+                               ; IN OR OUT\r
+\r
+                               ; SAME FOR LOW AND HIGH SEGMENTS\r
+       XP NSHF,1000            ;JOB IS NOT SHUFFLABLE\r
+                               ; OR HIGH SEGMENT HAS ACTIVE SAVE IO\r
+       XP CLKR,400             ;JOB HAS A CLOCK REQUEST IN.\r
+                               ; NEEDED SO ONLY ONE REQUEST PER JOB\r
+       XP STOPIO,SWP+CMWB+SHF  ;FORCE JOB TO STOP TO EXECUTE\r
+                               ; SWAP, COMMAND OR \r
+                               ; SHUFFLE\r
+\r
+       ;BITS 10-14 USED TO INDICATE JOB IN WAIT FOR A SHARABLE DEVICE\r
+       ;0 MEANS JOB NOT WAITING FOR SHARABLE DEVICE\r
+       ;SEE SCHEDULER(CLKCSS) FOR DEFINITION OF WAIT CODES\r
+\r
+       XP JWSIZ,5              ;SIZE OF WAIT CODE\r
+       XP JWPOS,^D14           ;RIGHT MOST BIT POS. OF WAIT CODE\r
+       XP WTMASK,370           ;MASK FOR CLEARING WAIT CODES\r
+\r
+;BITS 15-17 ARE NO LONGER SET BY LOGIN, THEY ARE MONITOR STATUS BITS\r
+\r
+       XP JLOG,4               ;JOB SUCCESSFULLY LOGGED IN\r
+       XP JRQ,2                ;JOB HAS CHANGED STATE AND MUST BE REQUEUED AT CLOCK\r
+                               ; LEVEL BEFORE RESCHEDULING CAN TAKE PLACE\r
+       XP JXPN,1               ;JOB MUST BE SWAPPED OUT BECAUSE IT IS EXPANDING SIZE\r
+                               ; OF CORE AND THERE WASN'T ROOM IN CORE\r
+\r
+;BITS 9-17 ARE USED FOR ACCESS PRIVILEGERS BITS FOR SHARABLE HIGH SEGMENTS\r
+; SAME FORMAT AS ACCESS BITS FOR DISK\r
+\r
+       XP HSASIZ,^D9   ;SIZE OF HIGH SEG ACCESS BITS\r
+       XP HSAPOS,^D17  ;RIGHT MOST POSITION OF HIGH SEG ACCESS BITS\r
+       XP HSAMSK,777   ;MASK TO CLEAR ACCESS PRIVILEGES\r
+;MASKS USED TO TEST STATUS CONDITIONS:\r
+\r
+       XP RUNABLE,RUN+JNA      ;STATUS BIT PATTERN FOR JOB TO BE RUNABLE\r
+       XP RUNMSK,JLOG+CLKR+NSHF+JACCT+NSWP     ;BITS WHICH DO NOT MATTER FOR RUNABILITY\r
+\f;BITS IN JBTSWP TABLE\r
+\r
+       XP FRGSEG,400000        ;LH - 1 IF LOW OR HIGH SEG IS FRAGMENTED ON SWP DEV\r
+       XP SWPCLR,400000        ;RH - 1 IF JOB DATA AREA SHOULD BE CLEARED AFTER\r
+                               ; IN. SET ON 140 RESTART SO NO DEVICES ASSIGNED\r
+\f;VIRTUAL ADDRESSING SPACE DESCRIPTOR WORD (JBTSGN) ONE WORD FOR EACH JOB\r
+;THIS WORD APPEARS IN AC ITEM\r
+;LH BITS\r
+       XP SPYSEG,400000        ;THE HIGH SEB IS PHYSICAL CORE (SEE SPYUUO)\r
+                               ; MUST BE SIGN BIT SO TEST FOR JOB HAVING A\r
+                               ; REAL HIGH SEG IS SKIPG JBTSGN(ITEM)\r
+       XP SHRSEG,SHRSEG        ;THE HIGH SEG THIS JOB IS USING IS SHARABLE\r
+                               ; THIS BIT ALSO APPEARS IN JBTSTS FOR HIGH SEGS\r
+       XP UWPOFF,100000        ;IF 1, USER-MODE WRITE PROTECT IS OFF FOR THIS JOB\r
+       XP MEDDLE,40000         ;IF 1, USER HAS MEDDLED WITH SHARABLE PROGRAM SUCH\r
+                               ; THAT PROGRAM CANNOT TRUST ITSELF\r
+                               ; TO TURN UWP OFF OR CHANGE HIGH SEG CORE ASSIGNMENT \r
+                               ; MEDDLING MEANS:\r
+                               ;   1. START N, OR D COMMAND\r
+                               ;   2. RUN UUO WITH GREATER THAN 1 STARTING\r
+                               ;      INCREMENT\r
+                               ;   3. GETSEG UUO\r
+                               ;  4. HIGH SEG IS PHYSICAL CORE (SPY UUO)\r
+XP CORCNT,20000                ;#1, THE HIGH SEG IN CORE COUNT FOR THIS JOB\r
+                               ; HAS BEEN INCREMENTED, IF 0 IT HAS NOT\r
+                               ; SET AND CLEARED BY INCCNT AND DECCNT ROUTINES\r
+;RH IS HIGH SEG NUMBER (NUMBER GREATER THAN JOB MAX AND LESS THAN OR EQUAL TO JBTMAX)\r
+; OR IF SPYSEG IS SET, RH IS HIGHEST PHYSICAL ADR USER MAY SPY INTO\r
+\r
+;JOB PRIVILEGE BITS - JBTPRV TABLE\r
+;SET BY LOGIN FROM ACCT.SYS FILE AS MODIFIED BY CUSTOMER\r
+;RH RESERVED FOR SPECIAL CUSTOMER DEFINED PRIVILEGES(PLEASE START AT BIT 35)\r
+;LH RESERVED FOR DIGITAL STANDARD PRIVILEGES\r
+\r
+;BITS IN LEFT HALF\r
+       XP PVSPYM,1     ;JOB ALLOWED TO SPY AT MONITOR USING PEEK/SPY UUOS\r
+       XP PVSPYA,2     ;JOB ALLOWED TO SPY AT ALL OF CORE USING PEEK/SPY UUOS\r
+       XP PVTRPS,4     ;JOB ALLOWED TO USE TRPSET UUO\r
+\f; SYSTEM MACROS\r
+\r
+;MACRO TO PREVENT SCHEDULING, USED AT UUO LEVEL WHEN A\r
+;REENTRANT ROUTINE IS CHANGING COMMON DATA NOT YET\r
+;ASSIGNED TO A PARTICULAR JOB\r
+\r
+DEFINE NOSCHED\r
+<>\r
+\r
+;MACRO TO ALLOW SCHEDULING ONCE MORE\r
+\r
+DEFINE SCHEDULE\r
+<>\r
+\r
+;MACRO TO PREVENT CORE SHUFFLING, USED AT UUO LEVEL WHEN\r
+;A ROUTINE SETS UP AN ABSOLUTE USER ADDRESS IN AN AC\r
+;OTHER THAN PDP,PROG, OR JDAT. THE MAIN EXAMPLE IS A BLT\r
+;FROM EXEC TO USER OR USER TO EXEC.\r
+\r
+DEFINE NOSHUFF\r
+<>\r
+\r
+;MACRO TO ALLOW SHUFFLING ONCE MORE\r
+\r
+DEFINE SHUFFLE\r
+<>\r
+\r
+;MACRO TO TURN OFF ALL PI CHANNELS EXCEPT DATA CONTROL ONCE\r
+\r
+DEFINE DISABLE(A)\r
+<EXTERNAL CHNOFF\r
+       CONI PI,A\r
+       CONO PI,CHNOFF>\r
+\r
+;MACRO TO TURN THEN BACK ON\r
+\r
+DEFINE ENABLE(A)\r
+<EXTERNAL CHNON\r
+       ANDCMI A,CHNOFF ;DO NOT TOUCH DC CHANNELS\r
+       TRO A,2000      ;SET TO TRUN SELECTED CHANNEL ON\r
+       CONO PI,(A)\r
+>\r
+\r
+\r
+\r
+;MACRO TO START A DEVICE FROM UUO LEVEL\r
+;TAC:=XWD DEVINT FLAGS,CONO ARGUMENTS\r
+\r
+DEFINE STARTDV(A)\r
+<EXTERNAL PIOFF,PION\r
+       CONO PI,PIOFF\r
+       CONO A,(TAC)\r
+       HLRM TAC,A'CON\r
+       CONO PI,PION\r
+>\r
+\f;LIST OF INDEPENDENT MONITOR COMMAND FEATURES\r
+;THESE FEATURES CAN BE ELIMINATED FROM A SYSTEM BY\r
+;SETTING THE APPROPRIATE FTXXXX SYMBOL BELOW TO 0\r
+;AND REASSEMBLING THOSE ROUTINES IN WHICH CODE FOR THE\r
+;FEATURE APPEARS.  THE ROUTINES AFFECTED BY EACH FEATURE\r
+;ARE LISTED BELOW.  TO GUARANTEE THAT NO ROUTINES ARE\r
+;MISSED, FTXXXX IS DEFINED TO BE AN INTERNAL IN THOSE ROUTINES\r
+;IN WHICH IT IS USED IN CONDITIONAL ASSEMBLY.  THUS THE\r
+;RELOCATING LOADER WILL DETECT MULTIPLY DEFINED GLOBALS\r
+;IF NOT ALL ROUTINES AFFECTED HAVE BEEN REASSEMBLED.\r
+\r
+FTTIME=-1      ;TIME ACC\r
+               ; APPEARS IN APRSER,STUFF\r
+\r
+FTATTACH=-1    ;ATTACH AND DETACH TTY TO JOB COMMANDS\r
+               ; APPEARS IN APRSER,SCNSER\r
+\r
+FTTALK=-1      ;TALK TO TTYS COM.\r
+               ; APPEARS IN APRSER,SCNSER\r
+\r
+FTEXAMINE=-1   ;EXAMINE AND DEPOSIT COMMANDS\r
+               ; APPEARS IN APRSER\r
+\r
+FTREASSIGN=-1  ;REASSIGN COMMAND\r
+               ; APPEARS IN APRSER\r
+\r
+FTTRPSET=-1    ;USER IO - TRPSET,TRPJEN UUOS AND OPCODE 100(PDP-10S ONLY)\r
+               ; APPEARS IN APRSER,STUFF,CLKCSS\r
+               ; THESE UUOS ARE SOON TO BE REPLACED BY SOME KNAVE-PROOF REAL TIME UUOS\r
+\r
+FTSLEEP=-1     ;SLEEP UUO\r
+               ; APPEARS IN APRSER,STUFF\r
+\r
+FTFINISH=-1    ;FINISH COMMAND\r
+               ; APPEARS IN APRSER\r
+\r
+FTCHECK=0      ;MONITOR CHECKSUMMING\r
+               ; APPEARS IN ALL FILES EXCEPT CHAN, NULL\r
+\r
+FTMONP=0       ;MONITOR WRITE PROTECTED BETWEEN 1000 AND 20000\r
+               ; APPEARS IN ALL FILES EXCEPT CHAN, NULL\r
+\fFTRCHK=-1     ;ASSEMBLE WITH REDUNDANT CHECKING FOR INTERNAL MONITOR ERRORS.\r
+               ; HALT IF AN ERROR IS DETECTED\r
+               ; CONTINUE WILL LOOP(IF NON-RECOVERABLE ERROR) OR TRY TO RECOVER\r
+               ; OPERATOR SHOULD MAKE NOTE OF MEMORY ADDRESS REG(LOC+1 OF HALT)\r
+               ; APPEARS IN DSKINT,.....\r
+\r
+\r
+FTHALT=0       ;MONITOR HALTS WHEN IT DETECTS AN ERROR IN ITSELF INSTEAD OF PRINTING A MESSAGE\r
+               ; WHEN IT DETECTS AN ERROR.  USED FOR DEBUGGING SO A DUMP CAN BE TAKEN\r
+               ; APPEARS IN ERRCON, CONTINUE SWITCH WILL CAUSE USUAL\r
+               ; ERROR MESSAGE TO BE PRINTED, AC DAT HAS JSP DAT,ERROR IN IT ON HALT\r
+\r
+\r
+FTTRACK=0      ;MONITOR LEAVES USEFUL INFORMATION IN LOCATIONS\r
+               ; IN COMMON, NOT NEEDED EXCEPT FOR LEAVING TRACKS\r
+               ; TO DEBUG CRASHES WITH.\r
+\r
+FTTTYSER=-1    ;SCNSRF INSTEAD OF SCNSRH\r
+               ; APPEARS IN APRSER\r
+\r
+FT2REL=-1      ;SUBROUTINE CALLS TO SEGCON FOR TWO RELOCATION REGISTER CAPABILITY\r
+               ; -1 FOR PDP-6 AND PDP-10.  SEGCON IS EITHER A DUMMY SET\r
+               ; OF SUBROUTINE OR THE REAL THING DEPENDING ON THE MACHINE.\r
+               ; THOSE CUSTOMERS WITHOUT 2 REG MACHINES WHO WANT TO ELIMINATE THE 20 OR SO LOCS OF\r
+               ; SUBROUTINE CALLS TO SEGCON, CAN DO SO BY REASSEMBLIN THE MONITOR\r
+               ; WITH FT2REL=0. HOWEVER THE COMPANY WILL DISTRIBUTE MONITORS\r
+               ; WITH FT2REL=-1 ALWAYS(PDP-6 AND PDP-10)\r
+\r
+               ; APPEARS IN FIRST,ONCE,APRSR,SCHED\r
+\r
+FTKCT=-1       ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=-1       ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTABL=-1   ;GETTAB UUO - RETURN CONTENTS OF MONITOR  JOBTABLES\r
+\r
+FTRA10=0       ;NO RA-10 DISK CONTROLLER (BRYANT DISK)\r
+               ;TEMPORARILY USED IN DSKSER\r
+\f;DEFINE THE QUEUES, QUANTUM RUNNING TIME IN JIFFIES, AND PRIORITY\r
+;PRIORITY GOES BACKWARD FROM LOW TO HIGH\r
+\r
+DEFINE QUEUES\r
+<      X RN,7  ;STRAIGHT RUN (LOWEST PRIORITY)(Q=0)\r
+       X WS,6  ;IO WAIT SATISFIED\r
+       X TS,6  ;TTY IO WAIT SATISFIED\r
+       X ST,6  ;SYSTEM TAPE WAIT\r
+       IFN FTDISK,<\r
+               X AU,4  ;ALTER DISK UFD QUEUE\r
+               X MQ,4  ;MONITOR DISK QUEUE\r
+               X DA,4  ;DISK STORAGE ALLOCATION WAIT\r
+>\r
+       X DT,4  ;DECTAPE CONTROL WAIT (UP TO 8 DRIVES)\r
+       X DC,4  ;DATA CONTROL (DC) WAIT - MAGTAPE AND DECTAPE\r
+       X MT,4  ;MAGTAPE CONTROL WAIT (UP TO 8 UNITS)\r
+>\r
+\r
+\r
+;JOB STATUS CODES WHICH HAVE NO CORRESPONDING QUEUES\r
+;JOBS ARE UNRUNABLE WHEN IN THESE STATES\r
+\r
+DEFINE CODES\r
+<      X IOW,  ;IO WAIT\r
+       X TIOW, ;TTY IO WAIT\r
+       X SLP,  ;JOB SLEEPING\r
+       X NUL,  ;JOB NUMBER NOT ASSIGNED\r
+       X STOP, ;STOP (CONTROL C)\r
+>\r
+       XP STTYBF,20    ;SIZE OF TTY BUFFER\r
+       XP STTYB1,STTYBF+1      ;LENGTH+1\r
+\r
+       ASUPPRESS       ;ELIMINATE ALL SYMBOLS NOT REFERENCED LATER\r
+                       ; FROM THE SYMBOL TABLE LISTING\r
+       LIST\r
+\f\r
diff --git a/src/schedb.mac b/src/schedb.mac
new file mode 100644 (file)
index 0000000..b33d156
--- /dev/null
@@ -0,0 +1,1633 @@
+IFE FTDISK+FTRC10+2,<\r
+TITLE  SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK)\r
+>\r
+IFE FTDISK+FTRC10+1,<\r
+TITLE  SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK)\r
+>\r
+SUBTTL CLKCSW R,KRASIN/AF/TH/RCC  TS  02 JUNE 69  V421\r
+XP VSCHED,421\r
+               ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL       FTRC10  ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE\r
+               ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA\r
+               ; PRODUCTS DISK FILE) FOR SWAPPING.\r
+\r
+IFN    FTRC10, <\r
+ENTRY  RCXSKD  ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
+RCXSKD:                ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+INTERNAL       XCKCSW\r
+>\r
+IFE    FTRC10, <\r
+ENTRY  XCKCSW\r
+>\r
+\r
+EXTERNAL JOB,JBTSTS\r
+EXTERNAL JBTQ,PJBSTS\r
+EXTERNAL PJBSTS,TIMEF,MJOBN\r
+\r
+INTERNAL NXTJOB,FTSWAP\r
+\r
+;ACCUMULATOR DEFINITIONS ---\r
+QJ=DEVDAT      ;QJOB WORD\r
+SW=TAC1                ;STATUS WORD\r
+J=ITEM         ;JOB NO.\r
+\r
+;INITIALIZE SCHEDULER  (CALLED FROM SYSINI BEFORE ALL OTHER\r
+;      DEVICES ARE INITIALIZED)\r
+\r
+INTERNAL NXTINI\r
+\r
+XCKCSW:\r
+NXTINI:        MOVEI TAC,MAXQ          ;MAX. NO. OF QUEUES\r
+       SETZM AVALTB(TAC)       ;CLEAR SHARABLE DEVICE AVAIL. FLAGS\r
+       SETOM REQTAB(TAC)       ;SET SHARABLE DEVICE REQUEST COUNT\r
+                               ; TO -,  I.E. NO JOB WAITING OR\r
+                               ; USING DEVICE OTHER THAN INITIALIZATION\r
+       SOJGE TAC,.-2           \r
+       SETZM QJOB              ;CLEAR NO. OF JOBS NEEDING REQUEING\r
+       SETZM XJOB              ;CLEAR NO. OF JOBS NEEDING EXPANDING\r
+       SETZM JOBQUE            ;CLEAR JOB NO. TO BE REQUEUED\r
+       POPJ PDP,\r
+\f,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT\r
+,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0\r
+,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY\r
+,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR.\r
+,MAKES NO ASSUMPTIONS RE. ACS\r
+,RETURSN NEXT JOB TO RUN IN J.\r
+\r
+EXTERNAL JBTSWP,POTLST\r
+\r
+NXTJOB:        SKIPN TIMEF             ;CLOCK TIC?\r
+       JRST NXTJB1             ;NO\r
+       MOVSI J,MJOBN           ;YES\r
+       MOVSI SW,-1             ;DECREMENT IN CORE PROTECT TIME\r
+       MOVSI DAT,SWP\r
+       TDNE DAT,JBTSTS(J)\r
+       JRST .+3\r
+       SKIPL JBTSWP(J)\r
+       ADDM SW,JBTSWP(J)\r
+\r
+       AOBJN J,.-4\r
+\r
+NXTJB1:        SKIPN J,JOB             ;CURRENT JOB NO., IS IT NULL JOB?\r
+       JRST CKJB1              ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING\r
+       MOVEI QJ,0              ;GET READY IN CASE CURRENT JOB UNRUNNABLE\r
+       HLRZ SW,JBTSTS(J)       ;GET JOB STATUS BITS AND CODES\r
+       TRZ SW,RUNMSK+CMWB              ;MASK OUT DO NOT CARE BITS\r
+       CAIE SW,RUNABLE         ;IS CURRENT JOB RUNABLE?\r
+       JRST CKJR3              ;NO. REQUEU CURRENT JOB\r
+       SKIPN TIMEF             ;NO. IS THIS A TIME INTERRUPT?\r
+       JRST CKJB1              ;NO.\r
+\r
+       SOS SW,JBTSTS(J)        ;DECREMENT QUANT. TIME\r
+       TRNE SW,-1              ;HAS TIME GONE TO 0?\r
+       JRST CKJB1              ;NO\r
+       MOVEI DAT,QTIME         ;YES---REQUEUE AND RESET QUANT. TIME\r
+       MOVE TAC,JOBQUE\r
+       PUSHJ PDP,QXFER\r
+\fCKJB1:        SKIPG   QJ,QJDB         ;SET QJ NON ZERO IF ANY REQUEUING TO DO\r
+       JRST    CKJB5           ;NO REQUEUEING NECESSARY\r
+       MOVEI   J,JOBMAX        ;START WITH HIGHEST JOB NUMBER ASSIGNED\r
+CKJB2: MOVSI   SW,JBQ          ;JOB NEEDS REQUEUEING BIT\r
+       TDNN    SW,JBTSTS(J)    ;THIS JOB?\r
+       SOJG    J,.-1           ;NO, KEEP LOOKING\r
+       JUMPLE  J,CKJB5         ;YES,LOOKED AT ALL JOBS?\r
+                               ; (MAY NOT FIND A KJOBED JOB IF HIGHEST\r
+                               ; GO DECR, COUNT QJOB ANYWAY)\r
+       ANDCAM  SW,JBTSTS(J)    ;NO,MARK THIS JOB AS DONE\r
+CKJB3: MOVE SW,JBTSTS(J)       ;JOB STATUS WORD\r
+       MOVEI DAT,QCMW          ;ASSUME COMMAND WAIT\r
+       TLNN SW,CMWB            ;IS JOB IN COMMAND WAIT?\r
+       JRST CKJB9              ;NO.\r
+       TLNE SW,SWP+JXPN                ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?\r
+       JRST CK,JB4A            ;YES. PUT JOB IN COMMAND WAIT Q\r
+CKJB9: JUMPGE SW,CKJB4         ;NO,WAIT STATUS CODE DETERMINES NEW Q\r
+       LDB SW,PJBSTS           ;YES, GET QUEUE CODE.\r
+       CAIN    SW,WSQ          ;*** EXPERIMENTAL ***\r
+       JRST    CKJB10          ;*** EXPERIMENTAL ***\r
+       CAIN SW,TIOWD           ;CURRENT JOB GOING INTO TTY IO WAIT?\r
+       HRROS JBTSWP(J)         ;YES, SET IN CORE PROTECT TIME TO -1,\r
+                               ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE\r
+                               ; ELSE WANTS TO BE SWAPPED IN\r
+CKJB4B:        SKIPA DAT,QBITS(SW)     ;GET ADDRESS OF TRANSFER TABLE\r
+CKJB4: MOVEI DAT,QSTOP         ;IF RUN BIT WAS OFF\r
+CKJB4A:        PUSHJ PDP,QXFER         ;REQUEUE THE JOB\r
+       JUMPE QJ,SCHED          ;IF FROM NXTJOB GO DIRECTLY TO SCHED\r
+                               ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)\r
+                               ; BUT JRQ WASN'T SET SO DON'T DECR QJOB\r
+       SOSLE   QJ,QJOB         ;ANY MORE JOBS TO REQUEUE?\r
+       SOJG    J,CKJB2         ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK\r
+\r
+CKJB5: MOVEI QJ,AVLNUM         ;CK AVAL FLAGS FOR SHAR. DEVS.\r
+CKJB6: SKIPN AVALTB(QJ)        ;FLAG=0?\r
+       SOJG QJ,CKJB6           ;YES - TRY NEXT ONE\r
+       JUMPLE QJ,CKJB7         ;NO - OR FINISHED?\r
+       HLR J,AVLQTB(QJ)        ;NO--GET 1ST JOB IN Q\r
+CKJB6A:        HRRE J,JBTQ(J)\r
+       JUMPLE J,CKJB8          ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB\r
+       MOVE DAT,JBTSTS(J)      ;IS JOB IN CORE?\r
+       TLNE DAT,SWP\r
+       JRST CKJB6A             ;NO, LOOK AT NEXT JOB IN THIS QUEUE\r
+                               ; TO SEE IF IN CORE.\r
+       HRRZ DAT,AVLQTB(QJ)     ;NO--GET TRANS. TABLE ADDRESS\r
+       SETZM AVALTB(QJ)        ;CLEAR AVAL FLAG\r
+       CAIL QJ,MINQ            ;LESS THAN MIN, SHARABLE DEV. Q?\r
+       PUSHJ PDP,QXFER         ;REQUEUE THE JOB AND PUT IT IN\r
+                               ; PROCESSOR Q SO SCHEDULER WILL RUN IT\r
+CKJB8: SOJG QJ,CKJB6           ;CONTINUE IF ANY MORE FLAGS TO LOOK AT\r
+\fCKJB7:                                ;NONE--GO SHUFFLE AND SWAP\r
+IFE FTSWAP,<   EXTERNAL CHKSHF\r
+       PUSHJ PDP,CHKSHF\r
+>\r
+IFN FTSWAP,<\r
+       PUSHJ PDP,SWAP\r
+>\r
+\r
+;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE\r
+;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J\r
+\r
+SCHED: SETZM POTLST            ;CLEAR POTENTIALLY LOST TIME FLAG\r
+       MOVEI DAT,SSCAN         ;ADDRESS OF SCAN TABLE\r
+       JSP TAC,QSCAN           ;BEGIN SCAN\r
+       JRST SCHD1              ;NO MORE JOBS--RETURN NULLJOB\r
+       SETOM POTLST            ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1\r
+       MOVE QJ,JBTSTS(J)       ;IS THIS JOB SWAPPED OUT\r
+       TLNE QJ,SWP+SHF+JXPN    ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE?\r
+       JRST (TAC1)             ;YES--CONTINUE SCAN,JOB CANNOT BE RUN\r
+\r
+       HLREM TAC1,JOBQUE       ;YES--SAVE ITS Q\r
+       MOVSI QJ,WTMASK         ;CLEAR WAIT CODE\r
+       ANDCAM QJ,JBTSTS(J)\r
+       SETZM POTLST            ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN\r
+       POPJ PDP,               ;RETURN\r
+SCHD1: SETZ J,                 ;RETURN NULL JOB\r
+       POPJ PDP,\r
+\r
+\r
+;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON\r
+; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68\r
+CKJB10:        SKIPE   INFLG\r
+       SKIPL   JBTSWP(J)\r
+       JRST    CKJB4B\r
+       MOVEI   DAT,CKJBT\r
+       JRST    CKJB4A\r
+CKJBT: EXP     EQFIX\r
+       XWD     QQTTY,-PQ2      ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS\r
+INFLG: 0       ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN.\r
+\fSUBTTL        OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000\r
+\r
+,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION\r
+,TYPE TO DEFINE NUMBER OF JOBS\r
+,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION\r
+,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED\r
+,BY THEM.\r
+\r
+EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS\r
+INTERNAL QXFER,QSCAN,FTSWAP,FTDISK\r
+\r
+,STORAGE:\r
+,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD\r
+,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS\r
+,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q.\r
+,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF.  THE LINKS MAKING\r
+,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE\r
+,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND\r
+,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD\r
+,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE\r
+,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE\r
+,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE\r
+,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN\r
+,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER;\r
+,LH(LINK)=BACKWARD POINTER.\r
+,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND\r
+,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ\r
+,ITSELF IS THE Q-HEADER FOR Q 0).\r
+\r
+,ROUTINES:\r
+,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE\r
+,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH\r
+,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED.\r
+\f;QUEUE INITIALIZATION\r
+;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED)\r
+;CALLED ON RESTART AT LOC 143\r
+\r
+INTERNAL QINT\r
+EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ\r
+EXTERNAL JBTQP1 ;EQUALS JBTQ+1\r
+EXTERNAL JBTCM1 ;EQUALS JBTQ-1\r
+EXTERNAL JBTOMN ;EQUALS JBTQ-NULQ\r
+\r
+QINI:  MOVNI TAC,MXQUE         ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES\r
+       HRL TAC,TAC             ;BACKWARD POINTERS TOO\r
+       MOVEM TAC,JBTQ(TAC)\r
+       AOBJN TAC,.-1\r
+       MOVEI TAC,-NULQ         ;PUT JOBS ALL IN NULQ QUEUE\r
+       MOVSM TAC,JBTQP1        ;BACK POINTER FOR JOB 1\r
+       MOVEI ITEM,JOBMAX       ;MAX. JOB NO.\r
+       MOVEM TAC,JBTQ(ITEM)    ;FOR. POINTER OF JOBMAX JOB NO.\r
+\r
+       HRLM ITEM,JBTQMN        ;SET NULQ HEADER TO POINT TO JOB1\r
+       MOVEI TAC,1             ;AND JOBMAX\r
+       HRRM TAC,JBTQMN ;FORWARD POINTER\r
+QINI1: HRRM ITEM,JBTQM1(ITEM)  ;JOB I-1 POINT TO JOB I\r
+       SETZM JBTQ\r
+       SOJLE ITEM,CPOPJ        ;FINISHED?\r
+       HRLM ITEM,JBTQP1(ITEM)  ;BACK POINTER JOB I+1 POINTS TO JOB I\r
+       JRST QINI1\r
+\f,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"\r
+,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT\r
+,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY\r
+,RESET THE JOB'S QUANTUM TIME (RH JBTSTS).\r
+,THE DRIVING TABLES ARE "TRANSFER TABLES":\r
+,\r
+,T.TABLE:      EXP <CODE>\r
+,              XWD <QUANT-TAB>,<Q-TAB>\r
+,\r
+,DEPENDING ON <CODE>, THE SECOND WORD IS EITHER DATA OR THE\r
+,ADDRESSES OF "CORRESPONDANCE TABLES".\r
+,\r
+,THE PREFIX OF <CODE> SPECIFIES WHETHER THE JOB IS TO BE\r
+,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX\r
+,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q.\r
+,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS:\r
+\r
+\r
+,DEST-Q AS A FIXED (PREDETERMINED Q:\r
+,BQFIX: INSERT AT BEG OF DEST-Q\r
+,EQFIX: INSERT AT END\r
+,\r
+, THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q <Q-TAB>\r
+, IF <QUANT-TAB> = -1, QUANT, TIME IS NOT RESET.\r
+, IF <QUANT-TAB> .G. 0 , QUANT. TIME IS RESET TO <QUANT-TAB>.\r
+, SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD\r
+, ALONE, O CORRES, TABLE IS NECESSARY.\r
+\f,DEST-Q AS A FUNCTION OF SOURCE-Q\r
+,BQLINK:       INSRT AT BEG OF DEST-Q\r
+,EQLINK:       INSERT AT END\r
+,\r
+, <Q-TAB>=ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO\r
+, DEST-QS,\r
+, IF <QUANT-TAB> = -1, QUANT. TIME IS NOT RESET.\r
+, OTHERWISE <QUANT-TAB> IS TAKEN AS THE ADDRESS OF A \r
+, TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE.\r
+, FORMAT OF THE TABLES ARE:\r
+,\r
+, <Q-TAB>:     XWD <SQ1>,<DQ1> ;1ST SOURCE-Q:DEST-Q PAIR\r
+,              ...\r
+,              XWD <SQN>,<DQN> ;NTH ...\r
+,              Z               ;ZERO TERMINATES TABLE\r
+,\r
+, <QUANT-TAB>: EXP <QUANT1>    ;CORRES. TO <Q-TAB>+0\r
+,              ...\r
+,              EXP <QUANTN>    ;CORRES. TO <Q-TAB>+N-1\r
+\r
+,              Z\r
+,\r
+, UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES\r
+, THE SOURCE-Q (CURRENT Q) OF THE JOB.  THE LH OF THE\r
+, <Q-TAB> ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE\r
+, RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET\r
+, (IF <QUANT-TAB> NOT -1) TO THE CORRES. ENTRY IN THE \r
+, <QUANT-TAB> TABLE.\r
+, IF NO MATCH FOUND..NO TRANSFER TAKES PLACE.\r
+\r
+,DEST-Q AS A FUNCTION OF JOB SIZE\r
+,BQJSIZ INSERT AT BEG OF DEST-Q\r
+,EQJSIZ INSERT AT END\r
+,\r
+, <Q-TAB>=ADDRESS OF A TABLE ASSOCIATING JOB SIZE\r
+, (IN 1K BLOCKS) TO DEST-QS.\r
+, <QUANT-TAB> HAS SAME MEANING AS FOR B-EQLINK\r
+,\r
+, <Q-TAB>:     XWD <JSIZ1>,<DQ1>\r
+,              ...\r
+,              XWD <JSIZN>,<DQN>\r
+,              Z\r
+,\r
+, <QUANT-TAB>: SIMILAR TO THAT FOR B-EQLINK\r
+,\r
+, THE <JSIZ>'S MUST BE IN INCREASING ORDER.\r
+, THE TABLE IS SEARCHED UNTIL <JSIZ> IS LESS THAN OR\r
+, EQUAL TO THE JOB SIZE, THEN THE CORRES. <DQ> IS\r
+, TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO\r
+, TRANSFER TAKES PLACE,\r
+, QUANT, TIME IS HANDLED AS IN B-EQLINK.\r
+\f,CALLING SEQUENCE:\r
+,      MOVE  J,[JOB NUMBER]\r
+,      MOVE T2,[CURRENT Q]     ;BQLINK AND EQLINK ONLY\r
+;      MOVEI TT,TRANS TABLE ADDRESS\r
+,      PUSHJ PDP,QXFER\r
+,      ...             ;RETURN\r
+,  ON RETURN J IS UNALTERED; LH(Q)=-1  IF QUANT, TIME OUT\r
+,  RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q\r
+,\r
+,ACS:\r
+TT=DAT ;POINTER TO TRANSFER TABLE\r
+J=ITEM ;JOB NO.\r
+Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN\r
+T1=TAC1        ;TEMP\r
+T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINE\r
+\r
+EXTERNAL ERROR\r
+\r
+QXFER: MOVE Q,1(TT)            ;GET TRANSFER TABLE ADDRESS\r
+       JRST @(TT)              ;DISPATCH\r
+\r
+,DEST-Q AS FUNCTION OF SOURCE-Q\r
+QLINK: SKIPN T1,(Q)            ;END OF TABLE?\r
+       POPJ PDP,               ;YES\r
+       HLRE T1,T1\r
+       CAME T1,T2              ;NO--SOURCE-Q=LH(TABLE ENTRY)?\r
+       AOBJP Q,QLINK           ;NO- CONTINUE SEARCH\r
+       JRST QX2\r
+\r
+,DEST-Q AS FUNCTION OF JOB SIZE\r
+QJSIZ: HLRZ T2,JBTADR(J)       ;HIGHEST REL. LOC. OF JOB\r
+       ASH T2,-^D10            ;CONVERT TO NO. OF 1K BLOCKS - 1.\r
+       MOVSI T2,1(T2)          ;NO. OF 1K BLOKS TO LH.\r
+QX1:   SKIPN T1,(Q)            ;END OF TABLE?\r
+       JSP DAT,ERROR\r
+       CAMLE T2,T1             ;JOBSIZE .LE. LH(TABLE ENTRY)?\r
+       AOBJP Q,QX1             ;NO--CONTINUE SEARCH, JUMP ALWAYS.\r
+\r
+QX2:   MOVS T2,Q               ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED)\r
+       HRRO Q,(Q)              ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.)\r
+       SKIPL 1(TT)             ;WAS QUANT. TIME REQUESTED?\r
+       HRL Q,(T2)              ;YES--GET IT\r
+\f,FIXED DEST-Q\r
+QFIX:  MOVE T1,JBTQ(J)         ;DELETE JOB FROM SOURCE-Q\r
+       MOVS T2,T1              ;T1=FORW. LINK, T2=BACK LINK\r
+       HRRM T1,JBTQ(T2)        ;FORW, LINK PAST JOB\r
+       HRLM T2,JBTQ(T1)        ;BACK LINK PAST JOB\r
+\r
+       SKIPGE (TT)             ;END OR BEG. OF Q?\r
+       HLR Q,JBTQ(Q)           ;END--THIS WILL LEAVE Q=IDX OF\r
+                               ; CURRENT LAST LINK;T2=IDX OF Q-HEADER\r
+       MOVE T2,JBTQ(Q)         ;BEG--T2=IDX OF CURRENT 1ST LINK\r
+                               ; Q=IDX OF Q-HEADER\r
+       HRRM J,JBTQ(Q)          ;INSERT JOB IN DEST-Q\r
+       HRLM J,JBTQ(T2)\r
+       HRRM T2,JBTQ(J)\r
+       HRLM Q,JBTQ(J)\r
+\r
+       JUMPL Q,QX3             ;RETURN IF QUANT. TIME NOT REQ.\r
+       HLRM Q,JBTSTS(J)        ;SET QUANT. TIME\r
+\r
+       MOVEI TT,RNQ            ;SET JOB STATUS WAIT\r
+       DPB TT,PJBSTS           ;CODE TO RUN QUEUE (0).\r
+QX3:   POPJ PDP,\r
+\r
+BQFIX=QFIX\r
+EQFIX=QFIX+1B0\r
+BQLINK=QLINK\r
+EQLINK=QLINE+1B0\r
+BQJSIZ=QJSIZ\r
+EQJSIZ=QJSIZ+1B0\r
+\f,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.\r
+,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS\r
+,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ.\r
+,THE SCAN TABLE HAS THE FORM:\r
+,\r
+,SCANTAB:      XWD <Q1>,<CODE1>        ;SCN Q1 ACCRDING TO CODE1\r
+,              ...\r
+,              XWD <QN>,<CODEN>        ;QN ACCORDING TO CODEN\r
+,              Z               ;ZERO TERMINATES TABLE\r
+,\r
+,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY <CODE>\r
+,THE CODES ARE:\r
+,\r
+,QFOR  SCAN WHOLE Q FORWARD\r
+,QFOR1 SCAN FOR ONLY THE 1ST MEMBER (IF ANY)\r
+,QBAK  SCAN WHOLE Q BACKWARD\r
+,QBAK1 SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST\r
+,\r
+,CALLING SEQ.\r
+,\r
+,      MOVEI ST,SCAN TABLE ADDRESS\r
+,      JSP PC,QSCAN    ;SET UP PC FOR REPEATED RETURNS\r
+,      ...             ;RETURN HERE WHEN NO MORE JOBS\r
+,      ...             ;RETURN HERE WITH NEXT JOB IN AC J\r
+,                      ; AND ITS Q IN LH(QR)\r
+,\r
+,      PERFORM ANY NECESSARY TESTING OF THIS JOB\r
+,      J,ST,PC,QR MUST BE PRESERVED\r
+,      \r
+,      JRST (QR)       ;RETURN TO QSCAN TO GET NEXT JOB\r
+,                      ; IF THIS ONE NOT ACCEPTABLE\r
+,\r
+,ACS:\r
+J=ITEM ;JOB NO.\r
+ST=DAT ;POINTER TO SCAN TABLE\r
+PC=TAC ;RETURN ADDRESS\r
+QR=TAC1        ;ITERATED RETURN ADDRESS TO QSCAN\r
+\fQSCAN:        SKIPN QR,(ST)   ;END OF SCAN TABLE?\r
+       JRST (PC)       ;YES--RETURN TO CALL+1\r
+       HLRE J,QR       ;NO--GET NO. OF Q\r
+       JRST (QR)       ;DISPATCH\r
+\r
+QFOR1: MOVEI QR,QFOR2  ;ONLY THE FIRST JOB\r
+\r
+QFOR:  HRRE J,JBTQ(J)  ;SCAN FORWARD ALL JOBS\r
+       JUMPG J,1(PC)   ;RETURN THIS JOB NO. CALL+2 UNLESS--\r
+QFOR2: AOJA ST,QSCAN   ;END OF THIS Q--GET NEXT Q\r
+\r
+QBAK1: HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS EXCEPT 1ST\r
+       SKIPLE JBTQ(J)  ;IS THIS THE FIRST MEMBER?\r
+       JRST 1(PC)      ;NO--RETURN CALL+2\r
+       AOJA ST,QSCAN   ;YES--GET NEXT Q\r
+\r
+QBAK:  HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS\r
+       JUMPG J,1(PC)   ;RETURN CALL+2 WITH JOB NO. UNLESS\r
+       AOJA ST,QSCAN   ;BEG OF THIS Q--GET NEXT Q\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL AVALTB\r
+DEFINE X(A,B),<\r
+EXTERNAL A'AVAL\r
+INTERNAL A'Q\r
+A'Q=ZZ\r
+ZZ=ZZ+1\r
+>\r
+       ZZ=0\r
+       QUEUES\r
+       LOC=ZZ\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO)\r
+;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
+;AT THAT QUEUE TO FIND A JOB TO RUN\r
+;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
+\r
+DEFINE X(A,B)\r
+<INTERNAL A'AVAL,A'Q\r
+A'Q=.=AVALTB\r
+A'AVAL: 0\r
+>\r
+\r
+INTERNAL AVALTB\r
+AVALTB:        QUEUES  ;GENERATE THE AVAL FLAGS\r
+LOC=.-AVALTB\r
+>\r
+NQUEUE=LOC             ;NO. OF QUEUES COUNTING RUN QUEUE\r
+XP MAXQ,NQUEUE-1       ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
+XP MINQ,STQ            ;MINIMUM SHARABLE DEVICE QUEUE\r
+XP AVLNUM,MAXQ         ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
+\r
+;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS\r
+\r
+\r
+DEFINE X(A)\r
+<INTERNAL A'Q\r
+A'Q=LOC\r
+LOC=LOC+1\r
+>\r
+       CODES\r
+\f;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES\r
+;USED BY SCHEDULER\r
+;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.\r
+;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM\r
+;FOLLOWING TABLE USING NEW STATE CODE AS INDEX\r
+\r
+DEFINE X(A,B)\r
+<      EXP Q'A'W\r
+>\r
+\r
+INTERNAL QBITS\r
+\r
+QBITS: QUEUES\r
+\fIFN FTCHECK+FTMONP,<\r
+DEFINE X(A,B),<\r
+EXTERNAL A'RFQ\r
+>\r
+       QUEUES\r
+EXTERNAL REQTAB\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)\r
+;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE\r
+;WSREQ AND RNREQ ARE UNUSED\r
+\r
+DEFINE X(A,B)\r
+<A'REQ: 0\r
+INTERNAL A'REQ\r
+>\r
+\r
+INTERNAL REQTAB\r
+\r
+REQTAB:        QUEUES  ;GENERATE REQ TABLE\r
+>\r
+\f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.\r
+;INDEX INTO TABLE ALSO = QUEUE CODE\r
+;FOR SHARABLE DEVICES ONLY\r
+;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND\r
+;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO \r
+;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT\r
+;STATE CODE.\r
+\r
+DEFINE X(A,B)\r
+<      XWD -A'Q,Q'A'S\r
+>\r
+\r
+QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE\r
+QWSS=0\r
+QTSS=0\r
+\r
+INTERNAL AVLQTB\r
+\r
+AVLQTB:        QUEUES\r
+\fIFN FTCHECK+FTMONP,<\r
+EXTERNAL QJOB,JOBQUE   ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT\r
+                       ; DEPENDING ON FTRC10 IN SCHDAT\r
+IFN FTSWAP,<\r
+EXTERNAL XJOB\r
+>>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+INTERNAL JOBQUE\r
+JOBQUE:        0       ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT\r
+\r
+INTERNAL QJOB\r
+QJOB:  Z       ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL\r
+\r
+IFN FTSWAP,<\r
+XJOB:  Z       ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN\r
+INTERNAL XJOB\r
+>\r
+>\r
+\fINTERNAL QSTOP,QTIME,SSCAN,QCMW\r
+\r
+BQFIX=QFIX     ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE\r
+EQFIX=QFIX+1B0 ;END OF QUEUES " " "\r
+BQLINK=QLINK\r
+EQLINK=QLINK+1B0\r
+BQJSIZ=QJSIZ\r
+EQJSIZ=QJSIZ+1B0\r
+DEFINE TTAB(FCTN,QUEUE,QUANT)\r
+<              EXP FCTN\r
+               XWD QUANT,-QUEUE\r
+>\r
+DEFINE PTTAB(FCTN,QUEUE,QUANT)\r
+<              EXP FCTN\r
+               XWD QUANT,QUEUE\r
+>\r
+\r
+QNULW: TTAB EQFIX,NULQ,-1      ;NULL QUEUE JOB NO. NOT ASSIGNED\r
+QSTOP:QSTOPW:  TTAB EQFIX,STOPQ,-1     ;UNRUNABLE JOBS TO END OF STOPQ\r
+QCMW:  TTAB EQFIX,CMQ,-1               ;COMMAND WAIT TILL JOB IN CORE\r
+QRNW:  PTTAB EQJSIZ,QSTAB,QQSTAB       ;JUST RUNABLE JOBS\r
+       ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR\r
+       ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE\r
+\r
+QWSW:  TTAB BQFIX,PQ1,QQTTY    ;IO WAIT SAT.(EXCEPT TTY)\r
+       ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME\r
+       ;ACCORDING TO JOB SIZE\r
+QTSW:  TTAB BQFIX,PQ,QQTTY     ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ1)\r
+\r
+QIOWW: TTAB EQFIX,IOWQ,-1      ;IOW(EXDEPT TTY) HELD IN IOWQ\r
+QTIOWW:        TTAB EQFIX,TIOWQ,-1     ;TTY IOW HELD IN TIOWQ\r
+QAUW:  TTAB EQFIX,AUQ,-1,\r
+QMQW:  TTAB EQFIX,MQQ,-1       ;MON. Q(DISK) WAIT\r
+QDAW:  TTAB EQFIX,DAQ,-1       ;DEV. ALLOC.(DISK)\r
+QDCW:  TTAB EQFIX,DCQ,-1       ;DATA CONTROL WAIT\r
+QSTW:  TTAB EQFIX,STQ,-1       ;SYST TAPE\r
+QDTW:  TTAB EQFIX,DTQ,-1       ;DEC TAPE\r
+QMTW:  TTAB EQFIX,MTQ,-1       ;MAG TAPE\r
+QSLPW: TTAB EQFIX,SLPQ,-1      ;SLEEP UUO\r
+\f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE\r
+;DO NOT RESET QUANTUM RUN TIME\r
+\r
+QQSD=-1\r
+\r
+QMSQ:  TTAB BQFIX,PQ1,QQSD     ;START MON. Q(DISK) AT PQ1\r
+QDAS:  TTAB BQFIX,PQ1,QQSD     ;DEV. ALLOC.(DISK)...\r
+QDCS:  TTAB BQFIX,PQ1,QQSD     ;DATA CONTROL...\r
+QSTS:  TTAB BQFIX,PQ1,QQSD     ;SYST TAPE\r
+QDTS:  TTAB BQFIX,PQ1,QQSD     ;DEC TAPE\r
+QMTS:  TTAB BQFIX,PQ1,QQSD     ;MAG TAPE\r
+QAUS:  TTAB BQFIX,PQ1,QQSD     ;ALTER UFD\r
+QTIME  PTTAB EQLINK,QTTAB,QQSTAB       ;MOVE JOB TO LOWER Q\r
+       ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME\r
+\f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE\r
+QSTAB: XWD 4,-PQ1      ;PQ1 IF     SIZE .LE. 4K\r
+       XWD ^D16,-PQ2   ;PQ2 IF  4K .L. SIZE .LE. 16K\r
+       XWD ^D256,-PQ3  ;PQ3 IF 16 .L. SIZE\r
+\r
+,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME\r
+QQTAB: XWD -PQ1,-PQ2\r
+       XWD -PQ2,-PQ3\r
+       XWD -PQ3,-PQ2           ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS\r
+       Z\r
+\r
+,QUANTUM TABLES\r
+\r
+QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS\r
+QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS\r
+\r
+, QUANT. TIMES ACCORDING TO PROCESSOR Q:\r
+\r
+INTERNAL RNQUNT\r
+\r
+RNQUNT:\r
+QQSTAB:        EXP ^D30        ;PQ1: ONE HALF SECOND\r
+       EXP 2*^D60      ;PQ2: TWO SECONDS\r
+       EXP 2*^D60      ;PQ3: TWO SECONDS\r
+       Z\r
+\fIFN FTSWAP,<\r
+INTERNAL ISCAN,QSCAN\r
+ISCAN: ;SCAN FOR INPUT\r
+       XWD -CWM,QFOR   ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE\r
+       XWD -MQQ,QFOR1  ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES\r
+       XWD -DAQ,QFOR1\r
+       XWD -AUQ,QFOR1\r
+       XWD -DCQ,QFOR1\r
+       XWD -MTQ,QFOR1\r
+       XWD -STQ,QFOR1\r
+       XWD -DTQ,QFOR1\r
+SSCAN: XWD -PQ1,QFOR   ;SCAN PROCESSOR AS SCHEDULER DOES\r
+       XWD -PQ2,QFOR\r
+       XWD -PQ3,QFOR\r
+       Z               ;PATCH SPACE\r
+       Z\r
+       Z               ;FINAL ZERO TO FLAG END\r
+\r
+QSCAN: ;SCAN FOR OUTPUT\r
+       XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST\r
+       XWD     -SLPQ,QFOR\r
+       XWD -DTQ,QBAK1  ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP\r
+       XWD -STQ,QBAK1\r
+       XWD -MTQ,QBAK1\r
+       XWD -DCQ,QBAK1\r
+       XWD -AUQ,QBAK1\r
+       XWD -DAQ,QBAK1\r
+       XWD -MQQ,QBAK1\r
+       XWD -TIOWQ,QFOR         ;TTY IOW\r
+       XWD -PQ3,QBAK\r
+       XWD -DTQ,QFOR1\r
+       XWD -STQ,QFOR1\r
+       XWD -MTQ,QFOR1          ;NOW SCAN FIRST JOB IN QUEUES\r
+       XWD -DCQ,QFOR1\r
+       XWD -AUQ,QFOR1\r
+       XWD -DAQ,QFOR1\r
+       XWD -MQQ,QFOR1\r
+       XWD -PQ2,QBAK\r
+       XWD -PQ1,QBAK\r
+       Z                       ;PATCH SPACE\r
+       Z\r
+       Z                       ;FINAL ZERO TO FLAG END\r
+>\r
+\fSUBTTL        SWAP R. KRASIN/AF TS4.34  03 FEB 69  V406\r
+\r
+,SWAPPER CALLED EVERY CLOCK TIC.\r
+,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL\r
+,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE\r
+;ARE USED TO "REMEMBER" PREVIOUS STATES.\r
+,THE BASIC ALOGRITHM:\r
+;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?\r
+;  YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)\r
+;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?\r
+;  YES--RETURN AND DO NOTHING\r
+;IS SWAPPER STILL BUSY?\r
+;  YES--RETURN AND DO NOTHING\r
+,SCAN QS FOR 1ST JOB OUT OF CORE.\r
+, IF NONE-RETURN\r
+;A:\r
+, IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?\r
+,   YES--START INPUT AND RETURN\r
+,   NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?\r
+\r
+;      YES--CALL CORE SHUFFLER\r
+;        IS SHUFFLER WAITING FOR IO TO STOP?\r
+;          YES--RETURN AND DO NOTHING\r
+;          NO--GO TO A:\r
+,    NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:\r
+,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?\r
+, YES--OUTPUT ONE AND RETURN\r
+, NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME\r
+,              (SET ON INPUT) HAS GONE TO 0.\r
+,  IF NONE--RETURN\r
+,  IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?\r
+,    YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT\r
+,    NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE\r
+,       IN LOW SEGEMENT AS LONG AS IT CAN\r
+,       IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)\r
+\r
+EXTERNAL JBTSTS\r
+EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP\r
+EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE\r
+EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC\r
+EXTERNAL JBTDAT,SHFWAT,CHKSHF\r
+EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL\r
+\r
+INTERNAL SWAP\r
+INTERNAL XPAND,FT2REL\r
+\r
+T=DEVDAT\r
+T1=TAC1\r
+T2=TAC\r
+J=ITEM\r
+\r
+,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"\r
+\fSWAP: SKIPE SHWAT             ;IS CORE SHUFFLER WAITING FOR IO TO STOP\r
+                               ; FOR SOME JOB?\r
+       PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO SEE IF\r
+                               ; IO STOPPED YET\r
+       SKIPN SHFWAT            ;IS SHUFFLER STILL WAITING?\r
+       SKIPE SQREQ             ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?\r
+       POPJ PDP,               ;*YES--RETURN\r
+       SETZM   INFLG           ;*** EXPERIMENTAL ***\r
+       SKIPN J,FINISH          ;NO--ANY IN/OUTPUT TO FINISH?\r
+       JRST SWP2               ;NO-\r
+       JUMPL J,FINOUT          ;YES--INPUT OR OUTPUT?\r
+       SKIPE SERA              ;INPUT, ANY INPUT ERRORS?\r
+       JRST INERR              ;YES\r
+FININ0:                ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)\r
+IFN FT2REL,<\r
+       EXTERN FININ\r
+       PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?\r
+       JRST FIT1       ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)\r
+                       ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER\r
+                       ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)\r
+                       ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)\r
+                       ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS\r
+                       ; AND SETTING PROTECT TIME WON'T MATTER EITHER.\r
+>\r
+       LDB T,IMGIN             ;NEW CORE SIZE\r
+       LDB T1,IMGOUT           ;OLD SIZE WHEN ON DISK\r
+       SUB T1,T                ;OLD-NEW=DECREASE\r
+                               ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)\r
+                               ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?\r
+                               ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE\r
+                               ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY\r
+                               ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE\r
+                               ; ON REDUCTION WHICH DOES NOT GO TO 0\r
+       SKIPLE T1               ;DECREASED?\r
+       ADDM T1,VIRTAL          ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY\r
+                               ; AMOUNT OF DECREASE IN HIGH OR LOW SEG\r
+       PUSHJ PDP,ZERSWP        ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN\r
+                               ; AND SWP!SHF(JBTSTS) TO 0\r
+       LDB T,PCORSZ            ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM\r
+                               ; SIZE OF JOB(1K BLOCKS-1)\r
+       IMUL T,PROT             ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE\r
+       ADD T,PROT0             ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE\r
+       HRLM T,JBTSWP(J)\r
+       MOVE JDAT,JBTDAT(J)     ;SETUP LOW SEG PROTECTION,RELOCATION\r
+\fIFN JDAT-PROG,<\r
+       MOVE PROG,JBTADR(J)\r
+>\r
+       MOVE T,JOBPC(JDAT)      ;JOB STOPPED IN EXEC MORE?\r
+       TLNE T,USRMOD           ;TEST PD FLAG\r
+       JRST SWP1               ;NO\r
+       HRRZ T,JOBDPG(JDAT)     ;YES, ADJUST PROG AND PDP IN DUMP AC AREA\r
+       SUBI T,(PROG)           ;OLD RELOC-NEW RELOC\r
+       MOVNS T                 ;NEW RELOC-OLD RELOC\r
+       ADDM T,JOBDPD(JDAT)     ;ADJUST DUMP PDP\r
+       MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG\r
+       JRST SWP1\r
+\r
+INERR: SETZM FINISH            ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE\r
+       MOVE PROG,JBTADR(J)     ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG\r
+       IFN     PROG-JDAT,<MOVE JDAT,JBTDAT(J)>\r
+       PUSHJ PDP,KCORE1        ;RETURN CORE\r
+       JSP TAC,ERRPNT          ;PRINT ON USER CONSOLE\r
+       ASCIZ /SWAP READ ERROR/\r
+       JRST    PCSTOP          ;STOP JOB AND FORCE RESCHDULING\r
+FINOUT:        MOVNS J                 ;FINISH OUTPUT, -FINISH=JOB NO.\r
+       SKIPE SERA              ;ANY ERRORS\r
+       JRST SWPREC             ;YES, RECORD ERROR AND TRY AGAIN,\r
+                               ; IN A DIFFERENT PLACE ON DISK\r
+       MOVE PROG,JBTADR(J)     ;XWD PROTECT,,RELOC. FOR LOW SEG\r
+IFN PROG-JDAT,<\r
+       MOVE JDAT,JBTDAT(J)     ;JOB DATA AREA\r
+>\r
+       PUSHJ PDP,KCORE1        ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT\r
+                               ; EVEN IF \r
+                               ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING\r
+                               ; SWAP OUT (GET) SINCE JOB IS MARKED WITH\r
+                               ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN\r
+IFN FT2REL,<\r
+       EXTERN FINOT\r
+       PUSHJ PDP,FINOT         ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?\r
+                               ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT\r
+                               ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER\r
+                               ; IS FINISHED.\r
+>\r
+SWP1:  SETZM FINISH            ;CLEAR FINISH FLAG\r
+SWP2:  SKIPE J,FORCE           ;WAITING FOR JOB TO BECOME SWAPPABLE?\r
+       JRST FORCE1             ;YES\r
+FIT0:  SKIPE J,FIT             ;NO-- WAITING TO FIT JOB IN CORE?\r
+       JRST FIT1               ;YES\r
+\f,SCAN FOR INPUT\r
+       MOVEI DAT,ISCAN\r
+       JSP TAC,QSCAN\r
+       JRST CHKXPN             ;NO INPUT TO DO--CK FOR EXPANDING JOBS\r
+       MOVE T,JBTSTS(J)        ;THIS JOB OUT OF CORE?\r
+       TLNN T,SWP              ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER\r
+                               ; OR BOTH SEGS SWAPPED OUT\r
+\r
+       JRST (TAC1)             ;NO--CONTINUE SCAN\r
+\r
+FIT1:  MOVEM J,FIT             ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN\r
+       LDB AC1,IMGIN           ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG\r
+                               ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)\r
+IFE FT2REL,<\r
+       CAMLE AC1,CORTAL        ;WILL LOW SEG FIT IN FREE+DORMANT CORE?\r
+>\r
+IFN FT2REL,<\r
+       EXTERN FITSIZ\r
+       PUSHJ PDP,FITSIZ        ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN\r
+                               ; 1. THIS JOBS LOW SEG AND HIGH SEG\r
+                               ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)\r
+                               ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN\r
+                               ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?\r
+>\r
+       JRST SCNOUT             ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED\r
+                               ; AC1=TOTAL CORE NEEDED(IN K)\r
+       CAMG AC1,BIGHOL         ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE\r
+                               ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?\r
+                               ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)\r
+\r
+       JRST SWAPI              ;YES, GO SWAP IN THIS LOW OR HIGH SEG\r
+IFN FT2REL,<\r
+       EXTERN FRECR1,HOLEF\r
+       SKIPN HOLEF             ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER\r
+                               ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?\r
+       PUSHJ PDP,FRECR1        ;NO, GO DELETE ONE DORMANT SEG IN CORE\r
+                               ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST\r
+                               ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE\r
+>\r
+       PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN\r
+       SKIPN SHFWAT            ;SHUFFLER WAITING FOR IO TO STOP?\r
+       JRST FIT0               ;NO, SEE IF JOB WILL FIT NOW.\r
+       POPJ PDP,               ;YES, RETURN AND WAIT TILL IO STOPS\r
+\fEXTERN VIRTAL,SWPERC\r
+\r
+SWPREC:        MOVE    TAC,SERA        ;ERROR FLAGS\r
+       IORM    TAC,SWPERC      ;SAVE FOR POSTERITY\r
+       LDB     TAC,IMGOUT      ;DECREASE TOTAL AMOUNT\r
+       MOVNS   TAC             ;OF VIRTUAL CORE IN THE MACHINE\r
+       ADDM    TAC,VIRTAL      ;BY THE AMOUNT BEING GIVEN UP\r
+       LDB     TAC,IMGOUT\r
+       TLO     TAC,1\r
+       ADDM    TAC,SWPERC\r
+       JRST    SWAPO           ;GO TRY AGAIN\r
+\r
+;NO INPUT TO DD, CHECK FOR EXPANDING JOBS\r
+CHKXPN:        SKIPG XJOB              ;ANY JOBS TO EXPAND\r
+       POPJ PDP,               ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT\r
+                               ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING\r
+                               ; JOB SINCE THERE IS ONE\r
+;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND\r
+\r
+       EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR\r
+SCNOUT:        SKIPG XJOB              ;ANY JOBS WAITING TO EXPAND?\r
+       JRST SCNJOB             ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING\r
+                               ; FOR ONE TO SWAP OUT\r
+       MOVE J,HIGHJB           ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED\r
+       MOVSI T,JXPN            ;SETUP JOB EXPANDED BIT\r
+       TDDN T,JBTSTS(J)        ;IS THIS JOB EXPANDING?\r
+       SOJG J,.-1              ;NO, KEEP LOOKING\r
+       IFN FTRCHK,<\r
+       JUMPG J,SCNOK           ;CLEAR XJOB SO MESSAGE WILL PRINT\r
+       JSP DAT,ERROR           ;ERROR IF NONE FOUND\r
+>\r
+SCNOK: SOS XJOB                ;DECREMENT COUNT OF EXPANDING JOBS\r
+       ANDCAM T,JBTSTS(J)      ;CLEAR EXPAND BIT IN JOB STATUS WORD\r
+       JRST FORCE0             ;GO TRY TO SWAP JOB OUT\r
+\f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN\r
+;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)\r
+;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,\r
+;OR SUM IF BOTH MUST BE SWAPPED IN\r
+\r
+SCNJOB:        MOVE T,CORTAL           ;INITIALIZE FREE CORE COUNTER\r
+       MOVEM T,SUMCOR\r
+       SETZM MAXSIZ            ;CLEAR SIZE OF LARGEST JOB\r
+       MOVEI DAT,OSCAN         ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT\r
+       JSP TAC,QSCAN\r
+       JRST NOFIT              ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE\r
+       CAMN J,FIT              ;IS THIS JOB WE ARE TRYING TO FIND IN?\r
+       JRST(TAC1)              ;YES, GO FIND NEXT JOB TO OUTPUT\r
+       SKIPGE T,JBTSTS(J)      ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>\r
+       SKIPGE JBTSWP(J)        ;YES, IS PROTECT TIME STILL LEFT?\r
+                               ; PROTECT TIME IS DECREMENTED ONLY WHEN\r
+                               ; A JOB IS RUNABLE, SO LOOK AT IT\r
+                               ; ONLY IF RUN BIT STILL ON\r
+       TLNE T,NSWP+SWP         ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?\r
+                               ; (DISPLAY, REAL TIME)?\r
+       JRST (TAC1)             ;YES,CONTINUE SCAN TO FIND ANOTHER\r
+       HLRZ T,JBTADR(J)        ;PICK UP SIZE OF JOB\r
+       JUMPE T,(TAC1)  `       ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED\r
+                               ; OUT FOR THIS USER IF NO LOW SEG)\r
+       ASH T,-12               ;CONVERT TO 1K BLOCKS\r
+       ADDI T,1\r
+IFN FT2REL,<\r
+       EXTERN FORSIZ\r
+       PUSHJ PDP,FORSIZ        ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB\r
+                               ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)\r
+>\r
+       CAMG T,MAXSIZ           ;LARGEST SO FAR?\r
+       JRST FORCE2             ;NO\r
+       MOVEM T,MAXSIZ          ;YES, SAVE SIZE\r
+       MOVEM J,MAXJBN          ;AND JOB NUMBER\r
+FORCE2:        ADDM T,SUMCOR           ;ADD TO TOTAL\r
+       CAMLE AC1,SUMCOR        ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?\r
+       JRST (TAC1)             ;NO. LOOK FOR MORE\r
+       MOVE J,MAXJBN           ;YES, SWAP OUT LARGEST\r
+\fFORCE0:       PUSHJ PDP,TRYSWP        ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?\r
+       JRST (TAC1)             ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR\r
+                               ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE\r
+                               ; LOOK FOR AN OTHER JOB TO SWAP\r
+\r
+IFN FT2REL,<\r
+       EXTERN FORHGH\r
+       PUSHJ PDP,FORHGH        ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE\r
+                               ; TRYING TO SWAP OUT LOW SEGMENT?\r
+                               ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:\r
+                               ; 1. JOB HAS A HIGH SEG AND\r
+                               ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER\r
+                               ;    (SWP=0 FOR JOB)\r
+                               ; 3. IT IS IN CORE(NOT XPANDH)\r
+                               ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING\r
+                               ;    THIS ONLY USER USING IN CORE\r
+                               ; 5. HIGH SEG NOT ON DISK YET\r
+                               ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB\r
+                               ;    BEING FITTED IN IS GOING TO WANT\r
+\r
+                               ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE\r
+                               ; RETURN LOW SEG NO.\r
+                               ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS\r
+                               ;    FOR JOB SO IO WILL STOP NEXT BUFFERE\r
+>\r
+       MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG\r
+       IORM T,JBTSTS(J)        ;SCHEDULER WILL NO LONGER RUN THIS JOB\r
+                               ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL\r
+                               ; STOP AFTER NEXT BUFFERFUL.\r
+\r
+FORCEL:        MOVEM J,FORCE           ;ASSUME NOT SWAPPABLE--IS IT?\r
+\r
+FORCE1:\r
+IFN JDAT-PROG,<\r
+       MOVE JDAT,JBTDAT(J)\r
+>\r
+       SKIPN PROG,JBTADR(J)    ;LOC. IN PHYSICAL CORE, IS CORE\r
+                               ; ASSIGNED IN MEMORY?\r
+       JRST SWAPO              ;NO, CANNOT HAVE ACTIVE DEVICES\r
+       CAME J,JOB              ;IF THIS IS CURRENT JOB, WAIT UNTIL\r
+                               ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA\r
+       PUSHJ PDP,ANYDEV        ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)\r
+       POPJ PDP,               ;YES--RETURN AND WAIT FOR I/O TO STOP.\r
+\f;SWAP OUT LOW OR HIGH SEGEMENT\r
+\r
+INTERNAL FTTRACK\r
+\r
+SWAPD:\r
+IFN FTTRACK,<EXTERN LASOUT\r
+       MOVEM J,LASOUT          ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY\r
+>\r
+       SETZM FORCE             ;CLEAR FORCE FLAG\r
+       HLRZ T,JBTADTR(J)       ;COMPUTE CORE IMAGE\r
+       JUMPE T,SWP1            ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0\r
+                               ; WHEN CORE WAS RETURNED\r
+\r
+       HRRZ T1,JBTADR(J)\r
+       MOVNM T,T2              ;*SAVE COUNT FOR CALL TO SQOUT\r
+       ASH T,-^D10             ;CONVERT TO 1K BLOCKS\r
+       ADDI T,1\r
+       DPB T,IMGOUT            ;RECORD AS OUT IMAGE\r
+       HRLI T1,-1(T2)          ;*BUILD AND SAVE IOWD FOR SQOUT\r
+       PUSH PDP,T1             ;*\r
+       LDB DAT,IMGIN           ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN\r
+       SKIPN DAT               ;ALREADY BEEN SET(XPAND)\r
+       DPB T,IMGIN             ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED\r
+       MOVE DAT,T              ;*CONVERT CORE IMAGE TO 128 WD BLOCKS\r
+       PUSHJ PDP,GXSAT         ;*GET DEVICE STORAGE\r
+       JRST FULL               ;*NONE AVAILABLE\r
+       HRLM TAC,JBTSWP(J)      ;*SAVE DEVICE ADDRESS\r
+OUTP2: MOVNM J,FINISH          ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG\r
+                               ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED\r
+                               ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)\r
+       POP PDP,TAC1            ;*GET IOWD\r
+       JRST SQOUT              ;*START OUTPUT AND RETURN\r
+\r
+NOFIT: SETZM FIT               ;FORGET ABOUT FITTING IN A JOB ON DISK\r
+       SETOM   INFLG           ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT\r
+       POPJ PDP,               ;ALL JOBS IN CORE RE HIGHER PRIORITY.\r
+\f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK\r
+;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK\r
+\r
+       EXTERN GETFOR\r
+\r
+FULL:  HRLM    DAT,AC3         ;SAVE DAT (LARGEST AVAILABLE HOLE)\r
+       PUSHJ   PDP,FULCOR      ;GET 4 FREE CORE LOCS\r
+       HLRZ    DAT,AC3         ;RESTORE DAT\r
+       MOVE    AC3,TAC1        ;LOC OF 1ST FREE CELL\r
+       HRLI    AC3,-4          ;4 LOCS\r
+       TRO     TAC1,FRGSEG     ;LIGHT FRAGMENTED BIT\r
+       HRLM    TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP\r
+FULL1: PUSH    PDP,DAT         ;SAVE AMOUNT OF SPACE BEING REQUESTED\r
+FULL1A:        PUSHJ   PDP,GXSAT       ;GET SOME SWAPPING SPACE\r
+       JRST    FULL2           ;CANT HAVE THAT MUCH\r
+       HRRM    TAC,(AC3)       ;SAVE LOC OF THE DISK SPACE\r
+       POP     PDP,DAT         ;RESTORE AMT GOTTEN\r
+       HRLM    DAT,(AC3)       ;SAVE AMOUNT IN TABLE\r
+       SUB     T,DAT           ;AMOUNT STILL NEEDED\r
+\r
+       JUMPE   T,FULSET        ;THROUGH IF NEED 0 K NOW\r
+       PUSHJ   PDP,BMPAC3      ;STEP TO NEXT TABLE LOCATION\r
+       MOVE    DAT,T           ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK\r
+FULL1B:        MOVE DAT,T      ;RESET AMOUNT OF SPACE NEEDED\r
+\r
+;COME HERE WHEN CANT GET THE CHUNK REQUESTED\r
+FULL2: MOVEM   DAT,(PDP)       ;DAT HAS LARGEST CHUNK AVAILABLE\r
+       JUMPG   DAT,FULL1A      ;GO GET THAT AMOUNT\r
+IFN FT2REL,<\r
+       EXTERN FRESWP\r
+       PUSHJ PDP,FRESWP        ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK\r
+       JRST FULL1B             ;FOUND ONE, TRY AGAIN, J PRESERVED\r
+                               ; NONE FOUND, PRINT MONITOR ERROR\r
+>\r
+\f      EXTERN CERROR\r
+\r
+       POP     PDP,TAC         ;WHAT? NONE LEFT?\r
+       POP     PDP,TAC         ;SET PDP TO RIGHT VALUE\r
+       JSP     DAT,CERROR      ;ERROR IN MONITOR AT .....\r
+\r
+;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED\r
+FULSET:        PUSHJ   PDP,BMPAC3      ;STEP TO NEXT (LAST) TABLE LOCATION\r
+       HLRZ    TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS\r
+       JRST    OUTP2           ;GO START OUTPUT\r
+\r
+;HERE TO GET 4 LOCS OF FREE CORE\r
+FULCOR:        PUSH    PDP,ITEM        ;GETFOR USES ITEM\r
+       PUSHJ   PDP,GETFOR      ;GET 4 CELLS\r
+       JRST IPOPJ              ;RETORE ITEM AND RETURN\r
+\r
+;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT\r
+BMPAC3:        AOBJN   AC3,CPOPJ       ;OK IF MORE LOCS OF TABLE\r
+       PUSHJ   PDP,FULCOR      ;GET 4 MORE LOCS\r
+       HRLI    AC3,-4\r
+       CAIN    TAC1,(AC3)      ;ARE THEY CONTIGUOUS?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       MOVE    TAC,-1(AC3)     ;NO. CONVERT LAST GOOD LOC\r
+       HRROM   TAC1,-1(AC3)    ;TO A POINTER TO NEXT PART OF TABLE\r
+       MOVEM   TAC,(TAC1)      ;STORE GOOD DATA IN 1ST WD OF NEW PART\r
+\r
+       HRR     AC3,TAC1        ;NEW TABLE LOC\r
+       AOBJN   AC3,CPOPJ       ;COUNT WORD AND RETURN\r
+\f;SWAP IN A JOB OR HIGH SEGMENT\r
+\r
+SWAPI:\r
+\r
+IFN FTTRACK,<EXTERN LASIN\r
+       MOVEM J,LASIN           ;SAVE LAST SWAP IN FOR DEBUGGING ONLY\r
+>\r
+\r
+       MOVEM J,FINISH          ;SET FINISH FLAG TO INPUT\r
+       SETZM FIT               ;CLEAR FIT FLAG\r
+       LDB TAC,IMGIN           ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)\r
+       LSH TAC,^D10            ;CONVERT TO HIGHEST ADR\r
+       SUBI TAC,1              ;-1 FOR CALL TO CORGET\r
+       SKIPE PROG,JBTADR(J)    ;IS (LOW)SEG ALREADY IN CORE?\r
+       JRST FININ0             ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY\r
+                               ; HIGH SEG WAS SWAPPED OUT.\r
+       PUSHJ PDP,CORGET        ;NO, GET CORE FOR LOW OR HIGH SEG\r
+       JSP DAT,OERROR          ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)\r
+\r
+IFN FT2REL,<EXTERN FITHGH\r
+       PUSHJ PDP,FITHGH        ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.\r
+>\r
+       LDB T,IMGOUT            ;GET OUTPUT IMAGE\r
+       JUMPE T,FININ0          ;DONT INPUT IF OUT IMAGE IS 0\r
+       LDB TAC1,IMGIN  ;IS SIZE OF CORE SMALLER THAN DISK SPACE?\r
+       CAMGE TAC1,T            ;WELL?\r
+       MOVE T,TAC1             ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)\r
+       LSH T,^D18+^D10         ;*BUILD IOWD FOR SQIN\r
+       MOVN TAC1,T             ;*\r
+       HRR TAC1,JBTADR(J)      ;*\r
+       HLRZ TAC,JBTSWP(J)      ;*GET DEVICE ADDRESS\r
+       JRST SQIN               ;*START INPUT\r
+\f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)\r
+;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED\r
+;CALLED FROM CORE0\r
+;CALL: MOVE ITE,JOB OR HIGH SEG NO.\r
+;      MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT\r
+;      PUSHJ PDP,CHGSWP\r
+;      ALWAYS RETURN\r
+;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0\r
+\r
+INTERN CHGSWP\r
+EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ\r
+\r
+CHGSWP:        LDB TAC1,IMGIN          ;SIZE WHEN SEG NEXT SWAPPED IN\r
+       JUMPE TAC,CHG1          ;IS ZERO BEING ASKED FOR?\r
+       LSH TAC,-12             ;NO, COVNERT TO 1K BLOCKS\r
+       ADDI TAC,1              ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE\r
+                               ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL\r
+                               ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)\r
+                               ; HAPPENS ONLY ON R,RUN,GET,KJOB\r
+       DPB TAC,IMGIN           ;STORE NEW SIZE WHEN NEXT SWAPPED IN\r
+       PUSH PDP,ITEM           ;SAVE AN AC\r
+       LDB ITEM,IMGOUT         ;GET OLD DISK SIZE OF THIS USER(USES ITEM)\r
+       CAMGE TAC1,ITEM         ;IS OLD IN-CORE SIZE BIGGER?\r
+       MOVE TAC1,ITEM          ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE\r
+       CAMGE TAC,ITEM          ;IS NEW IN-CORE SIZE BIGGER?\r
+       MOVE TAC,ITEM           ;NO, USE DISK SIZE AS USER NEW\r
+                               ; VIRTUAL CORE\r
+       SUB TAC1,TAC            ;DECREASE OF USER VIRT, CORE=OLD-NEW\r
+       ADDM TAC1,VIRTAL        ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL\r
+                               ;CORE\r
+       JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
+\f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG\r
+;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS\r
+;VIRTUAL CORE ASSIGNMENT\r
+;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO.\r
+;      PUSHJ PDP,ZERSWP\r
+;CALLED FROM SEGCON IN MANY PLACES(5)\r
+;AND FININ0 HERE IN SWAP\r
+\r
+       INTERN ZERSWP\r
+\r
+ZERSWPL        TDZA TAC,TAC            ;REQUEST O SPACE ON DISK AND ALWAYS SKIP\r
+CHG1:  ADDM TAC1,VIRTAL        ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM\r
+                               ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)\r
+       MOVSI TAC1,SWP!SHF      ;CLEAR SWAPPED OUT BIT IN JOB OR SEG\r
+       ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED\r
+                               ; FOR SWAP OR CORE SHUFFLE\r
+\r
+       PUSH PDP,DAT            ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)\r
+       LDB DAT,IMGOUT          ;*SIZE ON DISK(1K BLOCKS)\r
+\r
+       JUMPE DAT,CHG3          ;DID SEG HAVE ANY DISK SPACE?\r
+       HLRZ TAC,JBTSWP(ITEM)   ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT\r
+       PUSHJ PDP,FXSAT         ;*FREE THE DISK BLOCKS NO LONGER NEEDED\r
+CHG3:  POP PDP,DAT             ;RESTORE TTY OUTPUT BYTE POINTER\r
+       MOVEI TAC,0             ;0 IS NEW DISK ASSIGNMENT\r
+       DPB TAC,IMGOUT          ;SET DISK ASSIGNEMENT TO 0\r
+       DPB TAC,IMGIN           ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN\r
+                               ; HERE FROM CHGSWP IF NOT ASKING FOR 0\r
+       POPJ PDP,               ;RETURN\r
+\f      EXTERN PROT0,PROT       ;PROT AND PROT0 OCCUR IN COMMON\r
+\r
+IFE    FTRC10, <\r
+XP ICPRT1,3+1*3                        ;PROTECT TIME IN CLOCK TICS=\r
+XP ICPROT,^D10                 ;((JOBSIZE/1K)*+PROT0)*PROT\r
+                               ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY\r
+                               ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES.\r
+>\r
+IFN    FTRC10, <\r
+;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK......\r
+XP ICPRT1,3+1*3                        ;ZERO CORE PLUS K MULTIPLIER\r
+XP ICPROT,3                    ;MULTIPLY BY K-1 OF LOW SEG\r
+>\r
+\f;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT\r
+,THEM BACK IN TO DESIRED AMOUNT.\r
+,JOBS POSITION IN QS NOT AFFECTED.\r
+;CALLED ONLY FROM CORE COMMAND\r
+;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL\r
+;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG\r
+,CALL: MOVE ITEM,[JOB NO.]\r
+;      MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]\r
+;      PUSHJ PDP,XPAND\r
+;      RETURN, TAC DESTROYED\r
+\r
+XPAND: LSH TAC,-12             ;CONVERT HIGHEST DESIRED ADDRESS\r
+       ADDI TAC,1              ;TO 1K BLOCKS\r
+       DPB TAC,IMGIN           ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE\r
+                               ; TO REQUEST WHEN NEXT SWAPPED IN\r
+\r
+;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT\r
+;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK\r
+;OR ON ITW WAY IN OR OUT.  THE SIZE OF THE HIGH SEG IS UNCHANGED\r
+\r
+;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS\r
+;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)\r
+;CALL: MOVE ITEM,HIGH SEG NUMBER\r
+;      PUSHJ PDP,XPANDH\r
+\r
+       INTERN XPANDH\r
+       EXTERN IPOPJ\r
+\r
+XPANDH:\r
+IFN FT2REL,<\r
+       PUSH PDP,ITEM           ;SAVE JOB NUMBER\r
+       CAILE ITEM,JOBMAX       ;IS THIS A LOW OR HIGH SEG?\r
+       MOVE ITEM,JOB           ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)\r
+>\r
+       MOVSI TAC1,JXPN         ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN\r
+       TDNN TAC1,JBTSTS(ITEM)  ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)\r
+       AOS XJOB                ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING\r
+       IORM TAC1,JBTSTS(ITEM)  ;AND SET JOB EXPANDING BIT\r
+IFE FT2REL,<\r
+       POPJ PDP,               ;RETURN\r
+>\r
+IFN FT2REL,<\r
+       JRST IPOPJ              ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN\r
+>\r
+\fSUBTTL        SWPSER R.KRASIN/AF TS4.34  03 FEB 69    V406\r
+\r
+INTERNAL SQIN,SQOUT,SQGO,SQGO1\r
+INTERNAL FTSWAP\r
+EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK\r
+\r
+;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR\r
+;      INPUT, SWOUT FOR OUTPUT\r
+;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)\r
+;      HRRZ TAC,DISK BLOCK NO.\r
+;      PUSHJ PDP,SQIN/SQOUT\r
+;      RETURN HERE ALWAYS\r
+;      CONTENTS OF TAC,TAC1 LOST\r
+\r
+SQIN:  TLO TAC,400000          ;SET READ INDICATOR\r
+SQOUT: MOVEM TAC,SERA          ;STORE THE BLOCK NUMBER\r
+       MOVEM TAC1,SQREQ        ;STORE THE IOWD\r
+       MOVEM TAC1,ESQREQ       ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB\r
+       MOVNI TAC,1             ;IS THE DEVICE BUSY?\r
+       EXCH TAC,DFBUSY \r
+       JUMPN TAC,CPOPJ         ;YES IF JUMP\r
+\r
+ERATRY=3       ;NO. OF TIMES TO READ AND WRITE ON ERRORS\r
+\r
+;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE\r
+;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE.\r
+;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)\r
+\r
+SQGO:  MOVEI TAC1,ERATRY\r
+       MOVEM TAC1,SERACT\r
+       MOVSI TAC,400000\r
+       TDNE TAC,SERA           ;WRITE?\r
+       JRST SQGO1              ;NO\r
+       HRRZ TAC,SQREQ\r
+       ADDI TAC,JOBDAC\r
+       HRLI TAC,MJOBCK\r
+       PUSHJ PDP,CHECK\r
+       MOVM    TAC,FINISH\r
+       MOVEM   TAC1,JBTCHK(TAC)\r
+\fSQGO1:        SETZM   SQLEN           ;ZERO AMOUNT TRANSFERRED SO FAR\r
+       MOVE TAC1,SQREQ         ;*PUT IOWD INTO TAC1\r
+       MOVSI TAC,200000        ;*SET "SWAPPER I/O GOING" FLAG ON\r
+       ORB TAC,SETA    ;*\r
+       TRZN    TAC,FRGSEG      ;*FRAGMENTED?\r
+       JRST    SQGO2           ;*NO, READ IN ENTIRE (OR PART) OF SEG\r
+\r
+       EXTERN CLCOR1\r
+\r
+FRAGIO:        PUSH    PDP,DAT\r
+       MOVN    DAT,SQLEN       ;AMOUNT PREVIOUSLY TRANSFERRED\r
+       SUB     TAC1,DAT        ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS\r
+FRGIO1:        HLRE    DAT,(TAC)       ;NO OF K IN THIS  DISK CHUNCK\r
+       HRR     TAC,(TAC)       ;SWAPPING ADDRESS FOR THIS DISK CHUNK\r
+       JUMPGE  DAT,FRGIO2      ;POINTER TO NEW CORE LIST IF NEG.\r
+       MOVEI DAT,77777         ;CLEAR OUT ADR(15 BITS)\r
+       ANDCAM DAT,SERA\r
+       ORM TAC,SERA            ;INSERT NEW ADDRESS\r
+       JRST FRGIO1\r
+\r
+\r
+FRGIO2:        LSH     DAT,12          ;CONVERT FROM K TO WORDS\r
+       ADDM DAT,SQLEN          ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT\r
+       MOVNS DAT               ;-N WORDS\r
+       HRLM    DAT,TAC1        ;IOWD IN TAC1\r
+       HRLO DAT,DAT            ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH\r
+       CAMG DAT,SQREQ          ;COMPARE WITH - NO. WORDS FOR REST OF SEG\r
+       HLL TAC1,SQREQ          ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG\r
+                               ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)\r
+       MOVNS DAT               ;+NO. OF WORDS FOR THIS NEXT TRANSFER\r
+       ADDI DAT,777777\r
+       ADDM DAT,SQREQ          ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS\r
+                               ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE\r
+       POP     PDP,DAT\r
+SQGO2: TLZ TAC,377777          ;*CLEAR POSSIBLE TRASH IN LH.\r
+       ROT TAC,BLKSPK          ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.\r
+       TRZE TAC,4              ;*TEST AND CLEAR READ/WRITE BIT.\r
+       SOJA TAC1,DFRED         ;*YES\r
+       SOJA TAC1,DFWRT         ;*NO, WRITE.\r
+\f;SERVICE A SWAPPING INTERRUPT\r
+EXTERNAL DINT4B,CKSMCT\r
+INTERNAL SWPINT\r
+\r
+SWPINT:        TRNE IOS,IODTER!IODERR!IOIMPM\r
+       JRST SWPERR             ;ERRORS\r
+       TRZE TAC,FRGSEG ;*FRAGMENTED?\r
+       SKIPL TAC1,SQREQ        ;*YES, MORE IOWD TO GO?\r
+       JRST DINT8B             ;NO, ALL DONE SWAP IN OR OUT\r
+       AOS SERA                ;YES, FRAGMENTED AND MORE TO GO\r
+       SKIPE 1(TAC)            ;IS THIS THE END OF SWAP COMMAND LIST?\r
+       AOJA TAC,FRAGIO         ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG\r
+\r
+DINT8B:        TLNN TAC,400000         ;*INPUT?\r
+       JRST DINT8A             ;*NO\r
+       HRRZ TAC,SQREQ\r
+       ADDI TAC,JOBDAC\r
+       HRLI TAC,MJOBCK\r
+       PUSHJ PDP,CHECK\r
+       MOVM TAC,FINISH\r
+       CAME TAC1,JBTCHK(TAC)\r
+       JRST SWPER1\r
+DINT8A:        HRRZM IOS,SERA\r
+       SETZM SQREQ\r
+       JRST DINT4B\r
+\r
+SWPER1;        MOVSI TAC,100\r
+       ADDM TAC,CKSMCT\r
+       TRO IOS,IODTER\r
+SWPERR:        MOVM TAC, FINISH        ;*RESET SERA IN CASE OF FRAGMENTED JOB\r
+       HLRZ TAC, JBTSWP(TAC)   ;*SWAP LOC (DISK ADR OR TABLE ADR)\r
+       HRRM TAC, SERA          ;*RESTORE SERA\r
+       MOVE TAC,ESQREQ         ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB\r
+       MOVEM TAC,SQREQ\r
+       SOSLE SERACT            ;*TRIED ENOUGH?\r
+       JRST SQGO1              ;*NO, TRY AGAIN\r
+       JRST DINT8A             ;*YES, TOUGH.\r
+\fIFE   FTRC10, <\r
+;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---\r
+\r
+;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED\r
+;AT CLOCK LEVEL.\r
+;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED\r
+;      PUSHJ PDP,GXSAT\r
+;      ERROR EXIT      (DISK IS FULL)\r
+;      NORMAL EXIT     ;C(TAC) = BLOCK NO.\r
+\r
+;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.\r
+\r
+INTERNAL GXSAT\r
+EXTERNAL GETBIT,IPOPJ1\r
+\r
+GXSAT: MOVE AC1,XSAT1          ;SAVE AC1, SET IT TO TABLE LOC.\r
+       MOVE AC2,XSAT2  ;\r
+       LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
+       PUSH PDP,ITEM           ;SAVE C(ITEM)\r
+       \r
+       MOVE ITEM,DAT           ;GETBIT EXPECTS PARAMETER IN ITEM\r
+       PUSHJ PDP,GETBIT        ;FIND A HOLE BIG ENOUGH\r
+       JRST IPOPJ              ;NONE, RESTORE ITEM AND ERROR RETURN\r
+       MOVEI TAC,-1(TAC1)\r
+       CAIL TAC,BLOCKS         ;IS IT ON DISK 17?\r
+       ADDI TAC,DIFF           ;YES\r
+       LSH TAC,-CONVMD         ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.\r
+       JRST IPOPJ1             ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)\r
+\r
+;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED\r
+;AT CLOCK LEVEL\r
+;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE\r
+;      MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE\r
+;      PUSHJ PDP,FXSTAT\r
+;      ALWAYS RETURN HERE\r
+\r
+;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.\r
+\r
+INTERNAL FXSAT\r
+EXTERNAL CLRBIT,IPOPJ\r
+\r
+FXSAT: LSH TAC,CONVMD          ;RESTORE SHIFTED DISK ADDRESS.\r
+       CAIL TAC,HISWAP         ;ON DISK 17?\r
+       SUBI TAC,DIFF           ;YES\r
+       LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
+       MOVE AC1,XSAT1          ;SET UP AC1 WITH POINTER TO SAT BLOCK\r
+       MOVE AC2,XSAT2          ;AC2 TOO\r
+       PUSH PDP,ITEM           ;SAVE C(ITEM)\r
+       MOVE ITEM,DAT           ;CLRBIT EXPECTS PARAMETER IN DAT\r
+       PUSHJ PDP,CLRBIT\r
+       JRST IPOPJ              ;RETURN, AND RESTORE ITEM\r
+\r
+;INITIALIZE SWAPPER DISK STORAGE TABLE\r
+\r
+INTERNAL SWPINI\r
+\r
+SWPINI:        MOVE TAC,XSAT2\r
+       MOVEM TAC,XSAT31\r
+       MOVSI TAC,1B18\r
+       MOVEM TAC,XSAT3\r
+       SETZM XSAT4\r
+       MOVE TAC,XSAT4P\r
+       BLT TAC,XSAT61\r
+       MOVE TAC,XSAT7\r
+       MOVEM TAC,XSAT5\r
+       MOVE TAC,XSAT8\r
+       MOVEM TAC,XSAT6\r
+       POPJ PDPD,\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7\r
+EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS\r
+;      0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING\r
+;      5400 (OCTAL) RECORDS\r
+\r
+INTERNAL       SQREQ,SERA,SERACT\r
+SQREQ: Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
+                               ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
+ESQREQ:        Z                       ;COPY OF SQREQ, IN CASE OF\r
+                               ; ERROR IN FRAGMENTED JOB\r
+SERA:  Z                       ;SIGN IS 1 IF A READ\r
+                               ; C(RH)=BLOCK NUMBER BEFORE READING.\r
+                               ;  ERROR BITS AFTER READING.\r
+SELACT:        0                       ;COUNT FOR ERRORS\r
+SQLEN: 0                       ;AMOUNT TRANSFERRED SO FAR - FRAG SEG\r
+\r
+XSAT1: EXP XSAT3-1             ;POINTER USED BY GETBIT,CLRBIT\r
+XSAT2: XWD -SWPSIZ,XSAT4       ;POINTER TO BIT TABLE\r
+XSAT3: XWD 400000,             ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT\r
+       XWD -SWPSIZ,XSAT4\r
+\r
+                               ; BIT TABLE FOR SWAPPING ALLOCATION\r
+XP BLOCKS,5400                 ;NUMBER OF RECORDS/DISK PLATE\r
+       W1=BLOCKS/^D36          ;NUMBER OF ZERO WORDS AT TOP OF TABLE\r
+       E1=BLOCKS-W1*^D36       ;LEADING ZERO IN W1+1ST WORD\r
+       EX=BLOCKS+E1-^D35\r
+       W2=EX/^D36              ;ZERO WORDS AT BOTTOM OF TABLE\r
+       E2=EX-W2*^D36           ;LEADING ZEROES IN W1+W2+2ND WORD\r
+\r
+XP XSAT31,XSAT3+1\r
+XSAT4: BLOCK W1\r
+XSAT5: BLOCK W2+1\r
+XSAT6: BLOCK 1\r
+       REPEAT 1,<\r
+               IFE E1,<X=1B0>\r
+               IFN E1,<X1\r
+               REPEAT ^D35-E1,<X=X*2>>\r
+               IFE E2,<Z=-1>\r
+               IFN E2,<Z=0\r
+               X=1\r
+               REPEAT ^D36-E2,<Z=Z+Y\r
+               Y=Y*2>\r
+               >>\r
+XP XSAT61,XSAT6-1\r
+XSAT7: EXP X\r
+XSAT8: EXP Z\r
+\r
+SWPSIZ=XSAT6-XSAT4+1           ;SIZE OF TABLE\r
+HISWAP=17*BLOCKS               ;LOGICAL BLOCK NUMBER OF FIRST\r
+                               ; BLOCK ON DISK\r
+DIFF=HISWAP-BLOCKS-1\r
+\r
+XP CONVMD,3    ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD\r
+               ;DISC BLOCKS(SHIFT COUNT)\r
+\r
+XP BLKSPK,CONVMD               ;NO. OF BLOCKS PER K, SAME AS CONVMD\r
+XSAT4P:        XWD XSAT4,XSAT4+1\r
+>\r
+>      ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.\r
+\fIFN   FTRC10, <\r
+;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---\r
+\r
+INTERNAL       GXSAT,FXSAT,SWPINI\r
+EXTERNAL       GETBIT,CLRBIT\r
+EXTERNAL       LBHIGH,IPOPJ,IPOPJ1\r
+\r
+\r
+;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON\r
+; THE DISK TO SWAP SOME JOB OUT ONTO.  IT IS CALLED AT CLOCK LEVEL.\r
+\r
+;CALLING SEQUENCE ---\r
+;      PUSHJ   PDP,GXSAT\r
+;      ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.\r
+;      NORMAL EXIT\r
+;ENTRY CONDITIONS ---\r
+;      C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.\r
+;EXIT CONDITIONS ---\r
+;      C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN\r
+;                THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.\r
+;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
+\r
+GXSAT: PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
+       MOVE    ITEM,DAT\r
+       MOVEI   AC1,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.\r
+       MOVE    AC2,SWPENT\r
+       PUSHJ   PDP,GETBIT\r
+       JRST    IPOPJ           ;NO ROOM IN THE SWAPPING PART OF THE DISK.\r
+       ADDI    TAC1,-1(ITEM)   ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS\r
+       CAMLE   TAC1,MAXSWP     ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK\r
+       MOVEM   TAC1,MAXSWP     ;BLOCKS.  THE "SWPTAB" TABLE SEARCHED HAS ONE BIT\r
+       LSH     TAC1,BLKSPK     ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED\r
+       SUB     TAC1,LBHIGH     ;BACKWARDS (1ST BIT OF SWPTAB = LAST  1K OF DISK).\r
+       MOVM    TAC,TAC1        ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.\r
+       LSH TAC,-BLKSPK         ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP\r
+       AOJA TAC,IPOPJ1         ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN\r
+\f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO\r
+; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING\r
+; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.\r
+\r
+;CALLING SEQUENCE ---\r
+;      PUSHJ   PDP,FXSAT\r
+;      NORMAL EXIT\r
+;ENTRY CONDITIONS ---\r
+;      C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE\r
+;              SERIES WHICH IS TO BE MADE AVAILABLE.\r
+;      C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH\r
+;              ARETO BE MADE AVAILABLE.\r
+;EXIT CONDITIONS ---\r
+;      THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE\r
+;              (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.\r
+;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
+\r
+FXSAT: TRZN    TAC,FRGSEG      ;FRAGMENTED?\r
+       JRST    FXSAT1          ;NO. DO IN REGULAR WAY\r
+\r
+FRAGRK:        HRRZ    AC3,TAC         ;YES. LOC OF TABLE IN AC3\r
+FRGBK1:        HRRZ    TAC,(AC3)       ;LOC OF NEXT DISK ADDRESS\r
+       HLRE    DAT,(AC3)       ;NUMBER OF K\r
+       JUMPLE  DAT,FRGBK2      ;GIVE UP FREE CORE IF NOT REAL ADDRESS\r
+       PUSHJ   PDP,FXSAT1      ;GIVE UP THE DISK SPACE FOR THIS PART\r
+       AOBJP   AC3,FRGBK1      ;COUNT WORD OF TABLE, GET NEXT\r
+FRGBK2:        HRRZ    TAC,AC3         ;LOC OF TABLE\r
+       PUSH    PDP,ITEM\r
+       HLRZ    ITEM,AC3        ;NUMBER OF WDS IN TABLE\r
+       SUB     TAC,ITEM        ;POINT TAC TO 1ST WORD OF BLOCK\r
+       LSH     ITEM,-2         ;4 WDS PER BIT\r
+       AOS     ITEM\r
+       PUSHJ   PDP,CLCOR1      ;GIVE UP FREE CORE\r
+       POP     PDP,ITEM\r
+       SKIPE   TAC,(AC3)       ;END OF TABLE?\r
+       JRST    FRAGBK          ;NO, GO CHASSE NEXT PART\r
+       POPJ    PDP,            ;YES, DONE\r
+\r
+FXSAT1:        PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
+       MOVE    ITEM,DAT\r
+       LSH TAC,BLKSPK          ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.\r
+       SUB     TAC,LBHIGH      ;PREPARE TO CLEAR BITS IN THE SWAPPING\r
+       MOVMS   TAC             ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL\r
+       ADDI    TAC,1           ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS\r
+       MOVNI   AC1,BLKSPK      ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS\r
+       LSH     TAC,(AC1)       ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).\r
+       SUB     TAC,DAT\r
+       MOVEI   AC1,SWPENT\r
+       MOVE    AC2,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.\r
+FXSATC:        PUSHJ   PDP,CLRBIT      ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES\r
+                               ; THE WORK OF CLEARING THE BITS.\r
+       JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
+;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT\r
+; SYSTEM INITIALIZATION TIME.\r
+\r
+       EXTERN VIRTAL,SWPHGH\r
+\r
+SWPINI:        MOVE TAC,LBHIGH         ;SET HIGHEST LOGICAL BLOCK\r
+       MOVEM TAC,SWPHGH        ;FOR SWAPPING IN COMMON\r
+       MOVNI   TAC,1           ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING\r
+       MOVE    TAC1,SWPENT     ; AS BEING UNAVAILABLE FOR SWAPPING.\r
+       MOVEM   TAC,(TAC1)\r
+       AOBJN   TAC1,.-1\r
+       MOVEI   AC1,SWPENT      ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY\r
+       MOVE    AC2,SWPENT      ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK\r
+       MOVE    ITEM,K4SWAP     ; AREAS ALLOCATED FOR SWAPPING USE.  THE PARAMETER\r
+       MOVEM ITEM,VIRTAL       ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED\r
+                               ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE\r
+                               ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE\r
+\f      MOVEI   TAC,0           ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND\r
+                               ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.\r
+       JRST    CLRBIT          ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".\r
+\fIFN FTCHECK+FTMONP,<\r
+EXTERNAL       RCXSDT  ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO\r
+                       ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".\r
+EXTERNAL       SQREQ,SERA,SERACT\r
+EXTERNAL       LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP\r
+>\r
+\r
+IFE FTCHECK+FTMONP,<\r
+;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---\r
+\r
+       INTERN  MXK2SWP,CONVMD,BLKSPK,SWAPTAB,MAXSWP\r
+       EXTERN K4SWAP\r
+;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.\r
+\r
+;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING\r
+;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
+;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS\r
+;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
+MAXSWP: 0      ;MAX. NO. OF K FROM TOP TO LOWEST JOB\r
+                       ; USED SINCE SYSTEM BEGAN\r
+;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO\r
+;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD\r
+;HAPPENED SOMETIME DURING THE PAST\r
+BLKSPK=3       ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,\r
+               ; EIGHT DISK BLOCKS PER K OF CORE.\r
+CONVMD=BLKSPK  ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.\r
+MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED\r
+               ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP  WHICH\r
+               ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS\r
+               ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)\r
+SWPSIZ=MXK2SWP/.^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE.\r
+\r
+SWPENT:        XWD     -SWPSIZ,SWPTAB  ;THREE WORD POINTER TABLE\r
+       XWD     400000,0        ; REQUIRED BY THE "GETBIT" AND\r
+       XWD     -SWPSIZ,SWPTAB  ; "CLRBIT" SUBROUTINES.\r
+\r
+SWPTAB:        BLOCK   SWPSIZ  ;SWAPPING SPACE AVAILABILITY TABLE.\r
+\r
+;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---\r
+INTERNAL       SQREQ,SERA,SERACT,ESQREQ\r
+SQREQ: Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
+                               ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
+ESQREQ:        Z                       ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB\r
+SERA:  Z                       ;SIGN IS 1 IF A READ\r
+                               ; C(RH)=BLOCK NUMBER BEFORE READING.\r
+                               ;  ERROR BITS AFTER READING.\r
+SELACT:        0                       ;COUNT FOR ERRORS\r
+SQLEN: 0                       ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB\r
+>\r
+>      ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.\r
+\fSCHEND:       END\r
diff --git a/src/scnsrf.mac b/src/scnsrf.mac
new file mode 100644 (file)
index 0000000..14d7517
--- /dev/null
@@ -0,0 +1,2076 @@
+TITLE  SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415\r
+SUBTTL R CLEMENTS.RCC  TS  03 JUN 69\r
+       XP VSCNSF,415\r
+\r
+ENTRY SCNSRF\r
+SCNSRF:\r
+\r
+\r
+;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS\r
+\r
+;        I.     COMMENTARY ON OPERATION AND DATA STRUCTURES\r
+;       II.     SYSTEM INITIALIZATION ROUTINE - SCNINI\r
+;      III.     UUO LEVEL ROUTINES\r
+;                       A. DDTIN\r
+;                       B. DDOUT\r
+;                       C. TTYUUO\r
+;                       D. TTYIN\r
+;                       E. TTYOUT\r
+;       IV.      COMAND LEVEL ROUTINES\r
+;                       A. TTYATT\r
+;                       B. TTYCOM\r
+;                       C. TTYDCM\r
+;                       D. TTYDET\r
+;                       E. TTYFND,TTYFNU\r
+;                       F. TTYKIL\r
+;                       G. TTYSET\r
+;                       H. TTYSRC\r
+;                       I. TTYSTC\r
+;                       J. TTYTLK\r
+;                       K. TTYUSR\r
+;        V.      INTERRUPT SERVICE ROUTINES\r
+;                       A. CTYINT\r
+;                       B. SCNINT\r
+;                       C. RFCINT - ALL LINES RECEIVER INTERRUPT\r
+;                               1. TTEDIT - EDITS AND ECHOS\r
+;                       D. XMTINT -  TRANSMIT INTERRUPT\r
+;                               1. GETCHR\r
+;                               2. TYP\r
+\f;DATA STRUCTURES AND PARAMETERS\r
+\r
+; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION\r
+;              SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1)\r
+\r
+;              TRANSLATOR TABLE PARAMETERS\r
+;              TTYLEN=SCNLIN+1 LENGTH OF TTY TRANSLATOR TABLE (INCLUDING CTY)\r
+;              TTYTAB: BLOCK TTYLEN    TTY TRANSLATOR TABLE\r
+;                      SIGN BIT=1 IF COMMAND JUST TYPED\r
+;                      BIT 1 =1 IF DELAYED COMMAND\r
+;                      BITS 3-11 = JOB NO TTY IS ATTACHED TO (TPCJOBN)\r
+;                      BITS 12-17=TALK RING LINE # (PTALK)\r
+;                      BITS 18-35=ADDR. OF DEVICE DATA BLOCK\r
+;                              FOR THIS LINE.\r
+;              DEVOPR: 0       SIXBIT PHYSICAL NAME OF OPERATORS\r
+;                              CONSOLE\r
+\r
+;      DEFINED IN IOINI2\r
+;              LINE NUMBER PARAMETERS\r
+;              MLTTYL=-NO. OF TTY DEVICE DATA BLOCKS\r
+;              TCONLN=SCNLIN   CTY LINE NUMBER\r
+;              MTTYLN=-TTYLEN  -LENGTH OF TRANSLATOR TABLE\r
+;              TTYLST=TTY0D0   FIRST TTY DEVICE DATA BLOCK\r
+\r
+;              TTY DEVICE DATA BLOCK FORMAT\r
+;              (STANDARD IS AS DEFINED ON SYSTEM PARAMETER TAPE)\r
+;              DEVNAM: PHYSICAL DEVICE NAME SET UP DYNAMICALLY\r
+;                      VIA SCNIN0.\r
+;              DEVCHR: LEFT HALF IS STANDARD\r
+;                      BITS 18-23=LINE NUMBER(BYTE POINTER=PUNIT)\r
+;                      BITS 24-35=MONITOR BUFFER SIZE + 1\r
+\f;             DEVIOS: LEFT HALF\r
+;                      1,2,4,20,40 ARE STANDARD\r
+                       USRB=100        ;SET TTY TO USER MODE\r
+                                       ;WHEN OUTPUT FINISHES\r
+                       IOSUPR=200      ;SUPPRESS ALL OUTPUT\r
+                                       ;TILL NEXT INPUT OR INIT (^O).\r
+                       TRMON=400       ;TTY IS IN MONITOR\r
+                                       ;COMMAND MODE.\r
+                       DDTM=1000       ;DDT MODE\r
+                       TTYDTC=2000     ;TTY DDB IS DETACHED FROM LINE\r
+                       SYNC=20000      ;BREAK CHARACTER SEEN\r
+                                       ;SIGNAL TO INCREMENT SYNC COUNT\r
+                                       ;FOR BUFFER INVOLVED\r
+                       TTYIOW=400000   ;TTY INPUT WAIT BIT\r
+\r
+IFNDEF FTHDPX,<FTHDPX=-1>      ;NON-ZERO TO INCLUDE HALF-DUPLEX CODE\r
+IFNDEF FTDDTM,<FTDDTM=-1>      ;NON-ZERO TO IUNCLUDE CALLI DDTIN,OUT\r
+\r
+FTTTYSER=-1    ;DEFINE THIS SYSTEM TO HAVE SCNSRF\r
+\r
+INTERN FTTTYSER        ;ASSURE MULT DEF GLOBALS IF WRONG APSER\r
+\f;                     RIGHT HALF BITS (USER MODE0\r
+                       FCS=100         ;FULL CHARACTER SET. PASS\r
+                                       ;ON ALL CHARACTERS EXCEPT ^C\r
+                                       ;NO SPECIAL CHARACTER PROCESSING\r
+                       NOECHO=200      ;ECHO SUPPRESSION REQ BY PROG\r
+                       DLRSUP=400      ;400 SUPPPRES "$" FOR ALTMODE\r
+                       MERTPO=IOIMPM   ;MONITOR ERROR TYPE-OUT\r
+                       IGNOR=IODERR    ;IGNORE ALL INT, FOR 1/2\r
+                                       ;OF A SECOND WHEN ECHO\r
+                                       ;FAILURE OCCURS.\r
+                       ECHOF=IODTER    ;ECHO FAILURE OCCURED.\r
+;              DEVSER: STANDARD\r
+;              DEVBUF: STANDARD\r
+;              DEVIAD: BITS 6-12=HORIZONTAL POSITION (BYTE\r
+;                              POINTER = PHPOS).\r
+;                      BITS 13-35 ARE STANDARD.\r
+;              DEVOAD: BITS 0-8=NUMBER OF CHARACTERS TO FIT\r
+;                                      ;INTO OUTPUT BUFFER\r
+;                                      (POINTER= PFITCH)\r
+;                      BITS 13-35 ARE STANDARD\r
+\r
+;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE\r
+;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK FOR EACH BUFFER. WITH\r
+;TTX'BUF AS THE BASE (DETAILED DESCRIPTIN IN SCNDDB COMMENTS):\r
+\r
+       XP      BUF,0           ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER\r
+       XP      PUTR,1          ;PUTR(DAT)-PUTS CHARACTER INTO BUFFER\r
+       XP      PCTR,2          ;NUMBER OF TIMES TO INCR. PUTR BEFORE REINITING\r
+       XP      TAKR,3          ;TAKER POINTER TO PICK UP CHARACTERS\r
+       XP      TCTR,4          ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED\r
+       XP      FCTR,5          ;COUNT OF FREE SPACES LEFT IN BUFFER\r
+\f;DEFINITION OF LINE CHARACTERISTICS TABLE BITS\r
+;LINTAB MADE BY SYSTEM BYUILDER\r
+;FOLLOWING IS FORMAT AS SET UP BY SCNINI\r
+;      XWD BITS,LOGICAL LINE#\r
+\r
+EXTERNAL LINTAB\r
+\r
+PTYLIN=400000          ;THIS LINE LINKED TO PTY\r
+CTYLIN=200000          ;THIS "LINE" IS CONSOLE DEVICE "TTY"\r
+DISLIN=100000          ;THIS LINE IS TO A DISPLAY KEYBOARD\r
+DSDTLN=40000           ;DATA SET DATA LINE\r
+DSCTLN=20000           ;DATA SET CONTROL LINE\r
+HLFDPX=10000           ;HALF DUPLEX LINE\r
+TTYRMT=4000            ;REMOTE TTY LINE\r
+\r
+;ABOVE ARE "PERMANENT" CHARACTERISTICS\r
+\r
+TLKRNG=1               ;THIS LINE CURRENTLY IN A TALK RING\r
+XON=2                  ;^Q TYPED, PAPER TAPE INPUT\r
+\r
+FULTWX=4               ;SELF ECHOING FULL DUPLEX\r
+T35=10                 ;MODEL 35\r
+T37=20                 ;MODEL 37\r
+ROBTPB=40              ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.)\r
+LINRDY=100             ;LINE TYPED IN BY USER (TISYNC .G.0)\r
+                       ; NOT ACTUALLY IN LINTAB. BUT RETURNED BY\r
+                       ; GETLIN IN TTCALL\r
+\r
+;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS\r
+;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM)\r
+\r
+LGLSET=T37+T35+FULTWX+XON      ;THESE CAN BE SET OR ZEROED BY PROGRAM\r
+KILMSK=ROBTPB+TLKRNG+XON       ;CLEARED AT TTYKIL\r
+\r
+;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP\r
+;AND TO CHECK AGAINST S IN COMMON\r
+\r
+INTERNAL PTYLIN,CTYLIN,DISLIN,DSDTLN,DSCTLN,HLFDPX,TTYRMT\r
+INTERNAL T35,T37,FULTWX,LGLSET,KILMSK,XON\r
+\f;ACCUMULATOR ASSIGNMENTS\r
+\r
+       CHREC=TEM       ;AC FOR CHARACTER\r
+       DDB=DEVDAT      ;ADDRESS OF DEVICE DATA BLOCK\r
+       LINE=TAC1       ;SCANNER LINE NUMBER\r
+       HPOS=ITEM       ;HORIZONTAL POSITION OF TTY,(0-71)\r
+\r
+;SPECIAL SYMBOLS\r
+\r
+       PION=200        ;TURN PI ON BIT\r
+       PIOFF=400       ;TURN PI OFF BIT\r
+\r
+       IDLECH=1        ;DELAY CHAR FOR TABS, ETC,\r
+                       ; SHOULD BE ^V, BUT FOR 37'S\r
+\r
+;BYTE POINTERS\r
+\r
+INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB\r
+\r
+PHPOS: POINT 7,DEVIAD(DEVDAT),12       ;HORIZONTAL POSITION\r
+TPCJOBN:POINT 9,TTYTAB(LINE),11                ;JOB NUMBER FOR TTY.\r
+PSAVCH:        POINT 7,TTYPTR(DDB),10          ;SAVE CHAR TO ECHO ON UUO LEVEL\r
+\r
+INTERNAL FTTALK\r
+\r
+IFN FTTALK,<\r
+       PTALK:  POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING\r
+>\r
+\r
+INTERN PLASTC,PCOMIC\r
+\r
+PLASTC: POINT 7,TTYPTR(DDB),35 ;FOR EACH CHECKING ON HDX LINES\r
+PCOMIC: POINT 9,TTYPTR(DDB),19 ;FOR RESCANNING COMMAND INPUT LINE\r
+                               ;"COMMAND INPUT COUNTER" SAVES TITCTR\r
+PLSTLC:        POINT 9,TTYPTR(DDB),28  ;FOR ^U DELETION\r
+\r
+TOIP=400000    ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS\r
+\r
+;TTYPTR CONTAINS THE FOLLOWING BYTES:\r
+;\r
+;      0       ON IF TYPE-OUT IN PROGRESS\r
+;      1-3     SPARE\r
+;      4-10    PSAVCH, FOR INTERRUPTED ECHO\r
+;      11-19   PCOMIC, FOR COMMAND RESCAN\r
+;      20-28   PLSTLC, FOR ^U\r
+;      29-35   PLASTC, FOR EACH CHECKING HALF DUPLEX LINES\r
+\f;SCNINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
+;IOGO IN SYSINI VIA DISPATCH TABLE\r
+;IT    1)CLEARS ALL RECEIVER FLAGS.\r
+;      2)CLEARS THE PHYSICAL NAME (DEVNAM) OF ALL UNUSED\r
+;        (TTYUSE=0) TTY DEVICE DATA BLOCKS,\r
+;      3)SETS DEVIOD TO XWD TPMON+IOFST,0 IN ALL TTY DEVICE\r
+;        DATA BLOCKS.\r
+;      4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE.\r
+\r
+EXTERNAL SCNSCH,MLTTYL,MTTYLN,TTYTAB,SCNINI\r
+\r
+TTYINI:        MOVEI TAC,SCNCHN\r
+       CONO TTY,1200(TAC)      ;CLEAR CTY, ASSIGN CHANNEL\r
+       PUSHJ   PDP,SCNINI      ;DEVICE DEPENDENT SCANNER INIT\r
+       MOVSI TAC1,MLTTYL       ;NO. OF TTY DEV. DATA BLOCKS. NOT LINES\r
+       MOVSI IOS,TPMON+IOFST   ;VIRGIN STATUS\r
+       MOVEI DDB,TTYLST        ;FIRST TTY DDB ADDRESS\r
+\r
+SCN1:  MOVSI DAT,TTYUSE        ;TTY DDB IN USE BIT\r
+       TDNN DAT,DEVMOD(DDB)    ;IS THIS TTY DDB IN USE?\r
+       SETZM DEVNAM(DDB)       ;NO, SET PHYSICAL NAME TO 0.\r
+       MOVEM IOS,DEVIOS(DDB)   ;SET IOS TO INITIAL STATE\r
+       ANDCAM DAT,DEVMOD(DDB)  ;CLEAR TTYUSE BIT.\r
+       SETZM   TTYPTR(DDB)     ;CLEAR TOIP, ETC\r
+       MOVSI   TAC,TTYCHR      ;NUMBER OF CHARACTERS IN BUFFER\r
+       HRRI    TAC,TIBF(DDB)   ;ADDRESS OF TTY INPUT BUFFER\r
+       MOVEM   TAC,TTIBUF(DDB) ;SET IT UP\r
+       HRRI    TAC,TOBF(DDB)   ;ADDRESS OF TTY OUTPUT BUFFER\r
+       MOVEM   TAC,TTOBUF(DDB) ;SET UP INFO FOR THAT\r
+       PUSHJ PDP,TSETBF        ;CLEAR MONITOR BUFFERS\r
+       HLRZ DDB,DEVSER(DDB)    ;GET NEXT TTY DDB\r
+       AOBJN TAC1,SCN1\r
+       MOVSI TAC1,MTTYLN       ;SET DDB USE BITS FROM TRANSLATOR TABLE\r
+SCN2:  MOVSI TAC,TTYUSE\r
+       SKIPE DDB,TTYTAB(TAC1)\r
+       IORM TAC,DEVMOD(DDB)\r
+       HRRZ TA,TAC1            ;SET UP PERMANENT LINTAB BITS\r
+       CAIGE   TAC,TCONLN      ;ORDINARY TTY LINE?\r
+       JRST    SCN3            ;YES\r
+       CAIE    TAC,TCONLN      ;CTY LINE?\r
+       TLOA    TAC,PTYLIN      ;NO. MUST BE PTY LINE NR\r
+       TLO     TAC,CTYLIN+T35  ;YES\r
+SCN3:  HRRM    TAC,LINTAB(TAC1)        ;SET LOG. LINE NUMBERS\r
+       IORB    TAC,LINTAB(TAC1)        ;SET SIGNIFICANT BITS\r
+       TLZ     TAC,KILMSK      ;ZAP INSIGNIFICANT BITS\r
+       TLNE    TAC,DSDTLN              ;IF A DATAPHONE,\r
+       TLZ     TAC,LGLSET              ; CLEAR OTHERS TOO\r
+       HLLM    TAC,LINTAB(TAC1)        ;LEAVING REST OF BITS AS THEY WERE\r
+       AOBJN TAC1,SCN2\r
+       POPJ PDP,\r
+\f;ROUTINES TO SET UP BUFFERS\r
+\r
+INTERNAL TSETBF,SETBFI,PUTCHI\r
+\r
+SETBFI:        MOVEI   DAT,1\r
+       DPB     DAT,PCOMIC\r
+       DPB     DAT,PLSTLC\r
+       MOVEI   DAT,TTIBUF(DDB)         ;SPECIFY INPUT BUFFER\r
+       SETZM   TISYNC(DDB)             ;NO LINES IN BUFFER\r
+       JRST    SETBF0                  ;INIT BUFFER\r
+\r
+TSETBF:        PUSHJ   PDP,SETBFI              ;INIT TTI BUFFER\r
+SETBF2:        MOVEI   DAT,TTOBUF(DDB)         ;SPECIFY OUTPUT BUFFER\r
+SETBF0:        MOVE    TAC,BUF(DAT)\r
+       HRLI    TAC,440700      ;INITIAL TAKR AND PUTR\r
+       MOVEM   TAC,TAKR(DAT)\r
+       MOVEM   TAC,PUTR(DAT)\r
+       MOVEI   TAC,1           ;INITIALIZE COUNTERS TOO\r
+       MOVEM   TAC,TCTR(DAT)\r
+       MOVEM   TAC,PCTR(DAT)\r
+       HLRZ    TAC,BUF(DAT)    ;CHARACTER COUNT\r
+       MOVEM   TAC,FCTR(DAT)   ;UPDATE FREE CHARACTER COUNT\r
+\r
+;ROUTINE TO PUT A CHARACTER INTO A BUFFER (FOR INPUT,MERTPO, AND ONCE)\r
+;CALL  MOVEI DAT,TTYBUF(DDB)           ;TO SPECIFY BUFFER\r
+;      PUSHJ   PDP,PUTCHI\r
+;      ERROR RETURN, BUFFER "FULL"\r
+;      SUCCESSFUL RETURN\r
+\r
+PUTCHI:        SOSGE   FCTR(DAT)               ;ANY FREE SPACES LEFT?\r
+       JRST    PUTCI0                  ;NO\r
+PUTCI2:        SOSLE   PTCR(DAT)               ;LAST BYTE IN BUFFER FILLED?\r
+       JRST    PUTCI1          ;NO, GO AHEAD\r
+       PUSH    PDP,TAC\r
+       MOVE    TAC,BUF(DAT)    ;GET ADR AND SIZE OF BUFFER\r
+       HLRZM   TAC,PCTR(DAT)   ;INITIAL COUNTER\r
+       HRLI    TAC,440700      ;MAKE A BYTE POINTER\r
+       MOVEM   TAC,PUTR(DAT)   ;STORE IT\r
+       POP     PDP,TAC ;RESTORE TAC\r
+PUTCI1:        IDPB    CHREC,PUTR(DAT)\r
+       JRST    CPOPJ1\r
+\r
+;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER\r
+;CALLED IN LINE FROM PUTCH0\r
+\r
+TTIOUT:        MOVE    IOS,DEVIOS(DDB)\r
+       AOS     TOFCTR(DDB)             ;RE-ADJUST FREE CHAR COUNT\r
+       TRNN    IOS,MERTPO              ;MONITOR ERROR MESSAGES?\r
+       JRST    GETCH1                  ;NO, ZERO CHREC TO INDICATE\r
+       MOVEI   DAT,TTIBUF(DDB)         ;YES, PUT REST IN TTI BUFFER\r
+       SOSGE   FCTR(DAT)               ;ANY SPACE?\r
+       JRST    PUTCI0                  ;NO.\r
+       SOS     0(PDP)                  ;YES, COMPENSATE SKIP RETURN\r
+       JRST    PUTCI2                  ;AND GO TO MIDDLE OF PUTCHI\r
+\f;CHARACTER AND BUFFER HANDLING ROUTINES\r
+\r
+;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER\r
+;CALL  MOVEI   DAT,TTXBUF(DDB)         ;TO SPECIFY BUFFER\r
+;      PUSHJ   PDP,GETCHR\r
+;      ONLY RETURN             ;CHARACTER OR ZERO IN CHREC\r
+;                              ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR)\r
+\r
+INTERNAL GETCHR\r
+\r
+GETCHR:        HLRZ    CHREC,BUF(DAT)          ;SIZE OF THIS BUFFER\r
+       CAMG    CHREC,FCTR(DAT)         ;IS FREE COUNTER EQUAL TO SIZE?\r
+                                       ;I.E., IS THE BUFFER EMPTY?\r
+       JRST    GETCH1                  ;YES. LOAD CHREC WITH ZERO AND EXIT\r
+       SOSLE   TCTR(DAT)               ;NO, ARE WE AT END OF BUFFER?\r
+       JRST    GETCH2          ;YES. GO ON.\r
+       MOVE    CHREC,BUF(DAT)  ;YES. START AT TOP AGAIN\r
+       HLRZM   CHREC,TCTR(DAT) ;INITIAL COUNTER\r
+       HRLI    CHREC,440700            ;MAKE A BYTE POINTER\r
+       MOVEM   CHREC,TAKR(DAT) ;INITIAL POINTER\r
+GETCH2:        ILDB    CHREC,TAKR(DAT)         ;GET CHARACTER\r
+       AOS     FCTR(DAT)               ;INCREMENT FREE CHAR. COUNT\r
+       JUMPE   CHREC,GETCHR            ;SKIP NULLS\r
+       POPJ    PDP,\r
+GETCH1:        TDZA    CHREC,CHREC     ;RETURN 0 INDICATING END OF BUFFER\r
+PUTCI0:        AOS     FCTR(DAT)       ;READJUST FREE COUNTER\r
+       POPJ    PDP,\r
+\r
+;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER\r
+;CALLED AT INTERRUPT LEVEL\r
+;CALL  MOVE    CHREC,CHARACTER TO PLACE INTO BUFFER\r
+;      PUSHJ   PDP,PUTCHO\r
+;      ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED\r
+\r
+PUTCHO:        SOSGE   TOFCTR(DDB)             ;RETURN IMMEDIATELY IF NO ROOM\r
+       JRST    TTIOUT                  ;UNLESS MONITOR ERROR MESSAGE\r
+       CONO    PI,PIOFF                ;PREVENT PCTR AND PUTR DIFFERENCE\r
+       SOSLE   TOPCTR(DDB)             ;LAST BYTE IN BUFFER?\r
+       JRST    PUTCO1          ;NO. GO ON.\r
+       MOVE    TAC,TTOBUF(DDB) ;GET COUNT AND ADDRESS\r
+       HLRZM   TAC,TOPCTR(DDB) ;INITIAL COUNTER\r
+       HRLI    TAC,440700      ;MAKE A BYTE POINTER\r
+       MOVEM   TAC,TOPUTR(DDB) ;INITIAL POINTER\r
+PUTCO1:        IDBP    CHREC,TOPUTR(DDB)       ;PUT CHARACTER INTO BUFFER\r
+       CONO    PI,PION                 ;GET PI BACK ON\r
+       POPJ    PDP,\r
+\f;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL(ASCII 0-37, 175-177)\r
+;CALL  MOVE    CHREC,CHAR. TO BE CHECKED\r
+;      PUSHJ   PDP,SPCHEK\r
+;      RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0\r
+;      RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB\r
+\r
+INTERNAL SPCHEK\r
+\r
+SPCHEK:        MOVEI   TAC,0                   ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD\r
+       CAIGE   CHREC,40\r
+       JRST    SPCHK1\r
+       CAIG    CHREC,174\r
+       POPJ    PDP,\r
+       SKIPA   TAC,SPCTAB-135(CHREC)\r
+\r
+SPCHK1:        MOVE    TAC,SPCTAB(CHREC)\r
+       JRST    CPOPJ1\r
+\f;SPECIAL CHARACTER TABLE\r
+;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE\r
+;HIGH ORDER BITS IN LH:\r
+\r
+SPACTN=40000           ;SPECIAL ACTION TO BE TAKEN\r
+SPOUT=100000           ;SPECIAL HANDLING ON UUO OUTPUT\r
+BREAKB=20000           ;BREAK CHARACTER\r
+SPHPOS=10000           ;CHARACTER AFFECTS HORIZONTAL POSITION\r
+ECSBRK=4000            ;BREAK CHARACTER IN FCS(100) MODE\r
+ECHSUP=2000            ;SUPRESS ECHO OF CHAR ITSELF\r
+\r
+SPCTAB:        XWD     ECHSUP,0                        ;NULL\r
+       XWD     ECHSUP,0                        ;^A SOH\r
+       XWD     SPACTN+ECHSUP,CONTB             ;^B FULTWX SH\r
+       XWD     SPACTN+ECHSUP+BREAKB,CONTC      ;^C\r
+       XWD     ECHSUP,0                        ;^D EOT\r
+       XWD     ECHSUP,0                        ;^E WRU\r
+       XWD     SPACTN+ECHSUP,CONTF             ;^F T37 SW\r
+       XWD     FCSBRK,0                        ;^G (BELL)\r
+       XWD     SPACTN+SPHPOS,CONTH             ;^H OR BACKSPACE KEY\r
+       XWD     SPACTN+SPHPOS+SPOUT,CONTI       ;^I OR TAB\r
+       XWD     BREAKB,0                        ;^J OR LINE FEED\r
+       XWD     SPACTN+SPOUT+BREAKB,CONTK       ;^K OR VERT TAB\r
+       XWD     SPACTN+SPOUT+BREAKB,CONTL       ;^L OR FORM FEED\r
+       XWD     SPACTN+SPHPOS,CRLF              ;^M OR CARRIAGE RETURN\r
+       XWD     ECHSUP,0                        ;^N\r
+       XWD     SPACTN,CONTO                    ;^O SUPP OUTPUT\r
+       XWD     SPACTN+ECHSUP,CONTP             ;^P T35 SW\r
+       XWD     SPACTN+ECHSUP,CONTQ             ;^Q XON (PAPERTAPE)\r
+       XWD     ECHSUP,0                        ;^R TAPE PUNCH OFF\r
+       XWD     SPACN+ECHSUP,CONTS              ;^S XOFF\r
+       XWD     ECHSUP,0                        ;^T TAPE PUNCH OFF\r
+       XWD     SPACTN,CONTU                    ;^U DELETE LINE\r
+       XWD     ECHSUP,0                        ;^V\r
+       XWD     ECHSUP,0                        ;^W\r
+       XWD     ECHSUP,0                        ;^X\r
+       XWD     ECHSUP,0                        ;^Y\r
+       XWD     SPACTN+BREAKB+ECHSUP,CONTZ      ;^Z TTY EOF\r
+       XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;ASCII 33 (ALT-MODE)\r
+       XWD     ECHSUP,0                        ;ASCII 34\r
+       XWD     ECHSUP,0                        ;ASCII 35\r
+       XWD     ECHSUP,0                        ;ASCII 36\r
+       XWD     ECHSUP,0                        ;ASCII 37\r
+\r
+;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177\r
+\r
+       XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;OLD DEC ALTMOD 175\r
+       XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;ALT-MODE 176\r
+       XWD     SPACTN+ECHSUP+FCSBRK,RUBOUT     ;177 RUBOUT\r
+\fIFN FTDDTM,<\r
+\r
+;INPUT TO DDT\r
+;CALL AC,[SIXBIT /DDTIN/]      AC CONTAINS POINTER TO BUFFER AREA\r
+;BUFFER AREA MUST BE 21 WORDS LONG\r
+\r
+INTERNAL DDTIN\r
+EXTERNAL WSYNC,IADRCK,ADRERR\r
+EXTERNAL PTYOW\r
+\r
+DDTIN: PUSHJ PDP,TTYFNU        ;SET UP DEVDAT,LINE\r
+       MOVE    IOS,[XWD TTYIOW+DDTM,IOACT]\r
+       IORB IOS,DEVIOS(DDB)    ;PUT INTO I/O WAIT\r
+       MOVE    TAC,TIPUTR(DDB)\r
+       CAMN    TAC,TITAKR(DDB) ;ANYTHING IN BUFFER;\r
+       PUSHJ   PDP,TWSYNC      ;NO, WAIT FOR SOME\r
+DDTIW: MOVE    IOS,[XWD TTYIOW,IOACT]\r
+       ANDCAB IOS,DEVIOS(DDB)\r
+\r
+       MOVSI TAC,IOFST+DDTM\r
+       IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO\r
+       HRRZ TAC,@UUO           ;CONTENTS OF USER (DDT) AC\r
+       ADDI TAC,21\r
+       PUSHJ PDP,IADRCK\r
+       JRST ADRERR\r
+       SUBI TAC,21\r
+       PUSHJ PDP,IADRCK\r
+       JRST ADRERR\r
+       MOVSI   AC2,440700+PROG\r
+       HRR     AC2,TAC\r
+       MOVE    TAC1,TIPUTR(DDB)\r
+       MOVEI   DAT,TTIBUF(DDB)\r
+       MOVEI   AC1,<21*5>-1    ;NUMBER OF CHARACTERS ALLOWED\r
+\fXFRIN:        PUSHJ   PDP,GETCHR      ;TRANSFER INTO USER'S AREA\r
+       JUMPE   CHREC,XFRIN2\r
+       PUSHJ   PDP,SPCHEK\r
+       JRST    XFIN1\r
+       TLNE    TAC,FCSBRK+BREAKB\r
+       SOS     TISYNC(DDB)\r
+XFRIN1:        CAIN    CHREC,3         ;PRESTORED CONTROL C?\r
+       JRST    DDONC           ;YES, GO INTO MONITOR MODE\r
+       IDPB    CHREC,AC2\r
+       SOJG    AC1,XFRIN               ;LOOP TILL DONE\r
+XFRIN2:        MOVEI   CHREC,0         ;TERMINATE STRING\r
+       IDPB    CHREC,AC2\r
+       MOVSI TAC,IOSUPR        ;MAKE SURE IO NO LONGER SUPR.\r
+       ANDCAM TAC,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+DDTCNC:        PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       JRST    MONUS6          ;GO PROCESS ^C\r
+>\r
+\r
+EXTERNAL PTYOW,WSYNC\r
+\r
+;TWSYNC IS CALLED FOR INPUT IO WAIT\r
+\r
+TWSYNC:        TLNE    LINE,PTYLIN     ;PSEUDO TELETYPE TTYDDB?\r
+       PUSHJ   PDP,PTYOW       ;SET OUTPUT WAIT BIT IN PTY DEVIOS WORD\r
+       TLNE    LINE,XON        ;DO WE WANT TO START RDR?\r
+       TLNE    LINE,PTYLIN+HLFDPX+FULTWX       ;CAN WE?\r
+       JRST    WSYNC           ;NO\r
+       MOVEI   CHREC,21        ;READER START CHAR\r
+       PUSHJ   PDP,OUTCHS      ;TO OUTPUT BUFFER\r
+       PUSHJ   PDP,UTYPET      ;START TTY, AND\r
+       JRST    WSYNC           ;WAIT FOR INPUT\r
+\fEXTERNAL WSYNC,IADRCK,ADRERR,CPOPJ\r
+EXTERNAL JOBPFI,GETWD1\r
+\r
+IFN FTDDTM,<\r
+;OUTPUT FROM DDT\r
+;CALL AC,[SIXBIT /DDTOUT/]     AC HAS POINTER TO DDT OUTPUT BUFFER\r
+\r
+INTERNAL DDTOUT\r
+\r
+DDTOUT:        PUSHJ PDP,TTYFNU\r
+       MOVE    UUO,@UUO\r
+>\r
+\r
+DDT5:  MOVSI   IOS,IO+DDTM\r
+       IORB    IOS,DEVIOS(DDB)\r
+       HRLI    UUO,PROG        ;POINT TO USER AC\r
+       HRRI    UUO,-1(PROG)            ;COMPENSATE FOR GETWD1\r
+DDT2:  MOVE    DAT,[XWD 440700,TAC]    ;BYTE POINTER TO TAC\r
+       PUSHJ   PDP,GETWD1              ;GET THE USER'S WORD\r
+DDT3:  TLNN    DAT,760000              ;ANY CHARS LEFT?\r
+       JRST    DDT2                    ;NO, GET ANOTHER WORD\r
+DDT4:  ILDB    CHREC,DAT               ;BYTE FROM TAC\r
+       JUMPE   CHREC,DDTUTT            ;NULL IS END OF STRING\r
+       PUSHJ   PDP,OUTCHR      ;PLACE CHAR IN OUTPUT BUFFER\r
+       JUMPN   CHREC,DDT3      ;LOOP IF CHARACTER WAS PLACED\r
+       ADD     DAT,[XWD 070000,0]      ;BACK UP POINTER\r
+       PUSH    PDP,DAT                 ;SAVE BYTE POINTER TO TAC\r
+       PUSH    PDP,TAC                 ;AND SAVE THE CHARS IN TAC\r
+       PUSHJ   PDP,DDTUTT              ;START OUTPUT\r
+\r
+DDTWAT:        MOVEI IOS,IOACT         ;WAIT UNTIL MONITOR BUFFER EMPTY\r
+       IORB IOS,DEVIOS(DDB)\r
+       PUSHJ PDP,WSYNC\r
+       POP PDP,TAC                     ;RESTORE CHARSIN TAC\r
+       POP PDP,DAT                     ;RESTORE BYTE POINTER TO TAC\r
+       JRST DDT3                       ;TRY AGAIN\r
+\r
+DDTUTT:        PUSHJ   PDP,TTYFNU              ;RESTORE DAT,LINE\r
+       JRST    UTYPET                  ;AND START OUTPUT\r
+\f;MORE CHARACTER AND BUFFER HANDLING ROUTINES\r
+\r
+;OUTCHR CALLED AT UUO LEVEL TO OUTPUT A CHARACTER\r
+;DAT AND DDB MUST BE SET UP\r
+;CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED\r
+;RIGHT THINGS ARE DONES WITH PHPOS & HPOS(NEEDNT BE SET)\r
+;CALL  MOVE    CHREC,CHAR TO BE OUTPUT\r
+;      PUSHJ   PDP,OUTCHR\r
+;      ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER\r
+\r
+INTERNAL OUTCHS\r
+\r
+OUTCHR:        TLNE    IOS,IOSUPR      ;I/O OFF BY ^O?\r
+       POPJ    PDP,            ;YES. RETURN\r
+       MOVEI   HPOS,20         ;CHECK FREE SPACE\r
+       CAML    HPOS,TOFCTR(DDB)        ; FOR EXPANDING CHARS\r
+       JRST    GETCH1          ;NOT ENOUGH ROOM\r
+OUTCHS:        PUSH    PDP,TAC\r
+       PUSH    PDP,HPOS\r
+       PUSH    PDP,TAC1        ;SAVE LINE\r
+       PUSHJ   PDP,STLNAC      ;GET LINE DATA\r
+       ANDI    CHREC,177       ;MASK ANYT JUNK\r
+       LDB     HPOS,PHPOS      ;GET HORIZONTAL POSITION\r
+       PUSHJ   PDP,ADJHP               ;NEW HPOS AFTER CHAR OUTPUT\r
+       JFCL\r
+       TLNE    LINE,DISLIN+PTYLIN      ;IS IT A DISPLAY OR PTY?\r
+       JRST    OUTCH2          ;YES, IGNORE HPOS AND FILLERS\r
+       CAIL    HPOS,^D72       ;DID IT GO OVER LINE?\r
+       PUSHJ   PDP,CRLFEC      ;YES, OUTPUT CRLF\r
+       TLNE    TAC,SPOUT       ;VT,FF,HT?\r
+       JUMPGE  LINE,OUTCH1     ;YES, HANDLE THEM UNLESS PTY\r
+OUTCH2:        PUSHJ   PDP,PUTCHO      ;PLACE IN BUFFER\r
+OUTCH3:        DPB     HPOS,PHPOS      ;UPDATE IN CORE\r
+       POP     PDP,TAC1        ;RESTORE LINE\r
+       POP     PDP,HPOS\r
+       JRST    TPOPJ\r
+\f;HERE ON UUO OUTPUT OF HT,FF,VT\r
+\r
+OUTCH1:        PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       TLNE    LINE,T35        ;SMART TTY?\r
+       JRST    OUTC1A          ;YES\r
+       MOVE    TAC,CHREC       ;COPY THE CHARACTER\r
+       MOVEI   CHREC,40        ;STUPID TTY.\r
+       LDB     HPOS,PHPOS      ;GET OLD POSITION\r
+       CAIE    TAC,11          ;H TAB?\r
+       MOVEI   CHREC,12        ;NO. OUTPUT LF'S.\r
+OUTC1C:        CAIN    TAC,14          ;FF?\r
+       MOVNI   HPOS,10         ;YES. 8 LF'S\r
+       CAIN    TAC,13          ;VT?\r
+       MOVNI   HPOS,4          ;YES. 4 LF'S\r
+OUTC1B:        PUSHJ   PDP,PUTCH0      ;OUTPUT THE PHONEY CHAR\r
+       ADDI    HPOS,1          ;COUNT THE OUTPUTS\r
+       TRNE    HPOS,7          ;ENOUGH?\r
+       JRST    OUTC1B          ;NO. MORE.\r
+       JRST    OUTCH3          ;NO MORE.\r
+\r
+OUTC1A:        ;HERE ON OUTPUT OF SLOW CHARS TO SMART TTY\r
+       PUSHJ   PDP,PUTCH0      ;SENT THE REAL CHAR\r
+       MOVE    TAC,CHREC       ;COPY THE CHARACTER\r
+       MOVEI   CHREC,IOLECH    ;A DELAY CHARACTER\r
+       SUBI    HPOS,2          ;TWO SHLUFF CHARACTERS\r
+       JRST    OUTC1C          ;GO OUTPUT THE SLUFFS.\r
+                               ;COUNT WILL BE MODIFIED ON VT,FF\r
+\r
+                       ;CALLED AT UUO AND INT LEVEL\r
+                       ;TO ADJUST HPOS FOR OUTPUT OF CHREC\r
+                       ;SKIPS IF SPCHECK SAYS SPECIAL CHAR\r
+\r
+ADJHP: CAIL    CHREC,174       ;HIGH SPECIALS?\r
+       JRST    SPCHEK          ;YES, NO HPOS MOTION\r
+       CAIL    CHREC,40        ;CONTROL CHARACTERS?\r
+       AOJA    HPOS,SPCHEK     ;NO. COUNT HPOS FOR PRINT CHAR\r
+       CAIN    CHREC,10        ;BACKSP?\r
+       SOJL    HPOS,.+2        ;YES\r
+       CAIN    CHREC,15        ;CARRIAGE RETURN?\r
+       MOVEI   HPOS,0          ;YES.\r
+       CAIE    CHREC,11        ;TAB?\r
+       JRST    SPCHEK          ;NO. NO HP MOD\r
+       TRO     HPOS,7          ;TAB. TO NEXT 8\r
+       AOJA    HPOS,SPCHEK\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL SCNDDB,TTYLST,TTIBUF,TIPUTR,TITAKR,TITCTR,TIFCTR,TISYNC\r
+EXTERNAL TTOBUF,TOPUTR,TOPCTR,TOTAKR,TTYCHR,SCNDDS,CCHAR,LINSAV\r
+EXTERNAL TOTCTR,TOFCTR\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\f;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES\r
+;THERE IS ONE DEVICE DATA BLOCK FOR EACH JOB THAT CAN BE INITIALIZED\r
+;UNDER TIME-SHARING, WHETHER THIS JOB IS ATTACHED TO A PHYSICAL LINE\r
+;NUMBER OR NOT, THEREFORE THERE SHOULD BE ONE DDB FOR EVERY LINE NUMBER\r
+;PLUS ONE FOR EVERY PSEUDO-TELETYPE PLUS ONE FOR EVERY ADDITIONAL JOB\r
+;THAT AN INSTALATION MAY WISH TO RUN DETACHED FROM A PHYSICAL LINE\r
+;PLUS ONE DDB TO PRINT ERROR MESSAGES WHEN ALL JOBS (DDB'S ARE\r
+;INITIALIZED.\r
+;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE\r
+;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATION 11\r
+;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE\r
+;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS\r
+;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB\r
+;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF.\r
+;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME, IF DYNAMIC\r
+;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN\r
+;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X"\r
+;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED.\r
+\r
+;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF:\r
+;INPUT---POINTED TO BY TTIBUF\r
+;      ALL CHARACTERS TYPED GO INTO THIS BUFFER, IN ADDITION, ALL\r
+;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON\r
+;(APRSER) ARE STORED HERE,\r
+;OUTPUT BUFFER---POINTED TO BY TTOBUF\r
+;      ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS\r
+;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF\r
+;CHARACTER STRINGS.\r
+\r
+;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER\r
+;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX), THE LAST\r
+;FOUR CHARACTERS IUN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD\r
+;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE\r
+;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE\r
+;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR\r
+;ALL BUFFERES. IN THE MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO\r
+;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE\r
+;DEFINED TO BE 0-10(OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED\r
+;BUFFER PARAMETER WORD REGARDLESS OF BUFFER.\r
+\f;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS:\r
+;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT\r
+;      HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER, THIS WORD IS\r
+;      ONLY READ BY THE CURRENT CODE.  UPON THE ADDITION OF DYNAMIC\r
+;      BUFFER ALLOCATION. THIS WORD WOULD BE LOADED IN THE SAME FORMAT\r
+;      AT THE TIME THAT THE BUFFER WOULD BE BUILT.\r
+;\r
+;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO\r
+;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH\r
+;OR TTXBUF\r
+;\r
+;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE\r
+;      BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER.\r
+;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED\r
+;      BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER\r
+;      (NOT THE AMMOUNT OF FREE SPACE LEFT)\r
+;TX'TAKR OR TAKR(DAT)---BYTE POIUNTER USED BY ALL ROUTINES TO PICK UP\r
+;      CHARACTERS FRM THE BFFER. WHEN THE TAKR IS EQUAL TO THE PUTR.\r
+;      THE BUFFER IS "EMPTY".\r
+;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN\r
+;      BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER.\r
+;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE\r
+;      PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON"\r
+;      THE TAKR, WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS\r
+;      MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT)\r
+;TISYNC---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED\r
+;      INTO INPUT BUFFER.\r
+\f;SCANNER DEVICE DATA BLOCK\r
+;REMAINING SCN DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME.\r
+\r
+INTERNAL SCNDDB,LINSAV\r
+       TTYLST=.        ;FIRST TTT DDB\r
+       ZZ=.\r
+SCNDDB:        SIXBIT  /TTY0/          ;DEVNAME\r
+       XWD     0,STTYBF+1              ;DEVCHR\r
+       Z                       ;DEVIOS\r
+       EXP     SCNDSP          ;DEVSER\r
+       XWD     DVTTY+DVIN+DVOUT,3      ;DEVMOD\r
+       Z                               ;DEVLOG\r
+       Z               ;DEVBUF\r
+       XWD     PROG,0          ;DEVIAD, PHPOS BITS 6-12\r
+       XWD     PROG,0          ;DEVOAD, PFITCH BITS 0-8\r
+       XP      TTYPTR,.-ZZ             ;TTYPTR\r
+       Z                       ;PLASTC,PLSTLC,PCOMIC,POSAVCH,TOIP\r
+       XP      TISYNC,.-ZZ\r
+       Z\r
+       XP      TTIBUF,.-ZZ\r
+       XWD     STTYBF*5,0      ;RH IS BUFFER ADR\r
+       XP      TIPUTR,.-ZZ\r
+       Z\r
+       XP      TIPCTR,.-ZZ\r
+       Z\r
+       XP      TITAKR,.-ZZ\r
+       Z\r
+       XP      TITCTR,.-ZZ\r
+       Z\r
+       XP      TIFCTR,.-ZZ\r
+       Z\r
+\f      XP      SYSPDL,.\r
+;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING\r
+;INITIALIZATION AND RESTARTING\r
+\r
+       XP      TIBF,.-ZZ\r
+       REPEAT STTYBF,< 0>\r
+       XP      TTOBUF,.-ZZ\r
+       XWD     STTYBF*5,0\r
+       XP      TOPUTR,.-ZZ\r
+       Z\r
+       XP      TOPCTR,.-ZZ\r
+       Z\r
+       XP      TOTAKR,.-ZZ\r
+       Z\r
+       XP      TOTCTR,.-ZZ\r
+       Z\r
+       XP      TOFCTR,.-ZZ\r
+       Z\r
+\f      XP      TOBF,.-ZZ\r
+       REPEAT STTYBF,<0>\r
+;NO. OF CHAR. IN MON. BUF.\r
+\r
+       XP      TTYCHR,<<STTYBF>*5>\r
+       XP      SCNDDS,.-ZZ     ;SIZE OF SCN DDB\r
+\r
+LINSAV:        0\r
+>      ;CLOSE IFE FTMONP WAY BACK\r
+\f;DEVICE DEPENDENT PART OF IO UUOS.\r
+\r
+\r
+;DISPATCH TABLE\r
+\r
+INTERNAL       SCNDSP\r
+EXTERNAL OUT,SCNON,SCNOFF\r
+\r
+       JRST    TTYINI          ;INITIALIZATION\r
+       JRST    CPOPJ1          ;TTY HUNG TIME-OUT, IGNORE\r
+SCNDSP:        JRST    TTYREL          ;RELEASE\r
+       JRST    OUT             ;CLOSE\r
+       JRST    TTYOUT          ;OUTPUT\r
+\r
+TTYIN: MOVE    IOS,[XWD TTYIOW,IOACT]  ;INDICATE INPUT WAIT\r
+       IORB    IOS,DEVIOS(DDB)\r
+       MOVSI   IOS,DDTM+TPMON\r
+       ANDCAB  IOS,DEVIOS(DDB)\r
+       PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+IFN FTHDPX,<\r
+       TLNE    LINE,HLFDPX\r
+       TLNN    IOS,IO\r
+>\r
+TTYIN1:        SKIPG   TISYNC(DDB)\r
+       PUSHJ   PDP,TWSYNC\r
+       PUSHJ   PDP,MONUSR\r
+TENDIN:        MOVE    IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTP+IGNOR+IOACT]\r
+T0POPJ:        ANDCAB  IOS,DEVIOS(DDB)\r
+       POPJ    PDP,\r
+\f;ROUTINE TO MOVE A LINE OR STRING FROM TTY INPUT BUFFER TO USER'S INPUT BUFFER\r
+;CALLED ONLY FROM UUO LEVEL,FROM INPUT UUO ONLY\r
+\r
+EXTERNAL ADVBFF,STTIOD,BUFCLR\r
+\r
+MONUSR:        HRRZ    TAC,DEVIAD(DDB)         ;ADDRESS OF BUFFER IN USER AREA\r
+       PUSHJ   PDP,BUFCLR              ;CLEAR WHOLE BUFFER\r
+       JRST    ADRERR                  ;ADDRESS CHECK RETURN\r
+       PUSHJ   PDP,STLNAC      ;SETUP LINE\r
+       MOVEI   AC2,TTYCHR              ;MAX NR OF CHARACTERS\r
+       MOVEI   AC1,@DEVIAD(DDB)        ;ADDRESS OF USR BUFFER-1\r
+       ADD     AC1,[XWD 10700,1]       ;MAKE BYTE POINTER POINT RIGHT\r
+       MOVEI   DAT,TTIBUF(DDB)         ;SPECIFY USER MODE INPUT BUFFER\r
+\r
+MONUS1:        PUSHJ   PDP,GETCHR              ;GET A CHAR, FROM IT\r
+       JUMPE   CHREC,MONUS3            ;ZERO IMPLIES EMPTY BFR\r
+       IDPB    CHREC,AC1               ;PLACE CHAR. IN USER BUFFER\r
+       PUSHJ   PDP,SPCHEK              ;SPECIAL CHARACTER?\r
+       JRST    MONUS2                  ;NO\r
+\r
+       TLNE    TAC,FCSBRK+BREAKP       ;A BREAK CHARACTER?\r
+       SOSA    TISYNC(DDB)             ;SOME BREAK, COUNT IT DOWN\r
+MONUS2:        SOJG    AC2,MONUS1              ;NO, USER BUFFER FULL?\r
+       CAIN    CHREC,3                 ;STORED CONTROL C?\r
+       JRST    MONUS7                  ;YES, HANDLE IT\r
+       MOVEI   IOS,0\r
+       CAIN    CHREC,"Z"-100           ;^Z READ?\r
+       MOVSI   IOS,IOEND\r
+       IORB    IOS,DEVIOS(DDB)\r
+\r
+MONUS3:        MOVEI   AC2,@DEVIAD(DDB)        ;BREAK CHAR OR COUNTED OUT, INPUT UUO DONE\r
+       SUBI    AC1,1(AC2)              ;CALCULATE NUMBER OF WORDS\r
+       HRRM    AC1,1(AC2)              ;STORE IN 3RD BUFFER WORD\r
+\r
+MONUS4:        PUSHJ   PDP,ADVBFF              ;INPUT UUO DONE,NEXT BUFFER FULL?\r
+       JRST    MONUS5                  ;YES, INPUT REALLY IS DONE\r
+       SKIPLE  TISYNC(DDB)             ;NO, DO WE HAVE MORE LINES FOR IT?\r
+       JRST    MONUS8                  ;YES, GIVE USER NEXT LINE, TOO\r
+\r
+MONUS5:        MOVSI   IOS,IOFST\r
+       IORB    IOS,DEVIOS(DDB)\r
+       TLZE    IOS,IOW                 ;TTY IN INPUT WAIT?\r
+       PUSHJ   PDP,STTIOD              ;YES., TAKE IT OUT OF IT\r
+       POPJ    PDP,0\r
+\fMONUS6:       PUSHJ   PDP,CNCMOD              ;CONTROL C MODE\r
+       MOVSI   TAC,70000               ;DECREMENT TAKR POINTER\r
+       ADDM    TAC,TITAKR(DDB)         ;SO NEXT ILDB WILL GET ^C\r
+       AOS     TITCTR(DDB)             ;ADJUST COUNTER\r
+       SOS     TIFCTR(DDB)             ;ADJUST FREE CHAR. COUNT\r
+       AOS     TISYNC(DDB)     ;SEE THE ^C AGAIN\r
+       PUSHJ   PDP,COMSET              ;WAKE UP COMMAND DECODER\r
+       JRST    WSYNC                   ;AND WAIT FOR INTERPRETATION\r
+\r
+MONUS7:        MOVE    IOS,[XWD TTYIOW,IOACT]\r
+       IORB    IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT\r
+       PUSHJ   PDP,MONU6\r
+       JRST    TTYIN   ;RESTART INPUT UUO\r
+\r
+MONUS8:        TLNN    IOS,IOEND       ;ROOM FOR ANOTHER BUFFER, ^Z SEEN?\r
+       JRST    MONUSR          ;NO, GO PASS ANOTHER LINE\r
+       POPJ    PDP,            ;YES, LET UUOCON HANDLE EOF\r
+\f;OUTPUT UUO\r
+\r
+EXTERNAL PTYPE,ADVBFE\r
+\r
+TTYOUT:        MOVSI   IOS,IOBEG\r
+       TDNE    IOS,DEVIOS(DDB)\r
+       TLO     IOS,IOSUPR              ;KILL ^O ON FIRST OUTPUT\r
+       IOR     IOS,[XWD TPMON+DDTM,ECHOF+MERTPO+IGNOR+IOACT]\r
+       ANDCAM  IOS,DEVIOS(DDB)\r
+       MOVSI   IOS,IO+IOFST\r
+       IORB    IOS,DEVIOS(DDB)\r
+\r
+       PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       PUSH    PDP,LINE                ;SAVE INFO\r
+       PUSHJ   PDP,USRMON      ;MOVE USER'S BUFFER TO TTO BUFFER\r
+       PUSHJ   PDP,ADVBFE              ;ADVANCE USER'S HEADERS\r
+       SKIPA\r
+       JRST .+3                        ;MOVE BUFFERS AVAILABLE\r
+\r
+       MOVEI   IOS,IOACT               ;NO MORE BUFFERS\r
+       ANDCAB  IOS,DEVIOS(DDB)         ;CLEAR ACTIVE IN IOS\r
+       POP     PDP,LINE                ;RESTORE LINE INFO\r
+UTYPET:        JUMPL   LINE,PTYPE      ;START PTY EXCHANGE IF PTY LINE\r
+       MOVSI   TAC,TOIP\r
+       CONO PI,PIOFF   ;PREVENT TIMING GLITCH\r
+       TDNN    TAC,TTYPTR(DDB)         ;IS TYPE-OUT ALREADY ON?\r
+       JRST    UTYPE1\r
+       CONO    PI,PION\r
+       POPJ    PDP,0\r
+\r
+UTYP1: IORM    TAC,TTYPTR(DDB)         ;START TYPEOUT\r
+       JRST    XMTIN1\r
+\f;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER\r
+;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO\r
+\r
+EXTERN UADRCK\r
+\r
+USRMON:        MOVEI   AC2,@DEVOAD(DDB)        ;ADDRESS OF 2ND BUFFER WORD\r
+       MOVE    AC2,1(AC2)              ;NUMBER OF WORDS TO OUTPUT\r
+       IMULI   AC2,5                   ;NR OF CHARACTERS\r
+\r
+USRMN1:        HRRZ    AC1,DEVOAD(DDB)         ;ADDRESS OF BUFFER\r
+       PUSHJ   PDP,UADRCK              ;MAKE SURE IT IS OK\r
+       ADD     AC1,[XWD 10700+PROG,1]  ;MAKE POINTER RELOCATABLE\r
+\r
+USRMN2:        ILDB    CHREC,AC1               ;PICK UP CHARACTER\r
+USRMN4:        JUMPE   CHREC,USRMN5            ;IF NULL, IGNORE\r
+       PUSHJ   PDP,OUTCHR              ;PLACE IN OUTPUT BUFFER\r
+       JUMPE   CHREC,USRMN3            ;IF NO MORE ROOM IN MON. BUFFER\r
+\r
+USRMN5:        SOJG    AC2,USRMN2              ;LOOP AS LONG AS THERE ARE CHAR'S,\r
+       POPJ    PDP,                    ;DONE\r
+\r
+USRMN3:        PUSH    PDP,AC2                 ;NUMBER OF CHARACTERS TO GO\r
+       PUSH    PDP,AC1                 ;SAVE RELOCATABLE POINTER\r
+       MOVE    LINE,-3(PDP)            ;GET SAVED LINE CHAR WORD\r
+       PUSHJ   PDP,TTOUWS              ;WAIT FOR ID\r
+       POP     PDP,AC1                 ;RESTORE POINTER\r
+       POP     PDP,AC2                 ;RESTORE COUNT\r
+       MOVE    IOS,DEVIOS(DDB)         ;RESTORE IOS\r
+       LDB     CHREC,AC1               ;GET LAST CHARACTER\r
+       JRST    USRMN4                  ;RETURN TO OUT LOOP\r
+\r
+TTOUWS:        MOVE    IOS,[XWD IO,IOACT]      ;SET DEVICE ACTIVE (TTY)\r
+       IORB    IOS,DEVIOS(DDB)\r
+       PUSHJ   PDP,UTYPET              ;START TYPING IF NEEDED\r
+       JRST    WSYNC                   ;WAIT TILL ROOM IN BUFFER\r
+\f;TTCALL - QUANTITY IN AC FIELD DETERMINES ACTION OF UUO (051)\r
+\r
+INTERNAL TTYUUO\r
+EXTERN UADCK1\r
+\r
+TTYUUO:        PUSHJ   PDP,TTYFNU\r
+       CAIL    UCHN,TTUUOL             ;TOO HIGH AC FIELD?\r
+       POPJ    PDP,                    ;YES, NO-OP\r
+       CAIE    UCHN,1          ;A READ OPERATION?\r
+       CAIN    UCHN,3          ;I.E., PURE?\r
+       JRST    @TTUUOT(UCHN)   ;YES. DONT ADR CHECK\r
+       HRRZ    AC1,UUO\r
+       PUSHJ   PDP,UADCK1\r
+       JRST    @TTUUOT(UCHN)           ;DISPATCH TO UUO ROUTINES\r
+\r
+TTUUOT:        EXP     INCHRW                  ;(0)INPUT CHAR. WAIT TILL TYPED\r
+       EXP     ONEOUT                  ;(1)OUTPUT A CHARACTER\r
+       EXP     INCHRS                  ;(2)INPUT A CHAR. & SKIP\r
+\r
+       EXP     OUTSTR                  ;(3)OUTPUT A STRING\r
+       EXP     INCHWL                  ;(4)INPUT CHAR, WAIT.LINE MODE\r
+       EXP     INCHSL                  ;(5)INPUT CHAR, SKIP. LINE MODE\r
+       EXP     GETLIN                  ;(6)GET LINE CHARACTERISTICS WORD\r
+       EXP     SETLIN                  ;(7)SET BITS IN LH LINTAB\r
+       EXP     TRESOU                  ;(10)BACK UP POINTER TO COMMAND\r
+       EXP     SETBFI                  ;(11)CLEAR INPUT BUFFER\r
+       EXP     SETBF2                  ;(12)CLEAR OUTPUT BUFFER\r
+       EXP     SKPINC                  ;(13)SKIP IF CHAR TO INPUT\r
+       EXP     SKPINL                  ;(14)SKIP IF LINE TO INPUT\r
+\r
+TTUUOL=.-TTUUOT\r
+\f;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP\r
+\r
+INCHSL:        SKIPG   TISYNC(DDB)     ;ANY LINES IN BUFFER?\r
+       POPJ    PDP,0           ;NO, RETURN\r
+INCHRS:        MOVEI   DAT,TTIBUF(DDB)         ;GET A CHARACTER\r
+       PUSHJ   PDP,GETCHR              ;FROM TTI BUFFER\r
+       JUMPE   CHREC,CPOPJ             ;RETURN IF NULL(EMPTY BUFFER)\r
+       PUSHJ   PDP,SPCHEK\r
+       JFCL\r
+       TLNE    TAC,FCSBRK+BREAKB\r
+       SOS     TISYNC(DDB)     ;KEEP BREAK COUNT RIGHT\r
+       PUSHJ   PDP,TENDIN              ;CLEAR UP IOACT, IOSUPR, ETC\r
+       CAIN    CHREC,3\r
+       JRST    MONUS6          ;STORED ^C\r
+       MOVEM   CHREC,@UUO              ;MOVE INTO LOC, SPECIFIED BY UUO\r
+       JRST    CPOPJ1                  ;AND SKIP RETURN\r
+\r
+;INPUT CHARACTER AND WAIT, LINE MODE\r
+\r
+INCHWL:        PUSHJ   PDP,INCHSL              ;SEE IF ANY CHARS.\r
+       JRST    .+2     ;NO\r
+       POPJ    PDP,0           ;YES. GIVE IT TO USER\r
+       MOVE    IOS,[XWD TTYIOW,IOACT]  ;NONE, WAIT FOR IT\r
+       IORM    IOS,DEVIOS(DDB)         ;TTY TO IOW STATE\r
+       MOVSI   IOS,DDTM        ;JUST IN CASE\r
+       ANDCAB  IOS,DEVIOS(DDB) ;CLEAR DDTMODE BREAK FLAG\r
+       PUSHJ   PDP,TWSYNC      ;WAIT FOR CHAR\r
+       JRST    INCHWL  ;AND TRY AGAIN\r
+\r
+;OUTPUT A STRING\r
+\r
+OUTSTR:        JRST    DDT5                    ;JUST USE DDT OUTPUT CODE\r
+\r
+SKPINL:        SKIPLE  TISYNC(DDB)             ;INPUT BUFFER HAVE A LINE?\r
+       AOS     0(PDP)                  ;YES, SKIP.\r
+       POPJ    PDP,0                   ;RETURN\r
+\r
+SKPINC:        HLRZ    TAC,TTIBUF(DDB) ;SIZE OF IN BUFFER\r
+       CAMLE   TAC,TIFCTR(DDB)         ;SIZE > # FREE CHARS?\r
+       AOS     0(PDP)                  ;YES. SKIP.\r
+       POPJ    PDP,0                   ;RETURN.\r
+\f;MORE ROUTINES CALLED BY TTY UUO DISPATCHER\r
+\r
+EXTERNAL TTPLEN,GETWDU\r
+\r
+;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS\r
+\r
+INCHRW:        PUSHJ   PDP,INCHRS              ;GET ACHAR IF ONE IS THERE\r
+       JRST    .+2                     ;NONE THERE\r
+       POPJ    PDP,                    ;CHAR, PICKED UP AND STORED\r
+       MOVE    IOS,[XWD TTYIOW+ODTM,IOACT][    ;SETUP FOR IOWAIT\r
+       IORB    IOS,DEVIOS(DDB)         ;SPECIFICALLY FOR INPUT WAIT\r
+       PUSHJ   PDP,TWSYNC              ;WAIT FOR CHAR. TO BE TYPED\r
+       JRST    INCHRW                  ;GO GET IT\r
+\r
+;ONEOUT OUTPUTS ONE CHARACTER\r
+\r
+ONEOUT:        PUSHJ   PDP,GETWDU              ;PICK UP CHAR FROM USER\r
+       MOVE    CHREC,TAC               ;PUT IT IN PROPER AC\r
+       ANDI    CHREC,177       ;MASK ANY JUNK\r
+\r
+       JUMPE   CHREC,CPOPJ     ;DONT STORE NULLS\r
+       PUSHJ   PDP,OUTCHR              ;PLACE IT IN TTO BUFFER\r
+       JUMPN   CHREC,DDTUTT    ;IF IT STORED, RETURN\r
+       PUSHJ   PDP,TTOUWS      ;BUFFER WAS FULL. TRY AGAIN LATER\r
+       JRST    ONEOUT\r
+\r
+;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD\r
+\r
+GETLIN:        SKIPGE  TAC,@UUO                ;DOES USER WANT ONE LINE CHAR. WD.?\r
+       JRST    GETLN1                  ;YES\r
+       MOVEI   LINE,0                  ;NO, CHECK SIZE OF NUMBER\r
+       CAIL    TAC,TTPLEN              ;TOO HIGH?\r
+       JRST    GETLN1                  ;YES, GIVE HIM THE 0.\r
+       MOVE    LINE,LINTAB(LINE)       ;OK, GET THE ENTRY\r
+       HRRZ    DEVDAT,TTYTAB(TAC)      ;GET DEVDAT ON REQUESTED LINE\r
+                                       ; NOTE - NO LONGER ON JOB'S TTY\r
+       LDB     TAC,PJOBN               ;GET JOB NUMBER OF REQUESTED TTY\r
+       JUMPE   TAC,GETLN1              ;IF NONE, NO LINES.\r
+       SKIPLE  TISYNC(DEVDAT)          ;ANY TYPE-IN?\r
+       TLO     LINE,LINRDY             ;YES. FLAG.\r
+GETLN1:        MOVE    LINE,@UUO               ;GIVE IT TO USER\r
+       POPJ    PDP,\r
+\r
+;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE\r
+\r
+SETLIN:        MOVSI   TAC,LGLSET              ;MAKE MASK OF ALL OF THEM\r
+       ANDCAM  TAC,LINTAB(LINE)\r
+       AND     TAC,@UUO                ;SET ONLY THOSE BITS USER WANTS SET\r
+       IORM    TAC,LINTAB(LINE)        ;SET RESULTANT\r
+       POPJ    PDP,\r
+\f;ROUTINE TO ATTACH TTY TO A JOB\r
+;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK\r
+;      MOVE ITEM,JOB NUMBER\r
+;      PUSHJ PDP,TTYATT\r
+;      ERROR   ;DEVDAT=DDB ADR OF OTHER TTY\r
+               ;IF ANOTHER ALREADY IS ATTACHED.\r
+;      OK RETURN       ;DEVDAT, DAT AND TRANSLATOR TABLE SET\r
+\r
+;CALLED FROM COMCON (ATTACH) AND COMCSS (JOBINI)\r
+;ON OK RETURN  1)SETS TTYATC\r
+;              3)PUTS ADDRESS OF ATTACHED DDB INTO DEVDAT.\r
+;              4)SETS PHYSICAL NAME TO SIXBIT /TTY LINE #/\r
+;                OR SIXBIT /CTY/,\r
+;              5)SETS DEVOPR IF IT IS NON-ZERO.\r
+\r
+INTERNAL TTYATT,TTYATI\r
+EXTERNAL PUNIT,PJOBN,TTYTAB\r
+\r
+TTYATI:\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+TTYATT:        PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       MOVEI   DEVDAT,TTYLST   ;SEARCH FOR DDB THAT IS ATTACHED\r
+       SKIPA\r
+TTYAT2:        HLRZ DEVDAT,DEVSER(DEVDAT)\r
+       JUMPE DEVDAT,TTYAT4     ;HAVE ALL TTY DDB'S BEEN LOOKED AT?\r
+       LDB TAC,PJOBN           ;NO, GET JOB NUMBER.\r
+       HLL TAC,DEVMOD(DEVDAT)  ;ATTACH AND USE BITS\r
+       TLNN TAC,DVTTY          ;IS THIS STILL A TTY DDB?\r
+       JRST TTYAT4             ;NO. THIS MUST BE IJOB.\r
+       MOVE IOS,DEVIOS(DDB)\r
+       CAIN ITEM,(TAC)         ;JOB NUMBER THE ONE TO ATTACH?\r
+       TLNN TAC,TTYATC         ;YES, IS DDB ATTACHED TO JOB?\r
+       JRST TTYAT2             ;NO, KEEP LOOKING,\r
+       TLNE IOS,TTYDTC         ;IS DDB DETACHED FROM LINE?\r
+       JRST TTYAT5             ;YES, OK TO ATTACH TTY OF REQUESETER TO JOB\r
+       MOVE TAC,-3(PDP)        ;NO. GET TTY DEVDAT OF JOB DOING ATTACH COM.\r
+                               ; AS PUSHED BY COMMAND DECODER\r
+       SKIPE TAC,DEVNAM(TAC)   ;PHYSICAL NAME OF REQUESTOR TTY\r
+       CAME TAC,DEVOPR         ; CHECK IF OPR IS REQUESTOR\r
+       POPJ PDP,               ;NO, ERROR RETURN, CAN'T ATTACH\r
+       PUSH PDP,LINE           ;YES, SAVE LINE CHARACTERISTICS\r
+       LDB LINE,PUNIT  ;GET LINE NO. OF TTY BEING GRABBED\r
+       HRRZ TAC,(PDP)          ;OPERATOR'S LINE NUMBER?\r
+       CAME LINE,TAC           ;IS OPERATOR TRYING TO GRAB HIMSELF?\r
+                               ; IF YES, DO NOT DETACH HIM\r
+       PUSHJ PDP,TTYDET        ;DETACH TTY OF JOB BEING GRABBED BY OPR\r
+       POP PDP,LINE            ;RESTORE LINE CHARACTERISTICS\r
+TTYAT5:        PUSH PDP,DEVDAT         ;SAVE NEW DDB ADDRESS.\r
+\f      MOVE DEVDAT,TTYTAB(LINE)\r
+       PUSHJ PDP,TTYDET        ;DETACH DDB FROM TTY\r
+       POP PDP,DEVDAT\r
+TTYAT3:        DPB ITEM,TPCJOBN        ;STORE ATTACHED JOB NO.\r
+       DPB ITEM,PJOBN          ;SET JOB NUMBER\r
+       MOVSI   IOS,TTYDTC      ;INDICATE DDB NO LONGER DET. FROM LINE\r
+       ANDCAB  IOS,DEVIOS(DDB)\r
+       MOVSI TAC,TTYATC        ;SET ATTACHED BIT\r
+       JRST SCNIN              ;SO INITIALIZE DDB\r
+\r
+TTYAT4:        MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS.\r
+       JRST TTYAT3\r
+>\r
+IFE FTATTACH,<\r
+TTYATT:        LDB LINE,PUNIT          ;LINE NO. OF THIS TTY\r
+       DPB ITEM,TPCJOBN\r
+       DPB ITEM.PJOBN\r
+       MOVSI TAC,TTYATC\r
+       JRST SCNIN>\r
+\f;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMAND\r
+;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGES\r
+;AC TAC TO BYTE POINTER TO COMMAND STRING\r
+;AC ITEM TO JOB NUMBER TTY IS ATACHED TO\r
+;CALL: PUSHJ PDP,TTYCOM\r
+;      NONE FOUND\r
+;      AC'S SETUP\r
+;CALLED FROM COMMAND\r
+\r
+INTERNAL TTYCOM,TTYCM\r
+EXTERNAL MTTYLN,TTYTAB,CPOPJ\r
+\r
+TTYCOM:        SKIPL   LINE,LINSAV\r
+       MOVSI LINE,MTTYLN\r
+       SKIPL   TAC,TTYTAB(LINE)\r
+TTYCM1:        AOBJN LINE,.-1\r
+       MOVEM LINE,LINSAV\r
+       JUMPG LINE,CPOPJ\r
+       HRRZ DEVDAT,TTYTAB(LINE)\r
+       JUMPE   DDB,TTYCM2      ;THIS SHOULDNT HAPPEN, BUT...\r
+       MOVEI   DAT,TTIBUF(DDB) ;SO GETCHR CAN BE CALLED FROM COMCON\r
+       MOVE    LINE,TITCTR(DDB)\r
+       DPB     LINE,PCOMIC     ;SAVE COMMAND INPUT COUNTER\r
+       LDB LINE,PUNIT          ;LINE NO.\r
+       LDB ITEM,PJOBN          ;JOB NO. TTY ATTACHED TO\r
+       TLNN    TAC,200000      ;IS THIS A DELAYED COMMAND?\r
+       JRST CPOPJ1             ;NO, RETURN TO SCAN IT\r
+       MOVSI   TAC,200000      ;INDICATED NO LONGER DELAYED COMMAND\r
+       ANDCAM  TAC,TTYTAB(LINE)\r
+       JRST    CPOPJ1          ;RETURN TO COMMAND SCAN\r
+\r
+TTYCM: MOVSI   DDB,200000      ;INDICATE DELAYED COMMAND\r
+       IORB    DDB,TTYTAB(LINE)\r
+       PUSHJ   PDP,TRESCN      ;BACK UP TO START OF COMMAND\r
+       MOVE    LINE,LINSAV     ;TRESCN HAS CALLED STLNAC\r
+       JRST    TTYCM1          ;LOOK FOR OTHER COMMAND TP PROCESS\r
+\r
+TTYCM2:        MOVSI   DDB,600000      ;CLEAR COMMAND BITS IN TTYTAB\r
+       ANDCAM  DDB,TTYTAB(LINE)\r
+       JRST    TTYCOM          ;GO TRY AGAIN\r
+\fINTERNAL FTATTACH\r
+\r
+IFN FTATTACH,<\r
+;ROUTINE TO DETACH TTY FROM JOB\r
+;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED\r
+;      PUSHJ PDP,TTYDET\r
+\r
+;CALLED FROM TTYATT AND COMCON (DETACH)\r
+;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY.\r
+;SETS TTYDTC IN DEVIOS(DDB)\r
+\r
+\r
+INTERNAL TTYDET\r
+EXTERNAL PUNIT,TTYTAB\r
+\r
+TTYDET:        MOVSI   TAC,TTYATC\r
+       TDNN    TAC,DEVMOND(DDB)        ;IS THIS DDB WORTH KEEPING?\r
+       JRST    TTYDT1          ;NO. GO JUNK IT\r
+\r
+       MOVSI   IOS,TTYDTC      ;YES. MARK IT DETACHED\r
+       IORM    IOS,DEVIOS(DDB)\r
+       JRST    TTYKL1          ;GO CLEAR TTYTAB AND DEVNAM\r
+\r
+TTYDT1:        MOVSI   IOS,TTYDTC+IO   ;CLEAR SOME BITS TO FORCE KILL\r
+       ANDCAM  IOS,DEVIOS(DDB)\r
+       MOVSI   IOS,TOIP        ;ALSO TYPEOUT IN PROGRESS\r
+       ANDCAM  IOS,TTYPTR(DDB)\r
+       JRST    TTYKIL          ;TTYKIL WILL NOW KILL DDB\r
+>\r
+\r
+INTERN TRESCN\r
+\r
+TRESCN:        LDB     TAC,PCOMIC      ;GET OLD TITCTR\r
+       MOVEM   TAC,TITCTR(DDB) ;RESTORE IT\r
+       PUSHJ   PDP,TBYTEP\r
+       MOVEM   TAC,TITAKR(DDB)\r
+TRESC1:        MOVE    TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE\r
+       CONO    PI,PIOFF\r
+       SUB     TAC,TITCTR(DDB)\r
+       SKIPG   TAC\r
+       ADDI    TAC,TTYCHR\r
+       MOVEM   TAC,TIFCTR(DDB)\r
+       CONO    PI,PION\r
+       JRST    STLNAC\r
+\r
+TRESCU:        PUSHJ   PDP,TRESCN\r
+       SETZM   TISYNC(DDB)\r
+       MOVEI   DAT,TTIBUF(DDB)\r
+TRESCL:        PUSHJ   PDP,GETCHR\r
+       JUMPE   CHREC,TRESCN\r
+       PUSHJ   PDP,SPCHEK\r
+       JRST    TRESCL\r
+       TLNE    TAC,FCSBRK+BREAKB\r
+       AOS     TISYNC(DDB)\r
+       JRST    TRESCL\r
+\fTLHBYT:       XWD     350700,0\r
+       XWD     260700,0\r
+       XWD     170700,0\r
+       XWD     100700,0\r
+       XWD     010700,0\r
+\r
+TBYTEP:        PUSH    PDP,TAC1                ;SAVE LINE\r
+       MOVNS   TAC\r
+       SKIPGE  TAC\r
+       ADDI    TAC,TTYCHR\r
+       IDIVI   TAC,5\r
+       ADD     TAC,TTIBUF(DDB)\r
+       HLL     TAC,TLWBYT(TAC1)\r
+       POP     PDP,TAC1                ;RESTORE LINE\r
+       POPJ    PDP,0\r
+\f;ROUTINE TO FIND TTY FOR A JOB\r
+;CALL: MOVE ITEM,JOB NUMBER\r
+;      PUSHJ PDP, TTYFND\r
+;      RETURN WITH DEVDAT SET TO ADR OFF DDB\r
+;      AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER\r
+\r
+INTERNAL TTYFNU,TTYFND,TTYERP\r
+EXTERNAL JOB\r
+\r
+\r
+TTYFNU:        MOVE ITEM,JOB\r
+TTYFND:        PUSHJ PDP,TTYSRC\r
+TTYDAT:        MOVEI   DAT,TTOBUF(DDB)\r
+       POPJ PDP,\r
+\r
+;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY\r
+;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL\r
+\r
+INTERNAL TTYFUW\r
+EXTERNAL WSYNC\r
+\r
+TTYFUW:        PUSHJ PDP,TTYFNU\r
+       MOVE    TAC,TOPUTR(DDB)\r
+       TLNN    LINE,PTYLIN\r
+       CAMN    TAC,TOTAKR(DDB)\r
+       POPJ PDP,\r
+       MOVEI IOS,IOACT         ;YES\r
+       IORB IOS,DEVIOS(DDB)\r
+       JRST WSYNC\r
+\r
+;ROUTINE TO INDICATE MONITOR ERROR MESSAGE TO BE FORCED OUT\r
+;WHEN NO MORE ROOM IN TTO BUFFER, TTI BUFFER WILL BE USED\r
+\r
+TTYERP:        PUSHJ   PDP,TTYSRC              ;FIND TTY DDB\r
+       MOVEI   IOS,MERTPO              ;SET MONITOR ERROR PRINT OUT BIT\r
+       IORB    IOS,DEVIOS(DDB)\r
+       JRST    SETBFI                  ;CLEAR TTI BUFFER\r
+\fTTYREL:       MOVEI   IOS,777777-IOACT        ;CLEAR INITED STUFF IN IOS\r
+       MOVSI TAC,TTYATC\r
+       TDNE    TAC,DEVMOD(DDB)\r
+       JRST    T0POPJ                  ;GO CLEAR OUT IOS BITS\r
+\r
+;ROUTINE TO SET SCNSER TO RETURN TTY TO VIRGIN STATE\r
+;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,TTYKIL\r
+\r
+;CALLED FROM COMCSS (JOBKIL).\r
+;IF NOT OPERATOR CONSOL, THEN\r
+;      1)CLEAR PHYSICAL AND LOGICAL NAMES,\r
+;      2)CLEAR JOB NUMBER ASSIGNMENT\r
+;      3)CLEAR TTYUSE,TTYATC,ASSCON,ASSPRG,\r
+;      4)CLEAR ENTRY IN TRANSLATOR TABLE.\r
+\r
+\r
+\r
+INTERNAL TTYKIL\r
+EXTERNAL PJOBN,PTMNMD\r
+\r
+\r
+TTYKIL:        MOVSI   IOS,TTYIOW+IOW+TTYDTC+SYNC+DDTM+USRB\r
+                                       ;CLEAR TTY INPUT AND OUTPUT\r
+       ANDCAM  IOS,DEVIOS(DDB)         ;WAIT BITS SO TTY WILL BE KILLED\r
+                                       ;PROPERLY AT INTER, LEVEL IS STILL OUTPUTING\r
+                               ; ALSO CLEAR DDT MODE AND SYNC FOR\r
+                               ; NEXT USER OF THE DDB\r
+       MOVSI   IOS,TPMON               ;CLEAR JOB NUMBER\r
+       DPB     IOS,PJOBN\r
+       IORB    IOS,DEVIOS(DDB)         ;TURN TPMON ON IN CASE TTY IS\r
+                                       ;STILL OUTPUTTING\r
+       PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       TLNE    LINE,PTYLIN\r
+       PUSHJ   PDP,PTMNMD              ;YES, PUT PTY INTO MONITOR MODE\r
+       SKIPL   TTYPTR(DDB)     ;CHECK TOIP\r
+       TLNE    IOS,IO          ;IS IT OUTPUTTING OR TALKING?\r
+       POPJ    PDP,                    ;YES, DDB WILL BE KILLED AT\r
+                                       ;INTERRUPT LEVEL\r
+       HLLZS   DEVIOS(DDB)     ;CLEAR INITTED STUFF IN IOS\r
+       TLZ     LINE,KILMSK     ;CLEAR BITS IN LINE TABLE\r
+       TLNE    LINE,DSDTLN     ;DATAPHONE?\r
+       TLZ     LINE,LGLSET     ;INITIALIZE OTHER MODES\r
+       HLLM    LINE,LINTAB(LINE)\r
+       SETZB TAC,DEVLOG(DEVDAT)        ;CLEAR LOGICAL NAME\r
+       MOVE TAC,[XWD TTYUSR+TTYATC,ASSCON+ASSPRG]\r
+       ANDCAM TAC,DEVMOD(DEVDAT)       ;CLEAR ATTACH,USE, AND ASSIGN BITS\r
+TTYKL1:        LDB LINE,PUNIT                  ;LINE NO.\r
+       SETZM TTYTAB(LINE)              ;CLEAR TRANSLATOR TABLE\r
+       SETZM   DEVNAM(DDB)\r
+       POPJ    PDP,0\r
+\f;ROUTINE TO SET TTY INTO USER MODE NOW.\r
+;CALL: MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,TTYSET\r
+\r
+;CALLED FROM RUNCSS (START1)\r
+;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW\r
+\r
+\r
+INTERNAL TTYSET\r
+\r
+TTYSET:        MOVSI   IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW\r
+       JRST    T0POPJ  ;GO CLEAR BITS\r
+\fINTERN        STLNAC\r
+\r
+EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR\r
+\r
+;ROUTINE TO SEARCH TRANSLATOR TABLE FOR TTY\r
+;CALL: MOVE ITEM,JOB NUMBER\r
+;      PUSHJ PDP,TTYSRC\r
+;      RETURN WITH ADDRESS OF DEVICE DATA BLOCK IN DEVDAT.\r
+\r
+\r
+TTYSRC:        JUMPE ITEM,TTYF1        ;SEARCH FOR OPER. TTY IF JOB NO. 0\r
+       MOVSI LINE,MTTYLN       ;NUMBER OF TTY DDBS\r
+TTYSRA:        HRRZ DEVDAT,TTYTAB(LINE)\r
+       JUMPE DEVDAT,TTYF0\r
+       LDB TAC,TPCJOBN\r
+       CAIN TAC,(ITEM)\r
+       JRST    TTYF9           ;FOUND\r
+TTYF0: AOBJN LINE,TTYSRA\r
+TTYF1: MOVSI TAC,576062        ;LOOK FOR DEVICE "OPR"\r
+\r
+       PUSHJ PDP,DEVPHY        ;SEARCH PHYSICAL DEVICE NAMES FOR OPR\r
+       SKIPA TAC,DEVOPR        ;NOT FOUND.\r
+       JRST    TTYF9\r
+       JUMPN TAC,TTYF3         ;WAS OPR SPECIFIED IN ONCE ONLY CODE?\r
+       MOVEI DDR,TTYLST        ;NO\r
+       SKIPE DEVNAM(DDB)       ;HAS A TTY BEEN TYPED ON?\r
+       JRST    TTYF9\r
+       MOVEI LINE,TCONLN       ;NO USE CTY.\r
+       HRRZ    DDB,TTYTAB(LINE)        ;DOES IT HAVE A DDB?\r
+       JUMPN   DDB,TTYF9               ;YES. USE IT.\r
+       MOVSI TAC,(SIXBIT /CTY/)        ;NO\r
+TTYF3: PUSHJ PDP,GETDDB        ;GET A DDB FOR DEVOPR\r
+       JSP     DAT,ERROR       ;SHOULD NEVER HAPPEN\r
+TTYF9: MOVE    IOS,DEVIOS(DDB) ;SET UP IOS\r
+STLNAC:        LDB     LINE,PUNIT      ;GET UNIT # FROM DDB\r
+       HLL     LINE,LINTAB(LINE)       ;AND LINE BITS\r
+       POPJ    PDP,0           ;RETURN\r
+\f;ROUTINE TO START TTY OUTPUT AFTER CLEARING USRB\r
+\r
+EXTERNAL PTMNMD,PTMNMZ\r
+\r
+INTERNAL TTYSTC,TTYTCM\r
+\r
+TTYTCM:\r
+TTYSTC:        MOVSI TAC,USRB          ;CLEAR BIT IN MEMORY\r
+       ANDCAM TAC,DEVIOS(DDB)\r
+       PUSHJ   PDP,STLNAC\r
+       TLNE    LINE,PTYLIN\r
+       PUSHJ   PDP,PTMNMD\r
+\r
+;ROUTINE TO START TTY OUTPUT\r
+;CALL: MOVE DAT,BYTE POINTER TO LAST OUTPUT ITEM\r
+;      MOVE DEVDAT,ADDRESS OF TTY DDB\r
+;      MOVE ITEM,JOB NUMBER    ;(MUST BE PRESERVED)\r
+;      PUSHJ PDP,TTYSTR\r
+\r
+;CALLED FROM COMINI\r
+;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT\r
+\r
+INTERNAL TTYSTR\r
+EXTERNAL CLRBYT\r
+\r
+TTYSTR:        MOVE IOS,[XWD DDTM+IOSUPR+IOBEG+IO+TPMON,IODTER+IOBKTL+IGNOR+IOACT]\r
+       ANDCAB IOS,DEVIOS(DDB)\r
+       PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
+       JUMPGE  LINE,TTSTR1     ;IF NOT PTY, JUMP\r
+       TLNE    IOS,USRB\r
+       PUSHJ   PDP,PTMNMZ\r
+TTSTR1:        MOVSI   TAC,IO+TPMON\r
+       TLNE    IOS,USRB        ;GOING OUT OF MONITOR MODE?\r
+       TLZ     TAC,TPMON       ;YES\r
+       IORM    TAC,DEVIOS(DDB)\r
+       MOVSI   TAC,USRB+TPMON\r
+       TLNE    IOS,USRB\r
+       ANDCAM  TAC,DEVIOS(DDB)\r
+       MOVE    IOS,DEVIOS(DDB) ;GET CORRECT IOS\r
+       SKIPLE  TISYNC(DDB)     ;HAS USER TYPED AHEAD?\r
+       PUSHJ   PDP,COMSET      ;YES, WAKE UP COMMAND DECODER(IF IN MON. MODE)\r
+       JRST    UTYRET          ;GO TYPE FIRST CHAR.\r
+\f;ROUTINE TO ADD TTY TO TALK RING\r
+;CALL: ADR. OF DDB TO BE ADDED TO RING AT -3(PDP)\r
+;      MOVE TAC,SIXBIT /TTYN/\r
+;      PUSHJ PDP,TTYTLK\r
+;      TTY IS BUSY RETURN OR NOT A TTY OR TOO BIT A LINE NO.\r
+;      OLK RETURN, TTY ADDED TO TALK RING\r
+\r
+INTERNAL FTTALK\r
+IFN FTTALK,<\r
+INTERNAL TTYTLK\r
+EXTERNAL PUNIT,CPOPJ1\r
+\r
+TTYTLK:        PUSHJ   PDP,GETDDB      ;IN CASE NOT SET UP\r
+       POPJ    PDP,0           ;NONE AVAIL. GIVE UP\r
+       MOVE TAC,DEVMOD(DEVDAT)\r
+       TLNN TAC,DVTTY\r
+       POPJ PDP,\r
+       MOVE IOS,DEVIOS(DEVDAT) ;IS TTY IN MONITOR MODE AND LEFT HAND MARGIN?\r
+       MOVE    TAC1,-3(PDP)    ;TTY GIVING TALK COMMAND\r
+\r
+       MOVE    TAC1,DEVNAM(TAC1)       ;ITS NAME\r
+       MOVE    TAC,DEVNAM(DEVDAT)      ;OPR IS NEVER TOO BUSY...\r
+       CAME    TAC1,DEVOPR     ;EITHER ONE OPR?\r
+       CAMN    TAC,DEVOPR\r
+       JRST    TTYTK1\r
+       TLNE IOS,TPMON\r
+       TLNN IOS,IOFST\r
+       POPJ PDP,               ;NO, HE IS BUSY.\r
+TTYTK1:        CONO    PI,SCNOFF\r
+       LDB LINE,PUNIT          ;LINE NUMBER IS RING.\r
+       MOVSI   TAC,TLKRNG\r
+       LDB     CHREC,PTALK\r
+       TDDN    TAC,LINTAB(LINE)\r
+       HRRZ    CHREC,LINE\r
+       IORM    TAC,LINTAB(LINE)\r
+       EXCH DDB,-3(PDP)        ;GET DDB OF TALKER\r
+       LDB LINE,PUNIT          ;LINE NO. OF TALKER\r
+       DPB     CHREC,PTALK             ;SET POINTER INTO RING\r
+       HRLI    LINE,TLKRNG\r
+       IORB    LINE,LINTAB(LINE)\r
+       MOVEM LINE,TAC          ;SAVE LINE NO. OF TALKER\r
+       EXCH DDB,-3(PDP)        ;RESTORE\r
+       LDB LINE,PUNIT          ;LINE NO. IN RING AGAIN\r
+       DPB TAC,PTALK           ;MADE IT POINT TO TALKER\r
+       CONO    PI,SCNON\r
+       JRST CPOPJ1             ;OK RETURN\r
+>\r
+\f;ROUTINES TO SET SCANNER TO START UP JOB WHEN OUTPUT FINISHES\r
+;CALL: MOVE DEVDAT,TTYDDB ADR.\r
+;      PUSHJ PDP,TTYUSR\r
+;      TTY WILL GO TO USER MODE WHEN TYPING OUT STOPS\r
+\r
+EXTERNAL SETRUN\r
+\r
+INTERNAL TTYUSR\r
+\r
+TTYUSR:        MOVSI IOS,USRB          ;SET BIT TO SWITCH TTY TO USER MODE\r
+       IORM IOS,DEVIOS(DDB)    ;WHEN MONITOR OUTPUT FINISHES\r
+       JRST SETRUN             ;GO FLAG JOB AS RUNABLE IMMEDIATELY\r
+\f;CTY INTERRUPT SERVICE ROUTINE\r
+\r
+INTERNAL CTYINT\r
+EXTERNAL SCNSAV,SCNCHN,TCONLN\r
+\r
+CTYINI:        CONSO TTY,50            ;TTI OR TTO FLAG?\r
+       JRST CTYINT                     ;NO\r
+       JSR     SCNSAV                  ;YES, SAVE AC'S\r
+       MOVEI   LINE,TCONLN             ;LOAD LINE WITH PROPER\r
+       CONSO TTY,40            ;YES. TTI FLAG?\r
+       JRST CTYOU1             ;NO.\r
+       DATAI TTY,CHREC\r
+       JRST    RECINT          ;RECEIVER INTERRUPT HANDLER\r
+\r
+CTYOU1:        MOVEI CHREC,SCNCHN\r
+       CONO TTY,200(CHREC)     ;CLEAR TTO FLAG.\r
+       JRST    XMTINT          ;COMMON TRANSMIT INTERRUPT HANDLER\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION\r
+\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB\r
+\f;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES\r
+\r
+INTERNAL RECINT,INUS2,INJEST\r
+\r
+EXTERNAL COMCNT\r
+\r
+RECINT:\r
+INUS2: ;TAG FOR INTERRUPT SERVICE\r
+INJEXT:        ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT\r
+\r
+       TRNN    CHREC,177       ;IGNORE NULLS\r
+       POPJ    PDP,0           ;DISMISS INTERRUPT\r
+       HLL     LINE,LINTAB(LINE)       ;GET LINE CHARACTERISTICS\r
+       HRRZ    DDB,TTYTAB(LINE)        ;IS THERE A DDB FOR THIS LINE?\r
+       JUMPN   DDB,RECIN1              ;YES. GO NO\r
+       PUSHJ   PDP,DDBSRC              ;NO, FIND ONE\r
+       JRST    TYPX\r
+\r
+RECIN1:        TLNE    LINE,HLFDPX             ;HALF DUPLEX LINE?\r
+       JRST    RECHDX                  ;GO SEE WHETHER INPUT OR OUTPUT\r
+RECIN8:                                ;RETURN FROM RECHDX\r
+\r
+IFN FTTALK,<   TLNE    LINE,TLKRNG     ;IN A TALK RING?\r
+               JRST    DOTALK          ;YES, GO TALK\r
+>\r
+       MOVE    IOS,DEVIOS(DDB)         ;SET UP IOS\r
+RECIN2:        ANDI    CHREC,177               ;7-BIT ASCII ONLY\r
+       CAIN    CHREC,3                 ;CONTROL C?\r
+       PUSHJ   PDP,CNCTST              ;YES, SEE IF 2ND CONTROL C\r
+       LDB     HPOS,PHPOS              ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR.\r
+       MOVEI   DAT,TTIBUF(DDB)         ;USER MODE INPUT BUFFER\r
+       PUSHJ   PDP,TTEDIT              ;GO EDIT (AND ECHO) CHARACTER\r
+       DPB     HPOS,PHPOS              ;STORE HORIZONTAL POSITION\r
+       HLLM    LINE,LINTAB(LINE)       ;UPDATE LINE TABLE\r
+       MOVE    TAC,TIFCTR(DDB)         ;FRE SPACES LEFT?\r
+       CAIG    TAC,12          ;ONLY 10 LEFT?\r
+       JRST    RWARN           ;YES, GO OUTPUT XOFF\r
+       TLNN    IOS,SYNC+DDTM           ;WAS A BREAK CHARACTER TYPED?\r
+       JRST    TYPTST                  ;NO, GO SEE IF ECHO NEED BE TYPED\r
+\f      INTERN RECIN3           ;FOR PTYSRF\r
+RECIN3:        MOVE    TAC,TTYTAB(LINE)        ;IS IT IN COMMAND WAIT NOW?\r
+       TLNE    TAC,600000      ;..\r
+       JRST    RECIN4          ;YES. NOT AGAIN.\r
+       SKIPG   TISYNC(DDB)             ;HAS USER TYPED AHEAD?\r
+       PUSHJ   PDP,COMSET              ;NO, WAKE UP COMMAND DECORDER NOW\r
+RECIN4:        TLNE    IOS,SYNC\r
+       AOS     TISYNC(DDB)             ;BREAK CHARACTER (BUMP LINE COUNT)\r
+       MOVSI   IOS,SYNC                ;CLEAR SYNC IN CORE\r
+       ANDCAB  IOS,DEVIOS(DDB)         ; ..\r
+       MOVE    TAC,TIPCTR(DDB)         ;UPDATE COUNTER FOR ^U\r
+       DPB     TAC,PLSTLC\r
+       TLZN    IOS,TTYIOW              ;IN TELETYPE INPUT WAIT?\r
+       JRST    TTYTST                  ;NO, GO ECHO\r
+       PUSHJ   PDP,STTIOD              ;YES, SET IO DONE(OUT OF TTY IOW)\r
+       MOVSI   IOS,IOW+TTYIOW\r
+       ANDCAB  IOS,DEVIOS(DDB)         ;CLEAR WAIT BITS\r
+TYPTST:        MOVSI   TAC,TOIP                ;CHECK TOIP\r
+       CONO    PI,PIOFF\r
+       SKIPGE  TTYPTR(DDB)             ;TYPEOUT HAPPENING?\r
+       JRST    TYPT1\r
+       IORM    TAC,TTYPTR(DDB)         ;NO, BUT THERE IS NOW\r
+       CONO    PI,PION\r
+       PUSHJ   PDP,STLNAC              ;TAC1 CLOBBERED ABOVE BY STTIOD\r
+       JRST    XMTIN1                  ;START OUTPUT\r
+\r
+TYPT1: CONO    PI,PION\r
+       POPJ    PDP,\r
+\r
+RWARN: TLNE    LINE,HLFDPX+FULTWX      ;CAN LINE BE STOPPED?\r
+       JRST    RECIN3          ;NO. WAKE JOB AND CROSS FINGERS.\r
+       MOVEI   CHREC,23        ;YES. SEND AN XOFF.\r
+       PUSHJ   PDP,PUTCHO      ; ..\r
+       MOVEI   CHREC,IDLECH    ;AND AND IDLE FOR TTY TO THINK ON.\r
+       PUSHJ   PDP,PUTCHO      ;OUTPUT IT.\r
+       JRST    RECIN3          ;GO WAKE JOB.\r
+\fIFN FTHDPX,<\r
+\r
+;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS\r
+;CALLED ONLY AT RCV INTERRUPT LEVEL\r
+\r
+EXTERN CLOCK\r
+\r
+RECHDX:        MOVE IOS,DEVIOS(DDB)    ;SETUP IOS\r
+       TRNE    IOS,IGNOR       ;IN AN ECHO CHECK?\r
+       POPJ    PDP,            ;YES, IGNORE THIS\r
+       TRZE    IOS,ECHOF       \r
+       JRST    RECHD1\r
+       SKIPL   TTYPTR(DDB)             ;SHOULD THIS BE AN ECHO?\r
+       JRST    RECIN8          ;NO. ITS A RECEIVE CHARACTER\r
+       ANDI    CHREC,177       ;AN ECHO. CHECK IT\r
+       LDB     TAC,PLASTC      ;GET WHAT WAS SENT\r
+       CAMN    TAC,CHREC       ;SAME?\r
+       POPJ    PDP,0           ;YES, DISMISS INT.\r
+ECHO:  MOVSI   TAC,TOIP\r
+       ANDCAM  TAC,TTYPTR(DDB)         ;TURN OFF TOIP\r
+       TLZ     IOS,IO                  ;BAD CHARACTER, SHUT DOWN XMT.\r
+       TRO     IOS,ECHOF+IGNOR ;MARK FOR THE 1/2 SEC IGNORE.\r
+       MOVEI   TAC,(LINE)      ;SETUP CLOCK REQUEST\r
+       LSH     TAC,^D12\r
+       TRO     TAC,^D30        ;1/2 SECOND\r
+       HRLI    TAC,ENDECH      ;WHERE TO RESPOND TO\r
+       CONO    PI,PIOFF\r
+       IDPB    TAC,CLOCK       ;REQUEST FROM CLOCK\r
+       CONO    PI,PION\r
+       MOVEM   IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL\r
+       POPJ    PDP,            ;DISMISS INTERRUPT\r
+\r
+ENDECH:        MOVE    DDB,TTYTAB(TAC) ;HERE ON TIMEOUT OF ECHOCHECK\r
+       MOVEI   IOS,IGNOR       ;KILL IGNORE INT BIT\r
+       JRST    T0POPJ          ;CLEAR BIT IN IOS, RETURN TO CLK\r
+\r
+RECHD1:        ANDI    CHREC,177\r
+       CAIN    CHREC,3         ;^C DURING ECHO CHECK?\r
+       DPB     CHREC,TITAKR(DDB)       ;YES, MAKE IT LIKE 2 OF THEM\r
+       JRST    RECIN8          ;PROCESS AS INPUT\r
+>      ;END OF FTHDPX\r
+\f;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM\r
+\r
+TYPX:  ANDI    CHREC,177\r
+       CAIN    CHREC,"X"       ;CHAR, RECEIVED AN "X"\r
+       POPJ    PDP,            ;YES, MAY BE ECHO, DISMISS INT.\r
+       MOVEI   CHREC,"X"\r
+       JRST    TYPL            ;TYPE OUT "X"\r
+\r
+;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET\r
+\r
+COMSET:        TLNN    IOS,TPMON               ;MONITOR MODE?\r
+       POPJ    PDP,                    ;NO, NOT MONITOR COMMAND\r
+       MOVSI   IOS,IOFST\r
+       IORB    IOS,DEVIOS(DDB)\r
+       MOVSI   TAC,400000              ;SET SIGN BIT\r
+       IORM    TAC,TTYTAB(LINE)        ;IN TTY TRANSLATOR TABLE\r
+       AOS     COMCNT                  ;INDICATE ONE MORE COMMAND\r
+       POPJ    PDP,\r
+\fINTERNAL XMTINT,PTYGET\r
+\r
+XMTINT:        HLL     LINE,LINETAB(LINE)      ;GET LINE CHAR.\r
+       HRRZ    DDB,TTYTAB(LINE)        ;GET DDB ADDRESS\r
+       JUMPE   DDB,CPOPJ               ;IF NONE, X BEING TYPED\r
+       MOVE    IOS,DEVIOS(DDB)         ;GET IO STATUS\r
+       TLNN    LINE,HLFDPX             ;HALF DUPLEX LINE?\r
+       JRST    XMTIN1                  ;NO, REGULAR TRANSMIT INTERRUPT\r
+\r
+PTYGET:                                ;CALL HERE TO SKIP ABOVE OVERHEAD\r
+       SKIPL   TTYPTR(DDB)             ;WAS TYPE-OUT IN PROGRESS?\r
+       POPJ    PDP,                    ;IGNORE XMT DURING ECHO CK\r
+XMTIN1:        MOVEI   DAT,TTOBUF(DDB)         ;SPECIFY TTO BUFFER\r
+XMTI1A CONO    PI,PIOFF                ;KEEP TOIP AND PUTR/TAKR EQUAL\r
+       HLRZ    TAC,BUF(DAT)            ;IS OUTPUT BUFFER EMPTY?\r
+       CAMLE   TAC,FCTR(DAT)           ;I.E. FREE COUNT AT MAX?\r
+       JRST    XMTIN2                  ;NO, TYPING STILL IN PROGRESS\r
+\r
+       TRNE    IOS,MERTPO      ;MONITOR ERROR MESSAGE?\r
+       CAIE    DAT,TIOBUF(DDB) ;OUTPUT BUFFER?\r
+       JRST    XMTIN4          ;NO, MUST REALLY BE DONE\r
+       MOVEI   DAT,TTIBUF(DDB) ;YES. NOW EMPTY OUT TTI BUFFER\r
+       JRST    XMTI1A\r
+\f;HERE WHEN OUTPUT BUFFER(S) EMPTIED\r
+\r
+XMTIN4:        MOVEI   IOS,MERTPO\r
+       ANDCAB  IOS,DEVIOS(DDB)\r
+       MOVSI   CHREC,TOIP\r
+       ANDCAM  CHREC,TTYPTR(DDB)       ;CLEAR MERTPO AND TOIP\r
+       CONO    PI,PION\r
+       MOVEI   CHREC,0\r
+       LDB     HPOS,PJOBN              ;JOB NUMBER DDB IS ATTACHED TO\r
+       TLNN    IOS,IO\r
+       JRST    LINDON\r
+       MOVSI   IOS,IO\r
+       ANDCAB  IOS,DEVIOS(DDB)\r
+       TLNE    LINE,TLKRNG     ;OR TALKING?\r
+       JRST    LINDON                  ;YES\r
+       JUMPN   HPOS,LINDON             ;LINE DONE IF DDB IS A JOB\r
+                               ;OTHERWISE, DDB ONLY USED TO TYPE A\r
+       JRST    TTYKIL                  ;MESSAGE; KILL TTY DDB\r
+\r
+\r
+XMTIN2:        CONO    PI,PION\r
+       PUSHJ   PDP,GETCHR              ;NO, GET NEXT CHAR. IN BUFFER\r
+       JUMPE   CHREC,XMTIN1            ;IGNORE NULLS\r
+       JUMPL   IOS,TYPE                ;KEEP TYPING IF INPUT I/O WAIT\r
+       TRNN    IOS,IOACT               ;ARE WE IN I/O WAIT?\r
+       JRST    TYPE                    ;NOT IN IO WAIT\r
+       MOVEI   HPOS,TTYCHR-10          ;WAKE 8 CHARS BEFORE END\r
+       CAML    HPOS,FCTR(DAT)          ;IS THERE ROOM ENOUGH NOW?\r
+       JRST    TYPE                    ;NO, KEEP TYPING\r
+\r
+LINDON:        TLNE    IOS,IOW                 ;IN IO WAIT?\r
+       TLNE    IOS,TTYIOW              ;YES. TTY INPUT WAIT?\r
+       JRST    TYPE                    ;NO. GO TYPE CHAR.\r
+       PUSHJ   PDP,STTIOD              ;YES, SET IO DONE (OUT OF WSYNC)\r
+       PUSHJ   PDP,STLNAC              ;RESTORE TAC1\r
+       MOVE    IOS,[XWD IOW,IOACT]     ;INDICATE NO IO ACTIVE OR WAIT\r
+       ANDCAB  IOS,DEVIOS(DDB)\r
+\r
+TYPE:  JUMPE   CHREC,CPOPJ     ;IS TYPING STILL TO BE IN PROGRESS?\r
+       JRST    TYPL            ;YES.\r
+\f;TTY KEYBOARD EDITOR ROUTINE\r
+;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO\r
+;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING,\r
+;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER\r
+;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER\r
+;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION.\r
+;IN ANY CASE, ALL SPECIAL ACTION, INCLUDING DUPLEXING TAKES PLACE ON\r
+;THE LEVEL OF THIS ROUTINE.\r
+;      THIS ROUTINE CALLS SPCHEK, WHICH MAKES USE OF THE SPECIAL\r
+;CHARACTER TABLE, SPCTAB, TO MAKE ANY CHANGES IN THE ACTION GENERATED\r
+;BY SPECIFIC CHARACTERS MAKE THE ALTERATIONS REQUIRED BY THE\r
+;COMMENTS DESCRIBING SPCTAB. NOTE THAT IF A CHARACTER IS TO DISPATCH\r
+;TO A "SPECIAL ACTION ROUTINE" OR SPECIAL ECHO ROUTINE, THE LEFT\r
+;HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN\r
+;SET  AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE\r
+;ASSEMBLED INTO THE RIGHT HALF OF THE WORD.\r
+;CALL  HAVE 7-BIT ASCII CHARACTER IN CHREC\r
+;      LDB     HPOS,PHPOS\r
+;      MOVEI   DAT,TTIBUF(DDB)\r
+;      PUSHJ   PDPD,TTEDIT\r
+;      RETURN WITH ACTION DONE, SYNC (LH IOS) SET IF BREAK CHAR. STORED\r
+\r
+TTEDIT:        PUSHJ   PDP,ADJHP       ;ADJUST HP AND CHECK SPECIAL\r
+       JRST    TIPACK          ;NOT SPECIAL\r
+       MOVSI   IOS,0\r
+       TLNE    TAC,BBREAK+FCSBRK       ;BREAK CHAR?\r
+       TLO     IOS,SYNC        ;BREAK CHAR, SET SYNC\r
+       IORB    IOS,DEVIOS(DDB) ;SET SYNC\r
+       JUMPL   TAC,0(TAC)      ;DISPATCH IF SPACTN SET\r
+TIPACK:        CAIGE   CHREC,140       ;LOWER CASE LETTER?\r
+       JRST    TTIPUT          ;NO\r
+       TLNN    LINE,T37        ;YES. IS THIS TTY IN 37 MODE?\r
+       TRZ     CHREC,40        ;NO. MAKE CHAR UPPER CASE\r
+TTIPUT:        TLZE    LINE,ROBTPD     ;HAVE WE BEEN DELETING?\r
+       PUSHJ   PDP,BSECHO      ;YES. OUTPUT A BACKSLASH\r
+TTIPT1:        PUSHJ   PDP,PUTCHI      ;PUT CHAR IN INPUT BUFFER\r
+       JRST    INBFUL          ;IT DIDNT FIT\r
+       LTNN    TAC,ECHSUP      ;SHOULD THIS CHAR BE ECHOED?\r
+DUPLEX:        TLNE    LINE,FULTWX,HLFDPX      ;IS THIS LINE ECHOING ITSELF?\r
+       POPJ    PDP,0           ;JUST RETURN WITHOUT ECHO\r
+DUPLX1:        PUSH    PDP,TAC         ;SAVE TAC OVER PUTCHO\r
+       TLNN    IOS,TPMON       ;SHOULD ECHO IF IN MONITOR MODE\r
+       TRNN    IOS,NOECHO      ;AND UNLESS USER SAYS NO, IN USER MODE\r
+       PUSHJ   PDP,PUTCHO      ;SO ECHO IT.\r
+       JRST    TPOPJ           ;RESTORE TAC AND RETURN\r
+\r
+INTERNAL INBFUB                        ;FOR THE PTY\r
+\r
+INBFUL:        MOVSI   IOS,SYNC        ;DONT COUNT SYNC COUNT\r
+       ANDCAB  IOS,DEVIOS(DDB) ; SINCE CHAR NOT STORED\r
+       CAIN    CHREC,3 ;CHAR WONT FIT, WAS IT ^C?\r
+       JRST    CNCTS1          ;YES. PANIC OUT OF THIS BIND\r
+       MOVEI   CHREC,7         ;NO. JUST ECHO BELL TO SHOW LOSS\r
+       JRST    PUTCHO          ;OUTPUT BELL\r
+\f;CALLED WITH A JUMPL TAC,(TAC), WHERE TAC IS LOADED FROM SPCTAB\r
+;SPECIAL CHARACTER HANDLING ROUTINES\r
+\r
+CONTC: PUSHJ   PDP,DELETL      ;SINCE PEOPLE WANT FREE ^U\r
+       MOVE    TAC,SPCTAB+3    ;SINCE DELETL CLOBBERS TAC\r
+CONTZ: PUSHJ   PDP,CNTLEC      ;OUTPUT ^C OR ^Z\r
+       PUSHJ   PDP,CRLFEC      ;OUTPUT A CRLF\r
+       JRST    TTIPUT          ;AND STORE THE 003 OR 032\r
+\r
+CONTO: PUSHJ   PDP,SETBF2      ;CLEAR THE OUTPUT BUFFER\r
+       MOVSI   IOS,IOSUPR      ;SET TO JUNK FURTHER OUTPUT\r
+       IORB    IOS,DEVIOS(DDB)\r
+       JRST    CONTU1          ;ECHO, ETC.\r
+CONTU: TLNE    IOS,DDTM        ;IN DDTMODE,\r
+       JRST    TTIPUT          ; PASS THIS CHARACTER\r
+       TLZ     LINE,ROBTPD     ;NO MORE BACKSLASH\r
+       PUSHJ   PDP,DELETL      ;^U DELETES INPUT LINE\r
+CONTU1:        PUSHJ   PDP,CNTLEC      ;ECHO ^O OR ^U\r
+       JRST    CRLFEC          ;OUTPUT A CRLF AND RETURN WITHOUT\r
+                               ; STORING THE ^O OR ^Z\r
+\r
+ALTMOD:        HRRI    TAC,(CHREC)     ;SAVE WHICH KIND OF ALTMOD\r
+       MOVEI   CHREC,44        ;ECHO A $\r
+       TLNN    IOS,TPMON\r
+       TRNN    IOS,DLRSUP      ;400 IN IOS REMOVES ECHO OF $\r
+       PUSHJ   PDP,AOJDPX\r
+       MOVEI   CHREC,(TAC)     ;RESTORE THE CHARACTER\r
+       TRNN    IOS,FCS         ;UNLESS FCS MODE,\r
+       MOVEI   CHREC,175       ;TURN INTO OLD ALTMOD\r
+       JRST    TTIPUT          ;STORE THE CHARACTER\r
+\r
+CONTF: TLC     LINE,T35+T37    ;COMPLEMENT T37 ON ^F\r
+CONTP: TLCA    LINE,T35        ;COMPLEMENT T35 ON ^P\r
+CONTB: TLC     LINE,FULTWX     ;COMPLEMENT FULTWX ON ^B\r
+       POPJ    PDP,0           ;AND RETURN WITHOUT STORING THESE\r
+\r
+CONTQ: TLOA    LINE,XON        ;PAPER TAPE MODE\r
+CONTS: TLZ     LINE,XON        ;NOT PAPER TAPE\r
+       JRST    TTIPUT          ;DO STORE THESE FOR CUSP\r
+\fCONTH:        TLNE    LINE,T37        ;BACKSPACE\r
+       JRST    TTIPUT          ;JUST PASS TO PROG IF 37 TTY\r
+RUBOUT:        TLNN    LINE,XON\r
+       JRST    RUBOU3\r
+RUBOU4:        MOVSI   IOS,SYNC        ;IF PAPER TAPE, NO BREAK\r
+       JRST    T0POPJ          ;OR STORE, RETURN.\r
+RUBOU3:        TLNE    IOS,TPMON       ;IN MONITOR MODE, NOT A BREAK CHAR\r
+       JRST    RUBOU2\r
+       TDNE    IOS,[XWD DDTM,FCS]\r
+       JRST    TTIPT1          ;STORE RUBOUT IF DDT OR FCS\r
+RUBOU2:        PUSHJ   PDP,RUBOU4      ;NOT A BREAK AFTER ALL\r
+       LDB     CHREC,PUTR(DAT) ;GET LAST CHAR IN\r
+       PUSHJ   PDP,DCPUTR      ;BACK UP TIPUTR\r
+       JRST    RUBOU1          ;IT'S EMPTY ALREADY\r
+       TLON    LINE,ROBTPD     ;MARK IN RUBOUT SEQUENCE\r
+       PUSHJ   PDP,BSECHO      ;AND OUTPUT BACKSLASH IF FIRST\r
+AOJDPX:        AOJA    HPOS,DUPLX1     ;OUTPUT AND COUNT HPOS\r
+\r
+RUBOU1:        TLZE    LINE,ROBTPD     ;END OF INPUT STREAM REACHED\r
+       \r
+       PUSHJ   PDP,BSECHO      ;OUTPUT A BACKSLASH\r
+       JRST    CRLFEC          ;AND A CR LF\r
+\r
+CONTK: HRRI    TAC,4           ;HERE ON V TAB\r
+       SKIPA\r
+CONTL: HRRI    TAC,10          ;HERE ON FORMFEED\r
+       TLNN    LINE,T35                ;THIS TTY HAVE VERT MECHANICS?\r
+       JRST    SIMFF           ;NO, SIMULATE IT\r
+       PUSHJ   PDP,TTIPUT      ;PUT CHAR IN BUFFER AND ECHO IT\r
+CONTI1:        MOVEI   CHREC,IDLECH            ;SYNCHRONOUS IDLE CHARACTERS\r
+SIMFF1:        PUSHJ   PDP,DUPLX1      ;OUTPUT ECHO OF LF OR IDL\r
+       TRNE    TAC,17          ;DONE YET?\r
+       SOJA    TAC,.-2         ;NO. OUTPUT MORE\r
+       POPJ    PDP,0           ;DONE\r
+\fSIMFF:        TLO     TAC,ECHSUP      ;DON'T OUTPUT FF OR VT TO A 33\r
+       PUSHJ   PDP,TTIPUT      ;PUT IT IN BUFFER\r
+       MOVEI   CHREC,12        ;SIMULATE WITH LF'S\r
+       JRST    SIMFF1\r
+\r
+CONTI: TLNN    LINE,T35\r
+       TLO     TAC,ECHSUP      ;DONT OUTPUT TAB TO 33\r
+       PUSHJ   PDP,TTIPUT      ;PUT IN BUFFER AND MAYBE ECHO\r
+       TLEN    LINE,XON+DISLIN ;IF PAPER TAPE,DISMISS\r
+       POPJ    PDP,0           ; SO AS NOT TO OVERFILL OUTBUF\r
+                               ;ALSO, DISPLAY DOESNT WANT FILLER\r
+       HRRI    TAC,1           ;TWO IDLES\r
+       TLNE    LINE,T35\r
+       JRST    CONTI1          ;GO SEND SLUFFS\r
+\r
+CONTI2:        MOVEI   CHREC,40        ;SPACES FOR THE 33'S\r
+       LDB     HPOS,PHPOS      ;WHERE WAS I BEFORE TAB?\r
+       PUSHJ   PDP,AOJDPX      ;OUTPUT A SPACE\r
+       TRNE    HPOS,7          ;AT A TAB STOP?\r
+       JRST    .-2             ;NO. MORE SPACES.\r
+       POPJ    PDP,0           ;RETURN FROM TTEDIT\r
+\fCRLFEC:       MOVEI   HPOS,0  ;ECHO A CR LF, SAVING CHREC\r
+       PUSH    PDP,CHREC\r
+       MOVEI   CHREC,15        ;CARRIAGE RETURN\r
+       PUSHJ   PDP,DUPLX1      ;OUTPUT IT\r
+       MOVEI   CHREC,12        ;LINE FEED\r
+       PUSHJ   PDP,DUPLX1      ;OUTPUT THAT TOO\r
+CHPOPJ:        POP     PDP,CHREC       ;RESTORE CHREC\r
+       POPJ    PDP,0\r
+\r
+CNTLEC:        HRRI    TAC,100(CHREC)  ;SAVE UN-CNTL CHARACTER\r
+       MOVEI   CHREC,"^"\r
+       PUSHJ   PDP,AOJDPX\r
+       MOVEI   CHREC,(TAC)     ;TYPE ^ CHAR\r
+       PUSHJ   PDP,AOJDPX\r
+       TRZ     CHREC,100       ;RESTORE IT TO A CNTL CHAR\r
+       POPJ    PDP,0\r
+\r
+CRLF:  MOVEI   HPOS,0  ;HERE ON INPUT OF A CARRIAGE RETURN\r
+       TLNE    LINE,XON        ;IF PAPER TAPE, NO FREE LF\r
+\r
+       JRST    TTIPUT          ;JUST STORE THE CR\r
+       PUSHJ   PDP,TTIPUT      ;ORDINARILY, STORE AND GO ON HERE\r
+       MOVEI   CHREC,12        ;BY ADDING A LF\r
+       MOVSI   IOS,SYNC        ;WHICH IS A BREAK CHARACTER\r
+       IORB    IOS,DEVIOS(DDB)\r
+       TLNN    LINE,FULTWX+HLFDPX      ;IF NOT SELF ECHOING.\r
+       JRST    TTIPUT          ;THIS WILL GIVE LF ECHO\r
+       PUSHJ   PDP,TTIPUT      ;OTHERWISE, THIS WONT\r
+       JRST    DUPLX1          ;BUT THIS WILL\r
+\fINTERN FTLOGIN\r
+\r
+INTERN CNCTST\r
+\r
+CNCTST:\r
+IFN FTLOGIN,<  EXTERN  JBTSTS\r
+\r
+       LDB     TAC,PJOBN\r
+       MOVE    TAC,JBTSTS(TAC)\r
+       TLNE    TAC,JACCT\r
+       MOVEI   CHREC,175\r
+>\r
+       LDB     TAC,TIPUTR(DDB)\r
+       CAIE    TAC,3\r
+       POPJ    PDP,\r
+CNCTS1:        PUSHJ   PDP,TSETBF      ;STOP ALL I/O, BY CLEARING BUFFERS\r
+       MOVEI   DAT,TTIBUF(DDB)         ;GET POINTER BACK TO INPUT BFR\r
+       MOVE    TAC,SPCTAB+3            ;AND BITS FOR CONTROL C\r
+\r
+\r
+CNCMOD:        MOVE    IOS,[XWD DDTM+IO+IOSUPR+USRB,MERTPO+ECHOF+IGNOR]\r
+       ANDCAM  IOS,DEVIOS(DDB)\r
+       MOVSI   IOS,TPMON+IOFST\r
+       IORB    IOS,DEVIOS(DDB)\r
+       TLNE    LINE,PTYLIN             ;*\r
+       PUSHJ   PDP,PTMNMD              ;*\r
+       POPJ    PDP,\r
+\f;ROUTINE TO ECHO BACK-SLASH\r
+\r
+BSECHO:        PUSH    PDP,CHREC               ;*\r
+       MOVEI   CHREC,"\"\r
+       PUSHJ   PDP,AOJDPX\r
+       JRST    CHPOPJ\r
+\r
+;ROUTINE TO DECREMENT PUTR\r
+\r
+INTERN DCPUTR\r
+\r
+DCPUTR:        LDB     TAC,PLSTLC              ;CHECK FOR NONE TO DELETE\r
+       CAMN    TAC,PCTR(DAT)\r
+       POPJ    PDP,\r
+\r
+       MOVSI   TAC,70000\r
+       ADD     TAC,PUTR(DAT)           ;*\r
+       TLNE    TAC,400000\r
+       ADD     TAC,[XWD 347777,-1]\r
+\r
+       MOVEM   TAC,PUTR(DAT)\r
+       AOS     FCTR(DAT)\r
+       AOS     TAC,PCTR(DAT)\r
+       CAIG    TAC,TTYCHR              ;*\r
+       JRST    CPOPJ1                  ;*\r
+       SUBI    TAC,TTYCHR              ;*\r
+       MOVEM   TAC,PCTR(DAT)\r
+       MOVEI   TAC,STTYBF\r
+       ADDM    TAC,PUTR(DAT)           ;*\r
+       JRST    CPOPJ1\r
+\r
+;ROUTINE TO DELETE CURRENT LINE (^U)\r
+\r
+DELETL:        LDB     TAC,PLSTLC              ;WAS THERE LAST BREAK?\r
+       MOVEM   TAC,TIPCTR(DDB)         ;STORE COUNT\r
+       PUSHJ   PDP,TBYTEP              ;CONVERT TO A BYTE POINTER\r
+       MOVEM   TAC,TIPUTR(DDB)         ;SAVE POINTER\r
+       JRST    TRESC1                  ;GO COMPUTE TIFCTR\r
+\fIFN FTTALK,<\r
+EXTERNAL TPOPJ\r
+DOTALK:        ANDI    CHREC,177\r
+       HRRZ    DDB,TTYTAB(LINE)\r
+       JUMPE   DDB,CPOPJ       ;NO SUCH LINE\r
+       CAIN    CHREC,3\r
+       JRST    NOTALK\r
+       PUSH    PDP,LINE\r
+DOTAL1:        LDB     LINE,PTALK\r
+       HLL     LINE,LINTAB(LINE)\r
+       HRRZ    DDB,TTYTAB(LINE)\r
+       JUMPE   DDB,DOTAL2\r
+       PUSH    PDP,CHREC\r
+       CAMN    LINE,-1(PDP)\r
+       TLNN    LINE,FULTWX+HLFDPX\r
+       PUSHJ   PDP,PUTCHO\r
+       MOVE    IOS,DEVIOS(DEVDAT)\r
+       PUSHJ   PDP,TYPTST\r
+       POP     PDP,CHREC\r
+DOTAL2:        CAME    LINE,0(PDP)\r
+       JRST    DOTAL1\r
+       JRST    TPOPJ\r
+\r
+;IF I TYPE A ^C IN TALK RING, THEN\r
+;ASSUME NEXT_ME_PREV\r
+;SET NEXT_PREV\r
+;IF NEXT=PREV, CLEAR ITS TLKRNG BIT\r
+;SET ME_ME\r
+;CLEAR TLKRNG BIT IN LINTAB(ME)\r
+\r
+NOTALK:        MOVEI   HPOS,0(LINE)    ;ME\r
+       LDB     CHREC,PTALK     ;NEXT\r
+NOTAL1:        LDB     TAC,PTALK\r
+       CAMN TAC,HPOS   ;ME_?\r
+       JRST    NOTAL2          ;YES. LINE=PREV\r
+       MOVE    LINE,TAC        ;NO. FIND PREV\r
+       JRST    NOTAL1\r
+NOTAL2:        DPB     CHREC,PTALK     ;MAKE NEXT_PREV\r
+       CAIE    CHREC,(LINE)    ;RING NOW EMPTY?\r
+       JRST    NOTAL3  ;NO\r
+       MOVSI   CHREC,TLKRNG    ;YES, CLR HIS BIT\r
+       ANDCAM  CHREC,LINTAB(LINE)\r
+NOTAL3:        MOVSI   CHREC,TLKRNG\r
+       MOVE    LINE,HPOS       ;ME\r
+       DPB     HPOS,PTALK      ;ME_ME\r
+       ANDCAM  CHREC,LINTAB(LINE)      ;CLR MY BIT\r
+       MOVEI   CHREC,3         ;GET A ^C AGAIN\r
+       DPB     CHREC,TIPUTR(DDB)       ;LOOK LIKE 2 OF THEM\r
+       JRST    RECINT          ;AND PROCESS IT FROM THE TOP\r
+>\r
+\f;ROUTINE TO TYPE CHAR\r
+;CALL  MOVE LINE,LINE NO.\r
+;      MOVE CHREC,CHARACTER\r
+;      PUSHJ PDP,TYP\r
+\r
+INTERNAL TYPL\r
+EXTERNAL TCONLN,SCNTYP,PEVEN8\r
+\r
+TYP:\r
+TYPL:  TLNE    LINE,PTYLIN\r
+       POPJ PDP,               ;YES\r
+       PUSHJ   PDP,PEVEN8      ;GENERATE CORRECT PARITY\r
+       TLNE LINE,CTYLIN        ;NO,CONSOLE TTY?\r
+       JRST    SCNTYP                  ;TYPE CHAR.\r
+CTYP:  DATAO TTY,CHREC\r
+       DPB     CHREC,PLASTC\r
+       POPJ PDP,\r
+\f;ROUTINE TO SETUP DDB FOR OUTPUT\r
+;CALL  MOVE TAC,[SIXBIT /TTY#/\r
+;      PUSHJ PDP,GETDDB\r
+;      NONE AVAILABLE RETURN\r
+;      RETURN WITH LINE AND DDB SETUP\r
+\r
+EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1\r
+\r
+INTERNAL GETDDB\r
+\r
+GETDDB:        MOVEI LINE,TCONLN\r
+       CAMN TAC,[SIXBIT /CTY/] ;CTY?\r
+       JRST GETDB1             ;YES\r
+       HLLZ LINE,TAC           ;NO\r
+       CAME LINE,[SIXBIT /TTY/]        ;TTY PREFIX?\r
+       POPJ PDP,               ;NO\r
+       TLZ TAC,-1              ;YES\r
+       JUMPE TAC,CPOPJ         ;TTY?\r
+       ROTC TAC,30             ;NO\r
+       TRZE LINE,20            ;IS FIRST SUFFIX AN OCTA;L DIGIT?\r
+       TRNE LINE,70\r
+       POPJ PDP,               ;NO\r
+       ROT TAC,3               ;YES\r
+       TRC TAC,2               ;IS THERE A 2ND SUFFIX THAT IS AN\r
+       TRNN TAC,7              ;OCTAL DIGIT?\r
+       ROTC TAC,3              ;YES\r
+       CAIL    LINE,TCONLN     ;LEGAL LINE NUMBER?\r
+       POPJ    PDP,            ;NO\r
+GETDB1:        HRRZ    DDB,TTYTAB(LINE)        ;DOES THIS LINE HAVE A DDB?\r
+       JUMPN   DDB,CPOPJ1              ;JUMP IF SO.\r
+       PUSHJ PDP,DDBSRC        ;NO. SEARCH FOR FREE DDB\r
+       POPJ PDP,               ;NONE AVAILABLE\r
+       HLLZM IOS,DEVIOS(DDB)   ;INITIALIZE STATE\r
+       PUSH    PDP,DEVNAM(DDB)\r
+       MOVEI   TAC,ASSCON+ASSPRG\r
+       ANDCAM  TAC,DEVMOD(DDB)\r
+       JRST TPOPJ1\r
+\f;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK\r
+;CALL: MOVE LINE,TTY LINE NO.\r
+;      PUSHJ PDP,DDBSRC\r
+;      NONE FOUND OR LINE NO, TOO BIG\r
+;      RETURN DEVDAT,LINE AND DEVNAME SET AND BITS TPMON,IOFST,IOACT,\r
+;              TTYUSE,ASSCON SET.\r
+\r
+EXTERNAL TTPLEN,MLTTYL,CPOPJ\r
+INTERNAL DDBSRC\r
+\r
+DDBSRC:        HRRZ    TAC,LINE                ;NUMBER OF LINE ONLY\r
+       CAILE TAC,TTPLEN        ;IS LINE NO. TOO BIG\r
+       POPJ PDP,               ;YES.\r
+       MOVSI IOS,MLTTYL        ;NO. OF TTY DDBS\r
+       MOVEI DEVDAT,TTYLST     ;ADDRESS OF FIRST TTY DDB\r
+       SKIPA   TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON]\r
+       HLRZ DEVDAT,DEVSER(DEVDAT)      ;CHAIN THRU DDBS\r
+       TDNE TAC,DEVMOD(DEVDAT) ;USE,ATTACH OR ASSIGN BITS ON?\r
+       AOBJN IOS,.-2           ;YES. DONE?\r
+\r
+       JUMPGE IOS,CPOPJ        ;YES. DEVICE DATA BLOCK FOUND?\r
+       MOVSI   TAC,TOIP                ;CLEAR TOIP IN DDB\r
+       ANDCAM  TAC,TTYPTR(DDB)         ;IN CASE OF PREVIOUS DETACH\r
+       MOVSI   TAC,PROG\r
+       MOVEM   TAC,DEVIAD(DDB) ;CLEARS PHPOS\r
+       MOVEM   TAC,DEVOAD(DDB) ;CLEARS PFITCH\r
+       MOVE IOS,[XWD TPMON+IOFST,IOACT]\r
+       PUSH    PDP,DAT\r
+       PUSHJ   PDP,TSETBF              ;INITIALIZE BUFFERS\r
+       POP     PDP,DAT\r
+       MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK.\r
+\r
+;FALL INTO SCNIN\r
+\f;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO)\r
+;CALL: MOVE TAC,BITS IN DEVMOD TO BE TURNED ON\r
+;      MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,SCNIN\r
+;      SKIP RETURN ALWAYS\r
+\r
+;      CALLED BY JRST FROM TTYATT\r
+;      AND FALLS IN FROM DDBSRC ABOVE\r
+\r
+;SETS PHYSICAL NAME TO SIXBIT /TTY#/ OR SIXBIT /CTY/\r
+;      WHERE # IS THE LINE NUMBER.\r
+;STORES LINE NUMBER IN DEVICE DATA BLOCK\r
+\r
+EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1\r
+\r
+SCNIN: IORM TAC,DEVMOD(DEVDAT)\r
+       DPB LINE,PUNIT          ;SET LINE NO. IN DDB.\r
+\r
+INTERNAL FTTALK\r
+IFN FTTALK,<\r
+       DPB LINE,PTALK          ;SETUP TALK RING TO CONTAIN\r
+                               ;ONLY THIS TTY.\r
+>\r
+       MOVSI TAC,646471        ;SIXBIT /TTY/\r
+       MOVEM TAC,DEVNAM(DEVDAT)\r
+       MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17]\r
+       TRNN LINE,70            ;IS THERE A HIGH ORDER OCTAL DIGIT?\r
+       JRST SCNIN0             ;NO\r
+       ROT LINE,-3             ;YES, CONVERT TO SIXBIT.\r
+       ADDI LINE,20\r
+       IDPB LINE,TAC           ;STORE HIGH ORDER SIXBIT DIGIT\r
+       TRZ LINE,-1             ;LOW ORDER DIGIT IN LINE\r
+       ROT LINE,3\r
+SCNIN0:        ADDI LINE,20\r
+       IDPB LINE,TAC           ;STORE LOW ORDER DIGIT\r
+       PUSHJ   PDP,STLNAC\r
+       HRRM DEVDAT,TTYTAB(LINE)        ;SET DDB ADR. IN TRANSLATOR TABLE.\r
+       MOVSI TAC,436471        ;SIXBIT /CTY/\r
+       TLNE    LINE,CTYLIN     ;IS THIS CONSOLE TTY?\r
+       MOVEM TAC,DEVNAM(DEVDAT);YES, SET NAME TO CTY.\r
+       TLNE    LINE,PTYLIN             ;IS THIS A PTY?\r
+       PUSHJ   PDP,PTMNND              ;YES. SET IT INTO MONITOR MODE\r
+       JRST CPOPJ1             ;SUCCESSFUL RETURN.\r
+\fSCNEND:       END\r
+\f\r
diff --git a/src/uuocon.mac b/src/uuocon.mac
new file mode 100644 (file)
index 0000000..64be9e1
--- /dev/null
@@ -0,0 +1,2510 @@
+\r
+TITLE  UUOCON - UUO HANDLER AND UUO+IO ROUTINES - V434\r
+SUBTTL /RCC TS 03 JUN 69\r
+XP VUUOCN,434  ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+       ENTRY UUOCON    ;ALWAYS LOAD UUOCON(IF LIB SEARCH)\r
+UUOCON:\r
+\r
+;THIS ROUTINE COMBINES THE OLD SYSCON,SYSCSS, AND IOCONT ROUTINES\r
+;IT CONSISTS OF THE UUO TRAP HANDLER\r
+;THE CALL UUO ROUTINES AND THE IO UUO ROUTINES\r
+;SOME UUO DO DISPATCH TO OTHER ROUTINES OUTSIDE OF UUOCON\r
+,   ALL UUOS DROP THEMSELVES IN REAL LOCATION 40, AND TRAP\r
+, TO 41.  THE UUO HANDLER SHUFFLES THE UUO OFF TO THE USER'S\r
+, 40,41, IF IT IS NOT A SYSTEM UUO.\r
+;SYSTEM UUOS(40-77) FIRST SAVE THE USERS ACS IN RELATIVE LOC 0-17\r
+;THEN THE FOLLOWING ACS ARE LOADED UP BEFORE DISPATCHING:\r
+;      PDP     ;PUSHDOWN LIST IN CURRENT JOB DATA AREA\r
+;      PROG    ;CURRENT JOB RELOCATION IN RH,PROTECTION IN LH\r
+;      JDAT    ;ADDRESS OF CURRENT JOB DATA AREA\r
+;      UUO     ;THE CONTENTS OF LOC 40 WITH PROG IN INDEX FIELD\r
+;              ;SO THAT RELOCATION CAN BE DONE FOR PICKING UP ARGUMENTS\r
+               ; EXCEPT THAT ON A CALL OR CALLI UUO, THE ADDRESS IS\r
+               ; MODIFIED TO BE THE AC OF THE UUO,FOR\r
+               ; PICKING UP ARGUMENTS.\r
+;      DEVDAT  ;ADR. OF DEVICE DATA BLOCK\r
+;      IOS     ;DEVICE IO STATUS WORD\r
+;      DSER    ;ADR. OF DEVICE SERVICE ROUT. DISPATCH TABLE\r
+;      UCHN    ;THE USER IO CHANNEL(AC FIELD) OF UUO\r
+\r
+;RETURN IS PUSHED ON END OF PD LIST\r
+;THEN IF CALL WAS FROM USER MODE, THE UUO ROUTINE IS CALLED\r
+;WITH A PUSHJ, SO THAT ALL UUO ROUTINE RETURN WITH A POPJ PDP,\r
+;WHICH WILL RETURN CONTROL TO UUOCON WHICH WILL RESTORE USERS\r
+;ACS AND RETURN TO HIM\r
+;IF THE CALL IS FROM EXEC MODE, THE UUO ROUTINE IS CALLED\r
+;BY DOING JUST A JRST,  WHEN THE UUO ROUTINE RETURNS WITH\r
+;A POPJ, IT WILL RETURN TO THE EXEC WITHOUT RESTORING\r
+;ANY ACS\r
+, CONTROL MAY ALWAYS BE RETURNED BY EXECUTING A\r
+;      POPJ PDP,\r
+, WHICH WILL RESTORE THE ACS, APR BITS, AND RETURN.\r
+, THE UUO HANDLER IS PURE IF THE FOLLOWING RESTRICTIONS ARE OBSERVED.\r
+, RESTRICTIONS: UUOS CANNOT BE CALLED BY INTERRUPT SERVICE ROUTINES.\r
+\f;HERE ON UUO FROM USER\r
+;USER AC 17 ALREADY SAVED IN LOC USRSAV(SEE COMMON)\r
+;AC 17 CONTAINS ADR OF JOB(JOBADR)\r
+;SAVE HIS ACS ON REL. LOC 0-17\r
+\r
+;TO UUOSY1 IF UUO FROM EXEC MODE (AC 17 GUARRANTEED NOT TO BE EQUAL TO AC PROG)\r
+\r
+INTERNAL UUOUSR,UUOSY1,USRXIT\r
+EXTERN FORTY,SIXTY\r
+EXTERN ADRERR,CORUUO,DEVHNG,GETWRD,HOLD,ILLINS\r
+EXTERN ILLMOD,IOIERR,JOBKL,JOBSAV,PHOLD,REASSI,SETAPR\r
+EXTERN STWAIT,UGTSEG,URUN,USCHED,UUOERR\r
+EXTERN WAIT1,WSYNC\r
+EXTERNAL USRSAV,JOBPDL,MJOBPD,PUUOAC,USRJDA\r
+EXTERNAL USRHCU,JOB,JBTSTS,TIMEF\r
+EXTERNAL JOBDAT,JOBAC,UUO0,FORTY\r
+\r
+UUOUSR:        MOVEM 16,16(17)         ;STORE AC16 IN USER 16\r
+       MOVEI 16,(17)           ;SET UP BLT POINTER\r
+       BLT 16,15(17)           ;MOVE REAL AC'S TO USER AREA\r
+       MOVE TAC,USRSAV         ;MOVE USER 17 TO USER'S AREA\r
+       MOVEM TAC,17(17)\r
+       MOVE PROG,17            ;LOAD UP POINTER TO USER PROGRAM AREA\r
+IFN JDAT-PROG,<\r
+       MOVE JDAT,JOBDAT        ;ADDRESS OF JOB DATA AREA\r
+>\r
+       MOVSI PDP,MJOBPD        ;LOAD UP PUSH DOWN AC AND\r
+       HRRI PDP,JOBPDL(JDAT)   ;MAKE ABSOLUTE RATHER THAN RELATIVE\r
+UUOSY1:        PUSH PDP,UUO0           ;SAVE RETURN ON PUSH DOWN LIST\r
+       MOVE UUO,FORTY          ;GET THE UUO INTO AC(UUO)\r
+       TLNN UUO,740000         ;SYSTEM UUO?\r
+ILEGAL:        JRST UUOERR             ;NO, 0-37 ARE ILLEGAL,PRINT ERROR\r
+       TLO UUO,PROG            ;SET FOR RELOCATION\r
+       LDB TAC1,[POINT 9,UUO,8];PICK UP UUO OP CODE\r
+       CAIL TAC1,100           ;ILLEGAL INSTRUCTION?\r
+       JRST ILLINS             ;YES, STOP JOB AND PRINT ERROR\r
+       LDB UCHN,PUUOAC         ;SETUP USER DEVICE CHANNEL NUMBER\r
+       SKIPE DEVDAT,USRJDA(UCHN)       ;GET ADRESS OF DEVICE DATA BLOCK\r
+       CAMLE UCHN,USRHCU       ;IS IT LESS THAN OR EQUAL TO HIGHEST\r
+                               ; USER IO CHANNEL IN USE FOR CURRENT JOB?\r
+       JRST NOCHAN             ;CHANNEL NOT ASSIGNED\r
+       MOVE IOS,DEVIOS(DEVDAT) ;GET DATA BLOCK STATUS WORD\r
+       MOVE DSER,DEVSER(DEVDAT);SETUP IO SERVICE DISPATCH\r
+                               ; TABLE ADDRESS\r
+       CAIL TAC1,LNGUUO        ;LONG DISPATCH TABLE UUO?\r
+       JRST DISP1              ;YES\r
+DISP0: ROT TAC1,-1             ;DIVIDE UUO OPCODE BY 2, SAVE REMAINDER\r
+       MOVE DAT,UUOTAB-20(TAC1);GET DISPATCH TABLE ENTRY\r
+DISP2: TLNN TAC1,400000        ;WAS UUO ODD?\r
+       MOVS DAT,DAT            ;NO, USE LH OF DISPATCH ENTRY\r
+       CAME PROG,17            ;UUO FROM SYSTEM?\r
+       JRST (DAT)              ;YES, RETURN ADDRESS ALREADY ON PD \r
+                               ; LIST. AVOID RESTORING USER\r
+                               ; ACS ON RETURN TO SYSTEM.\r
+\f;DISPATCH TO UUO ROUTINE\r
+;THE FOLLOWING CODE IS EXECUTED ON ALL RETURN TO USER PROGRAMS\r
+;BUT IS NEVER EXECUTED ON RETURNS FROM EXEC UUOS(SAVGET)\r
+\r
+       PUSHJ PDP,(DAT)         ;NO, FROM USER. ALL\r
+                               ; UUO ROUTINES RETURN WITH POPJ\r
+       JRST USRXIT             ;NO SKIP RETURN TO USER\r
+USRXT1:        AOS (PDP)               ;SKIP RETURN TO USER\r
+USRXIT:        MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
+       MOVE TAC,JBTSTS(ITEM)\r
+       JUMPG TAC,USRXT2        ;HAS A CONTROL C BEEN EXECUTED?\r
+       TLNN TAC,STOPIO         ;TRYING TO STOP IO?\r
+       SKIPE TIMEF             ;NO. HAS CLOCK TICKED WHILE IN MONITOR?\r
+USRXT2:        PUSHJ PDP,USCHED        ;YES, GO CALL SCHEDULER\r
+       POP PDP,UUO0            ;USER RETURN ADDRESS\r
+       MOVSI 17,JOBAC(PROG)    ;RESTORE ALL USER ACS\r
+       BLT 17,17\r
+       JEN @UUO0               ;RESTORE FLAGS AND RETURN TO USER\r
+                               ; DISMISS INTERRUPT ONLY ON TRPJEN UUO\r
+                               ; IN ALL OTHER CASES NO INTERRUPTS\r
+                               ; IN PROGRESS\r
+\r
+NOCHAN:NOCHAN: CAMN PROG,17            ;UUO FROM USER?\r
+                               ;IF FROM EXEC, PROBABLY SAVEGET WHICH SETS USRCHN NEG. IN LH\r
+       CAIGE TAC1,IOUUO        ;YES, IS THIS AN IO UUO?\r
+       JRST DISP0              ;NO, GO DISPATCH\r
+       CAIE TAC1,70            ;YES,IS IT CLOSE OR RELEASE?\r
+       CAIN TAC1,71            ;CLOSE AND RELEASE ALWAYS LEGAL EVEN THOUGH NO DEVICE ASSIGNED\r
+       JRST USRXIT\r
+       JRST IOIERR             ;NO, PRINT IO TO UNASSIGNED CHANNEL\r
+                               ; AND STOP JOB\r
+\r
+DISP1: MOVE TAC,DEVMOD(DEVDAT) ;LONG DISPATCH TABLE UUO\r
+       TLNE TAC,DVLNG          ;DOES THIS DEVICE HAVE A LONG\r
+                               ; DISPATCH TABLE?\r
+       JRST DISP0              ;YES, DISPATCH\r
+       CAIGE TAC1,76           ;NO, IS UUO LOOKUP OR ENTER?\r
+       JRST USRXIT             ;NO, RETURN TO USER\r
+       JRST USRXT1             ;YES, SKIP RETURN TO USER\r
+\f\r
+;TABLE OF UUO DISPATCH ADDRESSES\r
+;IN FORMAT:\r
+;      XWD 40,41\r
+;      XWD 42,43\r
+;      .\r
+;      XWD 76,77\r
+\r
+\r
+\r
+UUOTAB:        XWD UCALL,UINIT         ;(40,41)CALL,INIT\r
+       XWD UUOERR,UUOERR       ;(42,43)FIVE UUOS FOR EACH INSTALLATION\r
+       XWD UUOERR,UUOERR       ;(44,45)TO DEFINE AS THEY SEE FIT\r
+       XWD UUOERR,UCALLI       ;(46,47),CALLI\r
+IFN FTTTYSER,<\r
+EXTERN TTYUUO\r
+       XWD UOPEN,TTYUUO        ;(50,51)OPEN, TTCALL\r
+>\r
+IFE FTTTYSER,<\r
+       XWD     UOPEN,CPOPJ     ;(50,51)OPEN, NO-OP FOR TTCALL\r
+>\r
+       XWD ILEGAL,ILEGAL       ;(52,53)\r
+       XWD ILEGAL,URENAM       ;(54,55),RENAME\r
+XP IOUUO,55                    ;LOWEST IO UUO(RENAME)\r
+       XWD TIN,TOUT            ;(56,57)IN,OUT\r
+       XWD SETIOS,USTATO       ;(60,61)SETSTS,STATO\r
+       XWD USTATS,USTATZ       ;(62,63)GETSTS,STATZ\r
+       XWD UINBF,UOUTBF        ;(64,65)INBUF,OUTBUF\r
+       XWD IN,UOUT             ;(66,67)INPUT,OUTPUT\r
+       XWD CLOSE1,RELEA1       ;(70,71)CLOSE,RELEASE\r
+XP LNGUUO,72                   ;LOWEST LING DISPATCH TABLE UUO\r
+       XWD UMTAPE,UDGF         ;(72,73)MTAPE,GETF\r
+       XWD UDSI,UDSO           ;(74,75)SETI,SETO\r
+       XWD UDLK,UDEN           ;(76,77)LOOKUP,ENTER\r
+\r
+;UUOS 42, 43, 44, 45, AND 46 ARE FOR CUSTOMERS TO DEFINE AS THEY PLEASE\r
+;UUOS 40, 41 AND 47 THROUGH 77 ARE DEFINED BY DIGITAL\r
+;UUOS 51,52,53 AND 54 ARE RESERVED FOR EXPANSION BY DIGITAL\r
+\f, CALLING SEQUENCE\r
+,      CALL D,[SIXBIT/NAME/]\r
+, WHERE NAME IS THE NAME OF A SYSTEM ROUTINE.\r
+, IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IF FOUND, THIS ROUTINE\r
+, EXITS TO UUOERR.\r
+;CONTENTS OF USER AC PLACED IN AC TAC,UUO SET TO POINT\r
+;TO USER AC, PROG IN LH.\r
+;ITEM SET TO JOB NUMBER\r
+\r
+EXTERNAL JOB\r
+\r
+UCALL: PUSHJ PDP,GETWDU        ;SET TAC FROM CONTENTS OF EFFECTIVE ADDRESS OF\r
+                               ; UUO FROM EITHER HIGH OR LOW SEG\r
+                               ; DO NOT RETURN IF ERROR\r
+                               ; SET ITEM TO CURRENT JOB NO.\r
+       MOVSI TAC1,-UCLLEN-CCLLEN-1     ;-SUM OF LENGTHS OF SIXBIT TABLES,\r
+                               ; -1 FOR THE CARRY TO LH IN AOBJN\r
+       HRRI TAC1,-CCLLEN       ;- LENGTH OF CUSTOMER TABLE\r
+       CAME TAC,UCLTAB(TAC1)   ;SEARCH SYSTEM ROUTINE NAME TABLE\r
+       AOBJN TAC1,.-1\r
+       HRRM TAC1,UUO           ;STORE INDEX IN UUO, JUST AS IF USER HAD DONE CALLI UUO\r
+\r
+\r
+;CALLI UUO     -       CALL IMMEDIATE\r
+;CALLI D,E\r
+;WHERE E IS RELATIVE INDEX IN CALL TABLE\r
+\r
+INTERNAL UCALLI\r
+\r
+UCALLI:        HRRE TAC1,UUO           ;GET CALLI NUMBER (POS. = DIGITAL, NEG. = CUSTOMER DEFINED)\r
+       CAML TAC1,[-CCLLEN]     ;MORE NEGATIVE THAN MOST NEGATIVE CUSTOMER DEFINED UUO?\r
+       CAIL TAC1,UCLLEN        ;MORE POSITIVE THAT DIGITAL DEFINED UUO?\r
+       POPJ PDP,               ;YES, RETURN TO USER TREAT AS NO-OP SO\r
+                               ; PROGRAMS AHEAD OF MONITOR WILL STILL\r
+                               ; RUN WITHOUT ERROR MESSAGE\r
+       CAMN PROG,17            ;NO, WAS UUO FROM MONITOR?\r
+       POP PDP,TAC             ;REMOVE RETURN\r
+       HRR UUO,UCHN            ;UUO AC FIELD\r
+       MOVE TAC,@UUO           ;PICK UP CONTENTS OF USER AC\r
+       ROT TAC1,-1             ;DEVIDE BY 2 AND SAVE REMAINDER\r
+       MOVE DAT,UCLJMP(TAC1)   ;GET DISPACTH TABLE ENTRY\r
+       MOVE ITEM,JOB           ;SETUP CURRENT JOB NUMBER(IN CASE THIS IS CALLI)\r
+       JRST DISP2              ;AND GO DISPATCH\r
+\f\r
+;CALL UUO DISPATCH TABLE\r
+;NEW UUO'S MUST BE ADDED AT END SINCE CALLI DEPENDS ON\r
+;POSITION IN TABLE, CUSTOMERS SHOULD ADD UUO'S IN CNAMES MACRO SO CALLI ADDRESS\r
+;WILL BE NEGATIVE.  IN THIS WAY BOTH DIGITAL AND ITS CUSTOMERS CAN ADD UUO'S\r
+;WITHOUT CONFLICT, DIGITAL GOING POSITIVE, CUSTOMERS GOING NEGATIVE.\r
+; (ALSO, TOWARD TOP OF PAGE)\r
+\r
+;ALSO EXTERNALS MUST BE IN RH(IE ODD CALLI INDECIES)\r
+\r
+EXTERNAL DDTIN,DDTOUT,CPOPJ\r
+\r
+DEFINE CNAMES <\r
+       X CPOPJ,CPOPJ           ;(-3) PLACE FOR CUSTOMERS TO PATCH UUOS\r
+       X CPOPJ,CPOPJ           ;(-2) \r
+       X LIGHTS,LIGHTS         ;(-1) SET LIGHTS (EXAMPLE OF CUSTOMER DEFINED UUO)\r
+>\r
+\r
+DEFINE NAMES,<\r
+       X RESET,RESET           ;(0)RESET IO\r
+       X DDTIN,DDTIN           ;(1)EXT-GET DDT CHAR.\r
+       X SETDDT,SETDDT         ;(2)SETDDT LOC IN PROTECTED JOB DATA\r
+       X DDTOUT,DDTOUT         ;(3)EXT:SEND DDT CHAR.\r
+       X DEVCHR,DVCHR          ;(4)DEVICE CHARACTISTICS\r
+       X DDTGT,CPOPJ           ;(5)GET DDT MODE\r
+       X GETCHR,DVCHR          ;(6)DEVICE CHAR.(DIFF. NAME)\r
+       X DDTRL,CPOPJ           ;(7)RELEASE DDT MODE\r
+       X WAIT,WAIT             ;(10)WAIT TILL DEVICE INACTIVE\r
+       X CORE,CORUUO           ;(11)CORE UUO\r
+       X EXIT,EXIT             ;(12)EXIT\r
+       X UTPCLR,UTPCLR         ;(13)CLEAR DEC TAPE DIRECTORY \r
+       X DATE,DATE             ;(14)GET DATE\r
+       X LOGIN,LOGIN           ;(15)LOGIN\r
+       X APRENB,APRENB         ;(16)ENABLE APR FOR TRAPPING\r
+       X LOGOUT,LOGOUT         ;(17)LOGOUT\r
+       X SWITCH,SWITCH         ;(20)RETURN DATA SWITCHES\r
+       X REASSIGN,REASSIGN     ;(21)REASSIGN DEVICE TO ANOTHER JOB\r
+       X TIMER,TIMER           ;(22)RETURN JIFFY CLOCK TIME\r
+       X MSTIME,MSTIME         ;(23)RETURN TIME OF DAY IN MS\r
+       X GETPPN,GETPPN         ;(24)RETURN PROJECT-PROGRAMMER NUMBER\r
+       X TRPSET,TRPSET         ;(25)SET PI TRAP LOC, AND USER IO\r
+       X TRPJEN,UUOERR         ;(26)DISMISS INTERRUPT TO EXEC MODE(SUPERCEDED BY UJEN)\r
+       X RUNTIM,JOBTIM         ;(27)RETURN TOTAL JOB RUNNING TIME\r
+       X PJOB,JOBNO            ;(30)RETURN JOB NUMBER\r
+       X SLEEP,SLEEP           ;(31)SLEEP FOR N SECONDS, THEN RETURN TO USER\r
+       X SETPOV,SETPOV         ;(32)SET PUSH DOWN OVERFLOW TRAP\r
+                               ; (FOR COMPATIBILITY ONLY)\r
+       X PEEK,UPEEK            ;(33)TO PEEK AT CERTAIN MONITOR PARAMETERS\r
+       X GETLIN,GETLN          ;(34) GET TTY UNE NUMBER\r
+       X RUN,URUN              ;(35) RUN DEV:FILE\r
+       X SETUWP,SETUWP         ;(36) SET OR CLEAR USER MODE WRITE PROTECT\r
+       X REMAP, REMAP          ;(37) REMAP TOP OF LOW SEGMENT INTO HIGH SEG\r
+       X GETSEG,UGTSEG         ;(40) GET SHARABLE HIGH SEG\r
+       X GETTAB,GETTAB         ;(41) GET EXEC ADDRESS OF A JOB TABLE\r
+       X SPY,USPY              ;(42) SET HIGH SEG TO BE PHYSICAL CORE\r
+       X SETNAM,SETNAM         ;(43) SETNAME OF THIS PROGRAM\r
+       X CPOPJ,CPOPJ           ;2 SPARE UUO'S FOR PATCHING - DIGITAL ONLY\r
+       X CPOPJ,CPOPJ           ;ALWAYS ADD NEW UUO'S ABOVE THESE\r
+                               ;CUSTOMERS SHOULD ADD UUO'S ABOVE\r
+                               ;IN CNAMES MACRO RATHER THAN NAMES MACRO\r
+                               ; SO THAT THEIR CALLI INDECES WILL\r
+                               ; BE NEGATIVE\r
+>\r
+\f;GENERATE SIXBIT TABLE OF UUO NAMES\r
+\r
+DEFINE X (A,B) <\r
+       <SIXBIT /A/>\r
+>\r
+\r
+;GENERATE CUSTOMER CALL/CALLI UUO'S\r
+\r
+CCLTAB:        CNAMES\r
+CCLLEN=.-CCLTAB                ;LENGTH OF CUSTOMER DEFINED CALL/CALLI UUO'S\r
+                       ;(MINIMUM CALLI NUMBER, TOO)\r
+\r
+;GENERATE DIGITAL UUO'S\r
+\r
+UCLTAB:        NAMES\r
+UCLLEN=.-UCLTAB                ;DEFINE LENGTH OF DIGITAL UUO TABLE(MAX. CALLI NO. TOO)\r
+\fDEFINE X (A,B)\r
+<      ZZ=ZZ+1\r
+       DEFINE XX (C)           ;DEFINE XX IN CASE JOB NUMBER OF CUSTOMER UUO'S\r
+<      XWD UUOERR,C\r
+>>\r
+ZZ=0\r
+;COUNT NUMBER OF CUSTOMER DEFINED UUO'S\r
+       CNAMES\r
+\r
+;GENERATE HALF WORD UUO DISPATCH TABLE\r
+\r
+DEFINE X (A,B)\r
+<      IFE ZZ&1,\r
+<      DEFINE XX (C)\r
+<\r
+       XWD B,C\r
+>>\r
+       IFN ZZ&1,\r
+<\r
+       XX B\r
+>\r
+ZZ=ZZ+1\r
+>\r
+\r
+;GENERATE CUSTOMER TABLE\r
+\r
+CUSTAB:        CNAMES\r
+\r
+\r
+ZZ=0\r
+\r
+;GENERATE DIGITAL TABLE\r
+\r
+UCLJMP:        NAMES\r
+\r
+       IFN ZZ&1,<XX 0> ;GEN. LAST WORD IF ODD NUMBER OF UUOS\r
+\r
+;FIX UP SYMBOLS NOT IN UUOCON\r
+\r
+IFN FT2REL,<EXTERN USPY>\r
+IFE FT2REL,<USPY=LCPOPJ>\r
+\f;EXIT UUO ROUTINE\r
+;CALL: CALL FIELD, [SIXBIT/EXIT/]\r
+;IF FIELD - 0, PRINT EXIT ^C.  CONT WILL NOT WORK\r
+;IF FIELD NON-ZERO, JUST PRINT.  DO NOT RELEASE DEVICES\r
+\r
+EXTERNAL TTYFUW\r
+\r
+EXIT:  JUMPN UCHN,MONRET       ;AC FIELD NON-ZERO?\r
+       PUSHJ PDP,IORELS        ;NO, RELEASE ALL DEVICES\r
+       PUSHJ PDP,TTYFUW        ;FIND TTY FOR CURRENT JOB\r
+                               ; SET ITEM TO JOB NO.,DAT TO OUTPUT BYTE POINTER\r
+                               ; DEVDAT TO TTY DDB\r
+       JSP TAC,PHOLD           ;MOVE "EXIT" TO OUTPUT BUFFER\r
+                               ; AND STOP JOB, AND START TTY, CONT WILL NOT WORK\r
+       ASCIZ /\r
+EXIT/\r
+\r
+;      CALL 1,[SIXBIT/EXIT/] - RETURN TTY TO MONITOR MODE,\r
+;      STOP JOB, BUT DO NOT RELEASE DEVICES\r
+;TYPE . WITH NO CRLF, ALLOW CONT COMMAND TO RETURN AFTER UUO\r
+\r
+       EXTERN PRPER,STOP1,CRLF,TTYSTC\r
+\r
+MONRET:        PUSHJ PDP,TTYFUW        ;FIND TTY FOR CURRENT JOB\r
+       PUSHJ PDP,CRLF          ;PRINT CR LF\r
+       PUSHJ PDP,PRPER         ;PRINT .\r
+       PUSHJ PDP,TTYSTC        ;PUT TTY INTO COMMAND MODE\r
+       JRST STOP1              ;START TTY IN MONITOR MODE AND STOP JOB\r
+                               ;BUT ALLOW CONTINUE TO WORK (RETURN CONTROL AFTER EXIT UUO)\r
+\r
+;SETPOV - SET PUSH DOWN OVERFLOW TRAP\r
+;CALL  MOVE AC,ADR. OF TRAP ON PD OVF\r
+;      CALL AC,[SIXBIT /SETPOV/]\r
+\r
+EXTERNAL JOBAPR\r
+\r
+SETPOV:        MOVEM TAC,JOBAPR(JDAT)\r
+       MOVEI TAC,1B19\r
+       JRST APRENB             ;SET TRAP LOC.\r
+\r
+\f;RESET UUO ROUTINE\r
+\r
+INTERNAL RESET,FTTRPSET\r
+EXTERNAL JOBPD1\r
+\r
+RESET:\r
+IFN FTTRPSET,<\r
+       EXTERN STOPTS\r
+       CAIN    TAC,1           ;IS THIS JOB 1 DOING THE RESET?\r
+       SETZM   STOPTS          ;YES. MAKE SURE SCHEDULING ALLOWED\r
+                               ; IN CASE THIS FOLLOWS A TRPSET UUO\r
+>\r
+IFN FT2REL,<\r
+       EXTERN HRESET\r
+       PUSHJ PDP,HRESET        ;FLAG USER AS HAVING UWP ON FOR HIGH SEG\r
+                               ; AND DO DATAO TO SET UWP ON\r
+>\r
+       PUSHJ PDP,IOKILL        ;RELEASE ALL DEVICES\r
+       MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH, EXCEPT USER MODE\r
+       ANDCAM TAC,JOBPD1(JDAT) ;LEAVE USER MODE OFF TOO, IF EXEC DOING CALL RESET\r
+                               ; FALL INTO APRENB WITH RH TAC=0\r
+                               ; SO THAT ALL APR INTERRUPTS WILL BE DISABLED\r
+\f;ROUTINE TO SET UP APR FOR USER TRAPPING\r
+;CALL: CALL AC,[SIXBIT /APRENB/]\r
+;WITH FOLLOWING APR CONSO FLAG BITS\r
+;TO INDICATE WHICH APR CONDITIONS SHOULD\r
+;TRAP TO USER WHEN TRAP OCCURS FROM USER MODE\r
+\r
+;1B19  ;PUSHDOWN OVERFLOW\r
+;1B22  ;ILLEGAL MEMORY\r
+;1B23  ;NON-EXISTENT MEMORY\r
+;1B26  ;CLOCK\r
+;1B29  ;FLOATING POINT OVERFLOW\r
+;1B32  ;ARITH. OVERFLOW\r
+\r
+INTERNAL APRENB\r
+\r
+APRENB:        HRRM TAC,JOBENB(JDAT)   ;SET RH TO CONSO BITS IN JOB DATA AREA\r
+                               ; USED EVERY TIME IS STARTED UP\r
+\r
+       JRST SETAPR             ;GO ENABLE/DISABLE APR FOR FOV AND HR OV\r
+                               ; ALSO SET APR CONSO INSTR. FOR PROPER FLAGS\r
+                               ; AND RETURN TO USER\r
+\f;RETURN JOB NUMBER FOR THIS JOB\r
+\r
+JOBNO: SKIPA TAC,ITEM          ;JOB NUMBER\r
+                               ; SKIP AND STORE TAC IS USER AC\r
+\r
+;RETURN THE DATE TO THE USER\r
+\r
+EXTERNAL THSDAT\r
+\r
+DATE:  MOVE TAC,THSDAT\r
+       JRST STOTAC\r
+\r
+;RETURN JOB RUNNING TIME IN MILLISECONDS\r
+\r
+INTERNAL FTTIME\r
+\r
+JOBTIM:\r
+IFN FTTIME,<EXTERNAL JOBN\r
+       SKIPL TAC\r
+       CAILE TAC,JOBN\r
+       JRST    RTZER\r
+       SKIPN TAC\r
+       MOVE TAC,ITEM\r
+       SKIPA TAC,TTIME(TAC)    ;TOTAL JOB RUNNING TIME\r
+       EXTERNAL TTIME\r
+>\r
+IFE FTTIME,<\r
+               TDZA TAC,TAC    ;RETURN ZERO IF NO TIMMING COM.\r
+>\r
+\r
+;RETURN TIME OF DAY IN MILLISECONDS\r
+\r
+EXTERNAL TIME,JIFSEC\r
+\r
+MSTIME:        MOVE TAC,TIME           ;TIME OF DAY IN JIFFIES\r
+       IMULI TAC,^D1000\r
+       IDIVI TAC,JIFSEC        ;DIVIDE BY NO. OF JIFFIES PER SECOND\r
+       JRST STOTAC\r
+\f\r
+;PUT JOB TO SLEEP FOR NSECONDS\r
+;CALL  CALL AC,[SIXBIT /SLEEP/]\r
+\r
+INTERNAL FTSLEEP,SLEEP\r
+\r
+SLEEP:\r
+IFN FTSLEEP,<\r
+EXTERNAL JIFSEC,JBTSTS,PION,PIOFF,SETSLP,WAKE,CLOCK\r
+       MOVSI TAC1,CLKR\r
+       TDNE TAC1,JBTSTS(ITEM)  ;DOES THIS JOB HAVE A CLOCK QUEUE\r
+                               ; REQUEST IN CLOCK QUEUE?\r
+       JRST SLEEP1             ;YES, DO NOT PUT ANOTHER ONE IN\r
+       IMULI TAC,JIFSEC        ;MULTIPLY BY NO. OF JIFFIES PER SECOND\r
+       TRNN TAC,7777           ;0 TIME?(CHECK ONLY 12 BITS)\r
+       MOVEI TAC,1             ;YES. SLEEP 1 JIFFY\r
+       DPB ITEM,[POINT 6,TAC,23]\r
+       HRLI TAC,WAKE           ;ADR. IN RUNCSS WHEN JOB WAKES UP\r
+       CONO PI,PIOFF\r
+       IDPB TAC,CLOCK\r
+       CONO PI,PION\r
+SLEEP1:        JRST SETSLP             ;SET JOB STATUS WORD SO JOB WILL NOT RUN\r
+>\r
+IFE FTSLEEP,<  POPJ PDP,       ;RETURN IMMEDIATELY IF NOT A FEATURE>\r
+\r
+;PEEK INTO MONITOR UUO\r
+;CALL  MOVEI   AC,<MONITOR ADDRESS>\r
+;      CALL    AC,[SIXBIT .PEEK.]\r
+\r
+       EXTERN SYSSIZ\r
+\r
+UPEEK:\r
+IFN FTLOGIN,<\r
+       HLRZ    TAC1,PRJPRG(ITEM)       ;GET USER'S PROJECT NR\r
+       CAIE    TAC1,1                  ;ADMIN NR?\r
+       JFCL            ;SHOULD BE PATCHED TO "JRST UUOERR" IF\r
+                       ; IF CUSTOMER WANTS PEEK UUO NOT ALLOWED FOR ALL USERS\r
+>\r
+       CAMLE TAC,SYSSIZ        ;ONLY UP TO SIZE OF SYSTEM\r
+       JRST RTZER              ;RETURN 0 IF USER ASKING TOO BIG\r
+       MOVE    TAC,(TAC)\r
+       JRST    STOTAC\r
+\f;SET OR CLEAR USER MODE WRITE PROTECT BIT IN HIGH SEG FOR THIS USER ONLY\r
+;CALL: MOVEI AC,0 OR 1\r
+;      CALL AC,[SIXBIT /SETUWP/] OR CALLI AC,34\r
+;      ERROR - MACHINE OR MONITOR CANNOT HANDLE TWO REG, OR TRYING TO CLEAR\r
+;                      ;UWP OF A SHARABLE SEG(AC=1 ON RETURN)\r
+;      OK RETURN - AC CONTAINS PREVIOUS SETTING( OR JOB HAS NO HIGH SEG)\r
+\r
+IFN FT2REL,<\r
+       EXTERN USTUWP\r
+SETUWP:        JRST USTUWP             ;GO TO ROUTINE IN SEGCON\r
+                               ;IF FT2REL=0, SETUWP DOES RTZER\r
+>\r
+\r
+\r
+;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT\r
+;PREVIOUS HIGH SEG(IF ANY) IS KILLED AND A NEW SEGMENT NUMBER IS ASSIGNED\r
+;TO THIS JOB. REMAP IS USED BY LOADER AND GET\r
+;CALL: MOVEI AC,NEW HIGHEST USER ADR IN LOW SEG(EXEC ORS IN 1777)\r
+;      CALL AC,[SIXBIT /REMAP/] OR CALLI AC,35\r
+;      ERROR RETURN, MACHINE OR EXEC CANNOT HANDLE 2 REG OR DESIRED ADR\r
+;                      ;GREATER THAN OLD LOW SEG\r
+;      OK RETURN, LOW SEG ABOVE ARG NOW THE HIGH SEG\r
+\r
+IFN FT2REL,<\r
+       EXTERN UREMAP\r
+REMAP: JRST UREMAP             ;CORE1 MODULE IN SEGCON\r
+>\r
+IFE FT2REL,<\r
+REMAP=CPOPJ                    ;ERROR RETURN TO USER(CPOPJ IS AN EXTERN)\r
+>\r
+\r
+;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL - EITHER SEGMENT\r
+;CALL: MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEG\r
+;      HRR UUO,USER ADR.\r
+;      HRLI UUO,PROG   ;FOR RELOCATION\r
+;      PUSHJ PDP,GETWDU\r
+;      RETURN ONLY IF ADDRESS OK, WORD IN TAC, ABS. ADR IN TAC1\r
+\r
+;      IF OUT OF BOUNDS, PRINT ILL UUO AND STOP JOB\r
+\r
+       INTERN GETWDU,GETWD1\r
+       EXTERN JOB\r
+\r
+GETWD1:        HRRI UUO,1(UUO)         ;INCREMENT UUO BEFORE PICKING UP WORD\r
+GETWDU:        MOVE ITEM,JOB           ;SETUP CURRENT JOB NUMBER\r
+       PUSHJ PDP,GETWRD        ;GET THE WORD AND CHECK IF LEGAL\r
+       JRST UUOERR             ;ADR. NOT IN LOW OR HIGH SEG, PRINT ERROR\r
+LCPOPJ:\r
+RMPERR:        POPJ PDP,               ;OK RETURN, TAC=WORD, TAC1=ABS. ADR.\r
+\f;SET LIGHTS ON CONSOLE FROM USER PROGRAM\r
+\r
+;CALL AC,[SIXBIT /DATAO/] OR CALLI AC,-1\r
+\r
+;THIS IS AN EXAMPLE OF A USER DEFINED UUO WITH A NEGATIVE CALLI ARG.\r
+\r
+LIGHTS:        DATAO PI,TAC            ;SENT USER'S AC TO CONSOLE LIGHTS\r
+       POPJ PDP,               ;RETURN TO HIM\r
+\r
+;RETURN TIME OF DAY IN JIFFIES (60THS,50THS OR MS)\r
+\r
+EXTERNAL TIME\r
+\r
+TIMER: SKIPA TAC,TIME          ;FALL INTO STOTAC\r
+\r
+;RETURN DATA SWITCHES\r
+\r
+\r
+SWITCH:        DATAI TAC\r
+\r
+;ROUTINE TO STORE TAC IN USER AREA AS SPECIFIED BY UUO\r
+;MUST BE CALLED FROM UUO LEVEL WITH PROG SETUP\r
+;ALSO PROG IN INDEX FIELD OF UUO\r
+\r
+INTERNAL STOTAC\r
+\r
+STOTAC:        HRRZ AC1,UUO\r
+       PUSHJ PDP,UADCK1        ;IS ADDRESS IN BOUNDS(OR IN ACS)?\r
+       MOVEM TAC,@UUO          ;YES, STORE\r
+       POPJ PDP,\r
+\r
+;RETURN DEVICE CHARACTERISTICS\r
+\r
+EXTERNAL JOB,PJOBN\r
+\r
+DVCHR: PUSHJ PDP,DEVSRC        ;SERACH FOR DEVICE\r
+       TDZA TAC,TAC            ;NOT A DEVICE, RETURN ZERO\r
+       SKIPA TAC,DEVMOD(DEVDAT);DEVICE FOUND,RETURN DEVMOD\r
+       JRST STOTAC             ;RETURN ZERO, DEVICE NOT FOUND\r
+       LDB TAC1,PJOBN          ;GET JOB NO.  USING DEVICE\r
+       CAME TAC1,JOB           ;DOES CURRENT USER ALREADY HAVE IT?\r
+       TRNN TAC,ASSCON+ASSPRG  ;NO, IS IT ASSIGNED?\r
+       TLO TAC,DVAVAL          ;NO, BUT HE CAN GET IT.\r
+       JRST STOTAC\r
+\r
+;RETURN PROJECT-PROGRAMMER NUMBER IN AC\r
+\r
+GETPPN:\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+       EXTERNAL PRJPRG\r
+       MOVSI TAC,JACCT\r
+       TDNE TAC,JBTSTS(ITEM)   ;LOGIN OR LOGOUT CUSP RUNNING ?\r
+       JRST GETPPL             ;YES, SPECIAL PROJ,PROG NUMBER CHANGE.\r
+       SKIPA TAC,PRJPRG(ITEM)  ;NO, RETURN PROJECT-PROGRAMMER NO. OF THIS JOB.\r
+>\r
+\r
+INTERN RTZER\r
+\r
+IFE FT2REL, <\r
+SETUWP:                                ;SETUWP RETURNS 0\r
+>\r
+\r
+RTZER: MOVEI TAC,0             ;RETURN 0. TO USER AC\r
+       JRST STOTAC             ;AS SPECIFIED IN AC FIELD OF HIS UUO\r
+\fEXTERNAL USRDDT\r
+\r
+SETDDT:        MOVEM TAC,USRDDT\r
+       POPJ PDP,               ;RETURN TO USER\r
+\r
+;WAIT FOR IO TO BECOME INACTIVE ON CHANNEL AC\r
+\r
+\r
+WAIT:  JUMPE DEVDAT,CPOPJ      ;CHANNEL ASSIGNED?\r
+       JRST WAIT1              ;WAIT TILL INACTIVE BEFORE\r
+                               ; RETURNING TO USER.\r
+\r
+\r
+IFN    FTLOGIN, <\r
+EXTERNAL       DUMPPP,MJOBN\r
+GETPPL:        MOVE    TAC,DUMPPP      ;CHANGE USER'S NUMBERS TO [1,2]\r
+       EXCH    TAC,PRJPRG(ITEM)        ; AND GET OLD NUMBERS.\r
+       MOVSI   TAC1,MJOBN      ;CHECK FOR OTHER USERS UNDER SAME PP NUMBER.\r
+       CAMN    TAC,PRJPRG(TAC1)        ;ANOTHER USER UNDER SAME PROJ,PROG NUMBER ?\r
+       AOSA    (PDP)           ;YES, SKIP RETURN TO USER (LOGIN OR LOGOUT)\r
+       AOBJN   TAC1,.-2        ;NO, KEEP LOOKING\r
+       JRST    STOTAC\r
+>\r
+\r
+GETLN: PUSHJ   PDP,TTYFND      ;FIND USER'S TTY DATA BLOCK.\r
+       MOVE    TAC,DEVNAM(DEVDAT)      ;GET DEVICE NAME IN SIXBIT\r
+       JRST    STOTAC          ;RETURN IT TO USER.\r
+\f;LOGIN UUO USED ONLY BY LOGIN CUSP\r
+;CALL: CALL AC,[SIXBIT /LOGIN/]\r
+;WHERE AC CONTAINS XWD -NO. OF ENTRIES,LOCATION\r
+;WHICH IS A LIST OF JOB STATISTICS TO BE STORED IN MONITOR\r
+\r
+INTERNAL FTLOGIN\r
+\r
+IFN FTLOGIN,<\r
+EXTERNAL JOB,JBTSTS,TTYFUW\r
+\r
+LOGIN: MOVSI TAC1,JLOG         ;IS USER ALREADY LOGGED IN?\r
+       TDNE TAC1,JBTSTS(ITEM)\r
+       JRST UUOERR             ;YES, PRINT ILLEGAL UUO\r
+       HLRE AC1,TAC            ;NO, -NO. OF WORDS\r
+       HRR UUO,TAC             ;FIRST REL. LOC.\r
+       MOVE AC2,[XWD -LOGTOP,LOGTAB]   ;SET FOR LOOP\r
+LOGIN1:        AOSG AC1                ;FINISHED HIS COUNT?\r
+       SKIPA AC3,@UUO          ;NO, GET NEXT WORD FROM USER AREA\r
+       MOVEI AC3,0             ;YES, STORE 0\r
+       MOVEM AC3,@(AC2)        ;NO, STORE ITEM\r
+       ADDI UUO,1              ;GET NEXT ITEM\r
+       AOBJN AC2,LOGIN1        ;FINISHED NO. OF MONITOR TABLES?\r
+       IORM TAC1,JBTSTS(ITEM)  ;YES, FINALLY SET LOGIN BIT\r
+       MOVSI   TAC1,JACCT      ;RESET THIS BIT TO INDICATE LOG-IN IS\r
+       ANDCAM  TAC1,JBTSTS(ITEM)       ; NOW COMPLETE AND ^C IS AGAIN PERMITTED.\r
+LOGIN2:        PUSHJ PDP,IORELS        ;RELEASE ALL DEVICES\r
+       PUSHJ PDP,TTYFUW        ;FIND TTY AND PRINT ^C\r
+       JRST HOLD\r
+\r
+;TABLE OF POINTERS TO TABLES(STORED WITH JOB NUMBER AS INDEX)\r
+;TO MAKE LOGIN SET MORE TABLES IN MONITOR, JUST ADD TABLE NAMES AT END\r
+\r
+EXTERNAL PRJPRG\r
+\r
+\r
+LOGTAB:        XWD ITEM,PRJPRG         ;PROJECT-PROGRAMMER NUMBER\r
+IFN FTPRV,<\r
+       EXTERN JBTPRV\r
+       XWD ITEM,JBTPRV         ;JOB PRIVILEGE BITS\r
+>\r
+IFE FTPRV,<\r
+       EXP IOS                 ;STORE IN AC IOS, SINCE PRIVILEGE TABLE DOES NOT EXIST\r
+>\r
+\r
+LOGTOP=.-LOGTAB        ;NO. OF TABLES TO BE SET\r
+>\r
+\f\r
+;LOGOUT UUO\r
+\r
+INTERNAL FTLOGIN\r
+EXTERNAL TTYTCM\r
+\r
+IFN FTLOGIN,<\r
+LOGOUT:        PUSHJ   PDP,TTYFUW\r
+       MOVSI   TAC,JLOG\r
+       TDNN    TAC,JBTSTS(ITEM)        ;IS JOB ALREADY LOGGED OUT ?\r
+       JRST    JOBKL           ;NO, GO COMPLETE WORK OF LOGOUT CUSP.\r
+       JRST    EXIT    ;YES, TREAT AS "EXIT"\r
+>\r
+\r
+IFE FTLOGIN,<\r
+\r
+LOGIN=UUOERR   ;CANT DO A LOGIN UUO\r
+LOGOUT=EXIT    ;TREAT A KJOB UUO AS AN EXIT IN 10/40\r
+>\r
+\f;GETTAB UUO\r
+;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE ENTRY\r
+;CALL: HRROI AC, MONITOR JOB TABLE NUMBER\r
+;      HRLI AC, JOB NUMBER (OPTIONAL) LH .LT. 0 MEANS CURRENT JOB\r
+;      CALL AC, [SIXBIT /GETTAB/] OR CALLI AC,41\r
+;      ERROR RETURN AC PRESERVED IF LH OR RH TOO BIG OR\r
+                               ; AC=-1 IF NOT PRIVILIGED TO GET INFO\r
+;      NORMAL RETURN - AC=0 IF TABLE IS UNDEFINED\r
+IFN FTGETTAB,<\r
+       EXTERN JOB,JOBMAX,TTYTAB,TTPMXL,JOBMXL,JBTMXL\r
+\r
+GETTAB:        HLRZ ITEM,TAC           ;GET USER SUPPLIED JOB NUMBER\r
+       SKIPGE TAC              ;DID HE SUPPLY ONE?\r
+       MOVE ITEM, JOB          ;NO, USE CURRENT JOB NUMBER\r
+       HRRZS TAC               ;GET TABLE NUMBER IN TAC\r
+       CAIL TAC,GTTBLN         ;IS TABLE NUMBER LEGAL?\r
+       POPJ PDP,               ;YES. ERROR RETURN, AC UNCHANGED\r
+       LDB TAC1,[POINT 9,NUMTAB(TAC),8]        ;MAX LEGAL ARG.\r
+       CAMLE ITEM,TAC1         ;DOES HIS ARG EXCEED LEGAL ONE?\r
+       POPJ PDP,0              ;YES. ERROR RETURN\r
+       MOVE TAC,@NUMTAB(TAC)   ;GET CONTENTS OF MONITOR TABLE\r
+       AOS (PDP)               ;OK (SKIP) RETURN TO USER\r
+       JRST STOTAC             ;RETURN TAC IN HIS AC\r
+\r
+;THE MONITOR JOB TABLE NUMBERS:\r
+       EXTERN JBTSTS,JBTADR,JBTPRG,NSWTBL,CNFTBL,NSWMXL,CNFMXL\r
+NUMTAB:        XWD ITEM+JBTMXL,JBTSTS  ;0 - JOB STATUS BITS\r
+       XWD ITEM+JBTMXL,JBTADR  ;1 - JOB SIZE -1 AND ABS.LOC\r
+IFN FTLOGIN,<\r
+       EXTERN PRJPRG\r
+       XWD ITEM+JBTMXL,PRJPRG  ;2 - PROJECT,PROGRAMMER NUMBER\r
+>\r
+IFE FTLOGIN,<\r
+       XWD JBTMXL,[0]  ;2 - NOT DEFINED\r
+>\r
+       XWD ITEM+JBTMXL,JBTPRG  ;3 - PROGRAM BEING RUN\r
+IFN FTTIME,<\r
+\r
+       EXTERN TTIME\r
+\r
+       XWD ITEM+JOBMXL,TTIME   ;4 - TOTAL RUN TIME IN JIFFIES\r
+>\r
+IFE FTTIME,<\r
+       XWD JOBMXL,[0]  ;4 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+IFN FTKCT,<\r
+       EXTERN JBTKCT\r
+       XWD ITEM+JOBMXL,JBTKCT  ;5 - KILO-CORE TICKS(JIFFIES*SIZE IN K)\r
+>\r
+IFE FTKCT,<\r
+       XWD JOBMXL,[0]  ;5  NOT DEFINED TABLE - RETURN 0\r
+>\r
+\fIFN FTPRV,<\r
+       EXTERN JBTPRV\r
+       XWD ITEM+JOBMXL,JBTPRV  ;6 - PRIVILEGE BITS SET BY LOGIN\r
+>\r
+IFE FTPRV,<\r
+       XWD JOBMXL,[0]          ;6 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+IFN FTSWAP,<\r
+       EXTERN JBTSWP,SWPTBL,SWPMXL\r
+       XWD ITEM+JBTMXL,JBTSWP  ;7 - LOC ON DISK, SIZE ON DISK, IN CORE PROTECT TIME\r
+>\r
+IFE FTSWAP,<\r
+       XWD JOBMXL,[0]          ;7 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+       XWD ITEM+TTPMXL,TTYTAB  ;10 - TTY TRANSLATOR TABLE\r
+       XWD ITEM+CNFMXL,CNFTBL  ;11 - CONFIGURATION DATA\r
+       XWD ITEM+NSWMXL,NSWTBL  ;12 - NON-SWAPPING DATA\r
+IFN FTSWAP,<\r
+       XWD ITEM+SWPMXL,SWPTBL  ;13 - SWAPPER DATA\r
+>\r
+IFE FTSWAP,<\r
+       EXP [0]         ;13 - UNDEFINED\r
+                               ;ALL CALL ARE ERROR RETURNS SINCE TABLE\r
+                               ; HAS NO ENTRIES\r
+>\r
+IFN FT2REL,<\r
+\r
+EXTERN JBTSGN,ITMSGN\r
+\r
+       XWD ITMSGN,JBTSGN       ;14 - HIGH SEG NO. THIS JOB IS USING\r
+                               ;LH=ITEM+JOBMXL IF REENTRANT SOFTWARE\r
+                               ;LH=0+JOBMXL, SO ALL ENTRIES RETURN 0\r
+                               ; IF NON-REENTRANT SOFTWARE\r
+>\r
+IFE FT2REL,<\r
+       XWD JOBMXL,[0]          ;14 - UNDEFINED\r
+>\r
+IFN FTDISK,<\r
+       EXTERN ODPMXL,ODPTBL\r
+       XWD ITEM+ODPMXL,ODPTBL  ;15 - ONCE ONLY DISK PARAMETERS\r
+>\r
+IFE FTDISK,<\r
+       EXP [0]                 ;50 - UNDEFINED\r
+>\r
+GTTBLN=.-NUMTAB                        ;LENGTH OF TABLE\r
+>\r
+\r
+IFE FTGETTAB,<GETTAB=UUOERR>\r
+\r
+;UUO TO SET CURRENT PROGRAM NAME\r
+;      MOVE AC,[SIXBIT /NAME/]\r
+;      ALWAYS RETURN\r
+\r
+       EXTERN JBTPRG\r
+\r
+SETNAM:        MOVEM TAC,JBTPRG(ITEM)  ;STORE PROGRAM NAME FOR SYSTAT AND SYSDPY\r
+       POPJ PDP,\r
+\r
+\f\f\r
+;UUO TO SET JOB TO USE IO IN USER MODE\r
+;AND TO SET PI INTERRUPT LOCATION IN LOWER CORE(WORKS ONLY ON PDP-10'S -SEE NEXT PAGE)\r
+;CALL: CALL AC,[SIXBIT /TRPSET/]\r
+;      ERROR RETURN, USER NOT ALLOWED TO DO IO IN USER MODE\r
+;      OK RETURN\r
+\r
+;WHERE RH(AC)=REL ADR. OF 1 INSTRUCTION TO BE MOVED INTO\r
+;THE MONITOR PI TRAP LOCATION(40-57) AS SPECIFIED BY LH(AC)\r
+;RELOCATION OF JOB IS ADDED TO RH OF INSTRUCTION AS IT IS MOVED.\r
+;ALSO THE RELOCATION IS ADDED TO THE RH OF WORD IN USER AREA SPECIFIED BY\r
+;RH OF USER INSTRUCTION IN CASE IT IS A BLKO/BLKI POINTER\r
+;THE USER MUST RESET EVERY TRPSET CALL IF BLKI/BLKO POINTER \r
+;AND SHOULD SET RH TO 0 IF JSR PC WORD\r
+;THE APR IS ALSO SET SO USER MAY DO IO IN USER MODE\r
+;TO SET USER MODE IO WITHOUT SETTING LOWER CORE, C(AC)=0\r
+;STOP TIME SHARING ONLY IF AC IS NON-ZERO(IE RUN ONLY JOB 1)\r
+\r
+INTERNAL FTTRPSET\r
+\r
+TRPSET:\r
+IFN FTTRPSET,<\r
+EXTERNAL JOBPD1,STOPTS\r
+\r
+       CAIE ITEM,1             ;IS THIS JOB 1?\r
+       POPJ PDP,               ;NO, ERROR RETURN\r
+       SETZM STOPTS            ;CLEAR THE STOP TIME SHARING FLAG\r
+       JUMPE TAC,TRPST1        ;IS AC 0?(DO NOT SET PI LOC IF YES)\r
+       HLRZ TAC1,TAC           ;NO, SET LOWER CORE\r
+       CAIL TAC1,40            ;IS IT LEGAL LOWER CORE ADR.?\r
+       CAIL TAC1,60\r
+       POPJ PDP,               ;NO, ERROR RETURN\r
+       SETOM STOPTS            ;SET STOP TIME SHARING FLAG, SO NO OTHER JOBS\r
+                               ; JOBS WILL RUN AND NO CORE SHUFFLING\r
+       HRLI TAC,PROG           ;YES, SET TO RELOCATE\r
+       MOVE TAC,@TAC           ;GET THE INSTR.\r
+       ADDI TAC,(PROG)         ;ADD RELOCATION SO WILL POINTER TO USER AREA\r
+       HRRZ    DAT,PROG        ;USER RELOCATION\r
+       ADDM    DAT,(TAC)               ;ALSO ADD RELOCATION TO WORD POINTED TO BY INSTR\r
+                               ; IN CASE IT IS A BLKI/BLKO POINTER WORD\r
+                               ; USER SHOULD RESET RH OF POINTER IF BLKI/BLKO INSTR\r
+                               ; OR CLEAR PC LOC IF JSR INSTR\r
+       EXCH TAC,(TAC1)         ;AND STORE IN MONITOR TRAP LOC.\r
+TRPST1:        AOS (PDP)               ;OK RETURN\r
+       MOVSI TAC1,4000         ;SET USER IO PC FLAG\r
+       IORM TAC1,JOBPD1(JDAT)  ;IN UUO RETURN PC\r
+>\r
+       JRST STOTAC             ;RETURN PREVIOUS CONTENTS OF PI LOC.\r
+\f\r
+;ROUTINE TO DISMISS INTERRUPT  FOR JOB DOING USER IO\r
+;WHEN PC IS IN EXEC MODE\r
+;NOTE  THE TRPJEN UUO HAS BEEN ELIMINATED\r
+;BECAUSE UUO HANDLER CANNOT BE INTERRUPTED AND REENTERED\r
+;INSTEAD INTERRUPTS IN USER MODE ARE DISMISSED\r
+;BY USING OP CODE 100 (UJEN) WHICH\r
+;TRAPS TO EXEC 61 INSTEAD OF 41 ON PDP-10'S\r
+;UJEN IS A NO-OP ON PDP-6'S AND SO THIS FACILTY IS GOOD ON PDP-10'S ONLY\r
+;CALL: RESTORE ALL EXEC ACS\r
+;              UJEN ADR        ;UJEN=100\r
+;              WHERE ADR CONTAINS PC STORED BY INTERRUPT JSR\r
+;              SEE UUO HANDLER (UUO2) FOR CODE\r
+\f;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE\r
+;TERM 'BUFFER HEADER' SHALL REFER TO THE 3 WORD HEADER\r
+;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR\r
+;REFERING TO THE RING BUFFERS.\r
+\r
+;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR\r
+;              ON EACH INPUT AND OUTPUT UUO).\r
+;              BIT 18-35=ADDRESS OF SECOND WORD OF THE\r
+;              CURRENT BUFFER IN RING WHICH USER IS REFERENCING\r
+;      WORD 2: BYTE POINTER TO CURRENT ITEM.\r
+;      WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON\r
+;              INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT).\r
+\r
+;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)\r
+\r
+;      WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVICES\r
+;      WORD 2: BIT 0=USE BIT FOR THIS BUFFER\r
+;              BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUFFER)/\r
+;              BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER IN RING\r
+;      WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAPE)\r
+;              RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY\r
+;              SET BY EXEC EXCEPT IF THE USER HAS SPECIFIED\r
+;              THAT HE WANTS TO COMPUTE WORD COUNT\r
+;              HIMSELF INSTEAD OF HAVING THE MONITOR DO IT\r
+;              USING THE BYTE POINTER IN THE 3 WORD HEADER).\r
+\r
+\r
+\r
+\r
+\r
+,CALLING SEQUENCE\r
+,      CLOSE D,\r
+,      EXIT            ALWAYS RETURNS HERE\r
+, THIS ROUTINES PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE\r
+,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS\r
+,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE \r
+,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH\r
+,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO\r
+,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE.\r
+,IN THE CASE OF OUTPUT DEVICES, THE CLOSE ROUTINE OF THE DEVICE HANDL-\r
+,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED.\r
+\fINTERNAL CLOSE1\r
+EXTERNAL PIOMOD\r
+\r
+CLOSE1:        PUSHJ PDP,WAIT1         ;WAIT UNTIL DEVICE IS INACTIVE\r
+       TRNN UUO,CLSIN          ;SUPPRESS INPUT CLOSE?\r
+       TLOE DEVDAT,ICLOSB      ;NO. INPUT ALREADY BEEN CLOSED?\r
+       JRST UCLS2              ;YES\r
+       LDB TAC,PIOMOD          ;NO\r
+       CAIGE TAC,SD            ;DUMP MODE?\r
+       JRST UCLSBI             ;NO. CLOSE BUFFERED INPUT.\r
+UCLS5: PUSHJ PDP,DCLI(DSER)    ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
+       JRST UCLS2              ;MUST NOT DESTROY UUO,DEVDAT,DSER,UCHN\r
+UCLSBI:        MOVE    TAC,DEVMOD(DEVDAT)\r
+       TLNE DEVDAT,INBFB+INPB  ;WAS AN INPUT BUFFER SETUP?\r
+       JRST UCLS4              ;YES\r
+       TLNE    TAC,DVDSK       ;CLOSING A DISK FILE ?\r
+       JRST    UCLS5           ;YES, DO DEVICE DEPENDENT CLOSE ANYWAY.\r
+       JRST    UCLS2           ;NO, CLOSE NOT NECESSARY.\r
+UCLS4: TLNE TAC,DVLNG          ;IS THIS A LONG DISPATCH TABLE?\r
+       PUSHJ PDP,DCLI(DSER)    ;YES, CLOSE INPUT\r
+       HRRZ TAC1,DEVBUF(DEVDAT)\r
+       HRLI TAC1,PROG\r
+       HRRZ DAT,@TAC1          ;FIRST WORD OF 3 WORD BUFFER HEADER\r
+       HRR TAC1,@TAC1          ;REMEMBER CURRENT BUFFER IN TAC1\r
+       HRLZI TAC,IOUSE         ;USED BOTH FOR HEADER AND EACH BUFFER\r
+       JUMPE DAT,UCLS1         ;HAS A RING BEEN SETUP?(NO IF 0)\r
+       HRLI DAT,PROG           ;YES\r
+       MOVEI AC1,(DAT)         ;IS ADDRESS SPECIFIED BY CONTENTS OF\r
+       PUSHJ PDP,UADRCK        ;FIRST WORD OF 3 WORD BUFFER HEADER IN BOUNDS?\r
+       SETZM AC1\r
+UCLS0: HRR DAT,@DAT            ;ADVANCE CURRENT INPUT BUFFER ADDRESS\r
+       CAIN AC1,(DAT)          ;IS THIS THE SAME BUFFER AS LAST ONE?\r
+       JRST UCLS1              ;YES. BAD RING. LOOPING ON ITSELF.\r
+       MOVEI AC1,(DAT)         ;IS ADDRESS OK?\r
+       PUSHJ PDP,UADRCK\r
+       ANDCAM TAC,@DAT         ;YES, CLEAR USE BIT.\r
+       CAME TAC1,DAT           ;DONE?\r
+       JRST UCLS0\r
+\fEXTERNAL USRJDA\r
+\r
+UCLS1: HRLI DAT,PROG\r
+       HRR DAT,DEVBUF(DEVDAT)\r
+       IORM TAC,@DAT           ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER\r
+       ADDI DAT,2              ;JBFCTR:=0\r
+       SETZM @DAT              ;CLEAR INPUT ITEM COUNT.\r
+       MOVE IOS,[XWD IOEND,IODEND]\r
+       ANDCAB IOS,DEVIOS(DEVDAT)\r
+UCLS2: TRNN UUO,CLSOUT         ;SUPPRESS OUTPUT CLOSE?\r
+       TLOE DEVDAT,OCLOSB      ;NO. OUTPUT ALREADY CLOSED?\r
+       JRST UCLS3              ;YES\r
+       IFN FT2REL,<\r
+       EXTERN RELSEG\r
+       PUSH PDP,UCHN\r
+       PUSHJ PDP,RELSEG        ;CLEAR SHARED SEG NAME IF FILE JUST CLOSED HAS\r
+                               ; EXTENSION .SHR AND SEG HAS SAME DIRECTORY AND NAME\r
+       POP PDP,UCHN\r
+>\r
+       LDB TAC,PIOMOD          ;NO.\r
+       CAIGE TAC,SD            ;DUMP MODE?\r
+       JRST UCLSBO             ;NO. CLOSE BUFFERED OUTPUT\r
+UCLS7: PUSHJ PDP,DCL(DSER)     ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
+       JRST UCLS3\r
+UCLSBO:        TLNN DEVDAT,OUTBFB+OUTPB        ;WAS AN OUTPUT BUFFER SET UP?\r
+       JRST UCLS6              ;NO\r
+       HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER?\r
+       HRLI DAT, PROG\r
+       SKIPG @DAT\r
+       JRST UCLS6              ;YES, DO NOT CLOSE UNLESS IT IS A DISK FILE\r
+UCLS2A:        MOVE    DSER,DEVSER(DEVDAT)\r
+       SKIPL @DEVOAD(DEVDAT)   ;NO, HAS SERVICE ROUTINE WRITTEN\r
+                               ; ITS NEXT BUFFER YET?\r
+       JRST UCLS2B             ;YES\r
+       TRZ     IOS,760000      ;NO,CLEAR ERROR BITS AND START OUTPUT DEVICE\r
+       PUSH PDP,UUO\r
+       PUSHJ   PDP,DOU(DSER)   ;CALL SERVICE ROUTINE TO DO OUTPUT\r
+       POP PDP,UUO\r
+       PUSHJ   PDP,WAIT1       ;WAIT TILL MOST BUFFERS FILLED\r
+       TRNN    IOS,760000      ;ERROR?\r
+       JRST UCLS2A             ;NO,RETURN WHEN ALL EMPTIED\r
+                               ; OR SHUFFLING REQUIRED STOPS DEVICE\r
+\f\r
+UCLS2B:        MOVE DSER,DEVSER(DEVDAT)\r
+       PUSHJ PDP,DCL(DSER)     ;CLOSE OUTPUT BUFFER\r
+       HLR DAT,DEVBUF(DEVDAT)\r
+       HRLI DAT,PROG\r
+       HRLZI TAC,IOUSE\r
+       IORM TAC,@DAT\r
+       ADDI DAT,2\r
+       SETZM @DAT              ;JBFCTR:=0\r
+       PUSHJ PDP,WAIT1\r
+       TLO DEVDAT,OCLOSB       ;SET OCLOSB AFTER OUTPUT IS COMPLETE\r
+UCLS3: HLLM DEVDAT,USRJDA(UCHN)\r
+       POPJ PDP,               ;EXIT THIS UUO\r
+\r
+UCLS6: MOVSI   TAC,DVDSK\r
+       TDNE    TAC,DEVMOD(DEVDAT)      ;CLOSING A DISK FILE ?\r
+       JRST    UCLS7           ;YES, DO DISK CLOSE ROUTINE IN ANY EVENT\r
+       JRST    UCLS3\r
+\f,CALLING SEQUENCE\r
+,      INBUF D,N\r
+,      EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
+,CALLING SEQUENCE\r
+,      OUTBUF D,N\r
+,      EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM FOR DEVICE\r
+, D AND INITIALIZES THE JOB BUFFER AREA HEADER:\r
+,      JBFADR0:=1,     JBFADR 1-17:=0\r
+,      JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING\r
+,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING\r
+,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING\r
+,BUFPNT IS RESTORED.\r
+\f      INTERNAL UINBF, UOUTBF\r
+       EXTERNAL PUUOAC,USRJDA\r
+\r
+\r
+UOUTBF:        TLO DEVDAT,OUTBFB       ;FLAG OUTBUF UUO DONE\r
+       PUSH PDP,BUFPNT         ;SAVE BUFPNT ON STACK\r
+       PUSHJ PDP,BUFCLC        ;SET UP BUFFER RING\r
+       HLR TAC,DEVBUF(DEVDAT)  ;TAC:=OUTPUT BUFFER AREA HEADER ADDRESS\r
+       HRRM BUFPNT,DEVOAD(DEVDAT)      ;DEVOAD:=ADDRESS OF FIRST BUFFER\r
+                               ; IN RING\r
+UOBF1: HRLI TAC,PROG           ;RELOCATE BUFFER AREA HEADER ADDRESS\r
+       MOVEM BUFPNT,@TAC       ;JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER\r
+                               ; IN RING\r
+       LDB TAC,PUUOAC\r
+       MOVEM DEVDAT,USRJDA(TAC)\r
+       POP PDP,BUFPNT          ;RESTORE BUFPNT FROM STACK\r
+       POPJ PDP,               ;EXIT THIS UUO\r
+UINBF: TLO DEVDAT,INBFB        ;FLAG INBUF UUO DONE\r
+       PUSH PDP,BUFPNT         ;SAVE BUFPNT ON STACK\r
+       PUSHJ PDP,BUFCLC        ;SET UP BUFFER RING\r
+       HRRM BUFPNT,DEVIAD(DEVDAT)      ;DEVIAD:=ADDRESS OF FIRST BUFFER\r
+                               ; IN RING\r
+       HRR TAC,DEVBUF(DEVDAT)  ;TAC:=INPUT BUFFER AREA HEADER ADDRESS\r
+       JRST UOBF1\r
+\f;OPEN UUO - PERFORMS SAME OPERATION AS INIT\r
+;MAY BE USED EASILY BY REENTRANT PROGRAMS\r
+;CALLING SEQUENCE FROM USER AREA\r
+;      OPEN D,ADR\r
+;      ERROR RETURN\r
+;      DEVICE INITED\r
+\r
+;LH(ADR)=0,RH(ADR)=DATA MODE THIS INIT\r
+;LH(ADR+1)=OUTPUT BUFFER HEADER ADDRESS\r
+;RH(ADR+1)=INPUT BUFFER HEADER ADDRESS\r
+;C(ADR+2,...,ADR+5)=SAME AS LOOKUP OR ENTER\r
+\r
+INTERNAL UOPEN\r
+\r
+UOPEN: PUSHJ PDP,GETWDU        ;SET TAC TO CONTENTS OF FIRST ARG(IO STATUS BITS)\r
+       AOJA UUO,UINIT0         ;MAKE UUO POINT TO ARG+1(WITH PROG STILL\r
+                               ; IN INDEX FIELD)\r
+\r
+\r
+,CALLING SEQUENCE\r
+,      INIT D,MODUS    D=JOB DEVICE CHANNEL\r
+,                      MODUS=IORDEL,IOCON,IOWC,MODE.\r
+,      SIXBIT/NAME/    DEVICE NAME\r
+,      XWD OBUF,IBUF   BUFFER AREA HEADER ADDRESSES\r
+,      EXIT1           DEVICE NOT AVAILABLE\r
+,      EXIT2           DEVICE PROPERLY ASSIGNED\r
+,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC,\r
+,   THE RIGHT HALF IS EITHER ZERO (SYSTEM WILL ASSIGN AN ARBITRARY\r
+,   UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED).\r
+,IF THE SELECTED DEVICE IS NOT AVAILABLE, CONTROL RETURNS TO EXIT1.\r
+,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS\r
+,CHANNEL D.  THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER\r
+,IOACT IS ZERO:\r
+,      IOBEG:=1\r
+,      DATA MODE:=BITS 32-35 OF AC UUO\r
+,      IOCON:=BIT 31 OF AC UUO\r
+,      IOWC:=BIT 30 OF AC UUO\r
+,      IORDEL:=BIT 29 OF AC UUO\r
+,      IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0\r
+,      JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS.\r
+,      DEVBUF:=OBUF,IBUF\r
+\fINTERNAL UINIT\r
+EXTERNAL STREQ,STUSER\r
+EXTERNAL USRJDA,USRHCU,SYSTAP,TPOPJ,TPOPJ1,IADPTR\r
+\r
+UINIT: MOVE TAC,UUO            ;SAVE FIRST ARG(IO STATUS BITS) IN TAC\r
+       HRR UUO,-1(PDP)         ;SET UUO TO ADR+1 OF USER ARGS\r
+       AOS -1(PDP)             ;SET RETURN SKIP THE 2 ARGUMENTS\r
+       AOS -1(PDP)\r
+UINIT0:        PUSH PDP,UUO            ;HERE ON OPEN UUO, SAVE ADR+1 OF USER ARGS\r
+       PUSH PDP,TAC            ;SAVE IO STATUS BITS(FIRST ARG)\r
+       SKIPE DEVDAT,USRJDA(UCHN)       ;IS A DEVICE ALREADY ASSIGNED TO THIS CHAN?\r
+       CAMLE UCHN,USRHCU       ;YES, IS THIS CHAN. LESS OR EQUAL TO HIGHEST\r
+                               ; CHAN. FOR THIS USER?\r
+       JRST UINITA             ;NO, NO PREVIOUS DEVICE TO RELEASE\r
+       PUSHJ PDP,RELEA0        ;RELEASE PREVIOUS DEVICE ON THIS CHAN.\r
+UINITA:        MOVE UUO,-1(PDP)        ;RESTORE UUO (ADR+1 OF 3 ARGS)\r
+       PUSHJ PDP,GETWDU        ;C(TAC)=DEVICE NAME IF IN BOUNDS\r
+                               ; DO NOT RETURN IF OUT OF BOUNDS(PRINT ERR AND STOP)\r
+                               ; SET ITEM TO CURRENT JOB NUMBER\r
+       PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE NAME\r
+                               ; (SET SYSDEV BIT IN LH OF\r
+                               ; DEVDAT IF THIS IS SYSTEM TAPE)\r
+       JRST UINITE             ;NO SUCH DEVICE\r
+       MOVE UUO,(PDP)          ;RESTORE USER'S MODE SETTING\r
+       PUSHJ   PDP,CHKMOD      ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
+       MOVE TAC,DEVNAM(DEVDAT) ;PHYSICAL DEVICE NAME\r
+       CAME TAC,[SIXBIT /DSK/] ;NOT DISK?\r
+       CAME TAC,SYSTAP         ;SYSTEM TAPE DEVICE?\r
+       JRST UINIT1             ;NO, DISK OR NOT SYSTEM TAPE\r
+       AOSE STREQ              ;SYSTEM TAPE, INCREMENT REQUEST COUNT\r
+       PUSHJ PDP,STWAIT        ;SYSTEM TAPE BUSY, PUT JOB IN WAIT\r
+       MOVEM ITEM,STUSER       ;SET THIS JOB AS ONLY USER OF SYSTEM TAPE\r
+                               ; CONTROL C DOES NOT STOP JOB WHILE USING S. T.\r
+UINIT1:        MOVE TEM,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
+       TLNN TEM,DVDTA          ;IS THIS DEVICE A DECTAPE?\r
+       JRST UINITB             ;NO\r
+       LDB TAC1,IADPTR         ;YES, GE NO OF USER CHANS DEV INITED ON\r
+       HRR TEM,TAC1            ;SAVE OLD NUMBER\r
+       AOS TAC1                ;INCREASE CHANNEL COUNT\r
+       CAIL TAC1,3             ;ANY MORE THAN JUST 2 CHANNELS?\r
+       JRST UINITE             ;YES, GIVE ERROR RETURN(POP TAC)\r
+       DPB TAC1,IADPTR         ;YES, STORE UPDATED CHANNEL COUNT FOR THIS DEVICE(DTA)\r
+UINITB:        MOVEI TAC1,ASSPRG       ;TRY TO ASSIGN IT BY PROGRAM\r
+       PUSHJ PDP,ASSASG\r
+       JRST UINIT6             ;NOT AVAILABLE, GIVE ERROR RETURN(POP TAC)\r
+       POP PDP,UUO             ;RESTORE USER'S MODE SETTING\r
+       PUSHJ PDP,SETIOS        ;SET DDB IOS STATUS WORD\r
+                               ; FROM RT. HALF OF AC UUO\r
+                               ; WAIT FOR DEVICES TO BECOME INACTIVE IN CASE IT IS\r
+                               ; INITED ON A DIFFERENT CHANNEL(OR MONITOR COMMAND\r
+                               ; RESPONSE ON TTY)\r
+       MOVSI IOS,IOBEG\r
+       IORB IOS,DEVIOS(DEVDAT)\r
+\fUINITL:       CAMG UCHN,USRHCU        ;IS THIS CHAN. .GT. HIGHEST CHAN. IN USE?\r
+       JRST UINITC             ;NO\r
+       AOS TAC,USRHCU          ;YES, BUMP HIGHEST SO FAR BY ONE\r
+       SETZM USRJDA(TAC)       ;AND CLEAR IT OUT\r
+       JRST UINITL             ;AND KEEP LOOKING\r
+\r
+UINITC:        TLO DEVDAT,INITB+ICLOSB+OCLOSB;SET INIT UUO BIT\r
+                               ;PREVENT SUPERFLUOUS CALLS TO CLOSE (SEE LOOKUP,ENTER)\r
+       AOS UUO,(PDP)           ;ADVANCE TO 3RD ARG(BUFFER HEADER)\r
+       PUSHJ PDP,GETWDU        ;C(TAC)=BUFFER HEADER ARG\r
+       HLRZ TAC1,TAC           ;OUTPUT BUFFER HEADER FROM USER\r
+       JUMPE TAC1,UINIT4       ;WAS ONE SPECIFIED?\r
+       HRLM TAC1,DEVBUF(DEVDAT);YES, SET DEVICE DATA BLOCK\r
+       TLO DEVDAT,OBUFB        ;SET OUTPUT BUFFER SPECIFIED BIT\r
+       PUSHJ PDP,UINITZ        ;INITIALIZE OUTPUT BUFFER HEADER\r
+UINIT4:        PUSHJ PDP,GETWDU        ;C(TAC)=BUFFER HEADER ARG FROM USER\r
+       HRRZ TAC1,TAC           ;INPUT BUFFER HEADER\r
+       JUMPE TAC1,UINIT5       ;WAS ONE SPECIFIED?\r
+       HRRM TAC1,DEVBUF(DEVDAT)        ;YES, SET DEVICE DATA BLOCK\r
+       TLO DEVDAT,IBUFB        ;SET INPUT BUFFER SPECIFIED BIT\r
+       MOVSI IOS,IOEND         ;CLEAR END OF FILE FLAG\r
+       ANDCAB IOS,DEVIOS(DEVDAT)       ;AND RETAIN IOS\r
+       PUSHJ PDP,UINITZ        ;INITIALIZE INPUT BUFFER HEADER\r
+UINIT5:        MOVEM DEVDAT,USRJDA(UCHN)       ;STORE UUO BITS AND  DEVICE\r
+                               ; DATA BLOCK ADDRESS\r
+       JRST TPOPJ1             ;SUCCESSFUL RETURN(POP TAC)\r
+\r
+UINIT6:        TLNE TEM,DVDTA          ;WAS DEVICE A DECTAPE?\r
+       DPB TEM,IADPTR          ;YES, RESTORE NO. OF USER CHAN INITED ON\r
+UINITE:        POP PDP,TAC             ;REMOVE IO STATUS ARG\r
+       JRST TPOPJ              ;AND GIVE ERROR RETURN AND POP TAC\r
+\f,CALLING SEQUENCE\r
+,      PUSHJ PDP,UINITZ\r
+,      EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED.\r
+,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS\r
+,IS IN AC TAC1.  ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE SIZE\r
+\r
+\r
+UINITZ:        HRLI TAC1,PROG          ;SET FOR RELOCATION\r
+       MOVEI AC1,2(TAC1)       ;CHECK 3RD WORD OF BUFFER HEADER\r
+       PUSHJ PDP,UADRCK\r
+       SETZM @TAC1             ;CLEAR FIRST WORD (CURRENT BUFFER) OF 3 WORD HEADER\r
+       AOS TAC1                ;POINT TO SECOND WORD (BYTE POINTER)\r
+       PUSH PDP,TAC1\r
+       AOS TAC1                ;POINT TO THIRD WORD (ITEM COUNT)\r
+       SETZM @TAC1             ;SET ITEM COUNT TO ZERO\r
+       PUSHJ PDP,SETBYT        ;SET BYTE SIZE ACCORDING TO MODE AS SET IN AC IOS\r
+       TLZ TAC,770077\r
+       POP PDP,TAC1\r
+       HLLM TAC,@TAC1          ;AND STORE IN SECOND WORD\r
+       POPJ PDP,               ;RETURN\r
+\f;LONG DISPATCH TABLE UUOS - GET HERE ONLY IF DEVICE HAS LONG\r
+;DISPACTH TABLE\r
+;DISPACTH TO DEVICE DEPENDENT SERVICE ROUTINE\r
+;ENTER UUO - ENTER FILE NAME IN DIRECTORY\r
+\r
+EXTERNAL USRJDA\r
+\r
+UDEN:  MOVEI TAC,CLSIN\r
+       TLNN DEVDAT,OCLOSB      ;FILE OPEN?\r
+       PUSHJ PDP,UDLKC         ;YES. CLOSE IT[OCLOSB_1]\r
+       TLO IOS,IOBEG\r
+       TRZ IOS,776000\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       HLLM DEVDAT,USRJDA(UCHN)        ;STORE UUO BITS\r
+       PUSHJ PDP,DEN(DSER)     ;ATTEMPT AN ENTER\r
+       POPJ PDP,               ;FAILURE\r
+       TLZ DEVDAT,OCLOSB\r
+       TLO DEVDAT,ENTRB                ;NOTE SUCCESSFUL ENTER\r
+       JRST DLKDEN             ;STORE THE PROGRESS BITS\r
+\r
+;LOOKUP UUO - LOOKUP FILE NAME IN DIRECTORY\r
+\r
+EXTERNAL USRJDA\r
+\r
+UDLK:  MOVEI TAC,CLSOUT        ;IN HIBIT OUTPUT CLOSE BIT\r
+       TLNN DEVDAT,ICLOSB      ;FILE OPEN?\r
+       PUSHJ PDP,UDLKC         ;YES. CLOSE IT[ICLOSB_1]\r
+       TDZ IOS,[XWD IOEND,776000]\r
+       MOVEM IOS,DEVIOS(DEVDAT)\r
+       HLLM DEVDAT,USRJDA(UCHN)        ;STORE UUO BITS\r
+       PUSHJ PDP,DLK(DSER)     ;ATTEMPT A LOOKUP\r
+       POPJ PDP,               ;FAILURE\r
+       TLZ DEVDAT,ICLOSB\r
+       TLO DEVDAT,LOOKB        ;NOTE SUCCESSFUL LOOKUP\r
+DLKDEN:        LDB TAC,PUUOAC          ;GET CHANNEL #\r
+       HLLM DEVDAT,USRJDA(TAC) ;STORE UUO PROGRESS BITS\r
+       JRST CPOPJ1             ;SUCCESS RETURN TO USER (CALL+2)\r
+\r
+INTERNAL UDLKC\r
+\r
+UDLKC: PUSH PDP,UUO\r
+       HRRI    UUO,(TAC)\r
+       PUSHJ PDP,CLOSE1\r
+       POP PDP,UUO\r
+       JRST    WAIT1\r
+\f;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO\r
+INTERNAL FT2REL\r
+\r
+EXTERNAL CPOPJ1\r
+\r
+URENAM:        MOVE TAC,DEVMOD(DEVDAT) ;IS THIS DEVICE A LONG DISPATCH TABLE?\r
+       TLNN TAC,DVLNG\r
+       JRST CPOPJ1             ;NO, GIVE SKIP RETURN TO USER\r
+IFE FT2REL,<\r
+       JRST DRN(DSER)          ;YES, DISPATCH TO SERVICE ROUTINE\r
+>\r
+IFN FT2REL,<\r
+       EXTERN RELSG1\r
+       PUSHJ PDP,DRN(DSER)     ;TRY TO RENAME (SERVICE ROUTINE)\r
+       POPJ PDP,               ;ERROR,ERROR RETURN TO USER\r
+       JRST RELSG1             ;SUCCESSFUL RENAME, GO ZERO SHARABLE SEG NAME\r
+                               ; IF NEW FILE EXT IS .SHR AND FILE NAME\r
+                               ; FIND DIRECTORY (DEVICE) ARE SAME AS SHARABLE SEG\r
+                               ; ALWAYS SKIP RETURN\r
+>\r
+\r
+;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER(DECTAPE)\r
+\r
+UDSO:  JRST DSO(DSER)\r
+\r
+;SETI UUO - SET NEXT INPUT BLOCK NUMBER\r
+\r
+UDSI:  JRST DSI(DSER)\r
+\r
+;GETF UUO - GET NEXT FREE BLOCK\r
+\r
+UDGF:  JRST DGF(DSER)\r
+\r
+;MTAPE UUO - MAGTAPE OPERATIONS\r
+\r
+UMTAPE:        JRST DMT(DSER)\r
+\r
+;UTPCLR - CLEAR DECTAPE DIRECT.\r
+\r
+UTPCLR:        MOVE TAC,DEVMOD(DEVDAT) ;IS THIS A LONG DISPATCH TABLE?\r
+       TLNN TAC,DVLNG\r
+       POPJ PDP,               ;NO,RETURN\r
+       JRST DCLR(DSER)         ;YES, DISPATCH\r
+\f;INPUT UUO\r
+\r
+;1)  IF OUTPUT ACTIVE ON THIS CHANNEL, WAIT FOR IT TO COMPLETE.\r
+;2)  IF DUMP MODE, WAIT FOR DEVICE INACTIVE, CALL SERVICE\r
+;      ROUTINE TO START INPUT, WAIT TILL COMPLETE, THEN RETURN TO USER.\r
+;3)  IF NO BUFFER RING SETUP, SET UP 2 RING BUFFER.\r
+;4)  IF FIRST REFERENCE, START SERVICE ROUTINE, GO TO\r
+;5)  FLAG CURRENT BUFFER AS FREE TO RECEIVE MORE INPUT\r
+;      (USE BIT SET TO 0).\r
+;      START SERVICE ROUTINE FILLING FIRST BUFFER WITH USE BIT 0\r
+;      (NEXT BUFFER OR ONE AHEAD OF IT)\r
+;      (SERVICE ROUTINE WILL SET USE BIT WHEN IT FINISHES FILLING\r
+;      BUFFER).\r
+;7)  IF NEXT INPUT BUFFER IS FULL OF DATA, GO TO 10).\r
+;8)  PUT JOB IN IO WAIT TILL NEXT BUFFER FILLED.\r
+;9)  IF NEXT INPUT BUFFER STILL NOT FILLED, CHECK FOR END\r
+;      OF FILE OR ERROR BITS SET BY SERVICE ROUTINE.\r
+;10) CONVERT WORD COUNT AS STORED BY SERVICE ROUTINE IN THIRD\r
+;      WORD OF BUFFER TO ITEM COUNT AND STORE IN THIRD WORD\r
+;      OF HEADER (ITEM COUNT) ALSO SET BYTE POINTER (SECOND\r
+;      WORD OF HEADER) AND RETURN TO USER.\r
+\fINTERNAL IN\r
+EXTERNAL USRJDA,PIOMOD\r
+\r
+IN:    TLNE IOS,IO             ;IS THIS DEVICE ALREADY DOING OUTPUT?\r
+       PUSHJ PDP,WAIT1         ;YES, WAIT TILL IT IS FINISHED.\r
+       TLO DEVDAT,INPB         ;FOR THIS DEVICE.\r
+       TLZ DEVDAT,ICLOSB\r
+       HLLM DEVDAT,USRJDA(UCHN)        ;IN LH OF CURRENT JOB DEVICE CHANNEL\r
+       LDB TAC,PIOMOD          ;IO MODE\r
+       CAIL TAC,SD             ;IT THE IO MODE DUMP(SD,D,DR)?\r
+       JRST INDMP              ;YES\r
+IN1:   HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF BUFFER HEADER\r
+       HRLZI TAC,IOUSE         ;BUFFER INUSE BIT\r
+       HRLI JBUF,PROG          ;SET INDEX FIELD FOR RELOCATION USING AC PROG\r
+       MOVEI AC1,2(JBUF)       ;CHECK BUFFER HEADER\r
+       PUSHJ PDP,UADRCK\r
+       MOVE IOS,DEVIOS(DEVDAT) ;SETUP IO STATUS AGAIN FORM FROM MEMORY\r
+                               ; AC IOS IS CLOBBERED BY AUTOMATIC CORE EXPANSION\r
+                               ; ON AN IMPLICIT INBUF ON FIRST INPUT\r
+       MOVE TAC1,@JBUF         ;GET WORD 1 OF 3 WORD BUFFER HEADER.\r
+       HRLI TAC1,PROG          ;SET INDEX FIELD COR RELOCATION USING AC PROG\r
+       SKIPG @JBUF             ;HAS A BUFFER RING BEEN SET UP (RH NON-ZERO)\r
+                               ; WHICH HAS BEEN REFERENCED BY PREVIOUS INPUT (BIT0=0)\r
+       JRST INPUTF             ;NO. GO SET UP BUFFER IF NECESSARY AND DO FIRST IO\r
+       HRRZ AC1,TAC1           ;YES, CHECK ADR. TO SEE IF OK\r
+       PUSHJ PDP,UADRCK\r
+       MOVE    IOS,DEVIOS(DEVDAT)\r
+       TDNN    TAC,@TAC1\r
+       JRST    INPT1\r
+       ANDCAB TAC,@TAC1        ;FLAG CURRENT BUFFER AS FREE TO\r
+                               ; RECEIVE MORE INPUT, CLEAR USE BIT\r
+                               ; AND GET POINTER TO NEXT BUFFER\r
+       HRRM TAC,@JBUF          ;SET WORD 1 IN 3 WORD HEADER TO NEXT BUFFER\r
+       HRRZ AC1,TAC            ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS\r
+       PUSHJ PDP,UADRCK\r
+       TRNE IOS,IOACT          ;IS THE DEVICE ALREADY ACTIVE\r
+       JRST INPT0C             ;YES\r
+       MOVE AC1,DEVMOD(DEVDAT) ;GET DEVICE CHARACTERISTIC WORD\r
+       HRLI TAC,PROG           ;SET FOR RELOCATION\r
+       TLNN AC1,DVTTY          ;IS IT A TTY?\r
+       HRR TAC,@TAC            ;GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER\r
+                               ; IF NOT TTY.\r
+       HRRZ AC1,TAC            ;SEE IF USER HAS CLOBBERED POINTER\r
+       PUSHJ PDP,UADRCK\r
+       SKIPL @TAC              ;IS THE USE BIT SET?\r
+       PUSHJ PDP,CALIN         ;NO, START SERVICE ROUTINE FILLING EMPTY BUFFER\r
+INPT0C:        HRR TAC1,@TAC1          ;GET USE BIT FOR NEXT BUFFER\r
+INPT0A:        SKIPGE @TAC1            ;IS USE BIT SET YET?(BUFFER FILLED YET?)\r
+       JRST INPUT2             ;YES, RETURN IMMEDIATELY TO USER\r
+\fINPT2:        PUSHJ PDP,WSYNC         ;NO, PUT JOB IN IO WAIT TILL BUFFER FILLED.\r
+       SKIPL @TAC1             ;RETURN WHEN BUFFER FILLED. CHECK TO MAKE SURE.\r
+       JRST INEOF              ;NO, MUST BE EOF OR ERROR\r
+INPUT2:        ADDI TAC1,1             ;YES, GET WORD COUNT AS SET BY IO SERVICE\r
+       HRRZ ITEM,@TAC1         ;RH OF 3RD WORD(FIRST SO-CALLED DATA WORD)\r
+       SOJA TAC1,IOSETC        ;SET ITEM COUNT AND BYTE POINTER\r
+                               ; IN 3 WORD HEADER AND RETURN TO USER\r
+\r
+INPT1: TRNN    IOS,IOACT\r
+       PUSHJ   PDP,CALIN\r
+       JRST    INPT2\r
+\r
+\r
+INEOF: TDNN IOS,[XWD IOEND,IODERR+IOBKTL+IODTER+IOIMPM]\r
+                               ; EOF OR ERROR BIT SET BY SERVICE ROUTINE\r
+       JSP     DAT,UUOERR      ;NO,MONITOR ERROR AT UUO LEVEL\r
+       TLNE IOS,IOEND          ;IS THIS EOF?\r
+       TRO IOS,IODEND          ;YES, SET USER EOF BIT.\r
+       IORM IOS,DEVIOS(DEVDAT)\r
+       POPJ PDP,               ;RETURN TO USER'S PROGRAM\r
+\r
+\r
+\r
+;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT\r
+INPUTF:        ANDCAB TAC,@JBUF        ;MARK THAT BUFFERS HAVE BEEN REFER\r
+                               ; BY CLEARING SIGN BIT OF 1ST WORD IN 3 WORD\r
+                               ; IN 3 WORD BUFFER HEADER\r
+       JUMPE TAC,INPUT3        ;HAS A RING BEEN SET UP YET?\r
+       HRRZ AC1,TAC1           ;YES ADDRESS CHECK FIRST USER BUFFER\r
+       PUSHJ PDP,UADRCK        ;\r
+       SKIPG @TAC1             ;IS USE BIT SET IN FIRST USER INPUT BUFFER?\r
+                               ; CAN HAPPEN IF TTY AND USER HAS TYPED\r
+                               ; IN LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO\r
+       JRST INPUT2             ;YES, DO NOT CALL SERVICE ROUTINE(SCNSER)\r
+                               ; SINCE USER BUFFER ALREADY HAS DATA\r
+       HRRM TAC,DEVIAD(DEVDAT) ;YES, STORE ADR. OF 2ND WORD OF\r
+                               ; A BUFFER FOR SERVICE ROUTINE\r
+       PUSHJ PDP,CALIN         ;YES. GO START IO SERVICE ROUTINE\r
+                               ; FILLING BUFFER\r
+       JRST INPT0A\r
+INPUT3:        HRRI UUO,2              ;BUFFERS NOT SETUP YET.\r
+                               ; SET UP 2\r
+       PUSHJ PDP, UINBF\r
+       HLLZS UUO               ;CLEAR RIGHT HALF\r
+       JRST IN1\r
+\r
+\r
+INDMP: PUSHJ PDP,WSYNC         ;INPUT DUMP\r
+       PUSHJ PDP,DDI(DSER)     ;CALL SERVICE ROUTINE\r
+       JRST WAIT1              ;THEN WAIT TILL IO  FINISHED BEFORE\r
+                               ; RETURNING TO USER.\r
+\f\r
+EXTERNAL JOBPFI,USRREL\r
+\r
+CALIN: TLNE IOS,IOEND\r
+       POPJ PDP,\r
+       PUSH PDP,TAC1\r
+       PUSH PDP,JBUF\r
+       HRRZ AC1,DEVIAD(DEVDAT) ;IS FIRST ADR. ABOVE JOB DATA AREA?\r
+       CAIG AC1,JOBPFI\r
+       JRST ADRERR             ;NO, PRINT ERROR AND STOP JOB\r
+       HLRZ AC2,@DEVIAD(DEVDAT)        ;GET LENGTH OF BUFFER\r
+       TRZ AC2,IOUSE           ;CLEAR USE BIT IN CASE IT IS ON(TTY)\r
+       ADD AC1,AC2\r
+       CAMLE AC1,USRREL        ;IS LAST ADDRESS IN BOUNDS?\r
+       JRST ADRERR             ;NO, STOP JOB AND PRINT ERROR\r
+       PUSHJ PDP,DIN(DSER)     ;DISPATCH TO IO SERVICE ROUTINE\r
+       POP PDP,JBUF\r
+       POP PDP,TAC1\r
+       POPJ PDP,\r
+\f,CALLING SEQUENCE\r
+,     OUTPUT D,\r
+,     EXIT\r
+,OR\r
+,     OUTPUT D, ADR\r
+,     EXIT\r
+\r
+,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE.\r
+,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO OR SETSTS UUO\r
+,   THE PROGRAM WAITS UNTIL THE DEVICE IN INACTIVE AND THEN\r
+,   WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USER'S PROGRAM\r
+,   WHEN IO HAS COMPLETED.\r
+,IF THE MODE IS NOT DUMP, THEN\r
+,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET THE\r
+,   CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0)\r
+,   SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM THE\r
+,   USER'S PROGRAM BY AN INPUT OR AN OUTPUT UUO.  OTHERWISE, GO TO\r
+,   2) DIRECTLY.\r
+\r
+,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE\r
+,   BUFFER IS CLEARED, IOUSE SET TO ZERO AND\r
+,      IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SET UP.\r
+,      THEN GO TO 8\r
+,\r
+,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0  ,THEN A CHECK IS\r
+,   MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED.\r
+,      IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL\r
+,      TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE\r
+,      BUFFER MINUS ONE.\r
+\r
+,4) IOUSE IS SET TO ONE, INDICATING THAT THE BUFFER IS FULL OR BEING\r
+,   EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED.\r
+\r
+,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED.\r
+,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1),\r
+,   THE PROGRAM WAITS UNTIL THE DEVICE FINISHES THE BUFFER\r
+,   (THE OUTPUT SERVICE ROUTINE CLEARS THE USE BIT WHEN\r
+,   IT FINISHES OUTPUTTING A BUFFER).\r
+,7) THE CURRENT BUFFER IS CLEARED.\r
+,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1\r
+,   AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE\r
+,   MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE.\r
+,9) RETURN TO THE USER'S PROGRAM\r
+\f;HERE ON OUTPUT UUO\r
+EXTERNAL USRJDA,PIOMOD\r
+\r
+UOUT:  TLO DEVDAT,OUTPB        ;SET OUTPUT UUO BIT\r
+       TLZ DEVDAT,OCLOSB       ;CLEAR CLOSE OUTPUT BIT\r
+\r
+;HERE FROM DEVICE SERVICE ROUTINES ON CLOSE UUO\r
+\r
+INTERNAL OUT\r
+\r
+OUT:   TLNN IOS,IO             ;IS THIS DEVICE ALREADY DOING INPUT?\r
+       PUSHJ PDP,WAIT1         ;YES, WAIT TILL IT BECOMES INACTIVE\r
+       HLLM DEVDAT,USRJDA(UCHN);SAVE NEW BIT SETTINGS.\r
+       LDB TAC,PIOMOD          ;GET DATA MODE SET BY INIT OR SETSTS.\r
+       CAIL TAC,SD             ;IS IT DUMP MODE(SD,DR,D)?\r
+       JRST OUTDMP             ;YES.\r
+       PUSHJ PDP,OUTA          ;NO, CHECK FOR NON-ZERO ADDRESS(USER\r
+                               ; CHANGING RING)\r
+       HLR JBUF,DEVBUF(DEVDAT) ;REL. ADDR. OF OUTPUT BUFFER HEADER\r
+       MOVEI AC1,2(JBUF)       ;CHECK END OF 3 WORD HEADER\r
+       PUSHJ PDP,UADRCK\r
+       HRLI JBUF,PROG          ;SET INDEX FIELD FOR RELOCATION.\r
+       SKIPG TAC1,@JBUF        ; CHECK FIRST WORD OF BUFFER HEADER\r
+       JRST OUTF               ;RING NOT SET UP OR FIRST REFERENCE TO RING\r
+       AOS JBUF                ;COMPUTE WORD COUNT FROM BYTE POINTER\r
+       HRRZ TAC,@JBUF          ;GET RH OF BYTE POINTER.\r
+       ADDI TAC1,1             ;REL. ADDR. OF 3RD WORD IN BUFFER.\r
+       SKIPE   TAC\r
+       SUB TAC,TAC1            ;DISTANCE FILLED BY USER.\r
+       HRLI TAC1,PROG\r
+       TRNE IOS,IOWC           ;DOES USER WANT SYSTEM TO COMPUTE WORD\r
+                               ; COUNT FROM BYTE POINTER?\r
+       JRST OUT2               ;NO.\r
+       HRRZ AC1,TAC1           ;PROCEED ONLY IF ADDR. OF WORD COUNT IN BOUNDS\r
+       ADDI    AC1,(TAC)       ;FORM REL. ADR OF LAST WORD TO OUTPUT\r
+       PUSHJ PDP,UADRCK\r
+       HRRM TAC,@TAC1          ;YES, STORE WORD COUNT IN 3RD WORD OF BUFFER.\r
+\fOUT2: SUBI JBUF,1             ;REL. ADDR. OF 1ST WORD IN HEADER\r
+                               ; (POINTER TO CURRENT BUFFER).\r
+       SUBI TAC1,1                     ;REL. ADDR. OF 2ND WORD IN BUFFER\r
+                                       ; (LINK TO NEXT BUFFER).\r
+       HRLZI TAC,IOUSE         ;FLAG CURRENT BUFFER CONTAINS ACTIVE DATA.\r
+       IORB TAC,@TAC1\r
+       HRRM TAC,@JBUF          ;ADVANCE CURRENT BUFFER ADDRESS\r
+       MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
+       TRNN IOS,IOACT\r
+       PUSHJ PDP,DOU(DSER)     ;NO,START OUTPUT.\r
+       HLR JBUF,DEVBUF(DEVDAT) ;JBUF TO REL. ADDR. OF BUFFER HEADER\r
+       HRLI JBUF,PROG          ;SET TO RELOCATE\r
+       MOVE TAC1,@JBUF         ;TAC1 TO REL. ADDR. OF 2ND WORD OF BUFFER.\r
+       HRRZ AC1,TAC1\r
+       PUSHJ PDP,UADRCK\r
+       HRLI TAC1,PROG\r
+       MOVEI   TAC,@JBUF\r
+       HLLZS   1(TAC)\r
+       SKIPG @TAC1             ;HAS SERVICE ROUTINE EMPTIED NEXT BUFFER\r
+                               ; YET (USE BIT = 0)?\r
+       PUSHJ PDP,WSYNC         ;NO, WAIT.\r
+       JRST OUTS               ;RETURN TO USER.\r
+\r
+\r
+OUTF:  SKIPE TAC1,@JBUF\r
+       JRST OUTF1\r
+       HRRI UUO,2\r
+       PUSHJ PDP,UOUTBF\r
+       HLR JBUF,DEVBUF(DEVDAT)\r
+       HRLI JBUF,PROG\r
+OUTF1: HRLZI TAC, IOUSE\r
+       ANDCAB TAC, @JBUF       ;IOUSE:=0\r
+       HRRM TAC,DEVOAD(DEVDAT)\r
+OUTS:  HRRZ TAC,@JBUF          ;CLEAR NEXT OUTPUT BUFFER.\r
+       PUSHJ PDP,BUFCLR        ;BEING CLEARED.\r
+       JRST ADRERR             ;ADDRESS CHECK\r
+       HRR TAC1,@JBUF\r
+       HRLI TAC1,PROG\r
+       LDB ITEM,[POINT 17,@TAC1,17]\r
+       SOJA ITEM,IOSETC\r
+                               ; ADDRESS+1\r
+                               ; JBFCTR:=(BUFFER SIZE-1)*[36/BYTE\r
+                               ; SIZE]\r
+                               ; RETURN TO USER'S PROGRAM\r
+\r
+OUTDMP:        PUSHJ PDP,WSYNC\r
+       PUSHJ PDP,DDO(DSER)\r
+       JRST WAIT1              ;WAIT BEFORE RETURNING TO USER\r
+\f\r
+,CALLING SEQUENCE:\r
+,      PUSHJ PDP,OUTA\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT.\r
+,IF IOACT=1, WAIT FOR IOACT=0.\r
+,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT.\r
+\r
+       INTERN OUTA\r
+OUTA:  TRNN UUO,777774         ;IS BUFFER ADDRESS SPECIFIED?\r
+       POPJ PDP,               ;NO\r
+       PUSHJ PDP,WAIT1\r
+       HLR JBUF,DEVBUF(DEVDAT)\r
+       HRLI JBUF,PROG\r
+       HRRM UUO,@JBUF\r
+       HRRM UUO,DEVOAD(DEVDAT)\r
+       HRLZI TAC,IOUSE\r
+       ANDCAM TAC,@JBUF\r
+       POPJ PDP,               ;RETURN\r
+\f,RELEASE A DEVICE\r
+\r
+INTERNAL RELEA1,RELEA2,RELEA3,RELEA5,RELEA6,RELEA9\r
+EXTERNAL USRJDA,USRHCU,CPOPJ,SYSTAP,STUSER,STREQ,STAVAL,PJOBN,IADPTR\r
+\r
+RELEA0:\r
+RELEA2:RELEA3:\r
+RELEA1:        TRZ UUO,-1              ;CLOSE BOTH INPUT AND OUTPUT\r
+       PUSHJ PDP,CLOSE1\r
+       PUSHJ PDP,WAIT1         ;WAIT FOR DEVICE TO BECOME INACTIVE\r
+RELEA5:        PUSHJ PDP,DRL(DSER)     ;DISPATCH TO DEVICE SERVICE ROUTINE\r
+       MOVEI IOS,IOACT         ;CLEAR IO ACTIVE BIT\r
+       ANDCAB IOS,DEVIOS(DEVDAT)       ;AND RETURN WITH IOS SET\r
+       LDB TAC1,IADPTR         ;GET COUNT OF NO OF CHANS DEVICE ON(IF DTA)\r
+       SOS TAC1                ;COUNT DOWN BY ONE\r
+       MOVE TAC,DEVMOD(DEVDAT)\r
+       TLNE TAC,DVDTA          ;DEVICE A DTA?\r
+       DPB TAC1,IADPTR         ;YES, STORE UPDATED COUNT\r
+       SETZB DAT,USRJDA(UCHN)  ;CLEAR DEVICE ASSIGNMENT\r
+       MOVE TAC,USRHCU         ;HIGHEST IO CHANNEL IN USE\r
+RELEA4:        HRRZ TAC1,USRJDA(TAC)\r
+       JUMPN DAT,RELE4A        ;NON-ZERO CHAN. ALREADY?\r
+       MOVE DAT,TAC1           ;NO, SET DAT WHEN FIRST(HIGHEST) FOUND\r
+       MOVEM TAC,USRHCU        ;STORE HIGHEST IN USE CHANNEL\r
+RELE4A:        CAIE TAC1,(DEVDAT)      ;IS THIS DEVICE SAME AS ONE BEING RELEASED?\r
+       SOJGE TAC,RELEA4\r
+       JUMPGE TAC,CPOPJ        ;EXIT IF ON ANOTHER CHANNEL\r
+       HLLZS DEVIAD(DEVDAT)    ;CLEAR INPUT BUFFER ADDRESS\r
+       HLLZS DEVOAD(DEVDAT)    ;AND OUTPUT BUFFER ADDRESS.\r
+\f;CALLED FROM ERROR STOP ROUTINE(ESTOP)\r
+RELEA9:        MOVE TAC,DEVNAM(DEVDAT) ;IS THIS SYSTEM TAPE?\r
+       CAME TAC,[SIXBIT /DSK/] ;DSK IS NEVER QUEUED\r
+       CAME TAC,SYSTAP\r
+       JRST RELEA7             ;IS DISK OR NOT SYSTEM TAPE\r
+       SKIPN STUSER            ;HAS COUNT ALREADY BEEN REDUCED AT ESTOP?\r
+       JRST RELEA7             ;YES\r
+       SETZM STUSER            ;YES, CLEAR SYSTEM USER NO.\r
+       SOSL STREQ              ;YES, REDUCE COUNT\r
+       SETOM STAVAL            ;SOMEONE IS WAITING, SET AVAILABLE FLAG/\r
+RELEA7:        MOVEI TAC1,ASSPRG       ;CLEAR ASSIGNED BY PROGRAM BIT\r
+RELEA6:        ANDCAB TAC1,DEVMOD(DEVDAT)      ;CALLED FROM DEASSIGN\r
+       TRZ TAC1,777            ;CLEAR JOB NO. FIELD\r
+INTERNAL FTDISK\r
+IFE FTDISK,<\r
+               TDNN TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
+               DPB TAC1,PJOBN  ;CLEAR JOB NUMBER IF ALL 3 BITS OFF\r
+               POPJ PDP,       ;IE ASSIGNED BY CONSOLE,PROGRAM, OR\r
+>\r
+IFN FTDISK,<EXTERNAL CLRDDB,IPOPJ\r
+       TDNE TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
+       POPJ PDP,               ;DEVICE ASSIGNED BY OTHER MEANS TOO\r
+       DPB TAC1,PJOBN          ;CLEAR JOB NUMBER\r
+       PUSH PDP,ITEM           ;SAVE JOB NO.\r
+       TLNE TAC1,DVDSK         ;IS DEVICE A DSK\r
+       PUSHJ PDP,CLRDDB        ;YES-RETURN DDB TO STORAGE\r
+       JRST IPOPJ              ;RESTORE JOB NO. & RETURN.\r
+>\r
+\f\r
+,CALLING SEQUENCE\r
+,      STATO D,MASK\r
+,      EXIT1           ALL SELECTED BITS ARE 0\r
+,      EXIT2           SOME SELECTED BITS ARE 1\r
+,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH\r
+,ARE SELECTED BY MASK.\r
+\r
+\r
+       INTERN USTATO\r
+USTATO:        TRNE IOS,(UUO)          ;SKIP IF ANY INDICATED BITS ARE ONE\r
+       AOS (PDP)\r
+       POPJ PDP,               ;RETURN TO USER\r
+\r
+\r
+,CALLING SEQUENCE\r
+,      STATUS D,ADR\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.\r
+\r
+\r
+INTERN USTATS\r
+\r
+\r
+USTATS:        HRRZ TAC,IOS            ;GET USER HALF OF IOS.\r
+       JRST STOTAC             ;ADDRESS CHECK AND STORE IN USER AREA\r
+\r
+\r
+,CALLING SEQUENCE\r
+,      STATZ D,MASK\r
+,      EXIT1           SOME SELECTED BITS ARE 1\r
+,      EXIT2           ALL SELECTED BITS ARE 0\r
+\r
+,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S\r
+,CHANNEL D WHICH ARE SELECTED BY MASK.\r
+\r
+       INTERN USTATZ\r
+\r
+USTATZ:        TRNN IOS,(UUO)          ;SKIP IF ALL INDICATED BITS ARE ZERO\r
+       AOS (PDP)\r
+       POPJ PDP,               ;RETURN TO USER\r
+\f;IN UUO - LIKE INPUT  SKIPS IF  EOF OR ERRORS\r
+\r
+INTERNAL TIN\r
+\r
+TIN:   PUSHJ PDP,IN            ;DO INPUT UUO\r
+       TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND\r
+       AOS (PDP)\r
+       POPJ PDP,\r
+\r
+\r
+;OUT UUO - LIKE OUTPUT  -  SKIPS IF ERRORS\r
+\r
+INTERNAL TOUT\r
+\r
+TOUT:  PUSHJ PDP,UOUT          ;DO OUTPUT UUO\r
+       TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM\r
+       AOS (PDP)\r
+       POPJ PDP,\r
+\r
+\r
+;5 UUOS FOR EACH INSTALLATION TO DEFINE\r
+;OPCODES 42-46\r
+\r
+\r
+\fSUBTTL        IOCSS - COMMON IO SUBROUTINES\r
+\r
+;ROUTINE TO ADVANCE OUTPUT BUFFER AT INTERRUPT LEVEL\r
+\r
+;CALL: PUSHJ PDP,ADVBFE\r
+,      EXIT1           RETURN IF NEXT BUFFER IS EMPTY\r
+,      EXIT2           RETURN IF NEXT BUFFER IS FULL\r
+,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE\r
+,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK\r
+,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
+,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.\r
+;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO\r
+;MAKE SURE IT IS NOT IN JOB DATA AREA OR ABOVE USER AREA\r
+;THE SECOND WORD OF CURRENT BUFFER WAS CHECKED AT UUO LEVEL\r
+;OR PREVIOUS CALL TO ADVBFE\r
+\r
+INTERNAL ADVBE1,ADVBFE\r
+EXTERNAL XJBPFI,CPOPJ\r
+\r
+ADVBFE:        MOVEI TAC1,@DEVOAD(DEVDAT)      ;ABS. ADR. OF 2ND WORD OF LAST BUF.\r
+       JUMPE TAC1,CPOPJ        ;HAS DEVOAD BEEN CLEARED BY RELEASE?\r
+       MOVEM IOS,-1(TAC1)      ;NO. STORE IO STATUS WORD(ERROR BITS)\r
+                               ; IN FIRST WORD OF BUFFER\r
+       MOVSI TAC,IOUSE         ;IOUSE:=0\r
+       ANDCAB TAC,(TAC1)       ;CLEAR USE BIT IN 2ND WORD\r
+                               ; ADRESS CHECKED WHEN STORED IN DEVOAD\r
+                               ; DEVICE ACTIVE SINCE THEN\r
+       HRLZ TAC,TAC            ;NEXT BUFFER ADR. TO LH\r
+       CAMLE TAC,XJBPFI        ;IS IT IN IO PROTECTED PART OF JOB DATA AREA?\r
+       CAML TAC,PROG           ;NO, IS IT GREATER OR EQUAL TO LAST WORD IN USER AREA?\r
+       POPJ PDP,               ;YES, DO NOT STORE NEXT ADDRESS\r
+                               ; CATCH ERROR LATER AT UUO LEVEL\r
+       HLRM TAC,DEVOAD(DEVDAT) ;NOW SAFELY STORE NEXT BUFFER ADRESS\r
+\r
+;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET\r
+\r
+ADVBE1:        SKIPL @DEVOAD(DEVDAT)   ;IS IOUSE=0?\r
+       POPJ PDP,               ;EXIT1. BUFFER IS EMPTY\r
+       JRST ADVBF1     ;GO SEE IF USER TYPED CONTROL C\r
+                               ; OR EXEC IS WAITING TO SHUFFLE JOB\r
+\f\r
+;ROUTINE TO ADVANCE INPUT BUFFER AT INTERRUPT LEVEL\r
+\r
+;CALL: PUSHJ PDP,DEVBFF\r
+,      EXIT1           RETURN IF NEXT BUFFER IS FULL\r
+,      EXIT2           RETURN IF NEXT BUFFER IS EMPTY\r
+,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE\r
+,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK\r
+,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
+,UPON RETURN, SKIPS IF THE NEXT BUFFER IS EMPTY.\r
+;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO MAKE SURE\r
+;IT IS NOT IN IO PROTECTED PART OF JOB DATA AREA OR ABOVE\r
+;USER AREA\r
+;ALSO END OF BUFFER IS CHECKED TO MAKE SURE NOT ABOVE JOB AREA\r
+\r
+INTERNAL ADVBFF\r
+EXTERNAL XJBPFI,PJOBN,JBTSTS,CPOPJ\r
+\r
+ADVBFF:        MOVEI TAC1,@DEVIAD(DEVDAT)      ; ABS. ADR. OF LAST INPUT BUFFER\r
+       JUMPE TAC1,CPOPJ        ;HAS DEVIAD BEEN CLEARED BY RELEASE?\r
+       MOVEM IOS,-1(TAC1)      ;NO. STORE IOS WORD IN FIRST WORD OF BUF.\r
+       MOVSI TAC,IOUSE         ;IOUSE:=1\r
+       IORB TAC,(TAC1)         ;FLAG THAT DATA HAS BEEN INPUT\r
+       HRLZ TAC,TAC            ;NEXT BUFFER TO LEFT HALF\r
+       CAMLE TAC,XJBPFI        ;IS ADR. IN PROT. PART OF JOB DATA AREA?\r
+       CAML TAC,PROG           ;NO, WILL SECOND AND THIRD WORD FIT?\r
+       POPJ PDP,               ;NO, GIVE ERROR RETURN SO DEVICE WILL STOP\r
+       HLRM TAC,DEVIAD(DEVDAT) ;YES, SAFELY STORE ADDRESS OF NEXT BUFFER\r
+       SKIPGE TAC1,@DEVIAD(DEVDAT)     ;IS NEXT INPUT BUFFER STILL FULL?\r
+       POPJ PDP,               ;YES, GIVE STOP RETURN\r
+       TRZ TAC1,-1             ;XWD LENGTH OF BUFFER,0\r
+       ADD TAC,TAC1            ;ADD LENGTH TO REL. ADR. OF SECOND WORD\r
+                               ; LENGTH=NO. WORDS WHICH FOLLOW SECOND\r
+       CAMLE TAC,PROG          ;IS LAST WORD IN BOUNDS?\r
+       POPJ PDP,               ;NO, GIVE STOP RETURN\r
+ADVBF1:        LDB TAC,PJOBN           ;GET JOB NO. FROM DEVICE DATA BLOCK\r
+       SKIPGE TAC,JBTSTS(TAC)  ;IS RUN BIT ON IN JOB STATUS WORD\r
+       TLNE TAC,SHF+CMWB       ;YES, SYSTEM WAITING TO SHUFFLE,\r
+                               ; EXECUTE A COMMAND, OR TO SWAP JOB OUT?\r
+                               ; SHF SET BY SWAPPER TO STOP IO IF IT WANTS TO SWAP JOB OUT\r
+                               ; 2 RELOC REG SOFTWARE DOES NOT SET SHF IN LOW SEG\r
+                               ; IF JOB HAS 2 SEG, SINCE HIGH SEG CAN BE\r
+                               ; SWAPPED EVEN THOUGH ACTIVE IO IN LOW SEG.\r
+                               ; THUS A LIMITED FORM OF MONITOR BUFFERING IS ACHIEVED\r
+       POPJ PDP,               ;YES,PRETEND NEXT BUFFER NOT AVAILABLE\r
+       TRNN IOS,IOCON          ;NEXT BUFFER AVAILABLE. DISCONTINUOUS MODE?\r
+       AOS (PDP)               ;NO\r
+       POPJ PDP,               ;YES\r
+\f\r
+;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
+;CALL  HRRZ AC1,REL ADR.\r
+;      PUSHJ PDP,UADCK1\r
+;      NEVER RETURNS IF ERROR,STOPS JOB AND PRINTS ERROR\r
+;BAD ADR. IF IN LOC 20-JOBPFI IN JOB DATA AREA\r
+;OR IF ABOVE PROTECTION(USRREL) FOR CURRENT JOB\r
+\r
+INTERNAL UADCK1\r
+EXTERNAL USRREL,JOBPFI\r
+\r
+UADCK1:        TRNN AC1,777760         ;IN USER ACS?\r
+       POPJ PDP,               ;YES, ADDRESS IS OK\r
+\r
+;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
+;USER ACS ARE ALSO ILLEGAL(ADR IS FOR IO USE LATER AT\r
+;INTERRUPT LEVEL)\r
+;CALL: HRRZ AC1,REL.ADR.\r
+;      PUSHJ PDP,UADRCK\r
+;      NEVER RETURN IF ERROR\r
+\r
+INTERNAL UADRCK\r
+EXTERNAL USRREL,JOBPFI\r
+\r
+UADRCK:        CAILE AC1,JOBPFI        ;IS ADR. IN IO PROT. PART OF JOB DATA AREA?\r
+       CAMLE AC1,USRREL        ;NO, IS IT ABOVE PROTECT.?\r
+       JRST ADRERR             ;YES, STOP JOB AND PRINT ERROR\r
+       POPJ PDP,               ;NO\r
+\r
+;ROUTINE TO ADDRESS CHECK AT ANY LEVEL\r
+;CALL: MOVE PROG,[XWD PROT.,RELOC,]\r
+;      HRRZ TAC,REL. ADR.\r
+;      PUSHJ PDP,IADRCK\r
+;      ERROR RETURN(ERROR MESSAGE NOT PRINTED,JOB NOT STOPPED)\r
+;      OK RETURN\r
+\r
+INTERNAL IADRCK\r
+EXTERNAL JOBPFI,CPOPJ1\r
+\r
+IADRCK:        MOVS TAC1,PROG          ;GET PROTECTION(TO RH)\r
+       CAILE TAC,JOBPFI        ;ADR. ABOVE PROT. PART OF JOB DATA AREA?\r
+       CAILE TAC,(TAC1)        ;YES, BELOW OR EQUAL TO PROTECT.?\r
+       POPJ PDP,               ;NO\r
+       JRST CPOPJ1             ;YES, SKIP RETURN\r
+\f\r
+;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST\r
+;WHICH IS:\r
+;A LIST OF 0 OR MORE IOWD FORMAT WORDS\r
+; TERMINATED BY A GOTO WORD(LH=0)\r
+; WHICH POINTS TO ANOTHER LIST OF 0 OR MORE IOWD FORMAT WORDS ETC.\r
+; UNTIL A GOTO WORD IS ENTIRELY ZERO\r
+;\r
+;SINCE MONITOR DOES NOT RESCHEDULE WHEN IN EXEC MODE\r
+;A MAXIMUM LIST OF 100 IS IMPOSED\r
+\r
+;CALL: MOVE UUO,[XWD PROG,REL. ADR. OF FIRST COMMAND]\r
+;      PUSHJ PDP,COMCHK\r
+;      ADDRESS CHECK RETURN(ERROR ROUTINE IS NOT CALLED)\r
+;      OK RETURN, SUM OF LH OF IOWDS IN DAT\r
+;      USER ADDRESS OF FIRST IOWD LH PROG IN INDEX FIELD IN UUO\r
+;\r
+\r
+INTERNAL COMCHK\r
+EXTERNAL JOBPFI,USRREL,TPOPJ1,USRHCU\r
+\r
+COMCHK:        PUSH PDP,UUO            ;SAVE POINTER TO LIST\r
+       PUSH PDP,AC2\r
+       MOVEI AC1,JOBPFI        ;HIGHEST IO PROTECTED LOC. IN JOB DATA AREA\r
+       SKIPGE USRHCU           ;IS A SAVE OR GET IN PROGRESS(MAYBE RUN UUO)\r
+       MOVEI AC1,JOBSAV        ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE\r
+       SETZB DAT,AC2           ;CLEAR WORD COUNT AND ADDRESS OF FIRST IOWD\r
+       MOVEI ITEM,100          ;ONLY 100 LISTS\r
+       SKIPA TAC1,UUO          ;CHECK THE START OF LIST.\r
+COMCK0:        HRR UUO,TAC1            ;CHANGE COMMAND LIST POINTER ON GO TO WORD\r
+       HRRZ TAC,TAC1           ;SET UP TAC FOR IADRCK\r
+       TRNN TAC,777760         ;IS LIST IN THE ACS?\r
+       JRST COMCK1             ;YES. THAT'S OK.\r
+       PUSHJ   PDP,IADRCK\r
+       JRST    COMCKE          ;BAD ADDR.\r
+COMCK1:        SOJLE ITEM,COMCKE       ;EXCEEDED 100 YET?\r
+       SKIPN TAC1,@UUO         ;NO. GET NEXT IOWD. END OF LIST?\r
+       JRST COMCK2             ;YES\r
+       JUMPG TAC1,COMCK0       ;NO. IS IT A GO TO WORD?\r
+       HLRE TAC,TAC1           ;NO. SAVE NEGATIVE WORD COUNT\r
+       HRRZS TAC1              ;GET LOWEST ADDRESS-1\r
+       CAMGE TAC1,AC1          ;IS IT GREATER THAN LOC. PROTECTED\r
+                               ; FROM IO IN JOB DATA AREA?\r
+       JRST COMCKE             ;NO. ERROR RETURN\r
+       SUB TAC1,TAC            ;YES. COMPUTE LAST LOC.\r
+       CAMLE TAC1,USRREL       ;IS LAST LOC. IN BOUNDS?\r
+       JRST COMCKE             ;NO. ERROR RETURN\r
+       SUB DAT,TAC             ;YES. ACCUMULATE NEG. WORD COUNT\r
+       SKIPN AC2               ;IS THIS THE FIRST IOWD?\r
+       MOVE AC2,UUO            ;YES. SAVE ADDRESS IN AC2\r
+       AOJA UUO,COMCK1         ;GO GET NEXT IOWD\r
+\fCOMCK2:       SKIPE AC2               ;ARE THERE ANY IOWDS WITH LH NOT 0?\r
+       MOVE UUO,AC2            ;YES, POINT UUO TO FIRST SUCH IOWD.\r
+       POP PDP,AC2\r
+       JRST TPOPJ1             ;REMOVE SAVED UUO AND SKIP RETURN\r
+\r
+\r
+COMCKE:        POP PDP,AC2\r
+       POP PDP,UUO             ;RESTORE ORIGINAL UUO\r
+       POPJ PDP,               ;ERROR RETURN\r
+\fINTERNAL ASSASG,FTDISK\r
+EXTERNAL SCNON,SCNOFF,PJOBN\r
+\r
+;ASSIGN DEVICE IF UNASSIGNED\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+;      MOVE DEVDAT, ADDR. OF DDB\r
+;      MOVEI TAC1, EITHER ASSPRG OR ASSCON\r
+;      PUSHJ PDP, ASSASG\r
+;      CAN'T ASSIGN RETURN\r
+;      ASSIGNED RETURN\r
+\r
+\r
+ASSASG:        IFN FTDISK,<EXTERNAL SETDDB\r
+               MOVE TAC,DEVMOD(DEVDAT) ;IS IT A DISK?\r
+       TLNE TAC,DVDSK\r
+       PUSHJ PDP,SETDDB        ;YES, BUILD DEVICE DATA BLOCK\r
+>\r
+       NOSCHEDULE              ;DISABLE SCHEDULING\r
+       LDB TAC,PJOBN           ;GET JOB NUMBER IN DEV DATA BLOCK\r
+       CAMN TAC,ITEM           ;IS IT ALREADY ASSIGNED TO THIS JOB\r
+       JRST ASSAS1             ;YES\r
+       MOVEI TAC, ASSPRG+ASSCON        ;NO, IS IT ASSIGNED TO ANOTHER JOB?\r
+       CONO PI,SCNOFF          ;TURN SCANNER OFF\r
+       TDNE TAC, DEVMOD(DEVDAT)        ;ARE EITHER ASSIGNED BITS SET?\r
+       JRST ASSAS2             ;YES\r
+       DPB ITEM,PJOBN          ;NO, STORE JOB NUMBER\r
+ASSAS1:        IORM TAC1,DEVMOD(DEVDAT)        ;SET ONE OF ASSIGN BITS\r
+       AOS (PDP)\r
+ASSAS2:        CONO PI,SCNON           ;TURN SCANNER CHAN. BACK ON\r
+       SCHEDULE                ;SCHEDULING\r
+       POPJ PDP,\r
+\f;ROUTINE TO SEARCH FOR A DEVICE\r
+;CALL: HRR ITEM,JOB NUMBER\r
+;      MOVE TAC,[SIXBIT .DEVICE NAME.]\r
+;      PUSHJ PDP, DEVSRC\r
+;      NOT FOUND\r
+;      FOUND\r
+\r
+       INTERNAL DEVLG,DEVSRC,DEVPHY\r
+       EXTERNAL SYSTAP,DEVOPR,TTYFND,CPOPJ1,DEVLST,PJOBN,GETDDB\r
+\r
+DEVSRC:\r
+IFN FTLOGIN,<\r
+       MOVSI   DEVDAT,JLOG     ;DO NOT ALLOW LOGICAL NAMES IF THE JOB IS NOT\r
+                               ; NOT LOGGED IN OR IS IN THE PROCESS OF BEING LOGGED OUT\r
+       TDNE DEVDAT,JBTSTS(ITEM)        ;OTHERWISE USER CAN RUN OWN LOGOUT PROGRAM\r
+                               ; JLOG SET TO 0 IN COMMAND DECODER ON KJOB\r
+>\r
+       PUSHJ PDP, DEVLG        ;SEARCH LOGICAL NAMES FIRST\r
+       JRST DEVPHY             ;NOT FOUND, SEARCH PHYSICAL NAMES\r
+       JRST CPOPJ1             ;FOUND\r
+\r
+;SEARCH LOGICAL NAMES\r
+\r
+DEVLG: HLRZ DEVDAT,DEVLST      ;BEGINNING OF DDB CHAIN\r
+DEVLP0:        CAME TAC,DEVLOG(DEVDAT) ;COMAPRE WITH LOGICAL NAME\r
+       JRST DEV0               ;NO MATCH\r
+       LDB TAC1,PJOBN          ;DOES THE LOGICAL NAME BELONG TO THIS JOB?\r
+       CAMN TAC1,ITEM\r
+       JUMPN TAC,CPOPJ1        ;YES, GIVE SUCCESSFUL RET. IF NAME NOT 0\r
+DEV0:  HLRZ DEVDAT,DEVSER(DEVDAT)      ;NO, KEEP LOOKING\r
+       JUMPN DEVDAT,DEVLP0\r
+       POPJ PDP,               ;FINISHED AND NOT FOUND\r
+\f\r
+;SEARCH PHYSICAL NAMES\r
+\r
+DEVPHY:        CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"?\r
+       MOVE TAC,DEVOPR         ;YES, CHANGE TO OPERATOR'S TTY\r
+       CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"?\r
+       SKIPA TAC,SYSTAP        ;YES, CHANGE TO SYSTEM TAPE DEVICE NAME\r
+       TDZA TAC1,TAC1          ;NO, CLEAR SYSTEM TAPE FLAG\r
+       MOVEI TAC1,SYSDEV       ;YES, SET SYSTEM TAPE FLAG\r
+       HLRZ DEVDAT,DEVLST      ;SEARCH DEVICE DATA BLOCKS\r
+DEVLP1:\r
+       TLO DEVDAT,(TAC1)       ;SET SYSTEM TAPE BIT IF SEARCHING FOR SYS\r
+       CAMN TAC,DEVNAM(DEVDAT) ;MATCH OF PHYSICAL NAME?\r
+       JUMPN TAC,CPOPJ1        ;YES, GIVE OK RET. IF NAME IS NOT 0\r
+       HLRZ DEVDAT,DEVSER(DEVDAT)\r
+       JUMPN DEVDAT,DEVLP1\r
+       CAME TAC,[SIXBIT /TTY/] ;IS THIS PUBLIC LOGICAL NAME TTY?\r
+       JRST    GETDDB          ;SEE IF IT'S A TTY.\r
+       PUSH PDP,DAT            ;SAVE OUTPUT BYTE POINTER(TTY) OR INIT. ARG. ADR.\r
+       PUSHJ PDP,TTYFND        ;YES, FIND TTY JOB IS ATTACHED TO\r
+       POP PDP,DAT             ;RESTORE\r
+       JRST CPOPJ1             ;AND GIVE SUCCESSFUL RETURN\r
+\f;ROUTINE TO SETUP N-RING IO BUFFER IN USER AREA\r
+\r
+;CALL: PUSHJ PDP,BUFCLC\r
+,      EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM, WHERE N\r
+, IS IN THE ADDRESS FIELD OF AC UUO.\r
+, THE BUFFER RING FORMAT IS AS FOLLOWS:\r
+,      LOCATION                LH   CONTENTS   RH\r
+, C(JOBFF) + 1              BUFFER         C(JOBFF) +1\r
+,    + 0(BUFFER SIZE+2)      SIZE               + 1(BUFFER SIZE+2)\r
+, C(JOBFF) +1               BUFFER         C(JOBFF) +1\r
+,     +1(BUFFER SIZE+2)      SIZE                + 2(BUFFER SIZE+2)\r
+,         .            .                    .\r
+,      .               .                    .\r
+,      .               .                    .\r
+, C(JOBFF) + 1         BUFFER     C(JOBFF) + 1\r
+,    + (N-2)(BUFFER SIZE+2)  SIZE               +(N-1)(BUFFER SIZE+2)\r
+, C(JOBFF) + 1         BUFFER     C(JOBFF) + 1\r
+,    + (N-1)(BUFFER SIZE+2)  SIZE                 \r
+,THEN SET      BUFPNT:=IOUSE,C(JOBFF) + 1\r
+, AND          JOBFF:=C(JOBFF) + N(BUFFER SIZE + 2)\r
+, BUFWRD IS RESTORED.\r
+       INTERNAL BUFCLC\r
+       EXTERNAL JOBFF\r
+\r
+BUFCLC:        PUSH PDP,BUFWRD         ;SAVE BUFWRD ON STACK\r
+       LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE\r
+       HRRZ BUFPNT,JOBFF(PROG) ;BUFPNT:=FIRST FREE LOCATION + 1\r
+       ADDI BUFPNT,1\r
+       HRRZ BUFWRD,BUFPNT\r
+       HRLI BUFPNT,PROG\r
+       HRL BUFWRD,TAC          ;BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1\r
+       ADDI TAC,2              ;TAC:=BUFFER SIZE + 2\r
+       HRRZ TAC1,UUO           ;TAC1:=N=ADDRESS FIELD OF AC UUO\r
+       HRRZ AC1,TAC            ;BUFFER SIZE+2\r
+       IMUL AC1,TAC1           ;TIME NO. OF BUFFERS\r
+       ADD AC1,BUFWRD          ;LOC. OF FIRST BUFFER\r
+       HRRZ AC1,AC1            ;MAKE SURE POSITIVE\r
+       CAMG AC1,USRREL         ;WILL THIS SPACE FIR IN USER CORE?\r
+       JRST BUFC1              ;YES, FO DO INBUF CODE\r
+                               ; NO, AUTOMATICALLY EXPAND SIZE OF USER CORE\r
+\f      PUSH PDP,TAC            ;SAVE A BUNCH OF ACS USED IN CORE AND IO WAIT\r
+       PUSH PDP,UUO\r
+       PUSH PDP,TAC1\r
+       PUSH PDP,BUFPNT\r
+       PUSH PDP,BUFWRD\r
+       PUSH PDP,DEVDAT\r
+       PUSH PDP,DSER\r
+       MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
+       MOVE TAC,AC1            ;HIGHEST USER ADR. TO TRY FOR\r
+       MOVEI UUO,UUO           ;SET INDEX FIELD TO 0, SO STOTAC WILL STORE\r
+                               ; NO. OF K CORE AVAILABLE IN EXEC AC UUO INSTEAD\r
+                               ; OF USER'S AC UUO\r
+       PUSHJ PDP,CORUUO        ;TRY TO ASSIGN CORE\r
+       JFCL                    ;ERROR RETURN-LET ADR CHECK HAPPEN AND STOP JOB\r
+       POP PDP,DSER\r
+       POP PDP,DEVDAT\r
+       POP PDP,BUFWRD\r
+       POP PDP,BUFPNT\r
+       POP PDP,TAC1\r
+       POP PDP,UUO\r
+       POP PDP,TAC\r
+BUFC1: ADD BUFWRD,TAC          ;BUFWRD:=C(BUFWRD) + C(TAC)\r
+       HRRZ AC1,BUFPNT         ;IS LAST ADDR IN BOUNDS?\r
+       PUSHJ PDP,UADRCK\r
+       MOVEM BUFWRD,@BUFPNT    ;BUFFER HEADER+1:=C(BUFWRD)\r
+       HRR BUFPNT,BUFWRD       ;BUFPNT 18-35:=C(BUFWRD 18-35)\r
+       SOJG TAC1,BUFC1         ;N:=N-1.  IS N GR 0?\r
+       HRR BUFWRD,JOBFF(PROG)\r
+       ADDI BUFWRD,1\r
+       MOVEI AC1,-2(BUFPNT)    ;CHECK LAST ADR. OF HEADER\r
+       PUSHJ PDP,UADRCK\r
+       SUB BUFPNT,TAC\r
+       MOVEM BUFWRD,@BUFPNT    ;LINK LAST BUFFER TO FIRST BUFFER\r
+       ADDI BUFPNT,-1(TAC)\r
+       HRRM BUFPNT,JOBFF(PROG) ;JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)\r
+       HRR BUFPNT,BUFWRD       ;BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER\r
+                               ; IN RING.\r
+       HRLI BUFPNT,IOUSE\r
+       POP PDP,BUFWRD          ;RESTORE BUFWRD FROM STACK.\r
+       POPJ PDP,               ;RETURN\r
+\f;ROUTINE TO CLEAR IO BUFFER IN USER AREA\r
+;CALLED AT INTERRUPT AND UUO LEVEL\r
+\r
+;CALL: HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER\r
+;      PUSHJ PDP,BUFCLR\r
+;      ERROR RETURN MEMORY EXCEEDED\r
+,      EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS\r
+, IS IN TAC 18-35.\r
+\r
+       INTERNAL BUFCLR\r
+       EXTERNAL TPOPJ,CPOPJ1\r
+\r
+BUFCLR:        PUSHJ PDP,IADRCK        ;IN BOUNDS?\r
+       POPJ PDP,               ;NO. ERROR RETURN\r
+       HRLI TAC,PROG\r
+       PUSH PDP,TAC            ;SAVE FIRST BUFFER ADR.\r
+       HLRZ TAC1,@TAC          ;TAC1 18-35=SIZE\r
+       TRZ TAC1,400000\r
+       ADD TAC,TAC1            ;LAST ADR=2ND ADR+SIZE\r
+       TLZ TAC,-1              ;CLEAR LEFT HALF\r
+       PUSHJ PDP,IADRCK        ;LAST ADDRESS IN BOUNDS?\r
+       JRST TPOPJ              ;NO. ERROR RETURN\r
+       HRLI TAC,PROG           ;SET LAST ADR. FOR RELOC.\r
+       POP PDP,TAC1            ;RESTORE FIRST ADR.\r
+       NOSHUFF                 ;NO SHUFFLING\r
+       MOVEI TAC1,@TAC1        ;ABS. ADR. OF 2ND WORD OF BUFFER\r
+       HRL TAC1,TAC1\r
+       AOBJN TAC1,.+1          ;THIRD WORD IN BUFFER\r
+       SETZM (TAC1)            ;CLEAR THIRD WORD\r
+       AOS TAC1                ;SET DEST. ADR. TO 4TH WORD\r
+       BLT TAC1,@TAC           ;CLEAR BUFFER\r
+       SHUFFLE                 ;SHUFFLING\r
+       JRST CPOPJ1             ;SUCESSFUL RETURN\r
+\f\r
+;ROUTINE TO COMPUTE 12 BIT FOLDED CHECKSUM\r
+\r
+;CALL: PUSHJ PDP,CKS12\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE\r
+,BUFFER WHOSE ADDRESS IS IN AC TAC1.  TWO ALGORITHMS ARE USED.\r
+,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED\r
+,BY ACCUMULATING, IN ONE'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.\r
+,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING,\r
+,IN TWO'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.  AC TAC1\r
+,CONTAINS A 1.\r
+\r
+       INTERN CKS12\r
+\r
+CKS12: ADD TAC1,PROG           ;TAC1:=-WORD COUNT,ADDRESS OF FIRST DATA WORD\r
+       AOS TAC1\r
+       HRRZ TAC,0(TAC1)\r
+       MOVNS TAC\r
+       AOS TAC1\r
+       HRL TAC1,TAC\r
+       CLEARM TAC              ;INITIALIZE TWO'S COMPLEMENT SUM\r
+CKS12A:        ADD TAC,0(TAC1)         ;TWO'S COMPLEMENT ADD\r
+       AOBJN TAC1,CKS12A       ;DONE?\r
+       LSHC TAC,-30\r
+       LSH TAC1,-14\r
+       ADD TAC,TAC1\r
+       LSHC TAC,-14\r
+       LSH TAC1,-30\r
+       ADD TAC,TAC1\r
+       TRZE TAC,770000\r
+       AOS TAC\r
+       HRLZS TAC\r
+       MOVEI TAC1,1            ;TAC1:=1\r
+       POPJ PDP,\r
+\f;ROUTINE TO CLEAR RESIDUE OF WORD POINTED TO BY A BYTE POINTER\r
+\r
+;CALL: PUSHJ PDP,CLRBYT\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE\r
+,WORD POINTED TO BY THE BYTE POINTER.\r
+\r
+       INTERNAL CLRBYT\r
+\r
+CLRBYT:        LDB TAC1,[POINT 6,TAC,5]        ;TAC1:=P\r
+       DPB TAC1,[POINT 12,TAC,11]      ;TAC 0-5:=0,TAC 6-12:=P\r
+       SETZM TAC1\r
+       DPB TAC1,TAC            ;CLEAR BITS 36-P THROUGH 35\r
+       POPJ PDP,               ;RETURN\r
+\r
+;ROUTINE TO PUT EVEN PARITY IN ( OR TAKE IT OUT OF ) BIT 28 OF\r
+;AC TEM. ASSUMING CHARACTER IS IN BITS 28-35 OF TEM, REST CLEAR.\r
+;TAC IS DESTROYED. CALLED FROM PTP AND TTY SERVICE ROUTINES\r
+\r
+;CALL: PUSHJ   PDP,PEVEN8\r
+;      EXIT HERE WITH TEM SET TO EVEN PARITY\r
+\r
+       INTERNAL PEVEN8\r
+\r
+PEVEN8:        MOVE    TAC,TEM         ;COPY ORIGINAL CHARACTER\r
+       IMULI   TAC,200401      ;MAKE THREE COPIES OF THE CHAR\r
+       AND     TAC,[OCT 11111111]      ;GET THE BITS INDIVIDUALLY\r
+       IMUL    TAC,[OCT 11111111]      ;ADD UP THE BITS\r
+       TLNE    TAC,10          ;TEST THE PARITY OF THE SUM\r
+       TRC     TEM,200         ;IT WAS ODD. MAKE IT EVEN.\r
+       POPJ    PDP,0           ;RETURN\r
+\f;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB\r
+\r
+INTERNAL IORELS\r
+EXTERNAL PUUOAC\r
+\r
+\r
+IORELS:        MOVEI TAC,RELEA3        ;RELEASE ALL IO DEVICES(DON'T CLOSE)\r
+\r
+;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TO JOB\r
+;CALL  MOVEI TAC,ADR. OF IO SUB.\r
+;      PUSHJ PDP,IOALL\r
+;      RETURNS WITH ITEM=CURRENT JOB # ,UUO PRESERVED\r
+\r
+INTERNAL IOALL\r
+EXTERNAL TPOPJ,USRHCU,USRJDA\r
+\r
+IOALL: PUSH PDP,TAC            ;SAVE ADR. OF SUB.\r
+       PUSH PDP,UUO            ;SAVE UUO\r
+       SETZB UCHN,UUO          ;START WITH USER CHANNEL 0\r
+IOALL1:        CAMLE UCHN,USRHCU       ;IS IT GREATER THAN HIGHEST CHAN. USED?\r
+       JUMPN UCHN,IOALL2       ;YES - RETURN\r
+                               ; IF USRCHU IS NEG - ASSUME SAVGET\r
+                               ; WHICH USES CHANNEL 0\r
+       SKIPN DEVDAT,USRJDA(UCHN)       ;GET NEXT DDB ADR., IS IT IN USE?\r
+       AOJA UCHN,IOALL1        ;NO, KEEP GOING\r
+       MOVE IOS,DEVIOS(DEVDAT)\r
+       DPB UCHN,PUUOAC\r
+       MOVE DSER,DEVSER(DEVDAT)        ;SETUP ADR. OF DEV. DISP. TABLE\r
+       LDB TAC,PJOBN           ;GET JOB NUMBER WHICH JOB IS ASSIGNED TO\r
+       CAMN TAC,JOB            ;IS IT SAME AS CURRENT JOB(SHOULD BE EXCEPT FOR 140\r
+                               ; RESTART WHILE THIS JOB WAS SWAPPED OUT)\r
+                               ; DEVICE DATA BLOCKS JOB NUMBERS ARE SET TO 0 ON\r
+                               ; 140 RESTART,BUT THE JOB DATA AREA DEVICE ASSIGNMENTS\r
+                               ; FOR SWAPPED OUT JOBS HAVE NOT\r
+       PUSHJ PDP,@-1(PDP)      ;YES,CALL THE SUB.\r
+       AOJA UCHN,IOALL1        ;INCREMENT USER CHAN. NO.\r
+IOALL2:        POP PDP,UUO             ;RESTORE UUO & RETURN RESTORING TAC TOO\r
+       MOVE ITEM,JOB           ;GET JOB NO.\r
+       JRST TPOPJ\r
+\r
+\r
+;WAIT TILL ALL DEVICES ARE INACTIVE\r
+\r
+INTERNAL IOWAIT\r
+\r
+IOWAIT:        MOVEI TAC,WAIT1\r
+       JRST IOALL\r
+\f\r
+;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)\r
+\r
+INTERNAL IOKILL\r
+\r
+IOKILL:        MOVEI TAC,RELEA5\r
+       PUSHJ PDP,IOALL         ;RELEASE ALL DEVICES WITHOUT WAITING\r
+\r
+;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR\r
+;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR IO BUFFERS\r
+;CALL: MOVE JDAT,ADR. OF CURRENT JOB DATA AREA\r
+;      PUSHJ PDP,SETUSR\r
+\r
+INTERNAL SETUSR,CLRUSR\r
+EXTERNAL USRLO1,USRLO,USRHI,JOBSA,JOBFF\r
+EXTERNAL JOBENB,USRHCU\r
+\r
+SETUSR:        HLRZ TAC,JOBSA(JDAT)    ;RESET FIRST FREE LOC. FOR THIS JOB\r
+       MOVEM TAC,JOBFF(JDAT)\r
+CLRUSR:        SETZM JOBENB(JDAT)      ;INITIALIZE APR TRAPPING (I.E., NONE)\r
+       MOVEI TAC,USRLO1        ;FIRST LOC+1 TO CLEAR\r
+       HRLI TAC,USRLO          ;FIRST LOC.\r
+       SETZM USRLO\r
+       BLT TAC,USRHI\r
+       SETZM USRHCU            ;CLEAR HIGHEST USER IO CHAN. IN USE\r
+       POPJ PDP,\r
+\f\r
+;ROUTINE TO FLAG DEVICE ACTIVE\r
+;CALL  MOVE IOS,IO STATUS BITS\r
+;      MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+;      PUSHJ PDP,SETACT\r
+;CALLED BY ALL IO SERVICE ROUTINES AT UUO AND INTERRUPT LEVELS\r
+\r
+INTERNAL SETACT,CLRACT,STOIOS,ORACT\r
+EXTERNAL PDVTIM,PDVCNT\r
+\r
+ORACT: TRO IOS,IOACT\r
+       IORB IOS,DEVIOS(DEVDAT)\r
+       JRST ORACT1\r
+SETACT:        TRO IOS,IOACT\r
+       TLZA    IOS,IOW\r
+CLRACT:        TRZ IOS,IOACT\r
+STOIOS:        MOVEM IOS,DEVIOS(DEVDAT)\r
+ORACT1:        LDB TAC,PDVTIM          ;GET NO. OF SECONDS\r
+       DPB TAC,PDVCNT          ;TO WAIT BEFORE\r
+       POPJ PDP,               ;DEVICE IS CONSIDERED HUNG\r
+\r
+INTERNAL DEVCHK\r
+EXTERNAL HNGTIM,HNGSEC,DEVLST\r
+\r
+DEVCHK:        MOVEI TAC,HNGSEC        ;RESET HUNG DEVICE CHECK TIME\r
+       MOVEM TAC,HNGTIM        ;TO CHECK ONCE A SECOND\r
+       HLRZ DEVDAT,DEVLST\r
+DEVCK0:        MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
+       TRNN IOS,IOACT\r
+       JRST DEVCK1             ;NO\r
+       LDB TAC,PDVCNT          ;YES,DECREMENT\r
+       SOJL TAC,DEVCK1         ;0 MEANS IGNORE DEVICE\r
+       DPB TAC,PDVCNT\r
+       JUMPN TAC,DEVCK1        ;HAS COUNT GONE TO 0?\r
+       MOVE DSER,DEVSER(DEVDAT);YES, GET DISPATCH TABLE ENTRY\r
+       PUSH PDP,DEVDAT\r
+       PUSHJ PDP,DHNG(DSER)    ;DISPATCH TO SERVICE ROUTINES TO \r
+                               ; UNHANG DEVICE\r
+       PUSHJ PDP,DEVHNG        ;PRINT ERROR MESSAGE AND STOP JOB\r
+       POP PDP,DEVDAT          ;DO NOT PRINT MESS. AND STOP JOB RETURN\r
+DEVCK1:        HLRZ DEVDAT,DEVSER(DEVDAT)\r
+       JUMPN DEVDAT,DEVCK0\r
+       POPJ PDP,\r
+\f;ROUTINE TO SETUP PROG AND ITEM FOR INTERRUPT SERVICE ROUTINE\r
+\r
+;CALL  PUSHJ PDP,IOSET\r
+,      EXIT    ALWAYS RETURNS HERE\r
+,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.\r
+,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))\r
+,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND\r
+,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.\r
+\r
+       INTERNAL IOSET\r
+       EXTERNAL PJOBN,JBTADR\r
+\r
+IOSET: LDB PROG,PJOBN\r
+       MOVE ITEM,DEVCTR(DEVDAT)        ;ITEM:=ITEM POINTER=C(DEVCTR)\r
+       MOVE PROG,JBTADR(PROG)  ;PROG:=C(JBTADR 18-35)\r
+       MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS FROM THE DDB\r
+       POPJ PDP,               ;RETURN\r
+\r
+,CALLING SEQUENCE\r
+,      PUSHJ PDP,IOSETC\r
+,      EXIT            ALWAYS RETURNS HERE\r
+\r
+,SETS JBFPTR18-35:=C(TAC1 18-35)\r
+,      JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]\r
+,WHERE WORD LENGTH:=36 DECIMAL\r
+,      BYTE SIZE:=C(JBFPTR6-11)\r
+,      [X]:= INTEGER PART OF X\r
+\r
+\r
+       INTERN IOSETC\r
+\r
+\r
+IOSETC:        ADDI JBUF,1             ;JBFPTR12-18:=0\r
+       HRLZI TAC,7777          ;JBFPTR18-35:=C(TAC1 18-35)+1\r
+       ANDM TAC,@JBUF\r
+       HRRM TAC1,@JBUF\r
+       AOS @JBUF\r
+       LDB TAC1,[POINT 6,@JBUF,11]     ;TAC1:=BYTE SIZE\r
+       PUSHJ PDP,ITMCT1        ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]\r
+       ADDI JBUF,1\r
+       MOVEM ITEM,@JBUF\r
+       POPJ PDP,               ;EXIT\r
+\f;ROUTINE TO RETURN NO. OF ITEMS IN BUFFER\r
+\r
+;CALL: PUSHJ PDP,ITMSET\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]\r
+,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO\r
+,              BY C(DEVADR)\r
+,      WORD LENGTH:=36 DECIMAL\r
+,      BYTE SIZE:=INTEGER PART OF X.\r
+\r
+,CALLING SEQUENCE\r
+,      PUSHJ PDP,ITMCNT\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/BYTE SIZE]\r
+\r
+,CALLING SEQUENCE\r
+,      PUSHJ PDP,ITMCT1\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/C(TAC1)]\r
+\r
+       INTERN ITMSET,ITMCNT,ITMCT1\r
+ITMSET:        LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1\r
+       SUBI ITEM,1\r
+ITMCNT:        LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE\r
+ITMCT1:        MOVEI TAC,44            ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]\r
+       IDIV TAC,TAC1\r
+       IMUL ITEM,TAC\r
+       POPJ PDP,\r
+\f;ROUTINE TO SET DEVICE STATUS WORD FROM UUO\r
+;AND SETUP IOS\r
+\r
+INTERNAL SETIOS\r
+\r
+SETIOS:        PUSHJ   PDP,WAIT1       ;WAIT FOR DEVICE (INCLUDING TTY\r
+                               ; MONITOR COMMAND RESPONSE WHEN\r
+                               ; USER INITS TTY)\r
+\r
+       PUSHJ   PDP,CHKMOD      ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
+       TRZ UUO,IOACT           ;LET USER SET ALL BITS EXCEPT IOACT\r
+       HRRM UUO,DEVIOS(DEVDAT)\r
+       POPJ PDP,\r
+\r
+\r
+\r
+;CHECK FOR A LEGAL MODE FOR DEVICE\r
+CHKMOD:                LDB TAC1,[POINT 4,UUO,35]       ;GET DEVICE DATA MODE\r
+       MOVEI TAC,1             ;AND CHECK FOR LEGALITY\r
+       LSH TAC,(TAC1)\r
+       TDNN TAC,DEVMOD(DEVDAT)\r
+       JRST ILLMOD             ;ILLEGAL MODE\r
+       POPJ    PDP,            ;OK\r
+\r
+\r
+;SETUP BYTE POINTER AND ITEM COUNT\r
+;CALL  PUSHJ PDP,NEWBUF\r
+;      ADDRESS CHECK WHEN SETTING UP BUFFER\r
+;      OK RETURN\r
+\r
+\r
+\r
+EXTERNAL CPOPJ1\r
+INTERNAL NEWBUF,NEWBF1\r
+\r
+NEWBF1:\r
+NEWBUF:        HRRZ TAC,DEVADR(DEVDAT) ;TAC:=INPUT BUFFER HEADER ADDRESS\r
+       PUSHJ PDP,BUFCLR        ;CLEAR INPUT BUFFER.\r
+       POPJ PDP,               ;ADDRESS CHECK\r
+       HRLZI TAC,7737\r
+       AND TAC,DEVPTR(DEVDAT)  ;DEVPTR 0-5:=0, DEVPTR 12:=0\r
+       HRR TAC,DEVADR(DEVDAT)  ;DEVPTR 18-35:=C(DEVADR 18-35) + 1\r
+       AOS TAC\r
+       MOVEM TAC,DEVPTR(DEVDAT)\r
+       PUSHJ PDP,ITMSET        ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
+       MOVEM ITEM,DEVCTR(DEVDAT)       ;DEVCTR:=ITEM COUNT\r
+       JRST CPOPJ1             ;RETURN\r
+\f;ROUTINE TO SETUP BYTE POINTER ACCORDING TO DATA MODE\r
+\r
+;CALL: PUSHJ PDP,SETBYT\r
+,      EXIT            ALWAYS RETURNS HERE\r
+,SETS  TAC 0-5:=0\r
+,      TAC 6-11:=S\r
+,      TAC 12-13:=0\r
+,      TAC 14-17:=PROG\r
+,WHERE S=36 IF DATA MODE (IOS 32-25) IS BINARY (B)\r
+,      IMAGE (I), IMAGE BINARY (IB), OR DUMP (SD,D,DR)\r
+,      S=7  IF DATA MODE IS    ASCII PACKED (A)\r
+,                      ASCII LINE (AL)\r
+,                      ASCII SEQUENCED (AS)\r
+,                      ASCII SEQUENCED LINE (ASL)\r
+,              OR      ALTERNATE MODE BREAK (AM)\r
+\r
+       INTERN SETBYT\r
+\r
+SETBYT:        TRNN IOS,14             ;IS MODE LESS THAN 10?\r
+       HRLI TAC,700+PROG       ;YES,ASCII OR ASCII LINE\r
+       TRNE IOS,14             ;10 OR GREATER?\r
+       HRLI TAC,4400+PROG      ;YES, IMAGE,IMAGE BIN. OR BIN.\r
+       POPJ PDP,\r
+\f;ROUTINE TO STORE DATA IN IOBUFFER FOR INPUT CHAR. AT A TIME DEVICES\r
+\r
+;CALL: PUSHJ PDP,STODAT\r
+,      EXIT1           CHECKSUM ERROR\r
+,      EXIT2           BLOCK FULL OR BLOCK COMPLETE\r
+,      EXIT3           DATA STORED CORRECTLY\r
+,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.\r
+,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE\r
+,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND\r
+,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL\r
+,PROCESSING NEED BE DONE. FOR EXAMPLE, THE TERMINATION\r
+,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER\r
+,IS FULL.  THERE ARE THREE RETURNS FROM THIS ROUTINE: THE FIRST\r
+,RETURN OCCURS ON AN ERROR CONDITION, THE SECOND RETURN OCCURS\r
+,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD\r
+,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION.  THIS\r
+,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,\r
+,PAPER TAPE OR CARDS.\r
+,CALLING SEQUENCE\r
+,      PUSHJ PDP,STOSQD\r
+,      XXXX            ALWAYS SKIPS \r
+,      EXIT            ALWAYS RETURNS HERE\r
+,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1\r
+,IN THE BUFFER.\r
+\f      INTERN STODAT, STOSQD\r
+       EXTERNAL PIOMOD,CPOPJ,CPOPJ1,CPOPJ2\r
+\r
+STODAT:        TLNN IOS,IOFST          ;IS THIS FIRST ITEM OF BUFFER?\r
+       JRST STO0               ;NO\r
+       PUSHJ PDP,NEWBUF        ;SET UP A NEW BUFFER. ITEM:=(BUFFER \r
+                               ; SIZE - 1)*[36/BYTE SIZE]\r
+       POPJ PDP,\r
+STO0:  LDB TAC1,PIOMOD         ;DATA MODE\r
+       CAIN TAC1,B             ;MODE=BINARY?\r
+       JRST STOBIN\r
+       TLZ IOS,IOFST\r
+STO1:  IDPB DAT,DEVPTR(DEVDAT) ;STORE DATA IN BUFFER.\r
+       CAIE TAC1,A             ;MODE=ASCII, IMAGE, OR BINARY?\r
+       CAIN TAC1,I\r
+       JRST STOAIB\r
+       CAIE TAC1,IB            ;IMAGE BINARY?\r
+       CAIN TAC1,B             ;CHECKSUM BINARY?\r
+       JRST STOAIB             ;YES\r
+       ANDI    DAT,177         ;NO, MUST BE ASCII LINE MODE.\r
+       CAIG     DAT,14         ;LINE FEED,FORM FEED, OR VERTICAL TAB?\r
+       CAIGE   DAT,12\r
+       JRST .+2                ;NO\r
+       JRST STOSQF             ;YES\r
+       SOJGE ITEM,CPOPJ2       ;ITEM:=C(ITEM)-1. IS C(ITEM) GR OR=0?\r
+STOE1: TRO IOS,IOBKTL  ;IOBKTL:=1\r
+       POPJ    PDP,\r
+STOAIB:        SOJG ITEM,CPOPJ2;       ITEM:=C(ITEM)-1. IS C(ITEM) GR 0?\r
+       CAIN TAC1,A             ;MODE=ASCII?\r
+       JRST STOSQF             ;YES\r
+       CAIN TAC1,B             ;MODE=BINARY?\r
+       JRST STOBND             ;YES, COMPUTE CHECKSUM AND CHECK.\r
+       PUSHJ PDP,ITMSET        ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
+                               ; - C(DEVCTR)\r
+       SUB ITEM,DEVCTR(DEVDAT)\r
+       MOVE TAC1,DEVIAD(DEVDAT)        ;STORE ITEM COUNT\r
+       ADDI ITEM,1             ;IN FIRST WORD OF BUFFER\r
+       AOJA TAC1,STOSQE\r
+\fSTOSQD:       TLZN IOS,IOFST          ;FIRST CALL?\r
+       JRST STOSQF             ;NO\r
+       PUSHJ PDP,NEWBUF        ;YES, CLEAR BUFFER,SET ITEM COUNT\r
+       POPJ PDP,               ;ADDRESS CHECK\r
+STOSQF:        MOVE TAC1,DEVIAD(DEVDAT)        ;REL. ADR. OF BUFFER\r
+       AOS TAC1\r
+       HRRZ ITEM,DEVPTR(DEVDAT)        ;ITEM:=C(DEVPTR 18-35) -\r
+                               ; C(DEVIAD 18-35) -1\r
+       SUBI ITEM,(TAC1)\r
+STOSQE:        HRRM ITEM,@TAC1         ;WORD COUNT TO FIRST WORD IN BUFFER\r
+       JRST CPOPJ1             ;EXIT2. BLOCK COMPLETE\r
+\r
+\r
+STOBIN:        TLZN IOS,IOFST          ;WILL THE NEXT ITEM BE THE FIRST ITEM\r
+       JRST STO1               ;OF A BUFFER?  IOFST:=0\r
+       HRRZ TAC,DAT            ;YES.\r
+       CAMLE TAC,ITEM          ;IS WORD COUNT LE (BUFFER SIZE-1)*\r
+       JRST STOE1              ; [36/BYTE SIZE]?\r
+       MOVE ITEM,TAC           ;ITEM:=WORD COUNT\r
+       MOVEM DAT,@DEVPTR(DEVDAT)       ;STORE WORD COUNT IN BUFFER\r
+       JRST CPOPJ2             ;EXIT3.  DATA STORED CORRECTLY.\r
+\r
+STOBND:        HRRZ TAC1,DEVIAD(DEVDAT)\r
+       PUSHJ PDP,CKS12         ;COMPUTE CHECKSUM\r
+       ADD TAC1, DEVIAD(DEVDAT)\r
+       HLLZ TAC1,@TAC1         ;DATA CHECKSUM=COMPUTED CHECKSUM?\r
+       CAMN TAC,TAC1\r
+       JRST CPOPJ1             ;EXIT2. BLOCK COMPLETE\r
+       TRO IOS,IODTER          ;IODTER:=1\r
+       POPJ PDP,               ;EXIT1. CHECKSUM ERROR\r
+\r
+\r
+       LIT\r
+IFN FTCHECK,<INTERNAL CHKEND\r
+       CHKEND=.\r
+>\r
+\r
+UUOEND:        END\r