1 TITLE SAVE AND RESTORE STATE OF A MUDDLE
16 .GLOBAL MOPEN,MIOT,MCLOSE,MUDSTR,SWAP,STRTO6,GCPDL,RGPRS,ADDNUL,GCSTOP,PHIBOT
17 .GLOBAL CHNL0,CHNL1,REOPN,AGC,SWAPIN,MASK1,MASK2,IPCBLS,DEMFLG,FSTART,CKVRS
18 .GLOBAL P.CORE,P.TOP,SGSNAM,%RUNAM,%RSNAM,%RJNAM,INTINT,CLOSAL,TTYOPE,PURBOT,CHKPGI
19 .GLOBAL NOTTY,PURCLN,6TOCHS,DISXTR,IDVAL1,N.CHNS,PMAPB,PURTOP,HITOP,FRETOP,FREMIN
20 .GLOBAL SQKIL,SFRK,GETJS,IJFNS,IJFNS1,MULTSG,MULTI,NOMULT
41 PUSH P,[0] ; GC OR NOT?
44 MOVE C,[440000,,100000]
46 PUSHJ P,GTFNM ; GET THE FILE NAME ONTO P
49 JUMPGE AB,TMA ; TOO MUCH STRING
50 GETYP 0,(AB) ; WHAT IS ARG
51 CAMGE AB,[-3,,0] ; NOT TOO MANY
54 IFN ITS, SETOM -6(P) ; GC FLAG
58 MOVSI A,7 ; IMAGE BLOCK OUT
59 MOVEM A,-4(P) ; DIRECTION
62 PUSH P,[SIXBIT /_MUDS_/]
65 MOVEI A,-4(P) ; POINT TO BLOCK
66 PUSHJ P,MOPEN ; ATTEMPT TO OPEN
68 SUB P,[5,,5] ; FLUSH OPEN BLOCK
69 PUSH P,-6(P) ; GC FLAG TO TOP OF STACK (-4 --> -6 TAA)
71 EXCH A,(P) ; CHAN TO STACK GC TO A
73 PUSH TP,$TFIX ; CAUSE HAIRY GC TO OCCUR
80 ; NOW GET VERSION OF MUDDLE FOR COMPARISON
82 MOVE A,MUDSTR+2 ; GET #
83 MOVEI B,177 ; CHANGE ALL RUBOUT CHARACTERS
84 MOVEI C,40 ; ----- TO SPACES
88 MOVE A,P.TOP ; GET TOP OF CORD
90 MOVEI A,0 ; WRITE ZERO IF FAST
91 IFN ITS, SKIPE -8(P) ; -6 --> -8 TAA
94 MOVE A,VECTOP ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE
98 SETZB A,B ; FIRST, ALL INTS OFF
101 ; IF FAST SAVE JUMP OFF HERE
109 MOVEI A,400000 ; FOR THIS PROCESS
110 DIR ; TURN OFF INT SYSTEM
112 ; IF FAST, LEAVE HERE
117 ; NOW DUMP OUT GC SPACE
122 DMPDN2: SETZB A,B ; SET UP RENAME WHILE OPEN ETC.
125 LDB C,[270400,,0] ; GET CHANNEL
127 FATAL SAVE RENAME FAILED
128 XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO A CLOSE
131 MOVE A,MASK1 ; TURN INTS BACK ON
140 FATAL CANT CLOSE SAVE FILE
141 CIS ; CLEAR IT SYSTEM
146 SDONE: MOVE A,$TCHSTR
150 ; SCAN FOR MANY OCCURENCES OF THE SAME THING
153 ; HERE TO WRITE OUT FAST SAVE FILE
159 MOVE A,PARTOP ; DONT WRITE OUT "HOLE"
164 MOVE 0,(P) ; CHANNEL TO 0
166 ASH 0,23. ; TO AC FIELS
168 MOVEI A,5 ; START AT WORD 5
175 MOVE B,P ; WRITE OUT P FOR WIINAGE
179 SOUT ; MAKE PAGE BOUNDARIES WIN
180 MOVEI A,20 ; START AT 20
182 MOVEI B,(E) ; PARTOP TO B
183 PUSHJ P,FOUT ; WRITE OUT UP TO PAIR TOP
185 SUB P,[1,,1] ; CLEAN OFF STACK
189 FOUT: MOVEI D,(A) ; SAVE START
190 SUB A,B ; COMPUTE LH OF IOT PNTR
192 SKIPL A ; IF + MEANS GROSS CORE SIZE
193 MOVSI A,400000 ; USE BIGGEST
195 XCT 0 ; ZAP, OUT IT GOES
196 CAMGE A,B ; SKIP IF ALL WENT
197 JRST FOUT ; DO THE REST
198 POPJ P, ; GO CLOSE FILE
202 SUBI C,(B) ; # OF BYTES TP C
203 MOVEI B,(A) ; START TO B
211 ; HERE TO ATTEMPT TO RESTORE A SAVED STATE
213 MFUNCTION RESTORE,SUBR
219 MOVE C,[440000,,240000]
224 MOVSI A,6 ; READ/IMAGE/BLOCK
227 PUSHJ P,MOPEN ; OPEN THE LOSER
229 SUB P,[6,,6] ; REMOVE OPEN BLOCK
231 PUSH P,A ; SAVE CHANNEL
232 PUSHJ P,SGSNAM ; SAVE SNAME IN SYSTEM
234 IFE ITS, PUSH P,A ; SAVE JFN
235 PUSHJ P,CKVRS ; CHECK THE VERSION NUMBER
237 IFN ITS, MCALL 0,IPCOFF ; CLOSE ALL IPC CHANS
238 PUSHJ P,CLOSAL ; CLOSE CHANNELS
240 SETZB A,B ; KILL ALL POSSIBLE INTERRUPTION
242 DOTCAL UNLOCK,[[1000,,-1]]
243 .VALUE ; UNLOCK LOCKS
246 MOVEI A,400000 ; DISABLE INTS
249 HLRZ A,IJFNS ; CLOSE AGC
252 HRRZ A,IJFNS ; CLOSE INTERPRETER
255 HLRZ A,IJFNS1 ; CLOSE SGC
266 PUSHJ P,PURCLN ; DONT KEEP PURE SHAREDNESS
270 SKIPLE A,SFRK ; IF WE HAVE AN INFERIOR, KILL IT
278 DOTCAL CORBLK,[[FLS],[FME],0]
279 FATAL CANT FLUSH PURE PAGES
281 PUSHJ P,WRDIN ; GET P.TOP
284 PUSHJ P,WRDIN ; READ A WORD (VECTOP) OR 0==>FAST I.E. MAP RESTORE
298 IFN ITS, MOVEM E,NOTTY ; SAVE TTY FLAG
305 PUSHJ P,PURCLN ; IN CASE RESTORED THING HAD PURE STUFF
306 PUSHJ P,INTINT ; USE NEW INTRRRUPTS
313 ; NOW CYCLE THROUGH CHANNELS
314 MOVE C,[-N.CHNS*2,,CHNL1] ; POINT TO REAL CHANNELS SLOTS
319 CHNLP: HRRZ A,(C) ; SEE IF NEW VALUE
321 SKIPN B,1(C) ; GET CHANNEL
325 MOVE C,(TP) ; GET POINTER
326 NXTCHN: ADD C,[2,,2] ; AND BUMP
331 SKIPN C,CHNL0+1 ; ANY PSUEDO CHANNELS
332 JRST RDONE ; NO, JUST GO AWAY
333 MOVSI A,TLIST ; YES, REOPEN THEM
335 CHNLP1: MOVEM C,(TP) ; SAVE POINTER
336 SKIPE B,(C)+1 ; GET CHANNEL
339 MOVE C,(TP) ; GOBBLE POINTER
340 HRRZ C,(C) ; REST LIST OF PSUEDO CHANNELS
348 ADDI A,1 ; SET UP BLT POINTER
350 BLT A,-1(B) ; TO THE TOP OF THE WORLD
355 PUSHJ P,IPCBLS ;BLESS ALL THE IPC CHANNELS
356 PUSHJ P,SGSNAM ; GET SNAME
358 MOVE A,(P) ; GET OLD SNAME
360 PUSHJ P,6TOCHS ; TO STRING
363 PUSHJ P,SGSNMQ ; SKIPS IF SNAME IS NON-NIL
364 PUSHJ P,%RSNAM ; ELSE GETS "REAL" SNAME
373 MOVE B,CHQUOTE RESTORED
377 ;SKIPS IF THERE IS AN SNAME, RETURNING IT
378 SGSNMQ: MOVE B,IMQUOTE SNM
392 ANDCMI A,1777 ; ROUND AND TO PAGE BOUNDRY
393 ASH A,-10. ; TO PAGES
395 MOVSI A,(A) ; TO PAGE AOBJN
396 MOVE C,A ; COPY OF POINTER
397 MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND
399 DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,D,C]
400 FATAL CORBLK ON RESTORE LOSSAGE
401 PUSHJ P,PURIN ; GET PURIFIED STRUCTURE
402 MOVSI A,(D) ; GET CHANNLEL BACK
404 MOVEI B,E ; WHERE TO STRAT IN FILE
406 XCT A ; ACCESS TO RIGHT ACS
407 XOR A,[<.IOT B>#<.ACCESS B>]
410 MOVE E,0 ; NO TTY FLAG BACK
411 XOR A,[<.IOT B>#<.CLOSE>]
413 MOVE A,GCSTOP ; GET CORE AND FOOL P.CORE
416 EXCH A,P.TOP ; GET P.TOP
417 ASH A,-10. ; TO PAGES
424 FASTR: POP P,A ; JFN TO A
431 MOVE 0,DEMFLG ; SAVE DEMFLG FLAG AROUND
432 HRL E,C ; SAVE VECTOP
433 MOVSI A,(A) ; JFN TO LH
434 MOVSI B,400000 ; FOR ME
435 MOVSI C,120400 ; FLAGS
436 ASH D,-9. ; PAGES TO D
447 MOVE E,0 ; DEMFLG TO E
451 ; HERE TO GROCK FILE NAME FROM ARGS
455 PUSH P,[0] ; DIRECTION
458 IRP A,,[DSK,MUDDLE,SAVE]
461 PUSHJ P,SGSNAM ; GET SNAME
462 PUSH P,A ; SAVE SNAME
464 PUSHJ P,RGPRS ; PARSE THESE ARGS
466 GTFNM1: AOS -5(P) ; SKIP RETURN
467 MOVE A,(P) ; GET SNAME
469 MOVE A,-5(P) ; GET RET ADDR
473 ; HERE TO OUTPUT 1 WORD
477 HRROI B,(P) ; POINT AT C(A)
478 MOVE A,-3(P) ; CHANNEL
479 PUSHJ P,MIOT ;WRITE IT
484 ; HERE TO READ 1 WORD
495 TRNN A,-1 ;ANY LENGTH?
496 PUSHJ P,%RSNAM ;IF <SNAME> IS "", GET REAL ONE
500 PUSH P,[377777,,377777]
501 PUSH P,[-1,,[ASCIZ /DSK/]]
503 PUSH P,[-1,,[ASCIZ /MUDDLE/]]
504 PUSH P,[-1,,[ASCIZ /SAVE/]]
507 PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE
524 MOVE A,-2(P) ; JFN TO A
540 ;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A
547 DPB C,D ; YES, CLOBBER
554 CANTOP: ERRUUO EQUOTE CANT-OPEN-OUTPUT-FILE
556 FNF: ERRUUO EQUOTE FILE-NOT-FOUND
558 BADVRS: ERRUUO EQUOTE MUDDLE-VERSIONS-DIFFER
567 CHNLO2: MOVEI B,[ASCIZ /
576 WAIT, CORE NOT YET HERE
579 MOVE A,-1(P) ; RESTORE BLOCKS NEEDED
593 PUCHK: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
594 ASH E,-10. ; TO PAGES
595 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
596 ASH A,-10. ; TO PAGES
597 PURCH1: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
599 ADDI A,1 ; INCREMENT PAGE COUNTER
600 CAMG A,E ; SKIP IF DONE
605 ; THESE ROUTINES ARE USED BY SAVE AND RESTORE TO GET PAGES OF PURE STRUCTURE
608 PUROUT: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
609 ASH E,-10. ; TO PAGES
610 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
611 ASH A,-10. ; TO PAGES
612 PUROU2: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
616 HRLI A,-2000 ; MAKE UP AOBJN PTR FOR IOT
617 MOVE B,-2(P) ; RESTORE CHN #
620 FATAL SAVE--IOT FAILED
624 MOVE B,A ; SET UP BYTE POINTER
625 MOVE A,0 ; CHANNEL TO A
626 HRLI B,444400 ; SET UP BYTE POINTER
632 POP P,A ; RESTORE PAGE #
633 INCPUT: ADDI A,1 ; INCREMENT PAGE COUNTER
634 CAMG A,E ; SKIP IF DONE
648 IDIVI A,16. ; FIND ENTRY IN PMAP TABLE
649 MOVE C,PMAPB(A) ; GET WORD CONTAINING ENTRY
650 HRLZI D,400000 ; SET UP TEST WORD
653 LSH D,(B) ; GET TO CHECK PAIR
654 LSH D,-1 ; TO BIT INDICATING SAVE
655 TDON C,D ; SKIP IF PAGE CONTAINS P.S
658 AOS (P) ; SKIP ITS A WINNER
670 DOTCAL CORTYP,[A,[2000,,A],[2000,,0]]
699 ; ROUTINE TO READ IN PURE STRUCTURE PAGES
702 PURIN: PUSH P,D ; SAVE CHANNEL #
703 MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
704 ASH E,-10. ; TO PAGES
705 MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
706 ASH A,-10. ; TO WORDS
708 IFN UNTAST, PUSHJ P,CHKPGJ ; SEE IF PURE PAGE EXISTS
709 IFE UNTAST, PUSHJ P,CHKPGI ; SEE IF PURE PAGE EXISTS
717 MOVE D,-1(P) ; RESTORE CHANNEL #
718 HRLI A,-1 ; SET UP AOBJN POINTER FOR DOTCAL
720 DOTCAL CORBLK,[0,[1000,,-1],A,D]
723 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,D]
725 FATAL SAVE--CORBLK FAILED
728 CAMG A,E ; SKIP IF DONE
730 POP P,D ; RESTORE CHANNEL
734 PURIN: PUSH P,A ; SAVE CHANNEL
735 MOVEI E,HIBOT ; TOP OF SCAN
737 MOVE A,PURBOT ; BOTTOM OF SCAN
738 ASH A,-10. ; TO PAGES
739 PURIN1: PUSHJ P,CHKPGI ; SEE IF PAGE IS NEEDED
745 ASH B,1 ; FOR TEXEX PAGES
746 HRLI B,MFORK ; SET UP ARGS TO PMAP
748 MOVE A,-1(P) ; GET FILE POINTER
750 ADDI B,1 ; INCREMENT B
752 PMAP ; SECOND HALF OF ITS PAGE
754 MOVEM A,-1(P) ; SAVE FILE PAGE
757 CAMG A,E ; SKIP IF DONE
759 POP P,A ; RESTOR CHANNEL
763 PUSHJ P,WRDIN ; READ MUDDLE VERSION
764 MOVEI B,40 ; CHANGE ALL SPACES
765 MOVEI C,177 ; ----- TO RUBOUT CHARACTERS
767 CAME A,MUDSTR+2 ; AGREE ?
769 SUB P,[1,,1] ; POP OFF CHANNEL #