Split up files.
[pdp10-muddle.git] / sumex / save.mcr083
1 TITLE SAVE AND RESTORE STATE OF A MUDDLE\r
2 \r
3 RELOCATABLE\r
4 \r
5 .INSRT DSK:MUDDLE >\r
6 \r
7 SYSQ\r
8 \r
9 IFE ITS,[\r
10 IF1,[\r
11 .INSRT STENEX >\r
12 EXPUNGE SAVE\r
13 ]\r
14 ]\r
15 \r
16 .GLOBAL MOPEN,MIOT,MCLOSE,MUDSTR,SWAP,STRTO6,GCPDL,RGPRS\r
17 .GLOBAL CHNL0,CHNL1,REOPN,AGC,SWAPIN,MASK1,MASK2,IPCBLS\r
18 .GLOBAL P.CORE,P.TOP,SGSNAM,%RUNAM,%RJNAM,INTINT,CLOSAL,TTYOPE\r
19 .GLOBAL NOTTY,PURCLN,6TOCHS,DISXTR,IDVAL1,N.CHNS\r
20 \r
21 MFUNCTION FSAVE,SUBR\r
22 \r
23         ENTRY\r
24 \r
25         PUSH    P,.             ; SAY WE ARE FAST SAVER\r
26         JRST    SAVE1\r
27 \r
28 MFUNCTION SAVE,SUBR\r
29 \r
30         ENTRY\r
31 \r
32         PUSH    P,[0]           ; SAY WE ARE OLD SLOW SAVE\r
33 SAVE1:  SKIPG   MUDSTR+2        ; DON'T SAVE FROM EXPERIMENTAL MUDDLE\r
34         JRST    EXPVRS\r
35         PUSH    P,[0]           ; GC OR NOT?\r
36 IFE ITS,[\r
37         MOVE    B,[400600,,]\r
38         MOVE    C,[440000,,100000]\r
39 ]\r
40         PUSHJ   P,GTFNM         ; GET THE FILE NAME ONTO P\r
41         JRST    .+2\r
42         JRST    SAVEON\r
43         JUMPGE  AB,TMA          ; TOO MUCH STRING\r
44         GETYP   0,(AB)          ; WHAT IS ARG\r
45         CAMGE   AB,[-3,,0]      ; NOT TOO MANY\r
46         JRST    TMA\r
47         CAIN    0,TFALSE\r
48 IFN ITS,        SETOM   -4(P)           ; GC FLAG\r
49 IFE ITS,        SETOM   (P)\r
50 SAVEON:\r
51 IFN ITS,[\r
52         MOVSI   A,7             ; IMAGE BLOCK OUT\r
53         HRR     A,-2(P)         ; DEVICE\r
54         PUSH    P,A\r
55         PUSH    P,[SIXBIT /_MUDS_/]\r
56         PUSH    P,[SIXBIT />/]\r
57         MOVEI   A,-2(P)         ; POINT TO BLOCK\r
58         PUSHJ   P,MOPEN         ; ATTEMPT TO OPEN\r
59         JRST    CANTOP\r
60         SUB     P,[3,,3]        ; FLUSH OPEN BLOCK\r
61         PUSH    P,-4(P)         ; GC FLAG TO TOP OF STACK\r
62 ]\r
63         EXCH    A,(P)           ; CHAN TO STACK GC TO A\r
64         JUMPL   A,.+2\r
65         MCALL   0,GC\r
66 \r
67 ; NOW GET VERSION OF MUDDLE FOR COMPARISON\r
68 \r
69         MOVE    A,MUDSTR+2      ; GET #\r
70         MOVEI   B,177           ; CHANGE ALL RUBOUT CHARACTERS\r
71         MOVEI   C,40            ; ----- TO SPACES\r
72         PUSHJ   P,HACKV\r
73 \r
74         PUSHJ   P,WRDOUT\r
75         MOVEI   A,0             ; WRITE ZERO IF FAST\r
76 IFN ITS,        SKIPE   -6(P)\r
77 IFE ITS,        SKIPE   -1(P)\r
78         PUSHJ   P,WRDOUT\r
79         MOVE    A,VECTOP        ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE\r
80         PUSHJ   P,WRDOUT\r
81 \r
82 IFN ITS,[\r
83         SETZB   A,B             ; FIRST, ALL INTS OFF\r
84         .SETM2  A,\r
85         SKIPE   DISXTR          ; IF HAVE DISPLAY, CLOSE IT\r
86         .DSTOP                  ; STOP THE E&S IF RUNNING\r
87 \r
88 ; IF FAST SAVE JUMP OFF HERE\r
89 \r
90         SKIPE   -6(P)\r
91         JRST    FSAVE1\r
92 \r
93 ; NOW DUMP OUT GC SPACE\r
94         MOVEI   A,E+1           ; ADDRESS OF FIRST NON-SCRATCH WORD\r
95         POP     P,0             ; CHAN TO 0\r
96         LSH     0,23.           ; POSITION\r
97         IOR     0,[.IOT A]\r
98 ]\r
99 \r
100 IFE ITS,[\r
101         MOVEI   A,400000        ; FOR THIS PROCESS\r
102         DIR                     ; TURN OFF INT SYSTEM\r
103 \r
104 ; IF FAST, LEAVE HERE\r
105 \r
106         SKIPE   -1(P)\r
107         JRST    FSAVE1\r
108 \r
109 ; NOW DUMP OUT GC SPACE\r
110         POP     P,0             ; RESTORE JFN\r
111         MOVE    A,[-<P-E>,,E]   ; NUMBER OF ACS TO GO\r
112         PUSH    P,(A)\r
113         AOBJN   A,.-1\r
114         MOVE    A,0\r
115         MOVE    B,P\r
116         BOUT\r
117         MOVEI   A,20            ; START AT LOCN 20\r
118 ]\r
119 DMPLP1: MOVEI   B,(A)           ; POINT TO START OF STUFF\r
120         SUB     B,VECTOP        ; GET BLOCK LENGTH\r
121         MOVSI   B,(B)\r
122         HRRI    B,(A)           ; HAVE IOT POINTER\r
123         SKIPL   B               ; SKIP IF OK AOBJN POINTER\r
124         HRLI    B,400000        ; OTHER WISE AS MUCH AS POSSIBLE\r
125 \r
126 ; MAIN NON-ZERO DUMPING LOOP\r
127 \r
128 DMPLP:  SKIPN   C,(B)           ; FIND FIRST NON-ZERO\r
129         AOBJN   B,.-1\r
130         JUMPGE  B,DMPDON        ; NO MORE TO SCAN\r
131 \r
132 DMP4:   MOVEI   E,(B)           ; FOUND ONE, SAVE POINTER TO IT\r
133 DMP3:   MOVSI   D,-5            ; DUPLICATE COUNTER SETUP\r
134 \r
135 DMP1:   CAMN    C,(B)           ; IS NEXT SAME AS THIS?\r
136         JRST    CNTDUP          ; COUNT DUPS\r
137         MOVSI   D,-5            ; RESET COUNTER\r
138         SKIPE   C,(B)           ; SEARCH FOR ZERO\r
139 DMP5:   AOBJN   B,DMP1          ; COUNT AND GO\r
140         JUMPGE  B,DMP2          ; JUMP IF BLOCK FINISHED\r
141 \r
142         AOBJP   B,DMP2          ; CHECK FOR LONE ZERO\r
143         SKIPE   C,(B)\r
144         JRST    DMP1            ; LONE ZERO, DONT END BLOCK\r
145 \r
146 DMP2:   MOVEI   D,(E)           ; START COMPUTING OUTPUT IOT\r
147         SUBI    D,(B)           ; D=> -LNTH OF BLOCK\r
148         HRLI    E,(D)           ; E=> AOBJN PNTR TO OUTPUT\r
149 IFN ITS,[\r
150         HRROI   A,E             ; MAKE AN IOT POINTER TO IT\r
151         XCT     0               ; WRITE IT\r
152         MOVE    A,E             ; NOW FOR THE BLOCK\r
153         XCT     0               ; ZAP!, OUT IT GOES\r
154 ]\r
155 IFE ITS,[\r
156         EXCH    E,B             ; AOBJN TO B\r
157         MOVE    A,0             ; JFN TO A\r
158         BOUT                    ; WRITE IT\r
159         MOVE    D,B             ; SAVE POINTER\r
160         HRLI    B,444400        ; BYTPE POINTER\r
161         HLRE    C,D             ; # OF BYTES\r
162         SOUT\r
163 ]\r
164 ; NOW COMPUTE A CKS\r
165 \r
166 IFN ITS,[\r
167         MOVE    D,E             ; FIRST WORD OF CKS\r
168         ROT     E,1\r
169         ADD     E,(D)\r
170         AOBJN   D,.-2           ; COMP CKS\r
171         HRROI   A,E\r
172         XCT     0               ; WRITE OUT THE CKS\r
173 ]\r
174 IFE ITS,[\r
175         MOVE    B,D\r
176         ROT     B,1\r
177         ADD     B,(D)\r
178         AOBJN   D,.-2\r
179         BOUT\r
180         MOVE    B,E             ; MAIN POINTER BACK\r
181 ]\r
182 \r
183 DMP7:   JUMPL   B,DMPLP         ; MORE TO  DO?\r
184 DMPDON: SUB     B,VECTOP        ; DONE?\r
185         JUMPGE  B,DMPDN1        ; YES, LEAVE\r
186 IFN ITS,        MOVEI   A,400000+PVP    ; POINT TO NEXT WORD TO GO\r
187 IFE ITS,        MOVEI   A,400020\r
188         JRST    DMPLP1\r
189 IFN ITS,[\r
190 DMPDN1: HRROI   A,[-1]\r
191         XCT     0               ; EOF\r
192 DMPDN2: SETZB   A,B             ; SET UP RENAME WHILE OPEN ETC.\r
193         MOVE    E,(P)\r
194         MOVE    D,-1(P)\r
195         LDB     C,[270400,,0]   ; GET CHANNEL\r
196         .FDELE  A               ; RENAME IT\r
197         FATAL SAVE RENAME FAILED\r
198         XOR     0,[<.IOT A>#<.CLOSE>]   ; CHANGE TO A CLOSE\r
199         XCT     0\r
200 \r
201         MOVE    A,MASK1         ; TURN INTS BACK ON\r
202         MOVE    B,MASK2\r
203         .SETM2  A,\r
204         SKIPE   DISXTR          ; SKIP IF NO E&S\r
205         .DCONTINUE              ; RESTART THE E&S IF WE HAVE IT\r
206 ]\r
207 \r
208 IFE ITS,[\r
209 DMPDN1: MOVNI   B,1\r
210         MOVE    A,0             ; WRITE EOF\r
211         BOUT\r
212 DMPDN2: MOVE    A,0\r
213         CLOSF\r
214         FATAL CANT CLOSE SAVE FILE\r
215         CIS                     ; CLEAR IT SYSTEM\r
216         MOVEI   A,400000\r
217         EIR                     ; AND RE-ENABLE\r
218 ]\r
219 \r
220 SDONE:  MOVE    A,$TCHSTR\r
221         MOVE    B,CHQUOTE SAVED\r
222         JRST    FINIS\r
223 \r
224 ; SCAN FOR MANY OCCURENCES OF THE SAME THING\r
225 \r
226 CNTDUP: AOBJN   D,DMP5          ; 4 IN A ROW YET\r
227         CAIN    E,-4(B)         ; ANY PARTIAL BLOCK?\r
228         JRST    DMP6            ; NO, DUMP THESE\r
229         SUB     B,[4,,4]        ; BACK UP POINTER\r
230         JRST    DMP2\r
231 DMP6:   CAMN    C,(B)           ; FIND ALL CONTIG\r
232         AOBJN   B,.-1\r
233         MOVEI   D,(B)           ; COMPUTE COUNT\r
234         SUBI    D,(E)\r
235         MOVSI   D,(D)\r
236         HRRI    D,(E)           ; HEADER\r
237 IFN ITS,[\r
238         HRROI   A,D\r
239         XCT     0\r
240         HRROI   A,C             ; WRITE THE WORD\r
241         XCT     0\r
242 ]\r
243 IFE ITS,[\r
244         MOVE    A,0\r
245         EXCH    D,B\r
246         BOUT\r
247         MOVE    B,C\r
248         BOUT\r
249         MOVE    B,D\r
250 ]       JRST    DMP7\r
251 \r
252 ; HERE TO WRITE OUT FAST SAVE FILE\r
253 \r
254 FSAVE1: MOVE    A,PARTOP        ; DONT WRITE OUT "HOLE"\r
255         ADDI    A,1777\r
256         ANDCMI  A,1777\r
257         MOVEI   E,(A)\r
258         PUSHJ   P,WRDOUT\r
259         MOVE    A,VECBOT\r
260         ANDCMI  A,1777\r
261         HRLI    E,(A)\r
262         PUSHJ   P,WRDOUT\r
263         POP     P,0             ; CHANNEL TO 0\r
264 IFN ITS,[\r
265         ASH     0,23.           ; TO AC FIELS\r
266         IOR     0,[.IOT A]\r
267         MOVEI   A,5             ; START AT WORD 5\r
268 ]\r
269 IFE ITS,[\r
270         MOVE    A,[-<P-E>,,E]\r
271         PUSH    P,(A)\r
272         AOBJN   A,.-1\r
273         MOVE    A,0\r
274         MOVE    B,P             ; WRITE OUT P FOR WIINAGE\r
275         BOUT\r
276         MOVE    B,[444400,,20]\r
277         MOVNI   C,20-6\r
278         SOUT                    ; MAKE PAGE BOUNDARIES WIN\r
279         MOVEI   A,20            ; START AT 20\r
280 ]\r
281         MOVEI   B,(E)           ; PARTOP TO B\r
282         PUSHJ   P,FOUT          ; WRITE OUT UP TO PAIR TOP\r
283         HLRZ    A,E             ; VECBOT TO A\r
284         MOVE    B,VECTOP        ; AND THE REST\r
285         PUSHJ   P,FOUT\r
286         JRST    DMPDN2\r
287 \r
288 IFN ITS,[\r
289 FOUT:   MOVEI   D,(A)           ; SAVE START\r
290         SUB     A,B             ; COMPUTE LH OF IOT PNTR\r
291         MOVSI   A,(A)\r
292         SKIPL   A               ; IF + MEANS GROSS CORE SIZE\r
293         MOVSI   A,400000        ; USE BIGGEST\r
294         HRRI    A,(D)\r
295         XCT     0               ; ZAP, OUT IT GOES\r
296         CAMGE   A,B             ; SKIP IF ALL WENT\r
297         JRST    FOUT            ; DO THE REST\r
298         POPJ    P,              ; GO CLOSE FILE\r
299 ]\r
300 IFE ITS,[\r
301 FOUT:   MOVEI   C,(A)\r
302         SUBI    C,(B)           ; # OF BYTES TP C\r
303         MOVEI   B,(A)           ; START TO B\r
304         HRLI    B,444400\r
305         MOVE    A,0\r
306         SOUT                    ; WRITE IT OUT\r
307         POPJ    P,\r
308 ]\r
309         \r
310 \r
311 ; HERE TO ATTEMPT TO RESTORE A SAVED STATE\r
312 \r
313 MFUNCTION RESTORE,SUBR\r
314 \r
315         ENTRY\r
316         SKIPG   MUDSTR+2        ; DON'T RESTORE FROM EXPERIMENTAL MUDDLE\r
317         JRST EXPVRS\r
318 IFE ITS,[\r
319         MOVE    B,[100600,,]\r
320         MOVE    C,[440000,,240000]\r
321 ]\r
322         PUSHJ   P,GTFNM\r
323         JRST    TMA\r
324 IFN ITS,[\r
325         MOVEI   A,6             ; READ/IMAGE/BLOCK\r
326         HRLM    A,-2(P)\r
327         MOVEI   A,-2(P)\r
328         PUSHJ   P,MOPEN         ; OPEN THE LOSER\r
329         JRST    FNF\r
330         SUB     P,[4,,4]        ; REMOVE OPEN BLOCK\r
331 \r
332         PUSH    P,A             ; SAVE CHANNEL\r
333         PUSHJ   P,SGSNAM        ; SAVE SNAME IN SYSTEM\r
334 ]\r
335 IFE ITS,        PUSH    P,A             ; SAVE JFN\r
336         PUSHJ   P,WRDIN         ; READ MUDDLE VERSION\r
337         MOVEI   B,40            ; CHANGE ALL SPACES\r
338         MOVEI   C,177           ; ----- TO RUBOUT CHARACTERS\r
339         PUSHJ   P,HACKV\r
340         CAME    A,MUDSTR+2      ; AGREE ?\r
341         JRST    BADVRS\r
342 \r
343 IFN ITS,        MCALL   0,IPCOFF        ; CLOSE ALL IPC CHANS\r
344         PUSHJ   P,CLOSAL        ; CLOSE CHANNELS\r
345 IFN ITS,[\r
346         SETZB   A,B             ; KILL ALL POSSIBLE INTERRUPTION\r
347         .SETM2  A,\r
348 ]\r
349 IFE ITS,[\r
350         MOVEI   A,400000        ; DISABLE INTS\r
351         DIR                     ; INTS OFF\r
352 ]\r
353         PUSHJ   P,PURCLN        ; DONT KEEP PURE SHAREDNESS\r
354         POP     P,A             ; RETRIEVE CHANNEL\r
355         MOVE    P,GCPDL\r
356         PUSH    P,A             ; AND SAVE IT ON A GOOD PDL\r
357         PUSHJ   P,WRDIN         ; READ A WORD (VECTOP) OR 0==>FAST I.E. MAP RESTORE\r
358         JUMPE   A,FASTR\r
359         MOVEM   A,VECTOP        ; SAVE FOR LATER\r
360         ASH     A,-10.          ; TO BLOCKS\r
361         MOVE    C,A             ; SAVE A COPY\r
362         ADDI    A,1             ; ROOM FOR GC PDL\r
363         PUSHJ   P,P.CORE\r
364         PUSHJ   P,NOCORE        ; LOSE,LOSE, LOSE\r
365 \r
366 ; NOW READY TO READ IN GC SPACE\r
367         POP     P,0             ; GET CHAN\r
368         MOVEI   E+1,0\r
369         MOVE    B,[E+1,,E+2]    ; BLT SETUP TO ZERO CORE\r
370         MOVE    E,NOTTY\r
371         MOVE    A,VECTOP\r
372         BLT     B,-1+2000(A)    ; THE WHOLE THING?\r
373 IFN ITS,[\r
374         LSH     0,23.\r
375         IOR     0,[.IOT A]      ; BUILD IOT\r
376 ]\r
377 IFE ITS,[\r
378         MOVE    A,0\r
379         BIN                     ; READ IN NEW "P"\r
380         MOVE    P,B\r
381 ]\r
382 LDLP:\r
383 IFN ITS,[\r
384         HRROI   A,B             ; READ A HDR\r
385         XCT     0\r
386         JUMPL   A,LD1           ; DONE\r
387 ]\r
388 IFE ITS,[\r
389         MOVE    A,0\r
390         BIN                     ; HDR TO B\r
391 ]\r
392         CAMN    B,[-1]\r
393         JRST    LD1\r
394 \r
395         JUMPGE  B,LDDUPS        ; JUMP IF LOADING DUPS\r
396 IFN ITS,[\r
397         MOVE    A,B             ; TO IOTER\r
398         XCT     0\r
399 \r
400         MOVE    C,B             ; COMP CKS\r
401         ROT     C,1\r
402         ADD     C,(B)\r
403         AOBJN   B,.-2           ; COMP AWAY\r
404 \r
405         HRROI   A,D             ; GET FILES CKS\r
406         XCT     0\r
407         CAME    D,C             ; CHECK\r
408         FATAL RESTORE CHECKSUM ERROR\r
409         JRST    LDLP            ; LOAD MORE\r
410 ]\r
411 IFE ITS,[\r
412         MOVE    D,B             ; SAVE\r
413         HLRE    C,B\r
414         HRLI    B,444400\r
415         MOVE    A,0\r
416         SIN                     ; READ IN A BUNCH\r
417 \r
418         MOVE    B,D\r
419         ROT     D,1\r
420         ADD     D,(B)\r
421         AOBJN   B,.-2\r
422 \r
423         BIN                     ; READ STORED CKS\r
424         CAME    D,B\r
425         FATAL RESTORE CHECKSUM ERROR\r
426         JRST    LDLP\r
427 ]\r
428 \r
429 LDDUPS:\r
430 IFN ITS,[\r
431         HRROI   A,(B)           ; READ 1ST IN PLACE\r
432         XCT     0\r
433 ]\r
434 IFE ITS,[\r
435         MOVE    D,B             ; SAVE HDR\r
436         BIN                     ; READ WORD OF INTEREST\r
437         MOVEM   B,(D)\r
438         MOVE    B,D\r
439 ]\r
440         HLRZ    A,B             ; # TO A\r
441         HRLI    B,(B)           ; BUILD A BLT PONTER\r
442         ADDI    B,1\r
443         ADDI    A,-2(B)\r
444         BLT     B,(A)\r
445         JRST    LDLP\r
446 \r
447 LD1:\r
448 IFN ITS,[\r
449         XOR     0,[<.IOT A>#<.CLOSE>]   ; CHANGE TO CLOSE\r
450         XCT     0               ; AND DO IT\r
451 ]\r
452 IFE ITS,[\r
453         MOVE    A,0\r
454         CLOSF\r
455         JFCL\r
456 FASTR1: MOVEI   A,P-1\r
457         MOVEI   B,P-1-E\r
458         POP     P,(A)\r
459         SUBI    A,1\r
460         SOJG    B,.-2\r
461 ]\r
462 \r
463 IFN ITS,[\r
464 FASTR1:\r
465 ]\r
466         MOVE    A,VECTOP        ; REAL CORE TOP\r
467         ADDI    A,2000          ; ROOM FOR GC PDL\r
468         MOVEM   A,P.TOP\r
469         MOVEM   E,NOTTY         ; SAVE TTY FLAG\r
470         PUSHJ   P,PURCLN        ; IN CASE RESTORED THING HAD PURE STUFF\r
471         PUSHJ   P,INTINT        ; USE NEW INTRRRUPTS\r
472 \r
473 ; NOW CYCLE THROUGH CHANNELS\r
474         MOVE    C,TVP\r
475         ADD     C,[CHNL1+2,,CHNL1+2]    ; POINT TO REAL CHANNELS SLOTS\r
476         PUSH    TP,$TVEC\r
477         PUSH    TP,C\r
478         PUSH    P,[N.CHNS]\r
479 \r
480 CHNLP:  SKIPN   B,-1(C)         ; GET CHANNEL\r
481         JRST    NXTCHN\r
482         PUSHJ   P,REOPN\r
483         PUSHJ   P,CHNLOS\r
484         MOVE    C,(TP)          ; GET POINTER\r
485 NXTCHN: ADD     C,[2,,2]        ; AND BUMP\r
486         MOVEM   C,(TP)\r
487         SOSE    (P)\r
488         JRST    CHNLP\r
489 \r
490         SKIPN   C,CHNL0(TVP)+1  ; ANY PSUEDO CHANNELS\r
491         JRST    RDONE           ; NO, JUST GO AWAY\r
492         MOVSI   A,TLIST         ; YES, REOPEN THEM\r
493         MOVEM   A,(TP)-1\r
494 CHNLP1: MOVEM   C,(TP)          ; SAVE POINTER\r
495         SKIPE   B,(C)+1         ; GET CHANNEL\r
496         PUSHJ   P,REOPN\r
497         PUSHJ   P,CHNLO1\r
498         MOVE    C,(TP)          ; GOBBLE POINTER\r
499         HRRZ    C,(C)           ; REST LIST OF PSUEDO CHANNELS\r
500         JUMPN   C,CHNLP1\r
501 \r
502 RDONE:  SUB     TP,[2,,2]\r
503         SUB     P,[1,,1]\r
504         PUSHJ   P,TTYOPE\r
505 IFN ITS,[\r
506         PUSHJ   P,IPCBLS        ;BLESS ALL THE IPC CHANNELS\r
507         PUSHJ   P,SGSNAM        ; GET SNAME\r
508         SKIPN   A\r
509         .SUSET  [.RSNAM,,A]\r
510         PUSHJ   P,6TOCHS        ; TO STRING\r
511         PUSH    TP,A\r
512         PUSH    TP,B\r
513         MCALL   1,SNAME\r
514 ]\r
515         PUSHJ   P,%RUNAM\r
516         PUSHJ   P,%RJNAM\r
517         MOVE    A,$TCHSTR\r
518         MOVE    B,CHQUOTE RESTORED\r
519         JRST    FINIS\r
520 \r
521 FASTR:\r
522 IFN ITS,[\r
523         PUSHJ   P,WRDIN         ; GET CORE TOP\r
524         ASH     A,-10.          ; TO PAGES\r
525         MOVEI   B,(A)           ; SAVE\r
526         ADDI    A,1             ; ROOM FOR GC PDL\r
527         PUSHJ   P,P.CORE        ; GET ALL CORE\r
528         PUSHJ   P,NOCORE        ; LOSE RETURN\r
529         PUSHJ   P,WRDIN         ; GET PARTOP\r
530         ASH     A,-10.          ; TO PAGES\r
531         MOVEI   E,(A)\r
532         PUSHJ   P,WRDIN         ; NOW GET VECBOT\r
533         ASH     A,-10.          ; TO PAGES\r
534         EXCH    A,E             ; AND SAVE IN E\r
535         MOVNS   A\r
536         MOVSI   A,(A)           ; TO PAGE AOBJN\r
537         MOVE    C,A             ; COPY OF POINTER\r
538         MOVE    0,NOTTY         ; SAVE NOTTY FLAG AROUND\r
539         MOVE    D,(P)           ; CHANNEL\r
540         DOTCAL  CORBLK,[[1000,,104000],[1000,,-1],A,D,C]\r
541         FATAL   CORBLK ON RESTORE LOSSAGE\r
542         SUBM    E,B             ; AOBJN LH TO E\r
543         HRLI    E,(B)           ; AOBJN TO CORE\r
544         HRLI    C,(B)           ; AND TO DISK\r
545         DOTCAL  CORBLK,[[1000,,104000],[1000,,-1],E,D,C]\r
546         FATAL   CORBLK ON RESTORE LOSSAGE\r
547         MOVSI   A,(D)           ; CHANNEL BACK\r
548         ASH     A,5\r
549         MOVEI   B,E             ; WHERE TO STRAT IN FILE\r
550         IOR     A,[.ACCESS B]\r
551         XCT     A               ; ACCESS TO RIGHT ACS\r
552         XOR     A,[<.IOT B>#<.ACCESS B>]\r
553         MOVE    B,[D-P-1,,E]\r
554         XCT     A               ; GET ACS\r
555         MOVE    E,0             ; NO TTY FLAG BACK\r
556         XOR     A,[<.IOT B>#<.CLOSE>]\r
557         XCT     A\r
558 ]\r
559 IFE ITS,[\r
560 FASTR:  POP     P,A             ; JFN TO A\r
561         BIN                     ; CORE TOP TO B\r
562         MOVE    E,B             ; SAVE\r
563         BIN                     ; PARTOP\r
564         MOVE    D,B\r
565         BIN                     ; VECBOT\r
566         MOVE    C,B\r
567         BIN                     ; SAVED P\r
568         MOVE    P,B\r
569         MOVE    0,NOTTY         ; SAVE NOTTY FLAG AROUND\r
570         HRL     E,C             ; SAVE VECTOP\r
571         MOVSI   A,(A)           ; JFN TO LH\r
572         MOVSI   B,400000        ; FOR ME\r
573         MOVSI   C,120400        ; FLAGS\r
574         ASH     D,-9.           ; PAGES TO D\r
575         PMAP\r
576         ADDI    A,1\r
577         ADDI    B,1\r
578         SOJG    D,.-3\r
579 \r
580         ASH     E,-9.           ; E==> CORTOP PAGE,,VECBOT PAGE\r
581         HLR     B,E             ; B NOW READY\r
582         MOVEI   D,(E)\r
583         SUBI    D,(B)\r
584         PMAP\r
585         ADDI    A,1\r
586         ADDI    B,1\r
587         SOJG    D,.-3\r
588 \r
589         HLRZS   A\r
590         CLOSF\r
591         FATAL CANT CLOSE RESTORE FILE\r
592         MOVE    E,0             ; NOTTY TO E\r
593 ]\r
594         MOVE    A,PARTOP        ; ZERO OUT NEW FREE\r
595         HRLI    A,(A)\r
596         MOVE    B,VECBOT\r
597         SETZM   (A)\r
598         ADDI    A,1\r
599         BLT     A,-1(B)         ; ZAP...YOU'RE ZERO\r
600         JRST    FASTR1\r
601 \r
602 \r
603 ; HERE TO GROCK FILE NAME FROM ARGS\r
604 \r
605 GTFNM:\r
606 IFN ITS,[\r
607         PUSH    TP,$TPDL\r
608         PUSH    TP,P\r
609 \r
610         IRP A,,[DSK,MUDDLE,SAVE]\r
611         PUSH    P,[SIXBIT /A/]\r
612         TERMIN\r
613         PUSHJ   P,SGSNAM        ; GET SNAME\r
614         PUSH    P,A             ; SAVE SNAME\r
615 \r
616         JUMPGE  AB,GTFNM1\r
617         PUSHJ   P,RGPRS         ; PARSE THESE ARGS\r
618         JRST    .+2\r
619 GTFNM1: AOS     -4(P)           ; SKIP RETURN\r
620 \r
621         POP     P,A             ; GET SNAME\r
622         .SUSET  [.SSNAM,,A]\r
623         MOVE    A,-3(P)         ; GET RET ADDR\r
624         HLRZS   -2(P)           ; FIXUP DEVICE SPEC\r
625         SUB     TP,[2,,2]\r
626         JRST    (A)\r
627 \r
628 ; HERE TOO OUT 1 WORD\r
629 \r
630 WRDOUT: PUSH    P,B\r
631         PUSH    P,A\r
632         HRROI   B,(P)           ; POINT AT C(A)\r
633         MOVE    A,-3(P)         ; CHANNEL\r
634         PUSHJ   P,MIOT           ;WRITE IT\r
635 POPJB:  POP     P,A\r
636         POP     P,B\r
637         POPJ    P,\r
638 \r
639 ; HERE TO READ 1 WORD\r
640 WRDIN==WRDOUT\r
641 ]\r
642 IFE ITS,[\r
643         PUSH    P,C\r
644         PUSH    P,B\r
645         MOVE    B,IMQUOTE SNM\r
646         PUSHJ   P,IDVAL1\r
647         GETYP   0,A\r
648         CAIN    0,TUNBOU\r
649         MOVEI   B,0\r
650         MOVEI   A,(P)\r
651         PUSH    P,[377777,,377777]\r
652         PUSH    P,[-1,,[ASCIZ /DSK/]]\r
653         PUSH    P,B\r
654         PUSH    P,[-1,,[ASCIZ /MUDDLE/]]\r
655         PUSH    P,[-1,,[ASCIZ /SAVE/]]\r
656         PUSH    P,[0]\r
657         PUSH    P,[0]\r
658         PUSH    P,[77]          ; USE AN OBSCURE JFN IF POSSIBLE\r
659         MOVE    B,1(AB)\r
660         GTJFN\r
661         JRST    FNF\r
662         SUB     P,[9.,,9.]\r
663         POP     P,B\r
664         OPENF\r
665         JRST    FNF\r
666         ADD     AB,[2,,2]\r
667         SKIPL   AB\r
668         AOS     (P)\r
669         POPJ    P,\r
670 \r
671 WRDIN:  PUSH    P,B\r
672         MOVE    A,-2(P)         ; JFN TO A\r
673         BIN\r
674         MOVE    A,B\r
675         POP     P,B\r
676         POPJ    P,\r
677 \r
678 WRDOUT: PUSH    P,B\r
679         MOVE    B,-2(P)\r
680         EXCH    A,B\r
681         BOUT\r
682         EXCH    A,B\r
683         POP     P,B\r
684         POPJ    P,\r
685 ]\r
686 \r
687 \r
688 ;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A\r
689 HACKV:  PUSH    P,D\r
690         PUSH    P,E\r
691         MOVE    D,[440700,,A]\r
692         MOVEI   E,5\r
693 HACKV1: ILDB    0,D\r
694         CAIN    0,(B)           ; MATCH ?\r
695         DPB     C,D             ; YES, CLOBBER\r
696         SOJG    E,HACKV1\r
697         POP     P,E\r
698         POP     P,D\r
699         POPJ    P,\r
700 \r
701 \r
702 CANTOP: PUSH    TP,$TATOM\r
703         PUSH    TP,EQUOTE CANT-OPEN-OUTPUT-FILE\r
704         JRST    CALER1\r
705 \r
706 FNF:    PUSH    TP,$TATOM\r
707         PUSH    TP,EQUOTE FILE-NOT-FOUND\r
708         JRST    CALER1\r
709 \r
710 BADVRS: PUSH    TP,$TATOM\r
711         PUSH    TP,EQUOTE MUDDLE-VERSIONS-DIFFER\r
712         JRST    CALER1\r
713 \r
714 EXPVRS: PUSH    TP,$TATOM\r
715         PUSH    TP,EQUOTE EXPERIMENTAL-MUDDLE-VERSION\r
716         JRST    CALER1\r
717 \r
718 CHNLO1: MOVE    C,(TP)\r
719         SETZM   1(C)\r
720         JRST    CHNLO2\r
721 \r
722 CHNLOS: MOVE    C,(TP)\r
723         SETZM   (C)-1\r
724 CHNLO2: MOVEI   B,[ASCIZ /\r
725 CHANNEL-NOT-RESTORED\r
726 /]\r
727         JRST    MSGTYP"\r
728 \r
729 \r
730 NOCORE: PUSH    P,A\r
731         PUSH    P,B\r
732         MOVEI   B,[ASCIZ /\r
733 WAIT, CORE NOT YET HERE\r
734 /]\r
735         PUSHJ   P,MSGTYP"\r
736         MOVE    A,(P)           ; RESTORE BLOCKS NEEDED\r
737         MOVEI   B,1\r
738         .SLEEP  B,\r
739         PUSHJ   P,P.CORE\r
740         JRST    .-4\r
741         MOVEI   B,[ASCIZ /\r
742 CORE ARRIVED\r
743 /]\r
744         PUSHJ   P,MSGTYP\r
745         POP     P,B\r
746         POP     P,A\r
747         POPJ    P,\r
748 END\r
749 \f\f