1 TITLE COPY V006 31MAR
\r
2 ;COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
\r
6 COPY WILL RUN IN ANY AMOUNT OF CORE, HOWEVER, EFFICIENCY
\r
7 INCREASES WITH CORE SIZE. SWITCHES ARE PRECEDED BY A SLASH OR
\r
8 ENCLOSED IN PARENTHESES AND MAY APPEAR ANYWHERE IN THE COMMAND
\r
9 STRING. THE GENERAL COMMAND STRING FORMAT IS:
\r
10 (OUTPUT DECTAPE):_(INPUT DECTAPE):/C
\r
12 /C COPY ALL BLOCKS FROM THE INPUT DECTAPE ONTO
\r
14 /Z ZERO ALL BLOCKS OF THE OUTPUT DECTAPE, CLEAR
\r
16 /V PERFORM A WORD BY WORD COMPARISION BETWEEN
\r
17 EVERY WORD OF THE INPUT AND OUTPUT DECTAPES.
\r
18 /L LOAD A BOOTSTRAP LOADER INTO A CORE BUFFER.
\r
19 COPY LOOKS FOR "BSLDR.REL" ON LOGICAL DEVICE
\r
20 "PTR". NOTE COPY MUST BE "SAVED" IF THE LOADER
\r
21 IS TO BE PRESERVED WITH THE COPY CORE IMAGE.
\r
22 /T CAUSES A BOOTSTRAP LOADER TO BE WRITTEN ONTO
\r
23 BLOCKS 0,1 AND 2 OF THE OUTPUT TAPE. COPY TYPES
\r
24 "TYPE CORE BANK OR OFFSET FOR BSLDR."
\r
25 OFFSET = OCTAL NUMBER 1000 TO 777600.
\r
26 CORE-BANK = NNNK = 16K TO 256K,
\r
28 THEN OFFSET=177000 (TOP OF COPE - 1000)
\r
29 /N DON'T OUTPUT A DIRECTORY.
\r
30 /6 LOOK FOR A DIRECTORY IN BLOCK ONE, NOT BLOCK 144.
\r
31 /G DON'T RESTART THE PROGRAM AFTER A PARITY ERROR
\r
32 (BIT20), OUTPUT AN ERROR MESSAGE AND CONTINUE.
\r
33 NO SW'S SET C AND V SWITCHES (DEFAULT CONDITION).
\r
35 NOTE........AT COMPLETION THE OUTPUT DECTAPE SHOULD BE REASSIGNED
\r
36 TO ENSURE THAT THE DIRECTORY IN CORE IS UP TO DATE.
\r
38 \fTHE FOLLOWING MESSAGES MAY BE OUTPUT TO THE USER'S TELETYPE.
\r
41 ?INPUT (OR OUTPUT) DEVICE ERROR
\r
42 ?INPUT (OR OUTPUT) CHECKSUM OR PARITY ERROR
\r
43 ?INPUT (OR OUTPUT) BLOCK TOO LARGE
\r
44 ?INPUT (OR OUTPUT) PREMATURE END OF FILE
\r
45 000000 VERIFICATION ERRORS
\r
48 ?DEVICE INIT FAILURE
\r
49 ?DEVICE MUST BE A DECTAPE
\r
50 ?INPUT AND OUTPUT DECTAPES MAY NOT BE THE SAME DEVICE.
\r
52 THE FOLLOWING MAY BE OUTPUT WHILE PROESSING "/L".
\r
54 ?LOOKUP FAILED, "BSLDR.REL"
\r
55 ?DATA ERROR ON DEVICE PTR
\r
57 ?CANNOT PROCESS EXTERNAL SYMBOLS
\r
58 ?CANNOT PROCESS HIGH SEG'S
\r
59 ?NO END BLOCK ENCOUNTERED
\r
60 ?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS
\r
62 THE FOLLOWING MAY BE OUTPUT WHILE PROCESSING "/T".
\r
63 TYPE CORE BANK OR OFFSET FOR DTBOOT
\r
64 ?OFFSET = 1000 TO 777600 (OCTAL)
\r
65 ?EXPECTED FORMAT IS "NNNK" = 16K T0 256K
\r
66 ?BOOTSTRAP LOADER IS NOT IN COPY; TRY "/L".
\r
69 FLP=400000 ;NOT SW MODE **FLAGS ARE IN LH OF F**
\r
74 FLG= 10000 ;IGNORE PARITY ERRORS
\r
77 FLA= 1000 ;LEFT ARROW
\r
78 FLI= 400 ;INPUT DEVICE
\r
79 FL2= 200 ;CHANEL TWO
\r
81 LSW= 20 ;REQ TO LOAD A BSLDR
\r
82 LFL= 10 ;A BOOTSTRAP LOADER IS IN "COPY"
\r
83 NSW= 4 ;NO DIRECTORY
\r
86 ANYSW=FLC+FLZ+FLV+FLT ;ANYSW=0 IMPLIES FLC+FLV
\r
97 VZ1=2 ;CMDLST TERMINATOR
\r
101 C=6 ;CURRENT CHARACTER
\r
102 LOC=7 ;BLOCK NUMBER
\r
109 P=17 ;PUSH DOWN LIST
\r
110 EXTERN JOBFF,JOBREL,JOBSA,JOBREN
\r
112 XWD 0,6 ;;VERSION #
\r
116 MOVE P,[IOWD 20,TTYIN+23] ;PUSH DOWN LIST
\r
117 INIT 17,1 ;ASCII LINE
\r
124 INBUF 17,1 ;SET THE BUFFER ADR TO TTYIN
\r
127 OUTBUF 17,1 ;SET THE BUFFER ADR TO TTYOUT
\r
134 SUB T,JOBFF ;T=NO. OF FREE LOC
\r
136 MOVEI AC0,3777(C) ;
\r
137 CAIGE T,3777 ;TRY FOR AT LEAST 2K OF BUFFER AREA
\r
138 CALLI AC0,11 ;CORE UUO
\r
140 SUBI C,1 ;IOWD FORMAT "ADR-1"
\r
141 ANDI T,-200 ;T=NO. OF FREE WORDS
\r
142 MOVNM T,U ;IOWD FORMAT "-N"
\r
143 LSH T,-7 ;T=NO. OF BLOCKS PER COPY INPUT
\r
144 MOVEM T,INC ;COPY INCREMENT
\r
145 LSH T,-1 ;T=NO. OF BLOCKS PER VERIFY INPUT
\r
146 MOVEM T,INCV ;VERIFY INCREMENT
\r
148 MOVEM C,LISTC ;COPY IOWD
\r
149 ASH U,-1 ;HALVE THE "-N" FOR VERIFY
\r
150 TRNE U,100 ;"-N" MUST AGREE WITH THE INCREMENT
\r
153 MOVEM C,LISTV1 ;VERIFY IOWD #1
\r
156 MOVEM C,LISTV2 ;VERIFY IOWD #2
\r
159 PUSHJ P,TYPC ;OUTPUT CHAR
\r
161 MOVE F,FSAVE ;INITIAL FLAGS
\r
162 SKIPA BP,[POINT 6,ODEV] ;ASSUME AN OUTPUT DEV
\r
163 COIDEV: MOVE BP,[POINT 6,IDEV] ;INPUT IF LEFT-ARROW + COLON WERE SEEN
\r
164 COTGET: PUSHJ P,TYPGET ;RETURN A CHAR TO C
\r
168 JRST COLPRN ;LEFT PAREN
\r
173 JRST COCRET ;CR OR LF
\r
174 CAIE C,175 ;ALTMODE?
\r
175 CAIN C,33 ;ALTMODE?
\r
177 CAIN C,176 ;ALTMODE?
\r
181 JRST COLARO ;LEFT ARROW
\r
184 CAILE C,"9" ;ILLEGAL CHAR?
\r
188 SUBI C,40 ;6 BITIZE IT
\r
189 TLNE BP,770000 ;ACCEPY 6 CHARS ONLY
\r
190 IDPB C,BP ;ASSEMBLE AN I/O DEV NAME
\r
192 \fCOLPRN: TLZA F,FLP ;ENTER PAREN MODE
\r
193 COEXIT: JUMPL F,COTGET ;NORMAL EXIT
\r
194 COSLSH: PUSHJ P,TYPGET ;SLASH - RETURN SW IN C
\r
195 MOVSI U,-LEN ;U=-SWTAB LEN,0
\r
196 COSWLP: MOVE T,SWTAB(U) ;T=FLAG,CHAR
\r
197 CAIN C,(T) ;C=0,CHAR
\r
198 TDOA F,T ;F=FLAGS,CHARS ANDED
\r
199 AOBJN U,COSWLP ;MORE SW'S? LOOP
\r
200 JUMPL U,COEXIT ;MATCH OR MORE SW? LOOP
\r
201 JRST ERRSW ;NOT A SWITCH
\r
203 COLARO: TLZE F,FLK ;CLEAR COLON FLAG
\r
204 TLOE F,FLA ;SET LEFT ARROW FLAG
\r
205 JRST ERRCMD ;TOO MANY ARROWS,NOT ENOUGH KOLONS
\r
206 JRST COIDEV ;NEXT DEVICE MUST BE INPUT
\r
208 COCOLN: TLZ BP,770000 ;ACCEPT NO MORE CHARS.
\r
209 TLON F,FLK ;SET KOLON FLAG
\r
210 JUMPGE BP,COTGET ;NORMAL EXIT
\r
211 JRST ERRCMD ;NULL NAME, TOO MANY COLONS
\r
213 COCRET: TLZE F,HSW ;HELP?
\r
215 TLZE F,LSW ;LOADING A LOADER?
\r
217 TLNE F,FLA ;LEFT ARO ?
\r
218 JRST COSTRT ;_,SO OK
\r
220 JRST ERRCMD ;NO_,SOME ODEV
\r
222 JRST ST ;NO_,NO ODEV,NO SW =*
\r
223 JRST ERRCMD ;NO_,NO ODEV, NO SW
\r
225 COSTRT: TLNN F,ANYSW ;ANY SW=SKIP
\r
226 TLO F,FLC+FLV ;DEFAULT=COPY+VERIFY
\r
227 TLNE F,FLC ;IF COPY
\r
228 TLZ F,FLZ ;DONT ZERO
\r
229 TLNE F,FLZ ;IF ZERO
\r
230 TLZ F,FLV ;DONT VERIFY
\r
233 JUMPE T,ERRCMD ;AN INDEVICE IS REQUIRED
\r
234 TLNN F,FLT ;IS 10DMP WANTED?
\r
235 JRST CINIT ;NO, PROCEED
\r
237 \f ;HERE TO ACCEPT THE BOOTSTRAP LOADER OFFSET (/T)
\r
239 CTENDM: TLNN F,LFL ;IS A BOOTSTRAP LOADER LOADED?
\r
240 JRST ERRTNH ;NO, COMPLAIN
\r
241 CTEN1: SETZB AC1,OFFSET ;
\r
243 TYPE CORE BANK OR OFFSET FOR /]
\r
245 PUSHJ P,TYPEIT ;BSLDR'S NAME
\r
247 CTEN0: PUSH P,TIN+1 ;SAVE PTR FOR RESCAN
\r
248 MOVEI AC0,6 ;MAX CHARS TO ACCEPT
\r
251 JRST CTEN10 ;K, MUST BE A CORE-BANK
\r
254 MOVEI AC0,6 ;ACCEPT 6 NUMBERS
\r
255 CTEN2: PUSHJ P,TYPGET ;GET A CHAR
\r
258 JRST CTEN7 ;NOT A OCTAL NUMBER, TERM?
\r
259 LSH AC1,3 ;MAKE ROOM
\r
260 TRZ C,777770 ;CLEAR HI-ORDER BITS
\r
261 ADD AC1,C ; FOR THIS CHAR
\r
262 SOJG AC0,CTEN2 ;LOOK FOR 6 CHARS
\r
263 CTEN3: CAIL AC1,1000 ;LOWER LIMIT
\r
264 CAILE AC1,777600 ;UPPER LIMIT
\r
265 JRST CTEN8 ;COMPLAIN
\r
266 CTEN4: HRLI AC1,W ;SO [HRRI W,@OFFSET] WILL WORK
\r
267 MOVEM AC1,OFFSET ;SAVIT
\r
270 CTEN7: CAIL C,12 ;"LF"
\r
273 JRST CTEN3 ;A TERMINATOR
\r
274 CTEN8: TTCALL 3,[ASCIZ /
\r
275 ?OFFSET = 1000 TO 777600 (OCTAL)/]
\r
278 \f ;LOOK FOR A CORE BANK, 16K-256K
\r
279 CTEN10: POP P,TIN+1 ;RESCAN TTYBUF
\r
280 MOVEI AC0,3 ;ONLY 3 CHARS MAX IS "256"
\r
281 CTEN11: PUSHJ P,TYPGET ;
\r
285 IMULI AC1,^D10 ;MAKE ROOM FOR NEXT CHAR... DEC TO OCT
\r
286 ANDI C,17 ;EXTRACT DECIMAL NUMBER
\r
290 CTEN12: TRNE AC1,17 ;CHECK FOR MODULO 16
\r
292 JUMPE AC1,CTEN18 ;ILL
\r
293 LSH AC1,-4 ;PUSH OFF ZEROES
\r
294 CAILE AC1,20 ;MAX IS 256
\r
296 IMULI AC1,40000 ;TURN IT INTO AN OFFSET
\r
298 TRZ AC1,777 ;1K BELOW TOP OF THIS BANK
\r
300 CTEN17: CAIN C,"K" ;SKIP IF TERM
\r
303 CTEN18: TTCALL 3,[ASCIZ /
\r
304 ?EXPECTED FORMAT IS "NNNK" = 16K TO 256K.
\r
307 \fCINIT: MOVEI T,134 ;BUFRD MODE
\r
308 PUSHJ P,INIT ;FIRST INIT
\r
309 TLNE F,FLC!FLZ ;BEGIN HERE ___******
\r
310 PUSHJ P,COPZRO ;ZERO OR COPY
\r
311 TLNE F,FLC!FLZ ;IF C OR Z-
\r
312 PUSHJ P,LALA ;THEN REWIND
\r
313 TLNN F,FLZ ;WASIT /Z ?
\r
316 CALLI 2,13 ;CLEAR DIR IN CORE
\r
317 RELEAS 2, ;AND ON TAPE
\r
319 PUSHJ P,INIT ;REINIT
\r
320 CNOZRO: TLNE F,FLV ;VERIFY ?
\r
321 PUSHJ P,VERZRO ;YES
\r
322 TLNE F,FLV ;IF VERIFY-
\r
323 PUSHJ P,LALA ;THEN REWIND
\r
324 TLNE F,FLT ;TEN DUMP ?
\r
325 PUSHJ P,TENINT ;YES
\r
326 JRST ST ;GO AGAIN ******
\r
331 JFCL 1,.+1 ;PROCESSOR TEST
\r
334 TLO F,FPT ;PDP-10 FLAG
\r
335 JRST LSTEST ;10-JUMP
\r
336 JUMPE C,LSTES0 ;JUMP IF NO INPUT DEV
\r
338 INPUT 1,REWIND ;IOWD 1,DATA
\r
341 LSTEST: TLZE F,FLL ;LIST A DIR?
\r
343 MOVEI C,^D15 ;SECONDS
\r
344 GDNITE: TLNE F,FPT ;6-SKIP
\r
345 CALLI C,31 ;TO SLEEP
\r
348 SWTAB: XWD FLP,")" ;XIT
\r
351 XWD FLV,"V" ;VERIFY
\r
352 XWD FLT,"T" ;TENDMP
\r
353 XWD FLG,"G" ;IGNORE
\r
355 XWD LSW,"L" ;LOAD BSLDR
\r
356 XWD NSW,"N" ;NO DIR
\r
357 XWD FL6,"6" ;PDP6 DIR
\r
359 \fDSAV: TLON F,FLL ;ENTER THIS CODE ONCE ONLY
\r
360 TLNE F,FL6 ;SKIP IF ITS NOT 6FMT
\r
361 POPJ P, ;2ND PASS OR 6FMT-EXIT.
\r
362 MOVEI 1,-144(LOC) ;FIRST BLK OF NEXT OUTPUT
\r
364 IMULI 1,-200 ; DIRECTORY,
\r
367 HRRI 1,DIRECT ; DIRECTORY.
\r
368 BLT 1,DIRECT+177 ;SAVE IT.
\r
373 IDIVI AC5,^D31 ;PICK OFF THE DAY
\r
374 ADDI AC6,1 ;MAKE IT RIGHT
\r
375 PUSHJ P,DATE1 ;RETURNS TWO SIXBIT NUMBERS
\r
376 DPB AC6,DAY ;XXDDXX
\r
377 IDIVI AC5,^D12 ;PICK OFF THE MONTH
\r
378 MOVE AC6,MONPH(AC6) ;CONVERT TO ALPHA
\r
379 DPB AC6,MONTH ;MMDDXX
\r
380 MOVEI AC6,^D64 ;GET THE BASE YEAR
\r
381 ADD AC6,AC5 ;PLUS YEARS SINCE THEN
\r
382 PUSHJ P,DATE1 ;SIXBIT
\r
383 DPB AC6,YEAR ;YYMMDD-DATE FINISHED
\r
386 DATE1: IDIVI AC6,^D10 ;DIVIDE OUT A DECIMAL NUMBER
\r
387 LSH AC6,6 ;MAKE ROOM FOR THE REMIANDER
\r
388 ADDI AC6,152020(LOC) ;CONVERT TO SIXBIT
\r
391 DAY: POINT 12,AC2,11
\r
392 MONTH: POINT 24,AC2,35
\r
393 YEAR: POINT 18,AC3,17
\r
394 DATEP: POINT 12,DNAM+^D22(AC1),35
\r
395 FREE: SIXBIT /FREE: +/
\r
396 BLKS: SIXBIT /-BLKS +/
\r
397 FILES: SIXBIT /-FILES#/
\r
398 \fMONPH: SIXBIT / -JAN/
\r
411 ;STANDARD OCTAL TO ASCII ROUTINE
\r
412 DECMAL: IDIVI C,^D10 ;
\r
420 DLST: TLNE F,NSW ;DIRECTORY WANTED?
\r
424 DLST1: SETZM TOTAL ;TOTAL FREE BLOCKS
\r
425 MOVE 3,[XWD TOTAL,TOTAL+1] ;CLEAR THE ^D23
\r
426 BLT 3,TOTAL+^D22 ; WORD TABLE
\r
427 MOVE 2,[POINT 5,DIRECT,4] ;POINT TO FIRST BLK SLOT
\r
428 MOVEI 1,<7*^D83>-3 ;1102 SLOTS
\r
429 DLST2: ILDB 3,2 ;PICK UP A FILE NUMBER
\r
430 CAIG 3,^D22 ;SKIP IF BLK IS SPECIAL
\r
431 AOS TOTAL(3) ;COUNT BLKS/FILE
\r
433 MOVEI BP,FREE ;FREE:
\r
435 MOVE C,TOTAL ;NUMBER OF FREE BLOCKS
\r
437 MOVEI BP,BLKS ;-BLKS
\r
439 MOVEI C,^D22 ;26 FILES MAX
\r
441 DLST7: SKIPE DNAM(AC1) ;
\r
442 SOS C ;DECREMENT MAX NO. OF BLKS
\r
447 HRLZI 1,-^D22 ;LOOP 26 TIMES
\r
449 \fDLST3: HRLZI 3,161300 ;TERMINATOR
\r
450 SKIPN 2,DNAM(1) ;FILE NAME
\r
454 HLLZ 2,DNAM+^D22(1) ;EXTENSION
\r
458 MOVE C,TOTAL+1(1) ;NUMBER OF BLKS
\r
462 PUSHJ P,DATE ;CREATION DATE
\r
466 DLST5: AOBJN 1,DLST3 ;LOOP
\r
467 DXIT: MOVEI C,^D15 ;15 SECONDS
\r
468 JRST GDNITE ;TO SLEEP.
\r
470 D6LST: MOVEI 0,36 ;MAX NO. OF ENTRIES
\r
471 HRRZ 1,DIRECT ;LOC OF FIRST DIR BLK
\r
472 D6BEG: HRLI 3,130000 ;"-" TERMINATOR
\r
474 SKIPN 2,DIRECT(1) ;IS THERE A FILENAME?
\r
475 JRST DXIT ;NORMAL EXIT
\r
476 PUSHJ P,TYPEIT ;FILENAME
\r
477 HLLZ 2,DIRECT+1(1) ;EXTENSION
\r
480 MOVEI C," " ;OTHERWISE
\r
485 D6FIN: PUSHJ P,TYPCL ;CR-LF
\r
487 SOJG 0,D6BEG ;IN CASE
\r
488 JRST DXIT ;DIR WAS FULL
\r
490 TYPEIT: HRLI BP,440600 ;BP=MESSAGE ADR
\r
491 TYPLOP: ILDB C,BP ;
\r
493 POPJ P, ;GET THE WHOLE MESSASE
\r
495 JRST TYPCL ;APPEND CR LF AND TYPE
\r
496 ADDI C,40 ;ASCIZE IT
\r
497 IDPB C,TOUT+1 ;TO THE BUFFER
\r
500 TYPGET: ILDB C,TIN+1 ;GET CHAR
\r
503 JRST TYPGET ;FORGET IT
\r
504 CAIGE C,141 ;LC "A"
\r
507 SUBI C,40 ;LC TO UC
\r
510 TYPCCL: IDPB C,TOUT+1 ;TYPE CHAR,CRLF
\r
511 TYPCL: MOVEI C,15 ;TYPE CRLF
\r
514 TYPC: IDPB C,TOUT+1 ;TYPE CHAR
\r
515 TYPBUF: OUTPUT 17, ;DO IT
\r
518 \fHELP: TTCALL 3,.+2
\r
524 /L LOAD A BOOTSTRAP LOADER FROM PTR:BSLDR.REL
\r
525 /T "TYPE CORE BANK OR OFFSET FOR BSLDR"
\r
526 CORE-BANK = NNNK (16K TO 256K)
\r
527 OFFSET = <OCTAL 1000 TO 777600>
\r
528 WRITE A BSLDR ONTO BLOCKS 0,1 AND 2
\r
529 /N DONT TYPE A DIRECTORY
\r
534 \fERRT1I: TLOA F,FLI ;INPUT ERROR
\r
535 ERRT1O: TLZ F,FLI ;OUTPUT ERROR
\r
536 STATUS 1,IOS ;STATUS TO IOS
\r
537 TRNE IOS,360000 ;ALL THE ERRORS
\r
538 JRST ERRCHK ;FOUND AN ERROR
\r
541 ERRT2I: TLOA F,FLI ;INPUT ERROR
\r
542 ERRT2O: TLZ F,FLI ;OUTPUT ERROR
\r
543 STATUS 2,IOS ;FLAGS TO IOS
\r
544 TRNN IOS,760000 ;PLUS WRITE LOCK
\r
546 TLO F,FL2 ;IT'S A CHANNEL 2 ERROR
\r
548 ERRCHK: TRNE IOS,400000
\r
549 PUSHJ P,ERR400 ;WRITE LOCK
\r
551 PUSHJ P,ERR200 ;DEVICE ERROR
\r
553 PUSHJ P,ERR100 ;CKSUM/PARITY
\r
555 PUSHJ P,ERR040 ;BLOCK TOO LARGE
\r
556 TRNE IOS,020000 ;PREMATURE EOF,PDP9-DTA?
\r
558 TRNN IOS,600000 ;THESE BITS IMPLY RESTART
\r
559 TLNN F,FLG ;/G+PARITY ERR = CONTINUE
\r
561 TRZ IOS,740000 ;ZERO IN
\r
563 SETSTS 1,(IOS) ;TURN OFF
\r
565 SETSTS 2,(IOS) ;AND
\r
567 \fERR400: MOVEI BP,MES400
\r
569 MES400: SIXBIT /?WRITE LOCK ERROR#/
\r
570 ERR200: PUSHJ P,ERRCOM
\r
573 MES200: SIXBIT / DEVICE ERROR#/
\r
574 ERR100: PUSHJ P,ERRCOM
\r
577 MES100: SIXBIT / CHECKSUM OR PARITY ERROR#/
\r
578 ERR040: PUSHJ P,ERRCOM
\r
581 MES040: SIXBIT / BLOCK TOO LARGE#/
\r
582 ERR020: PUSHJ P,ERRCOM
\r
585 MES020: SIXBIT / PREMATURE END OF FILE#/
\r
586 ERRCOM: MOVEI BP,SXBINP
\r
590 SXBINP: SIXBIT /?INPUT+/
\r
591 SXBOUT: SIXBIT /?OUTPUT+/
\r
592 \fERRVER: MOVE T,[POINT 6,MESVER]
\r
593 MOVE BP,[POINT 3,U,17]
\r
594 ERRVE1: ILDB C,BP ;LOAD AN OCTAL NUMBER
\r
595 ADDI C,20 ;6BITIZE IT
\r
596 IDPB C,T ;INSERT IN MESS
\r
597 TLNE T,770000 ;ONE WORD ONLY
\r
598 JRST ERRVE1 ;LOOP 6 TIMES
\r
601 MESVER: SIXBIT /000000 VERIFICATION ERRORS#/
\r
602 ERRCMD: MOVEI BP,MESCMD
\r
605 MESCMD: SIXBIT /?COMMAND ERROR#/
\r
606 ERRSW: MOVEI BP,MESSW
\r
609 MESSW: SIXBIT /?SWITCH ERROR#/
\r
610 ERRIN1: SKIPA T,IDEV
\r
611 ERRIN2: MOVE T,ODEV
\r
612 TTCALL 3,[ASCIZ /?/]
\r
617 MESINI: SIXBIT / INIT FAILURE#/
\r
618 ERRDT1: SKIPA T,IDEV
\r
619 ERRDT2: MOVE T,ODEV
\r
620 TTCALL 3,[ASCIZ /?/]
\r
625 MESDTA: SIXBIT / MUST BE A DECTAPE#/
\r
626 \fERRTNH: MOVEI BP,MESTNH
\r
629 MESTNH: SIXBIT %?BOOTSTRAP LOADER IS NOT IN COPY. TRY "/L".#%
\r
630 \rPTERR1: TTCALL 3,[ASCIZ /?PTR INIT FAILURE
\r
634 PTERR2: TTCALL 3,[ASCIZ /?LOOKUP FAILED, "BSLDR.REL"
\r
637 \f ;WRITE A BOOOTSTRAP LOADER IN BLOCKS 0,1 AND 2
\r
638 TENINT: PUSH P,JOBFF
\r
639 SETSTS 2,134 ;SO I CAN WRITE IN BLK 0
\r
644 MOVE AC0,[POINT 36,BSBUF]
\r
645 MOVEM AC0,BSPTR ;WHERE THE LOADER IS KEPT
\r
647 HRLI AC0,(POINT 36,)
\r
648 MOVEM AC0,FFPTR ;WHERE ITS WRITTEN FROM
\r
652 HRRI W,-1(CNT) ;FINISH THE IOWD
\r
655 TEN1: PUSHJ P,NBLK ;GET THE NEXT BLOCK, SKIPE XIT IS NORMAL
\r
656 JRST RELDA5 ;TERMINATE THE BSLDR
\r
657 TRNN CNT,-1 ;EMPTY?
\r
659 ILDB OS,BSPTR ;OFFSET FOR THIS BLK
\r
660 LSH RB,2 ;OS'S RELBITS
\r
661 AOBJN CNT,.+1 ;ACCOUNT FOR IT
\r
662 RELDAT: TRNN CNT,-1 ;ANY MORE DATA?
\r
664 ILDB W,BSPTR ;PROGRAM WORD
\r
665 JUMPGE RB,RELDA1 ;CHECK LEFT HALF
\r
667 ADD W,I ;RELOCATE IT
\r
669 RELDA1: TLNE RB,200000 ;CHECK RIGHT HALF
\r
670 HRRI W,@OFFSET ;RELOCATE IT
\r
672 LSH RB,2 ;NEXT RELOCATION BITS
\r
673 AOBJN CNT,RELDAT ;NEXT WORD
\r
675 PUSHJ P,NSEC ;NEXT SECTION OF BLOCK
\r
678 \fNBLK: ILDB CNT,BSPTR ;GET THE BLOCK WRD CNT
\r
680 AOS (P) ;SKIP EXIT IS NORMAL
\r
682 NSEC: ILDB RB,BSPTR ;RELOCATION BITS
\r
683 HRLI CNT,-22 ;WRDS/SECTION
\r
686 RELDA5: MOVE W,SASAV ;THIS JRST IS EXECUTED
\r
687 HRR W,OFFSET(W) ;RELOCATE THE SA ADR
\r
688 IDPB W,FFPTR ;THE LAST WORD
\r
689 HRLZ BP,JOBFF ;BEG OF BSLDR
\r
690 HRR BP,OUT2+1 ;BLT PTR
\r
691 MOVEM BP,C ;SAVE IT
\r
692 BLT BP,177(C) ;ZAP 1
\r
695 MOVEM C,BP ;2ND PTR SAVED
\r
696 BLT BP,177(C) ;ZAP 2
\r
704 PUSHJ P,ERRT2O ;ERRORS?
\r
707 \fCOPZRO: PUSH P,JOBFF ;SAVE JOBFF
\r
708 TLNE F,FLC ;SKIP IO TO UNASSIGNED CHAN.
\r
711 OUTBUF 2,1 ;WITH ONE BUFFER MODE-134
\r
712 USETO 2,0 ;FOR BLOCK ZERO
\r
715 JRST COPBKZ ;NO, MUST BE ZERO
\r
716 INBUF 1,1 ;ONE BUFFER MODE-134
\r
717 USETI 1,0 ;BLOCK ZERO
\r
719 PUSHJ P,ERRT1I ;OK?
\r
720 MOVEI T,177 ;LOOP LENGTH
\r
721 LDB C,IN1+1 ;FIRST WORD
\r
722 DPB C,OUT2+1 ;TO THE BUFFER
\r
723 COPLPZ: ILDB C,IN1+1 ;OTHER WORDS
\r
724 IDPB C,OUT2+1 ;TO THE BUFFER
\r
725 SOJG T,COPLPZ ;TO LOOP
\r
726 SETSTS 1,136 ;INPUT DEVICE
\r
727 USETI 1,1 ;SIX FORMATTED DIRECTORY
\r
728 INPUT 1,DIRWRD ;GET IT
\r
729 COPBKZ: OUTPUT 2, ;DUMP THE BUFFER
\r
730 POP P,JOBFF ;FOR VERIFY?
\r
731 PUSHJ P,ERRT2O ;OK?
\r
732 SETSTS 2,136 ;DUMP MODE
\r
733 MOVE U,JOBREL ;UPPER LIMIT
\r
734 MOVE T,BLTWRD ;FROM,TO
\r
735 SETZM @ZROWRD ;START
\r
737 MOVEI LOC,1 ;START AT BLOCK ONE
\r
738 COPSET: TLNE F,FLC ;SKIP
\r
739 USETI 1,(LOC) ;IO 2 UNASGND CH
\r
740 USETO 2,(LOC) ;SET THE BLOCK NO.
\r
741 ADD LOC,INC ;ADD THE INCREMENT
\r
742 CAILE LOC,1102 ;WILL IT FIT?
\r
744 PUSHJ P,COPYIT ;ONE BUFFER
\r
745 JRST COPSET ;AND LOOP
\r
746 COPFIN: MOVEI T,-1102(LOC) ;N BLOCKS WON'T FIT
\r
747 IMULI T,200 ;N WORDS WON'T FIT
\r
748 MOVSS T ;GET ORGANIZED
\r
749 ADDM T,LISTC ;SUB N WORDS FROM LIST
\r
750 SKIPL LISTC ;IF LH OF IOWD = 0,
\r
752 COPYIT: TLNN F,FLC ;COPY?
\r
754 INPUT 1,LISTC ;COPY!
\r
755 PUSHJ P,ERRT1I ;OK?
\r
756 CAILE LOC,144 ;SKIP IF NO CHANCE
\r
757 PUSHJ P,DSAV ;TRY FOR A DIRECTORY
\r
758 COPOUT: OUTPUT 2,LISTC ;COPY AND ZERO
\r
760 \fVERZRO: PUSH P,JOBFF
\r
761 SETZB VZ1,VZ2 ;CMDLST TERMINATOR
\r
763 SETSTS 2,134 ;IB MODE
\r
767 INBUF 2,1 ;ONE BUFFER EA
\r
768 INPUT 1, ;GET A BLOCK
\r
770 INPUT 2, ;GET ANOTHER
\r
774 HRLI V1,-200 ;FOR VERIFY LOOP
\r
775 POP P,JOBFF ;RECLAIM BUFFERS
\r
776 PUSHJ P,VERIFY ;VERIFY AND EXIT THIS PAGE
\r
777 VERONE: SETSTS 1,136 ;SET
\r
778 SETSTS 2,136 ;DUMP MODE
\r
779 MOVEI LOC,1 ;START AT BLOCK 1
\r\r\r
780 VERSET: MOVE V1,LISTV1 ;IOWDS
\r
781 MOVE V2,LISTV2 ;TO ACS
\r
782 USETI 1,(LOC) ;MASTER
\r
783 USETI 2,(LOC) ;AND COPY
\r
784 ADD LOC,INCV ;ADD IN THE INCREMENT
\r
785 CAILE LOC,1102 ;AM I ASKING TOO MUCH?
\r
787 PUSHJ P,VERIN ;COUPLE OF INPUTS AND VERIFY
\r
790 VERFIN: SUBI LOC,1102 ;HOW MUCH TOO MUCH?
\r
791 IMULI LOC,200 ;IN WORDS PLEASE
\r
792 MOVSS LOC ;BACKWARDS
\r
793 ADD V1,LOC ;SUB WORDS FROM LIST
\r
794 ADD V2,LOC ;I.E. ASK FOR LESS
\r
795 SKIPL V1 ;IF LH OF IOWD = 0,
\r
798 VERIN: INPUT 1,V1 ;ONE FOR THE MASTER
\r
799 PUSHJ P,ERRT1I ;OK?
\r
800 INPUT 2,V2 ;ONE FOR THE COPY
\r
801 PUSHJ P,ERRT2I ;OK?
\r
803 VERIFY: SETZ U, ;CLR THE ERROR CNT
\r
804 MOVE T,1(V1) ;MASTER WORD
\r
805 CAME T,1(V2) ;SAME AS COPY WORD?
\r
806 AOS U ;NO, COUNT THE ERRORS
\r
808 AOBJN V1,VERIFY+1 ;BOTH HALVES AND LOOP
\r
809 JUMPN U,ERRVER ;ERROR MESS IF APPROPIATE
\r
810 POPJ P, ;UNLESS V1 IS POSITIVE
\r
815 MOVE BP,ODEV ;MAKE SURE ITS A DTA.
\r
818 JRST ERRDT2 ;ERROR, ITS NOT A DTA
\r
819 SKIPN BP,IDEV ;IF NULL
\r
820 POPJ P, ;NO INPUT DEV REQUIRED
\r
821 CAMN BP,ODEV ;SAME DEVICES?
\r
827 MOVE BP,IDEV ;MAKE SURE ITS A DTA
\r
833 INITER: TTCALL 3,[ASCIZ /INPUT AND OUTPUT DEC-TAPES MAY NOT BE THE SAME DEVICE.
\r
836 \f; LOAD A BOOTSTRAP LOADER,
\r
839 W=2 ;WORD OF TENDMP.REL
\r
840 CNT=3 ;# OF WORDS IN CURRENT BLOCK
\r
841 TYPE=4 ;TYPE OF BLOCK
\r
843 RB=5 ;RELOCATION BITS
\r
845 FFPTR: BLOCK 1 ;BYTEPTR TO RELOCATED BSLDR
\r
846 BSPTR: BLOCK 1 ;BYTPTR TO UNRLCTD BSLDR
\r
847 OFFSET: BLOCK 1 ;THE OFFSET
\r
848 RELBTS: BLOCK 1 ;RELOCATION BITS
\r
849 SASAV: BLOCK 1 ;STARTING ADDRESS
\r
850 PNAME: BLOCK 1 ;PROGRAM NAME
\r
851 SIXBIT /#/ ;# = "CRLF"
\r
854 BSLDR: MOVE AC0,[SIXBIT /BSLDR/] ;LOOKUP BLOCK
\r
855 HRLZI AC1,(SIXBIT /REL/)
\r
857 INIT 16,13 ;IMAGE-BINARY
\r
860 JRST PTERR1 ;INIT FAILURE ERROR
\r
861 INBUF 16,1 ;ONE BUFFER
\r
862 LOOKUP 16, ;BSLDR.REL
\r
863 JRST PTERR2 ;LOOKUP FAILURE
\r
864 MOVEI I,BSBUF ;PP PTR FOR BOOTSTRAP-LOADER-BUF
\r
866 NEWBLK: PUSHJ P,GETWRD ;GET ONE WORD FROM PTR FILE
\r
867 HLRZM W,TYPE ;SAVE BLOCK-TYPE
\r
868 HRRZM W,CNT ;SAVE WRD-COUNT FOR THIS BLK
\r
870 PUSH I,W ;SAVE BLOCK HDR-WRD
\r
872 MOVEM W,RELBTS ;SAVE RELOCATION-BITS
\r
873 CAIN TYPE,1 ;BLKTYP=1?
\r
874 PUSH I,W ;YEP, SAVE THE BITS
\r
875 CAIG TYPE,7 ;ILL-BLK-TYP?
\r
876 JRST @TYPTAB(TYPE) ;NO, OFF TO BLOCK HANDLER
\r\r\r
878 TTCALL 3,[ASCIZ /?ILLEGAL BLOCK TPYE
\r
891 GETWRD: SOSG PTRBUF+2 ;EMPTY BUF?
\r
892 PUSHJ P,GETBUF ;GET A BUFFER
\r
896 GETBUF: IN 16, ;GET BUFFER
\r
898 STATZ 16,20000 ;EOF?
\r
899 TTCALL 3,[ASCIZ /?NO END BLOCK ENCOUNTERED
\r
901 STATZ 16,74000 ;ERRORS?
\r
902 TTCALL 3,[ASCIZ /?DATA ERROR ON DEVICE PTR
\r
905 ;THIS IS NOT A BLOCK, IGNORE IT
\r
906 BLK0: JUMPE CNT,NEWBLK ;
\r
907 PUSHJ P,GETWRD ;PASS A WRD
\r
910 ;THIS IS THE PROGRAM
\r
911 BLK1: MOVN CNT,CNT ;TOTAL NUMBER OF WRDS THIS BLK
\r
912 BLK1A: HRLI CNT,-22 ;MAX NUMBER PER SECTION
\r
913 BLK1B: TRNN CNT,-1 ;ANY MORE WRDS?
\r
916 PUSH I,W ;SAVE IN BSBUF
\r
917 AOBJN CNT,BLK1B ;ANY MORE WRDS THIS SECTION?
\r
918 TRNN CNT,-1 ;NO, ...THIS BLK?
\r
920 PUSHJ P,GETWRD ;GET THE REL-BITS FOR NXT SECT
\r
924 \f ;THIS IS THE SYMBOL TABLE
\r
925 BLK2: MOVN CNT,CNT ;
\r
926 BLK2A: HRLI CNT,-22 ;
\r
927 BLK2B: TRNN CNT,-1 ;
\r
931 JUMPL W,BLK2ER ;ERROR - ITSA EXTERNAL SYMBOL
\r
932 AOBJN CNT,.+1 ;IGNORE THE VALUE
\r
938 BLK2ER: TTCALL 3,[ASCIZ /?CANNOT PROCESS EXTERNAL SYMBOLS
\r
942 ;HIGHSEG FLAG, GIVE ERROR EXIT
\r
943 BLK3: TTCALL 3,[ASCIZ /?CANNOT PROCESS HIGH-SEG'S
\r
947 ;ENTRY BLOCK, IGNORE THIS BLOCK
\r
948 BLK4: MOVN CNT,CNT ;
\r
949 BLK4A: HRLI CNT,-22 ;
\r
953 AOBJN CNT,BLK4A+1 ;PASS/IGNORE
\r
959 ;THIS IS LAST BLK, MUST BE SEEN, ALSO IS PROG-BREAK
\r
960 BLK5: PUSHJ P,GETWRD ;
\r
962 HRLM AC0,BSBUF ;START THE IOWD
\r
963 CAILE W,600 ;MUST FIT IN LESS-THAN 4 BLKS
\r
964 JRST BLK5ER ;ERROR IF'E CAN'T
\r
965 TLO W,400000 ;NOTE THE END
\r
967 HRLZI LFL ;NOTE BSLDR IS IN "COPY"
\r
968 IORM FSAVE ;SAVE IT
\r
971 JRST COCRET ;THE ONLY WAY OUT
\r
972 BLK5ER: TTCALL 3,[ASCIZ /?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS
\r
976 \f ;PROG-NAME IN RADIX50
\r
977 BLK6: PUSHJ P,GETWRD ;
\r
978 PUSHJ P,UNWIND ;CONVRT RX50 TO 6BIT PROG-NAME
\r
979 SOJA CNT,BLK4 ;I.E. IGNORE REST OF THIS BLK
\r
981 UNWIND: MOVE AC4,[POINT 6,PNAME]
\r
984 HRROI AC0,-6 ;6 CHARS
\r
985 TLZ W,740000 ;CLEAR THE CODE BITS
\r
986 UNW1: IDIVI AC5,50 ;
\r
987 HRLM AC6,(P) ;SAVE REMAINDER
\r
988 AOJGE AC0,UNW2 ;LOOP
\r
990 UNW2: HLRZ AC6,(P) ;PICK OFF THE REMAINDER + DECODE IT
\r
991 JUMPE AC6,UNW3 ;DONE
\r
1004 BLK7: PUSHJ P,GETWRD ;
\r
1005 HRLI W,(JRST) ;JUMP TO THE STARTING ADDRESS
\r
1006 MOVEM W,SASAV ;SAVE STARTING ADDRESS
\r
1007 SOJA CNT,BLK4 ;IGNORE REST OF BLK
\r
1009 \fBLTWRD: XWD END.,END.+1 ;ZRO FROM,TO
\r
1010 ZROWRD: EXP END. ;START
\r
1011 FSAVE: XWD FLP,0 ;MODIFIED WHEN BSLDR IS LOADED
\r
1012 LISTC: IOWD 0,END.
\r
1014 LISTV1: IOWD 0,END.
\r
1015 LISTV2: IOWD 0,END.
\r
1020 TOTAL: BLOCK 26 ;BLOCK TABLE
\r
1021 DIRWRD: IOWD 200,DIRECT
\r
1023 REWIND: IOWD 1,PTRBUF
\r
1025 TTYIN: BLOCK 23+20
\r
1033 BSBUF: BLOCK 720 ;ENUF FOR 3BLOCKS PLUS HDR WRDS
\r
1036 END.: END ST ;;22-JUN
\r