2 TITLE MAPURE-PAGE LOADER
6 MAPCH==0 ; channel for MAPing
9 .GLOBAL PURVEC,PURTOP,PURBOT,P.TOP,GCSTOP,FRETOP,MUDSTR,STRTO6,PLOAD,AGC,GCDOWN
10 .GLOBAL SQUTOA,IGVAL,IBLOCK,PURCLN,MOVPUR,GETPAG,GCFLG,NOSHUF,DIR,NDIRS,SQUPNT
11 .GLOBAL PLODR,SQUKIL,GETBUF,KILBUF,INPLOD,SQKIL,PVSTOR,TVSTOR,DSTOREM,SLEEPR
12 .GLOBAL OPSYS,SJFNS,MULTSG,PURBTB,SFIX,NSEGS
13 .GLOBAL C%11,C%22,C%33,C%44,C%55,C%66,C%0,C%1,C%2,C%3,C%M1,C%M2,C%M10
14 .GLOBAL C%M20,C%M30,C%M40,C%M60
44 ELN==4 ; LENGTH OF SLOT
45 FB.NAM==0 ; NAME SLOT IN TABLE
46 FB.PTR==1 ; Pointer to core pages
47 FB.AGE==2 ; age,,chain
48 FB.PGS==3 ; PTR AND LENGTH OF PAGE IN FILE
49 FB.AMK==37777777 ; extended address mask
50 FB.CNT==<-1>#<FB.AMK> ; page count mask
51 EOC==400000 ; END OF PURVEC CHAIN
54 .FHSLF==400000 ; THIS FORK
55 %GJSHT==000001 ; SHORT FORM GTJFN
58 PM%CNT==400000 ; PMAP WITH REPEAT COUNT
59 PM%RD==100000 ; PMAP WITH READ ACCESS
60 PM%EX==20000 ; PMAP WITH EXECUTE ACCESS (NO-OP ON 20X)
61 PM%CPY==400 ; PMAP WITH COPY-ON-WRITE ACCESS
62 PM%WR==40000 ; PMAP WITH WRITE ACCESS
65 OF%RD==200000 ; OPEN IN READ MODE
66 OF%WR==100000 ; OPEN IN WRITE MODE
67 OF%EX==040000 ; OPEN IN EXECUTE MODE (TENEX CARES)
68 OF%THW==02000 ; OPEN IN THAWED MODE
69 OF%DUD==00020 ; DON'T UPDATE THAWED PAGES
71 ; THIS ROUTINE TAKES A SLOT OFFSET IN REGISTER A AND MAPS IN THE ASSOCIATED
72 ; FILE. IT CLOBBERS ALL ACs AND SKIP RETURNS IF IT WINS.
74 OFF==-5 ; OFFSET INTO PURVEC OF SLOT
75 NAM==-4 ; SIXBIT NAME OF THING BEING LOADED
76 LASTC==-3 ; LAST CHARACTER OF THE NAME
77 DIR==-2 ; SAVED POINTER TO DIRECTORY
78 SPAG==-1 ; FIRST PAGE IN FILE
79 PGNO==0 ; FIRST PAGE IN CORE
80 VER==-6 ; VERSION NUMBER OF MUDDLE TO USE IN OPENING FILES
81 FLEN==-7 ; LENGTH OF THE FILE
82 TEMP==-10 ; GENERAL TEMPORARY SLOT
83 WRT==-11 ; INDICATION IF OPEN IS FOR WRITING OR READING
84 CADDR==-12 ; ADDRESS OF CORE IMAGE LOCATION OF FILE
87 ; IT FIRST LOOKS TO SEE IF IT HAS THE PAGE NUMBER OF THE FILE
89 PLOAD: ADD P,[NSLOTS,,NSLOTS]
100 PLOADX: PUSHJ P,SQKIL
102 ADD A,PURVEC+1 ; GET TO SLOT
103 SKIPE B,FB.PGS(A) ; SKIP IF PAGE NUMBER
108 MOVEI A,6 ; FIND LAST CHARACTER
109 TRNE 0,77 ; SKIP IF NOT DONE
111 LSH 0,-6 ; BACK A CHAR
112 SOJG A,.-3 ; NOW CHAR IS BACKED OUT
116 ; NOT TO TRY TO FIND FILE IN MAIN DATA BASE.
117 ; THE GC'S WINDOW IS USED IN THIS CASE.
120 .CALL MNBLK ; OPEN CHANNEL TO MAIN FILE
122 PUSHJ P,TRAGN ; TRY OPENING UP CHANNEL AGAIN IF POSSIBLE
126 JRST NTHERE ;who cares if no SAV.FILE?
133 PUSHJ P,GENVN ; GET VERSION # AS FIX
137 PUSHJ P,DIRSRC ; SEARCH DIRECTORY
138 JRST NTHERE ; GO TRY FIXING UP ITS NOT THERE
139 ANDI A,-1 ; WIN IN MULT SEG CASE
140 MOVE B,OFF(P) ; GET SLOT NUMBER
141 ADD B,PURVEC+1 ; POINT TO SLOT
142 HRRZ C,1(A) ; GET BLOCK NUMBER
143 HRRM C,FB.PGS(B) ; SMASH INTO SLOT
144 LDB C,[LNTBYT,,1(A)] ; SMASH IN LENGTH
145 HRLM C,FB.PGS(B) ; SMASH IN LENGTH
148 ; NOW TRY TO FIND FILE IN WORKING DIRECTORY
150 NTHERE: PUSHJ P,KILBUF
151 MOVE A,OFF(P) ; GET POINTER TO PURVEC SLOT
153 PUSHJ P,GENVN ; GET VERSION NUMBER
155 PUSHJ P,OPMFIL ; OPEN FILE
158 ; NUMBER OF PAGES ARE IN A
159 ; STARTING PAGE NUMBER IN SPAG(P)
161 PLOD1: PUSHJ P,ALOPAG ; get the necessary pages
163 MOVE E,SPAG(P) ; E starting page in file
166 MOVN A,FLEN(P) ; get neg count
167 MOVSI A,(A) ; build aobjn pointer
168 HRR A,PGNO(P) ; get page to start
169 MOVE B,A ; save for later
170 HRRI 0,(E) ; page pointer for file
171 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,[1000,,MAPCH],0]
173 .CLOSE MAPCH, ; no need to have file open anymore
176 MOVEI A,(E) ; First page on rh of A
177 HRL A,DIRCHN ; JFN to lh of A
178 HRLI B,.FHSLF ; specify this fork
179 MOVSI C,PM%RD+PM%EX ; bits for read/execute
180 MOVE D,FLEN(P) ; # of pages to D
181 HRROI E,(B) ; build page aobjn for later
182 TLC E,-1(D) ; sexy way of doing lh
185 JRST BLMAP ; if tops-20 can block PMAP
189 SOJG D,.-3 ; map 'em all
194 TLO C,PM%CNT ; say it is counted
195 PMAP ; one PMAP does the trick
198 ; now try to smash slot in PURVEC
200 PLOAD1: MOVE A,PURVEC+1 ; get pointer to it
201 ASH B,PGSHFT ; convert to aobjn pointer to words
202 MOVE C,OFF(P) ; get slot offset
203 ADDI C,(A) ; point to slot
204 MOVEM B,FB.PTR(C) ; clobber it in
205 TLZ B,(FB.CNT) ; isolate address of page
206 HRRZ D,PURVEC ; get offset into vector for start of chain
207 TRNE D,EOC ; skip if not end marker
209 HRLI D,400000+A ; set up indexed pointer
211 IFN ITS, HRRZ 0,@D ; get its address
216 JUMPE 0,SCHAIN ; no chain exists, start one
217 CAMLE 0,B ; skip if new one should be first
218 AOJA D,INLOOP ; jump into the loop
221 FCLOB: MOVE E,OFF(P) ; get offset for this guy
222 HRRM D,FB.AGE(C) ; link up
223 HRRM E,PURVEC ; store him away
226 SCHAIN: MOVEI D,EOC ; get end of chain indicator
227 JRST FCLOB ; and clobber it in
229 INLOOP: MOVE E,D ; save in case of later link up
230 HRR D,@D ; point to next table entry
231 TRNE D,EOC ; 400000 is the end of chain bit
232 JRST SLFOUN ; found a slot, leave loop
233 ADDI D,1 ; point to address of progs
234 IFN ITS, HRRZ 0,@D ; get address of block
239 CAMLE 0,B ; skip if still haven't fit it in
240 AOJA D,INLOOP ; back to loop start and point to chain link
241 SUBI D,1 ; point back to start of slot
243 SLFOUN: MOVE 0,OFF(P) ; get offset into vector of this guy
244 HRRM 0,@E ; make previous point to us
245 HRRM D,FB.AGE(C) ; link it in
248 PLOADD: AOS -NSLOTS(P) ; skip return
250 MAPLOS: SUB P,[NSLOTS,,NSLOTS] ; flush stack crap
255 MAPLS0: ERRUUO EQUOTE NO-SAV-FILE
258 MAPLS1: ERRUUO EQUOTE NO-FIXUP-FILE
261 MAPLS2: ERRUUO EQUOTE NO-ROOM-AVAILABLE
266 ;OPEN FIXUP FILE ON MUDSAV
269 .CALL FIXBLK ; OPEN UP FIXUP FILE
270 PUSHJ P,TRAGN ; SEE IF TOTALLY LOSING
273 MOVSI A,%GJSHT ; GTJFN BITS
278 FATAL FIXUP FILE NOT FOUND
280 MOVE B,[440000,,OF%RD+OF%EX]
282 FATAL FIXUP FILE CANT BE OPENED
285 MOVE 0,LASTC(P) ; GET DIRECTORY
288 PUSHJ P,DIRSR1 ; SEARCH DIRECTORY FOR FIXUP
289 JRST NOFXUP ; NO FIXUP IN MAIN DIRECTORY
290 ANDI A,-1 ; WIN IN MULTI SEGS
291 HRRZ A,1(A) ; GET BLOCK NUMBER OF START
292 ASH A,8. ; CONVERT TO WORDS
294 .ACCES MAPCH,A ; ACCESS FILE
304 FIXT1: PUSHJ P,RFXUP ; READ IN THE FIXUP FILE
307 .CALL MNBLK ; REOPEN SAV FILE
312 MOVE A,MAPJFN ; SET UP DIRCHAN AGAIN
316 ; NOW TRY TO LOCATE SAV FILE
318 MOVE 0,LASTC(P) ; GET LASTCHR
319 PUSHJ P,GETDIR ; GET DIRECTORY
320 HRRZ A,VER(P) ; GET VERSION #
321 MOVE D,NAM(P) ; GET NAME OF FILE
322 PUSHJ P,DIRSRC ; SEARCH DIRECTORY
323 JRST MAPLS1 ; NO SAV FILE THERE
325 HRRZ E,1(A) ; GET STARTING BLOCK #
326 LDB A,[LNTBYT,,1(A)] ; GET LENGTH INTO A
327 MOVEM A,FLEN(P) ; SAVE LENGTH
328 MOVEM E,SPAG(P) ; SAVE STARTING BLOCK NUMBER
330 PUSHJ P,RSAV ; READ IN CODE
333 FXUPGO: MOVE A,(TP) ; pointer to them
334 SETOM INPLOD ; ABSOLUTE CLUDGE TO PREVENT BUFFER FROM
339 HRRZ D,B ; this codes gets us running in the correct
344 XJRST C ; good bye cruel segment (will work if we fell
346 FIXMLT: ASH B,PGSHFT ; aobjn to program
348 FIX1: SKIPL E,(A) ; read one hopefully squoze
349 FATAL ATTEMPT TO TYPE FIX PURE
352 NOPV1: PUSHJ P,SQUTOA ; look it up
355 ; N.B. THE VALUE IN THE FIXUPS FOR AN ADDRESS CAN BE NEGATIVE. IF THIS HAPPENS
356 ; IT MEANS THAT THE LEFT HALF CONTAINS THE VALUE INSTEAD OF THE RIGHT HALF
358 HLRZ D,(A) ; get old value
360 SUBM E,D ; D is diff between old and new
361 HRLM E,(A) ; fixup the fixups
362 NOPV3: MOVEI 0,0 ; flag for which half
363 FIX4: JUMPE 0,FIXRH ; jump if getting rh
364 MOVEI 0,0 ; next time will get rh
367 JUMPE C,FIX3 ; 0 terminates
368 FIX5: SKIPGE C ; If C is negative then left half garbage
370 ADDI C,(B) ; access the code
372 NOPV4: ADDM D,-1(C) ; and fix it up
377 FIX6: MOVNS C ; GET TO ADRESS
378 ADDI C,(B) ; ACCESS TO CODE
379 HLRZ E,-1(C) ; GET OUT WORD
384 FIXRH: MOVEI 0,1 ; change flag
385 HRRE C,(A) ; get it and
388 FIX3: AOBJN A,FIX1 ; do next one
394 PUSHJ P,SQUKIL ; KILL SQUOZE TABLE
397 HRRZS VER(P) ; INDICATE SAV FILE
402 FATAL MAP FIXUP LOSSAGE
405 .IOT MAPCH,B ; write out the goodie
408 FATAL WHERE DID THE FILE GO?
410 ASH E,-PGSHFT ; to page AOBJN
411 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],E,[1000,,MAPCH],0]
418 MOVE A,DIRCHN ; GET JFN
419 MOVE B,CADDR(P) ; ready to write it out
423 TLO A,400000 ; dont recycle the JFN
426 ANDI A,-1 ; kill sign bit
427 MOVE B,[440000,,240000]
429 FATAL MAP FIXUP LOSSAGE
431 ASH B,-PGSHFT ; aobjn to pages
443 JRST EFIX2 ; exp vers, dont write out
445 HRRZ A,SJFNS ; get last jfn from savxxx file
450 HLLZS SJFNS ; zero the slot
452 MOVEI 0,1 ; INDICATE FIXUP
455 FATAL CANT WRITE FIXUPS
459 HLRE A,E ; get length
461 ADDI A,2 ; account for these 2 words
462 MOVE 0,[-2,,A] ; write version and length
464 .IOT MAPCH,E ; out go the fixups
472 HLRE B,(TP) ; length of fixup vector
474 ADDI B,2 ; for length and version words
478 MOVSI B,444400 ; byte pointer to fixups
486 EFIX2: MOVE B,CADDR(P)
490 ; Here to try to get a free page block for new thing
491 ; A/ # of pages to get
493 ALOPAG: MOVE C,GCSTOP ; FOOL GETPAG
498 SKIPN MULTSG ; skip if multi-segments
500 ; Compute the "highest" PURBOT (i.e. find the least busy segment)
504 MOVN A,NSEGS ; aobjn pntr to table
507 ALOPA3: CAML B,PURBTB(A) ; if this one is larger
509 MOVE B,PURBTB(A) ; use it
510 MOVEI E,FSEG(A) ; and the segment #
511 ALOPA2: AOBJN A,ALOPA3
515 ALOPA1: ASH B,-PGSHFT
516 SUBM B,C ; SEE IF ROOM
519 PUSHJ P,GETPAX ; try to get enough pages
524 IFN ITS, AOS (P) ; won skip return
534 MOVE 0,PURBTB-FSEG(E)
543 HRRZM 0,PURBTB-FSEG(E)
544 ASH E,PGSHFT ; INTO POSITION
545 IORI B,(E) ; include segment in address
550 ALOPW2: CAMGE 0,PURBOT
565 GETPAX: TDZA B,B ; here if other segs ok
566 GETPAG: MOVEI B,1 ; here for only main segment
567 JRST @[.+1] ; run in sect 0
574 MOVE C,P.TOP ; top of GC space
575 ASH C,-PGSHFT ; to page number
579 JUMPN B,GETPA9 ; if really wan all segments,
580 ; must force all to be free
582 MOVN A,NSEGS ; aobjn pntr to table
585 GETPA8: CAMLE B,PURBTB(A) ; if this one is larger (or the same)
587 MOVE B,PURBTB(A) ; use it
588 MOVEI E,FSEG(A) ; and the segment #
589 GETPA7: AOBJN A,GETPA8
593 GETPA9: MOVE B,PURBOT
594 ASH B,-PGSHFT ; also to pages
595 SUBM B,C ; pages available ==> C
596 CAMGE C,A ; skip if have enough already
597 JRST GETPG1 ; no, try to shuffle around
598 SUBI B,(A) ; B/ first new page
603 POPJ P, ; return with new free page in B
609 ; Here if shuffle must occur or gc must be done to make room
612 SKIPE NOSHUF ; if can't shuffle, then ask gc
614 MOVE 0,PURTOP ; get top of mapped pure area
616 ASH 0,-PGSHFT ; to pages
617 CAMGE 0,A ; skip if winnage possible
618 JRST ASKAGC ; please AGC give me some room!!
619 SUBM A,C ; C/ amount we must flush to make room
622 SKIPE MULTSG ; if multi and getting in all segs
623 JUMPL E,LPGL1 ; check out each and every segment
628 PUSHJ P,PURTBU ; update PURBOT in multi case
635 LPGL2: AOS E,(P) ; count segments
641 MOVE C,PURBOT ; fudge so look for appropriate amt
643 ASH C,-PGSHFT ; to pages
645 SKIPLE C ; none to flush
647 HRRZ E,-1(P) ; fet section again
649 HRRZ C,PURBTB-FSEG(E) ; lets share with 0 again
651 HRL B,E ; get segment
658 HRLI C,PM%CNT+PM%RD+PM%WR+PM%EX
667 PUSHJ P,PURTBU ; update PURBOT in multi case
671 ; Here to find pages for flush using LRU algorithm (in multi seg mode, only
672 ; care about the segment in E)
674 GL1: MOVE B,PURVEC+1 ; get pointer to pure sr vector
675 MOVEI 0,-1 ; get very large age
677 GL2: SKIPL FB.PTR(B) ; skip if not already flushed
682 LDB D,[220500,,FB.PTR(B)] ; get segment #
684 JRST GL3 ; wrong swegment, ignore
686 GLX: HLRZ D,FB.AGE(B) ; get this ones age
687 CAMLE D,0 ; skip if this is a candidate
689 MOVE F,B ; point to table entry with E
690 MOVEI 0,(D) ; and use as current best
691 GL3: ADD B,[ELN,,ELN] ; look at next
694 HLRE B,FB.PTR(F) ; get length of flushee
695 ASH B,-PGSHFT ; to negative # of pages
696 ADD C,B ; update amount needed
697 IFN ITS,SETZM FB.PTR(F) ; indicate it will be gone
698 IFE ITS,MOVNS FB.PTR(F) ; save page info for flushing pages
699 JUMPG C,GL1 ; jump if more to get
701 ; Now compact pure space
703 PUSH P,A ; need all acs
704 HRRZ D,PURVEC ; point to first in core addr order
708 HRLI C,(E) ; adjust for segment
710 ASH C,-PGSHFT ; to page number
713 CL1: ADD D,PURVEC+1 ; to real pointer
714 SKIPGE FB.PTR(D) ; skip if this one is a flushee
715 JRST CL2 ; this one stays
720 HRRZ C,FB.PGS(D) ; is this from SAV FILE?
721 JUMPN C,CLFOUT ; yes. don't bother flushing pages
722 MOVN C,FB.PTR(D) ; get aobjn pointer to code in C
723 SETZM FB.PTR(D) ; and flush this because it works (sorry)
724 ASH C,-PGSHFT ; pages speak louder than words
725 HLRE D,C ; # of pages saved here for unmap
726 HRLI C,.FHSLF ; C now contains myfork,,lowpage
727 MOVE A,C ; put that in A for RMAP
728 RMAP ; A now contains JFN in left half
729 MOVE B,C ; ac roulette: get fork,,page into B for PMAP
730 HLRZ C,A ; hold JFN in C for future CLOSF
731 MOVNI A,1 ; say this page to be unmapped
732 CLFLP: PMAP ; do the unmapping
734 AOJL D,CLFLP ; continue for all pages
735 MOVE A,C ; restore JFN
736 CLOSF ; and close it, throwing away the JFN
737 JFCL ; should work in 95/100 cases
738 CLFOU1: POP P,D ; fatal error if can't close
741 HRRZ D,FB.AGE(D) ; point to next one in chain
742 JUMPN F,CL3 ; jump if not first one
743 HRRM D,PURVEC ; and use its next as first
747 CLFOUT: SETZM FB.PTR(D) ; zero the code pointer
751 CL3: HRRM D,FB.AGE(F) ; link up
754 ; Found a stayer, move it if necessary
760 LDB F,[220500,,FB.PTR(D)] ; check segment
762 JRST CL6X ; no other segs move at all
764 CL9: MOVEI F,(D) ; another pointer to slot
765 HLRE B,FB.PTR(D) ; - length of block
767 TRZ B,<-1>#<(FB.CNT)>
768 MOVE D,FB.PTR(D) ; pointer to block
769 TLZ D,(FB.CNT) ; kill count bits
771 IFN ITS, HRRZ D,FB.PTR(D)
772 SUB D,B ; point to top of block
773 ASH D,-PGSHFT ; to page number
774 CAMN D,C ; if not moving, jump
777 ASH B,-PGSHFT ; to pages
779 CL5: SUBI C,1 ; move to pointer and from pointer
781 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],C,[1000,,-1],D]
783 AOJL B,CL5 ; count down
786 PUSH P,B ; save # of pages
787 MOVEI A,-1(D) ; copy from pointer
788 HRLI A,.FHSLF ; get this fork code
789 RMAP ; get a JFN (hopefully)
790 EXCH D,(P) ; D # of pages (save from)
791 ADDM D,(P) ; update from
792 MOVEI B,-1(C) ; to pointer in B
794 MOVSI C,PM%RD+PM%EX ; read/execute modes
801 AOJL D,.-3 ; move them all
814 ; Update the table address for this loser
816 SUBM C,D ; compute offset (in pages)
817 ASH D,PGSHFT ; to words
818 ADDM D,FB.PTR(F) ; update it
819 CL7: HRRZ D,FB.AGE(F) ; chain on
820 CL4: TRNN D,EOC ; skip if end of chain
823 ASH C,PGSHFT ; to words
824 IFN ITS, MOVEM C,PURBOT ; reset pur bottom
829 HRRZM C,PURBTB-FSEG(E)
831 CLXX: MOVEM C,PURBOT ; reset pur bottom
837 CL6X: MOVEI F,(D) ; chain on
841 IFN ITS, HRRZ C,FB.PTR(F) ; get new top of world
846 ASH C,-PGSHFT ; to page #
857 PURTB2: CAMGE A,PURBTB(B)
861 PURTB1: AOBJN B,PURTB2
868 \f; SUBR to create an entry in the vector for one of these guys
874 GETYP 0,(AB) ; check 1st arg is string
877 GETYP 0,2(AB) ; second must be fix
881 MOVE A,(AB) ; convert name of program to sixbit
884 PCODE4: MOVE C,(P) ; get name in sixbit
886 ; Now look for either this one or an empty slot
891 PCODE2: CAMN C,FB.NAM(B) ; skip if this is not it
892 JRST PCODE1 ; found it, drop out of loop
893 JUMPN E,.+3 ; dont record another empty if have one
894 SKIPN FB.NAM(B) ; skip if slot filled
895 MOVE E,B ; remember pointer
897 JUMPL B,PCODE2 ; jump if more to look at
899 JUMPE E,PCODE3 ; if E=0, error no room
900 MOVEM C,FB.NAM(E) ; else stash away name and zero rest
904 PCODE1: MOVE E,B ; build <slot #>,,<offset>
905 MOVEI 0,0 ; flag whether new slot
906 SKIPE FB.PTR(E) ; skip if mapped already
914 SKIPN NOSHUF ; skip if not shuffling
916 JUMPN 0,FINIS ; jump if winner
926 PCOERR: ERRUUO EQUOTE PURE-LOAD-FAILURE
928 PCODE3: HLRE A,PURVEC+1 ; get current length
930 ADDI A,10*ELN ; add 10(8) more entry slots
932 EXCH B,PURVEC+1 ; store new one and get old
933 HLRE A,B ; -old length to A
934 MOVSI B,(B) ; start making BLT pointer
936 SUBM B,A ; final dest to A
937 IFE ITS, HRLI A,-1 ; force local index
941 ; Here if must try to GC for some more core
943 ASKAGC: SKIPE GCFLG ; if already in GC, lose
946 MOVEM A,0 ; amount required to 0
947 ASH 0,PGSHFT ; TO WORDS
948 MOVEM 0,GCDOWN ; pass as funny arg to AGC
949 EXCH A,C ; save A from gc's destruction
950 IFN ITS,.IOPUSH MAPCH, ; gc uses same channel
953 MOVE C,[8,,9.] ; SET UP INDICATORS FOR GC
957 IFN ITS,.IOPOP MAPCH,
964 IFN ITS, JUMPGE C,GETPAG
965 ERRUUO EQUOTE NO-MORE-PAGES
967 ; Here to clean up pure space by flushing all shared stuff
972 HRRM B,PURVEC ; flush chain pointer
973 MOVE B,PURVEC+1 ; get pointer to table
974 CLN1: SETZM FB.PTR(B) ; zero pointer entry
975 SETZM FB.AGE(B) ; zero link and age slots
977 ADD B,[ELN,,ELN] ; go to next slot
978 JUMPL B,CLN1 ; do til exhausted
979 MOVE B,PURBOT ; now return pages
980 SUB B,PURTOP ; compute page AOBJN pointer
981 IFE ITS, SETZM MAPJFN ; make sure zero mapjfn
982 JUMPE B,CPOPJ ; no pure pages?
987 DOTCAL CORBLK,[[1000,,0],[1000,,-1],B]
994 HLRE D,B ; - # of pges to flush
995 HRLI B,.FHSLF ; specify hacking hom fork
1004 MOVE B,PURTOP ; now fix up pointers
1005 MOVEM B,PURBOT ; to indicate no pure
1009 CLN2: HLRE C,B ; compute pos no. pages
1012 MOVNI A,1 ; flushing pages
1015 MOVE E,PURTOP ; for munging table
1016 ADDI B,<FSEG>_9. ; do it to the correct segment
1018 ADDI B,1_9. ; cycle through segments
1019 HRRZM E,PURBTB(D) ; mung table
1026 ; Here to move the entire pure space.
1027 ; A/ # and direction of pages to move (+ ==> up)
1029 MOVPUR: SKIPE NOSHUF
1030 FATAL CANT MOVE PURE SPACE AROUND
1032 SKIPN B,A ; zero movement, ignore call
1035 ASH B,PGSHFT ; convert to words for pointer update
1036 MOVE C,PURVEC+1 ; loop through updating non-zero entries
1042 MOVE C,PURTOP ; found pages at top and bottom of pure
1046 ADDM B,PURTOP ; update to new boundaries
1049 SKIPN MULTSG ; in multi-seg mode, must mung whole table
1056 MOVPU1: CAIN C,(D) ; differ?
1058 JUMPG A,PUP ; if moving up, go do separate CORBLKs
1061 SUBM D,C ; -size of area to C (in pages)
1062 MOVEI E,(D) ; build pointer to bottom of destination
1066 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],E,[1000,,-1],D]
1070 PUP: SUBM C,D ; pages to move to D
1071 ADDI A,(C) ; point to new top
1075 DOTCAL CORBLK,[[1000,,200000],[1000,,-1],A,[1000,,-1],C]
1081 SUBM D,C ; pages to move to D
1082 MOVSI E,(C) ; build aobjn pointer
1083 HRRI E,(D) ; point to lowest
1084 ADD D,A ; D==> new lowest page
1085 MOVEI F,0 ; seg info
1092 MOVE H,D ; save for outer loop
1094 PURCL1: MOVSI A,.FHSLF ; specify here
1095 HRRI A,(E) ; get a page
1096 IORI A,(F) ; hack seg i
1097 RMAP ; get a real handle on it
1098 MOVE B,D ; where to go
1114 PUP: SUB D,C ; - count to D
1115 MOVSI E,(D) ; start building AOBJN
1116 HRRI E,(C) ; aobjn to top
1117 ADD C,A ; C==> new top
1119 MOVEI F,0 ; seg info
1126 MOVE H,D ; save for outer loop
1128 PUPL: MOVSI A,.FHSLF
1130 IORI A,(F) ; segment
1131 RMAP ; get real handle
1167 GENVN: MOVE C,[440700,,MUDSTR+2]
1187 \f; THESE ARE DIRECTORY SEARCH ROUTINES
1190 ; THIS ROUTINE DOES A BINARY SEARCH ON A DIRECTORY AND RETURNS A POINTER
1191 ; RESTED DOWN TO THE APPROPRIATE SLOT IN THE DIRECTORY.
1192 ; ARGS: E==DIR POINTER D==FILE-NAME 1 A==VERSION #
1193 ; RETS: A==RESTED DOWN DIRECTORY
1195 DIRSR1: TLOA 0,400000 ; INDICATION OF ONE ARGUMENT SEARCH
1196 DIRSRC: TLZ 0,400000 ; INDICATOR OF 2 ARGUMENT SEARCH
1197 PUSH P,A ; SAVE VERSION #
1198 HLRE B,E ; GET LENGTH INTO B
1201 HRLS B ; GET BOTH SIDES
1202 UP: ASH B,-1 ; HALVE TABLE
1203 AND B,[-2,,-2] ; FORCE DIVIS BY 2
1204 MOVE C,A ; COPY POINTER
1205 JUMPLE B,LSTHLV ; CANT GET SMALLER
1207 IFE ITS, HRRZ F,C ; avoid lossage in multi-sections
1208 IFN ITS, CAMLE D,(C) ; SKIP IF EITHER FOUND OR IN TOP
1209 IFE ITS, CAMLE D,(F) ; SKIP IF EITHER FOUND OR IN TOP
1210 MOVE A,C ; POINT TO SECOND HALF
1211 IFN ITS, CAMN D,(C) ; SKIP IF NOT FOUND
1212 IFE ITS, CAMN D,(F) ; SKIP IF NOT FOUND
1214 IFN ITS, CAML D,(C) ; SKIP IF IN TOP HALF
1215 IFE ITS, CAML D,(F) ; SKIP IF IN TOP HALF
1217 HLLZS C ; FIX UP POINTER
1222 MOVEI 0,0 ; DOWN FLAG
1223 WON1: LDB A,[221200,,1(C)] ; GET VERSION NUMBER
1224 CAMN A,(P) ; SKIP IF NOT EQUAL
1226 CAMG A,(P) ; SKIP IF LT
1229 SUB C,C%22 ; GET NEW C
1232 SUBIT: ADD C,C%22 ; SUBTRACT
1235 IFN ITS, CAMN D,(C) ; SEE WHETHER WERE STILL WINNING
1241 C1POPJ: SUB P,C%11 ; GET RID OF VERSION #
1242 POPJ P, ; LOSE LOSE LOSE
1243 SUPWIN: MOVE A,C ; RETURN ARGUMENT IN A
1244 AOS -1(P) ; SKIP RETURN INDICATES IT WAS FOUND
1248 IFN ITS, CAMN D,(C) ; LINEAR SEARCH REST
1251 CAMN D,(F) ; LINEAR SEARCH REST
1258 \f; ROUTINE TO GET A DIRECTORY. ASSUMES MAPCH IS OPEN TO FIXUP OR SAV FILE AND 0 IS THE
1259 ; LAST CHAR TO BE HASHED. RETURNS POINTER TO DIRECTORY IN E
1265 MOVEI A,1 ; GET A BUFFER
1269 DOTCAL CORBLK,[[RDTP],[FME],C,[1000,,MAPCH],[1000,,0]]
1272 IDIV 0,(B) ; A NOW CONTAINS THE DIRECTORY NUMBER
1274 DOTCAL CORBLK,[[RDTP],[FME],C,[1000,,MAPCH],(A)]
1276 MOVN E,(B) ; GET -LENGTH OF DIRECTORY
1277 HRLZS E ; BUILD AOBJN PTR TO DIR
1282 ; IN WONDERFUL TOPS20 VERSION DIRCHN CONTAINS THE JFN
1289 MOVEI A,1 ; GET A BUFFER
1293 HRLI B,.FHSLF ; SET UP DESTINATION (CORE)
1294 MOVS A,DIRCHN ; SET UP SOURCE (FILE)
1295 MOVSI C,PM%RD+PM%EX ; READ+EXEC ACCESS
1298 IDIV 0,(E) ; A NOW CONTAINS THE DIRECTORY NUMBER
1299 ADDI A,1(E) ; POINT TO THE DIRECTORY ENTRY
1300 MOVE A,(A) ; GET THE PAGE NUMBER
1301 HRL A,DIRCHN ; SET UP SOURCE (FILE)
1302 PMAP ; AGAIN READ IN DIRECTORY
1304 MOVN E,(E) ; GET -LENGTH OF DIRECTORY
1305 HRLZS E ; BUILD AOBJN PTR TO DIR
1314 ; HERE IF CAN'T FIND FIXUP FILE IN MAIN DIRECTORY
1318 MOVE A,DIRCHN ; JFN FOR FIXUP FILE
1322 MOVE A,FXTBL ; GET AOBJN POINTER TO FIXUP TABLE
1323 NOFXU1: HRRZ B,(A) ; GET VERSION TO TRY
1324 HRRM B,VER(P) ; STUFF IN VERSION
1325 MOVEI B,1 ; DUMP IN FIXUP INDICATOR
1327 MOVEM A,TEMP(P) ; SAVE POINTER TO FXTBL
1328 PUSHJ P,OPXFIL ; LOOK FOR FIXUP FILE
1330 PUSHJ P,RFXUP ; READ IN THE FIXUP FILE
1331 HRRZS VER(P) ; INDICATE SAV FILE
1332 PUSHJ P,OPXFIL ; TRY OPENING IT
1333 JRST MAPLS0 ; GIVE UP NO SAV FILE TO BE HAD
1335 JRST FXUPGO ; GO FIXUP THE WORLD
1336 NOFXU2: MOVE A,TEMP(P) ; GET BACK POINTER
1337 AOBJN A,NOFXU1 ; TRY NEXT
1338 JRST MAPLS1 ; NO FILE TO BE HAD
1340 GETIT: HRRZM B,SPAG(P) ; GET BLOCK OF START
1341 HLRZM B,FLEN(P) ; DAMMIT SAVE THIS!
1342 HLRZ A,B ; GET LENGTH
\r
1354 ; ROUTINE TO SEE IF FILE IS NOT OPEN BECAUSE OF FNF AND FATAL IF SO
1357 TRAGN: PUSH P,0 ; SAVE 0
1358 .STATUS MAPCH,0 ; GET STATUS BITS
1360 CAIN 0,4 ; SKIP IF NOT FNF
1361 FATAL MAJOR FILE NOT FOUND
1364 SOS (P) ; RETRY OPEN
1368 OPSAV: MOVSI A,%GJSHT+%GJOLD ; BITS FOR GTJFN
1369 HRROI B,SAVSTR ; STRING POINTER
1373 FATAL CANT FIND SAV FILE
1374 MOVEM A,MAPJFN ; STORE THE JFN
1375 MOVE B,[440000,,OF%RD+OF%EX+OF%THW+OF%DUD]
1377 FATAL CANT OPEN SAV FILE
1381 ; OPMFIL IS USED TO OPEN A FILE ON MUDTMP. IT CAN OPEN EITHER A SAV OR FIXUP FILE
1382 ; AND THE VERSION NUMBER IS SPECIFIED. THE ARGUMENTS ARE
1383 ; NAM-1(P) HAS SIXBIT OF FILE NAME
1384 ; VER-1(P) HAS 0,,VERSION # FOR SAV FILE AND 1,,VERSION# FOR FIXUP FILE
1385 ; RETURNS LENGTH OF FILE IN SLEN AND
1387 ; OPXFIL IS A KLUDGE FOR GETTING SAV AND FIXUP FILES OFF OF THE MDLLIB
1388 ; DIRECTORY DURING THE CHANGEOVER TO PRE- AND POST- MUDSAV WORLDS
1394 OPWFIL: SETOM WRT-1(P)
1396 OPMFIL: SETZM WRT-1(P)
1399 HRRZ C,VER-1(P) ; GET VERSION NUMBER
1400 PUSHJ P,NTOSIX ; CONVERT TO SIXBIT
1401 HRLI C,(SIXBIT /SAV/) ; BUILD SECOND FILE NAME
1403 SKIPE 0 ; SKIP IF SAV
1404 HRLI C,(SIXBIT/FIX/)
1405 MOVE B,NAM-1(P) ; GET NAME
1406 MOVSI A,7 ; WRITE MODE
1408 MOVSI A,6 ; READ MODE
1409 RETOPN: .CALL FOPBLK
1410 JRST OPCHK ; SEE IF FIXUP IS NECESSARY OR JUST REOPENING
1411 DOTCAL FILLEN,[[1000,,MAPCH],[2000,,A]]
1413 ADDI A,PGMSK ; ROUND
1414 ASH A,-PGSHFT ; TO PAGES
1417 AOS (P) ; SKIP RETURN TO SHOW SUCCESS
1420 OPCHK: .STATUS MAPCH,0 ; GET STATUS BITS
1422 CAIE 0,4 ; SKIP IF FNF
1426 OPCHK1: MOVEI 0,1 ; SLEEP FOR A WHILE
1430 ; NTOSIX GETS NUMBER IN C AND CONVERTS IT TO SIXBIT AND RETURNS RESULT IN C
1432 NTOSIX: PUSH P,A ; SAVE A AND B
1436 MOVEI A,(C) ; GET NUMBER
1438 IDIVI A,100. ; GET RESULT OF DIVISION
1441 ADDI A,20 ; CONVERT TO DIGIT
1444 IDIVI A,10. ; GET TENS DIGIT
1446 SKIPE A ; IF BOTH 0 BLANK DIGIT
1461 MOVE E,P ; save pdl base
1462 MOVE B,NAM-1(E) ; GET FIRST NAME
1463 PUSH P,C%0 ; [0]; slots for building strings
1465 MOVE A,[440700,,1(E)]
1468 ; DUMP OUT SIXBIT NAME
1472 JUMPE 0,.+4 ; violate cardinal ".+ rule"
1473 ADDI 0,40 ; to ASCII
1477 MOVE 0,[ASCII / SAV/]
1478 HLRZ C,VER-1(E) ; GET SAV/FIXUP FLAG
1480 MOVE 0,[ASCII / FIX/]
1482 HRRZ C,VER-1(E) ; get ascii of vers no.
1483 PUSHJ P,NTOSEV ; CONVERT TO STRING LEFT JUSTIFIED
1485 MOVEI B,-1(P) ; point to it
1487 HRROI D,1(E) ; point to name
1489 MOVSI 0,100000 ; INPUT FILE (GJ%OLD)
1491 MOVSI 0,400000 ; OUTPUT FILE (GJ%FOU)
1493 PUSH P,[377777,,377777]
1494 MOVE 0,[-1,,[ASCIZ /DSK/]]
1496 MOVE 0,[-1,,[ASCIZ /PS/]]
1498 HRROI 0,[ASCIZ /MDL/]
1500 HRROI 0,[ASCIZ /MDLLIB/] ; USE MDLLIB FOR SPECIAL CASE
1508 MOVE D,4(E) ; save final version string
1510 JRST OPMLOS ; FAILURE
1512 MOVE B,[440000,,OF%RD+OF%EX]
1514 MOVE B,[440000,,OF%RD+OF%WR]
1517 MOVE P,E ; flush crap
1522 MOVEM C,FLEN-1(E) ; ONLY SAVE LENGTH FOR READ JFNS
1525 ; RESTORE STACK AND LEAVE
1528 MOVE A,C ; NUMBER OF PAGES IN A, DAMN!
1535 ; CONVERT A NUMBER IN C TO AN ASCII STRING LEFT JUSTIFIED IN C
1537 NTOSEV: PUSH P,A ; SAVE A AND B
1541 MOVEI A,(C) ; GET NUMBER
1543 IDIVI A,100. ; GET RESULT OF DIVISION
1545 ADDI A,60 ; CONVERT TO DIGIT
1548 IDIVI A,10. ; GET TENS DIGIT
1560 ; ROUTINE TO READ IN THE FIXUPS FROM DIRCHN OR MAPCH WORKS
1561 ; FOR FIXUP FILE OR FIXUPS IN A SEPERATE FILE AS LONG AS THE
1562 ; CHANNEL IS OPENED AND ACCESSED TO THE RIGHT PLACE
1566 MOVE 0,[-2,,A] ; PREPARE TO READ VERSION AND LENGTH
1567 .IOT MAPCH,0 ; READ IT IN
1568 SKIPGE 0 ; SKIP IF NOT HIT EOF
1569 FATAL BAD FIXUP FILE
1570 MOVEI A,-2(A) ; COUNT FOR FIRST 2 WORDS
1571 HRRM B,VER-1(P) ; SAVE VERSION #
1572 .IOPUS MAPCH, ; PUSH THE MAPPING CHANNEL
1574 PUSHJ P,IBLOCK ; GET A UVECTOR OF APPROPRIATE SIZE
1578 MOVEM 0,-1(TP) ; SAVE UVECTOR
1580 MOVE A,B ; GET AOBJN POINTER TO UVECTOR FOR IOT
1581 .IOT MAPCH,A ; GET FIXUPS
1588 BIN ; GET LENGTH OF FIXUP
1591 BIN ; GET VERSION NUMBER
1602 ; SKIPE OPSYS ; SKIP IF TOPS20 SINCE C MUST BE NEGETIVE
1603 ; MOVNS C ; C IS POSITIVE FOR TENEX ?????
1608 FATAL CANT CLOSE FIXUP FILE
1614 ; ROUTINE TO READ IN THE CODE
1616 RSAV: MOVE A,FLEN-1(P)
1617 PUSHJ P,ALOPAG ; GET PAGES
1622 MOVN A,FLEN-1(P) ; build aobjn pointer
1627 DOTCAL CORBLK,[[1000,,104000],[1000,,-1],A,[1000,,MAPCH],0]
1633 PUSH P,B ; SAVE PAGE #
1634 MOVS A,DIRCHN ; SOURCE (MUDSAV)
1635 HLRM A,SJFNS ; SAVE POINTER FOR FUTURE CLOSING
1637 HRLI B,.FHSLF ; DESTINATION (FORK)
1638 MOVSI C,PM%RD+PM%CPY ; MAKE COPY ON WRITE
1640 JRST RSAV1 ; HANDLE TENEX
1641 TLO C,PM%CNT ; REPEAT COUNT BIT FOR TOPS20
1642 HRR C,FLEN-2(P) ; PAGE (FOR PUSHJ AND PUSHED B)
1649 RSAV1: HRRZ D,FLEN-2(P) ; GET IN PAGE COUNT
1651 ADDI A,1 ; NEXT PAGE
1657 PDLOV: SUB P,[NSLOTS,,NSLOTS]
1658 PUSH P,C%0 ; [0]; CAUSE A PDL OVERFLOW
1661 ; CONSTANTS RELATED TO DATA BASE
1664 MNDIR: SIXBIT /MUDSAV/ ; DIR OF MAIN DATA BASE FILES
1665 WRKDIR: SIXBIT /MUDTMP/ ; DIRECTORY OF UPDATE FILES
1699 FXSTR: ASCIZ /PS:<MDL>FIXUP.FILE/
1700 SAVSTR: ASCIZ /PS:<MDL>SAV.FILE/
1701 TFXSTR: ASCIZ /DSK:<MDL>FIXUP.FILE/
1702 TSAVST: ASCIZ /DSK:<MDL>SAV.FILE/
1711 ;This code does two things to code for FBIN;
1712 ; 1) Makes dispatches win in multi seg mode
1713 ; 2) Makes OBLIST? work with "new" atom format
1714 ; 3) Makes LENGTH win in multi seg mode
1715 ; 4) Gets AOBJN pointer to code vector in C
1719 PUSH P,C ; for referring back
1721 SFIX1: MOVSI B,-MLNT ; for looping through tables
1723 SFIX2: MOVE A,(C) ; get code word
1726 CAMN A,SPECS(B) ; do we match
1731 SFIX3: AOBJN C,SFIX1 ; do all of code
1743 SPECS: HLRES A ; begin of arg diaptch table
1744 SKIPN 2 ; old compiled OBLIST?
1745 JRST (M) ; compiled LENGTH
1746 ADDI (M) ; begin a case dispatch
1753 DFIX: AOBJP C,SFIX4 ; make sure dont run out
1754 MOVE A,(C) ; next ins
1755 CAME A,[ASH A,-1] ; still winning?
1756 JRST SFIX3 ; false alarm
1757 AOBJP C,SFIX4 ; make sure dont run out
1758 HLRZ A,(C) ; next ins
1759 CAIE A,(ADDI A,(M)) ; still winning?
1760 JRST SFIX3 ; false alarm
1763 CAIE A,(PUSHJ P,@(A)) ; last one to check
1767 CAME A,[JRST FINIS] ; extra check
1771 SFIX5: AOBJP C,SFIX4
1775 CAIE A,M ; dispatch entry?
1776 JRST SFIX3 ; maybe already fixed
1780 OBLFIX: PUSH P,[-TLN,,TPTR]
1787 OBLFI1: AOBJP C,OBLFXX
1798 OBLFXX: SUB P,C%22 ; for checking more ins
1807 INSBP==331100 ; byte pointer for ins field
1808 ACBP==270400 ; also for ac
1811 DOOBFX: MOVE C,-2(P)
1813 MOVEI B,<<(HRRZ)>_<-9>> ; change em
1814 DPB B,[INSBP,,(C)] ; SKIPN==>HRRZ
1815 LDB A,[ACBP,,(C)] ; get AC field
1816 MOVEI B,<<(JUMPE)>_<-9>>
1819 AOS 1(C) ; JRST FOO==>JUMPE ac,FOO+1
1820 MOVE B,[CAMG VECBOT]
1822 MOVEM B,2(C) ; JUMPL ==> CAMG ac,VECBOT
1823 HRRZ A,3(C) ; get indicator of existence of ADD AC,TVP
1824 CAIE A,TVP ; skip if extra ins exists
1830 NOATVP: TLC B,(CAMG#HRLI) ; change CAMG to HRLI (preserving AC)
1831 HRRZ A,4(C) ; see if moves in type
1833 SUB C,[1,,1] ; fudge it
1834 HLLOM B,5(C) ; in goes HRLI -1
1835 CAIE A,$TOBLS ; do we need a skip?
1837 MOVSI B,(CAIA) ; skipper
1843 NOOB$: MOVSI B,(JFCL)
1852 ; Here to fixup compiled LENGTH
1854 LFIX: MOVSI B,-LLN ; for checking other LENGTH ins
1857 LFIX1: AOBJP C,LFIXX
1861 LFIXX: PUSHJ P,OBLFI2 ; never POPJs, just to make P stack in good
1865 POP P,C ; restore code pointer
1866 MOVE A,(C) ; save jump for its addr
1867 MOVE B,[MOVSI 400000]
1868 MOVEM B,(C) ; JRST .+2 ==> MOVSI 0,400000
1869 LDB B,[ACBP,,1(C)] ; B==> AC of interest
1872 MOVEI B,<<(JUMPE)>_<-9.>>
1875 TLC A,(HRR#HRRZ) ; HRR==>HRRZ
1876 HLLZM A,2(C) ; TRNN AC,-1 ==> HRRZ AC,(AC)
1878 HRLM B,3(C) ; AOBJP AC,.-2 ==> AOBJN 0,.-2
1879 MOVE B,2(C) ; get HRRZ AC,(AC)
1880 TLZ B,17 ; kill (AC) part
1881 MOVEM B,4(C) ; HLRZS AC ==> HRRZ AC,0
1885 ; Fixup a CASE dispatch
1887 CFIX: LDB A,[ACBP,,(C)]
1889 HLRZ B,(C) ; Next ins
1896 MOVE A,(C) ; ok, fix it up
1897 TLZ A,20 ; kill indirection
1899 HRRZ B,-1(C) ; point to table
1900 ADD B,(P) ; point to code to change
1902 CFIXLP: HLRZ A,(B) ; check one out
1903 TRZ A,400000 ; kill bit
1904 CAIE A,M ; check for just index (or index with SETZ)
1910 DEFINE FOO LBL,LNT,LBL2,L
1931 FOO OINS,OLN,OMSK,[[<JRST (M)>,IMSK],[<JUMPL (M)>,IMSK],[MOVE,AIMSK]
1932 [<MOVE $TOBLS>,AIMSK],[<JRST (M)>,IMSK]
1933 [<MOVE $TFALSE>,AIMSK],[MOVEI,AIMSK]]
1935 FOO OINS3,OLN3,OMSK3,[[<JRST (M)>,IMSK],[<JUMPL (M)>,IMSK],[MOVE,AIMSK]
1936 [<JRST (M)>,IMSK],[MOVEI,AIMSK]]
1938 FOO OINS2,OLN2,OMSK2,[[<JRST (M)>,IMSK],[<JUMPL (M)>,IMSK],[<ADD TVP>,AIMSK]
1939 [MOVE,AIMSK],[<MOVE $TOBLS>,AIMSK],[<JRST (M)>,IMSK]
1940 [<MOVE $TFALSE>,AIMSK],[MOVEI,AIMSK]]
1942 FOO OINS4,OLN4,OMSK4,[[<JRST (M)>,IMSK],[<JUMPL (M)>,IMSK],[<ADD TVP>,AIMSK]
1943 [MOVE,AIMSK],[<JRST (M)>,IMSK],[MOVEI,AIMSK]]
1955 FOO LINS,LLN,LMSK,[[<HRR -1>,AIMSK],[<TRNE -1>,AIMSK],[<AOBJP (M)>,IMSK]
1956 [<HLRZS>,<-1,,777760>]]
1961 SAVSNM: 0 ; SAVED SNAME
1962 INPLOD: 0 ; FLAG SAYING WE ARE IN MAPPUR
1965 MAPJFN: 0 ; JFN OF <MDL>SAV FILE
1966 DIRCHN: 0 ; JFN USED BY GETDIR