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: HRRZ 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
381 MOVE B,CHQUOTE RESTORED
385 ;SKIPS IF THERE IS AN SNAME, RETURNING IT
386 SGSNMQ: MOVE B,IMQUOTE SNM
400 ANDCMI A,1777 ; ROUND AND TO PAGE BOUNDRY
401 ASH A,-10. ; TO PAGES
403 MOVSI A,(A) ; TO PAGE AOBJN
404 MOVE C,A ; COPY OF POINTER
405 MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND
407 DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,D,C]
408 FATAL CORBLK ON RESTORE LOSSAGE
409 PUSHJ P,PURIN ; GET PURIFIED STRUCTURE
410 MOVSI A,(D) ; GET CHANNLEL BACK
412 MOVEI B,E ; WHERE TO STRAT IN FILE
414 XCT A ; ACCESS TO RIGHT ACS
415 XOR A,[<.IOT B>#<.ACCESS B>]
418 MOVE E,0 ; NO TTY FLAG BACK
419 XOR A,[<.IOT B>#<.CLOSE>]
421 MOVE A,GCSTOP ; GET CORE AND FOOL P.CORE
424 EXCH A,P.TOP ; GET P.TOP
425 ASH A,-10. ; TO PAGES
432 FASTR: POP P,A ; JFN TO A
439 MOVE 0,DEMFLG ; SAVE DEMFLG FLAG AROUND
440 HRL E,C ; SAVE VECTOP
441 MOVSI A,(A) ; JFN TO LH
442 MOVSI B,400000 ; FOR ME
443 MOVSI C,120400 ; FLAGS
444 ASH D,-9. ; PAGES TO D
455 MOVE E,0 ; DEMFLG TO E
459 ; HERE TO GROCK FILE NAME FROM ARGS
463 PUSH P,[0] ; DIRECTION
466 IRP A,,[DSK,MUDDLE,SAVE]
469 PUSHJ P,SGSNAM ; GET SNAME
470 PUSH P,A ; SAVE SNAME
472 PUSHJ P,RGPRS ; PARSE THESE ARGS
474 GTFNM1: AOS -5(P) ; SKIP RETURN
475 MOVE A,(P) ; GET SNAME
477 MOVE A,-5(P) ; GET RET ADDR
481 ; HERE TO OUTPUT 1 WORD
485 HRROI B,(P) ; POINT AT C(A)
486 MOVE A,-3(P) ; CHANNEL
487 PUSHJ P,MIOT ;WRITE IT
492 ; HERE TO READ 1 WORD
503 TRNN A,-1 ;ANY LENGTH?
504 PUSHJ P,%RSNAM ;IF <SNAME> IS "", GET REAL ONE
508 PUSH P,[377777,,377777]
509 PUSH P,[-1,,[ASCIZ /DSK/]]
511 PUSH P,[-1,,[ASCIZ /MUDDLE/]]
512 PUSH P,[-1,,[ASCIZ /SAVE/]]
515 PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE
532 MOVE A,-2(P) ; JFN TO A
548 ;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A
555 DPB C,D ; YES, CLOBBER
562 CANTOP: ERRUUO EQUOTE CANT-OPEN-OUTPUT-FILE
564 FNF: ERRUUO EQUOTE FILE-NOT-FOUND
566 BADVRS: ERRUUO EQUOTE MUDDLE-VERSIONS-DIFFER
575 CHNLO2: MOVEI B,[ASCIZ /
584 WAIT, CORE NOT YET HERE
587 MOVE A,-1(P) ; RESTORE BLOCKS NEEDED
601 PUCHK: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
602 ASH E,-10. ; TO PAGES
603 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
604 ASH A,-10. ; TO PAGES
605 PURCH1: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
607 ADDI A,1 ; INCREMENT PAGE COUNTER
608 CAMG A,E ; SKIP IF DONE
613 ; THESE ROUTINES ARE USED BY SAVE AND RESTORE TO GET PAGES OF PURE STRUCTURE
616 PUROUT: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
617 ASH E,-10. ; TO PAGES
618 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
619 ASH A,-10. ; TO PAGES
620 PUROU2: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
624 HRLI A,-2000 ; MAKE UP AOBJN PTR FOR IOT
625 MOVE B,-2(P) ; RESTORE CHN #
628 FATAL SAVE--IOT FAILED
632 MOVE B,A ; SET UP BYTE POINTER
633 MOVE A,0 ; CHANNEL TO A
634 HRLI B,444400 ; SET UP BYTE POINTER
640 POP P,A ; RESTORE PAGE #
641 INCPUT: ADDI A,1 ; INCREMENT PAGE COUNTER
642 CAMG A,E ; SKIP IF DONE
656 IDIVI A,16. ; FIND ENTRY IN PMAP TABLE
657 MOVE C,PMAPB(A) ; GET WORD CONTAINING ENTRY
658 HRLZI D,400000 ; SET UP TEST WORD
661 LSH D,(B) ; GET TO CHECK PAIR
662 LSH D,-1 ; TO BIT INDICATING SAVE
663 TDON C,D ; SKIP IF PAGE CONTAINS P.S
666 AOS (P) ; SKIP ITS A WINNER
678 DOTCAL CORTYP,[A,[2000,,A],[2000,,0]]
707 ; ROUTINE TO READ IN PURE STRUCTURE PAGES
710 PURIN: PUSH P,D ; SAVE CHANNEL #
711 MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
712 ASH E,-10. ; TO PAGES
713 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
714 ASH A,-10. ; TO WORDS
716 IFN UNTAST, PUSHJ P,CHKPGJ ; SEE IF PURE PAGE EXISTS
717 IFE UNTAST, PUSHJ P,CHKPGI ; SEE IF PURE PAGE EXISTS
725 MOVE D,-1(P) ; RESTORE CHANNEL #
726 HRLI A,-1 ; SET UP AOBJN POINTER FOR DOTCAL
728 DOTCAL CORBLK,[0,[1000,,-1],A,D]
731 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,D]
733 FATAL SAVE--CORBLK FAILED
736 CAMG A,E ; SKIP IF DONE
738 POP P,D ; RESTORE CHANNEL
742 PURIN: PUSH P,A ; SAVE CHANNEL
743 MOVEI E,HIBOT ; TOP OF SCAN
745 MOVE A,PURBOT ; BOTTOM OF SCAN
746 ASH A,-10. ; TO PAGES
747 PURIN1: PUSHJ P,CHKPGI ; SEE IF PAGE IS NEEDED
753 ASH B,1 ; FOR TEXEX PAGES
754 HRLI B,MFORK ; SET UP ARGS TO PMAP
756 MOVE A,-1(P) ; GET FILE POINTER
758 ADDI B,1 ; INCREMENT B
760 PMAP ; SECOND HALF OF ITS PAGE
762 MOVEM A,-1(P) ; SAVE FILE PAGE
765 CAMG A,E ; SKIP IF DONE
767 POP P,A ; RESTOR CHANNEL
771 PUSHJ P,WRDIN ; READ MUDDLE VERSION
772 MOVEI B,40 ; CHANGE ALL SPACES
773 MOVEI C,177 ; ----- TO RUBOUT CHARACTERS
775 CAME A,MUDSTR+2 ; AGREE ?
777 SUB P,[1,,1] ; POP OFF CHANNEL #