IDENT FILES TITLE FILES - CREATION, DELETION, AND ACCESSING ENTRY CREABLK ENTRY READFIL,WRITFIL EXT SYSRET,SYSFRET,E.ERROR EXT MAKEOBJ,CAPAB,PUTCAP EXT FUNDX7,ALLOC,IP.AWDS RECS MACRO A RE A RJ =XE.ECS ENDM WECS MACRO A WE A RJ =XE.ECS ENDM * INTSYS XTEXT * PROCSYM XTEXT P.CALL EQU P.TEMP1 P.START EQU P.TEMP2 P.LENGTH EQU P.TEMP3 P.INDEX EQU P.TEMP4 MAKEP SAVES POINTER INDEX HERE * * TYPES XTEXT * ECSMAC XTEXT CBLOCK MICRO 1,,*/EFILES/* TITLE CREATE A FILE DESCRIPTION S.PTRBLK EQU GT.PTRB S.DTABLK EQU GT.NRMB ECSCODE CRFIL CREAFIL SA1 B1+P.PARAM+2 . TEST CAPABILITY INDEX NG X1,NEGINDX . ERROR, NEGATIVE INDEX GIVEN SA2 B1+P.CLIST SA2 B1+X2 IX1 X1-X2 NG X1,CREAFILB . INDEX OK CREAFILA SA2 A2+2 ZR X2,BIGINDX . INDEX IS TOO LARGE IX1 X1-X2 PL X1,CREAFILA SPACE 2 CREAFILB SA1 B1+P.PARAM+3 . D: NUMBER OF LEVELS SA2 B1+P.PARAM+4 . D : ADDRESS OF SHAPE LIST NG X2,NEGADD . ERROR, NEGATIVE ADDRESS SA3 B1+P.XPACK+2 . SUBPROCESS FL SA4 B1+P.XPACK+1 . RA AX3 36 AX4 36 MX7 59 . -1 IX1 X1+X7 NG X1,BADCNT . COUNT MUST BE > 0 SX5 X1-P.SCRL+3 PL X5,BIGDSCR . FILE DESCRIPTION TOO LARGE IX5 X2+X1 . LWA OF LIST IX3 X5-X3 PL X3,BIGADD . ADDRESS SPACE EXCEEDED IX2 X4+X2 . ABS START ADDRESS OF LIST MX0 60-17 SB2 X1+4 . FILE DESCRIPTION SIZE SB6 X1 . NUMBER OF LEVELS - 1 SA1 X2+B6 . LAST SHAPE NUMBER (DATA BLOCK LEN) IX3 X1+X7 BX4 X0*X1 NG X3,NEGSIZ . SIZE MUST BE > 0 NZ X4,BIGSIZ . SIZE MUST BE < 2 ** 17 ZR B6,CREAFIL6 . THIS IS A SINGLE LEVEL FILE BX4 X1*X3 NX5 B4,X1 . B4 := 47 - LOG2(N) NZ X4,NOTPOW . SIZE MUST = 2 ** I, SOME I SA4 CREAFIL7 . = SX6 0, JP B7+4= SB4 B4-47 . B4 := -LOG2(N) SB4 -B4 LX3 30 BX6 X4+X3 . ADD DATA BLOCK LENGTH - 1 TO DOPE SA0 B1+3 . ABS ADDRESS FOR FIRST DOPE WORD SA6 A0+B6 . STORE LAST LEVEL DOPE WORD SB5 59 . LOG2(FILE SIZE) MUST BE < 60 SA3 CREAFIL8 . = AX6 0, MX0 0, JP B7= CREAFIL1 SB6 X7+B6 . DECREMENT LEVEL COUNT SA1 X2+B6 . NEXT SHAPE NUMBER IX4 X1+X7 BX5 X0*X1 NG X4,NEGSIZ SX6 B4 NZ X5,BIGSIZ LX6 45 BX6 X3+X6 . ADD SHIFT COUNT TO DOPE WORD NX5 B3,X1 . B3 := 47 - LOG2(N) BX4 X1*X4 ZR B6,CREAFIL2 . THIS IS FIRST LEVEL SB3 B3-47 . B3 := -LOG2(N) NZ X4,NOTPOW SB4 B4-B3 . TOTAL := TOTAL + NEW LOG2 SX5 B3+60 . 60 - LOG2(N) LX5 30 BX6 X6+X5 . ADD MASK SIZE TO DOPE WORD SA6 A0+B6 EQ CREAFIL1 SPACE 2 CREAFIL2 MX0 13 LX5 B3,X1 .NORMALIZE SHAPE NUMBER BX5 -X0*X5 SA6 A0 . STORE FIRST LEVEL DOPE WORD LX6 B4,X1 . SHAPE NUMBER 1 * 2 ^ (SUM(LOG2(SN(I)),I>1) ZR X5,CREAFIL3 . N WAS A POWER OF TWO SB3 X7+B3 . ONE MORE CREAFIL3 SB3 B3-47 SB4 B4-B3 GT B4,B5,BIGFIL . TOO LARGE SA6 B1+2 . LENGTH OF FILE SPACE 1 CREAFIL4 SX7 AT.FILE . ALLOCATION TYPE SB4 CREAFIL5 . ^RETURN^ LINK FROM MAKEOBJ SA5 B1+P.PARAM+1 . ALLOCATION BLOCK UN + MOT BX6 X5 SA6 B1+1 . PUT AB IN FILE DESCRIPTION EQ MAKEOBJ . CREAFIL5 BX6 X6-X6 SA6 B1 . EMPTY FILE POINTER SA0 B1 . FILE DESCRIPTION IS IN SCRATCH AREA BX0 X5 . ECS ADDRESS WECS B2 SB5 CAPAB . CAPABILITY FOR FILE SB6 SYSRET . ^RETURN^ LINK FROM PUTCAP SA1 B1+P.PARAM+2 . C-LIST INDEX EQ PUTCAP . PUT CAPABILITY IN FULL C-LIST SPACE 2 CREAFIL6 SA2 CREAFIL9 . = SB5 0, JP B7+5= SX7 X1 LX1 30 BX6 X2+X1 SA6 B1+3 . STORE DOPE WORD SA7 B1+2 . LENGTH OF FILE EQ CREAFIL4 SPACE 2 CREAFIL7 SX6 0 JP B7+4 . LAST DOPE WORD OF MULTI-LEVEL FILE SPACE 1 CREAFIL8 AX6 0 MX0 0 JP B7 . DOPE WORD OF MULTI-LEVEL FILE SPACE 1 CREAFIL9 SB5 0 JP B7+5 . DOPE WORD OF SINGLE LEVEL FILE ENDECS CRFIL TITLE CREATE A DATA BLOCK CREABLK SB2 B1+P.PARAM+2 SX5 0 . FLAG SO MAKEP WILL FUND DATA BLOCK SB7 CREABLK1 . ^RETURN^ LINK FROM MAKEP * * MAKEP IS USED TO CREATE (IF NECESSARY) THE POINTER BLOCKS WHICH WILL * BE NEEDED WHEN A DATA BLOCK IS PLACED AT A PARTICULAR ADDRESS. IT FIRST * ADDS UP THE AMOUNT OF SPACE NEEDED AND FUNDS THE PROSPECTIVE * ALLOCATION. THEN EACH POINTER BLOCK IS ALLOCATED AND LINKED INTO THE * FILE STRUCTURE. * * PARAMETERS: * * X5 - FLAG, .NOT. 0 => DO NOT FUND THE DATA BLOCK * B2 - ABS POINTER TO (FILE, FILE ADDRESS) PAIR IN THE AP LIST. * SPECIFICALLY IT POINTS TO THE FILE ADDRESS. * B7 - RETURN * * RETURNS: * B5 - DATA BLOCK LENGTH * X5 - ABS ECS ADDRESS OF WORD TO POINT TO DATA BLOCK * * USES: * * P.TEMP1, P.TEMP2, P.TEMP3 (ALIAS P.CALL, P.START, P.LENGTH) * P.TEMP4 (AS P.INDEX) * ALL REGISTERS * * CALLS: CHECK, FUNDX7, AND ALLOC * * ERROR EXIT: ISBLK - IF DATA BLOCK ALREADY EXISTS * MAKEP SX7 B7 LX7 18 SX6 B2 BX7 X7+X6 SA7 B1+P.CALL . SAVE RETURN AND PARAMETER SB6 MAKEP0 . ^RETURN^ LINK FROM CHECK SPACE 2 * * CHECK IS USED TO FIND HOW MANY LEVELS OF A FILE EXIST AT A GIVEN * ADDRESS. IT USES THE FILE DOPE VECTOR TO WALK DOWN THE TREE, AND * THEN COUNT THE NUMBER OF MISSING LEVELS. * * PARAMETERS: * * B2 - ABSOLUTE PTR TO (FILE, FILE ADDRESS) PAIR IN AP LIST. * SPECIFICALLY IT POINTS TO THE FILE ADDRESS. * B6 - RETURN * * RETURNS: * * X7 - NUMBER OF MISSING LEVELS * X0 - ADDRESS OF LAST (EXISTING) POINTER * X2 - LENGTH OF FILE * X3 - START OF LAST (EXISTING) BLOCK * B3 - IF X7 .NE. 0, THE ABS ADDRESS (IN SCRATCH AREA) * OF THE NEXT DOPE VECTOR WORD * B5 - IF X7 .EQ. 0, THE DATA BLOCK LENGTH * A0 - =B1, THE SCRATCH AREA ADDRESS * SCRATCH AREA - THE FILE DOPE VECTOR * * DOES NOT CHANGE: * A3, A5-X5, A6, A7, B1, B2, B3 (ONLY IF X7=0), B5 (ONLY IF * X7.NE.0), AND B6 * * ERROR EXITS: * * MISFIL - IF THE FILE DOES NOT EXIST * NEGX - IF THE FILE ADDRESS < 0 * BIGX - IF THE FILE ADDRESS >= FILE SIZE * CHECK SA1 B2-1 . C: A FILE SX0 X1 . MOT ENTRY ADDRESS SA0 B1 . SCRATCH AREA RECS 1 MX6 60-21 SA2 A0 BX0 -X6*X2 . ECS ADDRESS OF FILE BX1 X1-X2 . COMPARE UNIQUE NAMES BX3 X0 . SAVE ADDRESS OF POINTER BX1 X6*X1 NZ X1,MISFIL . ERROR, MISSING FILE RECS P.SCRL .READ FILE DISCRIPTOR SB7 CHECK0 . RETURN FROM DOPE VECTOR SB4 A0+3 . START OF DOEP SA1 B2 . FILE ADDRESS NG X1,NEGX . ERROR - NEG ADDRESS SA2 A0+2 . LENGTH OF FILE IX6 X1-X2 NG X6,CHECK1 EQ BIGX . ERROR - ADDRESS TOO LARGE SPACE 2 CHECK0 BX0 -X0*X6 . SELECT RELEVANT ADDRESS BITS IX0 X0+X4 . ADDRESS OF ... SB4 B4+1 RECS 1 . ... NEXT POINTER SPACE 1 CHECK1 SA4 A0 ZR X4,CHECK3 . EMPTY BLOCK BX3 X4 . START OF BLOCK BX6 X1 JP B4 . EXECUTE NEXT LEVEL DESCRIPTION SPACE 2 + SB5 X6+1 . DATA BLOCK LENGTH SPACE 1 * * NOTE...THIS INSTRUCTION MUST BE EXACTLY 5 WORDS * FROM ^CHECK0^ * + SX7 B0 JP B6 . THERE WERE NO MISSING LEVELS CHECK3 SB3 B4+0 CHECK4 SA4 B4+0 SB4 B4+1 PL X4,CHECK4 . NOT YET TO LEVEL WITH SX6 SX7 B4-B3 JP B6 SPACE 2 MAKEP0 ZR X7,ISBLK . DATA BLOCK EXISTS SB7 MAKEP0A . RETURN FROM DOPE VECTOR SB4 B3 . SAVE INDEX IN DOPE MX7 60-21 . STRIP INDEX OFF POINTER BX7 -X7*X3 SA7 B1+P.START . START ADDRESS, LAST BLOCK SX3 1+IP.AWDS+1 .. 1+ALLOC PREFIX+TRAILER IX6 X0-X7 SB6 X6 . INDEX OF MISSING POINTER BX7 X7-X7 .. AMOUNT OF ECS NEEDED SX4 1 IX6 X2-X4 .. LAST ADDRESS = LENGTH - 1 JP B3 MAKEP0A BX0 -X0*X6 . BLOCK LENGTH - 1 IX7 X7+X0 IX7 X7+X3 . LENGTH WITH HEADER, TRAILER IX6 X2-X4 .. RESET X6 SB3 B3+1 JP B3 BSSZ 4-*+MAKEP0A SB5 X6+1 . X6 = DATA BLOCK LENGTH - 1 * * THE LAST INSTRUCITON MUST BE AT MAKEP0A+4 AND THE NEXT INSTRUCTION * MUST BE AT MAKEP0A+5. * + SX6 B5 . AMOUNT NEEDED FOR DATA BLOCK SB3 MAKEP0B .. RETURN LINK FORM FUNDX7 SX4 IP.AWDS IX6 X6+X4 . ALLOCATORS SURCHARGE NZ X5,MAKEP0C .. DO NOT FUND DATA BLOCK IX7 X7+X6 MAKEP0C SA5 A0+1 . AB UN + MOT EQ FUNDX7 MAKEP0B MX4 60-1 . -1 SA1 B1+P.START IX0 X1+X4 . POINTER COUNT ADDRESS SA0 B1 SX2 B6 . INDEX OF MISSING POINTER IX5 X1+X2 RECS 1 SA1 A0 SB7 MAKEP2 NG X1,MAKEP1 . THIS IS THE FILE DESCRIPTION IX6 X1-X4 . BUMP THE POINTER COUNT SA6 A0 WECS 1 MAKEP1 SA1 A0+2 . LENGTH OF FIEL IX6 X1+X4 . MAX ADDRESS SX7 B6+1 .. POINTER INDEX (ROUGHLY) LX7 24 SA7 B1+P.INDEX .. SAVE FOR MAKEP3, CREABLK AND MOVBLK JP B4 . FIND LENGTH OF LAST BLOCK MAKEP2 BX0 -X0*X6 . SIZE OF BLOCK (ALMOST) SB7 MAKEP3 . ^RETURN^ LINK FROM ALLOC IX7 X0-X4 .. NUMBER OF PTRS IN NEW BLOCK SA7 B1+P.LENGTH .. SAVE TO MAKE TRAILER WORD SX7 IP.AWDS+1+1 . GET TRUE SIZE OF BLOCK IX7 X0+X7 . IN X7 FOR ALLOC SB2 S.PTRBLK . GARBAGE TYPE IS PTR BLOCK EQ ALLOC BSSZ 4-*+MAKEP2 SB5 X6+1 . LENGHH OF DATA BLOCK + SA1 B1+P.CALL AX1 18 SB7 X1 JP B7 . RETURN MAKEP3 BX0 X5 . ADDRESS OF ONCE EMPTY POINTER SA2 B1+P.INDEX .. PREPOSITIONED POINTER INDEX SA0 B1 . RESTORE A0 AFTER ALLOC RECS 1 . POINTER TO NEW BLOCK SA1 A0 BX7 X1+X2 . COMBINE INDEX WITH POINTER SA7 A0 WECS 1 MX4 60-1 . -1 SA3 B1+P.LENGTH .. NUMBER OF POINTERS IN NEW BLOCK IX0 X1+X3 . ADDRESS OF TRAILER WORD BX6 -X3 .. -(NUMBER OF POINTERS) SA6 A0 WECS 1 . WRITE OUT BYPASS BX5 X1 .. START OF POINTER BLOCK SA2 B1+P.CALL IX0 X1+X4 . ADDRESS OF POINTER COUNT WORD SA2 X2 . FILE ADDRESS SB7 MAKEP4 . RETURN FROM DV BX7 -X4 . INITIAL POINTER COUNT = 1 RECS 1 SA1 A0 BX7 X1+X7 SA7 A0 BX6 X2 . FILE ADDRESS WECS 1 JP B4 MAKEP4 SB4 B4+1 . ADVANCE TO NEXT LEVEL BX6 -X0*X6 IX5 X5+X6 . MISSING POINTER ADDRESS SB6 X6+0 . INDEX ( - 1 ) IN BLOCK SB7 MAKEP2 EQ MAKEP1 . DO ANOTHER LEVEL SPACE 1 CREABLK1 SX7 B5+IP.AWDS .. LENGTH OF DATA BLOCK WITH * ALLOC PREFIX SB7 CREABLK2 .. RETURN LINK FROM ALLOC SB2 S.DTABLK . GARBAGE TYPE IS "NORMAL" EQ ALLOC * * ADD +INDEF EXPONENT TO THE ADATA BLOCK POINTER * CREABLK2 BX0 X5 .. ADDRESS OF POINTER SA0 B1 . SCRATCH AREA MX1 10 LX1 60-2 . MAKE 1777, LEFT ADJUSTED RECS 1 SA2 A0 SA3 B1+P.INDEX .. PRE-POSITIONED INDEX BX2 X2+X3 BX6 X1+X2 SA6 A0+0 WECS 1 EQ SYSRET . EXIT TITLE CHECK LEVEL ENTRY CHKBLK ENTRY DELBLK EXT RTRNFIL * CHKBLK IS GIVEN AN ADDRESS WITHIN A FILE, AND RETURNS IN X6 OF THE * CALLING SUBPROCESS THE NUMBER OF MISSING LEVELS AT THE GIVEN ADDRESS, * THUS 0 IF THE BLOCK CONTAINING THE ADDRESS IS PRESENT, N IF THE N- * LEVEL FILE IS COMPLETELY EMPTY. * CHKBLK SB2 B1+P.PARAM+2 . FILE ADDRESS SB6 CHKBLK1 . ^RETURN^ LINK FROM CHECK EQ CHECK CHKBLK1 SA7 B1+P.XPACK+14 . STORE NUMBER OF MISSING LEVELS EQ SYSRET TITLE DELETE A FILE BLOCK * DELBLK IS AN ECS ACTION TO DELETE A DATA BLOCK FROM A FILE. ANY NON-N * ECCESSARY POINTER BLOCKS WILL ALSO BE DELETED. * * PARAMETERS: C: A FILE * D: AN ADDRESS WITHIN THE BLOCK TO BE DESTROYED * DELBLK SB2 B1+P.PARAM+2 . FILE ADDRESS SB6 DELBLK1 . ^RETURN^ FROM CHECK EQ CHECK * DELBLK1 NZ X7,NOBLK . NO BLOCK TO DELETE SA5 B1+1 . ALLOCATION BLOCK FOR FILE BX6 X0 . ADDRESS OF LAST POINTER SA6 B1+P.TEMP1 . SAVE FOR DELEP TO USE MX0 59 . =-1 IX0 X3+X0 . ADDRESS OF REFERENCE COUNT RECS 1 SA1 A0 SX1 X1 .. CLEAR DIRTY BIT, ETC. NZ X1,INMAPS . THIS BLOCK IS IN A MAP SB7 DELBLK2 . ^RETURN^ LINK EQ RTRNFIL DELBLK2 SB4 SYSRET SPACE 2 * DELEP IS GIVEN THE ADDRESS WHERE THE POINTER TO A DATA BLOCK WAS. IT * THEN GOES UP THROUGH THE FILE DELETING AS MANY POINTER BLOCKS AS * POSSIBLE. * * ENTRY: B4 = RETURN * B1 = SCRATCH AREA, CONTAINING AT LEAST THE SECOND WORD OF THE * FILE DESCRIPTOR (ALLOCATION BLOCK UN, MOT INDEX) * P.TEMP1 = ADDRESS OF NOW-EMPTY POINTER * DELEP SA5 B1+P.TEMP1 BX0 X5 . ECS ADDRESS OF POINTER SA0 B1+0 MX4 59 . =-1 MX7 60-18 RECS 1 SA1 A0 AX1 24 SA0 =0 WECS 1 . ZERO POINTER WORD SA0 B1 . RESET A0 TO SCRATCH AREA BX1 -X7*X1 . EXTRACT INDEX FIELD IX0 X0-X1 . ADDRESS OF POINTER COUNT RECS 1 SA1 A0 NG X1,DELEP1 . THIS IS A FILE DESCRIPTION IX6 X1+X4 . DECREMENT POINTER COUNT ZR X6,DELEP2 . THIS POINTER BLOCK IS NOW EMPTY SA6 A0 WECS 1 NG X6,PTRDIS DELEP1 JP B4 . RETURN * DELEP2 IX0 X0-X4 . A(OBJECT) SB6 DELEP3 . GET BACK POINTER FROM ALLOCATOR JP =XBKPTR DELEP3 BX6 X1 . IT CAME BACK IN X1 SA6 B1+P.TEMP1 . SAVE FOR LATER SA5 B1+1 . ALLOCATION BLOCK FOR RTRNFIL SB7 DELEP . ^RETURN^ LINK EQ RTRNFIL * * * THE COUNT ON A POINTER BLOCK BETTER NOT BE NEGATIVE * EVER AGAIN. VV, 17 JAN 71 AD * PTRDIS RJ =XDISASTR TITLE DELETE A FILE DESCRIPTOR ECSCODE DLFIL EXT DELOBJ * DEFFIL SHOULD BE CALLED WITH A FILE WHICH IS EMPTY AND IS TO BE DESTOY * ED. IF THE FILE IS NOT EMPTY, AN ERROR IS GENERATED, OTHERWISE THE * FILE IS DELETED. * * PARAMETER: C: A FILE * DELFIL SA5 B1+P.PARAM+1 . MOT INDEX AND U.N. SA0 B1 SX0 X5 RECS 1 SA1 A0 . MOT ENTRY MX6 60-21 BX0 -X6*X1 . ECS ADDRESS OF FILE BX1 X5-X1 BX1 X6*X1 NZ X1,MISFIL RECS 1 SA1 A0 NZ X1,NOTEMPTY . FILE MUST BE EMPTY SB7 SYSRET EQ DELOBJ ENDECS DLFIL TITLE READ THE SHAPE OF A FILE * READSHP IS AN ECS ACTION TO RETRIEVE THE SHAPE NUMBERS FOR A FILE. IT * IS CALLED WITH THE ADDRESS AND LENTH OF A BUFFER AREA IN SUBPROCESS * MEMORY, INTO THE FIRST WORD OF WHICH WILL BE PLACED THE NUMBER OF SHAP * E NUMBERS THE FILE POSSESSES. THE REMAINDER OF THE AREA WILL BE FILLED * WITH SHAPE NUMBERS, UNTIL THE END OF THE BUFFER IS REACHED OR ALL * SHAPE NUMBERS ARE RETURNED. * * PARAMETERS: C: A FILE * D: AN ADDRESS IN SUBPROCESS MEMORY * D: A NUMBER EXPRESSING THE LENGTH OF THE BUFFER AP2 * ECSCODE RDSHP READSHP SA1 B1+P.PARAM+2 . BUFFER ADDRESS NG X1,NEGX SA2 A1+1 . BUFFER LENGTH MX5 59 . =-1 IX2 X2+X5 NG X2,NEGLEN . LENGTH MUST BE STRICTLY POSITIVE SA3 B1+P.XPACK+2 . FL WORD AX3 36 IX4 X1+X2 . SA0 B1 . SCRATCH AREA IX3 X4-X3 . FL - (START+LENGTH) PL X3,BIGX . ADDRESS SPACE EXCEEDED SA3 B1+P.XPACK+1 . RA WORD AX3 36 IX1 X1+X3 . ABSOLUTE ADDRESS SA3 B1+P.PARAM+1 . MOT INDEX OF FILE SX0 X3+0 SB4 X1 . SAVE ADDRESS OF START OF BUFFER MX6 60-21 RECS 1 SA4 A0 BX0 -X6*X4 BX3 X3-X4 BX3 X6*X3 NZ X3,MISFIL . UN-S DO NOT MATCH SB6 A0+2 RECS P.SCRL SB7 RSHP2 SA3 A0+2 . LENGTH OF FILE IX3 X3+X5 . MAX ADDRESS SB2 A0+3 RSHP1 ZR X2,RSHP4 . BUFFER IS FULL BX6 X3 JP B2 RSHP2 BX6 -X0*X6 IX6 X6-X5 . BLOCK SIZE SA6 X1+1 IX1 X1-X5 IX2 X2+X5 SB2 B2+1 EQ RSHP1 PS * * THE NEXT INSTRUCTIONS MUST BE AT RSHP2+4 AND +5. * + SB5 X6+1 + SX6 B5 . DATA BLOCK LENGTH SA6 X1+1 RSHP3 SX6 B2-B6 . NUMBER OF LEVELS SA6 B4 EQ SYSRET RSHP4 SA1 B2+0 NG X1,RSHP3 . END OF DOPE VECTOR SB2 B2+1 EQ RSHP4 ENDECS RDSHP TITLE SET DIRTY BIT ENTRY TRDB * ACTION TO RESET THE DIRTY BIT OF A FLE BLOCK AND RETURN THE OLD VALUE, * 0 OR 1, IN USER X6. * * PARAMETERS: * ORG P.PARAM C: EQU 2 .. CAPABILITY REQUIRES 2 WORDS IN AP LIST D: EQU 1 * TD.FIL BSS C: .. FILE TD.ADDR BSS D: .. ADDRESS IN BLOCK TO TEST AND RESET USE * * TRDB SB2 B1+TD.ADDR .. PARAM FOR CHECK SB6 TRDB1 .. RETURN LINK JP CHECK TRDB1 NZ X7,SYSFRET .. NO BLOCK TO TEST MX1 59 .. =-1 IX0 X3+X1 .. ADDR OF SECOND ALLOC WORD RECS 1 LX1 54-1 ... MOVE HOLE TO 54 TH POSITION SA2 A0 BX6 X1*X2 .. RESET DIRTY BIT SA6 A2 WECS 1 BX6 -X1*X2 .. GET OLD DIRTY BIT AX6 53 SA6 B1+P.XPACK+14 .. STORE IN USER X6 JP SYSRET TITLE MOVE A DATA BLOCK ENTRY MOVBLK * MOVBLK IS AN ACTION WHICH ^MOVES^ A DATA BLOCK FROM A PLACE IN ONE FILE TO * A PLACE IN ANOTHER (OR POSSIBLY THE SAME) FILE. REQUIRED CONDITIONS: THE * DESTIMATION MUST BE EMPTY, (AND OBVIOUSLY THE BLOCK TO BE MOVED MUST * EXIST,) THE DATA BLOCK SIZE (I.E. THE LAST SHPAE NUMBER) OF BOTH FILES MUST * BE THE SAME, AND THE BLOCK TO BE MOVED MUST HAVE A ZERO MAP REFERENCE * COUNT. * MOVBLK FIRST CREATES ANY POINTER BLOCKS NEEDED AT THE DESTINATION BY CALLING * 'MAKEP' (WHICH WILL NOT RETURN IF ERRORS OCCUR). THEN MOVBLK CALLS 'CHECK' * TO FIND THE BLOCK TO BE MOVED. * IF EVERYTHING IS OK, MOVBLK UPDATES THE BLOCK'S BACKPOINTER, AND CALLS * 'DLEP' TO DELETE ANY UNNECESSARY PTR BLOCKS. * * PARAMETERS: * ORG P.PARAM MB.F1 BSS C: .. SOURCE FILE MB.A1 BSS D: .. ADDRESS IN BLOCK TO BE MOVED MB.F2 BSS C: .. DESTINATION FILE MB.A2 BSS D: .. ADDRESS IN HOLE FOR BLOCK USE * * MOVBLK SB2 B1+MB.A2 .. AP4 (AND AP3), FOR MAKEP SB7 MOVBLK1 .. RETURN LINK SA1 B1+MB.F1+1 .. DETERMINE IF ONLY ONE FILE SA2 B1+MB.F2+1 .. IS INVOLVED BX7 X1-X2 SA7 B1+P.TEMP6 .. SAVE FLAG FOR LATER SX5 1 .. FLAG TO AVOID FUNDING DATA BLOCK ZR X7,MAKEP .. ONLY ONE FILE, DONT FUND IT SX5 0 .. TWO FILES, DATA BLOCK MUST BE EQ MAKEP .. FUNDED MOVBLK1 SA1 B1+1 .. SAVE FUNDING AB OF SINK FILE IN BX7 X1 .. CASE OF ABORTING FOR ERROR SO SB3 B5 .. (SAVE SINK DATA BLOCK LENGTH) SA7 B1+P.TEMP7 .. UNCHARGING CAN PROCEED SX7 -B3 .. SAVE BLOCK LENGTH IN CASE OF SA7 B1+P.TEMP5 .. ISNOBLK ERROR SB2 B1+MB.A1 .. AP2 (AND AP1), FOR CHECK SB6 MOVBLK2 .. RETURN LINK JP CHECK MOVBLK2 NZ X7,ISNOBLK .. ERROR, NO BLK TO MOVE NE B3,B5,MISMATCH .. ERROR, LENGTHS DIFFER MX0 59 IX0 X3+X0 . A(OBJECT) TO GET BACK POINTER SA0 B1+P.SCR2 .. MUST NOT CLOBBER REGULAR SCRATCH AREA RECS 1 SA1 A0 .. WORD WITH TYPE, DIRTY BIT, REF COUNT SX1 X1 .. EXTRACT REF COUNT NZ X1,NOTZERO .. ERRROR, BLOCK IS IN MAP(S) + SB4 *+1 . GET BACK POINTER FROM ALLOCATOR JP =XCHGPTR . AND SUBSTITUTE NEW POINTER BX0 X5 .. ADDRESS OF NEW POINTER SA7 B1+P.TEMP1 .. SAVE PARAM FOR DELEP RECS 1 .. READ UP NEW PTR WORD SA1 A0 BX6 X1+X3 .. ADD ADDRESS OF DATA BLOCK SX1 1777B LX1 60-12 .. FORM + INDEF EXPONENT BX6 X6+X1 SA1 B1+P.INDEX .. PRE-POSITIONED INDEX BX6 X6+X1 SA6 A0 SB4 SYSRET . RETURN FROM DELEP WECS 1 .. REPLACE IN ECS SA1 B1+P.TEMP6 .. FLAG WHICH = 0 FOR ONLY ONE FILE ZR X1,DELEP .. INDICATING WE DONT HAVE TO DEFUND * .. THE DATA BLOCK, ONLY DELETE * .. UNNECESSARY POINTERS FROM SOURCE SX7 IP.AWDS .. CALCULATE LENGTH OF DATA BLOCK SX6 -B5 IX7 X6-X7 SA5 B1+1 .. GET UN, MOT FOR FUNDING AB SB3 DELEP .. RETURN LINK EQ =XFUNDX7 .. DEFUND DATA BLOCK AND DELETE * .. UNNECESSARY POINTER BLOCKS FROM * .. SOURCE FILE * * ERRORS ENCOUNTERED DURING MOVBLK * NOTZERO SX6 E.INMAPS EQ MOVERR ISNOBLK SX6 E.NOBLK EQ MOVERR MISMATCH SX6 E.MISMCH MOVERR SA6 B1+P.TEMP2 . SAVE ERROR NUMBER BX7 X5 SA7 B1+P.TEMP1 .. MISSIMG POINTER ADDRESS BX0 X5 .. PUT THE INDEX IN THE POINTER SA0 B1+P.INDEX .. SO AS NOT TO CONFUSE DELEP WECS 1 SB4 MOVERR1 . ^RETURN^ FROM DELEP SA5 B1+P.TEMP7 .. RESTORE AB OF DESTINATION FILE BX7 X5 .. FOR DEFUNDING PURPOSES SA7 B1+1 SA1 B1+P.TEMP6 .. SAME FILE FLAG ZR X1,DELEP .. DATA BLOCK NOT FUNDED TWICE SX7 IP.AWDS .. CALCULATE LENGTH OF DATA BLOCK SA1 B1+P.TEMP5 .. IN DESTINATION FILE IX7 X1-X7 SB3 DELEP .. RETURN FROM FUNDX7 EQ =XFUNDX7 .. DEFUND DATA BLOCK, DELETE UNNECESSARY * .. POINTER BLOCKS CREATED IN DESTINATION * .. FILE * MOVERR1 SA1 B1+P.TEMP2 . ERROR NUMBER BX7 X1 SX6 E.FILES . ERROR CLASS EQ E.ERROR TITLE READ/WRITE A FILE WRITFIL SB2 0 . OPERATION TO READ AND WRITE FILES SA1 B1+P.PARAM+1 . C:FILE, D:FILE AD, D:CM AD, D:COUNT EQ RF1 SPACE 1 READFIL SB2 1 . NON ZERO SA1 B1+P.PARAM+1 . AP1 RF1 SA0 B1 . SCRATCH AREA SX0 X1 . ECS ADDRESS OF MOT ENTRY MX7 60-21 RECS 1 . READ MOT ENTRY OF THE FILE SA2 A0 SA4 B1+P.PARAM+3 . GET AP3 NG X4,NEGADD ERROR- NEGATIVE CM ADDR BX0 -X7*X2 . ECS ADDRESS OF FILE TO X0 BX1 X1-X2 . COMPARE UNIQUE NAMES SA2 B1+P.PARAM+4 . GET AP4 BX1 X1*X7 SA5 B1+P.XPACK+2 . SUBPROCESS FL TO X5 NZ X1,RFE1 . ERROR, FILE HAS BEEN DELETED SA1 B1+P.XPACK+1 . SUBPROCESS RA TO X1 IX7 X4+X2 . AP3 + AP4 _ X7 AX5 36 NG X2,RFE2 . ERROR, COUNT NEGATIVE AX1 36 IX7 X5-X7 (THIS COST CHARLES 1$) NG X7,RFE3 . ERROR, ADDRESS-SPACE VIOLATED SB3 X2 . COUNT TO B3 IX4 X1+X4 SA1 B1+P.PARAM+2 . AP2 NG X1,NEGFAD ERROR- NAGATIVE FILE ADDRESS SB4 X4 . RA + AP3 _ B4 SPACE 2 RWECS MACRO P LOCAL READ,DONE NZ B2,READ MX6 1 LX6 54 .. DIRTY BIT WECS P .. PERFORM WRITE SA0 B1+0 .. SCRATCH AREA IX0 X4+X7 .. ADDRESS OF SECOND ALLOC WORD RECS 1 SA5 A0 BX6 X5+X6 .. MAKE DIRTY SA6 A5+0 WECS 1 JP DONE READ RECS P DONE BSS 0 ENDM RWECS SPACE 2 * THE STATE OF THE REGISTERS IS AS FOLLOWS: * X0 ECS ADDRESS OF THE FILE * X1 AP2, A LOGICAL FILE ADDRESS * X2 AP4, COUNT * B2 0 IF WRITE, NON-ZERO IF READ * B3 =X2 * B4 AP3 + RA, ABSOLUTE CM ADDRESS SPACE 2 IX6 X1+X2 . AP2 + AP4 _ X6 RECS P.SCRL . READ FILE DESCRIPTION TO SCRATCH SA4 A0+2 . FILE LENGTH SB7 RFRET . RETURN ADDRESS FROM DOPE VECTOR IX4 X4-X6 SB6 A0+2 . ADDRESS OF FIRST LEVEL DESC. - 1 MX7 59 . -1 TO X7 PL X4,RF3 EQ RFE4 . ERROR, X6 OUT OF BOUNDS SPACE 2 * EXAMPLE OF A POINTER BLOCK LEVEL DESCRIPTION: * AX6 X * MX0 Y * JP B7+0 SPACE 1 RFRET BX0 -X0*X6 . MASK OFF PART OF X1 RELEVENT SB6 B6+1 IX0 X0+X4 . ECS ADDRESS OF NEXT POINTER RECS 1 RF3 SA4 A0+0 ZR X4,SYSFRET . EMPTY BLOCK BX6 X1 JP B6+1 . GO TO NEXT LEVEL DESCRIPTION SPACE 2 * EXAMPLE OF DATA BLOCK LEVEL DESCRIPTION: * SX6 LENGTH OF DATA BLOCK - 1 * JP B7+4 SPACE 1 + SB5 X6+1 . LENGTH OF DATA BLOCK TO B5 BX6 X6*X1 . USE LENGTH - 1 AS A MASK SPACE 2 * EXAMPLE OF 1 LEVEL FILE DESCRIPTION: * SB5 LENGTH OF DATA BLOCK * JP B7+5 SPACE 1 + SB7 X6 . START ADDRESS IN FIRST BLOCK BX1 X0 . ADDRESS OF LAST POINTER TO X1 SB7 B5-B7 . NUMBER OF WORDS TO BE TRANSFERRED SA0 B4 . CM ADDRESS SB6 B3-B7 . DECREASE COUNT IX0 X4+X6 GT B6,B0,RF5 . BRANCH IF NOT LAST TRANSFER RF4 RWECS B3 LAST TRANSFER AND RETURN EQ SYSRET SPACE 1 RF5 RWECS B7 . TRANSFER FIRST BLOCK SB4 B4+B7 . BUMP CM ADDRESS SB3 B6+0 RF6 IX0 X1-X7 . ADDRESS OF NEXT POINTER SA0 B1+0 BX1 X0 RECS 1 . READ POINTER SA4 A0+0 ZR X4,SYSFRET . EMPTY BLOCK DF X4,RF7 . BRANCH IF NOT DATA BLOCK NEXT BX0 X4 SB6 B3-B5 . DECREASE COUNT SA0 B4 GE B0,B6,RF4 . BRANCH TO LAST TRANSFER SB3 B6 RWECS B5 . TRANSFER DATA BLOCK SB4 B4+B5 . BUMP CM ADDRESS EQ RF6 RF7 IX1 X4+X7 . PREPARE TO READ FIRST POINTER IN PL X4,RF6 . POINTER BLOCK IX0 X0+X4 + SB6 RF6 . GET BACK POINTER FROM ALLOCATOR JP =XBKPTR SPACE 2 ERRNUMS XTEXT NEGFAD SX1 2 NEGATIVE FILE ADDRESS JP ERR20 NEGADD SX1 3 EQ ERR20 BADCNT SX1 2 ERR20 SX7 E.NEGPAR EQ CL2 BIGDSCR SX1 2 EQ ERR21 BIGADD SX1 1 ERR21 SX7 E.BIGPAR EQ CL2 RFE3 EQU BIGDSCR NEGSIZ SX7 E.NEGSIZ EQ CL3 BIGSIZ SX7 E.BIGSIZ EQ CL3 NOTPOW SX7 E.NOTPOW EQ CL3 BIGFIL SX7 E.BIGFIL EQ CL3 MISFIL SX7 E.NOFIL EQ CL3 RFE1 EQU MISFIL ISBLK SX7 E.ISBLK EQ CL3 NOBLK SX7 E.NOBKD EQ CL3 INMAPS SX7 E.INMAPS EQ CL3 NOTEMPTY SX7 E.NOTEMP CL3 SX6 E.FILES EQ E.ERROR NEGINDX SX7 E.NEGIX EQ CL2 BIGINDX SX7 E.BIGIX SA1 A1 EQ CL2 NEGX SX1 1 EQ ERR20 BIGX SX1 1 EQ ERR21 RFE4 EQU BIGX NEGLEN SX7 E.NEGPAR SX1 2 EQ CL2 RFE2 EQU NEGLEN CL2 LX1 18 MX3 42 BX1 X1*X3 BX7 X1+X7 SX6 E.PARMS EQ E.ERROR END