Consolidate license copies
[its.git] / system / dskdmp.212
1 ;;; -*-Midas-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18
19 TITLE DSKDMP
20
21 .MLLIT==1
22
23 DEFINE SETF TEXT,FLG
24 IFDEF FLG,.STOP
25 .TAG FOOBAR 
26 PRINTC "TEXT
27 FLG="
28 .TTYMAC FLAG
29 .TTYFLG==.TTYFLG+1
30 PRINTX/FLAG
31 /
32 .TTYFLG==.TTYFLG-1
33 IFSE FLAG,YES,FLG==1
34 IFSE FLAG,NO,FLG==0
35 IFSE FLAG,Y,FLG==1
36 IFSE FLAG,N,FLG==0
37 IFNDEF FLG,FLG==FLAG
38 TERMIN
39 IFNDEF FLG,.GO FOOBAR
40 TERMIN
41
42 IF1,[
43 PRINTC "Configuration (KSRP06, KSRM03, or ASK) ? " 
44 .TTYMAC MACH
45 IFSE MACH,KSRP06,[
46         HRIFLG==0
47         RP06P==1
48         KS10P==1
49         NUDSL==500.
50 ] ;KSRP06
51 IFSE MACH,KSRM03,[
52         HRIFLG==0
53         RP06P==0
54         RM03P==1
55         KS10P==1
56         NUDSL==500.
57 ] ;KSRM03
58 IFSN MACH,ASK,[
59 IFNDEF NUDSL,[ PRINTC /No known configuration for "MACH".
60 / ]]
61 TERMIN
62 ] ;IF1
63
64 SETF [Readin Mode Paper Tape?]HRIFLG
65 SETF [Assemble BOOT? (If no, full DSKDMP)]BOOTSW
66
67 SETF [RH11/RP06 disk system?]RP06P
68 IFE RP06P,[
69 SETF [RH11/RM03 disk system?]RM03P
70 IFE RM03P,[
71 SETF [RH10 (MC-KL) disk control?]RH10P
72 IFE RH10P,[
73 SETF [AIKA disk control? (no => RP02/RP03)]DC10P
74 ]]]
75 IFN RP06P, RM03P==0
76 IFN RP06P+RM03P, RH10P==0
77 IFN RP06P+RM03P+RH10P, DC10P==0
78 IFN RP06P+RM03P+RH10P+DC10P, RP10P==0
79 IFE RP06P+RM03P+RH10P+DC10P, RP10P==1
80
81 IFE BOOTSW, SETF [Number of dirs? (DM-KA: 200., ML-KA: 250., AI-KA: 440., all others: 500.)]NUDSL
82
83 SETF [KS10 processor?]KS10P
84 IFE KS10P, SETF [KL10 processor? (no => KA10)]KL10P
85 IFN KS10P, KL10P==0
86 IFN KS10P+KL10P, KA10P==0
87 IFE KS10P+KL10P, KA10P==1
88
89 DEFINE RP
90 IFN RP10P!TERMIN
91 DEFINE SC
92 IFN DC10P!TERMIN
93 DEFINE RH
94 IFN RH10P!TERMIN
95 DEFINE PH
96 IFN RP06P+RM03P!TERMIN
97
98 DEFINE KA
99 IFN KA10P!TERMIN
100 DEFINE KL
101 IFN KL10P!TERMIN
102 DEFINE KS
103 IFN KS10P!TERMIN
104
105 IFN HRIFLG,[
106 NOSYMS                  ;MAKE PAPER TAPE SHORTER
107 RIM10
108 ]
109
110 C=1                     ;C-A-B FOR LINKS
111 A=2
112 B=3
113 D=4
114 BLKIN=5                 ;PSEUDO-CORE BLOCK IN CBUF
115 WRITE=6                 ;NEG MEANS DUMP, RH 0 OR WRBIT
116 DIFF=7                  ;DIFF CONO ALSO TEMP
117 HEAD=10                 ;HEAD CONO ALSO TEMP
118 P=11                    ;JSP AC
119 BLOK=12
120 UNIT=13                 ;UNIT AND M.A. DATAO
121 CMD=14                  ;COMMAND CHAR
122 T=15                    ;VERY TEMP
123 TT=16                   ;ANOTHER JSP AC, ALSO VERY TEMP
124 BUFP=17                 ;DBUF PNTR--LAST WORD USED
125
126 IF1,[                   ;DON'T TAKE A WEEK AND A HALF TO ASSEMBLE.
127 RP, .INSRT SYSTEM;RP10 >
128 SC, .INSRT SYSTEM;DC10 >
129 RH, .INSRT SYSTEM;RH10 >
130 IFN RP06P, .INSRT SYSTEM;RH11 >
131 IFN RM03P, .INSRT SYSTEM;RM03 >
132 IFE BOOTSW, .INSRT SYSTEM;FSDEFS >
133 IFE BOOTSW, KL, .INSRT SYSTEM;EPT >
134 KS, .INSRT SYSTEM;KSDEFS >
135 KA, TTY==120
136 ]
137 \f
138 ;PARAMETER FILE FOR DSKDMP
139
140 MEMSIZ=1000000          ;ACTUAL SIZE OF MEM
141 IFNDEF DBGSW,DBGSW==0   ;1 TO DEBUG THIS WITH DDT
142 DDT==MEMSIZ-4000
143 IFN DBGSW,MEMSIZ==MEMSIZ-10000  ;MOVE DOWN UNDER DDT IF DEBUG MODE
144 CORE==MEMSIZ-10000-<2000*NTUTBL>                ;HIGHEST ADR ALWAYS IN CORE+1
145 CORES==CORE_<-12>       ;BLK # OF ABOVE (FIRST OF BLKS SWAPPED OUT FOR BUFFER AREAS)
146 NSWBL==4+NTUTBL         ;# BLOCKS SWAPPED OUT FOR BUFFER AREAS, +1 FOR DSKDMP ITSELF
147 HIGH==MEMSIZ-100        ;HIGHEST ADR LOADED/DUMPED+1
148
149 NDSK==8                 ;MAX POSSIBLE.  L$n$ DEFINES WHICH ARE REALLY THERE
150 RP,ICWA=34
151 RH,ICWA=34
152
153 PH, UBPG==:17           ; Use last (usable) page in Unibus map
154
155 KA, LPM=102000,,
156 KA, LPMR=LPM 2,
157 KL, PAG=<BLKI 10,>-<BLKI>
158
159 DEFINE INFORM A,B
160 IF1,[ PRINTX \1c A = B
161 \1c] TERMIN
162
163 ;COMMANDS ARE:
164 ;   L$file      LOAD FILE INTO CORE
165 ;   T$file      LOAD FILE INTO CORE AND GIVE SYMBOLS TO DDT AND START DDT
166 ;   M$file      LOAD FILE INTO CORE WITHOUT CLEARING CORE FIRST, DOESN'T LOAD SYMBOLS
167 ;   K$file      DELETE FILE
168 ;   D$file      DUMP CORE INTO FILE
169 ;   I$file      VERIFY FILE AGAINST CORE
170 ;   G$          START AT STARTING ADDRESS
171 ;   U$dir;      LIST DIRECTORY
172 ;   F$          LIST CURRENT DIRECTORY
173 ;   S$          LIST PACK IDS THEN MFD
174 ;   nnn$        SET STARTING ADDRESS TO nnn
175 ;   L$n$        PUT DISK n ONLINE
176 ;   K$n$        TAKE DISK n OFFLINE
177
178 ;ERROR MESSAGES ARE:
179 ;   CMPERR      VERIFY FAILED TO MATCH
180 ;   DIRFUL      DIRECTORY FULL
181 ;   EOF         UNEXPECTED EOF
182 ;   DIRNF       DIRECTORY DOES NOT EXIST
183 ;   FNF         FILE NOT FOUND
184 ;   PKNMTD      FILE IS ON PACK THAT IS NOT MOUNTED
185 ;   CKSERR      CHECKSUM ERROR
186 ;   DSKFUL      DISK FULL
187 ;   NODDT       CAN'T ADDRESS DDT SYMBOL TABLE (BUG)
188 ;   ?BUG?       BUG
189 ;   SEEKFL      DISK SEEK ERROR
190 ;   CLOBRD      DISK READ ERROR
191 ;   CLOBWR      DISK WRITE ERROR
192 ;   DIRCLB      DIR NAME DIFFERS, TUT DISAGREES WITH DIR
193 ;   MFDCLB      M.F.D. CLOBBERED
194 ;   DSKLUZ      DISK LOSSAGE (OFFLINE OR UNSAFE OR MASSBUS ERROR)
195 \f
196 KS,     LOC 4000                ; Avoid MTBOOT and KSRIM
197
198 IFE BOOTSW,[
199 ZZZ:    IFE DBGSW,[
200         MOVE T,....             ;THIS CODE BLTS THE FOLLOWING OFFSET CODE
201         BLT T,MEMSIZ-1-1        ;INTO HIGH MEMORY AND WRITES DSKDMP ON ITS
202         MOVE T,PROG+MEMSIZ-2-BEG+1
203         MOVEM T,BEG+MEMSIZ-2-BEG+1      ;AVOID LOSING DUE TO -1 BLT LOSSAGE
204 ]
205         MOVSI T,-NDSK+1         ;MAKE ALL BUT DISK 0 BE DEAD (MUST DO L$ TO MAKE THEM ALIVE)
206         SETOM QDED+1(T)
207         MOVNS QDED+1(T)
208         AOBJN T,.-2
209         SETZM QDED+0
210 RP,[    MOVEI T,ICWA+2          ;SET UP CHANNEL JUMP
211         MOVEM T,ICWA            ;IN INITIAL CHANNEL ADDRESS
212         SETZM ICWA+1            ;AND CLEAR REMAINING STUFF
213         SETZM ICWA+3
214         DATAO DPC,SUNIT0
215         DATAI DPC,B
216         TRNN B,RP03BT
217          JRST WBOOT1
218         MOVEI B,MBLKS           ;UNIT 0 IS AN RP03, ADJUST WORLD
219         HRRM B,CBLK
220         MOVE B,RP3ADJ
221         MOVSI A,-NSWBL
222         XORM B,SWPSK(A)
223         AOBJN A,.-1
224 WBOOT1: HLLZS BOOT0
225         MOVEI UNIT,BEG          ;MAGIC BLOCK THEN STARTS IT
226         HRRZ BLOK,CBLK
227         ADDI BLOK,NSWBL         ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
228         MOVEI WRITE,10
229         JSP TT,WRD3
230         HRRZ BLOK,CBLK
231         ADDI BLOK,NSWBL+1
232         MOVEI WRITE,10
233         JSP TT,WRD3
234         CONSZ DPC,ALLER
235 IFN DBGSW,JRST DDT
236 IFE DBGSW,JRST 4,.              ;FORMERLY JRST MEMSIZ-400 (??)
237         JRST BEG
238 ];RP
239 PH,[    MOVEI T,%HYCLR          ; Clear controller
240         IOWRQ T,%HRCS2          ; (Selects drive 0)
241 WBOOT0: IORDQ T,%HRCS1
242         TRNN T,%HXDVA
243          JRST WBOOT0            ; Await drive available (well, it is a dual
244                                 ; ported drive...  perhaps someday?)
245         MOVEI UNIT,BEG
246         HRRZ BLOK,CBLK
247         ADDI BLOK,NSWBL         ; FIRST BLOCK AFTER CORE BUFFER IS WHERE
248                                 ; DSKDMP LIVES
249         MOVEI WRITE,10
250         JSP TT,WRD3
251         HRRZ BLOK,CBLK
252         ADDI BLOK,NSWBL+1
253         MOVEI WRITE,10
254         JSP TT,WRD3
255         IORDQ TT,%HRCS1
256         TRNE TT,%HXTRE+%HXMCP
257 IFN DBGSW, JRST DDT
258 IFE DBGSW, JRST 4,.             ; Formerly JRST MEMSIZ-400 (??)
259         JRST BEG
260 ];PH
261 RH,[    MOVEI T,ICWA+2          ;SET UP CHANNEL JUMP
262         MOVEM T,ICWA            ;IN INITIAL CHANNEL ADDRESS
263         SETZM ICWA+1            ;AND CLEAR REMAINING STUFF
264         SETZM ICWA+3
265 WBOOT0: DATAO DSK,[%HRDCL,,]
266         MOVEI A,20
267         SOJG A,.
268         DATAI DSK,A
269         TRNN A,%HCDVA
270          JRST WBOOT0            ;AWAIT DRIVE AVAILABLE
271         MOVEI UNIT,BEG          ;MAGIC BLOCK THEN STARTS IT
272         HRRZ BLOK,CBLK
273         ADDI BLOK,NSWBL         ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
274         MOVEI WRITE,10
275         JSP TT,WRD3
276         HRRZ BLOK,CBLK
277         ADDI BLOK,NSWBL+1
278         MOVEI WRITE,10
279         JSP TT,WRD3
280         CONSZ DSK,%HIERR
281 IFN DBGSW,JRST DDT
282 IFE DBGSW,JRST 4,.              ;FORMERLY JRST MEMSIZ-400 (??)
283         JRST BEG
284 ];RP
285 SC,[    MOVEI UNIT,BEG          ;MAGIC BLOCK THEN STARTS IT
286         MOVEI BLOK,NBLKS+NSWBL
287         MOVEI WRITE,60
288         JSP TT,WRD3
289         MOVEI BLOK,NBLKS+NSWBL+1
290         MOVEI WRITE,60
291         JSP TT,WRD3
292         DATAO DC0,.....
293         CONSZ DC0,DSSACT
294         JRST .-1
295         CONSZ DC0,DSSERR
296 IFN DBGSW,JRST DDT
297 IFE DBGSW,JRST 4,.              ;FORMERLY JRST MEMSIZ-400 (??)
298         JRST BEG
299
300 .....:  DJMP .+1
301         DWRITE
302         DCOPY ......(-LRIBLK_2&37774)
303         DHLT
304
305 ......: DWRITE+DUNENB+DADR              ;FOR READIN
306         DCOPY BEG(-2000_2&37774)
307         DREAD+DADR1
308         DCOPY BEG(-2000_2&37774)
309         DHLT
310 ];SC
311
312 IFE DBGSW,[
313 ....:   PROG,,BEG
314
315 KA,     LOC 2000                ; MAKE OFFSET CONVENIENT
316 KL,     LOC 2000
317 KS,     LOC 6000                ; Avoid MTBOOT and KSRIM
318 PROG:   OFFSET CORE+<<NSWBL-1>*2000>-.
319 ]IFN DBGSW,LOC MEMSIZ-2000
320 \f
321 BEG:
322 KA,[    CONO 635550             ;ENTER HERE, CLEAR WORLD
323         JRST .+1
324         JFCL 1,[JRST 4,.]       ;A PDP6??
325         LPMR [0]-2              ;TURN OFF EXEC PAGING
326 ]
327 KL,[    CONO 327740             ;CLEAR APR
328         CONSZ PAG,660000        ;PAGING AND CACHE BETTER BE OFF
329          JRST 4,.
330 ]
331 KS,[    CONO 127760             ; Enable, and Clear all.
332         RDEBR B
333         TRNE B,60000            ; Paging and Tops-20 better be off.
334          JRST 4,.
335         SETZM 8SWIT0            ; Clear 8080 Communications area to prevent
336         MOVE B,[8SWIT0,,8SWIT0+1]       ; mysterious IO behavior.
337         BLT B,8RHBAS-1
338         ;; If the machine has just been powered on, there is likely to be
339         ;; bad parity all over the place.  I guess that isn't our problem
340         ;; as long as we don't touch any of it...
341 ]
342         MOVSI B,-NDSK           ;FOR NUMBER OF DISKS
343         SETOM PKNUM(B)          ;SET DISK TO UNKNOWN
344         AOBJN B,.-1
345         MOVE T,[JRST LOADG1]    ;SET BOOTSTRAP TO MIDDLE OF WORLD
346         MOVEM T,BOOT
347         MOVE D,['DSKDMP]        ;ANNOUNCE SELF
348         JSP TT,PD
349         JRST READ               ;CRLF AND BEGIN READING COMMANDS
350
351 ERROR:  0
352         CLEARM MEMSIZ-1         ;DON'T READ ANY MORE COMMANDS FROM MEMORY
353         SOS T,ERROR             ;PICK UP ERROR CODE FROM THE AC FIELD OF
354         LDB T,[270400+T,,]      ;THE JSR ERROR
355         MOVE D,ERMESS(T)
356         JSP TT,PD               ;PRINT OUT APPROPRIATE COMMENT
357         CAIL T,EBUG
358          JRST READ              ;BAD ERROR - NO MORE DISKING
359 LOADG1:
360 KA,     DATAI TTY,C             ;FLUSH RANDOM CHARACTER
361 KS,     SETZM 8CTYIN            ; ".RESET"
362         TRO CMD,10              ;MAKE SURE PSEUDO-CORE IN CORE
363         JRST LOADG              ;BY SIMULATING END OF LOADING, NON-GOING COMMAND
364
365 ERMESS: IRP XX,,[ECMP,EDIR,EEOF,ESNF,EFNF,EPNM,ECKS
366 EDSK,EDDT,EBUG,EC63,ECRD,ECWR,ECDR,EMFC,EDLZ]YY,,[CMPERR,DIRFUL
367 EOF,DIRNF,FNF,PKNMTD,CKSERR,DSKFUL,NODDT,?BUG?,SEEKFL
368 CLOBRD,CLOBWR,DIRCLB,MFDCLB,DSKLUZ]
369 XX==.-ERMESS
370         SIXBIT \YY\
371 TERMIN
372
373 PD:     JSP P,CRLF              ;TYPE A CR
374 PD2:    MOVEI C,40
375         JSP P,TYO               ;AND A SPACE
376         MOVE B,[440600,,D]
377 PD1:    ILDB C,B                ;AND THE SIXBIT CONTENTS OF D
378         ADDI C,40
379         JSP P,TYO
380         TLNE B,770000
381          JRST PD1
382         JRST (TT)
383
384 PNO:
385 C12:    IDIVI C,10.             ;PRINT CONTENTS OF C AS A TWO-DIGIT
386         DPB C,[60600,,A]        ;DECIMAL NUMBER PRECEDED
387         MOVEI D,(SIXBIT /#00/+A) ;BY <SPACE>#
388         MOVE B,[300600,,D]
389         JRST PD1
390 \f
391 WRCB:   MOVEI UNIT,CBUF         ;WRITE OUT CONTENTS OF CBUF
392         LSH BLKIN,-12           ;ON APPROPRIATE BLOCK
393         HRRZ BLOK,CBLK
394         ADDI BLOK,-CORES(BLKIN)
395         JRST WRM
396
397 LODUMP: MOVEI UNIT,CORE         ;DEPENDING ON SIGN BIT OF WRITE, LOAD OR DUMP
398         HRRZ BLOK,CBLK          ;PSEUDO-CORE (766000-775777)
399 LODMP1: JSP TT,WRDM
400         ADDI UNIT,2000
401         CAIGE UNIT,BEG
402          AOJA BLOK,LODMP1
403         MOVEI BLKIN,CORE
404         JRST (P)
405
406 FD:     HRRZ C,B                ;SET UP POINTER IN C TO FETCH OR DEPOSIT
407                                 ;CONTENTS OF ADDRESS IN RIGHT HALF OF B
408 IFN DBGSW, SKIPGE WRITE         ;LOAD DDT WHEN IN DEBUG MODE
409         CAIGE C,HIGH
410         CAIGE C,40
411          JRST (P)
412         CAIGE C,CORE            ;IF ADDR IS IN REAL CORE, RETURN IMMEDIATELY
413          JRST 1(P)
414 FDX:    CAIL C,(BLKIN)          ;ADDR IS IN PSEUDO-CORE--CHECK IF RIGHT
415         CAILE C,1777(BLKIN)     ;BLOCK IS IN CBUF
416          JRST FD3               ;IT'S NOT THERE--READ IT IN
417 FD4:    SUBI C,-CORE(BLKIN)     ;IT'S THERE--SET UP RIGHT POINTER IN C
418         JRST 1(P)               ;AND RETURN
419 FD3:    JUMPLE WRITE,FD3A       ;IF DUMP OR VERIFY DON'T BOTHER
420                                 ;TO WRITE OUT CURRENT BLOCK
421 FD3B:   JSP TT,WRCB             ;IF LOAD, WRITE CURRENT BLOCK FIRST
422 FD3A:   MOVEI UNIT,CBUF
423         MOVE BLKIN,C
424         ANDI BLKIN,776000
425         LDB BLOK,[121000,,BLKIN]
426         ADD BLOK,CBLK
427         MOVEI BLOK,-CORES(BLOK)
428         JSP TT,RDM              ;READ IN CORRECT BLOCK
429         JRST FD4                ;SET UP POINTER AND RETURN
430
431 GBP:    IDIVI C,6               ;TURN USER DIRECTORY CHARACTER ADDR IN C
432         IMULI A,-60000          ;INTO A BYTE POINTER
433         HRLI C,440600(A)
434         ADDI C,DIR+UDDESC
435         JRST (TT)
436
437 WD:     AOBJN BUFP,WD1          ;READ, WRITE, OR VERIFY WORD IN D FROM, INTO,
438         JSP TT,NXTBLK           ;OR AGAINST WORD IN DBUF
439         JSP TT,WRDB             ;TIME TO REFILL OR EMPTY DBUF
440         MOVSI BUFP,-2000        ;RESET BUFFER POINTER
441 WD1:    JUMPG WRITE,WD2         ;JUMP ON LOAD
442         JUMPL WRITE,WD3         ;JUMP ON WRITE
443         CAME D,DBUF(BUFP)       ;HERE IF VERIFY
444          JSR ECMP,ERROR         ;VERIFY COMPARE LOST
445         JRST (P)
446 WD2:    SKIPA D,DBUF(BUFP)      ;LOAD
447 WD3:     MOVEM D,DBUF(BUFP)     ;DUMP
448         JRST (P)
449 \f
450 NXTTUT: HRRZ B,CU               ;SELECT NEXT UNIT AND READ ITS TUT
451         AOJ B,
452         CAIN B,NDSK
453          MOVEI B,0
454         HRRM B,CU
455         CAIN B,@MU
456          JRST 1(TT)             ;SKIP IF NO MORE
457         SKIPE QDED(B)
458          JRST NXTTUT            ;UNIT NOT ON LINE
459 RDTUT:  MOVEI BLOK,TUTBLK       ;READ TUT OF CURRENT UNIT
460         MOVEI UNIT,TUT
461         SETOM PKNUM(B)          ;ALWAYS READ HEADER FOR TUT
462 IFG NTUTBL-1,[                  ;READ IN MULTI-BLOCK TUT
463         HRRM TT,RDTUTX          ;SAVE RETURN ADDRESS
464 REPEAT NTUTBL-1,[
465         JSP TT,RD
466         ADDI UNIT,2000
467         AOS BLOK
468 ]
469 RDTUTX: MOVEI TT,.
470 ]
471         JRST RD
472
473 NXTBW3: 0
474         IBP DIRPT               ;DO AN IDPB T,DIRPT CHECKING TO SEE IF
475         LDB DIFF,[1200,,DIRPT]  ;RUNNING INTO NAME AREA
476         CAML DIFF,DIR+UDNAMP
477          JSR EDIR,ERROR
478         DPB T,DIRPT
479         JRST @NXTBW3
480
481 NXTBW:  MOVE BLOK,LBLOCK        ;FIND NEXT FREE BLOCK TO WRITE
482         MOVEI HEAD,1(BLOK)
483         ILDB T,TUTPT
484         JUMPN T,NXTBW1          ;JUMP IF VERY NEXT BLOCK NOT FREE
485         AOSG T,BLKCNT
486 NXTBW5:  SOJA HEAD,NXTBW4       ;GENERATE LOAD ADR IF FIRST TIME (COMPENSATE FOR LBLOCK OFF BY 1)
487         CAIG T,UDTKMX-1
488          JRST NXTBW2            ;NO NEED TO MODIFY DIRECTORY YET
489         CLEARM BLKCNT           ;14 IN A ROW--RESET COUNTER AND
490 NXTBW6: JSR NXTBW3              ;DPB BYTE INTO DIRECTORY
491 NXTBW2: MOVE BLOK,HEAD
492         CAML BLOK,TUT+QLASTB
493          JSR EDSK,ERROR         ;NO MORE DISK LEFT
494         MOVEI T,1
495         DPB T,TUTPT             ;MARK BLOCK USED IN TUT
496         JRST WRDB1
497
498 NXTBW1: ADDI HEAD,1             ;SEARCH FOR NEXT FREE BLOCK
499         ILDB T,TUTPT
500         JUMPN T,NXTBW1
501         SUBM HEAD,BLOK
502         SKIPLE T,BLKCNT         ;COME UP WITH DESC BYTE FOR LAST FEW BLOCKS
503          JSR NXTBW3
504         CLEARM BLKCNT
505         JUMPL T,NXTBW5          ;FIRST TIME
506         MOVEI T,UDTKMX-1(BLOK)
507         CAIGE T,UDWPH           ;CAN WE SAY SKIP N--TAKE 1?
508          JRST NXTBW6            ;YES
509 NXTBW4: MOVEI BLOK,NXLBYT
510         MOVE T,HEAD
511         ROT T,-NXLBYT*6
512         ADDI T,UDWPH+1
513         JSR NXTBW3
514         ROT T,6
515         SOJG BLOK,.-2
516         JRST NXTBW6
517 \f
518 NXTBLK: JUMPL WRITE,NXTBW       ;GET NEXT BLOCK OF FILE--IF DUMP, FIND FREE
519         MOVE BLOK,LBLOCK        ;BLOCK
520 NXTB6:  SOSLE BLKCNT            ;HAVE WE RUN OUT OF "TAKE N"?
521          AOJA BLOK,WRDB1        ;NO--TAKE NEXT BLOCK
522         ILDB T,DIRPT            ;YES--GET NEXT DESC BYTE
523         CAILE T,UDWPH
524          JRST NXTB1             ;IT'S A LOAD ADDR
525         CAIE T,UDWPH
526          JUMPN T,NXTB2          ;IT'S A TAKE OR SKIP
527         CAIE CMD,'D             ;IT'S 0 OR NULL--IF THIS IS A LOAD, IT'S AN
528         CAIN CMD,'K             ;UNEXPECTED END OF FILE
529          JRST KILL1             ;IF DUMP OR KILL, O.K.
530         JSR EEOF,ERROR
531
532 NXTB1:  MOVEI BLOK,-UDWPH-1(T)  ;LOAD ADR
533         MOVEI BUFP,NXLBYTS
534 NXTB1A: MOVEI T,0
535         CAIE CMD,'D
536         CAIN CMD,'K
537          DPB T,DIRPT            ;IF KILLING FILE, ZERO THIS BYTE (OTHERS ZEROED AT KILL)
538         LSH BLOK,6
539         ILDB T,DIRPT
540         ADD BLOK,T              ;GET COMPLETE BLOCK NUMBER
541         SOJG BUFP,NXTB1A
542         JRST NXTB3
543
544 NXTB2:  MOVEM T,BLKCNT
545         CAIG T,UDTKMX
546          AOJA BLOK,WRDB1        ;TAKE N STARTING WITH NEXT ONE
547         ADDI BLOK,-UDTKMX+1(T)  ;SKIP N-<MAX TAKE> AND TAKE 1
548 NXTB3:  CLEARM BLKCNT
549 WRDB1:  MOVEM BLOK,LBLOCK
550         JRST (TT)
551 \f;RP10 IO ROUTINE
552 RP,[
553 WRDM:   SKIPL WRITE             ;SEE WHETHER LOAD OR DUMP/VERIFY
554 RDM:     TRZA WRITE,(WRITE)     ;READ FROM MASTER UNIT
555 WRM:      HRRI WRITE,10         ;WRITE ON MASTER UNIT
556 MU:     IORI WRITE,0            ;MASTER UNIT SELECT STORED HERE
557         JRST WRD3A
558
559 WRDB:   MOVEI UNIT,DBUF         ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
560 WRD:    SKIPL WRITE             ;READ OR WRITE FROM/ON CURRENT UNIT
561 RD:      TRZA WRITE,(WRITE)     ;READ FROM CURRENT UNIT
562 WR:       HRRI WRITE,10         ;WRITE ON CURRENT UNIT
563 CU:     IORI WRITE,0            ;CURRENT UNIT SELECT STORED HERE
564 WRD3A:
565 WRD3:   DPB WRITE,[360600,,DBLK]        ;SET OP, UNIT SEL
566         DPB WRITE,[DUNFLD SEEK]
567         DPB WRITE,[DUNFLD RECAL]
568         HRLI UNIT,-2000         ;ADDRESS COMES IN IN `UNIT'
569         MOVEM UNIT,@ICWA
570         SOS @ICWA
571         LDB UNIT,[300,,WRITE]   ;ISOLATE FROM GARBAGE
572         MOVNI DIFF,16.          ;INITIALIZE ERROR COUNTER
573         MOVEM DIFF,ERRCT        ;15. LOSSES PERMITTED
574 WRD5:   HRRZ DIFF,BLOK
575         IMULI DIFF,SECBLK
576         IDIVI DIFF,NSECS
577         DPB HEAD,[DSECT DBLK]
578         IDIVI DIFF,NHEDS
579         DPB HEAD,[DSURF DBLK]
580         DPB DIFF,[DCYL DBLK]
581         DPB DIFF,[DCYL SEEK]
582         DATAO DPC,CLATT         ;CLEAR ATTENTIONS
583         LSH DIFF,-8             ;EXTRA CYLINDER BIT FOR RP03
584         DPB DIFF,[DCYLXB DBLK]
585         DPB DIFF,[DCYLXB SEEK]
586         DATAO DPC,SEEK
587         DATAI DPC,DIFF
588         TRNN DIFF,ALLATT
589          JRST .-2
590         DATAO DPC,CLATT
591         TLNN DIFF,(ONCYL)
592          JRST WRD0
593         DATAO DPC,DBLK
594         CONSO DPC,DONE
595          JRST .-1
596         CONSO DPC,ALLER
597          JRST WRDX
598         HRRZM BLOK,BADBLK
599         AOSG ERRCT              ;HARDWARE ERROR--CHECK COUNTER
600          JRST WRD5              ;TRY AGAIN
601         TRNE WRITE,10           ;GIVE UP--DISTINGUISH BETWEEN
602          JSR ECWR,ERROR         ;WRITE ERRORS AND
603         JSR ECRD,ERROR          ;READ ERRORS
604
605 WRDX:   HRRZ UNIT,@ICWA         ;RESTORE ADDR
606         ADDI UNIT,1             ;COMPENSATE FOR IOWD LOSSAGE
607         TRZ WRITE,-1            ;FLUSH GARBAGE
608         JRST (TT)
609
610 WRD0:   AOSLE ERRCT
611          JSR EC63,ERROR
612         DATAO DPC,RECAL
613         DATAI DPC,DIFF
614         TRNN DIFF,ALLATT
615          JRST .-2
616         JRST WRD5
617
618 DBLK:   ICWA
619 SEEK:   DSEEKC
620 RECAL:  DRCALC
621 CLATT:  DEASEC ALLATT
622 ];RP
623 \f;RH11 IO ROUTINE
624 PH,[
625 WRDM:   SKIPL WRITE             ;SEE WHETHER LOAD OR DUMP/VERIFY
626 RDM:     TRZA WRITE,(WRITE)     ;READ FROM MASTER UNIT
627 WRM:      HRRI WRITE,10         ;WRITE ON MASTER UNIT
628 MU:     IORI WRITE,0            ;MASTER UNIT SELECT STORED HERE
629         JRST WRD3A
630
631 WRDB:   MOVEI UNIT,DBUF         ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
632 WRD:    SKIPL WRITE             ;READ OR WRITE FROM/ON CURRENT UNIT
633 RD:      TRZA WRITE,(WRITE)     ;READ FROM CURRENT UNIT
634 WR:       HRRI WRITE,10         ;WRITE ON CURRENT UNIT
635 CU:     IORI WRITE,0            ;CURRENT UNIT SELECT STORED HERE
636 WRD3A:
637 WRD3:   TRNE UNIT,1777          ; Better be on a page boundary!
638          JRST 4,.
639         LDB DIFF,[111100,,UNIT] ; Point Unibus map at page in question
640         TRO DIFF,%UQFST+%UQVAL
641         IOWRQ DIFF,UBAPAG+UBPG_1
642         ADDI DIFF,1
643         IOWRQ DIFF,UBAPAG+UBPG_1+1
644         LDB DIFF,[000300,,WRITE]        ; Select drive
645         IOWRQ DIFF,%HRCS2
646         JSP HEAD,RHCHEK         ; Check for immediate trouble
647         MOVEI DIFF,%HMRDP       ; Init the drive
648         IOWRQ DIFF,%HRCS1
649         MOVNI DIFF,16.          ;INITIALIZE ERROR COUNTER
650         MOVEM DIFF,ERRCT        ;15. LOSSES PERMITTED
651 WRD5:   MOVNI DIFF,4000
652         IOWRQ DIFF,%HRWC        ; 4000 half words
653         MOVEI DIFF,UBPG_14
654         IOWRQ DIFF,%HRBA        ; "Byte" base address
655         HRRZ DIFF,BLOK
656         IDIVI DIFF,NBLKSC
657         IOWRQ DIFF,%HRCYL       ; Desire cylinder
658         MOVE DIFF,HEAD
659         IMULI DIFF,SECBLK
660         IDIVI DIFF,NSECS
661         DPB DIFF,[$HATRK HEAD]
662         IOWRQ HEAD,%HRADR       ; Desire track and sector
663         MOVEI DIFF,%HMRED
664         TRNE WRITE,10
665          MOVEI DIFF,%HMWRT
666         IOWRQ DIFF,%HRCS1       ; Do it (implied seek)
667 WRD7:   IORDQ DIFF,%HRCS1
668         TRNN DIFF,%HXRDY        ; Wait for controller to finish
669          JRST WRD7
670         TRNN DIFF,%HXTRE+%HXMCP ; Trouble?
671          JRST WRDX              ; Nope, exit
672         HRRZM BLOK,BADBLK
673         AOSG ERRCT              ;HARDWARE ERROR--CHECK COUNTER
674          JRST WRD0              ;RECALIBRATE AND TRY AGAIN
675         TRNE WRITE,10           ;GIVE UP--DISTINGUISH BETWEEN
676          JSR ECWR,ERROR         ;WRITE ERRORS AND
677         JSR ECRD,ERROR          ;READ ERRORS
678
679 WRDX:   TRZ WRITE,-1            ;FLUSH GARBAGE
680         JRST (TT)
681
682 WRD0:   MOVEI DIFF,%HYCLR       ; Clear controller
683         IOWRQ DIFF,%HRCS2
684         LDB DIFF,[000300,,WRITE]        ; Select drive
685         IOWRQ DIFF,%HRCS2
686         MOVEI DIFF,%HMCLR       ; Clear drive
687         IOWRQ DIFF,%HRCS1
688         JSP HEAD,RHCHEK         ; Immediate lossage?
689         MOVEI DIFF,%HMREC       ; Recalibrate
690         IOWRQ DIFF,%HRCS1
691         MOVEI HEAD,100000.
692 WRD0A:  SOSGE HEAD
693          JSR EC63,ERROR
694         IORDQ DIFF,%HRSTS
695         TRNE DIFF,%HSPIP        ; WAIT FOR DRIVE TO FINISH
696          JRST WRD0A
697         ANDI DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY+%HSERR
698         CAIE DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY
699          JSR EDLZ,ERROR
700         JRST WRD5
701
702 ;;; JSP HEAD,RHCHEK to check for errors.
703 RHCHEK: IORDQ DIFF,%HRCS1
704         TRNE DIFF,%HXTRE+%HXMCP
705          JSR EDLZ,ERROR
706         JRST (HEAD)
707 ];PH
708 \f;RH10 IO ROUTINE
709 RH,[
710 WRDM:   SKIPL WRITE             ;SEE WHETHER LOAD OR DUMP/VERIFY
711 RDM:     TRZA WRITE,(WRITE)     ;READ FROM MASTER UNIT
712 WRM:      HRRI WRITE,10         ;WRITE ON MASTER UNIT
713 MU:     IORI WRITE,0            ;MASTER UNIT SELECT STORED HERE
714         JRST WRD3A
715
716 WRDB:   MOVEI UNIT,DBUF         ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
717 WRD:    SKIPL WRITE             ;READ OR WRITE FROM/ON CURRENT UNIT
718 RD:      TRZA WRITE,(WRITE)     ;READ FROM CURRENT UNIT
719 WR:       HRRI WRITE,10         ;WRITE ON CURRENT UNIT
720 CU:     IORI WRITE,0            ;CURRENT UNIT SELECT STORED HERE
721 WRD3A:
722 WRD3:   HRLI UNIT,-2000         ;ADDRESS COMES IN IN `UNIT'
723         CONI DSK,HEAD           ;SET WORD COUNT TO ONE BLOCK
724         TLNE HEAD,(%HID22)      ;ACCORDING TO TYPE OF CHANNEL
725          HRLI UNIT,-2000_4
726         MOVEM UNIT,@ICWA
727         LDB UNIT,[300,,WRITE]   ;ISOLATE FROM GARBAGE
728         SOS @ICWA               ;ADJUST FOR DF10 LOSSAGE
729         MOVNI DIFF,16.          ;INITIALIZE ERROR COUNTER
730         MOVEM DIFF,ERRCT        ;15. LOSSES PERMITTED
731 WRD5:   MOVSI DIFF,%HRDCL(UNIT)
732         HRRI DIFF,%HMRDP        ;INIT THE DRIVE
733         JSP HEAD,RHSET
734         HRRZ DIFF,BLOK
735         IDIVI DIFF,NBLKSC
736         EXCH DIFF,HEAD
737         MOVEM HEAD,DBLK         ;SAVE CYLINDER
738         IMULI DIFF,SECBLK
739         IDIVI DIFF,NSECS
740         EXCH DIFF,HEAD
741         DPB HEAD,[$HATRK DIFF]
742         TLO DIFF,%HRADR(UNIT)
743         JSP HEAD,RHSET
744         MOVE DIFF,DBLK
745         TLO DIFF,%HRCYL(UNIT)
746         JSP HEAD,RHSET
747         MOVSI DIFF,%HRCTL(UNIT)
748         IORI DIFF,ICWA_6
749         TRNE WRITE,10
750          TROA DIFF,%HMWRT
751           TRO DIFF,%HMRED
752         JSP HEAD,RHSET          ;DO IT (USE IMPLIED SEEK)
753         CONSO DSK,%HIDON
754          JRST .-1
755         CONSO DSK,%HIERR
756          JRST WRDX
757         HRRZM BLOK,BADBLK
758         AOSG ERRCT              ;HARDWARE ERROR--CHECK COUNTER
759          JRST WRD0              ;RECALIBRATE AND TRY AGAIN
760         TRNE WRITE,10           ;GIVE UP--DISTINGUISH BETWEEN
761          JSR ECWR,ERROR         ;WRITE ERRORS AND
762         JSR ECRD,ERROR          ;READ ERRORS
763
764 WRDX:   HRRZ UNIT,@ICWA         ;RESTORE ADDR
765         ADDI UNIT,1             ;COMPENSATE FOR IOWD LOSSAGE
766         TRZ WRITE,-1            ;FLUSH GARBAGE
767         JRST (TT)
768
769 WRD0:   MOVSI DIFF,%HRDCL(UNIT)
770         HRRI DIFF,%HMCLR
771         JSP HEAD,RHSET
772         MOVSI DIFF,%HRDCL(UNIT)
773         HRRI DIFF,%HMREC
774         JSP HEAD,RHSET
775         MOVEI DIFF,100000.
776         MOVEM DIFF,DBLK
777 WRD0A:  SOSGE DBLK
778          JSR EC63,ERROR
779         MOVSI DIFF,%HRSTS(UNIT)
780         JSP HEAD,RHGET
781         TRNE DIFF,%HSPIP
782          JRST WRD0A
783         ANDI DIFF,%HSVV+%HSRDY+%HSMOL+%HSERR
784         CAIE DIFF,%HSVV+%HSRDY+%HSMOL
785          JSR EDLZ,ERROR
786         JRST WRD5
787
788 ;RH10 HACKING ROUTINES. CALL BY JSP HEAD,.  DIFF HAS REGISTER ADDRESS IN LH, DATA IN RH.
789 RHSET:  TLOA DIFF,%HRLOD
790 RHGET:   TLZ DIFF,%HRLOD
791         DATAO DSK,DIFF
792         MOVEI DIFF,20
793         SOJG DIFF,.
794         DATAI DSK,DIFF
795         TLNE DIFF,%HDERR
796          JSR EDLZ,ERROR
797         ANDI DIFF,177777
798         JRST (HEAD)
799
800 DBLK:   0
801 ];RH
802 \f;SC DISK IO ROUTINE
803 SC,[
804 WRDM:   SKIPL WRITE             ;SEE WHETHER LOAD OR DUMP/VERIFY
805 RDM:     TRZA WRITE,(WRITE)     ;READ FROM MASTER UNIT
806 WRM:      HRRI WRITE,60#120     ;WRITE ON MASTER UNIT
807 MU:     IORI WRITE,0            ;MASTER UNIT SELECT STORED HERE
808         JRST WRD3A
809
810 WRDB:   MOVEI UNIT,DBUF         ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
811 WRD:    SKIPL WRITE             ;READ OR WRITE FROM/ON CURRENT UNIT
812 RD:      TRZA WRITE,(WRITE)     ;READ FROM CURRENT UNIT
813 WR:       HRRI WRITE,60#120     ;WRITE ON CURRENT UNIT
814 CU:     IORI WRITE,0            ;CURRENT UNIT SELECT STORED HERE
815 WRD3A:  TRC WRITE,120
816 WRD3:   DPB WRITE,[330700,,DBLK]        ;SET OP, UNIT SEL
817         DPB UNIT,[DCCA DBLK+1]  ; & CORE ADDR
818         DPB UNIT,[DCCA DBLK1+1]
819         LDB UNIT,[400,,WRITE]   ;ISOLATE FROM GARBAGE
820         MOVNI DIFF,16.          ;INITIALIZE ERROR COUNTER
821         MOVEM DIFF,ERRCT        ;15. LOSSES PERMITTED
822 WRD5:   HRRZ DIFF,BLOK
823         IDIVI DIFF,NSECS
824         DPB HEAD,[DSECT DBLK]
825         IDIVI DIFF,NHEDS
826         DPB HEAD,[DSURF DBLK]
827         DPB DIFF,[DCYL DBLK]
828         CONO DC0,DCCSET\DCDENB  ;RESET ALL, THEN SET DCDENB
829         CAIL DIFF,NCYLS
830          TDZA DIFF,DIFF
831           SKIPLE DIFF,PKNUM(UNIT)
832            JRST WRD4            ;PKID IN
833         MOVE DIFF,QTRAN(UNIT)   ;READ PACK ID
834         DPB DIFF,[DUNFLD GPKID]
835         MOVEI DIFF,TUTCYL
836         SKIPGE QTRAN(UNIT)
837          ADDI DIFF,NCYLS+XCYLS
838         DPB DIFF,[DCYL GPKID]
839         DATAO DC0,[DJMP GPKID]
840         CONSZ DC0,DSSACT
841          JRST .-1
842         CONSZ DC0,DSSERR
843          JRST WRD0
844         CONO DC0,DCCSET\DCDENB  ;RESET POSSIBLE "FUTURE" IP OR RLCERR
845         LDB DIFF,[DPKID RPKID]
846         MOVEM DIFF,PKNUM(UNIT)
847 WRD4:   DPB DIFF,[DPKID DBLK]
848         MOVE DIFF,DBLK
849         DPB DIFF,[3300,,DBLK1]
850         MOVE DIFF,QTRAN(UNIT)
851         DPB DIFF,[DUNFLD DBLK]
852         JUMPGE DIFF,WRD4A
853         LDB DIFF,[DCYL DBLK]    ;2ND HALF UNIT
854         ADDI DIFF,NCYLS+XCYLS
855         DPB DIFF,[DCYL DBLK]
856 WRD4A:  DATAO DC0,[DJMP DBLK]
857         CONSZ DC0,DSSACT
858          JRST .-1
859         CONSO DC0,DSSERR
860          JRST WRDX      ;XFER OK
861         MOVE DIFF,ERRCT
862         TRNN DIFF,2     ;DO RECALIBRATE 2 OUT OF 4 RETRIES
863          JRST WRD2
864 WRD0:   AOSLE ERRCT     ;POSITIONER ERROR--CHECK ERROR COUNT
865          JSR EC63,ERROR ;TOO MANY--GIVE UP
866         DATAO DC0,[DSPC+DSRCAL+DSWINF]
867         CONSO DC0,DSSATT
868          JRST .-1
869         JRST WRD5       ;TRY AGAIN AFTER RESETTING UNIT
870
871 WRD2:   HRRZM BLOK,BADBLK
872         AOSG ERRCT      ;HARDWARE ERROR--CHECK COUNTER
873          JRST WRD5      ;TRY AGAIN
874         TRNE WRITE,40   ;GIVE UP--DISTINGUISH BETWEEN
875          JSR ECWR,ERROR ;WRITE ERRORS AND
876         JSR ECRD,ERROR  ;READ ERRORS
877
878 WRDX:   DPB BLOK,[XWBLK XWDS]   ;PNTR TO PREV BLOCK
879         LDB UNIT,[DCCA DBLK+1]  ;RESTORE ADR
880         TRZ WRITE,-1    ;FLUSH GARBAGE
881         JRST (TT)
882
883 DBLK:   DREAD+DUNENB
884         DCOPY .(-2000_2&37774)
885         DCOPY XWDS(-4_2&37774)
886 DBLK1:  DRC
887         DCOPY .(-2000_2&37774)
888         DCOPY XWDS(-4_2&37774)
889         DHLT
890
891 GPKID:  DSPC+DSCRHD+DSWIDX+DSWNUL+DUNENB+TUTCYL_11.+TUTSRF_6+TUTSEC
892         DCOPY RPKID(37774)
893         DHLT
894 ];SC
895 \f
896 ;JSP P,TYI RETURNS CHAR IN C.
897 ;JSP P,TYI0 ALSO SKIPS IF NO INPUT AVAILABLE.
898 TYI:    ILDB C,MEMSIZ-1         ;CHECK FOR COMMANDS FROM MEMORY
899         JUMPN C,(P)             ;FOUND ONE--RETURN
900         CLEARM MEMSIZ-1
901 TYI0:                           ;ENTRY TO SKIP IF NO INPUT AVAILABLE
902 KA,[    CONSO TTY,40
903          JRST TYI1
904         DATAI TTY,C
905 ]
906 KS,[    SKIPN C,8CTYIN
907          JRST TYI1
908         ANDI C,177
909         SETZM 8CTYIN
910 ]
911 KL,[    MOVEI C,3400            ;DDT MODE INPUT
912         SETZM DTEFLG
913         MOVEM C,DTECMD
914         CONO DTE,%DBL11
915         SKIPN DTEFLG
916          JRST .-1
917         MOVE C,DTEF11
918         SETZM DTEFLG
919         JUMPE C,TYI1
920 ]       ANDI C,177
921         CAIGE C,175
922         CAIN C,33
923          JRST (P)               ;DON'T ECHO GRITCHES
924 ;DROP INTO TYO
925
926 ;JSP P,TYO TYPES OUT CHAR IN C.  CLOBBERS A,C.
927 TYO:    ;SKIPE MEMSIZ-1
928         ; JRST (P)              ;DON'T ECHO COMMANDS FROM MEMORY
929 KA,[    HRRZ A,C                ;COMPUTE PARITY
930         IMULI A,40201
931         AND A,[1111111]
932         IMUL A,[1111111]
933         TLNE A,1
934          IORI C,200
935         CONSZ TTY,20
936          JRST .-1
937         DATAO TTY,C
938         ANDCMI C,200
939 ]
940 KS,[    MOVE A,C
941         ANDI A,177
942         TRO A,400
943         MOVEM A,8CTYOT
944         CONI A
945         IORI A,80INT
946         CONO (A)
947         SKIPE 8CTYOT
948          JRST .-1
949 ]
950 KL,[    MOVE A,C
951         ANDI A,177
952         SETZM DTEFLG
953         MOVEM A,DTECMD
954         CONO DTE,%DBL11
955         SKIPN DTEFLG
956          JRST .-1
957         SETZM DTEFLG
958 ]
959         JUMPGE C,(P)            ;CHECK FOR CRLF (AS OPPOSED TO ECHOING A CR)
960         SKIPA C,C12             ;TYPE AN LF
961 CRLF:    HRROI C,15
962         JRST TYO
963
964 TYI1:   HRRZ C,-1(P)            ;NO INPUT AVAILABLE
965         CAIE C,TYI0
966          JRST TYI               ;WAIT FOR IT
967         JRST 1(P)               ;CALL WAS TO TYI0, SKIP RETURN
968 \f
969 LINK:   CAIE CMD,'D
970         CAIN CMD,'K
971          MOVSI WRITE,-1         ;MAKE THIS INFO MORE CONVENIENT
972         MOVE D,[440600,,C]
973         MOVEI T,0
974 LINKL:  ILDB TT,DIRPT
975         SKIPGE WRITE
976          DPB T,DIRPT            ;CLOBBER CHARS READ FOR DUMP OR KILL
977         CAIN TT,';
978          JRST LINKN
979         CAIN TT,':
980          JRST LINKQ
981         JUMPE TT,LINKN
982 LINKQ1: IDPB TT,D
983         TLNE D,770000
984          JRST LINKL
985 LINKN1: CAMGE D,[600,,B]        ;THROUGH WITH FN2?
986          JRST LINKL
987         JUMPL WRITE,KILL1
988         MOVEM A,FN1
989         MOVEM B,FN2
990         JRST MLOOK2
991
992 LINKN:  TLNN D,770000
993          JRST LINKN1
994         IDPB T,D                ;FILL OUT WITH SPACES
995         JRST LINKN
996
997 LINKQ:  ILDB TT,DIRPT
998         JUMPGE WRITE,LINKQ1
999         DPB T,DIRPT
1000         JRST LINKQ1
1001 \f
1002 READ:   MOVEI BLKIN,CORE
1003         JSP P,CRLF
1004         MOVEI CMD,0             ;INITIALIZE COMMAND
1005 READ1A: MOVEI WRITE,0           ;INITIALIZE NUMBER
1006         MOVSI B,(SIXBIT \@\)    ;INITIALIZE 1ST FILE NAME
1007 READ1:  MOVEM B,FN1
1008 READ3A: MOVSI B,(SIXBIT \@\)    ;INITIALIZE CURRENT FILE NAME
1009         MOVE D,[440600,,B]
1010 READ2:  JSP P,TYI
1011         CAIN C,177
1012          JRST READ              ;IF RUBOUT START OVER
1013         CAIGE C,175
1014         CAIN C,33
1015          JRST ALTMOD            ;JUMP IF 33, 175, 176
1016         ASH WRITE,3             ;DOES NOT CHANGE SIGN OF WRITE
1017         CAIL C,"0
1018         CAILE C,"7
1019          TLOA WRITE,400000      ;NON-NUMERIC CHAR--MAKE WRITE NEGATIVE
1020           ADDI WRITE,-"0(C)     ;NUMERIC CHAR--ACCUMULATE NUMBER
1021         CAIN C,";
1022          JRST READ3             ;SET SYSTEM NAME
1023         CAIN C,40
1024          JRST READ1             ;SET FIRST FILE NAME
1025         CAIN C,^Q
1026          JSP P,TYI              ;QUOTED CHARACTER
1027         CAIGE C,140             ;CHECK FOR LOWER CASE
1028          SUBI C,40
1029         JUMPL C,DOIT            ;IF LESS THAN 40 (EXC. ^Q) END OF COMMAND
1030         TLNE D,770000           ;SKIP IF ALREADY SIX CHARS
1031          IDPB C,D
1032         JRST READ2
1033
1034 READ3:  MOVEM B,SYSN
1035         CAIE CMD,'U
1036          JRST READ3A
1037         JRST DOIT               ;IF COMMAND IS U GO LIST DIRECTORY
1038 \f
1039 ONOFF:  CAIGE WRITE,NDSK
1040          DPB CMD,[100,,QDED(WRITE)]     ;LOW BIT OF CMD DETERMINES ON/OFF LINE STATUS
1041         JRST READ               ; (K=13, L=14)
1042
1043 ALT1:   LDB CMD,D               ;PICK UP COMMAND CHAR
1044         CAIE CMD,'K
1045          TRNN CMD,2
1046           JRST READ1A           ;GET FILE NAME
1047         JRST DOIT               ;DON'T WANT FILE NAME--GO TO WORK
1048
1049 ALTMOD: MOVEI C,"$
1050         JSP P,TYO               ;ECHO DOLLAR SIGN
1051         JUMPLE WRITE,ALT2       ;JUMP IF NOT <NUMBER><ALTMODE> LAST TYPED
1052         JUMPN CMD,ONOFF         ;JUMP IF <CMD><ALTMODE><NUMBER><ALTMODE>
1053         HRRM WRITE,SADR         ;SET STARTING ADDR
1054         JRST READ
1055
1056 ALT2:   TLC D,360000
1057         TLCN D,360000           ;SKIP IF SINGLE CHARACTER BEFORE <ALTMODE>
1058          JUMPE CMD,ALT1         ;JUMP IF NO COMMAND ALREADY TYPED
1059 DOIT:   MOVEM B,FN2             ;STORE SECOND FILE NAME
1060         HRRZ B,MU
1061         HRRM B,CU               ;MAKE MASTER UNIT CURRENT UNIT
1062         MOVNI WRITE,1
1063         JSP P,LODUMP            ;DUMP OUT PSEUDO-CORE
1064         CAIN CMD,'G
1065          JRST LOADG0            ;GO
1066         JSP TT,RDTUT
1067         MOVE C,SYSN
1068 MLOOK2: MOVSI WRITE,1           ;MAKE WRITE INDICATE LOAD
1069         MOVEI BLOK,MFDBLK
1070         MOVEI UNIT,DIR
1071         JSP TT,RD               ;READ MASTER DIRECTORY TO FIND WHERE USER DIRECTORY IS
1072         MOVE T,DIR+MDCHK
1073         CAME T,[SIXBIT/M.F.D./]
1074          JSR EMFC,ERROR
1075         MOVE T,DIR+MDNUDS
1076         CAIE T,NUDSL
1077          JSR EMFC,ERROR
1078         CAIN CMD,'S
1079          JRST LISTS             ;LIST DISK ID'S AND SYSTEM NAMES
1080         MOVE T,DIR+MDNAMP
1081 MLOOK:  CAMN C,DIR+MNUNAM(T)    ;LOOK UP SYSTEM NAME
1082          JRST MLOOK1
1083         ADDI T,LMNBLK
1084         CAIGE T,2000
1085          JRST MLOOK
1086         JSR ESNF,ERROR          ;NOT FOUND
1087 \f
1088 MLOOK1: MOVEI BLOK,2*NUDSL-2000(T)      ;CONVERT USER SLOT TO BLOCK NUMBER
1089         LSH BLOK,-1
1090         HRRM BLOK,UDBLK         ;REMEMBER FOR KILL OR DUMP
1091         MOVEI UNIT,DIR
1092         JSP TT,RDM              ;READ USER DIRECTORY
1093 ULOOK:  CAME C,DIR+UDNAME
1094          JSR ECDR,ERROR         ;WRONG ONE??
1095         CAIE CMD,'F
1096         CAIN CMD,'U
1097          JRST LISTFC            ;LIST USER DIRECTORY
1098         MOVSI TT,UNIGFL
1099         MOVE T,DIR+UDNAMP
1100         MOVE A,FN1
1101         MOVE B,FN2
1102 ULOOK1: CAMN A,DIR+UNFN1(T)     ;LOOK UP FILE NAME
1103         CAME B,DIR+UNFN2(T)
1104          JRST ULOOK2
1105         TDNN TT,DIR+UNRNDM(T)   ;IS THIS FILE FOR REAL?
1106          JRST ULOOK3
1107 ULOOK2: ADDI T,LUNBLK
1108         CAIGE T,2000
1109          JRST ULOOK1
1110         CAIE CMD,'D             ;IF NOT FOUND BETTER BE DUMP
1111          JSR EFNF,ERROR
1112         MOVE T,DIR+UDNAMP
1113 ULOOK4: SKIPN DIR+UNFN1(T)      ;FIND FREE SLOT FOR NEW FILE
1114          JRST DUMP
1115         ADDI T,LUNBLK
1116         CAIGE T,2000
1117          JRST ULOOK4
1118         MOVNI T,LUNBLK          ;NO FREE SLOTS--TRY TO EXTEND NAME AREA DOWN
1119         ADDM T,DIR+UDNAMP
1120         MOVE T,DIR+UDESCP
1121         IDIVI T,6
1122         ADDI T,UDDESC
1123         CAMGE T,DIR+UDNAMP      ;DID WE RUN INTO DESCRIPTOR AREA?
1124          JRST DUMP0
1125         JSR EDIR,ERROR          ;YES
1126
1127 ULOOK3: HRRM T,DMP4             ;IF FILE FOUND, SAVE SLOT NUMBER FOR DUMP
1128         LDB C,[UNDSCP DIR+UNRNDM(T)]
1129         JSP TT,GBP
1130         MOVEM C,DIRPT           ;SET UP DESCRIPTOR AREA BYTE POINTER
1131         MOVSI TT,UNLINK
1132         TDNE TT,DIR+UNRNDM(T)
1133          JRST LINK              ;FILE IS A LINK
1134         LDB A,[UNPKN DIR+UNRNDM(T)]
1135 ULOOK5: CAMN A,TUT+QPKNUM       ;SEE IF IT'S MOUNTED
1136          JRST LOAD
1137         JSP TT,NXTTUT
1138          JRST ULOOK5
1139         JSR EPNM,ERROR
1140 \f
1141 LOAD:   CAIE CMD,'D             ;GET HERE IF FILE FOUND
1142         CAIN CMD,'K             ;IF DUMP OR KILL, DELETE IT
1143          JRST KILL
1144 ZERO:   MOVEI TT,CORE-1
1145         TRNN CMD,20             ;SKIP IF T$ SYMBOL LOADING COMMAND
1146          JRST ZERO1
1147         MOVEI B,DDT-1           ;ASSUME ALWAYS USING MOBY DDT
1148         JSP P,FD                ;GET DDT'S SYMBOL TABLE POINTER
1149          JSR EDDT,ERROR         ;CAN'T GET IT??
1150         HRROS B,(C)             ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
1151         CAME B,[-1,,DDT-2]      ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
1152          JSR EDDT,ERROR
1153         SKIPE D,-2(C)           ;FLUSH ALL BUT INITIAL SYMBOLS
1154          MOVEM D,-1(C)
1155         MOVE D,-1(C)
1156         MOVEI TT,CORE-1
1157         CAILE TT,-1(D)
1158          MOVEI TT,-1(D)         ;DON'T ZERO SYMBOL TABLE NOR DDT
1159 ZERO1:  TRNE CMD,1
1160          JRST LOAD1             ;NON-ZEROING COMMAND
1161         SETZM 40                ;BEGIN CLEARING CORE
1162         MOVE T,[40,,41]         ;SET UP BLT POINTER
1163 ;CODE TO SKIP OVER NXM
1164 ZERO2:  CAIG TT,10*2000-1(T)    ;MORE THAN 8K LEFT TO ZERO?
1165          JRST ZERO4             ;NO, ZERO REMAINING WORDS AND PROCEED
1166         MOVE D,T                ;AVOID KA/KL INCOMPAT BY COPYING BLT PNTR
1167         BLT D,10*2000-1(T)      ;ZERO NEXT 8K
1168 ZERO3:  ADDI T,10*2000          ;MOVE DEST OF BLT PNTR UP 8K
1169         ANDCMI T,1777           ;ROUND DOWN TO 1K BOUNDARY
1170 KA,     CONO 10000              ;CLEAR NXM
1171         MOVES (T)               ;SET NXM IF HOLE
1172 KA,     CONSZ 10000             ;NXM GENERATED?
1173 KA,      JRST ZERO3             ;YES, GO TO NEXT 8K
1174         JRST ZERO2              ;NO, CLEAR THIS 8K
1175
1176 ZERO4:  BLT T,(TT)              ;AND CLEAR TO TOP BOUNDARY
1177         TRNE CMD,20
1178          JRST LOAD1             ;IF SYMBOL-LOADING COMMAND, STOP THERE
1179         CLEARM CBUF
1180         MOVE T,[CBUF,,CBUF+1]
1181         BLT T,CBUF+1777
1182         MOVEI UNIT,CBUF
1183         MOVE BLOK,CBLK          ;-NSWBL IN LH
1184         JSP TT,WRM              ;CLEAR PSEUDO-CORE
1185         AOBJN BLOK,.-1
1186 LOAD1:  SETZB BUFP,BLKCNT       ;SET UP BUFP SO FIRST CALL TO WD WILL READ
1187 LOAD2:  JSP P,WD                ;FIRST BLOCK OF FILE
1188         CAME D,[JRST 1]         ;LOOK FOR END OF SBLK LOADER
1189          JRST LOAD2
1190         CAIN CMD,'I             ;IF VERIFY, START SIMULATING DUMP
1191          JRST DUMP.5
1192 LOAD3:  JSP P,WD                ;READ BLOCK HEADER
1193         JUMPGE D,LOADS          ;IT'S A JUMP BLOCK
1194         MOVE A,D
1195         MOVE B,D
1196         JSR LOADB               ;LOAD LOGICAL BLOCK INTO CORE
1197         JRST LOAD3
1198
1199 LOADB:  0
1200 LOAD4:  JSP P,WD                ;LOAD A LOGICAL BLOCK--AOBJN POINTER IN B,
1201         ROT A,1                 ;BLOCK HEADER IN A (FOR CHECKSUM)
1202         ADD A,D                 ;ADD NEW WORD INTO CHECKSUM
1203         JSP P,FD                ;AND PREPARE TO SMASH IT AWAY
1204          JRST .+2               ;LOCATION CAN'T BE LOADED
1205           MOVEM D,(C)           ;SMASH WORD AWAY
1206         AOBJN B,LOAD4
1207         JSP P,WD
1208         CAMN A,D                ;CHECK THE CHECKSUM
1209          JRST @LOADB
1210         JSR ECKS,ERROR          ;BAD CHECKSUM
1211 \f
1212 LOADS:  CAIN CMD,'M
1213          JRST LOADG0            ;DON'T LOAD SYMBOLS NOR SADR
1214         MOVEM D,NXTBW3          ;SAVE S.A.
1215         MOVEI B,DDT-1           ;ASSUME IS ALWAYS MOBY DDT.
1216         JSP P,FD                ;GET DDT'S SYMBOL TABLE POINTER
1217          JSR EDDT,ERROR         ;CAN'T GET IT??
1218         SKIPN (C)
1219          JRST LOADJ             ;AIN'T GOT NO DDT, IGNORE SYMBOLS        
1220         HRROS B,(C)             ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
1221         CAMN B,[-1,,DDT-2]      ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
1222          JSP P,FD               ;FETCH SYMBOL TABLE POINTER
1223           JSR EDDT,ERROR
1224         MOVE D,(C)
1225         MOVEM D,DDTM2
1226 LOADS1: MOVE B,DDTM2            ;GET LOWEST SYMBOL LOC SO FAR
1227         JSP P,WD                ;GET SYMBOL BLOCK HEADER
1228         JUMPGE D,LOADS2         ;JUMP IF END OF SYMBOLS
1229         TRNE D,-1               ;SKIP IF REALLY SYMBOLS AND NOT SOME OTHER BRAIN-DAMAGED CRUFT
1230          JRST LOADBD
1231         MOVSS D
1232         HRLI D,-1(D)
1233         ADD B,D                 ;EFFECTIVELY SUBTRACTS LENGTH OF BLOCK FROM BOTH HALVES
1234         MOVEM B,DDTM2           ;OF SYMBOL TABLE POINTER
1235         HRL B,D                 ;SET UP AOBJN POINTER IN B
1236         HRLZ A,D                ;AND RECREATE HEADER IN A
1237         JSR LOADB               ;LOAD THE SYMBOLS
1238         JRST LOADS1
1239
1240 LOADBD: HLRO B,D                ;-# WORDS TO SKIP (NOT COUNTING CHECKSUM)
1241         JSP P,WD
1242         AOJLE B,.-1
1243         JRST LOADS1             ;TRY NEXT SYMBOL BLOCK
1244
1245 LOADS2: MOVE D,DDTM2            ;GET UPDATED DDT SYMBOL PNTR
1246 LOADS4: MOVEI B,DDT-2           ;WE KNOW WHERE IT ALWAYS GOES
1247         JSP P,FD                ;PUT BACK SYMBOL TABLE POINTER
1248          JSR EBUG,ERROR         ;CAN'T PUT IT BACK??
1249         MOVEM D,(C)
1250         MOVEI B,DDT-4           ;GIVE STARTING ADDRESS TO DDT
1251         JSP P,FD
1252          JSR EBUG,ERROR
1253         MOVE D,NXTBW3
1254         MOVEM D,(C)
1255         MOVEI D,DDT             ;AND SET DSKDMP START ADDRESS TO DDT
1256 LOADJ:  HRRM D,SADR             ;SET STARTING ADDRESS FROM JUMP BLOCK
1257 LOADG0: MOVE T,BOOTNS           ;APPROP DISK WAIT FOR NON BUSY INSTR
1258         MOVEM T,BOOT
1259 LOADG:  JSP TT,WRCB             ;MAKE SURE ALL LOADED CRUFT IN PSEUDO-CORE IS OUT
1260         MOVEI WRITE,0
1261         JSP P,LODUMP            ;AND LOAD IT ALL IN
1262         TRNE CMD,10
1263          JRST READ              ;NON-GOING COMMAND
1264 GO:
1265 PH,[    MOVSI B,-LSWPADR
1266 GO1:    IORD DIFF,SWPCS1
1267         TRNN DIFF,%HXRDY        ; Wait for controller
1268          JRST GO1
1269         HRRZ DIFF,SWPVAL(B)
1270         IOWR DIFF,SWPADR(B)
1271         AOBJN B,GO1
1272 ];PH
1273 RH,[    MOVE B,ERRWD
1274         CONI DSK,HEAD
1275         TLNE HEAD,(%HID22)
1276          HRLI B,-1700_4
1277         MOVEM B,@ICWA
1278         MOVSI B,-6
1279 GO1:    CONSZ DSK,%HIBSY
1280          JRST .-1
1281         MOVE DIFF,SWPOU1(B)
1282         JSP HEAD,RHSET
1283         AOBJN B,GO1
1284 ];RH
1285 RP,[    MOVE B,ERRWD
1286         MOVEM B,@ICWA
1287         DATAO DPC,SWPSK
1288         JSP P,SKWAIT
1289         DATAO DPC,SWPOU1
1290         CONSO DPC,DONE
1291          JRST .-1
1292         DATAO DPC,SWPOU2
1293 ];RP
1294 SC,     DATAO DC0,[DJMP SWPOUT]
1295         JRST WAIT
1296 \f
1297 LISTS:  JSP P,CRLF
1298 LISTS2: JSP P,TYI0
1299          JRST LOADG1            ;SHUT UP IF KEY HIT
1300         MOVE C,TUT+QPKNUM       ;TYPE PACK NUMBER
1301         JSP TT,PNO
1302         MOVE D,TUT+QPAKID       ;AND I.D.
1303         JSP TT,PD2
1304         JSP TT,NXTTUT           ;SAME FOR ALL DIRECTORIES
1305          JRST LISTS2
1306         MOVE T,DIR+MDNAMP
1307 LISTS1: CAIGE T,2000
1308          JSP P,TYI0             ;STOP TYPING IF TTI FLAG ON
1309           JRST LOADG1
1310         SKIPE D,DIR+MNUNAM(T)
1311          JSP TT,PD              ;TYPE OUT USER NAME
1312         ADDI T,LMNBLK
1313         JRST LISTS1
1314
1315 LISTFC: MOVE T,DIR+UDNAMP
1316 LISTF1: 
1317 KA,     CONSO TTY,40            ;STOP TYPING IF TTI FLAG ON
1318 KS,     SKIPN 8CTYIN            ; Stop typing if character waiting
1319          CAIL T,2000
1320           JRST LOADG1
1321         SKIPN DIR+UNFN1(T)      ;SKIP IF FILE IN THIS SLOT
1322          JRST LISTF2
1323         JSP P,CRLF
1324         LDB C,[UNPKN DIR+UNRNDM(T)]
1325         JSP TT,PNO              ;TYPE PACK NUMBER
1326         MOVE D,DIR+UNFN1(T)
1327         JSP TT,PD2              ;TYPE FIRST FILE NAME
1328         MOVE D,DIR+UNFN2(T)
1329         JSP TT,PD2              ;AND SECOND FILE NAME
1330 LISTF2: ADDI T,LUNBLK
1331         JRST LISTF1
1332
1333 KILL:   JSP TT,NXTB6            ;GET HERE ON KILL OR DUMP OF EXISTING FILE
1334         MOVEI T,0               ;ZERO BYTES IN USER DIRECTORY DESCIPTOR AREA
1335         DPB T,DIRPT             ;NXTB6 JUMPS TO KILL1 AT END OF FILE
1336         MOVE C,BLOK
1337         JSP TT,GTP
1338         ILDB T,C
1339         CAIGE T,TUTLK-1         ;SOS USAGE OF THIS BLOCK
1340          SOJL T,[JSR ECDR,ERROR]
1341         DPB T,C
1342         JRST KILL
1343
1344 KILL1:  HRRZ T,DMP4             ;CLEAR OUT USER DIRECTORY SLOT
1345         CLEARM DIR+UNFN1(T)
1346         CLEARM DIR+UNFN2(T)
1347         CLEARM DIR+UNRNDM(T)
1348         MOVSI WRITE,-1
1349         CAIN CMD,'K
1350          JRST KILDMP            ;IF KILL DON'T DUMP
1351         JRST DMP4               ;MUST DUMP ON SAME UNIT
1352 \f
1353 DUMP0:  MOVE T,DIR+UDNAMP       ;GET HERE IF SLOT CREATED AT BOTTOM OF NAME AREA
1354 DUMP:   HRRM T,DMP4             ;GET HERE IF EMPTY SLOT FOUND IN NAME AREA
1355 DMP0:   MOVEI D,0               ;GET HERE IF USING SLOT OF OLD FILE
1356 DMP1:   ;MOVE C,TUT+QSWAPA
1357         MOVEI C,0               ;NOTE START AT 0 NOT QSWAPA
1358         MOVE B,C
1359         SUB B,TUT+QLASTB
1360         HRLZ B,B                ;LH(B) COUNTS BLOCKS, RH(B) COUNTS FREE BLOCKS
1361         JSP TT,GTP
1362 DMP2:   ILDB T,C
1363         SKIPE T
1364 KA,      SUBI B,1               ;THIS RELIES ON CARRY PROPAGATING FROM RH TO LH IN AOBJN
1365 KL,      HRRI B,-1(B)           ;ON KI10, KL10 CHANGE SUBI B,1 TO HRRI B,-1(B)
1366 KS,      HRRI B,-1(B)           ;KS too...
1367         AOBJN B,DMP2
1368         CAIG B,(D)              ;RH OF D IS HIGHEST SO FAR, LH SAYS WHICH UNIT
1369          JRST DMP5              ;NOT BETTER THAN RECORD
1370         MOVE D,B                ;NEW RECORD--RECORD IT
1371         HRL D,CU
1372 DMP5:   JSP TT,NXTTUT           ;TRY NEXT
1373          JRST DMP1
1374                         ;FALLS THROUGH AT END
1375 DMP3:   HLRM D,CU               ;SET CURRENT UNIT TO ONE WITH MOST FREE BLOCKS
1376         JSP TT,RDTUT            ;GET ITS TUT
1377 DMP4:   MOVEI T,.
1378         MOVE A,FN1
1379         MOVE B,FN2
1380         MOVEM A,DIR+UNFN1(T)    ;PUT CRUFT INTO SLOT
1381         MOVEM B,DIR+UNFN2(T)
1382         SETOM DIR+UNDATE(T)     ; Unknown creation date
1383         HRROI C,777000          ; Unknown reference date
1384         MOVEM C,DIR+UNREF(T)    ; Unknown author, 36. bit bytes
1385 SC,[    MOVEM A,XWDS+XWFN1
1386         MOVEM B,XWDS+XWFN2
1387         MOVE C,SYSN
1388         MOVEM C,XWDS+XWSYSN
1389 ]       MOVE C,DIR+UDESCP       ;PUT DESCRIPTOR CHARACTER ADDRESS
1390         MOVE B,TUT+QPKNUM       ;AND PACK NUMBER
1391         DPB B,[UNPKN C]
1392         MOVEM C,DIR+UNRNDM(T)   ;INTO USER DIRECTORY SLOT
1393         ;MOVE C,TUT+QSWAPA      ;COMMENTED OUT INSN DUMPS INTO FILE AREA
1394         MOVEI C,0               ;DUMP INTO SWAPPING AREA TO AVOID Y FILES
1395         MOVEM C,LBLOCK          ;A DAEMON WILL COPY INTO FILE AREA AFTER SALVAGE
1396         JSP TT,GTP
1397         MOVEM C,TUTPT           ;INITIALIZE TUT POINTER
1398         MOVE C,DIR+UDESCP
1399         JSP TT,GBP
1400         MOVEM C,DIRPT           ;INITIALIZE DESCRIPTOR AREA POINTER
1401         SETOB WRITE,BLKCNT      ;FORCE NXTBW TO LOAD ADR
1402 KA,     HRLOI BUFP,-2001-1      ;SET UP BUFP SO FIRST WORD GOES IN DBUF+0
1403 KL,     HRLOI BUFP,-2001
1404 KS,     HRLOI BUFP,-2001
1405         MOVE D,[JRST 1]
1406         JSP P,WD                ;END OF SBLK LOADER
1407 ;DROPS THROUGH
1408 \f
1409 ;DROPS IN
1410 DUMP.5: MOVSI WRITE,-'I(CMD)    ;GET HERE IF VERIFY--SET WRITE NEGATIVE IF
1411         MOVEI B,40              ;DUMP AND ZERO IF VERIFY--FIRST ADDR DUMPED IS 40
1412         HRRM B,DUMP4
1413         HLLOS DUMP6
1414         SETZM DUMP9S
1415         SETZM DUMP9J
1416         SETZM DUMP9K
1417         MOVEI B,DDT-3           ;SET UP TO NOT DUMP SYMBOLS AS PART OF CORE IMAGE
1418         JSP P,FD
1419          JSR EBUG,ERROR
1420         SKIPN A,(C)             ;GET PNTR TO BUILT IN SYMBOLS
1421          JRST DUMP4             ;NO DDT, DON'T HACK THIS
1422         HRRM A,DUMP7            ;THIS IS WHERE WE START DUMPING AGAIN
1423         MOVEM A,DUMP9K          ;THIS WILL BE INITIAL SYMBOL TABLE PNTR WHEN DDT LOADED
1424         MOVNI A,(A)
1425         ADD A,1(C)              ;GET MINUS SIZE OF NON-BUILTIN SYMBOL TABLE IN RH(A)
1426         HRL A,1(C)              ;GET PNTR TO SYMBOL TABLE
1427         HLRM A,DUMP6            ;THIS IS WHERE WE STOP DUMPING
1428         MOVSM A,DUMP9S          ;SAVE AOBJN PNTR TO NON-BUILTIN SYMBOLS
1429         MOVE A,-1(C)            ;PICK UP START ADDRESS
1430         MOVEM A,DUMP9J          ;SAVE 
1431         MOVE B,-2(C)            ;DUMP LOW CORE (ACS) OUT OF PLACE SAVED IN DDT
1432         HLLZ A,B                ;HERE B HAS ADDRESS DUMPING FROM
1433         JRST DUMP3B             ;AND A AND D HAVE VIRTUAL ADDRESS
1434
1435 DUMP1:                          ;SKIP OVER NXM ON DUMPING
1436 KA,[    CONSO 10000             ;NXM SET?
1437          JRST DUMP1A            ;NO, CONTINUE IN SEQUENCE
1438         ADDI B,10*2000-1        ;SKIP 8K
1439         TRZ B,1777              ;ROUND DOWN TO 8K BOUDARY
1440         CONO 10000              ;CLEAR NXM
1441 DUMP1A:
1442 ];KA
1443 DUMP6:  CAIGE B,.               ;SKIP IF REACHED SYMBOL TABLE
1444          JRST DUMP8
1445 DUMP7:  MOVEI B,.               ;SKIP OVER SYMBOLS, DUMP DDT
1446         HLLOS DUMP6             ;DEFUSE TEST
1447 DUMP8:  JSP P,FD
1448          JRST DUMPJ             ;TIME TO WRITE JUMP BLOCK AND SYMBOL TABLE
1449         SKIPN (C)               ;LOOK FOR NON-ZEROES
1450          AOJA B,DUMP1
1451         MOVE A,B                ;SAVE START OF BLOCK
1452 DUMP2:  TLZ A,-1                ;LOOK FOR TWO CONSECUTIVE ZEROES
1453 DUMP2A: CAIL B,200(A)           ;BUT DON'T DUMP MORE THAN 200 WORDS AT A TIME
1454          JRST DUMP3
1455         XCT DUMP6
1456          JSP P,FD
1457           JRST DUMP3            ;END OF CORE, WRITE OUT LAST BLOCK
1458         SKIPE (C)
1459          AOJA B,DUMP2           ;NONZERO
1460         TLON A,-1               ;ZERO, WAS PREV LOC ZERO ALSO?
1461          AOJA B,DUMP2A          ;NO, CHECK FOLLOWING LOC
1462         SOJA B,DUMP3            ;YES, DUMP THE NON-ZERO THAT PRECEDES IT
1463
1464 DUMP3:  HRRM B,DUMP4            ;SAVE ADDRESS TO CONTINUE SEARCH
1465         SUBM A,B                ;RH(B) GETS MINUS THE LENGTH OF THE BLOCK
1466         HRL A,B                 ;SET UP HEADER IN A
1467         MOVE B,A                ;AND B
1468 DUMP3B: MOVE D,A                ;AND D
1469         JSP P,WD                ;WRITE HEADER
1470 DUMP3A: JSP P,FD
1471          JSR EBUG,ERROR         ;CAN'T FETCH WORD WE FETCHED BEFORE??
1472         MOVE D,(C)
1473         ROT A,1
1474         ADD A,D                 ;COMPUTE CHECKSUM
1475         JSP P,WD                ;WRITE DATA WORD
1476         AOBJN B,DUMP3A
1477         MOVE D,A
1478         JSP P,WD                ;WRITE OUT CHECKSUM
1479 DUMP4:  MOVEI B,.               ;AND CONTINUE SEARCHING
1480         JUMPN B,DUMP1           ;IF MRC EVER SEES THIS --SELFMODIFYING CODE-- ....
1481         JRST DUMP9              ;FINISHED DUMPING SYMBOLS
1482 \f
1483 DUMPJ:  SKIPN DUMP9K
1484          JRST DMP9J1
1485         HRROI D,DDT-2           ;BUGGER THE SYMBOL TABLE
1486         MOVE A,D
1487         JSP P,WD
1488         MOVE D,DUMP9K
1489         ROT A,1
1490         JSP P,WD
1491         ADD D,A
1492         JSP P,WD
1493 DMP9J1: SKIPN D,DUMP9J
1494          MOVE D,SADR
1495         JSP P,WD                ;WRITE OUT JUMP BLOCK
1496         SKIPN B,DUMP9S          ;WRITE SYMBOLS
1497          JRST DUMP9             ;NO SYMBOLS
1498         HLLZ A,B
1499         HLLZS DUMP4             ;DUMP SYMBOL BLOCK, RETURN TO DUMP9
1500         JRST DUMP3B
1501
1502 DUMP9:  JUMPE WRITE,LOADG1      ;IF VERIFY, THAT'S ALL
1503         SKIPN D,DUMP9J
1504          MOVE D,SADR
1505         JSP P,WD                ;SECOND JUMP BLOCK
1506         HRRZ T,DMP4             ; GET POINTER TO NAME AREA
1507         AOS BUFP
1508         DPB BUFP,[UNWRDC+DIR+UNRNDM(T)]
1509         JSP TT,NXTBLK
1510         JSP TT,WRDB             ;WRITE OUT LAST BLOCK
1511         SKIPE T,BLKCNT
1512          JSR NXTBW3             ;STORE LAST DESCRIPTOR BYTE
1513         MOVEI T,0
1514         JSR NXTBW3              ;AND INDICATE END OF FILE
1515         LDB T,[360600,,DIRPT]
1516         IDIVI T,6
1517         HRRZ TT,DIRPT
1518         IMULI TT,6
1519         SUBI TT,6*<DIR+UDDESC>-5-1(T)
1520         HRRZM TT,DIR+UDESCP     ;INDICATE NEW END OF DESCRIPTOR AREA
1521 KILDMP: MOVEI UNIT,TUT
1522         MOVEI BLOK,TUTBLK
1523         JSP TT,WRD              ;WRITE OUT TUT ON THIS UNIT
1524 REPEAT NTUTBL-1,[
1525         ADDI UNIT,2000
1526         ADDI BLOK,1
1527         JSP TT,WRD
1528 ]
1529         HRRZ B,CU
1530         HRRM B,KD2              ;WRITE OUT USER DIRECTORY ON ALL UNITS
1531 KD1:    ADDI B,1
1532         CAIN B,NDSK
1533          MOVEI B,0
1534         HRRM B,CU
1535         SKIPE QDED(B)
1536          JRST KD2
1537         MOVEI UNIT,DIR
1538 UDBLK:  MOVEI BLOK,.
1539         MOVE TT,DIR+UDNAME
1540         CAME TT,SYSN
1541          JSR EBUG,ERROR
1542         JSP TT,WR
1543 KD2:    CAIN B,.
1544          JRST LOADG1
1545         JRST KD1
1546
1547 GTP:    SKIPGE TUT+QPKNUM
1548          JSR EBUG,ERROR         ;MUST BE OLD-STYLE TUT?
1549         SUB C,TUT+QFRSTB
1550         JUMPL C,[JSR EBUG,ERROR]
1551         IDIVI C,TUTEPW
1552         IMULI A,-10000*TUTBYT
1553         HRLI C,440000+TUTBYT_6(A)
1554         ADDI C,TUT+LTIBLK
1555         JRST (TT)
1556 \f
1557 SC,[    ;LOGICAL TO PHYSICAL DISK MAPPING
1558 QTRAN:  0       ;INDEX BY LOG DSK #
1559         1       ;4.9 => USE HIGH HALF OF DRIVE, RH = PHYS DRIVE #
1560         2       ;(NO LONGER DOES ANYTHING, NOW THAT MEMOWRECKS ARE GONE,
1561         3       ; BUT KEEP AROUND JUST IN CASE EVER NEEDED AGAIN.)
1562         4
1563         5
1564         6
1565         7
1566 IFL .-QTRAN-NDSK,.ERR QTRAN LOSES!!
1567 ];SC
1568
1569 ERRCT:  0               ;ERROR COUNTER
1570 DDTM2:  0               ;DDT SYMBOL TABLE POINTER
1571 DUMP9J: 0               ;START INSTRUCTION (AT DUMP9)
1572 DUMP9S: 0               ;SYMBOL TABLE POINTER (AT DUMP9)
1573 DUMP9K: 0               ;INITIAL SYMBOL TABLE PNTR (AT DUMP9)
1574 LBLOCK: 0               ;LAST BLOCK WRITTEN OR READ
1575 BLKCNT: 0               ;NUMBER OF BLOCKS READ OR WRITTEN CONSECUTIVELY
1576 DIRPT:  0               ;DESCRIPTOR AREA BYTE POINTER
1577 TUTPT:  0               ;TUT BYTE POINTER
1578 FN1:    0               ;FILE NAME 1
1579 FN2:    0               ;FILE NAME 2
1580 PKNUM:  REPEAT NDSK,-1  ;PACK NUMBER INDEXED BY DRIVE NUMBER
1581 QDED:   BLOCK NDSK      ;-1 IF DRIVE NOT TO BE USED
1582 XWDS:   BLOCK 4
1583 RPKID:  0
1584 BOOTNS: RP, CONSZ DPC,BUSY
1585         SC, CONSZ DC0,DSSACT
1586         RH, CONSZ DSK,%HIBSY
1587         PH, IORD B,SWPCS1       ; UGH!
1588
1589         CONSTANTS
1590
1591 IFL BEG+1677-., .ERR BLOAT
1592 INFORM SPACE LEFT,\BEG+1677-.
1593 BLOCK BEG+1677-.
1594
1595 BADBLK: 0               ;BLOCK WITH HDWE ERROR
1596 INFORM BADBLK,\.-1-BEG+<MEMSIZ-2000>
1597 \f
1598 ];END IFE BOOTSW
1599 IFN BOOTSW,[
1600 BEG=MEMSIZ-2000
1601 LOC MEMSIZ-100
1602 ]
1603
1604 CBOOT:  CLEARM MEMSIZ-1         ;BOOTSTRAP
1605 RP,[
1606 BOOT:
1607 IFE BOOTSW,     JRST BEG        ;OR CONSZ DPC,BUSY OR JRST LOADG1
1608 IFN BOOTSW,     CONSZ DPC,BUSY
1609          JRST .-1
1610         MOVEI B,ICWA+2          ;SET UP CHANNEL PROG
1611         MOVEM B,ICWA
1612         SETZM ICWA+1
1613         SETZM ICWA+3
1614         DATAO DPC,CLATT1
1615         DATAO DPC,SUNIT0
1616         DATAI DPC,B
1617 BOOT0:  TRNN B,RP03BT
1618          JRST BOOT1
1619         MOVEI B,MBLKS           ;UNIT 0 IS AN RP03, ADJUST WORLD
1620         HRRM B,CBLK
1621         MOVE B,RP3ADJ
1622         MOVSI A,-NSWBL
1623         XORM B,SWPSK(A)
1624         AOBJN A,.-1
1625 BOOT1:  HLLZS BOOT0             ;PREVENT TRNN FROM SKIPPING AGAIN
1626         MOVE B,ERRWD
1627         MOVEM B,@ICWA
1628         DATAO DPC,SWPSK
1629         JSP P,SKWAIT
1630         DATAO DPC,SWPIN1
1631         CONSO DPC,DONE
1632          JRST .-1
1633         DATAO DPC,SWPIN2
1634         CONSO DPC,DONE
1635          JRST .-1
1636         JRST BEG
1637
1638 ERRWD:  -1700,,BEG-1
1639 CLATT1: DEASEC ALLATT
1640 SWPSK:  DSEEKC+200._22.
1641 SWPIN1: DWRITC+200._22.+3_17.+2._12.+ICWA       ;NBLKS 4
1642 SWPIN2: DREADC+200._22.+4_17.+8._12.+ICWA
1643 SWPOU1: DWRITC+200._22.+4_17.+8._12.+ICWA
1644 SWPOU2: DREADC+200._22.+3_17.+2_12.+ICWA
1645 IFN NSWBL-5, .ERR THE PRECEDING 4 CONSTANTS ARE WRONG!
1646 CBLK:   -NSWBL,,NBLKS                   ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
1647 RP3ADJ: <<MCYLS#NCYLS>&377>_22.+<.BM DCYLXB>
1648 SUNIT0: DNOOPC
1649
1650 SKWAIT: DATAI DPC,A             ;AWAIT SEEK DONE UNIT 0
1651         TRNN A,ALLATT
1652          JRST SKWAIT
1653         DATAO DPC,CLATT1
1654         MOVEI A,30.
1655         SOJG A,.
1656         DATAI DPC,A
1657         TLNN A,(ONCYL)
1658          JRST SKWAIT
1659         JRST (P)
1660
1661 WAIT:   CONSO DPC,DONE
1662          JRST .-1
1663 ];RP
1664 \f
1665 PH,[    ;; Initially we could not use IORDQ or IOWRQ because they were
1666         ;; macros that used a literal.  There is nothing to stop us now,
1667         ;; except the fact that this code works fine and is as small as you
1668         ;; could possibly want.
1669
1670 BOOT:
1671 IFE BOOTSW, JRST BEG            ; or IORD B,SWPCS1 or JRST LOADG1
1672 IFN BOOTSW, IORD B,SWPCS1
1673         TRNN B,%HXRDY
1674          JRST BOOT
1675 KS,     WREBR 0                 ; No paging or caching
1676         MOVEI A,0
1677         IOWR A,SWPCS2           ; Select drive
1678 BOOT0:  IORD A,SWPCS1
1679         TRNN A,%HXDVA
1680          JRST BOOT0             ; Await drive available
1681         MOVSI B,-LSWPADR
1682 BOOT1:  HLRZ A,SWPVAL(B)
1683         IOWR A,SWPADR(B)
1684 BOOT2:  IORD A,SWPCS1
1685         TRNN A,%HXRDY           ; Wait for controller
1686          JRST BOOT2
1687         TRNE A,%HXTRE+%HXMCP    ; Lossage?
1688          JRST 4,.               ; Foo!
1689         AOBJN B,BOOT1
1690         JRST BEG
1691
1692 ZZ1==<NSWBL-1>*SECBLK   ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
1693 ZZ2==<NSWBL>*SECBLK     ;DSKDMP RESIDENCE BLOCK
1694 ZZ3==ZZ1/NSECS
1695 ZZ4==ZZ2/NSECS
1696 ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3>    ;CONVERT ADDR TO DISK FORMAT
1697 ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
1698
1699 SWPADR: UBAQ,,UBAPAG+UBPG_1     ; Set up Unibus map
1700         UBAQ,,UBAPAG+UBPG_1+1
1701         UBAQ,,%HRCS2            ; Clear controller
1702 SWPCS2: UBAQ,,%HRCS2            ; Select drive
1703 SWPCS1: UBAQ,,%HRCS1            ; Initialize
1704         UBAQ,,%HRCYL            ; Desire cylinder
1705         UBAQ,,%HRWC             ; Set (half) word count
1706         UBAQ,,%HRBA             ; Set Unibus address
1707         UBAQ,,%HRADR            ; Desire track and sector
1708         UBAQ,,%HRCS1            ; Write
1709         UBAQ,,%HRWC             ; Reset (half) word count
1710         UBAQ,,%HRBA             ; Reset Unibus address
1711         UBAQ,,%HRADR            ; Desire track and sector
1712         UBAQ,,%HRCS1            ; Read
1713 LSWPADR==:.-SWPADR
1714
1715 IFN BEG&1777, .ERR BEG does not lie on a page boundary?
1716
1717 ;;; LH FOR SWAP IN, RH FOR SWAP OUT
1718 SWPVAL: %UQVAL+%UQFST+BEG_-9,,%UQVAL+%UQFST+BEG_-9      ; Set up Unibus map
1719         %UQVAL+%UQFST+BEG_-9+1,,%UQVAL+%UQFST+BEG_-9+1
1720         %HYCLR,,%HYCLR          ; Clear controller
1721         0,,0                    ; Select drive
1722         %HMRDP,,%HMRDP          ; Initialize
1723         NCYLS,,NCYLS            ; Desire cylinder
1724         -1700*2,,-1700*2        ; Set (half) word count
1725         UBPG_14,,UBPG_14        ; Set Unibus address
1726         ZZ1,,ZZ2                ; Desire track and sector
1727         %HMWRT,,%HMWRT          ; Write
1728         -1700*2,,-1700*2        ; Reset (half) word count
1729         UBPG_14,,UBPG_14        ; Reset Unibus address
1730         ZZ2,,ZZ1                ; Desire track and sector
1731         %HMRED,,%HMRED          ; Read
1732 IFN .-SWPVAL-LSWPADR, .ERR SWPVAL wrong length.
1733
1734 CBLK:   -NSWBL,,NBLKS
1735
1736 WAIT:   IORD B,SWPCS1
1737         TRNN B,%HXRDY
1738          JRST WAIT
1739 ];PH
1740 \f
1741 RH,[
1742 BOOT:
1743 IFE BOOTSW,     JRST BEG        ;OR CONSZ DSK,%HIBSY OR JRST LOADG1
1744 IFN BOOTSW,     CONSZ DSK,%HIBSY
1745          JRST .-1
1746 KL,     CONSZ PAG,660000        ;PAGING AND CACHE MUST BE DISABLED
1747 KL,      JRST 4,.
1748         MOVEI B,ICWA+2          ;SET UP CHANNEL PROG
1749         MOVEM B,ICWA
1750         SETZM ICWA+1
1751         SETZM ICWA+3
1752 BOOT0:  DATAO DSK,[%HRDCL,,]
1753         MOVEI A,20
1754         SOJG A,.
1755         DATAI DSK,A
1756         TRNN A,%HCDVA
1757          JRST BOOT0             ;AWAIT DRIVE AVAILABLE
1758         MOVE B,ERRWD
1759         CONI DSK,A
1760         TLNE A,(%HID22)
1761          HRLI B,-1700_4
1762         MOVEM B,@ICWA
1763         MOVSI B,-6
1764 BOOT1:  DATAO DSK,SWPIN1(B)
1765         MOVEI A,20
1766         SOJG A,.
1767         CONSZ DSK,%HIBSY
1768          JRST .-1
1769         AOBJN B,BOOT1
1770         CONSZ DSK,%HIERR
1771          JRST 4,.
1772         JRST BEG
1773
1774 ZZ1==<NSWBL-1>*SECBLK   ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
1775 ZZ2==<NSWBL>*SECBLK     ;DSKDMP RESIDENCE BLOCK
1776 ZZ3==ZZ1/NSECS
1777 ZZ4==ZZ2/NSECS
1778 ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3>    ;CONVERT ADDR TO DISK FORMAT
1779 ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
1780
1781 ERRWD:  -1700,,BEG-1
1782 SWPIN1: %HRLOD+%HRDCL,,%HMRDP
1783 SWPIN2: %HRLOD+%HRCYL,,NCYLS+1  ;AVOID CYLINDER 406 WHICH KLDCP USES
1784 SWPIN3: %HRLOD+%HRADR,,ZZ1
1785 SWPIN4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
1786 SWPIN5: %HRLOD+%HRADR,,ZZ2
1787 SWPIN6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
1788
1789 SWPOU1: %HRLOD+%HRDCL,,%HMRDP
1790 SWPOU2: %HRLOD+%HRCYL,,NCYLS+1  ;AVOID CYLINDER 406 WHICH KLDCP USES
1791 SWPOU3: %HRLOD+%HRADR,,ZZ2
1792 SWPOU4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
1793 SWPOU5: %HRLOD+%HRADR,,ZZ1
1794 SWPOU6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
1795
1796 CBLK:   -NSWBL,,NBLKS+NBLKSC    ;AVOID CYLINDER 406 WHICH KLDCP USES
1797
1798 WAIT:   CONSO DSK,%HIDON
1799          JRST .-1
1800 ];RH
1801 \f
1802 SC,[
1803 BOOT:
1804 IFE BOOTSW,     JRST BEG        ;OR CONSZ DC0,DSSACT OR JRST LOADG1
1805 IFN BOOTSW,     CONSZ DC0,DSSACT
1806          JRST .-1
1807         DATAO DC0,SWPINJ
1808         CONSZ DC0,DSSACT
1809          JRST .-1
1810         JRST BEG
1811
1812 SWPINJ: DJMP SWPIN
1813
1814 DADR==NCYLS_13+<<NSWBL-1>/2>_6+<<NSWBL-1>&1>    ;ADDR OF LAST BLOCK IN CORE BUFFER
1815 DADR1==NCYLS_13+<NSWBL/2>_6+<NSWBL&1>           ;ADDR OF NEXT BLOCK (CONTAINS
1816 SWPIN:  DWRITE+DUNENB+DADR                      ; WORKING COPY OF DSKDMP)
1817         DCOPY BEG(-2000_2&37774)
1818         DCSKIP (-4_2&37774)
1819         DRC+DADR
1820         DCOPY BEG(-2000_2&37774)
1821         DCSKIP (-4_2&37774)
1822         DREAD+DADR1
1823         DCOPY BEG(-1700_2&37774)
1824         DCSKIP (-104_2&37774)
1825         DRC+DADR1
1826         DCOPY BEG(-1700_2&37774)
1827         DCSKIP (-104_2&37774)
1828         DHLT
1829
1830 SWPOUT: DWRITE+DUNENB+DADR1
1831         DCOPY BEG(-2000_2&37774)
1832         DCSKIP (-4_2&37774)
1833         DRC+DADR1
1834         DCOPY BEG(-2000_2&37774)
1835         DCSKIP (-4_2&37774)
1836         DREAD+DADR
1837         DCOPY BEG(-1700_2&37774)
1838         DCSKIP (-104_2&37774)
1839         DRC+DADR
1840         DCOPY BEG(-1700_2&37774)
1841         DCSKIP (-104_2&37774)
1842         DHLT
1843
1844 CBLK:   -NSWBL,,NBLKS           ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
1845 WAIT:   CONSZ DC0,DSSACT
1846          JRST .-1
1847 ];SC
1848 SADR:   JRST BOOT               ;AND GO TO PROGRAM TO BE STARTED
1849 SYSN:   SIXBIT /./              ;CURRENT DIRECTORY
1850 IFG .+1-MEMSIZ,.ERR BOOT BLOAT
1851
1852 IFE BOOTSW,{                    ;CURLY BRACKETS TO AVOID ERROR MESSAGE
1853         OFFSET 0
1854         LOC CORE
1855
1856 ;THESE ARE THE BLOCKS THAT GET WRITTEN ON DISK
1857 ; STARTING AT THE BEGINNING OF THE FIRST EXTRA CYLINDER
1858
1859 CBUF:   BLOCK 2000              ;PSEUDO-CORE BUFFER
1860 DBUF:   BLOCK 2000              ;DISK BUFFER
1861 DIR:    BLOCK 2000              ;DIRECTORY BUFFER
1862 TUT:    BLOCK 2000*NTUTBL       ;TUT BUFFER
1863 IFN .-BEG,.ERR BLOCKS LOST
1864 ;       BLOCK 2000              ;CORE OVERLAYED BY DSKDMP
1865 ;       BLOCK 2000              ;COPY OF DSKDMP
1866 ;       BLOCK 2000              ;SPARE COPY OF DSKDMP
1867
1868 END ZZZ
1869 };END IFE BOOTSW
1870 IFN BOOTSW, END CBOOT