# DEALST - DEALLOCATE STAGING MEMORY FOR A VIRTUAL CHANNEL # # PURPOSE: RELEASE VIRTUAL CHANNEL DATA BUFFERS IN THE STAGING MEMORY # # CALLING SEQUENCE: # # CALL DEALST(BITMAP,BITLEN,BITGRN,STGADR,STGBFL,NBUFF) # # INPUTS: BITMAP IS THE STAGER ALLOCATION BITMAP ARRAY # BITLEN IS THE LENGTH OF THE BITMAP IN WORDS # BITGRN IS THE BITMAP GRANULARITY IN STAGER WORDS # STGADR IS THE BASE ADDRESS OF THE STAGING MEMORY BUFFER TO BE # DEALLOCATED # STGBFL IS THE LENGTH OF A SINGLE STAGER BUFFER TO BE ALLOCATED # IN WORDS # NBUFF IS THE NUMBER OF SUCH BUFFERS TO BE ALLOCATED # # OUTPUTS: BITMAP UPDATED TO REFLECT THE DELETION OF THE VIRTUAL CHANNEL # DATA BUFFERS # # PROGRAMMER: CARL T. MICKELSON # GOODYEAR AEROSPACE CORP # 1210 MASSILLON ROAD # AKRON, OHIO 44315 # # PROJECT: MASSIVELY PARALLEL PROCESSOR (MPP) # # DATE: APRIL 1983 # ## INCLUDE "SMMDEF.RAT" SUBROUTINE DEALST(BITMAP,BITLEN,BITGRN,STGADR,STGBFL,NBUFF) INTEGER BITMAP(0:1) INTEGER BITLEN INTEGER BITGRN INTEGER*4 STGADR INTEGER*4 STGBFL INTEGER NBUFF INTEGER*4 STGTOT,PAGES,FRSTPG,LASTPG INTEGER FRSTWD,FRSTBT,LASTWD,LASTBT,FSTMSK,LSTMSK STGTOT = STGBFL * NBUFF # COMPUTE TOTAL WORDS TO DEALLOCATE PAGES = (STGTOT + (BITGRN - 1)) / BITGRN # COMPUTE TOTAL PAGES TO DEALLOCATE FRSTPG = STGADR / BITGRN # COMPUTE FIRST PAGE NUMBER FRSTWD = FRSTPG / BTWDTH # COMPUTE WORD IN BITMAP FRSTBT = MOD(FRSTPG,BTWDTH) # COMPUTE FIRST BIT IN WORD LASTPG = FRSTPG + PAGES - 1 # COMPUTE LAST PAGE TO DEALLOCATE LASTWD = LASTPG / BTWDTH # COMPUTE WORD IN BITMAP LASTBT = MOD(LASTPG,BTWDTH) # COMPUTE LAST BIT IN WORD FSTMSK = ISHFT(-1,FRSTBT) # SET FIRST WORD BIT MASK LSTMSK = ISHFT(-1,LASTBT-(BTWDTH-1)) # SET LAST WORD BIT MASK IF (LASTWD == FRSTWD) $( # IF TOTAL ALLOCATION IN SINGLE BITMAP WORD FSTMSK = IAND(FSTMSK,LSTMSK) # COMBINE MASKS LSTMSK = FSTMSK # MAKE THEM THE SAME $) # END SAME BITMAP WORD BLOCK BITMAP(FRSTWD) = IAND(BITMAP(FRSTWD),INOT(FSTMSK)) # PRESERVE UNCHANGING BITS BITMAP(LASTWD) = IAND(BITMAP(LASTWD),INOT(LSTMSK)) IF ((LASTWD - FRSTWD) > 1) $( # IF WORDS AT LEAST TWO APART DO I = FRSTWD + 1,LASTWD - 1 # CLEAR INTERVENING WORDS BITMAP(I) = 0 $) # END WORDS TWO APART BITMAP(0) = IOR(BITMAP(0),1) # KEEP FIRST AND LAST PAGES RESERVED BITMAP(BITLEN-1) = IOR(BITMAP(BITLEN-1),"100000") RETURN END