1 TITLE SAVE AND RESTORE STATE OF A MUDDLE
\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
21 MFUNCTION FSAVE,SUBR
\r
25 PUSH P,. ; SAY WE ARE FAST SAVER
\r
32 PUSH P,[0] ; SAY WE ARE OLD SLOW SAVE
\r
33 SAVE1: SKIPG MUDSTR+2 ; DON'T SAVE FROM EXPERIMENTAL MUDDLE
\r
35 PUSH P,[0] ; GC OR NOT?
\r
38 MOVE C,[440000,,100000]
\r
40 PUSHJ P,GTFNM ; GET THE FILE NAME ONTO P
\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
48 IFN ITS, SETOM -4(P) ; GC FLAG
\r
52 MOVSI A,7 ; IMAGE BLOCK OUT
\r
53 HRR A,-2(P) ; DEVICE
\r
55 PUSH P,[SIXBIT /_MUDS_/]
\r
57 MOVEI A,-2(P) ; POINT TO BLOCK
\r
58 PUSHJ P,MOPEN ; ATTEMPT TO OPEN
\r
60 SUB P,[3,,3] ; FLUSH OPEN BLOCK
\r
61 PUSH P,-4(P) ; GC FLAG TO TOP OF STACK
\r
63 EXCH A,(P) ; CHAN TO STACK GC TO A
\r
67 ; NOW GET VERSION OF MUDDLE FOR COMPARISON
\r
69 MOVE A,MUDSTR+2 ; GET #
\r
70 MOVEI B,177 ; CHANGE ALL RUBOUT CHARACTERS
\r
71 MOVEI C,40 ; ----- TO SPACES
\r
75 MOVEI A,0 ; WRITE ZERO IF FAST
\r
76 IFN ITS, SKIPE -6(P)
\r
77 IFE ITS, SKIPE -1(P)
\r
79 MOVE A,VECTOP ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE
\r
83 SETZB A,B ; FIRST, ALL INTS OFF
\r
85 SKIPE DISXTR ; IF HAVE DISPLAY, CLOSE IT
\r
86 .DSTOP ; STOP THE E&S IF RUNNING
\r
88 ; IF FAST SAVE JUMP OFF HERE
\r
93 ; NOW DUMP OUT GC SPACE
\r
94 MOVEI A,E+1 ; ADDRESS OF FIRST NON-SCRATCH WORD
\r
96 LSH 0,23. ; POSITION
\r
101 MOVEI A,400000 ; FOR THIS PROCESS
\r
102 DIR ; TURN OFF INT SYSTEM
\r
104 ; IF FAST, LEAVE HERE
\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
117 MOVEI A,20 ; START AT LOCN 20
\r
119 DMPLP1: MOVEI B,(A) ; POINT TO START OF STUFF
\r
120 SUB B,VECTOP ; GET BLOCK LENGTH
\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
126 ; MAIN NON-ZERO DUMPING LOOP
\r
128 DMPLP: SKIPN C,(B) ; FIND FIRST NON-ZERO
\r
130 JUMPGE B,DMPDON ; NO MORE TO SCAN
\r
132 DMP4: MOVEI E,(B) ; FOUND ONE, SAVE POINTER TO IT
\r
133 DMP3: MOVSI D,-5 ; DUPLICATE COUNTER SETUP
\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
142 AOBJP B,DMP2 ; CHECK FOR LONE ZERO
\r
144 JRST DMP1 ; LONE ZERO, DONT END BLOCK
\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
150 HRROI A,E ; MAKE AN IOT POINTER TO IT
\r
152 MOVE A,E ; NOW FOR THE BLOCK
\r
153 XCT 0 ; ZAP!, OUT IT GOES
\r
156 EXCH E,B ; AOBJN TO B
\r
157 MOVE A,0 ; JFN TO A
\r
159 MOVE D,B ; SAVE POINTER
\r
160 HRLI B,444400 ; BYTPE POINTER
\r
161 HLRE C,D ; # OF BYTES
\r
164 ; NOW COMPUTE A CKS
\r
167 MOVE D,E ; FIRST WORD OF CKS
\r
170 AOBJN D,.-2 ; COMP CKS
\r
172 XCT 0 ; WRITE OUT THE CKS
\r
180 MOVE B,E ; MAIN POINTER BACK
\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
190 DMPDN1: HRROI A,[-1]
\r
192 DMPDN2: SETZB A,B ; SET UP RENAME WHILE OPEN ETC.
\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
201 MOVE A,MASK1 ; TURN INTS BACK ON
\r
204 SKIPE DISXTR ; SKIP IF NO E&S
\r
205 .DCONTINUE ; RESTART THE E&S IF WE HAVE IT
\r
210 MOVE A,0 ; WRITE EOF
\r
214 FATAL CANT CLOSE SAVE FILE
\r
215 CIS ; CLEAR IT SYSTEM
\r
217 EIR ; AND RE-ENABLE
\r
220 SDONE: MOVE A,$TCHSTR
\r
221 MOVE B,CHQUOTE SAVED
\r
224 ; SCAN FOR MANY OCCURENCES OF THE SAME THING
\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
231 DMP6: CAMN C,(B) ; FIND ALL CONTIG
\r
233 MOVEI D,(B) ; COMPUTE COUNT
\r
236 HRRI D,(E) ; HEADER
\r
240 HRROI A,C ; WRITE THE WORD
\r
252 ; HERE TO WRITE OUT FAST SAVE FILE
\r
254 FSAVE1: MOVE A,PARTOP ; DONT WRITE OUT "HOLE"
\r
263 POP P,0 ; CHANNEL TO 0
\r
265 ASH 0,23. ; TO AC FIELS
\r
267 MOVEI A,5 ; START AT WORD 5
\r
274 MOVE B,P ; WRITE OUT P FOR WIINAGE
\r
276 MOVE B,[444400,,20]
\r
278 SOUT ; MAKE PAGE BOUNDARIES WIN
\r
279 MOVEI A,20 ; START AT 20
\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
289 FOUT: MOVEI D,(A) ; SAVE START
\r
290 SUB A,B ; COMPUTE LH OF IOT PNTR
\r
292 SKIPL A ; IF + MEANS GROSS CORE SIZE
\r
293 MOVSI A,400000 ; USE BIGGEST
\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
302 SUBI C,(B) ; # OF BYTES TP C
\r
303 MOVEI B,(A) ; START TO B
\r
306 SOUT ; WRITE IT OUT
\r
311 ; HERE TO ATTEMPT TO RESTORE A SAVED STATE
\r
313 MFUNCTION RESTORE,SUBR
\r
316 SKIPG MUDSTR+2 ; DON'T RESTORE FROM EXPERIMENTAL MUDDLE
\r
320 MOVE C,[440000,,240000]
\r
325 MOVEI A,6 ; READ/IMAGE/BLOCK
\r
328 PUSHJ P,MOPEN ; OPEN THE LOSER
\r
330 SUB P,[4,,4] ; REMOVE OPEN BLOCK
\r
332 PUSH P,A ; SAVE CHANNEL
\r
333 PUSHJ P,SGSNAM ; SAVE SNAME IN SYSTEM
\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
340 CAME A,MUDSTR+2 ; AGREE ?
\r
343 IFN ITS, MCALL 0,IPCOFF ; CLOSE ALL IPC CHANS
\r
344 PUSHJ P,CLOSAL ; CLOSE CHANNELS
\r
346 SETZB A,B ; KILL ALL POSSIBLE INTERRUPTION
\r
350 MOVEI A,400000 ; DISABLE INTS
\r
353 PUSHJ P,PURCLN ; DONT KEEP PURE SHAREDNESS
\r
354 POP P,A ; RETRIEVE CHANNEL
\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
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
364 PUSHJ P,NOCORE ; LOSE,LOSE, LOSE
\r
366 ; NOW READY TO READ IN GC SPACE
\r
369 MOVE B,[E+1,,E+2] ; BLT SETUP TO ZERO CORE
\r
372 BLT B,-1+2000(A) ; THE WHOLE THING?
\r
375 IOR 0,[.IOT A] ; BUILD IOT
\r
379 BIN ; READ IN NEW "P"
\r
384 HRROI A,B ; READ A HDR
\r
395 JUMPGE B,LDDUPS ; JUMP IF LOADING DUPS
\r
397 MOVE A,B ; TO IOTER
\r
400 MOVE C,B ; COMP CKS
\r
403 AOBJN B,.-2 ; COMP AWAY
\r
405 HRROI A,D ; GET FILES CKS
\r
408 FATAL RESTORE CHECKSUM ERROR
\r
409 JRST LDLP ; LOAD MORE
\r
416 SIN ; READ IN A BUNCH
\r
423 BIN ; READ STORED CKS
\r
425 FATAL RESTORE CHECKSUM ERROR
\r
431 HRROI A,(B) ; READ 1ST IN PLACE
\r
435 MOVE D,B ; SAVE HDR
\r
436 BIN ; READ WORD OF INTEREST
\r
441 HRLI B,(B) ; BUILD A BLT PONTER
\r
449 XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO CLOSE
\r
456 FASTR1: MOVEI A,P-1
\r
466 MOVE A,VECTOP ; REAL CORE TOP
\r
467 ADDI A,2000 ; ROOM FOR GC PDL
\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
473 ; NOW CYCLE THROUGH CHANNELS
\r
475 ADD C,[CHNL1+2,,CHNL1+2] ; POINT TO REAL CHANNELS SLOTS
\r
480 CHNLP: SKIPN B,-1(C) ; GET CHANNEL
\r
484 MOVE C,(TP) ; GET POINTER
\r
485 NXTCHN: ADD C,[2,,2] ; AND BUMP
\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
494 CHNLP1: MOVEM C,(TP) ; SAVE POINTER
\r
495 SKIPE B,(C)+1 ; GET CHANNEL
\r
498 MOVE C,(TP) ; GOBBLE POINTER
\r
499 HRRZ C,(C) ; REST LIST OF PSUEDO CHANNELS
\r
502 RDONE: SUB TP,[2,,2]
\r
506 PUSHJ P,IPCBLS ;BLESS ALL THE IPC CHANNELS
\r
507 PUSHJ P,SGSNAM ; GET SNAME
\r
510 PUSHJ P,6TOCHS ; TO STRING
\r
518 MOVE B,CHQUOTE RESTORED
\r
523 PUSHJ P,WRDIN ; GET CORE TOP
\r
524 ASH A,-10. ; TO PAGES
\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
532 PUSHJ P,WRDIN ; NOW GET VECBOT
\r
533 ASH A,-10. ; TO PAGES
\r
534 EXCH A,E ; AND SAVE IN E
\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
549 MOVEI B,E ; WHERE TO STRAT IN FILE
\r
551 XCT A ; ACCESS TO RIGHT ACS
\r
552 XOR A,[<.IOT B>#<.ACCESS B>]
\r
555 MOVE E,0 ; NO TTY FLAG BACK
\r
556 XOR A,[<.IOT B>#<.CLOSE>]
\r
560 FASTR: POP P,A ; JFN TO A
\r
561 BIN ; CORE TOP TO 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
580 ASH E,-9. ; E==> CORTOP PAGE,,VECBOT PAGE
\r
581 HLR B,E ; B NOW READY
\r
591 FATAL CANT CLOSE RESTORE FILE
\r
592 MOVE E,0 ; NOTTY TO E
\r
594 MOVE A,PARTOP ; ZERO OUT NEW FREE
\r
599 BLT A,-1(B) ; ZAP...YOU'RE ZERO
\r
603 ; HERE TO GROCK FILE NAME FROM ARGS
\r
610 IRP A,,[DSK,MUDDLE,SAVE]
\r
611 PUSH P,[SIXBIT /A/]
\r
613 PUSHJ P,SGSNAM ; GET SNAME
\r
614 PUSH P,A ; SAVE SNAME
\r
617 PUSHJ P,RGPRS ; PARSE THESE ARGS
\r
619 GTFNM1: AOS -4(P) ; SKIP RETURN
\r
621 POP P,A ; GET SNAME
\r
623 MOVE A,-3(P) ; GET RET ADDR
\r
624 HLRZS -2(P) ; FIXUP DEVICE SPEC
\r
628 ; HERE TOO OUT 1 WORD
\r
632 HRROI B,(P) ; POINT AT C(A)
\r
633 MOVE A,-3(P) ; CHANNEL
\r
634 PUSHJ P,MIOT ;WRITE IT
\r
639 ; HERE TO READ 1 WORD
\r
651 PUSH P,[377777,,377777]
\r
652 PUSH P,[-1,,[ASCIZ /DSK/]]
\r
654 PUSH P,[-1,,[ASCIZ /MUDDLE/]]
\r
655 PUSH P,[-1,,[ASCIZ /SAVE/]]
\r
658 PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE
\r
672 MOVE A,-2(P) ; JFN TO A
\r
688 ;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A
\r
694 CAIN 0,(B) ; MATCH ?
\r
695 DPB C,D ; YES, CLOBBER
\r
702 CANTOP: PUSH TP,$TATOM
\r
703 PUSH TP,EQUOTE CANT-OPEN-OUTPUT-FILE
\r
706 FNF: PUSH TP,$TATOM
\r
707 PUSH TP,EQUOTE FILE-NOT-FOUND
\r
710 BADVRS: PUSH TP,$TATOM
\r
711 PUSH TP,EQUOTE MUDDLE-VERSIONS-DIFFER
\r
714 EXPVRS: PUSH TP,$TATOM
\r
715 PUSH TP,EQUOTE EXPERIMENTAL-MUDDLE-VERSION
\r
718 CHNLO1: MOVE C,(TP)
\r
722 CHNLOS: MOVE C,(TP)
\r
724 CHNLO2: MOVEI B,[ASCIZ /
\r
725 CHANNEL-NOT-RESTORED
\r
733 WAIT, CORE NOT YET HERE
\r
736 MOVE A,(P) ; RESTORE BLOCKS NEEDED
\r