cdc:nos2.source:nam5871:exsquez
Table of Contents
EXSQUEZ
Table Of Contents
Source Code
- EXSQUEZ.txt
- *DECK EXSQUEZ
- PROC SQUEEZE ( (REQSIZE), RETFWA );
- BEGIN # SQUEEZE #
- *IF DEF,IMS
- #
- **
- *
- * 1. PROC NAME AUTHOR DATE
- * SQUEEZE M. D. PICKARD 76/11/17
- *
- * 2. FUNCTIONAL DESCRIPTION
- * SQUEEZE WILL MOVE ASSIGNED BLOCKS THAT ARE NOT FIXED POSITION
- * UNTIL A FREE BLOCK LARGE ENOUGH TO SATISFY THE REQUEST EXISTS.
- * MORE FIELD LENGTH WILL BE REQUESTED IF THIS CANT BE DONE.
- * ALSO, IF THE REQUEST SIZE IS ZERO, SQUEEZE WILL MOVE AS
- * MUCH AS POSSIBLE AND RETURN THE ADDRESS OF THE LAST FREE
- * BLOCK.
- *
- * 3. METHOD USED
- * STARTING AT TSBFWA, ALL ASSIGNED BLOCKS THAT ARE NOT FIXED
- * POSITION ARE MOVED TO LOWER CORE ADDRESSES AND FREE BLOCKS
- * ARE ACCUMULATED TO MAKE LARGER FREE BLOCK. WHEN A FREE
- * BLOCK EXISTS THAT SATISFIES THE REQUEST SIZE, THE FUNCTION
- * IS COMPLETE. IF WHEN CTSBLWA IS REACHED AND THE REQUEST
- * IS NOT SATISFIED, MORE FIELD LENGTH IS REQUESTED TO SATISFY
- * THE REQUEST. (IF THE REQUEST SIZE WAS ZERO, WHEN CTSBLWA
- * IS REACHED, THE ADDRESS OF THE LAST FREE BLOCK IS RETURNED
- * AND NO FIELD LENGTH REQUEST TAKES PLACE.) THE ADDRESS OF
- * THE BLOCK SATISFYING THE REQUEST IS RETURNED.
- *
- * 4. ENTRY PARAMETERS
- * A. FORMAL PARAMETERS
- * REQSIZE SIZE OF FREE BLOCK NEEDED, REQSIZE
- * MUST BE GQ ZERO, AND LQ MAXTSBL
- *
- * B. TSB MANAGER GLOBAL PARAMETERS
- * TSBFWA FIRST WORD ADDRESS OF TSB"S
- * CTSBLWA CURRENT LAST WORD ADDRESS OF TSB"S
- * TSBAREA ARRAY THAT DEFINES DYNAMIC MEMORY
- * TSBIT TASK SEQUENCE BLOCK IDENT TABLE
- * THIS BASED ARRAY IS SET ON ENTRY
- *
- * 5. EXIT PARAMETERS
- * A. FORMAL PARAMETERS
- * RETFWA ADDRESS OF TSB THAT SATISFIES REQUEST
- * LAST FREE TSB ADDRESS IF REQUEST SIZE
- * WAS ZERO
- * B. TSBMGR GLOBAL PARAMETERS
- * TTSBFWA FIELD IN TSBIT THAT IS MODIFIED EACH TIME
- * TSBIT THIS BASED ARRAY GETS RESET IF TSB
- * CONTAINING TSBIT IS MOVED
- *
- * 6. COMDECKS CALLED
- * TSBBASE TSB MANAGER BASED ARRAY DEFINITIONS
- * TSBDATA TSB MANAGER DATA AREA DEFINITIONS
- * TSBDEFS TSB MANAGER SYMPL DEFS
- *
- * 7. ROUTINES CALLED
- * MEMREQ REQUESTS MEMORY
- * MOVEI MOVES BLOCK OF CENTRAL MEMORY WORDS
- *
- * 8. DAYFILE MESSAGE
- * NONE.
- *
- #
- *ENDIF
- CONTROL NOLIST; # STOPS LIST TSBDEFS,TSBDATA,TSBBASE #
- *CALL CYBERDEFS
- *CALL TSBDEFS
- *CALL TSBBASE
- *CALL TSBDATA
- CONTROL LIST;
- ITEM
- REQSIZE U, # SIZE OF TSB WANTED #
- RETFWA U; # ADDRESS OF TSB LARGE ENOUGH FOR REQUEST #
- # OR LAST FREE TSB ADDRESS #
- XREF
- BEGIN
- PROC FIRSTF;
- PROC GETBIG;
- PROC MOVEI;
- PROC MEMREQ;
- END
- ITEM
- CFREE U, # CURRENT ACCUMULATED FREE SPACE #
- CSPOT U, # CURRENT SPOT IN SEARCH #
- FSPOT U, # FREE SPACE STARTING SPOT #
- LPTSBL U, # LAST PREVIOUS TSB LENGTH #
- MRSIZE U, # USED TO HOLD MEMORY REQUEST VALUE #
- NMEMREQ B, # NO MEMORY REQUEST INDICATOR #
- SQSIZE U; # TEMPORY HOLDER FOR REQUEST SIZE #
- CSPOT = 0;
- FSPOT = 0;
- LPTSBL = 0;
- IF REQSIZE EQ 0
- THEN # NO FIELD LENGTH IS REQUESTED #
- BEGIN
- NMEMREQ = TRUE; # SET NO MEMORY REQUEST #
- SQSIZE = MAXTSBA + 1; # FORCE NO MATCH ON REQUEST SIZE #
- END
- ELSE # FIELD LENGTH WILL BE REQUESTED IF #
- BEGIN # NEEDED #
- SQSIZE = REQSIZE; # SET SEARCH SIZE TO REQUEST SIZE #
- NMEMREQ = FALSE; # SET TO ALLOW MEMORY REQUEST #
- END
- FOR CFREE = 0 WHILE CFREE LS SQSIZE DO
- BEGIN # CONSOLIDATE TSB AREA WHERE POSSIBLE #
- # UNTIL REQUEST IS SATISFIED #
- IF LOC(TSBAREA[CSPOT]) GQ CTSBLWA
- THEN # AT THE END OF THE TSB AREA #
- BEGIN
- IF NOT NMEMREQ
- THEN # MORE FIELD LENGTH IS WANTED #
- BEGIN
- MRSIZE = ( SQSIZE - CFREE + ( MRU - 1 )) / MRU; # AMOUNT #
- MEMREQ(MRSIZE); # REQUEST MRSIZE MEMORY REQUEST UNITS #
- CFREE = CTSBLWA - LOC(TSBAREA[FSPOT]); # AMOUNT OF FREE NOW#
- P<FTSBHDR> = LOC(TSBAREA[FSPOT]); # SET HDR. AT LAST FREE #
- FTSBL[0] = CFREE; # SET THIS BLOCKS NEW LENGTH #
- P<FTSBHDR> = CTSBLWA; # BUILD ZERO LENGTH TSB AT CTSBLWA #
- FBUSY[0] = FALSE; # SET NOT BUSY #
- FNOTMOV[0] = FALSE; # SET OK TO MOVE #
- FHDRRSV[0] = 0; # CLEAR RESERVED AREA #
- FIDENT[0] = 0; # CLEAR IDENT FIELD #
- FPTSBL[0] = CFREE; # SET PREVIOUS TSB LENGTH #
- FTSBL[0] = 0; # SET TSB LENGTH TO ZERO #
- END
- ELSE # NO MORE FIELD LENGTH #
- BEGIN
- SQSIZE = 0; # SET TO INSURE END OF FOR LOOP #
- IF CFREE NQ 0
- THEN # LAST TSB IS A FREE ONE #
- BEGIN
- P<FTSBHDR> = CTSBLWA; # SET FREE FORMAT ON ZERO LEN. TSB #
- FPTSBL[0] = CFREE; # PREVIOUS LEN. IS CFREE #
- END
- END
- END
- ELSE # CONTINUE CONSOLIDATION #
- BEGIN
- P<BTSBHDR> = LOC(TSBAREA[CSPOT]); # SET HEADER AT CURR. SPOT #
- IF BBUSY[0]
- THEN # THIS TSB IS ASSIGNED #
- BEGIN # SEE IF THERE IS ANYWHERE TO MOVE IT #
- IF CSPOT NQ FSPOT
- THEN # WE CAN MOVE IT IF IT IS NOT FIXED #
- IF NOT BNOTMOV[0]
- THEN # IT CAN BE MOVED, SO MOVE IT #
- BEGIN
- BPTSBL[0] = LPTSBL; # NEW PREVIOUS TSB LENGTH #
- LPTSBL = BTSBL[0]; # NEW LAST PREVIOUS TSB LENGTH #
- TTSBFWA[BIDENT[0]] = LOC(TSBAREA[FSPOT]); # NEW FWA TO #
- # TSBIT #
- IF BIDENT[0] EQ 1
- THEN # THIS IS THE TSBIT, RESET BASED ARRAY #
- P<TSBIT> = LOC(TSBAREA[FSPOT]) + TSBHDRL; # SET ARRAY#
- MOVEI(LPTSBL,LOC(TSBAREA[CSPOT]),LOC(TSBAREA[FSPOT]));
- # MOVE TSB TO NEW LOCATION #
- CSPOT = CSPOT + LPTSBL;
- P<FTSBHDR> = LOC(TSBAREA[FSPOT]) + LPTSBL;
- FBUSY[0] = FALSE; # BUILD FREE HEADER AT END OF MOVED #
- FNOTMOV[0] = FALSE; # ITS MOVEABLE TSB #
- FHDRRSV[0] = 0; # CLEAR RESERVED AREA #
- FIDENT[0] = 0; # CLEAR IDENT FIELD #
- FPTSBL[0] = LPTSBL; # SET PREVIOUS LENGTH TO MOVED TSB #
- FTSBL[0] = CFREE; # SET LENGTH TO CURRENT FREE SPACE #
- FSPOT = FSPOT + LPTSBL; # RESET FREE SPOT #
- P<BTSBHDR> = LOC(TSBAREA[CSPOT]); #POINT AT NEXTTSB#
- BPTSBL[0] = CFREE ; # SET NEW PREV TSB LENGTH#
- END
- ELSE # CANT MOVE IT #
- BEGIN
- LPTSBL = BTSBL[0]; # NEW LAST PREVIOUS LENGTH #
- BPTSBL[0] = CFREE; # NEW PREVIOUS TSB LENGTH FOR BLOCK #
- CFREE = 0;
- CSPOT = CSPOT + BTSBL[0]; # NEW CURRENT SPOT #
- FSPOT = CSPOT; # NEW FREE SPOT, SAME A CURRENT SPOT #
- END
- ELSE # NOWHERE TO MOVE IT, RESET POINTERS #
- BEGIN
- CSPOT = CSPOT + BTSBL[0]; # NEW CURRENT SPOT #
- FSPOT = CSPOT; # NEW FREE SPOT #
- LPTSBL = BTSBL[0]; # NEW LAST PREVIOUS TSB LENGTH #
- END
- END
- ELSE # THIS IS A FREE TSB, ADD IT TO CFREE #
- BEGIN
- CFREE = CFREE + BTSBL[0]; # ADD TO ACCUMULATED FREE SPACE #
- P<FTSBHDR> = LOC(TSBAREA[FSPOT]); # SET ON LAST FREE #
- FTSBL[0] = CFREE; # UPDATE LENGTH OF FREE TSB #
- CSPOT = CSPOT + BTSBL[0]; # NEW CURRENT SPOT #
- P<BTSBHDR>= LOC(TSBAREA[CSPOT]); #POINT TO NEXT TSB#
- BPTSBL[0] = CFREE ; #SET NEW PREV. TSB LENGTH #
- IF LOC(TSBAREA[CSPOT]) EQ CTSBLWA
- THEN # RESET PREV. TSB LEN. ON LAST TSB #
- BEGIN
- P<BTSBHDR> = LOC(TSBAREA[CSPOT]); # FORMAT LAST TSB #
- BPTSBL[0] = CFREE; # PREVIOUS TSB LENGTH #
- END
- END
- END
- END
- FIRSTF; # RESET FFFWA #
- GETBIG; # RE-ESTABLISH BIGGEST FREE TSB SIZE #
- RETFWA = LOC(TSBAREA[FSPOT]); # SET RETURN FWA FOR TSB #
- RETURN;
- END TERM # SQUEEZE #
cdc/nos2.source/nam5871/exsquez.txt ยท Last modified: 2023/08/05 17:22 by Site Administrator