--- /dev/null
+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
+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
+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
+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
TITLE TENDMP - DTAPE/MTAPE UTILITY - R CLEMENTS/GBH/RH/RD/RCC/JEF 6 APR 71 - V032\r
IFNDEF REL,<REL=0> ;0 PAPER TAPE, 1 RELOCATABLE BINARY\r
- IFNDEF MAGT,<MAGT=0> ;0 DTAPE, 1 MTAPE\r
- IFN MAGT,<\r
-; MAGTAPE UTILITY ROUTINE - COURTSEY DATALINE SYSTEMS J HANCOCK\r
- >\r
- IFNDEF MODE,<MODE=0> ;0 IS TD10, 1 IS 551/136\r
IFNDEF CORE,<CORE=4> ;NUMBER OF 8K MEMORY BLOCKS\r
\r
- IFE MODE,<SUBTTL TD10 VERSION>\r
- IFN MODE,<SUBTTL 551/136 VERSION>\r
+ SUBTTL 551/136 VERSION\r
\r
-IFE REL,<\r
-IFE MAGT,<RIM10B>\r
-IFN MAGT,<RIM10>>\r
+IFE REL,<RIM>\r
UTC=210\r
UTS=214\r
DC=200\r
- DTC=320\r
- DTS=324\r
\r
F=0 ;MUST BE 0. USED BY JRA'S\r
A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT\r
FOOF=BEGR-202 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1\r
TAB=BEGR-201 ;FILE DIRECTORY\r
LINK=BEGR-1 ;0-17=LINK, 18-27=FBN, 29-35=WC\r
-IFE REL,<IFE MAGT,<LOC 17400+<<CORE-1>*20000>>\r
- IFN MAGT,<LOC 17377+<<CORE-1>*20000>\r
- IOWD LAST-BEGR+1,BEGR>>\r
+IFE REL,<LOC 17400+<<CORE-1>*20000>>\r
\f;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS\r
;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1\r
\r
SPACE: MOVEI E,C-1 ;EXTENSION INTO C\r
HRLI E,20600 ;FAKE OUT END TEST OF BYTE PTR\r
;STOP TAPE DRIVE\r
-IFN MODE,<CONO UTC,0>\r
-IFE MODE,<CONO DTC,400000>\r
+ CONO UTC,0\r
NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED\r
;RH OF NEXT IS USED AS A CONSTANT\r
BELL: SETOI FILN,207 ;INITIALIZATION FOR SEARCH\r
;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT\r
JBLK:\r
;STOP TAPE DRIVE\r
-IFN MODE,<CONO UTC,0>\r
-IFE MODE,<CONO DTC,400000>\r
+ CONO UTC,0\r
HRRM D,SADR ;SAVE STARTING ADDRESS\r
JUMPN CH,BEG ;IF NOT LOADGO COMMAND\r
SADR: JRST BEG ;CURRENT S.A.\r
\r
BEG69: MOVEI FILN,1(FILN) ;FILN IS FILE #+1; CLR LH\r
JUMPL WRITE,LOADS ;ALL LOAD INSTRUCTIONS\r
-IFE MAGT,<\r
SKIPN WRITE ;DELETE? (K COMMAND)\r
SETZB B,C ;YES, KILL FILE\r
MOVEM B,TAB+122(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP\r
DMP3: MOVE D,1(D) ;GET HEADER\r
JUMPGE D,THRU ;IF NULL HEADER FOUND\r
MOVEI Q,DMP3 ;Q:= DMP3 AS A RETURN AFTER AOBJN\r
- >\r
-\r
-IFN MAGT,<\r
- JRST ERR ;HOW DID WE GET HERE? DLS***\r
-;DUMP WRITES OUT CORE ONTO MAGNETIC TAPE\r
-;DUMP WRITES OUT A CORE IMAGE ON MAGNETIC TAPE WITHOUT\r
-;ZERO COMPRESSION. THE RECORDS ARE 200(OCTAL) WORDS IN LENGTH\r
-;AND BEGIN WITH WORD ZERO. BEFORE STARTING THE TAPE IS REWOUND.\r
-;IT ASSUMES MTA0, AT LEAST FOR NOW.\r
- \r
- MTC= 340\r
- MTS= 344\r
-DUMP: CONO MTC,1000 ;REWIND\r
- CONSO MTS,300000 ;WAIT FOR BOT OR REWINDING\r
- JRST .-1\r
- CONSO MTS,40 ;TRANSPORT READY?\r
- JRST .-1\r
- SETZ A,\r
-DUMP1: HRLI A,-200 ;WORDS PER BLOCK\r
- CONO MTC,64100 ;START WRITE OPERATION\r
-DUMP2: CONSO MTS,1 ;TD10 READY FOR DATA?\r
- JRST .-1\r
- DATAO MTC,(A) ;SEND OUT DATA\r
- AOBJN A,DUMP2 ;POINT TO NEXT WORD AND LOOP\r
- CONO MTS,1 ;STOP THE DRIVE\r
- CONSO MTS,100 ;WAIT TILL STOPPED\r
- JRST .-1\r
- CONSZ MTS,464610 ;ANY ERRORS?\r
- JRST ERR ;YES, GO RING BELL\r
- AOSE [-CORE*20000/200+2] ;ALL CORE DUMPED?\r
- JRST DUMP1 ;NO\r
- CONO MTC,65100 ;WRITE END OF FILE\r
- CONSO MTS,100 ;DONE?\r
- JRST .-1\r
- CONO MTC,65100\r
- CONSO MTS,100\r
- JRST .-1\r
- JRST BEGR ;ALL DONE\r
- >\r
-\r
\r
LODUMP: JSP P,UWAIT\r
JFCL D ;IN/OUTPUT HEADER\r
\r
THRU: JSP P,UWAIT ;WRITE OUT JRST BLOCK\r
JFCL SADR ;FROM LOC SADR\r
-IFE MODE,< AOJL E,UWAIT1 ;FILL OUT BLOCK, TO GET CKSM OUT>\r
TRZA WRITE,-1 ;THEN SET WRITE TO 0, AND GO CLOBBER\r
;ANY FURTHER BLOCKS WITH THIS FILN\r
UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P)\r
\r
RBLK: HRRO C,TAPENO ;CURRENT TAPE NO.\r
;SET LH TO PREPARE FOR JUMPN IN DELE\r
-IFE MODE,<\r
- TRO B,-1 ;ENSURE GOING FORWARD WHEN FIRST SEARCH\r
- CONSO DTC,300000 ;IS A DIRECTION ASSERTED?\r
- TRO C,210000 ;NO. GO FORWARD\r
-RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND\r
- TRO C,300000 ;TURN AROUND\r
-RBG: CONO DTC,20200(C) ;ISSUE THE COMMAND TO TD10.\r
- ;200=SEARCH, 300=READ, 700=WRITE.\r
-UWAIT1: CONSZ DTS,672700 ;ANY ERRORS?\r
- JRST ERR ;YES. GO DING AND THEN TYI\r
- CONSO DTS,1 ;DATA READY?\r
- JRST .-3 ;NO. GO WAIT SOME MORE\r
- JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH\r
- DATAI DTC,B ;NO. SEARCHING. GET BLOCK NO.\r
- TRZ C,310000 ;CLOBBER DIRECTION BITS IN CONO\r
- SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK\r
- CONSZ DTC,100000 ;COMPLEMENT DECISION IF GOING REVERSE\r
- TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE.\r
->\r
\f\r
-IFN MODE,<\r
SETOB A,B ;GO FORWARD, SET DC FOR SEARCH\r
CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN?\r
JRST .-1 ;WAIT\r
SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK\r
TRNE C,10000 ;COMPLEMENT IF GOING REVERSE\r
TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE.\r
->\r
JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO)\r
MOVNI E,200 ;WORDS PER BLOCK\r
MOVEM P,F ;SAVE RETURN IN AC0\r
TRO C,100 ;READ COMMAND, MAYBE\r
JUMPLE WRITE,RB2 ;JUMP IF READ\r
TRO C,400 ;CHANGE TO WRITE COMMAND\r
-IFN MODE,<MOVNI A,401 ;SET 136 TO OUTPUT>\r
+ MOVNI A,401 ;SET 136 TO OUTPUT\r
JUMPG CT,.+3\r
HRRZS LINK ;IF LAST BLK, KILL LINK\r
DPB E,PNTR ;AND THE DIR BYTE ? 0\r
JRA P,UWAIT1 ;RESTORE CALLER ADR\r
;AND PROCESS DATA WORDS\r
\f\r
-IFE MODE,<\r
- DATAI DTC,@(P) ;READ COMMANDS. GET WORD TO CORE\r
-INOUT: JRST UWAIT2 ;INOUT-1 TO INOUT +1 ARE DISPATCHED TO.\r
- DATAO DTC,@(P) ;OUTPUT TO TAPE\r
-UWAIT2: AOJN E,UWAIT3 ;WAS THAT THE LAST WORD IN THE DT BLOCK?\r
- CONO DTS,1 ;YES. GIVE FUNCTION STOP TO TD10\r
- CONSO DTS,100000 ;AND WAIT FOR CHECKSUM TO BE DONE\r
- JRST .-1 ;NOT YET. WAIT\r
-UWAIT3: SOJA E,0(P) ;DONE. COMPENSATE FOR THE AOJN ABOVE, AND\r
- ;RETURN TO CALLER OF UWAIT OR RBLK\r
->\r
\r
-IFN MODE,<\r
DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE\r
INOUT: JRST UWAIT2 ;INOUT-1 THRU INOUT+1 ARE DISPATCHED TO.\r
DATAO DC,@(P) ;OUTPUT TO TAPE\r
UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK.\r
->\r
\f\r
ALTMD: MOVEI A,"$"\r
JSP P,TYO ;ALTMODE IS PRINTED AS "$"\r
\r
-IFE MAGT,<\r
CAIE CH,"K"-40 ;FOR K, WRITE := 0\r
CAIN CH,"D"-40 ;FOR D, WRITE :=1\r
AOJLE WRITE,.-1 ;COUNT (WRITE)\r
- >\r
-\r
-IFN MAGT,<\r
- CAIN CH,"D"-40 ;FOR D, WRITE :=1\r
- AOJLE WRITE,.-1 ;COUNT (WRITE)\r
- JUMPG WRITE,DUMP ;D MEANS GO DUMP ON MAG TAPE\r
- >\r
\r
CAIN CH,"G"-40 ;GO TO PROGRAM?\r
JRST @SADR ;YES. JUMP OUT\r
CAILE F,7 ;SKIP IF ONE DIGIT\r
JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR.\r
OPNTP: ;SHIFT UNIT NUMBER LEFT FOR CONO\r
-IFE MODE,<LSH F,11>\r
-IFN MODE,<LSH F,3>\r
+ LSH F,3\r
HRRM F,TAPENO ;SAVE IN CORE\r
CLSTP: MOVEI BLKNO,^D100 ;BLK NO OF FILE DIR\r
SETZI PNTR,0 ;DONT CLOBBER DIRECTORY BYTE\r
LIT\r
\r
\r
-IFN MAGT,<\r
-SLOP: MOVE .+3\r
- MOVEM COMPTR\r
- JRST BEGR+1\r
- XWD 440700,.+1\r
- BYTE (7) "0",33,177\r
-LAST: JRST SLOP\r
- >\r
-IFE MAGT,<\r
SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA\r
;FOR COMMAND STRINGS.\r
;!!!!! NOTE: ABOVE PARAMETER MUST COME OUT POSITIVE IN\r
; THIS MEANS ANY CODE ADDED MUST BE COMPENSATED FOR BY\r
; A CORRESPONDING TIGHTENING SOMEWHERE. GOOD LUCK.\r
; TENDMP IS VERY TIGHT ALREADY.\r
- >\r
\r
END BEGR\r
\f\r