Fixed some typos and added COPY and DTBOOT.
[retro-software/dec/tops10/v4.5.git] / src / copy.mac
1 TITLE COPY      V006    31MAR\r
2 ;COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
3 REPEAT 0,<\r
4 \r
5 \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
11 \r
12         /C      COPY ALL BLOCKS FROM THE INPUT DECTAPE ONTO\r
13                 THE OUTPUT DECTAPE.\r
14         /Z      ZERO ALL BLOCKS OF THE OUTPUT DECTAPE, CLEAR\r
15                 THE DIRECTORY.\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
27                 EX:     NNNK=64K\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
34 \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
37 \r
38 \fTHE FOLLOWING MESSAGES MAY BE OUTPUT TO THE USER'S TELETYPE.\r
39 \r
40         ?WRITE LOCK ERROR\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
46         ?COMMAND ERROR\r
47         ?SWITCH ERROR\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
51 \r
52 THE FOLLOWING MAY BE OUTPUT WHILE PROESSING "/L".\r
53         ?PTR INIT FAILURE\r
54         ?LOOKUP FAILED, "BSLDR.REL"\r
55         ?DATA ERROR ON DEVICE PTR\r
56         ?ILLEGAL BLOCKTYPE\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
61 \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
67 >\r
68 \f\r
69 FLP=400000              ;NOT SW MODE                    **FLAGS ARE IN LH OF F**\r
70 FLC=200000              ;COPY\r
71 FLZ=100000              ;ZERO\r
72 FLV= 40000              ;VERIFY\r
73 FLT= 20000              ;TENDMP\r
74 FLG= 10000              ;IGNORE PARITY ERRORS\r
75 FLL=  4000              ;LIST DIR\r
76 FLK=  2000              ;COLON\r
77 FLA=  1000              ;LEFT ARROW\r
78 FLI=   400              ;INPUT DEVICE\r
79 FL2=   200              ;CHANEL TWO\r
80 HSW=   100              ;HELP\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
84 FL6=     2              ;6 FORMATTED\r
85 FPT=     1              ;A PDP-10\r
86 ANYSW=FLC+FLZ+FLV+FLT   ;ANYSW=0 IMPLIES FLC+FLV\r
87 JOBVER=137\r
88 \r
89 AC0=0\r
90 AC1=1\r
91 AC2=2\r
92 AC3=3\r
93 AC4=4\r
94 AC5=5\r
95 AC6=6\r
96 V1=1    ;VERIFY CMDLST\r
97 VZ1=2   ;CMDLST TERMINATOR\r
98 V2=3    ;VERIFY CMDLST\r
99 VZ2=4   ;CMDLST TERM\r
100 BP=5    ;BYTE POINTER\r
101 C=6     ;CURRENT CHARACTER\r
102 LOC=7   ;BLOCK NUMBER\r
103 T=10    ;TEMP\r
104 U=T+1   ;TEMP\r
105 F=12    ;FLAGS\r
106 UNSD2=14        ;UNUSED\r
107 UNSD3=15        ;UNUSED\r
108 IOS=16  ;IO STATUS\r
109 P=17    ;PUSH DOWN LIST\r
110         EXTERN  JOBFF,JOBREL,JOBSA,JOBREN\r
111         LOC     JOBVER\r
112         XWD     0,6     ;;VERSION #\r
113         RELOC\r
114 \f\r
115 ST:     CALLI   0\r
116         MOVE    P,[IOWD 20,TTYIN+23]    ;PUSH DOWN LIST\r
117         INIT    17,1                    ;ASCII LINE\r
118         SIXBIT  /TTY/\r
119         XWD     TOUT,TIN\r
120         HALT    .                       ;INIT ERROR\r
121         PUSH    P,JOBFF\r
122         MOVEI   T,TTYIN\r
123         MOVEM   T,JOBFF\r
124         INBUF   17,1                    ;SET THE BUFFER ADR TO TTYIN\r
125         MOVEI   T,TTYOUT\r
126         MOVEM   T,JOBFF\r
127         OUTBUF  17,1                    ;SET THE BUFFER ADR TO TTYOUT\r
128         OUTPUT  17,                     ;DUMMY\r
129         SETZB   F,IDEV\r
130         SETZB   T,ODEV\r
131         POP     P,JOBFF\r
132 \r
133         MOVE    T,JOBREL\r
134         SUB     T,JOBFF                 ;T=NO. OF FREE LOC\r
135         MOVE    C,JOBFF         ;\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
139         JFCL                    ;O WELL\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
147         HRLM    U,C             ;ASSEMBLE\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
151         ADDI    U,100           ;ADJUST\r
152         HRL     C,U             ;ASSEMBLE\r
153         MOVEM   C,LISTV1        ;VERIFY IOWD #1\r
154         MOVMM   U,U             ;\r
155         ADD     C,U             ;ASSEMBLE\r
156         MOVEM   C,LISTV2        ;VERIFY IOWD #2\r
157 \r
158 \f       MOVEI   C,"*"\r
159         PUSHJ   P,TYPC                  ;OUTPUT CHAR\r
160         INPUT   17,\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
165         CAIN    C,"/"\r
166         JRST    COSLSH                  ;SLASH\r
167         CAIN    C,"("\r
168         JRST    COLPRN                  ;LEFT PAREN\r
169         CAIN    C,":"\r
170         JRST    COCOLN                  ;COLON\r
171         CAIE    C,12\r
172         CAIN    C,15\r
173         JRST    COCRET                  ;CR OR LF\r
174         CAIE    C,175                   ;ALTMODE?\r
175         CAIN    C,33                    ;ALTMODE?\r
176         JRST    COCRET                  ;YES\r
177         CAIN    C,176                   ;ALTMODE?\r
178         JRST    COCRET                  ;YES\r
179         CAIE    C,"="                   ;==_\r
180         CAIN    C,"_"\r
181         JRST    COLARO                  ;LEFT ARROW\r
182         CAIGE   C,"0"                   ;\r
183         JRST    ERRCMD                  ;\r
184         CAILE   C,"9"                   ;ILLEGAL CHAR?\r
185         CAIL    C,"A"                   ;\r
186         CAILE   C,"Z"                   ;\r
187         JRST    ERRCMD                  ;\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
191         JRST    COTGET                  ;\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
202 \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
207 \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
212 \r
213 COCRET: TLZE    F,HSW           ;HELP?\r
214         JRST    HELP            ;\r
215         TLZE    F,LSW           ;LOADING A LOADER?\r
216         JRST    BSLDR           ;YES\r
217         TLNE    F,FLA                   ;LEFT ARO ?\r
218         JRST    COSTRT                  ;_,SO OK\r
219         SKIPE   ODEV                    ;\r
220         JRST    ERRCMD                  ;NO_,SOME ODEV\r
221         TLNN    F,ANYSW                 ;\r
222         JRST    ST                      ;NO_,NO ODEV,NO SW =*\r
223         JRST    ERRCMD          ;NO_,NO ODEV, NO SW\r
224 \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
231         SKIPN   T,IDEV\r
232         TLNE    F,FLC+FLV\r
233         JUMPE   T,ERRCMD        ;AN INDEVICE IS REQUIRED\r
234         TLNN    F,FLT           ;IS 10DMP WANTED?\r
235         JRST    CINIT           ;NO, PROCEED\r
236 \r
237 \f       ;HERE TO ACCEPT THE BOOTSTRAP LOADER OFFSET (/T)\r
238 \r
239 CTENDM: TLNN    F,LFL           ;IS A BOOTSTRAP LOADER LOADED?\r
240         JRST    ERRTNH          ;NO, COMPLAIN\r
241 CTEN1:  SETZB   AC1,OFFSET      ;\r
242         TTCALL  3,[ASCIZ /\r
243 TYPE CORE BANK OR OFFSET FOR /]\r
244         MOVEI   BP,PNAME\r
245         PUSHJ   P,TYPEIT        ;BSLDR'S NAME\r
246         INPUT   17,\r
247 CTEN0:  PUSH    P,TIN+1         ;SAVE PTR FOR RESCAN\r
248         MOVEI   AC0,6           ;MAX CHARS TO ACCEPT\r
249         PUSHJ   P,TYPGET        ;\r
250         CAIN    C,"K"           ;\r
251         JRST    CTEN10          ;K, MUST BE A CORE-BANK\r
252         SOJG    AC0,.-3\r
253         POP     P,TIN+1         ;\r
254         MOVEI   AC0,6           ;ACCEPT 6 NUMBERS\r
255 CTEN2:  PUSHJ   P,TYPGET        ;GET A CHAR\r
256         CAIL    C,"0"           ;\r
257         CAILE   C,"7"           ;\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
268         JRST    CINIT           ;\r
269 \r
270 CTEN7:  CAIL    C,12            ;"LF"\r
271         CAILE   C,15            ;"CR"\r
272         CAIN    C,33            ;ALTMODE\r
273         JRST    CTEN3           ;A TERMINATOR\r
274 CTEN8:  TTCALL  3,[ASCIZ /\r
275 ?OFFSET = 1000 TO 777600 (OCTAL)/]\r
276         JRST    CTEN1           ;\r
277 \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
282         CAIL    C,"0"           ;\r
283         CAILE   C,"9"           ;\r
284         JRST    CTEN17          ;\r
285         IMULI   AC1,^D10        ;MAKE ROOM FOR NEXT CHAR... DEC TO OCT\r
286         ANDI    C,17            ;EXTRACT DECIMAL NUMBER\r
287         ADD     AC1,C           ;\r
288         SOJG    AC0,CTEN11      ;\r
289 \r
290 CTEN12: TRNE    AC1,17          ;CHECK FOR MODULO 16\r
291         JRST    CTEN18                  ;ILL\r
292         JUMPE   AC1,CTEN18              ;ILL\r
293         LSH     AC1,-4          ;PUSH OFF ZEROES\r
294         CAILE   AC1,20          ;MAX IS 256\r
295         JRST    CTEN18  ;ILL\r
296         IMULI   AC1,40000       ;TURN IT INTO AN OFFSET\r
297         SUBI    AC1,1           ;\r
298         TRZ     AC1,777         ;1K BELOW TOP OF THIS BANK\r
299         JRST    CTEN4           ;\r
300 CTEN17: CAIN    C,"K"           ;SKIP IF TERM\r
301         JRST    CTEN12          ;\r
302 \r
303 CTEN18: TTCALL  3,[ASCIZ /\r
304 ?EXPECTED FORMAT IS "NNNK" = 16K TO 256K.\r
305 /]\r
306         JRST    CTEN1\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
314         JRST    CNOZRO          ;NO\r
315         SETSTS  2,16            ;YES\r
316         CALLI   2,13            ;CLEAR DIR IN CORE\r
317         RELEAS  2,              ;AND ON TAPE\r
318         MOVEI   T,14            ;AND\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
327 \r
328 LALA:   MTAPE   2,1             ;\r
329         SKIPE   C,IDEV          ;\r
330         MTAPE   1,1             ;\r
331         JFCL    1,.+1           ;PROCESSOR TEST\r
332         JRST    .+1             ;\r
333         JFCL    1,.+3           ;6-JUMP\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
337         USETI   1,1\r
338         INPUT   1,REWIND        ;IOWD 1,DATA\r
339 LSTES0: USETI   2,1\r
340         INPUT   2,REWIND\r
341 LSTEST: TLZE    F,FLL           ;LIST A DIR?\r
342         JRST    DLST            ;YES\r
343         MOVEI   C,^D15          ;SECONDS\r
344 GDNITE: TLNE    F,FPT           ;6-SKIP\r
345         CALLI   C,31            ;TO SLEEP\r
346         POPJ    P,              ;\r
347 \r
348 SWTAB:  XWD     FLP,")"         ;XIT\r
349         XWD     FLC,"C"         ;COPY\r
350         XWD     FLZ,"Z"         ;ZERO\r
351         XWD     FLV,"V"         ;VERIFY\r
352         XWD     FLT,"T"         ;TENDMP\r
353         XWD     FLG,"G"         ;IGNORE\r
354         XWD     HSW,"H"         ;HELP\r
355         XWD     LSW,"L"         ;LOAD BSLDR\r
356         XWD     NSW,"N"         ;NO DIR\r
357         XWD     FL6,"6"         ;PDP6 DIR\r
358         LEN=.-SWTAB\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
363         SUB     1,INC           ;FIND A\r
364         IMULI   1,-200          ;     DIRECTORY,\r
365         ADD     1,LISTC         ;GRAB\r
366         HRLI    1,1(1)          ;    A\r
367         HRRI    1,DIRECT        ;     DIRECTORY.\r
368         BLT     1,DIRECT+177    ;SAVE IT.\r
369         POPJ    P,              ;RETURN\r
370 \r
371 DATE:   SETZ    AC2,\r
372         LDB     AC5,DATEP\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
384         POPJ    P,              ;\r
385 \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
389         POPJ    P,              ;RETURN\r
390 \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
399         SIXBIT  /  -FEB/\r
400         SIXBIT  /  -MAR/\r
401         SIXBIT  /  -APR/\r
402         SIXBIT  /  -MAY/\r
403         SIXBIT  /  -JUN/\r
404         SIXBIT  /  -JUL/\r
405         SIXBIT  /  -AUG/\r
406         SIXBIT  /  -SEP/\r
407         SIXBIT  /  -OCT/\r
408         SIXBIT  /  -NOV/\r
409         SIXBIT  /  -DEC/\r
410 \r
411                 ;STANDARD OCTAL TO ASCII ROUTINE\r
412 DECMAL: IDIVI   C,^D10          ;\r
413         HRLM    C+1,(P)         ;\r
414         SKIPE   C               ;\r
415         PUSHJ   P,DECMAL        ;\r
416         HLRZ    C,(P)           ;\r
417         ADDI    C,60            ;\r
418         JRST    TYPC            ;\r
419 \r
420 DLST:   TLNE    F,NSW           ;DIRECTORY WANTED?\r
421         JRST    DXIT            ;NO\r
422         TLNE    F,FL6           ;6FMT?\r
423         JRST    D6LST           ;YES.\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
432         SOJG    1,DLST2                 ;LOOP\r
433         MOVEI   BP,FREE         ;FREE:\r
434         PUSHJ   P,TYPEIT                ;\r
435         MOVE    C,TOTAL         ;NUMBER OF FREE BLOCKS\r
436         PUSHJ   P,DECMAL                ;\r
437         MOVEI   BP,BLKS         ;-BLKS\r
438         PUSHJ   P,TYPEIT                ;\r
439         MOVEI   C,^D22          ;26 FILES MAX\r
440         HRLZI   AC1,-^D22               ;\r
441 DLST7:  SKIPE   DNAM(AC1)       ;\r
442         SOS     C               ;DECREMENT MAX NO. OF BLKS\r
443         AOBJN   AC1,DLST7       ;\r
444         PUSHJ   P,DECMAL        ;\r
445         MOVEI   BP,FILES        ;\r
446         PUSHJ   P,TYPEIT        ;\r
447         HRLZI   1,-^D22                 ;LOOP 26 TIMES\r
448 \r
449 \fDLST3: HRLZI   3,161300                ;TERMINATOR\r
450         SKIPN   2,DNAM(1)               ;FILE NAME\r
451         JRST    DLST5                   ;\r
452         MOVEI   BP,2                    ;\r
453         PUSHJ   P,TYPEIT                ;\r
454         HLLZ    2,DNAM+^D22(1)          ;EXTENSION\r
455         HRRI    2,13                    ;\r
456         MOVEI   BP,2                    ;\r
457         PUSHJ   P,TYPEIT                ;\r
458         MOVE    C,TOTAL+1(1)            ;NUMBER OF BLKS\r
459         PUSHJ   P,DECMAL                ;\r
460         MOVEI   C,"     "                       ;SPACE\r
461         PUSHJ   P,TYPC                  ;\r
462         PUSHJ   P,DATE                  ;CREATION DATE\r
463         MOVEI   BP,2                    ;\r
464         HRRI    3,30000                 ;"#"\r
465         PUSHJ   P,TYPEIT                ;\r
466 DLST5:  AOBJN   1,DLST3                 ;LOOP\r
467 DXIT:   MOVEI   C,^D15          ;15 SECONDS\r
468         JRST    GDNITE          ;TO SLEEP.\r
469 \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
473         MOVEI   BP,2            ;\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
478         SKIPN   2               ;IF NULL,\r
479         JRST    D6FIN           ;JUMP\r
480         MOVEI   C,"     "       ;OTHERWISE\r
481         PUSHJ   P,TYPC          ;TAB\r
482         HRRI    2,130000        ;"-"\r
483         MOVEI   BP,2            ;TERM.\r
484         PUSHJ   P,TYPEIT        ;\r
485 D6FIN:  PUSHJ   P,TYPCL         ;CR-LF\r
486         ADDI    1,4             ;\r
487         SOJG    0,D6BEG         ;IN CASE\r
488         JRST    DXIT            ;DIR WAS FULL\r
489 \f\r
490 TYPEIT: HRLI    BP,440600               ;BP=MESSAGE ADR\r
491 TYPLOP: ILDB    C,BP                    ;\r
492         CAIN    C,13                    ;PLUS?\r
493         POPJ    P,                      ;GET THE WHOLE MESSASE\r
494         CAIN    C,3                     ;#?\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
498         JRST    TYPLOP                  ;+LOOP\r
499 \r
500 TYPGET: ILDB    C,TIN+1                 ;GET CHAR\r
501         CAIE    C," "                   ;SPACE?\r
502         CAIN    C,"     "               ;TAB?\r
503         JRST    TYPGET                  ;FORGET IT\r
504         CAIGE   C,141                   ;LC "A"\r
505         POPJ    P,\r
506         CAIG    C,172                   ;LC "Z"\r
507         SUBI    C,40                    ;LC TO UC\r
508         POPJ    P,\r
509 \r
510 TYPCCL: IDPB    C,TOUT+1                ;TYPE CHAR,CRLF\r
511 TYPCL:  MOVEI   C,15                    ;TYPE CRLF\r
512         IDPB    C,TOUT+1\r
513         MOVEI   C,12\r
514 TYPC:   IDPB    C,TOUT+1                ;TYPE CHAR\r
515 TYPBUF: OUTPUT  17,                     ;DO IT\r
516         POPJ    P,\r
517 \r
518 \fHELP:  TTCALL  3,.+2\r
519         JRST    COCRET\r
520 ASCIZ %\r
521 /C COPY \r
522 /V VERIFY\r
523 /Z ZERO ALL BLOCKS\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
530 /6 PDP6 DIR\r
531 /G IGNORE ERRORS\r
532 NO SW'S IMPLY /C/V\r
533 %\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
539         POPJ    P,\r
540 \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
545         POPJ    P,                      ;NO ERRORS\r
546         TLO     F,FL2                   ;IT'S A CHANNEL 2 ERROR\r
547 \r
548 ERRCHK: TRNE    IOS,400000\r
549         PUSHJ   P,ERR400                ;WRITE LOCK\r
550         TRNE    IOS,200000\r
551         PUSHJ   P,ERR200                ;DEVICE ERROR\r
552         TRNE    IOS,100000\r
553         PUSHJ   P,ERR100                ;CKSUM/PARITY\r
554         TRNE    IOS,040000\r
555         PUSHJ   P,ERR040                ;BLOCK TOO LARGE\r
556         TRNE    IOS,020000              ;PREMATURE EOF,PDP9-DTA?\r
557         PUSHJ   P,ERR020                ;\r
558         TRNN    IOS,600000              ;THESE BITS IMPLY RESTART\r
559         TLNN    F,FLG                   ;/G+PARITY ERR = CONTINUE\r
560         JRST    ST                      ;RESTART\r
561         TRZ     IOS,740000              ;ZERO IN\r
562         TLNN    F,FL2\r
563         SETSTS  1,(IOS)                 ;TURN OFF\r
564         TLZE    F,FL2\r
565         SETSTS  2,(IOS)                 ;AND\r
566         POPJ    P,                      ;POP OUT\r
567 \fERR400:        MOVEI   BP,MES400\r
568         JRST    TYPEIT\r
569 MES400: SIXBIT  /?WRITE LOCK ERROR#/\r
570 ERR200: PUSHJ   P,ERRCOM\r
571         MOVEI   BP,MES200\r
572         JRST    TYPEIT\r
573 MES200: SIXBIT  / DEVICE ERROR#/\r
574 ERR100: PUSHJ   P,ERRCOM\r
575         MOVEI   BP,MES100\r
576         JRST    TYPEIT\r
577 MES100: SIXBIT  / CHECKSUM OR PARITY ERROR#/\r
578 ERR040: PUSHJ   P,ERRCOM\r
579         MOVEI   BP,MES040\r
580         JRST    TYPEIT\r
581 MES040: SIXBIT  / BLOCK TOO LARGE#/\r
582 ERR020: PUSHJ   P,ERRCOM\r
583         MOVEI   BP,MES020\r
584         JRST    TYPEIT\r
585 MES020: SIXBIT  / PREMATURE END OF FILE#/\r
586 ERRCOM: MOVEI   BP,SXBINP\r
587         TLNN    F,FLI\r
588         MOVEI   BP,SXBOUT\r
589         JRST    TYPEIT\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
599         MOVEI   BP,MESVER\r
600         JRST    TYPEIT\r
601 MESVER: SIXBIT  /000000 VERIFICATION ERRORS#/\r
602 ERRCMD: MOVEI   BP,MESCMD\r
603         PUSHJ   P,TYPEIT\r
604         JRST    ST\r
605 MESCMD: SIXBIT  /?COMMAND ERROR#/\r
606 ERRSW:  MOVEI   BP,MESSW\r
607         PUSHJ   P,TYPEIT\r
608         JRST    ST\r\r\r
609 MESSW:  SIXBIT  /?SWITCH ERROR#/\r
610 ERRIN1: SKIPA   T,IDEV\r
611 ERRIN2: MOVE    T,ODEV\r
612         TTCALL  3,[ASCIZ /?/]\r
613         MOVEM   T,MESINI\r
614         MOVEI   BP,MESINI\r
615         PUSHJ   P,TYPEIT\r
616         JRST    ST\r
617 MESINI: SIXBIT  /       INIT FAILURE#/\r
618 ERRDT1: SKIPA   T,IDEV\r
619 ERRDT2: MOVE    T,ODEV\r
620         TTCALL  3,[ASCIZ /?/]\r
621         MOVEM   T,MESDTA\r
622         MOVEI   BP,MESDTA\r
623         PUSHJ   P,TYPEIT\r
624         JRST ST\r
625 MESDTA: SIXBIT  /       MUST BE A DECTAPE#/\r
626 \fERRTNH:        MOVEI   BP,MESTNH\r
627         PUSHJ   P,TYPEIT\r
628         JRST    ST\r
629 MESTNH: SIXBIT  %?BOOTSTRAP LOADER IS NOT IN COPY. TRY "/L".#%\r
630 \rPTERR1:        TTCALL  3,[ASCIZ /?PTR INIT FAILURE\r
631 /]\r
632         JRST    ST\r
633 \r
634 PTERR2: TTCALL  3,[ASCIZ /?LOOKUP FAILED, "BSLDR.REL"\r
635 /]\r
636         JRST    ST\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
640         USETO   2,0\r
641         OUTBUF  2,1\r
642         OUTPUT  2,              ;DUMMY!\r
643 \r
644         MOVE    AC0,[POINT 36,BSBUF]\r
645         MOVEM   AC0,BSPTR       ;WHERE THE LOADER IS KEPT\r
646         HRRZ    AC0,JOBFF       ;\r
647         HRLI    AC0,(POINT 36,)\r
648         MOVEM   AC0,FFPTR       ;WHERE ITS WRITTEN FROM\r
649 \r
650         ILDB    W,BSPTR         ;IOWD\r
651         MOVE    CNT,OFFSET      ;\r
652         HRRI    W,-1(CNT)       ;FINISH THE IOWD\r
653         IDPB    W,FFPTR         ;\r
654 \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
658         JRST    TEN1            ;YES\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
663         JRST    TEN1            ;NO\r
664         ILDB    W,BSPTR         ;PROGRAM WORD\r
665         JUMPGE  RB,RELDA1       ;CHECK LEFT HALF\r
666         HRLZ    I,OFFSET                ;\r
667         ADD     W,I             ;RELOCATE IT\r
668 \r
669 RELDA1: TLNE    RB,200000       ;CHECK RIGHT HALF\r
670         HRRI    W,@OFFSET       ;RELOCATE IT\r
671         IDPB    W,FFPTR         ;\r
672         LSH     RB,2            ;NEXT RELOCATION BITS\r
673         AOBJN   CNT,RELDAT      ;NEXT WORD\r
674         TRNE    CNT,-1          ;\r
675         PUSHJ   P,NSEC          ;NEXT SECTION OF BLOCK\r
676         JRST    RELDAT          ;\r
677 \r
678 \fNBLK:  ILDB    CNT,BSPTR       ;GET THE BLOCK WRD CNT\r
679         SKIPL   CNT             ;\r
680         AOS     (P)             ;SKIP EXIT IS NORMAL\r
681         MOVN    CNT,CNT         ;\r
682 NSEC:   ILDB    RB,BSPTR        ;RELOCATION BITS\r
683         HRLI    CNT,-22         ;WRDS/SECTION\r
684         POPJ    P,\r
685 \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
693         OUTPUT  2,              ;BLK 0\r
694         ADD     C,[XWD 200,0]\r
695         MOVEM   C,BP            ;2ND PTR SAVED\r
696         BLT     BP,177(C)       ;ZAP 2\r
697         USETO   2,1\r
698         OUTPUT  2,              ;BLK 1\r
699         ADD     C,[XWD 200,0]\r
700         MOVEM   C,BP\r
701         BLT     BP,177(C)\r
702         USETO   2,2\r
703         OUTPUT  2,\r
704         PUSHJ   P,ERRT2O        ;ERRORS?\r
705         POP     P,JOBFF\r
706         POPJ    P,\r
707 \fCOPZRO:        PUSH    P,JOBFF         ;SAVE JOBFF\r
708         TLNE    F,FLC           ;SKIP IO TO UNASSIGNED CHAN.\r
709         SETSTS  1,134           ;\r
710         SETSTS  2,134           ;\r
711         OUTBUF  2,1             ;WITH ONE BUFFER MODE-134\r
712         USETO   2,0             ;FOR BLOCK ZERO\r
713         OUTPUT  2,              ;DUMMY\r
714         TLNN    F,FLC           ;COPY\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
718         INPUT   1,              ;GET IT\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
736         BLT     T, (U)          ;ZAP\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
743         JRST    COPFIN          ;NO\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
751         POPJ    P,              ;EXIT\r
752 COPYIT: TLNN    F,FLC           ;COPY?\r
753         JRST    COPOUT          ;ZERO!\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
759         JRST    ERRT2O          ;OK?\r
760 \fVERZRO:        PUSH    P,JOBFF\r
761         SETZB   VZ1,VZ2         ;CMDLST TERMINATOR\r
762         SETSTS  1,134           ;SET\r
763         SETSTS  2,134           ;IB MODE\r
764         USETI   1,0             ;AND\r
765         USETI   2,0             ;BLOCK 0\r
766         INBUF   1,1             ;WITH\r
767         INBUF   2,1             ;ONE BUFFER EA\r
768         INPUT   1,              ;GET A BLOCK\r
769         PUSHJ   P,ERRT1I        ;OK\r
770         INPUT   2,              ;GET ANOTHER\r
771         PUSHJ   P,ERRT2I        ;OK\r
772         HRRZ    V1,IN1          ;DUMMY\r
773         HRRZ    V2,IN2          ;IOWD\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
786         JRST    VERFIN          ;YEP\r
787         PUSHJ   P,VERIN         ;COUPLE OF INPUTS AND VERIFY\r
788         JRST    VERSET\r
789 \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
796         POPJ    P,              ;EXIT\r
797 \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
802 \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
807         AOS     V2              ;PLUS ONE\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
811 \fINIT:  INIT    2,(T)\r
812 ODEV:   Z\r
813         XWD     OUT2,IN2\r
814         JRST    ERRIN2\r
815         MOVE    BP,ODEV         ;MAKE SURE ITS A DTA.\r
816         CALLI   BP,4\r
817         TLNN    BP,100\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
822         JRST    INITER          ;YEPER\r
823         INIT    1,(T)\r
824 IDEV:   Z\r
825         XWD     0,IN1\r
826         JRST    ERRIN1\r
827         MOVE    BP,IDEV         ;MAKE SURE ITS A DTA\r
828         CALLI   BP,4\r
829         TLNN    BP,100\r
830         JRST    ERRDT1          ;ERROR\r
831         POPJ    P,\r
832 \r
833 INITER: TTCALL  3,[ASCIZ /INPUT AND OUTPUT DEC-TAPES MAY NOT BE THE SAME DEVICE.\r
834 /]\r
835         JRST    ST\r
836 \f;      LOAD A BOOTSTRAP LOADER, \r
837 \r
838 I=1     ;PTR TO BSBUF\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
842 OS=4    ;OFFSET\r
843 RB=5    ;RELOCATION BITS\r
844 \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
852 \r
853 \r
854 BSLDR:  MOVE    AC0,[SIXBIT /BSLDR/]    ;LOOKUP BLOCK\r
855         HRLZI   AC1,(SIXBIT /REL/)\r
856         SETZB   AC2,AC3         ;\r
857         INIT    16,13           ;IMAGE-BINARY\r
858         SIXBIT  /PTR/           ;\r
859         EXP     PTRBUF          ;\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
865 \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
869         CAIN    TYPE,1          ;\r
870         PUSH    I,W             ;SAVE BLOCK HDR-WRD\r
871         PUSHJ   P,GETWRD        ;\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
877 \r
878 TTCALL  3,[ASCIZ /?ILLEGAL BLOCK TPYE\r
879 /]\r
880         JRST    ST              ;\r
881 \r
882 \fTYPTAB:        Z       BLK0\r
883         Z       BLK1\r
884         Z       BLK2\r
885         Z       BLK3\r
886         Z       BLK4\r
887         Z       BLK5\r
888         Z       BLK6\r
889         Z       BLK7\r
890 \r
891 GETWRD: SOSG    PTRBUF+2        ;EMPTY BUF?\r
892         PUSHJ   P,GETBUF        ;GET A BUFFER\r
893         ILDB    W,PTRBUF+1      ;\r
894         POPJ    P,\r
895 \r
896 GETBUF: IN      16,             ;GET BUFFER\r
897         POPJ    P,\r
898         STATZ   16,20000        ;EOF?\r
899         TTCALL  3,[ASCIZ /?NO END BLOCK ENCOUNTERED\r
900 /]\r
901         STATZ   16,74000        ;ERRORS?\r
902         TTCALL  3,[ASCIZ /?DATA ERROR ON DEVICE PTR\r
903 /]\r
904         JRST    ST\r
905         ;THIS IS NOT A BLOCK, IGNORE IT\r
906 BLK0:   JUMPE   CNT,NEWBLK      ;\r
907         PUSHJ   P,GETWRD        ;PASS A WRD\r
908         SOJA    CNT,BLK0        ;\r
909 \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
914         JRST    NEWBLK          ;NO\r
915         PUSHJ   P,GETWRD        ;\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
919         JRST    NEWBLK          ;NO\r
920         PUSHJ   P,GETWRD        ;GET THE REL-BITS FOR NXT SECT\r
921         PUSH    I,W             ;SAVEM\r
922         JRST    BLK1A           ;\r
923 \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
928         JRST    NEWBLK          ;\r
929         PUSHJ   P,GETWRD        ;\r
930         TLNE    W,200000        ;\r
931         JUMPL   W,BLK2ER        ;ERROR - ITSA EXTERNAL SYMBOL\r
932         AOBJN   CNT,.+1         ;IGNORE THE VALUE\r
933         PUSHJ   P,GETWRD        ;\r
934         AOBJN   CNT,BLK2B       ;\r
935         TRNN    CNT,-1          ;\r
936         JRST    NEWBLK          ;\r
937         JRST    BLK2A\r
938 BLK2ER: TTCALL  3,[ASCIZ /?CANNOT PROCESS EXTERNAL SYMBOLS\r
939 /]\r
940         JRST    ST\r
941 \r
942         ;HIGHSEG FLAG, GIVE ERROR EXIT\r
943 BLK3:   TTCALL  3,[ASCIZ /?CANNOT PROCESS HIGH-SEG'S\r
944 /]\r
945         JRST    ST\r
946 \r
947         ;ENTRY BLOCK, IGNORE THIS BLOCK\r
948 BLK4:   MOVN    CNT,CNT ;\r
949 BLK4A:  HRLI    CNT,-22         ;\r
950         TRNN    CNT,-1          ;\r
951         JRST    NEWBLK          ;\r
952         PUSHJ   P,GETWRD        ;\r
953         AOBJN   CNT,BLK4A+1     ;PASS/IGNORE \r
954         TRNN    CNT,-1          ;\r
955         JRST    NEWBLK          ;\r
956         PUSHJ   P,GETWRD        ;\r
957         JRST    BLK4A           ;\r
958 \r
959         ;THIS IS LAST BLK, MUST BE SEEN, ALSO IS PROG-BREAK\r
960 BLK5:   PUSHJ   P,GETWRD        ;\r
961         MOVNI   AC0,1(W)                ;\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
966         PUSH    I,W             ;\r
967         HRLZI   LFL             ;NOTE BSLDR IS IN "COPY"\r
968         IORM    FSAVE           ;SAVE IT\r
969         TLO     F,LFL           ;\r
970         CLOSE   16,             ;\r
971         JRST    COCRET          ;THE ONLY WAY OUT\r
972 BLK5ER: TTCALL  3,[ASCIZ /?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS\r
973 /]\r
974         JRST    ST\r
975 \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
980 \r
981 UNWIND: MOVE    AC4,[POINT 6,PNAME]\r
982         SETZM   PNAME\r
983         MOVEM   W,AC5           ;\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
989         PUSHJ   P,UNW1          ;LOOP\r
990 UNW2:   HLRZ    AC6,(P)         ;PICK OFF THE REMAINDER + DECODE IT\r
991         JUMPE   AC6,UNW3        ;DONE\r
992         ADDI    AC6,20-1\r
993         CAILE   AC6,31\r
994         ADDI    AC6,41-32\r
995         CAILE   AC6,72\r
996         SUBI    AC6,74-4\r
997         CAIN    AC6,3\r
998         MOVEI   AC6,16\r
999 \r
1000         IDPB    AC6,AC4\r
1001 UNW3:   POPJ    P,\r
1002 \r
1003         ;STARTING ADR.\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
1008 \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
1013         Z\r
1014 LISTV1: IOWD    0,END.\r
1015 LISTV2: IOWD    0,END.\r
1016 INC:    BLOCK   1\r
1017 INCV:   BLOCK   1\r
1018 DIRECT: BLOCK   123\r
1019 DNAM:   BLOCK   55\r
1020 TOTAL:  BLOCK   26      ;BLOCK TABLE\r
1021 DIRWRD: IOWD    200,DIRECT\r
1022         Z\r
1023 REWIND: IOWD    1,PTRBUF\r
1024         Z\r
1025 TTYIN:  BLOCK   23+20\r
1026 TTYOUT: BLOCK   23\r
1027 IN1:    BLOCK   3\r
1028 IN2:    BLOCK   3\r
1029 OUT2:   BLOCK   3\r
1030 TIN:    BLOCK   3\r
1031 TOUT:   BLOCK   3\r
1032 PTRBUF: BLOCK   3\r
1033 BSBUF:  BLOCK   720     ;ENUF FOR 3BLOCKS PLUS HDR WRDS\r
1034         VAR\r
1035         LIT\r
1036 END.:   END     ST      ;;22-JUN\r
1037 \f\r