--- /dev/null
+TITLE SAVE AND RESTORE STATE OF A MUDDLE\r
+\r
+RELOCATABLE\r
+\r
+.INSRT DSK:MUDDLE >\r
+\r
+SYSQ\r
+\r
+IFE ITS,[\r
+IF1,[\r
+.INSRT STENEX >\r
+EXPUNGE SAVE\r
+]\r
+]\r
+\r
+.GLOBAL MOPEN,MIOT,MCLOSE,MUDSTR,SWAP,STRTO6,GCPDL,RGPRS\r
+.GLOBAL CHNL0,CHNL1,REOPN,AGC,SWAPIN,MASK1,MASK2,IPCBLS\r
+.GLOBAL P.CORE,P.TOP,SGSNAM,%RUNAM,%RJNAM,INTINT,CLOSAL,TTYOPE\r
+.GLOBAL NOTTY,PURCLN,6TOCHS,DISXTR,IDVAL1,N.CHNS\r
+\r
+MFUNCTION FSAVE,SUBR\r
+\r
+ ENTRY\r
+\r
+ PUSH P,. ; SAY WE ARE FAST SAVER\r
+ JRST SAVE1\r
+\r
+MFUNCTION SAVE,SUBR\r
+\r
+ ENTRY\r
+\r
+ PUSH P,[0] ; SAY WE ARE OLD SLOW SAVE\r
+SAVE1: SKIPG MUDSTR+2 ; DON'T SAVE FROM EXPERIMENTAL MUDDLE\r
+ JRST EXPVRS\r
+ PUSH P,[0] ; GC OR NOT?\r
+IFE ITS,[\r
+ MOVE B,[400600,,]\r
+ MOVE C,[440000,,100000]\r
+]\r
+ PUSHJ P,GTFNM ; GET THE FILE NAME ONTO P\r
+ JRST .+2\r
+ JRST SAVEON\r
+ JUMPGE AB,TMA ; TOO MUCH STRING\r
+ GETYP 0,(AB) ; WHAT IS ARG\r
+ CAMGE AB,[-3,,0] ; NOT TOO MANY\r
+ JRST TMA\r
+ CAIN 0,TFALSE\r
+IFN ITS, SETOM -4(P) ; GC FLAG\r
+IFE ITS, SETOM (P)\r
+SAVEON:\r
+IFN ITS,[\r
+ MOVSI A,7 ; IMAGE BLOCK OUT\r
+ HRR A,-2(P) ; DEVICE\r
+ PUSH P,A\r
+ PUSH P,[SIXBIT /_MUDS_/]\r
+ PUSH P,[SIXBIT />/]\r
+ MOVEI A,-2(P) ; POINT TO BLOCK\r
+ PUSHJ P,MOPEN ; ATTEMPT TO OPEN\r
+ JRST CANTOP\r
+ SUB P,[3,,3] ; FLUSH OPEN BLOCK\r
+ PUSH P,-4(P) ; GC FLAG TO TOP OF STACK\r
+]\r
+ EXCH A,(P) ; CHAN TO STACK GC TO A\r
+ JUMPL A,.+2\r
+ MCALL 0,GC\r
+\r
+; NOW GET VERSION OF MUDDLE FOR COMPARISON\r
+\r
+ MOVE A,MUDSTR+2 ; GET #\r
+ MOVEI B,177 ; CHANGE ALL RUBOUT CHARACTERS\r
+ MOVEI C,40 ; ----- TO SPACES\r
+ PUSHJ P,HACKV\r
+\r
+ PUSHJ P,WRDOUT\r
+ MOVEI A,0 ; WRITE ZERO IF FAST\r
+IFN ITS, SKIPE -6(P)\r
+IFE ITS, SKIPE -1(P)\r
+ PUSHJ P,WRDOUT\r
+ MOVE A,VECTOP ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE\r
+ PUSHJ P,WRDOUT\r
+\r
+IFN ITS,[\r
+ SETZB A,B ; FIRST, ALL INTS OFF\r
+ .SETM2 A,\r
+ SKIPE DISXTR ; IF HAVE DISPLAY, CLOSE IT\r
+ .DSTOP ; STOP THE E&S IF RUNNING\r
+\r
+; IF FAST SAVE JUMP OFF HERE\r
+\r
+ SKIPE -6(P)\r
+ JRST FSAVE1\r
+\r
+; NOW DUMP OUT GC SPACE\r
+ MOVEI A,E+1 ; ADDRESS OF FIRST NON-SCRATCH WORD\r
+ POP P,0 ; CHAN TO 0\r
+ LSH 0,23. ; POSITION\r
+ IOR 0,[.IOT A]\r
+]\r
+\r
+IFE ITS,[\r
+ MOVEI A,400000 ; FOR THIS PROCESS\r
+ DIR ; TURN OFF INT SYSTEM\r
+\r
+; IF FAST, LEAVE HERE\r
+\r
+ SKIPE -1(P)\r
+ JRST FSAVE1\r
+\r
+; NOW DUMP OUT GC SPACE\r
+ POP P,0 ; RESTORE JFN\r
+ MOVE A,[-<P-E>,,E] ; NUMBER OF ACS TO GO\r
+ PUSH P,(A)\r
+ AOBJN A,.-1\r
+ MOVE A,0\r
+ MOVE B,P\r
+ BOUT\r
+ MOVEI A,20 ; START AT LOCN 20\r
+]\r
+DMPLP1: MOVEI B,(A) ; POINT TO START OF STUFF\r
+ SUB B,VECTOP ; GET BLOCK LENGTH\r
+ MOVSI B,(B)\r
+ HRRI B,(A) ; HAVE IOT POINTER\r
+ SKIPL B ; SKIP IF OK AOBJN POINTER\r
+ HRLI B,400000 ; OTHER WISE AS MUCH AS POSSIBLE\r
+\r
+; MAIN NON-ZERO DUMPING LOOP\r
+\r
+DMPLP: SKIPN C,(B) ; FIND FIRST NON-ZERO\r
+ AOBJN B,.-1\r
+ JUMPGE B,DMPDON ; NO MORE TO SCAN\r
+\r
+DMP4: MOVEI E,(B) ; FOUND ONE, SAVE POINTER TO IT\r
+DMP3: MOVSI D,-5 ; DUPLICATE COUNTER SETUP\r
+\r
+DMP1: CAMN C,(B) ; IS NEXT SAME AS THIS?\r
+ JRST CNTDUP ; COUNT DUPS\r
+ MOVSI D,-5 ; RESET COUNTER\r
+ SKIPE C,(B) ; SEARCH FOR ZERO\r
+DMP5: AOBJN B,DMP1 ; COUNT AND GO\r
+ JUMPGE B,DMP2 ; JUMP IF BLOCK FINISHED\r
+\r
+ AOBJP B,DMP2 ; CHECK FOR LONE ZERO\r
+ SKIPE C,(B)\r
+ JRST DMP1 ; LONE ZERO, DONT END BLOCK\r
+\r
+DMP2: MOVEI D,(E) ; START COMPUTING OUTPUT IOT\r
+ SUBI D,(B) ; D=> -LNTH OF BLOCK\r
+ HRLI E,(D) ; E=> AOBJN PNTR TO OUTPUT\r
+IFN ITS,[\r
+ HRROI A,E ; MAKE AN IOT POINTER TO IT\r
+ XCT 0 ; WRITE IT\r
+ MOVE A,E ; NOW FOR THE BLOCK\r
+ XCT 0 ; ZAP!, OUT IT GOES\r
+]\r
+IFE ITS,[\r
+ EXCH E,B ; AOBJN TO B\r
+ MOVE A,0 ; JFN TO A\r
+ BOUT ; WRITE IT\r
+ MOVE D,B ; SAVE POINTER\r
+ HRLI B,444400 ; BYTPE POINTER\r
+ HLRE C,D ; # OF BYTES\r
+ SOUT\r
+]\r
+; NOW COMPUTE A CKS\r
+\r
+IFN ITS,[\r
+ MOVE D,E ; FIRST WORD OF CKS\r
+ ROT E,1\r
+ ADD E,(D)\r
+ AOBJN D,.-2 ; COMP CKS\r
+ HRROI A,E\r
+ XCT 0 ; WRITE OUT THE CKS\r
+]\r
+IFE ITS,[\r
+ MOVE B,D\r
+ ROT B,1\r
+ ADD B,(D)\r
+ AOBJN D,.-2\r
+ BOUT\r
+ MOVE B,E ; MAIN POINTER BACK\r
+]\r
+\r
+DMP7: JUMPL B,DMPLP ; MORE TO DO?\r
+DMPDON: SUB B,VECTOP ; DONE?\r
+ JUMPGE B,DMPDN1 ; YES, LEAVE\r
+IFN ITS, MOVEI A,400000+PVP ; POINT TO NEXT WORD TO GO\r
+IFE ITS, MOVEI A,400020\r
+ JRST DMPLP1\r
+IFN ITS,[\r
+DMPDN1: HRROI A,[-1]\r
+ XCT 0 ; EOF\r
+DMPDN2: SETZB A,B ; SET UP RENAME WHILE OPEN ETC.\r
+ MOVE E,(P)\r
+ MOVE D,-1(P)\r
+ LDB C,[270400,,0] ; GET CHANNEL\r
+ .FDELE A ; RENAME IT\r
+ FATAL SAVE RENAME FAILED\r
+ XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO A CLOSE\r
+ XCT 0\r
+\r
+ MOVE A,MASK1 ; TURN INTS BACK ON\r
+ MOVE B,MASK2\r
+ .SETM2 A,\r
+ SKIPE DISXTR ; SKIP IF NO E&S\r
+ .DCONTINUE ; RESTART THE E&S IF WE HAVE IT\r
+]\r
+\r
+IFE ITS,[\r
+DMPDN1: MOVNI B,1\r
+ MOVE A,0 ; WRITE EOF\r
+ BOUT\r
+DMPDN2: MOVE A,0\r
+ CLOSF\r
+ FATAL CANT CLOSE SAVE FILE\r
+ CIS ; CLEAR IT SYSTEM\r
+ MOVEI A,400000\r
+ EIR ; AND RE-ENABLE\r
+]\r
+\r
+SDONE: MOVE A,$TCHSTR\r
+ MOVE B,CHQUOTE SAVED\r
+ JRST FINIS\r
+\r
+; SCAN FOR MANY OCCURENCES OF THE SAME THING\r
+\r
+CNTDUP: AOBJN D,DMP5 ; 4 IN A ROW YET\r
+ CAIN E,-4(B) ; ANY PARTIAL BLOCK?\r
+ JRST DMP6 ; NO, DUMP THESE\r
+ SUB B,[4,,4] ; BACK UP POINTER\r
+ JRST DMP2\r
+DMP6: CAMN C,(B) ; FIND ALL CONTIG\r
+ AOBJN B,.-1\r
+ MOVEI D,(B) ; COMPUTE COUNT\r
+ SUBI D,(E)\r
+ MOVSI D,(D)\r
+ HRRI D,(E) ; HEADER\r
+IFN ITS,[\r
+ HRROI A,D\r
+ XCT 0\r
+ HRROI A,C ; WRITE THE WORD\r
+ XCT 0\r
+]\r
+IFE ITS,[\r
+ MOVE A,0\r
+ EXCH D,B\r
+ BOUT\r
+ MOVE B,C\r
+ BOUT\r
+ MOVE B,D\r
+] JRST DMP7\r
+\r
+; HERE TO WRITE OUT FAST SAVE FILE\r
+\r
+FSAVE1: MOVE A,PARTOP ; DONT WRITE OUT "HOLE"\r
+ ADDI A,1777\r
+ ANDCMI A,1777\r
+ MOVEI E,(A)\r
+ PUSHJ P,WRDOUT\r
+ MOVE A,VECBOT\r
+ ANDCMI A,1777\r
+ HRLI E,(A)\r
+ PUSHJ P,WRDOUT\r
+ POP P,0 ; CHANNEL TO 0\r
+IFN ITS,[\r
+ ASH 0,23. ; TO AC FIELS\r
+ IOR 0,[.IOT A]\r
+ MOVEI A,5 ; START AT WORD 5\r
+]\r
+IFE ITS,[\r
+ MOVE A,[-<P-E>,,E]\r
+ PUSH P,(A)\r
+ AOBJN A,.-1\r
+ MOVE A,0\r
+ MOVE B,P ; WRITE OUT P FOR WIINAGE\r
+ BOUT\r
+ MOVE B,[444400,,20]\r
+ MOVNI C,20-6\r
+ SOUT ; MAKE PAGE BOUNDARIES WIN\r
+ MOVEI A,20 ; START AT 20\r
+]\r
+ MOVEI B,(E) ; PARTOP TO B\r
+ PUSHJ P,FOUT ; WRITE OUT UP TO PAIR TOP\r
+ HLRZ A,E ; VECBOT TO A\r
+ MOVE B,VECTOP ; AND THE REST\r
+ PUSHJ P,FOUT\r
+ JRST DMPDN2\r
+\r
+IFN ITS,[\r
+FOUT: MOVEI D,(A) ; SAVE START\r
+ SUB A,B ; COMPUTE LH OF IOT PNTR\r
+ MOVSI A,(A)\r
+ SKIPL A ; IF + MEANS GROSS CORE SIZE\r
+ MOVSI A,400000 ; USE BIGGEST\r
+ HRRI A,(D)\r
+ XCT 0 ; ZAP, OUT IT GOES\r
+ CAMGE A,B ; SKIP IF ALL WENT\r
+ JRST FOUT ; DO THE REST\r
+ POPJ P, ; GO CLOSE FILE\r
+]\r
+IFE ITS,[\r
+FOUT: MOVEI C,(A)\r
+ SUBI C,(B) ; # OF BYTES TP C\r
+ MOVEI B,(A) ; START TO B\r
+ HRLI B,444400\r
+ MOVE A,0\r
+ SOUT ; WRITE IT OUT\r
+ POPJ P,\r
+]\r
+ \r
+\r
+; HERE TO ATTEMPT TO RESTORE A SAVED STATE\r
+\r
+MFUNCTION RESTORE,SUBR\r
+\r
+ ENTRY\r
+ SKIPG MUDSTR+2 ; DON'T RESTORE FROM EXPERIMENTAL MUDDLE\r
+ JRST EXPVRS\r
+IFE ITS,[\r
+ MOVE B,[100600,,]\r
+ MOVE C,[440000,,240000]\r
+]\r
+ PUSHJ P,GTFNM\r
+ JRST TMA\r
+IFN ITS,[\r
+ MOVEI A,6 ; READ/IMAGE/BLOCK\r
+ HRLM A,-2(P)\r
+ MOVEI A,-2(P)\r
+ PUSHJ P,MOPEN ; OPEN THE LOSER\r
+ JRST FNF\r
+ SUB P,[4,,4] ; REMOVE OPEN BLOCK\r
+\r
+ PUSH P,A ; SAVE CHANNEL\r
+ PUSHJ P,SGSNAM ; SAVE SNAME IN SYSTEM\r
+]\r
+IFE ITS, PUSH P,A ; SAVE JFN\r
+ PUSHJ P,WRDIN ; READ MUDDLE VERSION\r
+ MOVEI B,40 ; CHANGE ALL SPACES\r
+ MOVEI C,177 ; ----- TO RUBOUT CHARACTERS\r
+ PUSHJ P,HACKV\r
+ CAME A,MUDSTR+2 ; AGREE ?\r
+ JRST BADVRS\r
+\r
+IFN ITS, MCALL 0,IPCOFF ; CLOSE ALL IPC CHANS\r
+ PUSHJ P,CLOSAL ; CLOSE CHANNELS\r
+IFN ITS,[\r
+ SETZB A,B ; KILL ALL POSSIBLE INTERRUPTION\r
+ .SETM2 A,\r
+]\r
+IFE ITS,[\r
+ MOVEI A,400000 ; DISABLE INTS\r
+ DIR ; INTS OFF\r
+]\r
+ PUSHJ P,PURCLN ; DONT KEEP PURE SHAREDNESS\r
+ POP P,A ; RETRIEVE CHANNEL\r
+ MOVE P,GCPDL\r
+ PUSH P,A ; AND SAVE IT ON A GOOD PDL\r
+ PUSHJ P,WRDIN ; READ A WORD (VECTOP) OR 0==>FAST I.E. MAP RESTORE\r
+ JUMPE A,FASTR\r
+ MOVEM A,VECTOP ; SAVE FOR LATER\r
+ ASH A,-10. ; TO BLOCKS\r
+ MOVE C,A ; SAVE A COPY\r
+ ADDI A,1 ; ROOM FOR GC PDL\r
+ PUSHJ P,P.CORE\r
+ PUSHJ P,NOCORE ; LOSE,LOSE, LOSE\r
+\r
+; NOW READY TO READ IN GC SPACE\r
+ POP P,0 ; GET CHAN\r
+ MOVEI E+1,0\r
+ MOVE B,[E+1,,E+2] ; BLT SETUP TO ZERO CORE\r
+ MOVE E,NOTTY\r
+ MOVE A,VECTOP\r
+ BLT B,-1+2000(A) ; THE WHOLE THING?\r
+IFN ITS,[\r
+ LSH 0,23.\r
+ IOR 0,[.IOT A] ; BUILD IOT\r
+]\r
+IFE ITS,[\r
+ MOVE A,0\r
+ BIN ; READ IN NEW "P"\r
+ MOVE P,B\r
+]\r
+LDLP:\r
+IFN ITS,[\r
+ HRROI A,B ; READ A HDR\r
+ XCT 0\r
+ JUMPL A,LD1 ; DONE\r
+]\r
+IFE ITS,[\r
+ MOVE A,0\r
+ BIN ; HDR TO B\r
+]\r
+ CAMN B,[-1]\r
+ JRST LD1\r
+\r
+ JUMPGE B,LDDUPS ; JUMP IF LOADING DUPS\r
+IFN ITS,[\r
+ MOVE A,B ; TO IOTER\r
+ XCT 0\r
+\r
+ MOVE C,B ; COMP CKS\r
+ ROT C,1\r
+ ADD C,(B)\r
+ AOBJN B,.-2 ; COMP AWAY\r
+\r
+ HRROI A,D ; GET FILES CKS\r
+ XCT 0\r
+ CAME D,C ; CHECK\r
+ FATAL RESTORE CHECKSUM ERROR\r
+ JRST LDLP ; LOAD MORE\r
+]\r
+IFE ITS,[\r
+ MOVE D,B ; SAVE\r
+ HLRE C,B\r
+ HRLI B,444400\r
+ MOVE A,0\r
+ SIN ; READ IN A BUNCH\r
+\r
+ MOVE B,D\r
+ ROT D,1\r
+ ADD D,(B)\r
+ AOBJN B,.-2\r
+\r
+ BIN ; READ STORED CKS\r
+ CAME D,B\r
+ FATAL RESTORE CHECKSUM ERROR\r
+ JRST LDLP\r
+]\r
+\r
+LDDUPS:\r
+IFN ITS,[\r
+ HRROI A,(B) ; READ 1ST IN PLACE\r
+ XCT 0\r
+]\r
+IFE ITS,[\r
+ MOVE D,B ; SAVE HDR\r
+ BIN ; READ WORD OF INTEREST\r
+ MOVEM B,(D)\r
+ MOVE B,D\r
+]\r
+ HLRZ A,B ; # TO A\r
+ HRLI B,(B) ; BUILD A BLT PONTER\r
+ ADDI B,1\r
+ ADDI A,-2(B)\r
+ BLT B,(A)\r
+ JRST LDLP\r
+\r
+LD1:\r
+IFN ITS,[\r
+ XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO CLOSE\r
+ XCT 0 ; AND DO IT\r
+]\r
+IFE ITS,[\r
+ MOVE A,0\r
+ CLOSF\r
+ JFCL\r
+FASTR1: MOVEI A,P-1\r
+ MOVEI B,P-1-E\r
+ POP P,(A)\r
+ SUBI A,1\r
+ SOJG B,.-2\r
+]\r
+\r
+IFN ITS,[\r
+FASTR1:\r
+]\r
+ MOVE A,VECTOP ; REAL CORE TOP\r
+ ADDI A,2000 ; ROOM FOR GC PDL\r
+ MOVEM A,P.TOP\r
+ MOVEM E,NOTTY ; SAVE TTY FLAG\r
+ PUSHJ P,PURCLN ; IN CASE RESTORED THING HAD PURE STUFF\r
+ PUSHJ P,INTINT ; USE NEW INTRRRUPTS\r
+\r
+; NOW CYCLE THROUGH CHANNELS\r
+ MOVE C,TVP\r
+ ADD C,[CHNL1+2,,CHNL1+2] ; POINT TO REAL CHANNELS SLOTS\r
+ PUSH TP,$TVEC\r
+ PUSH TP,C\r
+ PUSH P,[N.CHNS]\r
+\r
+CHNLP: SKIPN B,-1(C) ; GET CHANNEL\r
+ JRST NXTCHN\r
+ PUSHJ P,REOPN\r
+ PUSHJ P,CHNLOS\r
+ MOVE C,(TP) ; GET POINTER\r
+NXTCHN: ADD C,[2,,2] ; AND BUMP\r
+ MOVEM C,(TP)\r
+ SOSE (P)\r
+ JRST CHNLP\r
+\r
+ SKIPN C,CHNL0(TVP)+1 ; ANY PSUEDO CHANNELS\r
+ JRST RDONE ; NO, JUST GO AWAY\r
+ MOVSI A,TLIST ; YES, REOPEN THEM\r
+ MOVEM A,(TP)-1\r
+CHNLP1: MOVEM C,(TP) ; SAVE POINTER\r
+ SKIPE B,(C)+1 ; GET CHANNEL\r
+ PUSHJ P,REOPN\r
+ PUSHJ P,CHNLO1\r
+ MOVE C,(TP) ; GOBBLE POINTER\r
+ HRRZ C,(C) ; REST LIST OF PSUEDO CHANNELS\r
+ JUMPN C,CHNLP1\r
+\r
+RDONE: SUB TP,[2,,2]\r
+ SUB P,[1,,1]\r
+ PUSHJ P,TTYOPE\r
+IFN ITS,[\r
+ PUSHJ P,IPCBLS ;BLESS ALL THE IPC CHANNELS\r
+ PUSHJ P,SGSNAM ; GET SNAME\r
+ SKIPN A\r
+ .SUSET [.RSNAM,,A]\r
+ PUSHJ P,6TOCHS ; TO STRING\r
+ PUSH TP,A\r
+ PUSH TP,B\r
+ MCALL 1,SNAME\r
+]\r
+ PUSHJ P,%RUNAM\r
+ PUSHJ P,%RJNAM\r
+ MOVE A,$TCHSTR\r
+ MOVE B,CHQUOTE RESTORED\r
+ JRST FINIS\r
+\r
+FASTR:\r
+IFN ITS,[\r
+ PUSHJ P,WRDIN ; GET CORE TOP\r
+ ASH A,-10. ; TO PAGES\r
+ MOVEI B,(A) ; SAVE\r
+ ADDI A,1 ; ROOM FOR GC PDL\r
+ PUSHJ P,P.CORE ; GET ALL CORE\r
+ PUSHJ P,NOCORE ; LOSE RETURN\r
+ PUSHJ P,WRDIN ; GET PARTOP\r
+ ASH A,-10. ; TO PAGES\r
+ MOVEI E,(A)\r
+ PUSHJ P,WRDIN ; NOW GET VECBOT\r
+ ASH A,-10. ; TO PAGES\r
+ EXCH A,E ; AND SAVE IN E\r
+ MOVNS A\r
+ MOVSI A,(A) ; TO PAGE AOBJN\r
+ MOVE C,A ; COPY OF POINTER\r
+ MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND\r
+ MOVE D,(P) ; CHANNEL\r
+ DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,D,C]\r
+ FATAL CORBLK ON RESTORE LOSSAGE\r
+ SUBM E,B ; AOBJN LH TO E\r
+ HRLI E,(B) ; AOBJN TO CORE\r
+ HRLI C,(B) ; AND TO DISK\r
+ DOTCAL CORBLK,[[1000,,104000],[1000,,-1],E,D,C]\r
+ FATAL CORBLK ON RESTORE LOSSAGE\r
+ MOVSI A,(D) ; CHANNEL BACK\r
+ ASH A,5\r
+ MOVEI B,E ; WHERE TO STRAT IN FILE\r
+ IOR A,[.ACCESS B]\r
+ XCT A ; ACCESS TO RIGHT ACS\r
+ XOR A,[<.IOT B>#<.ACCESS B>]\r
+ MOVE B,[D-P-1,,E]\r
+ XCT A ; GET ACS\r
+ MOVE E,0 ; NO TTY FLAG BACK\r
+ XOR A,[<.IOT B>#<.CLOSE>]\r
+ XCT A\r
+]\r
+IFE ITS,[\r
+FASTR: POP P,A ; JFN TO A\r
+ BIN ; CORE TOP TO B\r
+ MOVE E,B ; SAVE\r
+ BIN ; PARTOP\r
+ MOVE D,B\r
+ BIN ; VECBOT\r
+ MOVE C,B\r
+ BIN ; SAVED P\r
+ MOVE P,B\r
+ MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND\r
+ HRL E,C ; SAVE VECTOP\r
+ MOVSI A,(A) ; JFN TO LH\r
+ MOVSI B,400000 ; FOR ME\r
+ MOVSI C,120400 ; FLAGS\r
+ ASH D,-9. ; PAGES TO D\r
+ PMAP\r
+ ADDI A,1\r
+ ADDI B,1\r
+ SOJG D,.-3\r
+\r
+ ASH E,-9. ; E==> CORTOP PAGE,,VECBOT PAGE\r
+ HLR B,E ; B NOW READY\r
+ MOVEI D,(E)\r
+ SUBI D,(B)\r
+ PMAP\r
+ ADDI A,1\r
+ ADDI B,1\r
+ SOJG D,.-3\r
+\r
+ HLRZS A\r
+ CLOSF\r
+ FATAL CANT CLOSE RESTORE FILE\r
+ MOVE E,0 ; NOTTY TO E\r
+]\r
+ MOVE A,PARTOP ; ZERO OUT NEW FREE\r
+ HRLI A,(A)\r
+ MOVE B,VECBOT\r
+ SETZM (A)\r
+ ADDI A,1\r
+ BLT A,-1(B) ; ZAP...YOU'RE ZERO\r
+ JRST FASTR1\r
+\r
+\r
+; HERE TO GROCK FILE NAME FROM ARGS\r
+\r
+GTFNM:\r
+IFN ITS,[\r
+ PUSH TP,$TPDL\r
+ PUSH TP,P\r
+\r
+ IRP A,,[DSK,MUDDLE,SAVE]\r
+ PUSH P,[SIXBIT /A/]\r
+ TERMIN\r
+ PUSHJ P,SGSNAM ; GET SNAME\r
+ PUSH P,A ; SAVE SNAME\r
+\r
+ JUMPGE AB,GTFNM1\r
+ PUSHJ P,RGPRS ; PARSE THESE ARGS\r
+ JRST .+2\r
+GTFNM1: AOS -4(P) ; SKIP RETURN\r
+\r
+ POP P,A ; GET SNAME\r
+ .SUSET [.SSNAM,,A]\r
+ MOVE A,-3(P) ; GET RET ADDR\r
+ HLRZS -2(P) ; FIXUP DEVICE SPEC\r
+ SUB TP,[2,,2]\r
+ JRST (A)\r
+\r
+; HERE TOO OUT 1 WORD\r
+\r
+WRDOUT: PUSH P,B\r
+ PUSH P,A\r
+ HRROI B,(P) ; POINT AT C(A)\r
+ MOVE A,-3(P) ; CHANNEL\r
+ PUSHJ P,MIOT ;WRITE IT\r
+POPJB: POP P,A\r
+ POP P,B\r
+ POPJ P,\r
+\r
+; HERE TO READ 1 WORD\r
+WRDIN==WRDOUT\r
+]\r
+IFE ITS,[\r
+ PUSH P,C\r
+ PUSH P,B\r
+ MOVE B,IMQUOTE SNM\r
+ PUSHJ P,IDVAL1\r
+ GETYP 0,A\r
+ CAIN 0,TUNBOU\r
+ MOVEI B,0\r
+ MOVEI A,(P)\r
+ PUSH P,[377777,,377777]\r
+ PUSH P,[-1,,[ASCIZ /DSK/]]\r
+ PUSH P,B\r
+ PUSH P,[-1,,[ASCIZ /MUDDLE/]]\r
+ PUSH P,[-1,,[ASCIZ /SAVE/]]\r
+ PUSH P,[0]\r
+ PUSH P,[0]\r
+ PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE\r
+ MOVE B,1(AB)\r
+ GTJFN\r
+ JRST FNF\r
+ SUB P,[9.,,9.]\r
+ POP P,B\r
+ OPENF\r
+ JRST FNF\r
+ ADD AB,[2,,2]\r
+ SKIPL AB\r
+ AOS (P)\r
+ POPJ P,\r
+\r
+WRDIN: PUSH P,B\r
+ MOVE A,-2(P) ; JFN TO A\r
+ BIN\r
+ MOVE A,B\r
+ POP P,B\r
+ POPJ P,\r
+\r
+WRDOUT: PUSH P,B\r
+ MOVE B,-2(P)\r
+ EXCH A,B\r
+ BOUT\r
+ EXCH A,B\r
+ POP P,B\r
+ POPJ P,\r
+]\r
+\r
+\r
+;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A\r
+HACKV: PUSH P,D\r
+ PUSH P,E\r
+ MOVE D,[440700,,A]\r
+ MOVEI E,5\r
+HACKV1: ILDB 0,D\r
+ CAIN 0,(B) ; MATCH ?\r
+ DPB C,D ; YES, CLOBBER\r
+ SOJG E,HACKV1\r
+ POP P,E\r
+ POP P,D\r
+ POPJ P,\r
+\r
+\r
+CANTOP: PUSH TP,$TATOM\r
+ PUSH TP,EQUOTE CANT-OPEN-OUTPUT-FILE\r
+ JRST CALER1\r
+\r
+FNF: PUSH TP,$TATOM\r
+ PUSH TP,EQUOTE FILE-NOT-FOUND\r
+ JRST CALER1\r
+\r
+BADVRS: PUSH TP,$TATOM\r
+ PUSH TP,EQUOTE MUDDLE-VERSIONS-DIFFER\r
+ JRST CALER1\r
+\r
+EXPVRS: PUSH TP,$TATOM\r
+ PUSH TP,EQUOTE EXPERIMENTAL-MUDDLE-VERSION\r
+ JRST CALER1\r
+\r
+CHNLO1: MOVE C,(TP)\r
+ SETZM 1(C)\r
+ JRST CHNLO2\r
+\r
+CHNLOS: MOVE C,(TP)\r
+ SETZM (C)-1\r
+CHNLO2: MOVEI B,[ASCIZ /\r
+CHANNEL-NOT-RESTORED\r
+/]\r
+ JRST MSGTYP"\r
+\r
+\r
+NOCORE: PUSH P,A\r
+ PUSH P,B\r
+ MOVEI B,[ASCIZ /\r
+WAIT, CORE NOT YET HERE\r
+/]\r
+ PUSHJ P,MSGTYP"\r
+ MOVE A,(P) ; RESTORE BLOCKS NEEDED\r
+ MOVEI B,1\r
+ .SLEEP B,\r
+ PUSHJ P,P.CORE\r
+ JRST .-4\r
+ MOVEI B,[ASCIZ /\r
+CORE ARRIVED\r
+/]\r
+ PUSHJ P,MSGTYP\r
+ POP P,B\r
+ POP P,A\r
+ POPJ P,\r
+END\r
+\f\f
\ No newline at end of file