1
0
mirror of https://github.com/PDP-10/its.git synced 2026-04-28 12:57:56 +00:00

Rename to ITS conventions.

MIDAS and Muddle source get version numbers (as in the 1973 Muddle
source); the build files don't.
This commit is contained in:
Adam Sampson
2018-04-23 15:35:34 +01:00
committed by Adam Sampson
parent 8eb73e1b95
commit a81db26a7a
51 changed files with 0 additions and 0 deletions

799
src/mudsys/save.176 Normal file
View File

@@ -0,0 +1,799 @@
TITLE SAVE AND RESTORE STATE OF A MUDDLE
RELOCATABLE
.INSRT DSK:MUDDLE >
SYSQ
UNTAST==0
IFE ITS,[
IF1,[
.INSRT STENEX >
EXPUNGE SAVE
]
]
.GLOBAL MOPEN,MIOT,MCLOSE,MUDSTR,SWAP,STRTO6,GCPDL,RGPRS,ADDNUL,GCSTOP,PHIBOT
.GLOBAL CHNL0,CHNL1,REOPN,AGC,SWAPIN,MASK1,MASK2,IPCBLS,DEMFLG,FSTART,CKVRS
.GLOBAL P.CORE,P.TOP,SGSNAM,%RUNAM,%RSNAM,%RJNAM,INTINT,CLOSAL,TTYOPE,PURBOT,CHKPGI
.GLOBAL NOTTY,PURCLN,6TOCHS,DISXTR,IDVAL1,N.CHNS,PMAPB,PURTOP,HITOP,FRETOP,FREMIN
.GLOBAL SQKIL,SFRK,GETJS,IJFNS,IJFNS1,MULTSG,MULTI,NOMULT,THIBOT
.GLOBAL MAPJFN,DIRCHN
FME==1000,,-1
FLS==1000,,
MFORK==400000
MFUNCTION FSAVE,SUBR
ENTRY
JRST SAVE1
MFUNCTION SAVE,SUBR
ENTRY
SAVE1: PUSHJ P,SQKIL
IFE ITS,[
SKIPE MULTSG
PUSHJ P,NOMULT
]
PUSH P,.
PUSH P,[0] ; GC OR NOT?
IFE ITS,[
MOVE B,[400600,,]
MOVE C,[440000,,100000]
]
PUSHJ P,GTFNM ; GET THE FILE NAME ONTO P
JRST .+2
JRST SAVEON
JUMPGE AB,TMA ; TOO MUCH STRING
GETYP 0,(AB) ; WHAT IS ARG
CAMGE AB,[-3,,0] ; NOT TOO MANY
JRST TMA
CAIN 0,TFALSE
IFN ITS, SETOM -6(P) ; GC FLAG
IFE ITS, SETOM (P)
SAVEON:
IFN ITS,[
MOVSI A,7 ; IMAGE BLOCK OUT
MOVEM A,-4(P) ; DIRECTION
PUSH P,A
PUSH P,-4(P) ; DEVICE
PUSH P,[SIXBIT /_MUDS_/]
PUSH P,[SIXBIT />/]
PUSH P,-4(P) ; SNAME
MOVEI A,-4(P) ; POINT TO BLOCK
PUSHJ P,MOPEN ; ATTEMPT TO OPEN
JRST CANTOP
SUB P,[5,,5] ; FLUSH OPEN BLOCK
PUSH P,-6(P) ; GC FLAG TO TOP OF STACK (-4 --> -6 TAA)
]
EXCH A,(P) ; CHAN TO STACK GC TO A
JUMPL A,NOGC
PUSH TP,$TFIX ; CAUSE HAIRY GC TO OCCUR
PUSH TP,[0]
PUSH TP,$TATOM
PUSH TP,IMQUOTE T
MCALL 2,GC
NOGC: PUSHJ P,PURCLN
; NOW GET VERSION OF MUDDLE FOR COMPARISON
MOVE A,MUDSTR+2 ; GET #
MOVEI B,177 ; CHANGE ALL RUBOUT CHARACTERS
MOVEI C,40 ; ----- TO SPACES
PUSHJ P,HACKV
PUSHJ P,WRDOUT
MOVE A,P.TOP ; GET TOP OF CORD
PUSHJ P,WRDOUT
MOVEI A,0 ; WRITE ZERO IF FAST
IFN ITS, SKIPE -8(P) ; -6 --> -8 TAA
IFE ITS, SKIPE -1(P)
PUSHJ P,WRDOUT
MOVE A,VECTOP ; CORE REQUIREMENTS FOR THIS SAVED MUDDLE
PUSHJ P,WRDOUT
IFN ITS,[
SETZB A,B ; FIRST, ALL INTS OFF
.SETM2 A,
; IF FAST SAVE JUMP OFF HERE
SKIPE -6(P)
JRST FSAVE1
]
IFE ITS,[
MOVEI A,400000 ; FOR THIS PROCESS
DIR ; TURN OFF INT SYSTEM
; IF FAST, LEAVE HERE
SKIPE -1(P)
JRST FSAVE1
; NOW DUMP OUT GC SPACE
]
IFN ITS,[
DMPDN2: SETZB A,B ; SET UP RENAME WHILE OPEN ETC.
MOVE E,-1(P)
MOVE D,-2(P)
LDB C,[270400,,0] ; GET CHANNEL
.FDELE A ; RENAME IT
FATAL SAVE RENAME FAILED
XOR 0,[<.IOT A>#<.CLOSE>] ; CHANGE TO A CLOSE
XCT 0
MOVE A,MASK1 ; TURN INTS BACK ON
MOVE B,MASK2
.SETM2 A,
]
IFE ITS,[
DMPDN2: MOVE A,0
CLOSF
FATAL CANT CLOSE SAVE FILE
CIS ; CLEAR IT SYSTEM
MOVEI A,400000
EIR ; AND RE-ENABLE
]
SDONE: MOVE A,$TCHSTR
MOVE B,CHQUOTE SAVED
JRST FINIS
; SCAN FOR MANY OCCURENCES OF THE SAME THING
; HERE TO WRITE OUT FAST SAVE FILE
FSAVE1:
IFN UNTAST,[
PUSHJ P,PUCHK
]
MOVE A,PARTOP ; DONT WRITE OUT "HOLE"
ADDI A,1777
ANDCMI A,1777
MOVEI E,(A)
PUSHJ P,WRDOUT
MOVE 0,(P) ; CHANNEL TO 0
IFN ITS,[
ASH 0,23. ; TO AC FIELS
IOR 0,[.IOT A]
MOVEI A,5 ; START AT WORD 5
]
IFE ITS,[
MOVE A,[-<P-E>,,E]
PUSH P,(A)
AOBJN A,.-1
MOVE A,0
MOVE B,P ; WRITE OUT P FOR WIINAGE
BOUT
MOVE B,[444400,,20]
MOVNI C,20-6
SOUT ; MAKE PAGE BOUNDARIES WIN
MOVEI A,20 ; START AT 20
]
MOVEI B,(E) ; PARTOP TO B
PUSHJ P,FOUT ; WRITE OUT UP TO PAIR TOP
PUSHJ P,PUROUT
SUB P,[1,,1] ; CLEAN OFF STACK
JRST DMPDN2
IFN ITS,[
FOUT: MOVEI D,(A) ; SAVE START
SUB A,B ; COMPUTE LH OF IOT PNTR
MOVSI A,(A)
SKIPL A ; IF + MEANS GROSS CORE SIZE
MOVSI A,400000 ; USE BIGGEST
HRRI A,(D)
XCT 0 ; ZAP, OUT IT GOES
CAMGE A,B ; SKIP IF ALL WENT
JRST FOUT ; DO THE REST
POPJ P, ; GO CLOSE FILE
]
IFE ITS,[
FOUT: MOVEI C,(A)
SUBI C,(B) ; # OF BYTES TP C
MOVEI B,(A) ; START TO B
HRLI B,444400
MOVE A,0
SOUT ; WRITE IT OUT
POPJ P,
]
; HERE TO ATTEMPT TO RESTORE A SAVED STATE
MFUNCTION RESTORE,SUBR
ENTRY
PUSHJ P,SQKIL
IFE ITS,[
MOVE B,[100600,,]
MOVE C,[440000,,240000]
]
PUSHJ P,GTFNM
JRST TMA
IFN ITS,[
MOVSI A,6 ; READ/IMAGE/BLOCK
MOVEM A,-4(P)
MOVEI A,-4(P)
PUSHJ P,MOPEN ; OPEN THE LOSER
JRST FNF
SUB P,[6,,6] ; REMOVE OPEN BLOCK
PUSH P,A ; SAVE CHANNEL
PUSHJ P,SGSNAM ; SAVE SNAME IN SYSTEM
]
IFE ITS, PUSH P,A ; SAVE JFN
PUSHJ P,CKVRS ; CHECK THE VERSION NUMBER
IFN ITS, MCALL 0,IPCOFF ; CLOSE ALL IPC CHANS
PUSHJ P,CLOSAL ; CLOSE CHANNELS
IFN ITS,[
SETZB A,B ; KILL ALL POSSIBLE INTERRUPTION
.SETM2 A,
DOTCAL UNLOCK,[[1000,,-1]]
.VALUE ; UNLOCK LOCKS
]
IFE ITS,[
MOVEI A,400000 ; DISABLE INTS
DIR ; INTS OFF
; LOOP TO CLOSE ALL RANDOM JFNS
MOVE E,[-JFNLNT,,JFNTBL]
JFNLP: HRRZ A,@(E)
SKIPE A
CLOSF
JFCL
HLRZ A,@(E)
SKIPE A
CLOSF
JFCL
SETZM @(E)
AOBJN E,JFNLP
]
PUSHJ P,PURCLN ; DONT KEEP PURE SHAREDNESS
POP P,E
IFE ITS,[
MOVEI C,0
MOVNI A,1
MOVE B,[MFORK,,1]
MOVEI D,THIBOT-1
PMAP
ADDI B,1
SOJG D,.-2
SKIPLE A,SFRK ; IF WE HAVE AN INFERIOR, KILL IT
KFORK
]
MOVE A,E
FSTART: MOVE P,GCPDL
PUSH P,A
IFN ITS,[
MOVE 0,[1-PHIBOT,,1]
DOTCAL CORBLK,[[FLS],[FME],0]
FATAL CANT FLUSH PURE PAGES
]
PUSHJ P,WRDIN ; GET P.TOP
ASH A,-10.
MOVE E,A
PUSHJ P,WRDIN ; READ A WORD (VECTOP) OR 0==>FAST I.E. MAP RESTORE
JUMPE A,FASTR
IFE ITS,[
FASTR1: MOVEI A,P-1
MOVEI B,P-1-E
POP P,(A)
SUBI A,1
SOJG B,.-2
]
IFN ITS,[
FASTR1:
]
IFN ITS, MOVEM E,NOTTY ; SAVE TTY FLAG
IFE ITS,[
MOVEM E,DEMFLG
PUSHJ P,GETJS
HRRZS IJFNS
SETZM IJFNS1
]
PUSHJ P,PURCLN ; IN CASE RESTORED THING HAD PURE STUFF
PUSHJ P,INTINT ; USE NEW INTRRRUPTS
IFN ITS,[
.SUSET [.RSNAM,,A]
PUSH P,A
]
; NOW CYCLE THROUGH CHANNELS
MOVE C,[-N.CHNS*2,,CHNL1] ; POINT TO REAL CHANNELS SLOTS
PUSH TP,$TVEC
PUSH TP,C
PUSH P,[N.CHNS]
CHNLP: HRRE A,(C) ; SEE IF NEW VALUE
JUMPL A,NXTCHN
SKIPN B,1(C) ; GET CHANNEL
JRST NXTCHN
PUSHJ P,REOPN
PUSHJ P,CHNLOS
MOVE C,(TP) ; GET POINTER
NXTCHN: ADD C,[2,,2] ; AND BUMP
MOVEM C,(TP)
SOSE (P)
JRST CHNLP
SKIPN C,CHNL0+1 ; ANY PSUEDO CHANNELS
JRST RDONE ; NO, JUST GO AWAY
MOVSI A,TLIST ; YES, REOPEN THEM
MOVEM A,(TP)-1
CHNLP1: MOVEM C,(TP) ; SAVE POINTER
SKIPE B,(C)+1 ; GET CHANNEL
PUSHJ P,REOPN
PUSHJ P,CHNLO1
MOVE C,(TP) ; GOBBLE POINTER
HRRZ C,(C) ; REST LIST OF PSUEDO CHANNELS
JUMPN C,CHNLP1
RDONE: MOVE A,VECTOP
CAMN A,P.TOP
JRST NOCOR
SETZM (A)
HRLS A
ADDI A,1 ; SET UP BLT POINTER
MOVE B,P.TOP
BLT A,-1(B) ; TO THE TOP OF THE WORLD
NOCOR: SUB TP,[2,,2]
SUB P,[1,,1]
PUSHJ P,TTYOPE
IFN ITS,[
PUSHJ P,IPCBLS ;BLESS ALL THE IPC CHANNELS
PUSHJ P,SGSNAM ; GET SNAME
SKIPN A
MOVE A,(P) ; GET OLD SNAME
SUB P,[1,,1]
PUSHJ P,6TOCHS ; TO STRING
]
IFE ITS,[
PUSHJ P,SGSNMQ ; SKIPS IF SNAME IS NON-NIL
PUSHJ P,%RSNAM ; ELSE GETS "REAL" SNAME
PUSH TP,A
PUSH TP,B
MCALL 1,SNAME
SETOM SFRK
]
PUSHJ P,%RUNAM
PUSHJ P,%RJNAM
IFE ITS,[
MOVEI A,400000
MOVE B,[1,,ILLUUO]
MOVE C,[40,,UUOH]
SCVEC
]
MOVE A,$TCHSTR
MOVE B,CHQUOTE RESTORED
JRST FINIS
IFE ITS,[
;SKIPS IF THERE IS AN SNAME, RETURNING IT
SGSNMQ: MOVE B,IMQUOTE SNM
PUSHJ P,IDVAL1
GETYP 0,A
CAIE 0,TCHSTR
JRST CPOPJ
HRRZ 0,A
JUMPE CPOPJ
JRST CPOPJ1
]
FASTR:
IFN ITS,[
PUSHJ P,WRDIN
ADDI A,1777
ANDCMI A,1777 ; ROUND AND TO PAGE BOUNDRY
ASH A,-10. ; TO PAGES
MOVNS A
MOVSI A,(A) ; TO PAGE AOBJN
MOVE C,A ; COPY OF POINTER
MOVE 0,NOTTY ; SAVE NOTTY FLAG AROUND
MOVE D,(P) ; CHANNEL
DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,D,C]
FATAL CORBLK ON RESTORE LOSSAGE
PUSHJ P,PURIN ; GET PURIFIED STRUCTURE
MOVSI A,(D) ; GET CHANNLEL BACK
ASH A,5
MOVEI B,E ; WHERE TO STRAT IN FILE
IOR A,[.ACCESS B]
XCT A ; ACCESS TO RIGHT ACS
XOR A,[<.IOT B>#<.ACCESS B>]
MOVE B,[D-P-1,,E]
XCT A ; GET ACS
MOVE E,0 ; NO TTY FLAG BACK
XOR A,[<.IOT B>#<.CLOSE>]
XCT A
MOVE A,GCSTOP ; GET CORE AND FOOL P.CORE
ADDI A,1777
ANDCMI A,1777
EXCH A,P.TOP ; GET P.TOP
ASH A,-10. ; TO PAGES
PUSHJ P,P.CORE
PUSHJ P,NOCORE
JRST FASTR1
]
IFE ITS,[
FASTR: POP P,A ; JFN TO A
BIN ; CORE TOP TO B
MOVE E,B ; SAVE
BIN ; PARTOP
MOVE D,B
BIN ; SAVED P
MOVE P,B
MOVE 0,DEMFLG ; SAVE DEMFLG FLAG AROUND
HRL E,C ; SAVE VECTOP
MOVSI A,(A) ; JFN TO LH
MOVSI B,400000 ; FOR ME
MOVSI C,120400 ; FLAGS
ASH D,-9. ; PAGES TO D
PMAP
ADDI A,1
ADDI B,1
SOJG D,.-3
PUSHJ P,PURIN
HLRZS A
CLOSF
JFCL
MOVE E,0 ; DEMFLG TO E
JRST FASTR1
]
; HERE TO GROCK FILE NAME FROM ARGS
GTFNM:
IFN ITS,[
PUSH P,[0] ; DIRECTION
PUSH TP,$TPDL
PUSH TP,P
IRP A,,[DSK,MUDDLE,SAVE]
PUSH P,[SIXBIT /A/]
TERMIN
PUSHJ P,SGSNAM ; GET SNAME
PUSH P,A ; SAVE SNAME
JUMPGE AB,GTFNM1
PUSHJ P,RGPRS ; PARSE THESE ARGS
JRST .+2
GTFNM1: AOS -5(P) ; SKIP RETURN
MOVE A,(P) ; GET SNAME
.SUSET [.SSNAM,,A]
MOVE A,-5(P) ; GET RET ADDR
SUB TP,[2,,2]
JRST (A)
; HERE TO OUTPUT 1 WORD
WRDOUT: PUSH P,B
PUSH P,A
HRROI B,(P) ; POINT AT C(A)
MOVE A,-3(P) ; CHANNEL
PUSHJ P,MIOT ;WRITE IT
POPJB: POP P,A
POP P,B
POPJ P,
; HERE TO READ 1 WORD
WRDIN==WRDOUT
]
IFE ITS,[
PUSH P,C
PUSH P,B
MOVE B,IMQUOTE SNM
PUSHJ P,IDVAL1
GETYP 0,A
CAIN 0,TUNBOU
JRST GTFNM0
TRNN A,-1 ;ANY LENGTH?
PUSHJ P,%RSNAM ;IF <SNAME> IS "", GET REAL ONE
PUSHJ P,ADDNUL
SKIPA
GTFNM0: MOVEI B,0
PUSH P,[377777,,377777]
PUSH P,[-1,,[ASCIZ /DSK/]]
PUSH P,B
PUSH P,[-1,,[ASCIZ /MUDDLE/]]
PUSH P,[-1,,[ASCIZ /SAVE/]]
PUSH P,[0]
PUSH P,[0]
PUSH P,[77] ; USE AN OBSCURE JFN IF POSSIBLE
MOVE A,(AB)
MOVE B,1(AB)
PUSHJ P,ADDNUL
MOVEI A,-10(P)
GTJFN
JRST FNF
SUB P,[9.,,9.]
POP P,B
OPENF
JRST FNF
ADD AB,[2,,2]
SKIPL AB
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
WRDIN: PUSH P,B
MOVE A,-2(P) ; JFN TO A
BIN
MOVE A,B
POP P,B
POPJ P,
WRDOUT: PUSH P,B
MOVE B,-2(P)
EXCH A,B
BOUT
EXCH A,B
POP P,B
POPJ P,
]
;REPLACE ALL OCCURANCES OF CHARACTER (B) TO CHARACTER (C) IN A
HACKV: PUSH P,D
PUSH P,E
MOVE D,[440700,,A]
MOVEI E,5
HACKV1: ILDB 0,D
CAIN 0,(B) ; MATCH ?
DPB C,D ; YES, CLOBBER
SOJG E,HACKV1
POP P,E
POP P,D
POPJ P,
CANTOP: ERRUUO EQUOTE CANT-OPEN-OUTPUT-FILE
FNF: ERRUUO EQUOTE FILE-NOT-FOUND
BADVRS: ERRUUO EQUOTE MUDDLE-VERSIONS-DIFFER
CHNLO1: MOVE C,(TP)
SETZM 1(C)
JRST CHNLO2
CHNLOS: MOVE C,(TP)
MOVE B,1(C)
SETZM 1(B) ; CLOBBER CHANNEL #
SETZM 1(C)
CHNLO2: MOVEI B,[ASCIZ /
CHANNEL-NOT-RESTORED
/]
JRST MSGTYP"
IFN ITS,[
NOCORE: PUSH P,A
PUSH P,B
MOVEI B,[ASCIZ /
WAIT, CORE NOT YET HERE
/]
PUSHJ P,MSGTYP"
MOVE A,-1(P) ; RESTORE BLOCKS NEEDED
MOVEI B,1
.SLEEP B,
PUSHJ P,P.CORE
JRST .-4
MOVEI B,[ASCIZ /
CORE ARRIVED
/]
PUSHJ P,MSGTYP
POP P,B
POP P,A
POPJ P,
]
IFN UNTAST,[
PUCHK: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
ASH E,-10. ; TO PAGES
MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
ASH A,-10. ; TO PAGES
PURCH1: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
JFCL
ADDI A,1 ; INCREMENT PAGE COUNTER
CAMG A,E ; SKIP IF DONE
JRST PURCH1
POPJ P,
]
; THESE ROUTINES ARE USED BY SAVE AND RESTORE TO GET PAGES OF PURE STRUCTURE
; INTO A SAVE FILE.
PUROUT: MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
ASH E,-10. ; TO PAGES
MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
ASH A,-10. ; TO PAGES
PUROU2: PUSHJ P,CHKPGI ; SEE IF PAGE IS PURIFIED
JRST INCPUT
PUSH P,A ; SAVE A
ASH A,10. ; TO WORDS
HRLI A,-2000 ; MAKE UP AOBJN PTR FOR IOT
MOVE B,-2(P) ; RESTORE CHN #
IFN ITS,[
DOTCAL IOT,[B,A]
FATAL SAVE--IOT FAILED
]
IFE ITS,[
PUSH P,C ; SAVE C
MOVE B,A ; SET UP BYTE POINTER
MOVE A,0 ; CHANNEL TO A
HRLI B,444400 ; SET UP BYTE POINTER
MOVNI C,2000
SOUT ; OUT IT GOES
POP P,C
]
POP P,A ; RESTORE PAGE #
INCPUT: ADDI A,1 ; INCREMENT PAGE COUNTER
CAMG A,E ; SKIP IF DONE
JRST PUROU2
POPJ P,
IFN UNTAST,[
CHKPGJ: TDZA 0,0
]
CHKPGI:
IFN UNTAST,[
MOVEI 0,1
]
PUSH P,A ; SAVE IT
IDIVI A,16. ; FIND ENTRY IN PMAP TABLE
MOVE C,PMAPB(A) ; GET WORD CONTAINING ENTRY
HRLZI D,400000 ; SET UP TEST WORD
IMULI B,2
MOVNS B
LSH D,(B) ; GET TO CHECK PAIR
LSH D,-1 ; TO BIT INDICATING SAVE
TDON C,D ; SKIP IF PAGE CONTAINS P.S
JRST PUROU1
POP P,A
AOS (P) ; SKIP ITS A WINNER
IFN UNTAST,[
JUMPN 0,.+4
LSH D,1
TDNN C,D
AOS (P)
] POPJ P, ; EXIT
PUROU1:
IFN UNTAST,[
JUMPE 0,CHKPG2
IFN ITS,[
PUSH P,A
DOTCAL CORTYP,[A,[2000,,A],[2000,,0]]
FATAL DOTCAL FAILURE
SKIPN A
MOVEI 0,0
POP P,A
JUMPGE 0,CHKPG2
]
IFE ITS,[
PUSH P,A
PUSH P,B
LSH A,1
HRLI A,400000
RPACS
MOVE 0,B
POP P,B
POP P,A
TLC 0,150400
TRNE 0,150400
JRST CHKPG2
]
LSH D,1
TDO C,D
MOVEM C,PMAPB(A)
AOS -1(P)
CHKPG2:]
POP P,A
POPJ P,
; ROUTINE TO READ IN PURE STRUCTURE PAGES
IFN ITS,[
PURIN: PUSH P,D ; SAVE CHANNEL #
MOVEI E,HIBOT ; COMPUTE REAL START OF INTERPRETER
ASH E,-10. ; TO PAGES
MOVE A,PURTOP ; GET START TO POSSIBLE AREA CONTAINING P.S.
ASH A,-10. ; TO WORDS
PURIN1:
IFN UNTAST, PUSHJ P,CHKPGJ ; SEE IF PURE PAGE EXISTS
IFE UNTAST, PUSHJ P,CHKPGI ; SEE IF PURE PAGE EXISTS
JRST NXPGPN
IFN UNTAST,[
SKIPA D,[200000]
MOVEI D,[104000]
MOVSI 0,(D)
]
PUSH P,A ; SAVE A
MOVE D,-1(P) ; RESTORE CHANNEL #
HRLI A,-1 ; SET UP AOBJN POINTER FOR DOTCAL
IFN UNTAST,[
DOTCAL CORBLK,[0,[1000,,-1],A,D]
]
IFE UNTAST,[
DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,D]
]
FATAL SAVE--CORBLK FAILED
POP P,A ; RESTORE A
NXPGPN: ADDI A,1
CAMG A,E ; SKIP IF DONE
JRST PURIN1
POP P,D ; RESTORE CHANNEL
POPJ P,
]
IFE ITS,[
PURIN: PUSH P,A ; SAVE CHANNEL
MOVEI E,HIBOT ; TOP OF SCAN
ASH E,-10.
MOVE A,PURBOT ; BOTTOM OF SCAN
ASH A,-10. ; TO PAGES
PURIN1: PUSHJ P,CHKPGI ; SEE IF PAGE IS NEEDED
JRST NXTPGN
SKIPA C,[120000]
MOVEI C,120400
PUSH P,A
MOVE B,A ; COPY TO B
ASH B,1 ; FOR TEXEX PAGES
HRLI B,MFORK ; SET UP ARGS TO PMAP
MOVSI C,(C)
MOVE A,-1(P) ; GET FILE POINTER
PMAP ; IN IT COMES
ADDI B,1 ; INCREMENT B
ADDI A,1 ; AND A
PMAP ; SECOND HALF OF ITS PAGE
ADDI A,1
MOVEM A,-1(P) ; SAVE FILE PAGE
POP P,A
NXTPGN: ADDI A,1
CAMG A,E ; SKIP IF DONE
JRST PURIN1
POP P,A ; RESTOR CHANNEL
POPJ P, ;EXIT
]
CKVRS: PUSH P,-1(P)
PUSHJ P,WRDIN ; READ MUDDLE VERSION
MOVEI B,40 ; CHANGE ALL SPACES
MOVEI C,177 ; ----- TO RUBOUT CHARACTERS
PUSHJ P,HACKV
CAME A,MUDSTR+2 ; AGREE ?
JRST BADVRS
SUB P,[1,,1] ; POP OFF CHANNEL #
POPJ P,
IFE ITS,[
JFNTBL: SETZ IJFNS
SETZ IJFNS1
SETZ MAPJFN
SETZ DIRCHN
JFNLNT==.-JFNTBL
]
END