1 TITLE SAVE AND RESTORE STATE OF A MUDDLE
17 .GLOBAL MOPEN,MIOT,MCLOSE,MUDSTR,SWAP,STRTO6,GCPDL,RGPRS,ADDNUL,GCSTOP,PHIBOT
18 .GLOBAL CHNL0,CHNL1,REOPN,AGC,SWAPIN,MASK1,MASK2,IPCBLS,DEMFLG,FSTART,CKVRS
19 .GLOBAL P.CORE,P.TOP,SGSNAM,%RUNAM,%RSNAM,%RJNAM,INTINT,CLOSAL,TTYOPE,PURBOT,CHKPGI
20 .GLOBAL NOTTY,PURCLN,6TOCHS,DISXTR,IDVAL1,N.CHNS,PMAPB,PURTOP,HITOP,FRETOP,FREMIN
21 .GLOBAL SQKIL,SFRK,GETJS,IJFNS,IJFNS1,MULTSG,MULTI,NOMULT,THIBOT
43 PUSH P,[0] ; GC OR NOT?
46 MOVE C,[440000,,100000]
48 PUSHJ P,GTFNM ; GET THE FILE NAME ONTO P
51 JUMPGE AB,TMA ; TOO MUCH STRING
52 GETYP 0,(AB) ; WHAT IS ARG
53 CAMGE AB,[-3,,0] ; NOT TOO MANY
56 IFN ITS, SETOM -6(P) ; GC FLAG
60 MOVSI A,7 ; IMAGE BLOCK OUT
61 MOVEM A,-4(P) ; DIRECTION
64 PUSH P,[SIXBIT /_MUDS_/]
67 MOVEI A,-4(P) ; POINT TO BLOCK
68 PUSHJ P,MOPEN ; ATTEMPT TO OPEN
70 SUB P,[5,,5] ; FLUSH OPEN BLOCK
71 PUSH P,-6(P) ; GC FLAG TO TOP OF STACK (-4 --> -6 TAA)
73 EXCH A,(P) ; CHAN TO STACK GC TO A
75 PUSH TP,$TFIX ; CAUSE HAIRY GC TO OCCUR
82 ; NOW GET VERSION OF MUDDLE FOR COMPARISON
84 MOVE A,MUDSTR+2 ; GET #
85 MOVEI B,177 ; CHANGE ALL RUBOUT CHARACTERS
86 MOVEI C,40 ; ----- TO SPACES
90 MOVE A,P.TOP ; GET TOP OF CORD
92 MOVEI A,0 ; WRITE ZERO IF FAST
93 IFN ITS, SKIPE -8(P) ; -6 --> -8 TAA
96 MOVE A,VECTOP ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE
100 SETZB A,B ; FIRST, ALL INTS OFF
103 ; IF FAST SAVE JUMP OFF HERE
111 MOVEI A,400000 ; FOR THIS PROCESS
112 DIR ; TURN OFF INT SYSTEM
114 ; IF FAST, LEAVE HERE
119 ; NOW DUMP OUT GC SPACE
124 DMPDN2: SETZB A,B ; SET UP RENAME WHILE OPEN ETC.
127 LDB C,[270400,,0] ; GET CHANNEL
129 FATAL SAVE RENAME FAILED
130 XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO A CLOSE
133 MOVE A,MASK1 ; TURN INTS BACK ON
142 FATAL CANT CLOSE SAVE FILE
143 CIS ; CLEAR IT SYSTEM
148 SDONE: MOVE A,$TCHSTR
152 ; SCAN FOR MANY OCCURENCES OF THE SAME THING
155 ; HERE TO WRITE OUT FAST SAVE FILE
161 MOVE A,PARTOP ; DONT WRITE OUT "HOLE"
166 MOVE 0,(P) ; CHANNEL TO 0
168 ASH 0,23. ; TO AC FIELS
170 MOVEI A,5 ; START AT WORD 5
177 MOVE B,P ; WRITE OUT P FOR WIINAGE
181 SOUT ; MAKE PAGE BOUNDARIES WIN
182 MOVEI A,20 ; START AT 20
184 MOVEI B,(E) ; PARTOP TO B
185 PUSHJ P,FOUT ; WRITE OUT UP TO PAIR TOP
187 SUB P,[1,,1] ; CLEAN OFF STACK
191 FOUT: MOVEI D,(A) ; SAVE START
192 SUB A,B ; COMPUTE LH OF IOT PNTR
194 SKIPL A ; IF + MEANS GROSS CORE SIZE
195 MOVSI A,400000 ; USE BIGGEST
197 XCT 0 ; ZAP, OUT IT GOES
198 CAMGE A,B ; SKIP IF ALL WENT
199 JRST FOUT ; DO THE REST
200 POPJ P, ; GO CLOSE FILE
204 SUBI C,(B) ; # OF BYTES TP C
205 MOVEI B,(A) ; START TO B
213 ; HERE TO ATTEMPT TO RESTORE A SAVED STATE
215 MFUNCTION RESTORE,SUBR
221 MOVE C,[440000,,240000]
226 MOVSI A,6 ; READ/IMAGE/BLOCK
229 PUSHJ P,MOPEN ; OPEN THE LOSER
231 SUB P,[6,,6] ; REMOVE OPEN BLOCK
233 PUSH P,A ; SAVE CHANNEL
234 PUSHJ P,SGSNAM ; SAVE SNAME IN SYSTEM
236 IFE ITS, PUSH P,A ; SAVE JFN
237 PUSHJ P,CKVRS ; CHECK THE VERSION NUMBER
239 IFN ITS, MCALL 0,IPCOFF ; CLOSE ALL IPC CHANS
240 PUSHJ P,CLOSAL ; CLOSE CHANNELS
242 SETZB A,B ; KILL ALL POSSIBLE INTERRUPTION
244 DOTCAL UNLOCK,[[1000,,-1]]
245 .VALUE ; UNLOCK LOCKS
248 MOVEI A,400000 ; DISABLE INTS
251 ; LOOP TO CLOSE ALL RANDOM JFNS
253 MOVE E,[-JFNLNT,,JFNTBL]
267 PUSHJ P,PURCLN ; DONT KEEP PURE SHAREDNESS
278 SKIPLE A,SFRK ; IF WE HAVE AN INFERIOR, KILL IT
286 DOTCAL CORBLK,[[FLS],[FME],0]
287 FATAL CANT FLUSH PURE PAGES
289 PUSHJ P,WRDIN ; GET P.TOP
292 PUSHJ P,WRDIN ; READ A WORD (VECTOP) OR 0==>FAST I.E. MAP RESTORE
306 IFN ITS, MOVEM E,NOTTY ; SAVE TTY FLAG
313 PUSHJ P,PURCLN ; IN CASE RESTORED THING HAD PURE STUFF
314 PUSHJ P,INTINT ; USE NEW INTRRRUPTS
321 ; NOW CYCLE THROUGH CHANNELS
322 MOVE C,[-N.CHNS*2,,CHNL1] ; POINT TO REAL CHANNELS SLOTS
327 CHNLP: HRRE A,(C) ; SEE IF NEW VALUE
329 SKIPN B,1(C) ; GET CHANNEL
333 MOVE C,(TP) ; GET POINTER
334 NXTCHN: ADD C,[2,,2] ; AND BUMP
339 SKIPN C,CHNL0+1 ; ANY PSUEDO CHANNELS
340 JRST RDONE ; NO, JUST GO AWAY
341 MOVSI A,TLIST ; YES, REOPEN THEM
343 CHNLP1: MOVEM C,(TP) ; SAVE POINTER
344 SKIPE B,(C)+1 ; GET CHANNEL
347 MOVE C,(TP) ; GOBBLE POINTER
348 HRRZ C,(C) ; REST LIST OF PSUEDO CHANNELS
356 ADDI A,1 ; SET UP BLT POINTER
358 BLT A,-1(B) ; TO THE TOP OF THE WORLD
363 PUSHJ P,IPCBLS ;BLESS ALL THE IPC CHANNELS
364 PUSHJ P,SGSNAM ; GET SNAME
366 MOVE A,(P) ; GET OLD SNAME
368 PUSHJ P,6TOCHS ; TO STRING
371 PUSHJ P,SGSNMQ ; SKIPS IF SNAME IS NON-NIL
372 PUSHJ P,%RSNAM ; ELSE GETS "REAL" SNAME
388 MOVE B,CHQUOTE RESTORED
392 ;SKIPS IF THERE IS AN SNAME, RETURNING IT
393 SGSNMQ: MOVE B,IMQUOTE SNM
407 ANDCMI A,1777 ; ROUND AND TO PAGE BOUNDRY
408 ASH A,-10. ; TO PAGES
410 MOVSI A,(A) ; TO PAGE AOBJN
411 MOVE C,A ; COPY OF POINTER
412 MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND
414 DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,D,C]
415 FATAL CORBLK ON RESTORE LOSSAGE
416 PUSHJ P,PURIN ; GET PURIFIED STRUCTURE
417 MOVSI A,(D) ; GET CHANNLEL BACK
419 MOVEI B,E ; WHERE TO STRAT IN FILE
421 XCT A ; ACCESS TO RIGHT ACS
422 XOR A,[<.IOT B>#<.ACCESS B>]
425 MOVE E,0 ; NO TTY FLAG BACK
426 XOR A,[<.IOT B>#<.CLOSE>]
428 MOVE A,GCSTOP ; GET CORE AND FOOL P.CORE
431 EXCH A,P.TOP ; GET P.TOP
432 ASH A,-10. ; TO PAGES
439 FASTR: POP P,A ; JFN TO A
446 MOVE 0,DEMFLG ; SAVE DEMFLG FLAG AROUND
447 HRL E,C ; SAVE VECTOP
448 MOVSI A,(A) ; JFN TO LH
449 MOVSI B,400000 ; FOR ME
450 MOVSI C,120400 ; FLAGS
451 ASH D,-9. ; PAGES TO D
462 MOVE E,0 ; DEMFLG TO E
466 ; HERE TO GROCK FILE NAME FROM ARGS
470 PUSH P,[0] ; DIRECTION
473 IRP A,,[DSK,MUDDLE,SAVE]
476 PUSHJ P,SGSNAM ; GET SNAME
477 PUSH P,A ; SAVE SNAME
479 PUSHJ P,RGPRS ; PARSE THESE ARGS
481 GTFNM1: AOS -5(P) ; SKIP RETURN
482 MOVE A,(P) ; GET SNAME
484 MOVE A,-5(P) ; GET RET ADDR
488 ; HERE TO OUTPUT 1 WORD
492 HRROI B,(P) ; POINT AT C(A)
493 MOVE A,-3(P) ; CHANNEL
494 PUSHJ P,MIOT ;WRITE IT
499 ; HERE TO READ 1 WORD
510 TRNN A,-1 ;ANY LENGTH?
511 PUSHJ P,%RSNAM ;IF <SNAME> IS "", GET REAL ONE
515 PUSH P,[377777,,377777]
516 PUSH P,[-1,,[ASCIZ /DSK/]]
518 PUSH P,[-1,,[ASCIZ /MUDDLE/]]
519 PUSH P,[-1,,[ASCIZ /SAVE/]]
522 PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE
539 MOVE A,-2(P) ; JFN TO A
555 ;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A
562 DPB C,D ; YES, CLOBBER
569 CANTOP: ERRUUO EQUOTE CANT-OPEN-OUTPUT-FILE
571 FNF: ERRUUO EQUOTE FILE-NOT-FOUND
573 BADVRS: ERRUUO EQUOTE MUDDLE-VERSIONS-DIFFER
582 SETZM 1(B) ; CLOBBER CHANNEL #
584 CHNLO2: MOVEI B,[ASCIZ /
593 WAIT, CORE NOT YET HERE
596 MOVE A,-1(P) ; RESTORE BLOCKS NEEDED
610 PUCHK: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
611 ASH E,-10. ; TO PAGES
612 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
613 ASH A,-10. ; TO PAGES
614 PURCH1: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
616 ADDI A,1 ; INCREMENT PAGE COUNTER
617 CAMG A,E ; SKIP IF DONE
622 ; THESE ROUTINES ARE USED BY SAVE AND RESTORE TO GET PAGES OF PURE STRUCTURE
625 PUROUT: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
626 ASH E,-10. ; TO PAGES
627 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
628 ASH A,-10. ; TO PAGES
629 PUROU2: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
633 HRLI A,-2000 ; MAKE UP AOBJN PTR FOR IOT
634 MOVE B,-2(P) ; RESTORE CHN #
637 FATAL SAVE--IOT FAILED
641 MOVE B,A ; SET UP BYTE POINTER
642 MOVE A,0 ; CHANNEL TO A
643 HRLI B,444400 ; SET UP BYTE POINTER
649 POP P,A ; RESTORE PAGE #
650 INCPUT: ADDI A,1 ; INCREMENT PAGE COUNTER
651 CAMG A,E ; SKIP IF DONE
665 IDIVI A,16. ; FIND ENTRY IN PMAP TABLE
666 MOVE C,PMAPB(A) ; GET WORD CONTAINING ENTRY
667 HRLZI D,400000 ; SET UP TEST WORD
670 LSH D,(B) ; GET TO CHECK PAIR
671 LSH D,-1 ; TO BIT INDICATING SAVE
672 TDON C,D ; SKIP IF PAGE CONTAINS P.S
675 AOS (P) ; SKIP ITS A WINNER
687 DOTCAL CORTYP,[A,[2000,,A],[2000,,0]]
716 ; ROUTINE TO READ IN PURE STRUCTURE PAGES
719 PURIN: PUSH P,D ; SAVE CHANNEL #
720 MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
721 ASH E,-10. ; TO PAGES
722 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
723 ASH A,-10. ; TO WORDS
725 IFN UNTAST, PUSHJ P,CHKPGJ ; SEE IF PURE PAGE EXISTS
726 IFE UNTAST, PUSHJ P,CHKPGI ; SEE IF PURE PAGE EXISTS
734 MOVE D,-1(P) ; RESTORE CHANNEL #
735 HRLI A,-1 ; SET UP AOBJN POINTER FOR DOTCAL
737 DOTCAL CORBLK,[0,[1000,,-1],A,D]
740 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,D]
742 FATAL SAVE--CORBLK FAILED
745 CAMG A,E ; SKIP IF DONE
747 POP P,D ; RESTORE CHANNEL
751 PURIN: PUSH P,A ; SAVE CHANNEL
752 MOVEI E,HIBOT ; TOP OF SCAN
754 MOVE A,PURBOT ; BOTTOM OF SCAN
755 ASH A,-10. ; TO PAGES
756 PURIN1: PUSHJ P,CHKPGI ; SEE IF PAGE IS NEEDED
762 ASH B,1 ; FOR TEXEX PAGES
763 HRLI B,MFORK ; SET UP ARGS TO PMAP
765 MOVE A,-1(P) ; GET FILE POINTER
767 ADDI B,1 ; INCREMENT B
769 PMAP ; SECOND HALF OF ITS PAGE
771 MOVEM A,-1(P) ; SAVE FILE PAGE
774 CAMG A,E ; SKIP IF DONE
776 POP P,A ; RESTOR CHANNEL
780 PUSHJ P,WRDIN ; READ MUDDLE VERSION
781 MOVEI B,40 ; CHANGE ALL SPACES
782 MOVEI C,177 ; ----- TO RUBOUT CHARACTERS
784 CAME A,MUDSTR+2 ; AGREE ?
786 SUB P,[1,,1] ; POP OFF CHANNEL #