IDENT MAPS ERR VV HAS IT 17 FEB 71 TITLE MAPS - CREATION, COMPILATION, AND EXECUTION ENTRY MAPIN,MAPOUT,REFER EXT DISASTR,GARBCNT RECS MACRO A RE A RJ =XE.ECS ENDM WECS MACRO A WE A RJ =XE.ECS ENDM ECSMAC XTEXT CBLOCK MICRO 1,,*/EMAPS/* INTSYS XTEXT PROCSYM XTEXT TITLE MAIN SWAPPING LOOP * MAPIN/MAPOUT SWAP A SUBPROCESS IN OR OUT OF CM. THEY ARE CALLED WITH: * B1 = SCRATCH AREA * A5 = ADDRESS OF MAP POINTER WORD IN SUBPROCESS AREA * X5 = MAP POINTER WORD * B7 = RETURN LINK * * THE FOLOWING REGISTERS ARE CHANGED: * A0 - X0 * A1 (BUT NOT X1) * A2 (BUT NOT X2) * A3 - X3 * A4 - X4 * A6 - X6 * A7 - X7 * B6 * (B2, B3, B4, AND B5 ARE SAVED, BUT THEY SHOULD NOT BE NEGATIVE * OR THINGS WILL BLOW UP.) SPACE 3 MAPIN SA0 B1 . SCRATCH AREA SX0 GARBCNT SA4 X5+B1 . FIRST WORD OF COMPILED MAP SX6 5 ***** DISPLAY ***** SA6 2 ***** PRM ***** RECS 1 . READ GARBAGE COLLECTION AND COUNT SA3 A0+0 NG X3,INTERP . GARBAGE COLLECTION NOW IN PROGRESS BX4 X3-X4 . COMPARE MAP COUNT TO MASTER COUNT MX7 3 . MASK TO REMOVE FLAG BITS SX4 X4 . GET RID OF MAP FIELD ZR X4,STARTIN INTERP SB6 STARTIN . ^RETURN^ EQ CALLCMP . PROCEED TO COMPILE MAP * STARTIN SA4 A4+1 . PICK UP FIRST ENTRY ZR X4,END LX4 1 . LEFT-JUSTIFY DIRECT-ACCESS BIT NG X4,NXTWRD . DO NOT SWAP LX4 59 * SPACE 2 INLOOP BX0 -X7*X4 . REMOVE FLAG BITS SB6 X0+0 . WORD COUNT AX0 18 SA0 X0+B1 . CM ADDRESS, ABSOLUTE NOW AX0 18 RECS B6 NXTWRD SA4 A4+1 . GET NEXT COMPILED WORD NZ X4,INLOOP . ZERO WORD MARKS END END BSS 0 SX6 1 SET TO BURCE SA6 2 JP B7 . EXIT FROM MAPIN SPACE 2 MAPOUT SA0 B1 SX0 GARBCNT SA4 X5+B1 SX6 5 ***** DISPLAY ***** SA6 2 ***** PRM ***** RECS 1 .. READ GLOBAL CARBAGE COUNT SA3 A0 NG X3,OUTTERP .. GARBAGE COLLECTION IS IN PROGRESS BX4 X3-X4 MX7 3 .. MASK TO REMOVE FLAG BITS SX4 X4 NZ X4,OUTTERP STARTOUT SA4 A4+1 .. FIRST COMPILED MAP WORD ZR X4,ENDOUT LX4 1 .. LEFT JUSTIFY DAE BIT NG X4,NXTOUT .. DO NOT SWAP LX4 59 OUTLOOP NG X4,NXTOUT .. READ-ONLY ENTRY BX0 -X7*X4 .. CLEAR FLAGS AND MOVE SB6 X0 .. WORD COUNT AX0 18 SA0 X0+B1 .. CM ADDRESS, NOW ABSOLUTE AX0 18 WECS B6 NXTOUT SA4 A4+1 NZ X4,OUTLOOP ENDOUT BSS 0 SX6 1 ***** DISPLAY ***** SA6 2 ***** BGL ***** JP B7 .. RETURN OUTTERP SB6 STARTOUT TITLE MAIN COMPILATION LOOP CALLCMP BX6 X1 SA6 B1+P.TEMP1 . X1 MUST BE SAVED BX7 X2 SA7 B1+P.TEMP2 . AS MUST X2 SX6 B7 LX6 18 SX7 B6 BX6 X6+X7 LX6 18 SX7 B5 BX6 X6+X7 SA6 B1+P.TEMP3 . AND B7, B6, B5, ... SX6 B4 LX6 18 SX7 B3 BX6 X6+X7 LX6 18 SX7 B2 BX6 X6+X7 SA6 B1+P.TEMP4 . ... AND B4, B3, AND B2 SB4 X5+1 MX0 60-18 SA4 X5+B1 . FIRST WORD OF COMPILED MAP, AGAIN LX0 18 . POSITION MASK BX4 -X0*X4 BX6 X3+X4 SA6 X5+B1 . UPDATED GARBAGE COLLECTION COUNT AX5 18 SA2 X5+B1 . START OF SOURCE MAP SA3 A5-3 . SUBPROCESS RA, ETC. AX3 18 SB2 X3 . RA SX7 -1 . CONSTANT ZR X2,DONE . EMPTY ENTRY OR END OF MAP CLOOP SX0 X2+0 . MOT POINTER TO FILE RECS 1 SA1 A0 MX5 60-21 BX0 -X5*X1 . ECS ADDRESS OF FILE BX1 X1-X2 . COMPARE UNIQUE NAMES BX1 X5*X1 NZ X1,MKERROR . FILE HAS BEEN DELETED MX5 2 SA1 A2+1 . LOGICAL FILE ADDRESS SA3 A1+1 . CM ADDRESS, WORD COUNT BX6 X3 LX6 60-36 . RIGHT JUSTIFY COMPILE POINTER MX4 60-18 BX6 X4*X6 . CLEAR OUT OLD POINTER... SA4 A5+0 . POINTER TO START OF COMPILED MAP BX4 -X4 SX4 X4+B4 BX6 X4+X6 . ... AND ADD NEW ONE LX6 36 SA6 A3 BX5 X5*X3 . READ ONLY & DIRECT ACCESS BITS SB3 X3 . WORD COUNT TO B3 AX3 18 SX3 X3+B2 . CM ADDRESS (RELATIVE TO B1) RECS P.SCRL . READ FILE DESCRIPTION TITLE COMPILE A SOURCE MAP ENTRY SPACE 2 * WE NOW COMPILE A SINGLE SOURCE MAP ENTRY INTO A SERIES OF WORDS OF THE * FOLLOWING FORM: * VFD 1/R-O,1/DAE,1/LAST,21/ECS ADDRESS,18/CM ADDRESS, *, 18/WORD COUNT * THE THREE FLAG FIELDS ARE 1 IF TRUE. THE ECS ADDRESS IS ABSOLUTE, * WHILE THE CM ADDRESS IS RELATIVE TO B1. THE REGISTERS SHOULD BE SET UP * THUS: * * A0 ADDRESS OF FILE DESCRIPTION (AND SCRATCH AREA) * X1 LOGICAL FILE ADDRESS * X3 CM ADDRESS (RELATIVE TO B1) * X5 READ ONLY BIT (POSITIONED AT BIT 59) * X7 -1 * B3 WORD COUNT * B4 POINTER TO COMPILE AREA (RELATIVE TO B1) SPACE 2 SB6 A0+3 . START OF DOPE SB7 MKMAP . RETURN FROM DOPE VECTOR EQ MKMAP1 SPACE 2 * FORM OF POINTER BLOCK LEVEL DESCRIPTION: * AX6 X * MX0 Y * JP B7 SPACE 1 MKMAP BX0 -X0*X6 . SELECT RELEVANT ADDRESS BITS SB6 B6+1 IX0 X0+X4 . ECS ADDRESS OF ... RECS 1 . NEXT POINTER MKMAP1 SA4 A0 ZR X4,MKERROR . EMPTY BLOCK BX6 X1 JP B6 . EXECUTE NEXT LEVEL DESCRIPTION SPACE 2 * FORM OF DATA BLOCK LEVEL DESCRIPTION: * SX6 LENGTH OF DATA BLOCK - 1 * JP B7+4 SPACE 1 BSS 0 IFNE *-MKMAP,4,1 . LOCATION COUNTER MUST = MKMAP+4 ERR . BUT IT DOES NOT SPACE 1 SB5 X6+1 . DATA BLOCK LENGTH BX6 X6*X1 . LENGTH-1 IS CORRECT MASK SPACE 2 * FORM OF SINGLE LEVEL FILE DESCRIPTION: * SB5 LENGTH OF DATA BLOCK * JP B7+5 SPACE 1 BSS 0 IFNE *-MKMAP,5,1 . LOCATION COUNTER MSUT = MKMAP+5 ERR . BUT IT DOES NOT SPACE 1 SB7 X6 . STARTING ADDRESS IN FIRST BLOCK BX1 X0 . LAST POINTER ADDRESS SB7 B5-B7 . WORD COUNT FROM FIRST BLOCK SB6 B3-B7 . DECREASE COUNT IX0 X4+X6 . ECS ADDRESS MX6 60-21 BX0 -X6*X0 . GET RID OF INDEX, INDEF. EXP. GT B6,B0,MKMAP3 . THIS IS NOT THE LAST SPACE 1 MKMAP2 BX6 -X7 . LAST ENTRY FLAG BIT LX6 21 . POSITION BX6 X6+X0 . ECS ADDRESS LX6 18 NG X5,MKMAP2A .. IF R-O THEN DO NOT SET DIRTY BIT IX0 X4+X7 .. ADDR OF WORD WITH DIRTY BIT, REF COUNT LX7 53 .. POSITION HOLE RECS 1 SA4 A0 BX7 -X7+X4 .. SET DIRTY BIT SA7 A0 MX7 59 . RESTORE X7 TO -1 WECS 1 MKMAP2A BX6 X6+X3 .. CM ADDRESS LX6 18 SX4 B3 BX6 X6+X4 . WORD COUNT BX6 X5+X6 . READ-ONLY (AND DIRECT-ACCESS) BIT(S) SA6 B4+B1 SB4 B4+1 SPACE 2 CLOOP1 SA2 A2+3 . STEP TO NEXT ENTRY NZ X2,CLOOP DONE PL X2,CLOOP1 . NULL ENTRY BX6 X6-X6 SA6 B4+B1 . MAP ENDS WITH ZERO WORD SA1 B1+P.TEMP1 . RESTORE X1 SA2 B1+P.TEMP2 . AND X2 SA3 B1+P.TEMP3 . AND B7, B6, B5, ... SB5 X3 AX3 18 SB6 X3 AX3 18 SA4 B1+P.TEMP4 . ... AND B4, B3, AND B2 SB7 X3 SB2 X4 AX4 18 SB3 X4 AX4 18 SB4 X4 SA5 A5 . ORIGINAL MAP IN/OUT PARAMETER SA4 X5+B1 . START OF COMPILED MAP MX7 3 JP B6 . CARRY ON WITH SWAPPING SPACE 2 MKMAP3 BX6 X0 .. ECS ADDRESS LX6 18 BX6 X6+X3 .. CM ADDRESS LX6 18 NG X5,MKMAP3A .. IF R-0, DO NOT SET DIRTY BIT IX0 X4+X7 .. ADDR OF WORD WITH DIRTY BIT, REF COUNT LX7 53 .. POSITION HOLE RECS 1 SA4 A0 BX7 -X7+X4 .. SET DIRTY BIT SA7 A4 MX7 59 .. =-1 WECS 1 MKMAP3A SX4 B7 .. WORD COUNT FOR FIRST BLOCK BX6 X6+X4 BX6 X5+X6 .. READ-0NLY, DIRECT ACCESS BITS SA6 B4+B1 SB4 B4+1 SX3 X3+B7 . BUMP CM ADDRESS SB3 B6 . NEW WORD COUNT SPACE 1 MKMAP4 IX0 X1-X7 . ADVANCE TO NEXT POINTER BX1 X0 . ADDRESS OF ... RECS 1 . NEXT POINTER SA4 A0+0 ZR X4,MKERROR . EMPTY BLOCK DF X4,MKMAP5 . BRANCH IF POINTER BLOCK IS NEXT MX6 60-21 BX0 -X6*X4 SB6 B3-B5 . DECREASE WORD COUNT GE B0,B6,MKMAP2 . BRANCH IF LAST ENTRY SB3 B6 BX6 X0 LX6 18 .. ECS ADDRESS BX6 X6+X3 .. CM ADDRESS LX6 18 NG X5,MKMAP4A .. IF READ-ONLY DO NOT SET DIRTY BIT IX0 X0+X7 .. ADDR OF WORD WITH DIRTY BIT, REF COUNT LX7 53 .. POSITION HOLE RECS 1 SA4 A0 BX7 -X7+X4 .. SET DIRTY BIT SA7 A0 MX7 59 .. =-1 WECS 1 MKMAP4A SX4 B5 .. WORD COUNT (= DATA BLOCK SIZE) BX6 X6+X4 BX6 X5+X6 . READ-ONLY BIT SA6 B4+B1 SB4 B4+1 SX3 X3+B5 . BUMP CM ADDRESS EQ MKMAP4 SPACE 2 MKMAP5 IX1 X4+X7 . SET X1 TO ONE BEFORE PTR BLOCK PL X4,MKMAP4 . NOT TO END OF BLOCK YET IX0 X0+X4 . A(OBJECT) SB6 MKMAP4 . GET THE BACK POINTER FROM THE JP =XBKPTR . ALLOCATOR SPACE 2 MKERROR RJ DISASTR SPACE 2 TITLE REFERENCE COUNT MANIPULATION * REFER INCREMENTS AND DECREMENTS THE REFERENCE COUNTS ON DATA BLOCKS * WHICH ARE IN MAPS. IT ALSO CHECKS THE VALIDITY OF THE FILE ADDRESS, * CM ADDRESS, AND WORD COUNT COMBINATION. * ENTRY: * X1 THE ADDRESS OF A SOURCE MAP ENTRY (RELATIVE TO B1) * X4 THE FL OF THE SUBPROCESS INVOLVED * X5 AMOUNT TO ADD TO THE DATA BLOCK REFERENCE COUNTS * B4 ^FRETURN^ (IN CASE OF EMPTY BLOCK) * B6 ^RETURN^ * B7 ^ARETURN^ (IN CASE OF TOO LARGE WORD COUNT) * EXIT: * B3 WILL BE LARGER THAN ITS INITIAL VALUE BY THE NUMBER * OF WORDS IN THE COMPILED MAP ENTRY. * X5, B2, B4, AND B6 ARE NOT CHANGED SPACE 2 REFER SA1 X1+B1 . FIRST WORD FO MAP ENTRY SA0 B1 . SCRATCH AREA SX0 X1 . MOT POINTER TO FILE MX7 60-21 RECS 1 SA2 A0 BX0 -X7*X2 . ECS ADDRESS OF FILE BX1 X1-X2 . COMPARE UNIQUE NAMES BX1 X7*X1 NZ X1,REFABT . FILE HAS BEEN DELETED SA2 A1+2 . CM ADDRESS, WORD COUNT SX3 X2 . WORD COUNT TO X3 AX2 18 SX2 X2 . CM ADDRESS IX2 X2+X3 IX2 X4-X2 . FL - (ADDRESS + COUNT) MX7 59 . -1 NG X2,REFABT . ADDRESS SPACE EXCEEDED SA1 A1+1 . LOGICAL FILE ADDRESS NG X1,REFABT . NO NEGATIVE ADDRESSES, PLEASE RECS P.SCRL . READ FILE DESCRIPTION SA2 A0+2 . LENGTH OF FILE IX4 X1+X3 IX4 X2-X4 NG X4,REFABT . FILE SIZE EXCEEDED SB7 REFER1 . RETURN POINT FROM DOPE VECTOR SB5 A0+3 . START OF DOPE EQ REFER2 SPACE 2 * FORM OF POINTER BLOCK LEVEL DESCRIPTION: * AX6 X * MX0 Y * JP B7 SPACE 1 REFER1 BX0 -X0*X6 . SELECT ADDRESS BITS SB5 B5+1 . MOVE TO NEXT LEVEL IX0 X0+X4 . ABS ECS ADDRESS OF NEXT POINTER RECS 1 REFER2 SA4 A0+0 . NEXT POINTER ZR X4,REFFAIL . EMPTY BLOCK BX6 X1 JP B5 . EXECUTE NEXT LEVEL DESCRIPTION SPACE 2 * FORM OF DATA BLOCK LEVEL DESCRIPTION: * SX6 LENGTH OF DATA BLOCK - 1 * JP B7+4 SPACE 1 BSS 0 IFNE *-REFER1,4,1 . THIS MUST BE AT REFER1+4 ERR . BUT IT IS NOT SPACE 1 SB5 X6+1 . DATA BLOCK LENGTH TO B5 BX6 X6*X1 . LENGTH-1 IS CORRECT MASK SPACE 2 * FORM OF SINGLE LEVEL FILE DESCRIPTION: * SB5 LENGTH OF DATA BLOCK * JP B7+5 SPACE 1 BSS 0 IFNE *-REFER1,5,1 . THIS MUST BE AT REFER1+5 ERR . BUT IT IS NOT SPACE 1 SB5 -B5 . COMPLEMENT OF BLOCK LENGTH SB7 X6+0 . STARTING ADDRESS IN FIRST BLOCK BX1 X0 . ADDRESS OF LAST POINTER SB7 B7+B5 . COMPLEMENT OF FIRST WORD COUNT SB7 X3+B7 . DECREASE WORD COUNT IX0 X4+X7 . ADDRESS OF REFERENCE COUNT REFER3 RECS 1 SA4 A0 IX6 X4+X5 . INCREMENT (DECREMENT) COUNT SA6 A0 SX3 B7 . WORD COUNT WECS 1 SB3 B3+1 GE B0,B7,REFRET . FINISHED REFER4 IX0 X1-X7 . ADDRESS OF ... BX1 X0 RECS 1 . ... NEXT POINTER SA4 A0+0 ZR X4,REFFAIL . EMPTY BLOCK DF X4,REFER5 . JUMP IF NOT DATA BLOCK IX0 X4+X7 . ADDRESS OF REFERENCE COUNT SB7 X3+B5 . DECREASE WORD COUNT EQ REFER3 REFER5 IX1 X4+X7 . PREPARE TO READ ... PL X4,REFER4 . ... FIRST POINTER OF POINTER BLOCK IX0 X0+X4 . END OF BLOCK, ... SB7 B6 . SAVE THE DAMN EXIT + SB6 *+1 . GET THE BACK POINTER FROM JP =XBKPTR . THE ALLOCATOR SB6 B7 . (RETURNED IN X1) EQ REFER4 SPACE 2 REFABT JP B7 REFFAIL JP B4 REFRET JP B6 DISASTER RJ DISASTR * REFZ ZEROES THR REFERENCE COUNTS FOR A FILE. THE GARB CNT * IS INCREMENTED IF ANY WERE NON-ZERO. IT IS CURRENTLY CALLED ONLY * FROM NEWUN ENTRY REFZ REFZ SB5 B0 .INITIALIZE REFER FLAG MX4 42 BX0 X3 .ADDRESS OF PRIMARY POINTER MX7 59 . CONSTANT -1 EQ POINT DATA RECS 1 SA1 A0+0 .WORD WITH REF COUNT BX6 X4*X1 .ZERO REF COUNT SA6 A1 WECS 1 BX6 -X4*X1 .REF COUNT SB5 B5+X6 .ADJUST REFER FLAG BX0 X2 .POINTER TO BLOCK NP BX1 X0-X3 .COMPARE WITH PRIMARY POINTER ZR X1,DONENU IX0 X0-X7 .NEXT POINTER POINT RECS 1 SA1 A0 .POINTER ZR X1,NP .EMPTY BLOCK BX2 X0 .SAVE ADDRESS OF POINTER IX0 X1-X7 .WORD WITH REF CNT(IF DATA BLOCK) ID X1,DATA .SENSE DATA BLOCK IX0 X2+X1 .WORD WITH BACKPOINTER(IF END) NG X1,ENDPT BX0 X1 .FIRST POINTER IN POINTER BLOCK EQ POINT ENDPT RECS 1 SA1 A0+0 .BACKPOINTER AX1 18 BX0 -X5*X1 .EXTRACT FIELD EQ NP DONENU ZR B5,SYSRET .FILE NOT IN MAP -OK * * GARBAGE COUNT MUST BE INCREMENTED SX0 GARBCNT RECS 1 SA1 A0+0 IX6 X1-X7 .INCREMENTED GARBCNT SA6 A0 WECS 1 JP B7 SPACE 2 TITLE CHANGE A MAP ENTRY TO ^EMPTY^ EXT SYSRET,SYSFRET * ENTRY MAPZERO * * THE SYSTEM ACTION TO CLEAR A MAP ENTRY * PARAMETERS - * AP1 - C:CLASS CODE OF RELEVANT SUBPROCESS * AP2 - D:INDEX OF MAP ENTRY * AP3 - C:FILE WHICH IS CURRENTLY IN MAP * (WITH OB.PLMPP), NOT USED IF ENTRY * ALREADY ZERO * * MAPZERO SB2 SYSRET . ^RETURN^ FROM MKEMPTY SX0 B1+P.PARAM+4 . CAPABILITY FOR FILE EQ MKEMPTY . CURRENTLY IN MAP * * SYSTEM ACTIONS TO CHANGE A (POSSIBLY) ALREADY * EXISTING MAP ENTRY * PARAMETERS - * AP1 - C:CLASS CODE OF RELEVANT SUBPROCESS * AP2 - D:INDEX OF MAP ENTRY * AP3 - C:FILE TO BE USED IN NEW MAP ENTRY * AP4 - D:FILE ADDRESS * AP5 - D:CM ADDRESS * AP6 - D:WORD COUNT * AP7 - C:FILE THAT IS IN OLD MAP ENTRY * ENTRY CHMPRW,CHMPRO CHMPRO MX6 1 . READ ONLY FLAG SX0 B1+P.PARAM+9 . CAP FOR FILE IN OLD ENTRY EQ MAPCHNG CHMPRW MX6 0 . READ-WRITE FLAG SX0 B1+P.PARAM+9 . CAP FOR FILE IN OLD ENTRY EQ MAPCHNG TITLE PUT A NEW SWAPPING DIRECTIVE IN A MAP ENTRY ENTRY MPCHGRO,MPCHGRW * SYSTEM ACTIONS TO SET A ZERO MAP ENTRY * PARAMETERS - * AP1 - C:CLASS CODE OF RELEVANT SUBPROCESS * AP2 - D:INDEX OF MAP ENTRY * AP3 - C:FILE TO BE USED IN NEW MAP ENTRY * AP4 - D:FILE ADDRESS * AP5 - D:CM ADDRESS * AP6 - D:WORD COUNT * MPCHGRO MX6 1 . READ-ONLY FLAG EQ MPCHGRW1 * MPCHGRW SX6 0 . READ/WRITE OK MPCHGRW1 SX0 0 . SIGNAL NO OLD ENTRY ALLOWED MAPCHNG SB2 MAPCHNG1 . ^RETURN^ FROM MKEMPTY SA6 B1+P.PARAM+10 . STORE READ-ONLY FLAG * * ^INTEGER^ ^PROCEDURE^ MKEMPTY(SUBP, INDEX)., * ^BEGIN^ MAP := MAPBASE(SUBP)., MKEMPTY := 0., * ^IF^ \MAP[INDEX! = ^EMPTY^ ^THEN^ * ^BEGIN^ ^IF^ IN(MAP) ^THEN^ ^IF^ \READONLY(MAP[INDEX]) * ^THEN^ ^BEGIN^ ^IF^ OLD(MAP) ^THEN^ COMPILE(MAP)., * SWAPOUT(MAP[INDEX]) * ^END^., MKEMPTY := COUNTDOWN(MAP[INDEX])., * MAP[INDEX] := ^EMPTY^., MAP[GARBGNT] := ^OLD^., * ^END^ * ^END^ EXT FINDSUB MKEMPTY SA3 B1+P.PARAM+1 . C: CLASS CODE SB5 1 SB7 MKEMPTY1 . ^RETURN^ FROM FINDSUB EQ FINDSUB MKEMPTY1 SB4 A5 SB3 A6 EQ B4,B3,NOSUBP . NO SUCH SUBPROCESS SA5 A5-B5 . SUBPROCESS DESCRIPTOR, FIRST WORD SX6 A5 SA6 B1+P.TEMP6 . SAVE START OF SUBPROCESS DESCRIPTOR LX7 B5,X5 . LEFT JSUTIFY MAPIN BIT SA5 A5+3 SA4 X5+B1 . FIRST WORD OF COMPILED MAP AREA LX5 60-18 SA3 A3+B5 . D: MAP INDEX SB4 X5+B1 . START OF SOURCE MAP SB3 X5 IX2 X3+X3 . 2 * INDEX IX2 X2+X3 . 3 * INDEX NG X2,NGMPIX . NEGATIVE MAP INDEX SA1 A5+B5 LX1 24 AX1 42 . RIGHT JUSTIFY SOURCE MAP LENGTH IX1 X3-X1 PL X1,BGMPIX . TOO-LARGE MAP INDEX SX6 X2+B3 SA6 B1+P.TEMP5 . SAVE SOURCE MAP ENTRY ADDRESS SB3 B0 SA3 X2+B4 . FIRST WORD OF INDEXED MAP ENTRY SA0 B1 . SCRATCH AREA ZR X3,MKEMPTY7 . MAP ENTRY ALREADY ZERO, EXIT ZR X0,ISENTRY . PREVIOUS ENTRY NOT ALLOWED SA1 X0 . UN,MOT OF FILE CURRENTLY IN MAP BX1 X1-X3 . CHECK IF IT REALLY IS NZ X1,NOTSAME . WRONG FILE, NAUGHTY NAUGHTY PL X7,MKEMPTY5 . MAP IS NOT IN CORE, DO NOT SWAP SA1 A3+2 LX1 1 . LEFT JUSTIFY DIRECT ACCESS BIT NG X1,ISDAE . ERROR, THIS IS DAE LX1 59 NG X1,MKEMPTY5 . THIS ENTRY IS R/O, DO NOT SWAP SX0 GARBCNT SB6 MKEMPTY3 . ^RETURN^ FROM COMPILER SB7 A1 . PRESERVE A(THIRD MAP WORD) LX5 18 RECS 1 . READ GLOBAL GC FLAG AND COUNT SA3 A0 NG X3,CALLCMP . FLAG SET, MUST COMPILE IX6 X3-X4 SX6 X6+0 . REMOVE GARBAGE NZ X6,CALLCMP . MUST RECOMPILE MKEMPTY3 SA1 B7 . PICK UP POSSIBLY NEW MAP POINTER * AX1 36 . RIGHT JUSTIFY COMPILE POINTERE SB7 X5+B1 . START OF COMPILE AREA MX7 3 MKEMPTY4 SA3 X1+B7 . NEXT WORD OF COMPILED MAP ENTRIES BX0 -X7*X3 SB6 X0 . WORD COUNT AX0 18 SA0 X0+B1 . CM ADDRESS AX0 18 SB7 B7+B5 . INCREMENT POSITION LX3 2 . LEFT JUSTIFY LAST-FLAG BIT WECS B6 PL X3,MKEMPTY4 MKEMPTY5 SX1 B4-B1 IX1 X1+X2 . RELATIVE ADDRESS, SOURCE MAP ENTRY SX4 377777B . DUMMY FL SX5 -B5 . DECREMENT TO REFERENCE COUNTS SB4 MKERROR . ^FRETURN^ FROM REFER SB7 B4 . ^ARETURN^ FROM REFER SB6 MKEMPTY6 . ^RETURN^ FROM REFER EQ REFER MKEMPTY6 SA1 B1+P.TEMP5 . ADDRESS OF SOURCE MAP ENTRY BX6 X6-X6 SA6 X1+B1 SA1 B1+P.TEMP6 . ADDRESS OF SUBP DESCRIPTOR SA5 X1+3 . MAP WORD SA3 X5+B1 . FIRST WORD OF COMPILED MAP LX3 60-18 . RIGHT JUSTIFY SPACE-REMAINING FIELD SX6 X3+B3 . ADD SPACE JUST FREED LX6 18 . REPOSITION (NOTE: GARBCNT NOW = 0) SA6 A3 MKEMPTY7 JP B2 . RETURN * MAPCHNG1 SA1 B1+P.TEMP5 . ADDRESS OF MAP ENTRY, REL. TO B1 SA2 B1+P.PARAM+4 . C: A FILE SA3 B1+P.PARAM+5 . D: ADDRESS IN THE FILE SA5 B1+P.PARAM+6 . D: CM ADDRESS SA4 B1+P.PARAM+7 . D: WORDCOUNT BX6 X2 BX7 X3 SX5 X5 . WANT ONLY 18 BITS OF ADDRESS NG X5,NGCMADR . NEGATIVE CM ADDRESS LX5 18 SX4 X4 . ALSO AN 18 BIT FIELD NG X4,NGWDCNT . NEGATIVE WORD COUNT SA6 X1+B1 SA7 A6+1 SA2 B1+P.PARAM+10 . READ-ONLY FLAG, 0 OR 1 * 2 ** 59 BX6 X5+X4 BX6 X2+X6 SB3 B0 . FOR REFER SA6 A7+1 SA2 B1+P.TEMP6 . ADDRESS OF SUBPROCESS DESCRIPTOR SA3 X2 . GET WORD WITH RA+FL, RA AX3 18 SB2 X3 . RA AX3 18 SB2 -B2 SX4 X3+B2 . (RA+FL) - RA SX5 1 . AMOUNT TO ADD TO REFERENCE COUNTS SB4 FAIL . ^FRETURN^ (EMPTY BLOCK) SB6 MAPCHNG2 . ^RETURN^ SB7 ABORT . ^ARETURN^ (WORD COUNT TOO LARGE) EQ REFER * MAPCHNG2 SA1 B1+P.TEMP6 SA5 X1+3 . MAP WORD SA3 X5+B1 . FIRST WORD OF COMPILE BUFFER LX3 60-18 . RIGHT JUSTIFY REMAINING-SPACE FIELD SB3 -B3 . -(AMOUNT OF EXTRA SPACE NEEDED) SX6 X3+B3 NG X6,FULLBUFF . NOT ENOUGH SPACE LEFT LX6 18 . NOTE THAT GARBAGE COUNT IS ZERO NOW SA6 A3 SA3 X1 . GET MAPIN-BIT WORD LX3 1 PL X3,SYSRET . EXIT, MAP NOT IN NOW SB6 MAPCHNG3 . ^RETURN^ FROM COMPILER SX0 GARBCNT RECS 1 SA3 A0 SB5 B0 . INSURE NON-NEGATIVE SB7 B0 EQ CALLCMP . RECOMPILE MAP * MAPCHNG3 SA1 B1+P.TEMP5 . ADDRESS OF SOURCE MAP ENTRY SX1 X1+B1 . NOW, ABSOLUTE MX7 3 . MASK TO CLEAR FLAGS SA1 X1+2 AX1 18+18 . RIGHT JUSTIFY COMPILE POINTER SB2 X5+B1 NO NO NO SA2 X1+B2 . FIRST COMPILED MAP ENTRY TO SWAP IN MAPCHNG4 BX0 -X7*X2 . CLEAR OUT FLAG BITS SB2 X0+0 . WORD COUNT AX0 18 SA0 X0+B1 . CM ADDRESS AX0 18 LX2 2 . LEFT JUSTIFY LAST-FLAG BIT RECS B2 NG X2,SYSRET . LAST ENTYR SWAPPED SA2 A2+1 EQ MAPCHNG4 * FAIL SB2 SYSFRET FAIL1 SA1 B1+P.TEMP5 . ADDRESS OF SOURCE MAP ENTRY SX4 377777B . DUMMY FL SX5 -1 . DECREMENT REFERENCE COUNTS SB4 FAIL2 EQ REFER * FAIL2 SA1 B1+P.TEMP5 BX6 X6-X6 SA6 X1+B1 . ZERO MAP ENTRY JP B2 . EXIT * ABORT SA1 B1+P.TEMP5 . ADDRESS OF SOURCE MAP ENTRY BX6 X6-X6 SA6 X1+B1 . ZERO MAP ENTRY EQ ARET1 FULLBUFF SB2 FULLBUF1 SB6 FAIL2 . REFER SHOULD DO A ^RETURN^ EQ FAIL1 * FULLBUF1 SX6 E.SUBP SX7 E.COMP EQ E.ERROR NGCMADR SX1 4 EQ ERR20 NGWDCNT SX1 5 EQ ERR20 NOSUBP SX7 E.NOFIND SX6 E.SUBP EQ E.ERROR NGMPIX SX1 1 EQ ERR20 BGMPIX SX1 1 EQ ERR21 ISENTRY SX7 E.PRENT . CANT DO A SET WHEN THERES A EQ MAPERR . PREVIOUSLY EXISTING ENTRY NOTSAME SX7 E.WRGFL . FILE CAP NOT SAME AS FILE IN EQ MAPERR . EXISTING ENTRY TITLE ACTIONS TO MANIPULATE THE DIRECT ACCESS ECS MAP ENTRY * CLERDAE CLEARS THE DIRECT ACCESS ENTRY IN THE MAP OF A NAMED * SUBPROCESS. ITS ONLY PARAMETERS ARE A CLASS CODE IN AP1 AND A RETURN * LINK IN B2. IT LEAVES MAPWORD IN X1, LEFT SHIFTED BY 42. ENTRY CLRDAE,SETDAE CLRDAE SB2 SYSRET CLERDAE SA3 B1+DAE.CC+1 * SUBPROCESS IN QUESTION SB7 CLERDAE1 SB5 1 EQ FINDSUB * CLERDAE1 SB6 A5 SB7 A6 EQ B6,B7,NOSUBP SA1 A5-B5 * PICK UP FIRST SUBP. DESCR. WORD LX1 2 * LEFT JUSTIFY DAE BIT PL X1,CLERDAE3 * NO DIRECT ACCESS ENTRY MX7 1 BX7 -X7*X1 * CLEAR BIT LX7 58 SA7 A1 SA1 A1+3 * MAP WORD SA2 X1+B1 * FIRST WORD OF COMPILED MAP BUFFER AX2 18 * RIGHT JUSTIFY REMAINING-SPACE FIELD SX6 X2+B5 * INCREMENT IT (AND CLEAR GARBCNT) LX6 18 SA6 A2 AX1 18 * RIGHT JUSTIFY SOURCE MAP POINTER SX7 377777B * DUMMY FL FOR REFER MX5 59 * DECREMENT FOR REFER SX6 A1-B1 SA6 B1+P.TEMP1 * SAVE MAP-WORD ADDRESS SB4 MKERROR * ^FRETURN^ FROM REFER SB6 CLERDAE2 * ^RETURN^ SB7 MKERROR * ^ARETURN^ EQ REFER * CLERDAE2 SA1 B1+P.TEMP1 SB3 X1-3 SA1 X1+B1 LX1 60-18 BX6 X6-X6 SA6 X1+B1 * ZERO SOURCE MAP ENTRY SA2 B1+P.STACK SA2 X2+B1 SB3 -B3 SB3 X2+B3 NZ B3,CLERDAE4 MX0 60-18-18 SA2 B1+P.XPACK+4 BX6 -X0*X2 SA6 A2 SA2 A2+1 BX6 -X0*X2 SA6 A2 CLERDAE4 JP B2 * RETURN * CLERDAE3 SA1 A1+3 * MAP WORD LX1 60-18 * GET SOURCE MAP POINTER SA2 X1+B1 NZ X2,NOTDAE * ERROR, ENTRY IS SWAPPING DIRECTIVE SX6 A1-B1 SA6 B1+P.TEMP1 JP B2 * RETURN * SETDAE SETS THE DIRECT-ACCESS ECS ENTRY IN THE MAP OF A NAMED * SUBPROCESS. IT USES CLERDAE. PARAMETERS: C: EQU 2 D: EQU 1 ORG P.PARAM DAE.CC BSS C: * A CLASS CODE DAE.FIL BSS C: * A FILE DAE.FAD BSS D: * AN ADDRESS IN THE ABOVE FILE DAE.WC BSS D: * A WORD COUNT USE * SETDAE SB2 SETDAE1 EQ CLERDAE * SETDAE1 SA2 B1+DAE.FIL+1 * UN, MOT INDEX OF FILE BX6 X2 SA6 X1+B1 * FIRST WORD OF SOURCE MAP ENTRY SA2 B1+DAE.FAD * FILE ADDRESS SA4 B1+DAE.WC * WORD COUNT BX6 X2 SA6 A6+1 * SECOND SOURCE MAP ENTRY WORD SX4 X4 NG X4,NGWDCNT * ERROR MX6 2 * SET READ-ONLY, DAE BITS BX6 X6+X4 SB3 -1 * REFER WILL INCR. B3 BY NO. OF BLOCKS SA6 A6+1 * THIRD (AND LAST) WORD IN MAP ENTRY SX4 377777B * HUGE..HUGE..HUGE FL SX5 1 * INCREMENT FOR REFER SB4 FRET * ^FRETURN^ SB6 SETDAE2 * ^RETURN^ SB7 ARET * ^ARETURN^ EQ REFER * SETDAE2 NZ B3,NOT1BLK * ERROR, MORE THAN 1 FILE BLOCK SA1 B1+P.TEMP1 SB2 X1-3 SA5 X1+B1 * MAP-WORD SA2 X5+B1 * COMPILED MAP HEADER AX2 18 SX6 X2-1 NG X6,FLBF * INSUFFICIENT COMPILED MAP BUFFER SPAC LX6 18 SA6 A2 SA2 B1+P.STACK * STACK POINTER SA2 X2+B1 * TOP OF STACK SB2 -B2 SB2 X2+B2 * DID WE DIDDLE CURRENT SUBP? NZ B2,SYSRET * NO SB5 B0 SB7 B0 SB6 SETDAE3 EQ CALLCMP * COMPILE MAP * SETDAE3 SA1 A4+1 * "SWAPPING DIRECTIVE" FOR DAE SA2 B1+P.XPACK+5 * FL[ECS] WORD SX6 X1 * WORD COUNT LX6 18+18 MX0 60-18-18 BX2 -X0*X2 BX6 X6+X2 SA6 A2 SA2 A2-1 * RA[ECS] WORD MX6 3 * MASK TO CLEAR FLAG BITS BX6 -X6*X1 BX6 X0*X6 * CLEAR CM ADDRESS, WORD COUNT BX2 -X0*X2 * CLEAR OLD RA BX6 X2+X6 SA3 =XS.ECSRA LX3 36 IX6 X3+X6 SA6 A2 EQ SYSRET * NOT1BLK SB2 NOT1BLK1 COUNTDN0 SB6 COUNTDN1 * ^RETURN^ FROM REFER COUNTDN SA1 B1+P.TEMP1 SA1 X1+B1 * PICK UP MAP-WORD LX1 60-18 SX4 377777B * DUMMY FL MX5 59 * DECREMENT REFERENCE COUNT(S) SB7 MKERROR *************************************** EQ REFER * ARET SB2 ARET1 * COUNTDN1 SA1 B1+P.TEMP1 SA1 X1+B1 LX1 60-18 BX6 X6-X6 SA6 X1+B1 * ZERO DAE FIRST WORD SA1 A1-3 LX1 2 MX6 1 BX6 -X6*X1 * CLEAR DAE BIT LX6 58 SA6 A1 JP B2 * FRET SB2 SYSFRET SB4 COUNTDN1 EQ COUNTDN * NOT1BLK1 SX7 E.NT1BLK EQ MAPERR * NOTDAE SX7 E.NOTDAE EQ MAPERR FLBF SB2 FULLBUF1 EQ COUNTDN0 * ARET1 SX7 E.BADNWS MAPERR SX6 E.MAPS EQ E.ERROR TITLE DISPLAY A MAP ENTRY * * DISMAP IS AN ACTION TO DISPLAY * A MAP ENTRY * * PARAMETERS: C: A CLASS CODE * D: A MAP INDEX * D: AN ADDRESS * * THE THREE-WORD ENTRY SPECIFIED BY AP1 AND AP2 * IS TRANSMITTED TO LOCATION AP3 * ECSCODE DSMAP EXT FINDSUB DISMAP SB5 1 SA1 B1+P.XPACK+1 AX1 36 SB3 X1 B3:=RA * SA2 A1+B5 AX2 36 X2:=FL * SB7 DM2 RETURN FROM FINDSUB SA1 B1+P.PARAM+3 X1:=AP3 NG X1,ERR202 ERROR - NEGATIVE ADDRESS SB4 X2 B4:=FL SA2 A1-B5 X2:=AP2 SB2 X1+2 GT B2,B4,ERR212 ERROR - WRITE AREA EXCEEDS USER FL NG X2,ERR201 ERROR - NEGATIVE MAP INDEX SB2 X1+B3 B2:=ABSOLUTE VALUE OF AP3 SA3 A2-B5 X3:=AP1(CLASS CODE) EQ FINDSUB DM2 SB3 A5 * FINDSUB RETURNS POINTER TO SUBP DESCRIPTOR IN A5 SB4 A6 EQ B3,B4,ERR45 ERROR - CLASS CODE DID NOT MATCH * SB6 X2 SB7 B6+B6 SB7 B7+B6 B7 :=X2*3 * SA5 A5+3 AX5 18 SB3 X5 B3:=MAP LENGTH * SA5 A5-B5 GE B6,B3,ERR211 ERROR - MAP INDEX TOO LARGE AX5 18 X5:=POINTER TO MAP * SX5 X5+B1 SA1 X5+B7 * T BX6 X1 * R SA6 B2 * A DUP 2,3 * N SA1 A1+B5 * S BX6 X1 * F SA6 A6+B5 * E * * R EQ SYSRET ENDECS DSMAP * * * THIS ACTION DISPLAYS AN ENTRY FROM THE FULL MAP * PARAMETERS : D: AN INDEX IN THE FULL MAP * D: USER CM ADDRESS FOR XFER * ECSCODE DFMAP DSFMAP SB2 -1 SA1 B1+P.XPACK+1 SA2 A1-B2 AX1 36 SAVE RA AX2 36 SB4 X2+B2 FL-1 SA2 B1+P.PARAM+1 NG X2,ERR201 ERROR-NEG CM ADDRESS SB3 X2 CM ADDRESS LE B4,B3,ERR211 SA2 A2+B2 SA3 B1+P.STACK SB6 X2 MAP INDEX SA4 B1+X3 TOP OF STACK NG X2,ERR200 NEGATIVE MAP INDEX SB4 X4 CURRENT SUBP AX4 18 SB5 X4+B1 SA2 B5+2 AX2 18 SB7 X2 MAP ORIGIN OF TOP-OF-PATH SA2 A2+2 AX2 18 SB7 B7+X2 ADD IN MAP LENGTH OF T-O-P SB5 B4+B1 SA2 B5+2 AX2 18 SB6 B6+X2 ADD MAP ORIGIN OF CUURENT SUBP SB6 B6-B7 * B6 CONTAINS (FULL MAP INDEX) + (MAP ORIG - CURR. SUBP) * -(MAP ORIG - TOP) - (LENGTH MAP - TOP) PL B6,ERR210 INDEX .GE. TOTAL LENGTH LP2 SB5 X4 BACKPOINTER SA4 B5+B1 SA3 A4+4 AX3 18 SB6 B6+X3 ADD IN LOCAL LENGTH NG B6,LP2 * WHEN B6 .GE. 0 IT IS INDEX RELATIVE TO SUBP AT (B5) SA3 A3+B2 AX3 18 MAP POINTER SB7 B6+B6 SB7 B7+B6 B7:=B6*3 SB7 B7+B1 SA2 X3+B7 * T BX6 X2 * R SA6 X1+B3 * A SA2 A2-B2 * N BX6 X2 * S SA6 A6-B2 * F SA2 A2-B2 * E BX6 X2 * R SA6 A6-B2 EQ SYSRET ENDECS DFMAP * ERRORS * ERR201 SX1 1 EQ ERR20 ERR202 SX1 2 EQ ERR20 ERR212 SX1 2 EQ ERR21 ERR211 SX1 1 EQ ERR21 ERR200 SX1 0 EQ ERR20 ERR210 SX1 0 EQ ERR21 ERR45 SX7 E.NOFIND SX6 E.SUBP EQ E.ERROR ERR21 SX7 E.BIGPAR EQ ERR2 ERR20 SX7 E.NEGPAR ERR2 LX1 18 MX2 42 BX1 X1*X2 BX7 X1+X7 SX6 E.PARMS EQ E.ERROR ISDAE SX7 E.ISDAE EQ MAPERR * ERRNUMS XTEXT END