Fixed some typos and added COPY and DTBOOT.
[retro-software/dec/tops10/v4.5.git] / src / copy.mac
diff --git a/src/copy.mac b/src/copy.mac
new file mode 100644 (file)
index 0000000..3a2533b
--- /dev/null
@@ -0,0 +1,1037 @@
+TITLE COPY     V006    31MAR\r
+;COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
+REPEAT 0,<\r
+\r
+\r
+       COPY WILL RUN IN ANY AMOUNT OF CORE, HOWEVER, EFFICIENCY \r
+INCREASES WITH CORE SIZE.  SWITCHES ARE PRECEDED BY A SLASH OR\r
+ENCLOSED IN PARENTHESES AND MAY APPEAR ANYWHERE IN THE COMMAND\r
+STRING.  THE GENERAL COMMAND STRING FORMAT IS:\r
+       (OUTPUT DECTAPE):_(INPUT DECTAPE):/C\r
+\r
+       /C      COPY ALL BLOCKS FROM THE INPUT DECTAPE ONTO\r
+               THE OUTPUT DECTAPE.\r
+       /Z      ZERO ALL BLOCKS OF THE OUTPUT DECTAPE, CLEAR\r
+               THE DIRECTORY.\r
+       /V      PERFORM A WORD BY WORD COMPARISION BETWEEN\r
+               EVERY WORD OF THE INPUT AND OUTPUT DECTAPES.\r
+       /L      LOAD A BOOTSTRAP LOADER INTO A CORE BUFFER.\r
+               COPY LOOKS FOR "BSLDR.REL" ON LOGICAL DEVICE\r
+               "PTR". NOTE COPY MUST BE "SAVED" IF THE LOADER\r
+               IS TO BE PRESERVED WITH THE COPY CORE IMAGE.\r
+       /T      CAUSES A BOOTSTRAP LOADER TO BE WRITTEN ONTO\r
+               BLOCKS 0,1 AND 2 OF THE OUTPUT TAPE. COPY TYPES\r
+               "TYPE CORE BANK OR OFFSET FOR BSLDR."\r
+               OFFSET = OCTAL NUMBER 1000 TO 777600.\r
+               CORE-BANK = NNNK = 16K TO 256K,\r
+               EX:     NNNK=64K\r
+               THEN    OFFSET=177000 (TOP OF COPE - 1000)\r
+       /N      DON'T OUTPUT A DIRECTORY.\r
+       /6      LOOK FOR A DIRECTORY IN BLOCK ONE, NOT BLOCK 144.\r
+       /G      DON'T RESTART THE PROGRAM AFTER A PARITY ERROR\r
+               (BIT20), OUTPUT AN ERROR MESSAGE AND CONTINUE.\r
+    NO SW'S    SET C AND V SWITCHES (DEFAULT CONDITION).\r
+\r
+    NOTE........AT COMPLETION THE OUTPUT DECTAPE SHOULD BE REASSIGNED\r
+               TO ENSURE THAT THE DIRECTORY IN CORE IS UP TO DATE.\r
+\r
+\fTHE FOLLOWING MESSAGES MAY BE OUTPUT TO THE USER'S TELETYPE.\r
+\r
+       ?WRITE LOCK ERROR\r
+       ?INPUT (OR OUTPUT) DEVICE ERROR\r
+       ?INPUT (OR OUTPUT) CHECKSUM OR PARITY ERROR\r
+       ?INPUT (OR OUTPUT) BLOCK TOO LARGE\r
+       ?INPUT (OR OUTPUT) PREMATURE END OF FILE\r
+       000000 VERIFICATION ERRORS\r
+       ?COMMAND ERROR\r
+       ?SWITCH ERROR\r
+       ?DEVICE INIT FAILURE\r
+       ?DEVICE MUST BE A DECTAPE\r
+       ?INPUT AND OUTPUT DECTAPES MAY NOT BE THE SAME DEVICE.\r
+\r
+THE FOLLOWING MAY BE OUTPUT WHILE PROESSING "/L".\r
+       ?PTR INIT FAILURE\r
+       ?LOOKUP FAILED, "BSLDR.REL"\r
+       ?DATA ERROR ON DEVICE PTR\r
+       ?ILLEGAL BLOCKTYPE\r
+       ?CANNOT PROCESS EXTERNAL SYMBOLS\r
+       ?CANNOT PROCESS HIGH SEG'S\r
+       ?NO END BLOCK ENCOUNTERED\r
+       ?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS\r
+\r
+THE FOLLOWING MAY BE OUTPUT WHILE PROCESSING "/T".\r
+       TYPE CORE BANK OR OFFSET FOR DTBOOT\r
+       ?OFFSET = 1000 TO 777600 (OCTAL)\r
+       ?EXPECTED FORMAT IS "NNNK" = 16K T0 256K\r
+       ?BOOTSTRAP LOADER IS NOT IN COPY; TRY "/L".\r
+>\r
+\f\r
+FLP=400000             ;NOT SW MODE                    **FLAGS ARE IN LH OF F**\r
+FLC=200000             ;COPY\r
+FLZ=100000             ;ZERO\r
+FLV= 40000             ;VERIFY\r
+FLT= 20000             ;TENDMP\r
+FLG= 10000             ;IGNORE PARITY ERRORS\r
+FLL=  4000             ;LIST DIR\r
+FLK=  2000             ;COLON\r
+FLA=  1000             ;LEFT ARROW\r
+FLI=   400             ;INPUT DEVICE\r
+FL2=   200             ;CHANEL TWO\r
+HSW=   100             ;HELP\r
+LSW=   20              ;REQ TO LOAD A BSLDR\r
+LFL=   10              ;A BOOTSTRAP LOADER IS IN "COPY"\r
+NSW=     4             ;NO DIRECTORY\r
+FL6=     2             ;6 FORMATTED\r
+FPT=     1             ;A PDP-10\r
+ANYSW=FLC+FLZ+FLV+FLT  ;ANYSW=0 IMPLIES FLC+FLV\r
+JOBVER=137\r
+\r
+AC0=0\r
+AC1=1\r
+AC2=2\r
+AC3=3\r
+AC4=4\r
+AC5=5\r
+AC6=6\r
+V1=1   ;VERIFY CMDLST\r
+VZ1=2  ;CMDLST TERMINATOR\r
+V2=3   ;VERIFY CMDLST\r
+VZ2=4  ;CMDLST TERM\r
+BP=5   ;BYTE POINTER\r
+C=6    ;CURRENT CHARACTER\r
+LOC=7  ;BLOCK NUMBER\r
+T=10   ;TEMP\r
+U=T+1  ;TEMP\r
+F=12   ;FLAGS\r
+UNSD2=14       ;UNUSED\r
+UNSD3=15       ;UNUSED\r
+IOS=16 ;IO STATUS\r
+P=17   ;PUSH DOWN LIST\r
+       EXTERN  JOBFF,JOBREL,JOBSA,JOBREN\r
+       LOC     JOBVER\r
+       XWD     0,6     ;;VERSION #\r
+       RELOC\r
+\f\r
+ST:    CALLI   0\r
+       MOVE    P,[IOWD 20,TTYIN+23]    ;PUSH DOWN LIST\r
+       INIT    17,1                    ;ASCII LINE\r
+       SIXBIT  /TTY/\r
+       XWD     TOUT,TIN\r
+       HALT    .                       ;INIT ERROR\r
+       PUSH    P,JOBFF\r
+       MOVEI   T,TTYIN\r
+       MOVEM   T,JOBFF\r
+       INBUF   17,1                    ;SET THE BUFFER ADR TO TTYIN\r
+       MOVEI   T,TTYOUT\r
+       MOVEM   T,JOBFF\r
+       OUTBUF  17,1                    ;SET THE BUFFER ADR TO TTYOUT\r
+       OUTPUT  17,                     ;DUMMY\r
+       SETZB   F,IDEV\r
+       SETZB   T,ODEV\r
+       POP     P,JOBFF\r
+\r
+       MOVE    T,JOBREL\r
+       SUB     T,JOBFF                 ;T=NO. OF FREE LOC\r
+       MOVE    C,JOBFF         ;\r
+       MOVEI   AC0,3777(C)     ;\r
+       CAIGE   T,3777          ;TRY FOR AT LEAST 2K OF BUFFER AREA\r
+       CALLI   AC0,11          ;CORE UUO\r
+       JFCL                    ;O WELL\r
+       SUBI    C,1             ;IOWD FORMAT "ADR-1"\r
+       ANDI    T,-200          ;T=NO. OF FREE WORDS\r
+       MOVNM   T,U             ;IOWD FORMAT "-N"\r
+       LSH     T,-7            ;T=NO. OF BLOCKS PER COPY INPUT\r
+       MOVEM   T,INC           ;COPY INCREMENT\r
+       LSH     T,-1            ;T=NO. OF BLOCKS PER VERIFY INPUT\r
+       MOVEM   T,INCV          ;VERIFY INCREMENT\r
+       HRLM    U,C             ;ASSEMBLE\r
+       MOVEM   C,LISTC         ;COPY IOWD\r
+       ASH     U,-1            ;HALVE THE "-N" FOR VERIFY\r
+       TRNE    U,100           ;"-N" MUST AGREE WITH THE INCREMENT\r
+       ADDI    U,100           ;ADJUST\r
+       HRL     C,U             ;ASSEMBLE\r
+       MOVEM   C,LISTV1        ;VERIFY IOWD #1\r
+       MOVMM   U,U             ;\r
+       ADD     C,U             ;ASSEMBLE\r
+       MOVEM   C,LISTV2        ;VERIFY IOWD #2\r
+\r
+\f      MOVEI   C,"*"\r
+       PUSHJ   P,TYPC                  ;OUTPUT CHAR\r
+       INPUT   17,\r
+       MOVE    F,FSAVE                 ;INITIAL FLAGS\r
+       SKIPA   BP,[POINT 6,ODEV]       ;ASSUME AN OUTPUT DEV\r
+COIDEV:        MOVE    BP,[POINT 6,IDEV]       ;INPUT IF LEFT-ARROW + COLON WERE SEEN  \r
+COTGET:        PUSHJ   P,TYPGET                ;RETURN A CHAR TO C\r
+       CAIN    C,"/"\r
+       JRST    COSLSH                  ;SLASH\r
+       CAIN    C,"("\r
+       JRST    COLPRN                  ;LEFT PAREN\r
+       CAIN    C,":"\r
+       JRST    COCOLN                  ;COLON\r
+       CAIE    C,12\r
+       CAIN    C,15\r
+       JRST    COCRET                  ;CR OR LF\r
+       CAIE    C,175                   ;ALTMODE?\r
+       CAIN    C,33                    ;ALTMODE?\r
+       JRST    COCRET                  ;YES\r
+       CAIN    C,176                   ;ALTMODE?\r
+       JRST    COCRET                  ;YES\r
+       CAIE    C,"="                   ;==_\r
+       CAIN    C,"_"\r
+       JRST    COLARO                  ;LEFT ARROW\r
+       CAIGE   C,"0"                   ;\r
+       JRST    ERRCMD                  ;\r
+       CAILE   C,"9"                   ;ILLEGAL CHAR?\r
+       CAIL    C,"A"                   ;\r
+       CAILE   C,"Z"                   ;\r
+       JRST    ERRCMD                  ;\r
+       SUBI    C,40                    ;6 BITIZE IT\r
+       TLNE    BP,770000               ;ACCEPY 6 CHARS ONLY\r
+       IDPB    C,BP                    ;ASSEMBLE AN I/O DEV NAME\r
+       JRST    COTGET                  ;\r
+\fCOLPRN:       TLZA    F,FLP                   ;ENTER PAREN MODE\r
+COEXIT:        JUMPL   F,COTGET                ;NORMAL EXIT\r
+COSLSH:        PUSHJ   P,TYPGET                ;SLASH - RETURN SW IN C\r
+       MOVSI   U,-LEN                  ;U=-SWTAB LEN,0\r
+COSWLP:        MOVE    T,SWTAB(U)              ;T=FLAG,CHAR\r
+       CAIN    C,(T)                   ;C=0,CHAR\r
+       TDOA    F,T                     ;F=FLAGS,CHARS ANDED\r
+       AOBJN   U,COSWLP                ;MORE SW'S? LOOP\r
+       JUMPL   U,COEXIT                ;MATCH OR MORE SW? LOOP\r
+       JRST    ERRSW                   ;NOT A SWITCH\r
+\r
+COLARO:        TLZE    F,FLK                   ;CLEAR COLON FLAG\r
+       TLOE    F,FLA                   ;SET LEFT ARROW FLAG\r
+       JRST    ERRCMD                  ;TOO MANY ARROWS,NOT ENOUGH KOLONS\r
+       JRST    COIDEV                  ;NEXT DEVICE MUST BE INPUT\r
+\r
+COCOLN:        TLZ     BP,770000               ;ACCEPT NO MORE CHARS.\r
+       TLON    F,FLK                   ;SET KOLON FLAG\r
+       JUMPGE  BP,COTGET               ;NORMAL EXIT\r
+       JRST    ERRCMD                  ;NULL NAME, TOO MANY COLONS\r
+\r
+COCRET:        TLZE    F,HSW           ;HELP?\r
+       JRST    HELP            ;\r
+       TLZE    F,LSW           ;LOADING A LOADER?\r
+       JRST    BSLDR           ;YES\r
+       TLNE    F,FLA                   ;LEFT ARO ?\r
+       JRST    COSTRT                  ;_,SO OK\r
+       SKIPE   ODEV                    ;\r
+       JRST    ERRCMD                  ;NO_,SOME ODEV\r
+       TLNN    F,ANYSW                 ;\r
+       JRST    ST                      ;NO_,NO ODEV,NO SW =*\r
+       JRST    ERRCMD          ;NO_,NO ODEV, NO SW\r
+\r
+COSTRT:        TLNN    F,ANYSW         ;ANY SW=SKIP\r
+       TLO     F,FLC+FLV       ;DEFAULT=COPY+VERIFY\r
+       TLNE    F,FLC           ;IF COPY\r
+       TLZ     F,FLZ           ;DONT ZERO\r
+       TLNE    F,FLZ           ;IF ZERO\r
+       TLZ     F,FLV           ;DONT VERIFY\r
+       SKIPN   T,IDEV\r
+       TLNE    F,FLC+FLV\r
+       JUMPE   T,ERRCMD        ;AN INDEVICE IS REQUIRED\r
+       TLNN    F,FLT           ;IS 10DMP WANTED?\r
+       JRST    CINIT           ;NO, PROCEED\r
+\r
+\f      ;HERE TO ACCEPT THE BOOTSTRAP LOADER OFFSET (/T)\r
+\r
+CTENDM:        TLNN    F,LFL           ;IS A BOOTSTRAP LOADER LOADED?\r
+       JRST    ERRTNH          ;NO, COMPLAIN\r
+CTEN1: SETZB   AC1,OFFSET      ;\r
+       TTCALL  3,[ASCIZ /\r
+TYPE CORE BANK OR OFFSET FOR /]\r
+       MOVEI   BP,PNAME\r
+       PUSHJ   P,TYPEIT        ;BSLDR'S NAME\r
+       INPUT   17,\r
+CTEN0: PUSH    P,TIN+1         ;SAVE PTR FOR RESCAN\r
+       MOVEI   AC0,6           ;MAX CHARS TO ACCEPT\r
+       PUSHJ   P,TYPGET        ;\r
+       CAIN    C,"K"           ;\r
+       JRST    CTEN10          ;K, MUST BE A CORE-BANK\r
+       SOJG    AC0,.-3\r
+       POP     P,TIN+1         ;\r
+       MOVEI   AC0,6           ;ACCEPT 6 NUMBERS\r
+CTEN2: PUSHJ   P,TYPGET        ;GET A CHAR\r
+       CAIL    C,"0"           ;\r
+       CAILE   C,"7"           ;\r
+       JRST    CTEN7           ;NOT A OCTAL NUMBER, TERM?\r
+       LSH     AC1,3           ;MAKE ROOM\r
+       TRZ     C,777770        ;CLEAR HI-ORDER BITS\r
+       ADD     AC1,C           ;  FOR THIS CHAR\r
+       SOJG    AC0,CTEN2       ;LOOK FOR 6 CHARS\r
+CTEN3: CAIL    AC1,1000                ;LOWER LIMIT\r
+       CAILE   AC1,777600      ;UPPER LIMIT\r
+       JRST    CTEN8           ;COMPLAIN\r
+CTEN4: HRLI    AC1,W           ;SO [HRRI W,@OFFSET] WILL WORK\r
+       MOVEM   AC1,OFFSET      ;SAVIT\r
+       JRST    CINIT           ;\r
+\r
+CTEN7: CAIL    C,12            ;"LF"\r
+       CAILE   C,15            ;"CR"\r
+       CAIN    C,33            ;ALTMODE\r
+       JRST    CTEN3           ;A TERMINATOR\r
+CTEN8: TTCALL  3,[ASCIZ /\r
+?OFFSET = 1000 TO 777600 (OCTAL)/]\r
+       JRST    CTEN1           ;\r
+\r
+\f      ;LOOK FOR A CORE BANK, 16K-256K\r
+CTEN10:        POP     P,TIN+1         ;RESCAN TTYBUF\r
+       MOVEI   AC0,3           ;ONLY 3 CHARS MAX IS "256"\r
+CTEN11:        PUSHJ   P,TYPGET        ;\r
+       CAIL    C,"0"           ;\r
+       CAILE   C,"9"           ;\r
+       JRST    CTEN17          ;\r
+       IMULI   AC1,^D10        ;MAKE ROOM FOR NEXT CHAR... DEC TO OCT\r
+       ANDI    C,17            ;EXTRACT DECIMAL NUMBER\r
+       ADD     AC1,C           ;\r
+       SOJG    AC0,CTEN11      ;\r
+\r
+CTEN12:        TRNE    AC1,17          ;CHECK FOR MODULO 16\r
+       JRST    CTEN18                  ;ILL\r
+       JUMPE   AC1,CTEN18              ;ILL\r
+       LSH     AC1,-4          ;PUSH OFF ZEROES\r
+       CAILE   AC1,20          ;MAX IS 256\r
+       JRST    CTEN18  ;ILL\r
+       IMULI   AC1,40000       ;TURN IT INTO AN OFFSET\r
+       SUBI    AC1,1           ;\r
+       TRZ     AC1,777         ;1K BELOW TOP OF THIS BANK\r
+       JRST    CTEN4           ;\r
+CTEN17:        CAIN    C,"K"           ;SKIP IF TERM\r
+       JRST    CTEN12          ;\r
+\r
+CTEN18:        TTCALL  3,[ASCIZ /\r
+?EXPECTED FORMAT IS "NNNK" = 16K TO 256K.\r
+/]\r
+       JRST    CTEN1\r
+\fCINIT:        MOVEI   T,134           ;BUFRD MODE\r
+       PUSHJ   P,INIT          ;FIRST INIT\r
+       TLNE    F,FLC!FLZ       ;BEGIN HERE  ___******\r
+       PUSHJ   P,COPZRO        ;ZERO OR COPY\r
+       TLNE    F,FLC!FLZ       ;IF C OR Z-\r
+       PUSHJ   P,LALA                  ;THEN REWIND\r
+       TLNN    F,FLZ           ;WASIT /Z ?\r
+       JRST    CNOZRO          ;NO\r
+       SETSTS  2,16            ;YES\r
+       CALLI   2,13            ;CLEAR DIR IN CORE\r
+       RELEAS  2,              ;AND ON TAPE\r
+       MOVEI   T,14            ;AND\r
+       PUSHJ   P,INIT          ;REINIT\r
+CNOZRO:        TLNE    F,FLV           ;VERIFY ?\r
+       PUSHJ   P,VERZRO        ;YES\r
+       TLNE    F,FLV           ;IF VERIFY-\r
+       PUSHJ   P,LALA  ;THEN REWIND\r
+       TLNE    F,FLT           ;TEN DUMP ?\r
+       PUSHJ   P,TENINT        ;YES\r
+       JRST    ST              ;GO AGAIN ******\r
+\r
+LALA:  MTAPE   2,1             ;\r
+       SKIPE   C,IDEV          ;\r
+       MTAPE   1,1             ;\r
+       JFCL    1,.+1           ;PROCESSOR TEST\r
+       JRST    .+1             ;\r
+       JFCL    1,.+3           ;6-JUMP\r
+       TLO     F,FPT           ;PDP-10 FLAG\r
+       JRST    LSTEST          ;10-JUMP\r
+       JUMPE   C,LSTES0        ;JUMP IF NO INPUT DEV\r
+       USETI   1,1\r
+       INPUT   1,REWIND        ;IOWD 1,DATA\r
+LSTES0:        USETI   2,1\r
+       INPUT   2,REWIND\r
+LSTEST:        TLZE    F,FLL           ;LIST A DIR?\r
+       JRST    DLST            ;YES\r
+       MOVEI   C,^D15          ;SECONDS\r
+GDNITE:        TLNE    F,FPT           ;6-SKIP\r
+       CALLI   C,31            ;TO SLEEP\r
+       POPJ    P,              ;\r
+\r
+SWTAB: XWD     FLP,")"         ;XIT\r
+       XWD     FLC,"C"         ;COPY\r
+       XWD     FLZ,"Z"         ;ZERO\r
+       XWD     FLV,"V"         ;VERIFY\r
+       XWD     FLT,"T"         ;TENDMP\r
+       XWD     FLG,"G"         ;IGNORE\r
+       XWD     HSW,"H"         ;HELP\r
+       XWD     LSW,"L"         ;LOAD BSLDR\r
+       XWD     NSW,"N"         ;NO DIR\r
+       XWD     FL6,"6"         ;PDP6 DIR\r
+       LEN=.-SWTAB\r
+\fDSAV: TLON    F,FLL           ;ENTER THIS CODE ONCE ONLY\r
+       TLNE    F,FL6           ;SKIP IF ITS NOT 6FMT\r
+       POPJ    P,              ;2ND PASS OR 6FMT-EXIT.\r
+       MOVEI   1,-144(LOC)     ;FIRST BLK OF NEXT OUTPUT\r
+       SUB     1,INC           ;FIND A\r
+       IMULI   1,-200          ;     DIRECTORY,\r
+       ADD     1,LISTC         ;GRAB\r
+       HRLI    1,1(1)          ;    A\r
+       HRRI    1,DIRECT        ;     DIRECTORY.\r
+       BLT     1,DIRECT+177    ;SAVE IT.\r
+       POPJ    P,              ;RETURN\r
+\r
+DATE:  SETZ    AC2,\r
+       LDB     AC5,DATEP\r
+       IDIVI   AC5,^D31        ;PICK OFF THE DAY\r
+       ADDI    AC6,1           ;MAKE IT RIGHT\r
+       PUSHJ   P,DATE1         ;RETURNS TWO SIXBIT NUMBERS\r
+       DPB     AC6,DAY         ;XXDDXX\r
+       IDIVI   AC5,^D12        ;PICK OFF THE MONTH\r
+       MOVE    AC6,MONPH(AC6)  ;CONVERT TO ALPHA\r
+       DPB     AC6,MONTH       ;MMDDXX\r
+       MOVEI   AC6,^D64        ;GET THE BASE YEAR\r
+       ADD     AC6,AC5         ;PLUS YEARS SINCE THEN\r
+       PUSHJ   P,DATE1         ;SIXBIT\r
+       DPB     AC6,YEAR        ;YYMMDD-DATE FINISHED\r
+       POPJ    P,              ;\r
+\r
+DATE1: IDIVI   AC6,^D10        ;DIVIDE OUT A DECIMAL NUMBER\r
+       LSH     AC6,6           ;MAKE ROOM FOR THE REMIANDER\r
+       ADDI    AC6,152020(LOC) ;CONVERT TO SIXBIT\r
+       POPJ    P,              ;RETURN\r
+\r
+DAY:   POINT   12,AC2,11\r
+MONTH: POINT   24,AC2,35\r
+YEAR:  POINT   18,AC3,17\r
+DATEP: POINT   12,DNAM+^D22(AC1),35\r
+FREE:  SIXBIT  /FREE:  +/\r
+BLKS:  SIXBIT  /-BLKS  +/\r
+FILES: SIXBIT  /-FILES#/\r
+\fMONPH:        SIXBIT  /  -JAN/\r
+       SIXBIT  /  -FEB/\r
+       SIXBIT  /  -MAR/\r
+       SIXBIT  /  -APR/\r
+       SIXBIT  /  -MAY/\r
+       SIXBIT  /  -JUN/\r
+       SIXBIT  /  -JUL/\r
+       SIXBIT  /  -AUG/\r
+       SIXBIT  /  -SEP/\r
+       SIXBIT  /  -OCT/\r
+       SIXBIT  /  -NOV/\r
+       SIXBIT  /  -DEC/\r
+\r
+               ;STANDARD OCTAL TO ASCII ROUTINE\r
+DECMAL:        IDIVI   C,^D10          ;\r
+       HRLM    C+1,(P)         ;\r
+       SKIPE   C               ;\r
+       PUSHJ   P,DECMAL        ;\r
+       HLRZ    C,(P)           ;\r
+       ADDI    C,60            ;\r
+       JRST    TYPC            ;\r
+\r
+DLST:  TLNE    F,NSW           ;DIRECTORY WANTED?\r
+       JRST    DXIT            ;NO\r
+       TLNE    F,FL6           ;6FMT?\r
+       JRST    D6LST           ;YES.\r
+DLST1: SETZM   TOTAL           ;TOTAL FREE BLOCKS\r
+       MOVE    3,[XWD TOTAL,TOTAL+1]   ;CLEAR THE ^D23\r
+       BLT     3,TOTAL+^D22            ;    WORD TABLE\r
+       MOVE    2,[POINT 5,DIRECT,4]    ;POINT TO FIRST BLK SLOT\r
+       MOVEI   1,<7*^D83>-3            ;1102 SLOTS\r
+DLST2: ILDB    3,2                     ;PICK UP A FILE NUMBER\r
+       CAIG    3,^D22                  ;SKIP IF BLK IS SPECIAL\r
+       AOS     TOTAL(3)                ;COUNT BLKS/FILE\r
+       SOJG    1,DLST2                 ;LOOP\r
+       MOVEI   BP,FREE         ;FREE:\r
+       PUSHJ   P,TYPEIT                ;\r
+       MOVE    C,TOTAL         ;NUMBER OF FREE BLOCKS\r
+       PUSHJ   P,DECMAL                ;\r
+       MOVEI   BP,BLKS         ;-BLKS\r
+       PUSHJ   P,TYPEIT                ;\r
+       MOVEI   C,^D22          ;26 FILES MAX\r
+       HRLZI   AC1,-^D22               ;\r
+DLST7: SKIPE   DNAM(AC1)       ;\r
+       SOS     C               ;DECREMENT MAX NO. OF BLKS\r
+       AOBJN   AC1,DLST7       ;\r
+       PUSHJ   P,DECMAL        ;\r
+       MOVEI   BP,FILES        ;\r
+       PUSHJ   P,TYPEIT        ;\r
+       HRLZI   1,-^D22                 ;LOOP 26 TIMES\r
+\r
+\fDLST3:        HRLZI   3,161300                ;TERMINATOR\r
+       SKIPN   2,DNAM(1)               ;FILE NAME\r
+       JRST    DLST5                   ;\r
+       MOVEI   BP,2                    ;\r
+       PUSHJ   P,TYPEIT                ;\r
+       HLLZ    2,DNAM+^D22(1)          ;EXTENSION\r
+       HRRI    2,13                    ;\r
+       MOVEI   BP,2                    ;\r
+       PUSHJ   P,TYPEIT                ;\r
+       MOVE    C,TOTAL+1(1)            ;NUMBER OF BLKS\r
+       PUSHJ   P,DECMAL                ;\r
+       MOVEI   C,"     "                       ;SPACE\r
+       PUSHJ   P,TYPC                  ;\r
+       PUSHJ   P,DATE                  ;CREATION DATE\r
+       MOVEI   BP,2                    ;\r
+       HRRI    3,30000                 ;"#"\r
+       PUSHJ   P,TYPEIT                ;\r
+DLST5: AOBJN   1,DLST3                 ;LOOP\r
+DXIT:  MOVEI   C,^D15          ;15 SECONDS\r
+       JRST    GDNITE          ;TO SLEEP.\r
+\r
+D6LST: MOVEI   0,36            ;MAX NO. OF ENTRIES\r
+       HRRZ    1,DIRECT        ;LOC OF FIRST DIR BLK\r
+D6BEG: HRLI    3,130000        ;"-" TERMINATOR\r
+       MOVEI   BP,2            ;\r
+       SKIPN   2,DIRECT(1)     ;IS THERE A FILENAME?\r
+       JRST    DXIT            ;NORMAL EXIT\r
+       PUSHJ   P,TYPEIT        ;FILENAME\r
+       HLLZ    2,DIRECT+1(1)   ;EXTENSION\r
+       SKIPN   2               ;IF NULL,\r
+       JRST    D6FIN           ;JUMP\r
+       MOVEI   C,"     "       ;OTHERWISE\r
+       PUSHJ   P,TYPC          ;TAB\r
+       HRRI    2,130000        ;"-"\r
+       MOVEI   BP,2            ;TERM.\r
+       PUSHJ   P,TYPEIT        ;\r
+D6FIN: PUSHJ   P,TYPCL         ;CR-LF\r
+       ADDI    1,4             ;\r
+       SOJG    0,D6BEG         ;IN CASE\r
+       JRST    DXIT            ;DIR WAS FULL\r
+\f\r
+TYPEIT:        HRLI    BP,440600               ;BP=MESSAGE ADR\r
+TYPLOP:        ILDB    C,BP                    ;\r
+       CAIN    C,13                    ;PLUS?\r
+       POPJ    P,                      ;GET THE WHOLE MESSASE\r
+       CAIN    C,3                     ;#?\r
+       JRST    TYPCL                   ;APPEND CR LF AND TYPE\r
+       ADDI    C,40                    ;ASCIZE IT\r
+       IDPB    C,TOUT+1                ;TO THE BUFFER\r
+       JRST    TYPLOP                  ;+LOOP\r
+\r
+TYPGET:        ILDB    C,TIN+1                 ;GET CHAR\r
+       CAIE    C," "                   ;SPACE?\r
+       CAIN    C,"     "               ;TAB?\r
+       JRST    TYPGET                  ;FORGET IT\r
+       CAIGE   C,141                   ;LC "A"\r
+       POPJ    P,\r
+       CAIG    C,172                   ;LC "Z"\r
+       SUBI    C,40                    ;LC TO UC\r
+       POPJ    P,\r
+\r
+TYPCCL:        IDPB    C,TOUT+1                ;TYPE CHAR,CRLF\r
+TYPCL: MOVEI   C,15                    ;TYPE CRLF\r
+       IDPB    C,TOUT+1\r
+       MOVEI   C,12\r
+TYPC:  IDPB    C,TOUT+1                ;TYPE CHAR\r
+TYPBUF:        OUTPUT  17,                     ;DO IT\r
+       POPJ    P,\r
+\r
+\fHELP: TTCALL  3,.+2\r
+       JRST    COCRET\r
+ASCIZ %\r
+/C COPY \r
+/V VERIFY\r
+/Z ZERO ALL BLOCKS\r
+/L LOAD A BOOTSTRAP LOADER FROM PTR:BSLDR.REL\r
+/T "TYPE CORE BANK OR OFFSET FOR BSLDR"\r
+       CORE-BANK = NNNK (16K TO 256K)\r
+       OFFSET = <OCTAL 1000 TO 777600>\r
+   WRITE A BSLDR ONTO BLOCKS 0,1 AND 2\r
+/N DONT TYPE A DIRECTORY\r
+/6 PDP6 DIR\r
+/G IGNORE ERRORS\r
+NO SW'S IMPLY /C/V\r
+%\r
+\fERRT1I:       TLOA    F,FLI                   ;INPUT ERROR\r
+ERRT1O:        TLZ     F,FLI                   ;OUTPUT ERROR\r
+       STATUS  1,IOS                   ;STATUS TO IOS\r
+       TRNE    IOS,360000              ;ALL THE ERRORS\r
+       JRST    ERRCHK                  ;FOUND AN ERROR\r
+       POPJ    P,\r
+\r
+ERRT2I:        TLOA    F,FLI                   ;INPUT ERROR\r
+ERRT2O:        TLZ     F,FLI                   ;OUTPUT ERROR\r
+       STATUS  2,IOS                   ;FLAGS TO IOS\r
+       TRNN    IOS,760000              ;PLUS WRITE LOCK\r
+       POPJ    P,                      ;NO ERRORS\r
+       TLO     F,FL2                   ;IT'S A CHANNEL 2 ERROR\r
+\r
+ERRCHK:        TRNE    IOS,400000\r
+       PUSHJ   P,ERR400                ;WRITE LOCK\r
+       TRNE    IOS,200000\r
+       PUSHJ   P,ERR200                ;DEVICE ERROR\r
+       TRNE    IOS,100000\r
+       PUSHJ   P,ERR100                ;CKSUM/PARITY\r
+       TRNE    IOS,040000\r
+       PUSHJ   P,ERR040                ;BLOCK TOO LARGE\r
+       TRNE    IOS,020000              ;PREMATURE EOF,PDP9-DTA?\r
+       PUSHJ   P,ERR020                ;\r
+       TRNN    IOS,600000              ;THESE BITS IMPLY RESTART\r
+       TLNN    F,FLG                   ;/G+PARITY ERR = CONTINUE\r
+       JRST    ST                      ;RESTART\r
+       TRZ     IOS,740000              ;ZERO IN\r
+       TLNN    F,FL2\r
+       SETSTS  1,(IOS)                 ;TURN OFF\r
+       TLZE    F,FL2\r
+       SETSTS  2,(IOS)                 ;AND\r
+       POPJ    P,                      ;POP OUT\r
+\fERR400:       MOVEI   BP,MES400\r
+       JRST    TYPEIT\r
+MES400:        SIXBIT  /?WRITE LOCK ERROR#/\r
+ERR200:        PUSHJ   P,ERRCOM\r
+       MOVEI   BP,MES200\r
+       JRST    TYPEIT\r
+MES200:        SIXBIT  / DEVICE ERROR#/\r
+ERR100:        PUSHJ   P,ERRCOM\r
+       MOVEI   BP,MES100\r
+       JRST    TYPEIT\r
+MES100:        SIXBIT  / CHECKSUM OR PARITY ERROR#/\r
+ERR040:        PUSHJ   P,ERRCOM\r
+       MOVEI   BP,MES040\r
+       JRST    TYPEIT\r
+MES040:        SIXBIT  / BLOCK TOO LARGE#/\r
+ERR020:        PUSHJ   P,ERRCOM\r
+       MOVEI   BP,MES020\r
+       JRST    TYPEIT\r
+MES020:        SIXBIT  / PREMATURE END OF FILE#/\r
+ERRCOM:        MOVEI   BP,SXBINP\r
+       TLNN    F,FLI\r
+       MOVEI   BP,SXBOUT\r
+       JRST    TYPEIT\r
+SXBINP:        SIXBIT  /?INPUT+/\r
+SXBOUT:        SIXBIT  /?OUTPUT+/\r
+\fERRVER:       MOVE    T,[POINT 6,MESVER]\r
+       MOVE    BP,[POINT 3,U,17]\r
+ERRVE1:        ILDB    C,BP            ;LOAD AN OCTAL NUMBER\r
+       ADDI    C,20            ;6BITIZE IT\r
+       IDPB    C,T             ;INSERT IN MESS\r
+       TLNE    T,770000        ;ONE WORD ONLY\r
+       JRST    ERRVE1          ;LOOP 6 TIMES\r
+       MOVEI   BP,MESVER\r
+       JRST    TYPEIT\r
+MESVER:        SIXBIT  /000000 VERIFICATION ERRORS#/\r
+ERRCMD:        MOVEI   BP,MESCMD\r
+       PUSHJ   P,TYPEIT\r
+       JRST    ST\r
+MESCMD:        SIXBIT  /?COMMAND ERROR#/\r
+ERRSW: MOVEI   BP,MESSW\r
+       PUSHJ   P,TYPEIT\r
+       JRST    ST\r\r\r
+MESSW: SIXBIT  /?SWITCH ERROR#/\r
+ERRIN1:        SKIPA   T,IDEV\r
+ERRIN2:        MOVE    T,ODEV\r
+       TTCALL  3,[ASCIZ /?/]\r
+       MOVEM   T,MESINI\r
+       MOVEI   BP,MESINI\r
+       PUSHJ   P,TYPEIT\r
+       JRST    ST\r
+MESINI:        SIXBIT  /       INIT FAILURE#/\r
+ERRDT1:        SKIPA   T,IDEV\r
+ERRDT2:        MOVE    T,ODEV\r
+       TTCALL  3,[ASCIZ /?/]\r
+       MOVEM   T,MESDTA\r
+       MOVEI   BP,MESDTA\r
+       PUSHJ   P,TYPEIT\r
+       JRST ST\r
+MESDTA:        SIXBIT  /       MUST BE A DECTAPE#/\r
+\fERRTNH:       MOVEI   BP,MESTNH\r
+       PUSHJ   P,TYPEIT\r
+       JRST    ST\r
+MESTNH:        SIXBIT  %?BOOTSTRAP LOADER IS NOT IN COPY. TRY "/L".#%\r
+\rPTERR1:       TTCALL  3,[ASCIZ /?PTR INIT FAILURE\r
+/]\r
+       JRST    ST\r
+\r
+PTERR2:        TTCALL  3,[ASCIZ /?LOOKUP FAILED, "BSLDR.REL"\r
+/]\r
+       JRST    ST\r
+\f      ;WRITE A BOOOTSTRAP LOADER IN BLOCKS 0,1 AND 2\r
+TENINT:        PUSH    P,JOBFF\r
+       SETSTS  2,134           ;SO I CAN WRITE IN BLK 0\r
+       USETO   2,0\r
+       OUTBUF  2,1\r
+       OUTPUT  2,              ;DUMMY!\r
+\r
+       MOVE    AC0,[POINT 36,BSBUF]\r
+       MOVEM   AC0,BSPTR       ;WHERE THE LOADER IS KEPT\r
+       HRRZ    AC0,JOBFF       ;\r
+       HRLI    AC0,(POINT 36,)\r
+       MOVEM   AC0,FFPTR       ;WHERE ITS WRITTEN FROM\r
+\r
+       ILDB    W,BSPTR         ;IOWD\r
+       MOVE    CNT,OFFSET      ;\r
+       HRRI    W,-1(CNT)       ;FINISH THE IOWD\r
+       IDPB    W,FFPTR         ;\r
+\r
+TEN1:  PUSHJ   P,NBLK          ;GET THE NEXT BLOCK, SKIPE XIT IS NORMAL\r
+        JRST   RELDA5          ;TERMINATE THE BSLDR\r
+       TRNN    CNT,-1          ;EMPTY?\r
+       JRST    TEN1            ;YES\r
+       ILDB    OS,BSPTR        ;OFFSET FOR THIS BLK\r
+       LSH     RB,2            ;OS'S RELBITS\r
+       AOBJN   CNT,.+1         ;ACCOUNT FOR IT\r
+RELDAT:        TRNN    CNT,-1  ;ANY MORE DATA?\r
+       JRST    TEN1            ;NO\r
+       ILDB    W,BSPTR         ;PROGRAM WORD\r
+       JUMPGE  RB,RELDA1       ;CHECK LEFT HALF\r
+       HRLZ    I,OFFSET                ;\r
+       ADD     W,I             ;RELOCATE IT\r
+\r
+RELDA1:        TLNE    RB,200000       ;CHECK RIGHT HALF\r
+       HRRI    W,@OFFSET       ;RELOCATE IT\r
+       IDPB    W,FFPTR         ;\r
+       LSH     RB,2            ;NEXT RELOCATION BITS\r
+       AOBJN   CNT,RELDAT      ;NEXT WORD\r
+       TRNE    CNT,-1          ;\r
+       PUSHJ   P,NSEC          ;NEXT SECTION OF BLOCK\r
+       JRST    RELDAT          ;\r
+\r
+\fNBLK: ILDB    CNT,BSPTR       ;GET THE BLOCK WRD CNT\r
+       SKIPL   CNT             ;\r
+       AOS     (P)             ;SKIP EXIT IS NORMAL\r
+       MOVN    CNT,CNT         ;\r
+NSEC:  ILDB    RB,BSPTR        ;RELOCATION BITS\r
+       HRLI    CNT,-22         ;WRDS/SECTION\r
+       POPJ    P,\r
+\r
+RELDA5:        MOVE    W,SASAV         ;THIS JRST IS EXECUTED\r
+       HRR     W,OFFSET(W)     ;RELOCATE THE SA ADR\r
+       IDPB    W,FFPTR         ;THE LAST WORD\r
+       HRLZ    BP,JOBFF        ;BEG OF BSLDR\r
+       HRR     BP,OUT2+1       ;BLT PTR\r
+       MOVEM   BP,C            ;SAVE IT\r
+       BLT     BP,177(C)       ;ZAP 1\r
+       OUTPUT  2,              ;BLK 0\r
+       ADD     C,[XWD 200,0]\r
+       MOVEM   C,BP            ;2ND PTR SAVED\r
+       BLT     BP,177(C)       ;ZAP 2\r
+       USETO   2,1\r
+       OUTPUT  2,              ;BLK 1\r
+       ADD     C,[XWD 200,0]\r
+       MOVEM   C,BP\r
+       BLT     BP,177(C)\r
+       USETO   2,2\r
+       OUTPUT  2,\r
+       PUSHJ   P,ERRT2O        ;ERRORS?\r
+       POP     P,JOBFF\r
+       POPJ    P,\r
+\fCOPZRO:       PUSH    P,JOBFF         ;SAVE JOBFF\r
+       TLNE    F,FLC           ;SKIP IO TO UNASSIGNED CHAN.\r
+       SETSTS  1,134           ;\r
+       SETSTS  2,134           ;\r
+       OUTBUF  2,1             ;WITH ONE BUFFER MODE-134\r
+       USETO   2,0             ;FOR BLOCK ZERO\r
+       OUTPUT  2,              ;DUMMY\r
+       TLNN    F,FLC           ;COPY\r
+       JRST    COPBKZ          ;NO, MUST BE ZERO\r
+       INBUF   1,1             ;ONE BUFFER MODE-134\r
+       USETI   1,0             ;BLOCK ZERO\r
+       INPUT   1,              ;GET IT\r
+       PUSHJ   P,ERRT1I        ;OK?\r
+       MOVEI   T,177           ;LOOP LENGTH\r
+       LDB     C,IN1+1         ;FIRST WORD\r
+       DPB     C,OUT2+1        ;TO THE BUFFER\r
+COPLPZ:        ILDB    C,IN1+1         ;OTHER WORDS\r
+       IDPB    C,OUT2+1        ;TO THE BUFFER\r
+       SOJG    T,COPLPZ        ;TO LOOP\r
+       SETSTS  1,136           ;INPUT DEVICE\r
+       USETI   1,1             ;SIX FORMATTED DIRECTORY\r
+       INPUT   1,DIRWRD        ;GET IT\r
+COPBKZ:        OUTPUT  2,              ;DUMP THE BUFFER\r
+       POP     P,JOBFF         ;FOR VERIFY?\r
+       PUSHJ   P,ERRT2O                ;OK?\r
+       SETSTS  2,136           ;DUMP MODE\r
+       MOVE    U,JOBREL                ;UPPER LIMIT\r
+       MOVE    T,BLTWRD        ;FROM,TO\r
+       SETZM   @ZROWRD         ;START\r
+       BLT     T, (U)          ;ZAP\r
+       MOVEI   LOC,1           ;START AT BLOCK ONE\r
+COPSET:        TLNE    F,FLC           ;SKIP\r
+       USETI   1,(LOC)         ;IO 2 UNASGND CH\r
+       USETO   2,(LOC)         ;SET THE BLOCK NO.\r
+       ADD     LOC,INC         ;ADD THE INCREMENT\r
+       CAILE   LOC,1102        ;WILL IT FIT?\r
+       JRST    COPFIN          ;NO\r
+       PUSHJ   P,COPYIT        ;ONE BUFFER\r
+       JRST    COPSET          ;AND LOOP\r
+COPFIN:        MOVEI   T,-1102(LOC)    ;N BLOCKS WON'T FIT\r
+       IMULI   T,200           ;N WORDS WON'T FIT\r
+       MOVSS   T               ;GET ORGANIZED\r
+       ADDM    T,LISTC         ;SUB N WORDS FROM LIST\r
+       SKIPL   LISTC           ;IF LH OF IOWD = 0,\r
+       POPJ    P,              ;EXIT\r
+COPYIT:        TLNN    F,FLC           ;COPY?\r
+       JRST    COPOUT          ;ZERO!\r
+       INPUT   1,LISTC         ;COPY!\r
+       PUSHJ   P,ERRT1I        ;OK?\r
+       CAILE   LOC,144         ;SKIP IF NO CHANCE\r
+       PUSHJ   P,DSAV          ;TRY FOR A DIRECTORY\r
+COPOUT:        OUTPUT  2,LISTC         ;COPY AND ZERO\r
+       JRST    ERRT2O          ;OK?\r
+\fVERZRO:       PUSH    P,JOBFF\r
+       SETZB   VZ1,VZ2         ;CMDLST TERMINATOR\r
+       SETSTS  1,134           ;SET\r
+       SETSTS  2,134           ;IB MODE\r
+       USETI   1,0             ;AND\r
+       USETI   2,0             ;BLOCK 0\r
+       INBUF   1,1             ;WITH\r
+       INBUF   2,1             ;ONE BUFFER EA\r
+       INPUT   1,              ;GET A BLOCK\r
+       PUSHJ   P,ERRT1I        ;OK\r
+       INPUT   2,              ;GET ANOTHER\r
+       PUSHJ   P,ERRT2I        ;OK\r
+       HRRZ    V1,IN1          ;DUMMY\r
+       HRRZ    V2,IN2          ;IOWD\r
+       HRLI    V1,-200         ;FOR VERIFY LOOP\r
+       POP     P,JOBFF         ;RECLAIM BUFFERS\r
+       PUSHJ   P,VERIFY                ;VERIFY AND EXIT THIS PAGE\r
+VERONE:        SETSTS  1,136           ;SET\r
+       SETSTS  2,136           ;DUMP MODE\r
+       MOVEI   LOC,1           ;START AT BLOCK 1\r\r\r
+VERSET:        MOVE    V1,LISTV1       ;IOWDS\r
+       MOVE    V2,LISTV2       ;TO ACS\r
+       USETI   1,(LOC)         ;MASTER\r
+       USETI   2,(LOC)         ;AND COPY\r
+       ADD     LOC,INCV        ;ADD IN THE INCREMENT\r
+       CAILE   LOC,1102        ;AM I ASKING TOO MUCH?\r
+       JRST    VERFIN          ;YEP\r
+       PUSHJ   P,VERIN         ;COUPLE OF INPUTS AND VERIFY\r
+       JRST    VERSET\r
+\r
+VERFIN:        SUBI    LOC,1102        ;HOW MUCH TOO MUCH?\r
+       IMULI   LOC,200         ;IN WORDS PLEASE\r
+       MOVSS   LOC             ;BACKWARDS\r
+       ADD     V1,LOC          ;SUB WORDS FROM LIST\r
+       ADD     V2,LOC          ;I.E. ASK FOR LESS\r
+       SKIPL   V1              ;IF LH OF IOWD = 0,\r
+       POPJ    P,              ;EXIT\r
+\r
+VERIN: INPUT   1,V1            ;ONE FOR THE MASTER\r
+       PUSHJ   P,ERRT1I        ;OK?\r
+       INPUT   2,V2            ;ONE FOR THE COPY\r
+       PUSHJ   P,ERRT2I        ;OK?\r
+\r
+VERIFY:        SETZ    U,              ;CLR THE ERROR CNT\r
+       MOVE    T,1(V1)         ;MASTER WORD\r
+       CAME    T,1(V2)         ;SAME AS COPY WORD?\r
+       AOS     U               ;NO, COUNT THE ERRORS\r
+       AOS     V2              ;PLUS ONE\r
+       AOBJN   V1,VERIFY+1     ;BOTH HALVES AND LOOP\r
+       JUMPN   U,ERRVER        ;ERROR MESS IF APPROPIATE\r
+       POPJ    P,              ;UNLESS V1 IS POSITIVE\r
+\fINIT: INIT    2,(T)\r
+ODEV:  Z\r
+       XWD     OUT2,IN2\r
+       JRST    ERRIN2\r
+       MOVE    BP,ODEV         ;MAKE SURE ITS A DTA.\r
+       CALLI   BP,4\r
+       TLNN    BP,100\r
+       JRST    ERRDT2          ;ERROR, ITS NOT A DTA\r
+       SKIPN   BP,IDEV         ;IF NULL\r
+       POPJ    P,              ;NO INPUT DEV REQUIRED\r
+       CAMN    BP,ODEV         ;SAME DEVICES?\r
+       JRST    INITER          ;YEPER\r
+       INIT    1,(T)\r
+IDEV:  Z\r
+       XWD     0,IN1\r
+       JRST    ERRIN1\r
+       MOVE    BP,IDEV         ;MAKE SURE ITS A DTA\r
+       CALLI   BP,4\r
+       TLNN    BP,100\r
+       JRST    ERRDT1          ;ERROR\r
+       POPJ    P,\r
+\r
+INITER:        TTCALL  3,[ASCIZ /INPUT AND OUTPUT DEC-TAPES MAY NOT BE THE SAME DEVICE.\r
+/]\r
+       JRST    ST\r
+\f;     LOAD A BOOTSTRAP LOADER, \r
+\r
+I=1    ;PTR TO BSBUF\r
+W=2    ;WORD OF TENDMP.REL\r
+CNT=3  ;# OF WORDS IN CURRENT BLOCK\r
+TYPE=4 ;TYPE OF BLOCK\r
+OS=4   ;OFFSET\r
+RB=5   ;RELOCATION BITS\r
+\r
+FFPTR: BLOCK   1       ;BYTEPTR TO RELOCATED BSLDR\r
+BSPTR: BLOCK   1       ;BYTPTR TO UNRLCTD BSLDR\r
+OFFSET:        BLOCK   1       ;THE OFFSET\r
+RELBTS:        BLOCK   1       ;RELOCATION BITS\r
+SASAV: BLOCK   1       ;STARTING ADDRESS\r
+PNAME: BLOCK   1       ;PROGRAM NAME\r
+       SIXBIT  /#/     ;# = "CRLF"\r
+\r
+\r
+BSLDR: MOVE    AC0,[SIXBIT /BSLDR/]    ;LOOKUP BLOCK\r
+       HRLZI   AC1,(SIXBIT /REL/)\r
+       SETZB   AC2,AC3         ;\r
+       INIT    16,13           ;IMAGE-BINARY\r
+       SIXBIT  /PTR/           ;\r
+       EXP     PTRBUF          ;\r
+       JRST    PTERR1          ;INIT FAILURE ERROR\r
+       INBUF   16,1            ;ONE BUFFER\r
+       LOOKUP  16,             ;BSLDR.REL\r
+       JRST    PTERR2          ;LOOKUP FAILURE\r
+       MOVEI   I,BSBUF         ;PP PTR FOR BOOTSTRAP-LOADER-BUF\r
+\r
+NEWBLK:        PUSHJ   P,GETWRD        ;GET ONE WORD FROM PTR FILE\r
+       HLRZM   W,TYPE          ;SAVE BLOCK-TYPE\r
+       HRRZM   W,CNT           ;SAVE WRD-COUNT FOR THIS BLK\r
+       CAIN    TYPE,1          ;\r
+       PUSH    I,W             ;SAVE BLOCK HDR-WRD\r
+       PUSHJ   P,GETWRD        ;\r
+       MOVEM   W,RELBTS        ;SAVE RELOCATION-BITS\r
+       CAIN    TYPE,1          ;BLKTYP=1?\r
+       PUSH    I,W             ;YEP, SAVE THE BITS\r
+       CAIG    TYPE,7          ;ILL-BLK-TYP?\r
+       JRST    @TYPTAB(TYPE)   ;NO, OFF TO BLOCK HANDLER\r\r\r
+\r
+TTCALL 3,[ASCIZ /?ILLEGAL BLOCK TPYE\r
+/]\r
+       JRST    ST              ;\r
+\r
+\fTYPTAB:       Z       BLK0\r
+       Z       BLK1\r
+       Z       BLK2\r
+       Z       BLK3\r
+       Z       BLK4\r
+       Z       BLK5\r
+       Z       BLK6\r
+       Z       BLK7\r
+\r
+GETWRD:        SOSG    PTRBUF+2        ;EMPTY BUF?\r
+       PUSHJ   P,GETBUF        ;GET A BUFFER\r
+       ILDB    W,PTRBUF+1      ;\r
+       POPJ    P,\r
+\r
+GETBUF:        IN      16,             ;GET BUFFER\r
+       POPJ    P,\r
+       STATZ   16,20000        ;EOF?\r
+       TTCALL  3,[ASCIZ /?NO END BLOCK ENCOUNTERED\r
+/]\r
+       STATZ   16,74000        ;ERRORS?\r
+       TTCALL  3,[ASCIZ /?DATA ERROR ON DEVICE PTR\r
+/]\r
+       JRST    ST\r
+       ;THIS IS NOT A BLOCK, IGNORE IT\r
+BLK0:  JUMPE   CNT,NEWBLK      ;\r
+       PUSHJ   P,GETWRD        ;PASS A WRD\r
+       SOJA    CNT,BLK0        ;\r
+\r
+       ;THIS IS THE PROGRAM\r
+BLK1:  MOVN    CNT,CNT         ;TOTAL NUMBER OF WRDS THIS BLK\r
+BLK1A: HRLI    CNT,-22         ;MAX NUMBER PER SECTION\r
+BLK1B: TRNN    CNT,-1          ;ANY MORE WRDS?\r
+       JRST    NEWBLK          ;NO\r
+       PUSHJ   P,GETWRD        ;\r
+       PUSH    I,W             ;SAVE IN BSBUF\r
+       AOBJN   CNT,BLK1B       ;ANY MORE WRDS THIS SECTION?\r
+       TRNN    CNT,-1          ;NO, ...THIS BLK?\r
+       JRST    NEWBLK          ;NO\r
+       PUSHJ   P,GETWRD        ;GET THE REL-BITS FOR NXT SECT\r
+       PUSH    I,W             ;SAVEM\r
+       JRST    BLK1A           ;\r
+\r
+\f      ;THIS IS THE SYMBOL TABLE\r
+BLK2:  MOVN    CNT,CNT         ;\r
+BLK2A: HRLI    CNT,-22         ;\r
+BLK2B: TRNN    CNT,-1          ;\r
+       JRST    NEWBLK          ;\r
+       PUSHJ   P,GETWRD        ;\r
+       TLNE    W,200000        ;\r
+       JUMPL   W,BLK2ER        ;ERROR - ITSA EXTERNAL SYMBOL\r
+       AOBJN   CNT,.+1         ;IGNORE THE VALUE\r
+       PUSHJ   P,GETWRD        ;\r
+       AOBJN   CNT,BLK2B       ;\r
+       TRNN    CNT,-1          ;\r
+       JRST    NEWBLK          ;\r
+       JRST    BLK2A\r
+BLK2ER:        TTCALL  3,[ASCIZ /?CANNOT PROCESS EXTERNAL SYMBOLS\r
+/]\r
+       JRST    ST\r
+\r
+       ;HIGHSEG FLAG, GIVE ERROR EXIT\r
+BLK3:  TTCALL  3,[ASCIZ /?CANNOT PROCESS HIGH-SEG'S\r
+/]\r
+       JRST    ST\r
+\r
+       ;ENTRY BLOCK, IGNORE THIS BLOCK\r
+BLK4:  MOVN    CNT,CNT ;\r
+BLK4A: HRLI    CNT,-22         ;\r
+       TRNN    CNT,-1          ;\r
+       JRST    NEWBLK          ;\r
+       PUSHJ   P,GETWRD        ;\r
+       AOBJN   CNT,BLK4A+1     ;PASS/IGNORE \r
+       TRNN    CNT,-1          ;\r
+       JRST    NEWBLK          ;\r
+       PUSHJ   P,GETWRD        ;\r
+       JRST    BLK4A           ;\r
+\r
+       ;THIS IS LAST BLK, MUST BE SEEN, ALSO IS PROG-BREAK\r
+BLK5:  PUSHJ   P,GETWRD        ;\r
+       MOVNI   AC0,1(W)                ;\r
+       HRLM    AC0,BSBUF       ;START THE IOWD\r
+       CAILE   W,600           ;MUST FIT IN LESS-THAN 4 BLKS\r
+       JRST    BLK5ER          ;ERROR IF'E CAN'T\r
+       TLO     W,400000        ;NOTE THE END\r
+       PUSH    I,W             ;\r
+       HRLZI   LFL             ;NOTE BSLDR IS IN "COPY"\r
+       IORM    FSAVE           ;SAVE IT\r
+       TLO     F,LFL           ;\r
+       CLOSE   16,             ;\r
+       JRST    COCRET          ;THE ONLY WAY OUT\r
+BLK5ER:        TTCALL  3,[ASCIZ /?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS\r
+/]\r
+       JRST    ST\r
+\r
+\f      ;PROG-NAME IN RADIX50\r
+BLK6:  PUSHJ   P,GETWRD        ;\r
+       PUSHJ   P,UNWIND        ;CONVRT RX50 TO 6BIT PROG-NAME\r
+       SOJA    CNT,BLK4        ;I.E. IGNORE REST OF THIS BLK\r
+\r
+UNWIND:        MOVE    AC4,[POINT 6,PNAME]\r
+       SETZM   PNAME\r
+       MOVEM   W,AC5           ;\r
+       HRROI   AC0,-6          ;6 CHARS\r
+       TLZ     W,740000        ;CLEAR THE CODE BITS\r
+UNW1:  IDIVI   AC5,50          ;\r
+       HRLM    AC6,(P) ;SAVE REMAINDER\r
+       AOJGE   AC0,UNW2        ;LOOP\r
+       PUSHJ   P,UNW1          ;LOOP\r
+UNW2:  HLRZ    AC6,(P)         ;PICK OFF THE REMAINDER + DECODE IT\r
+       JUMPE   AC6,UNW3        ;DONE\r
+       ADDI    AC6,20-1\r
+       CAILE   AC6,31\r
+       ADDI    AC6,41-32\r
+       CAILE   AC6,72\r
+       SUBI    AC6,74-4\r
+       CAIN    AC6,3\r
+       MOVEI   AC6,16\r
+\r
+       IDPB    AC6,AC4\r
+UNW3:  POPJ    P,\r
+\r
+       ;STARTING ADR.\r
+BLK7:  PUSHJ   P,GETWRD        ;\r
+       HRLI    W,(JRST)        ;JUMP TO THE STARTING ADDRESS\r
+       MOVEM   W,SASAV         ;SAVE STARTING ADDRESS\r
+       SOJA    CNT,BLK4        ;IGNORE REST OF BLK\r
+\r
+\fBLTWRD:       XWD     END.,END.+1     ;ZRO FROM,TO\r
+ZROWRD:        EXP     END.            ;START\r
+FSAVE: XWD     FLP,0   ;MODIFIED WHEN BSLDR IS LOADED\r
+LISTC: IOWD    0,END.\r
+       Z\r
+LISTV1:        IOWD    0,END.\r
+LISTV2:        IOWD    0,END.\r
+INC:   BLOCK   1\r
+INCV:  BLOCK   1\r
+DIRECT:        BLOCK   123\r
+DNAM:  BLOCK   55\r
+TOTAL: BLOCK   26      ;BLOCK TABLE\r
+DIRWRD:        IOWD    200,DIRECT\r
+       Z\r
+REWIND:        IOWD    1,PTRBUF\r
+       Z\r
+TTYIN: BLOCK   23+20\r
+TTYOUT:        BLOCK   23\r
+IN1:   BLOCK   3\r
+IN2:   BLOCK   3\r
+OUT2:  BLOCK   3\r
+TIN:   BLOCK   3\r
+TOUT:  BLOCK   3\r
+PTRBUF:        BLOCK   3\r
+BSBUF: BLOCK   720     ;ENUF FOR 3BLOCKS PLUS HDR WRDS\r
+       VAR\r
+       LIT\r
+END.:  END     ST      ;;22-JUN\r
+\f\r