Split up files.
[pdp10-muddle.git] / sumex / save.mcr083
diff --git a/sumex/save.mcr083 b/sumex/save.mcr083
new file mode 100644 (file)
index 0000000..4808df7
--- /dev/null
@@ -0,0 +1,749 @@
+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