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