*DECK EXGETSB PROC GETTSB ( (SIZE),(IDENT), TFWA ); BEGIN # GETTSB # *IF DEF,IMS # ** * * 1. PROC NAME AUTHOR DATE * GETTSB M. D. PICKARD 76/11/15 * * 2. FUNCTIONAL DESCRIPTION * GETTSB WILL FIND A FREE TSB OF THE REQUESTED SIZE. THE * TSB HEADER IS WRITTEN INDICATING THAT THE TSB IS ASSIGNED, * FIXED POSITION AND ASSOCIATED TO THE SPECIFIED IDENT. * THE ADDRESS OF THE TSB IS RETURNED TO THE CALLER * * 3. METHOD USED * IF A FREE TSB EXISTS THAT IS GREATER OR EQUAL IN SIZE TO THE * REQUEST SIZE, A TSB IS CHOSEN TO SATISFY THE REQUEST. * IF A FREE TSB THAT WILL SATISFY THE REQUEST DOES NOT EXIST, * THEN AN ATTEMPT IS MADE TO MOVE ASSIGNED VARIABLE POSITION * BLOCKS UNTIL A CONTIGUOUS FREE AREA DOES EXIST THAT WILL * SATISFY THE REQUEST. * IF THE LATTER FAILS MORE FIELD LENGTH IS REQUESTED TO CREATE * A FREE TSB THAT WILL SATISFY THE REQUEST. * WHEN A TSB IS FOUND THAT SATISFIES THE REQUEST, THE HEADER * IS BUILT AND THE ADDRESS RETURNED TO THE CALLER. * * 4. ENTRY PARAMETERS * A. FORMAL PARAMETERS * SIZE NUMBER OF WORDS IN REQUESTED TSB * MUST BE GREATER THAN ZERO AND LESS THAN * MAXTSBL * * IDENT IDENTIFIER FOR BLOCK, PLACED IN HEADER * MUST BE GREATER THAN ZERO AND LESS THAN * MAXTSBI * B. TSBMGR GLOBAL PARAMETERS * BIGFREE BIGGEST AVAILABLE FREE TSB * CTSBLWA CURRENT TSB AREA LAST WORD ADDRESS * FFFWA FIRST FREE TSB FIRST WORD ADDRESS * * 5. EXIT PARAMETERS * TFWA TSB FIRST WORD ADDRESS RETURNED TO CALLER * TFWA WILL BE ZERO IF REQUEST NOT SATISFIED * * 6. COMDECKS CALLED * TSBBASE TSB MANAGER BASED ARRAY DEFINITIONS * TSBDATA TSB MANAGER DATA AREA DEFINITIONS * TSBDEFS TSB MANAGER SYMPL DEFS * * 7. ROUTINES CALLED * FIRSTF GET FWA OF FIRST FREE TSB IN THE TSB AREA * GETFREE GETS FWA OF NEXT FREE TSB * MESSAGE ISSUES DAYFILE MESSAGES (MACREL) * GETBIG GETS SIZE OF BIGGEST FREE TSB * NEWFREE CREATE NEW FREE TSB WITH EXCESS OF * NEWLY ASSIGNED TSB * SQUEEZE CONSOLIDATES FREE SPACE IN TSB AREA AND * GETS MORE FIELD LENGTH IF NEEDED * * 8. DAYFILE MESSAGES * "TSB LOGICAL ERROR" INFORMATIVE MESSAGE * # *ENDIF CONTROL NOLIST; # STOPS LIST TSBDEFS,TSBDATA,TSBBASE # *CALL CYBERDEFS *CALL TSBDEFS *CALL TSBBASE *CALL TSBDATA CONTROL LIST; ITEM SIZE U, # SIZE IN WORDS OF REQUESTED BLOCK # IDENT U, # IDENTIFIER OF REQUESTED BLOCK # TFWA U; # ADDRESS OF ASSIGNED BLOCK # XREF BEGIN PROC FIRSTF; PROC GETBIG; PROC MESSAGE; PROC SQUEEZE; PROC ZERO ; END $BEGIN # START DEBUG CODE HERE # XREF PROC ABORT; $END ITEM FOUND B, # INDICATES BLOCK IS FOUND # CFWA U, # CURRENT FREE TSB FWA # TEMP U; # TEMPORARY UNSIGNED INTEGER # ARRAY TSBLERR [0:0] P(2); # TSB LOGICAL ERROR DAYFILE MESSAGE # ITEM TLERRM C (0,0,17) = [ "TSB LOGICAL ERROR" ], TLERRZ U (1,42,18) = [ 0 ]; CONTROL EJECT; PROC NEWFREE ( (FWA),(LENGTH) ); BEGIN # NEWFREE # *IF DEF,IMS # ** * * 1. PROC NAME AUTHOR DATE * NEWFREE M. D. PICKARD 76/11/16 * * 2. FUNCTIONAL DESCRIPTION * NEWFREE CREATES A NEW FREE TSB AT THE END OF A BLOCK THAT * IS CHOSEN TO SATISFY A REQUEST WHEN THE BLOCK IS BIGGER THAN * THE REQUESTED SIZE. * * 3. METHOD USED * CREATE FREE TSB HEADER AT FWA + LENGTH. UPDATE LENGTH FIELD * ON TSB BEING ASSIGNED AND PREVIOUS BLOCK LENGTH ON TSB AFTER * THE NEW FREE TSB. * * 4. ENTRY PARAMETERS * A. FORMAL PARAMETERS * FWA FWA OF CHOSEN TSB * LENGTH AMOUNT THAT WILL BE ASSIGNED * * B. TSBMGR GLOBAL PARAMETERS * FTSBHDR BASED ARRAY SET AT FWA * * 5. EXIT PARAMETERS * NONE. * * 6. COMDECKS CALLED * NONE. * * 7. ROUTINES CALLED * NONE. * * 8. DAYFILE MESSAGES * NONE. * # *ENDIF ITEM FWA U, # FWA OF TSB BEING ASSIGNED # LENGTH U; # LENGTH OF TSB BEING ASSIGNED # P = FWA + FTSBL[0]; # SET BUSY HEADER FORMAT AT NEXT TSB# TEMP = FTSBL[0]; # SAVE OLD LENGTH OF TSB BEING ASSIGNED # FTSBL[0] = LENGTH; # UPDATE LENGTH OF TSB BEING ASSIGNED # P = FWA + LENGTH; # SET FREE TSB FORMAT ON NEW TSB # FBUSY[0] = FALSE; # SET NOT BUSY ON NEW TSB HEADER # FNOTMOV[0] = FALSE; # ALLOW MOVING OF NEW TSB # FHDRRSV[0] = 0; # CLEAR RESERVED AREA IN HEADER # FIDENT[0] = 0; # CLEAR IDENT FIELD # FPTSBL[0] = LENGTH; # SET NEW TSB"S PREVIOUS TSB LENGTH # FTSBL[0] = TEMP - LENGTH; # SET LENGTH OF NEW BLOCK # BPTSBL[0] = FTSBL[0]; # SET NEW PREVIOUS TSB LENGTH ON NEXT TSB # RETURN; END # NEWFREE # CONTROL EJECT; PROC GETFREE ( (FWA), FFWA ); BEGIN # GETFREE # *IF DEF,IMS # ** * * 1. PROC NAME AUTHOR DATE * GETFREE M. D. PICKARD 76/11/16 * * 2. FUNCTIONAL DESCRIPTION * GETFREE WILL SEARCH THE TSB AREA FOR THE NEXT FREE TSB * STARTING AT FWA. * * 3. METHOD USED * START A FWA + LENGTH OF THAT TSB AND SEARCH FOR A NOT BUSY * TSB UNTIL CTSBLWA. RETURN ADDRESS OF FREE TSB OR CTSBLWA. * * 4. ENTRY PARAMETERS * A. FORMAL PARAMETERS * FWA FIRST WORD ADDRESS OF TSB TO START SEARCH * B. TSBMGR GLOBAL PARAMETERS * CTSBLWA CURRENT TSB AREA LAST WORD ADDRESS * * 5. EXIT PARAMETERS * FFWA ADDRESS OF NEXT FREE TSB OR CTSBLWA * * 6. COMDECKS CALLED * NONE. * * 7. ROUTINES CALLED * NONE. * * 8. DAYFILE MESSAGES * NONE. * # *ENDIF ITEM FWA U, # START ADDRESS OF SEARCH # FFWA U; # NEXT FREE TSB FWA OR CTSBLWA # P = FWA; # SET FREE HEADER AT START TO GET LENGTH # P = FWA + FTSBL[0]; # PUT HEADER AT NEXT TSB # FOR FFWA = LOC(FTSBHDR) WHILE ( FBUSY[0] AND ( FFWA LQ CTSBLWA)) DO BEGIN FFWA = FFWA + FTSBL[0]; # BUMP TO NEXT TSB # P = FFWA; # RESET HEADER # END RETURN; END # GETFREE # CONTROL EJECT; # *** GETTSB CODE STARTS HERE *** # IF FFFWA EQ CTSBLWA THEN # FIRST FREE IS AT END OF TSB AREA # SQUEEZE(SIZE,CFWA); # NOTHING IS LEFT TO CONSOLIDATE, GET SOME# FOUND = FALSE; # INITIALIZE LOOP END CONDITION # FOR CFWA = FFFWA WHILE (NOT FOUND AND ( CFWA LS CTSBLWA )) DO BEGIN # FIND A TSB THAT WILL SATISFY THE REQUEST# IF BIGFREE GQ SIZE THEN # THERE IS A TSB BIG ENOUGH # BEGIN # SEARCH ALL FREE TSB"S UNTIL REQUEST IS # # SATISFIED # P = CFWA; # SET FREE TSB HEADER FORMAT AT FREE TSB # IF FTSBL[0] GQ SIZE # CHECK LENGTH OF TSB AGAINST REQ. SIZE # THEN # THIS FREE TSB IS BIG ENOUGH # BEGIN FOUND = TRUE; # END OF LOOP INDICATOR # IF FTSBL[0] EQ BIGFREE THEN BIGFREE = 0 ; TFWA = CFWA; # SET RETURN PARAMETER # TEMP = SIZE + TSBHDRL; # INSURE AT LEAST ROOM FOR ONE WORD # # TSB # IF TEMP LS FTSBL[0] # IS THERE ENOUGH FOR A NEW FREE TSB # THEN # AT THE END # NEWFREE(CFWA,SIZE); # CREATE THE NEW FREE TSB # END ELSE # GET ADDRESS OF NEXT FREE TSB # GETFREE(CFWA,CFWA); # GET NEXT FREE TSB # END ELSE # SQUEEZE FREE TSB"S TOGETHER OR # SQUEEZE(SIZE,CFWA); # GET FL TO SATISFY REQUEST # END IF FOUND THEN # BUILD HEADER FOR ASSIGNED TSB # BEGIN P = TFWA; # POINT BUSY HEADER FOR CHOSEN FREE TSB # BBUSY[0] = TRUE; # SET ASSIGNED (BUSY) FLAG # BNOTMOV[0] = TRUE; # SET FIXED POSITION FLAG # BHDRRSV[0] = 0; # CLEAR RESERVED AREA # BIDENT[0] = IDENT; # PUT IDENTIFIER IN HEADER # SIZE = ( TFWA + TSBHDRL ) - TSBFWA; # USE SIZE AS TEMPORARY # ZERO(LOC(TSBAREA[SIZE]) ,BTSBL[0]-TSBHDRL );# CLEAR AREA # FIRSTF; IF BIGFREE EQ 0 THEN # RE-ESTAB BIGFREE IF USED # GETBIG ; END ELSE # LOGICAL ERROR IN TSB STRUCTURE # BEGIN TFWA = 0; # SET ERROR RETURN FLAG # MESSAGE(TSBLERR,3); # ISSUE LOCAL DAYFILE MESSAGE # $BEGIN ABORT; # ***** DEBUG MODE ABORT ***** # $END END RETURN; END TERM # GETTSB #