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