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