/* This C language subroutine provides heap memory management for the runtime library. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 12/9/90 #include
void free(void *p); */ #include "lib_glob.h" #include "sdl_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _free; .GLOBAL ___freeD; _free: ___freeD: put(R3); put(R5); put(R6); put(R7); put(R13); put(R14); put(R15); CALL (PC, ___lib_get_heap_data) (DB); /*Read heap info*/ R2=PASS R4, dm_ptr=R4; /*Only DM supported now*/ R3=DM(dm_M1, dm_ptr); /*Read heap number*/ R0=PASS R2; /*Test for zero input*/ IF EQ JUMP (PC, restore_state); /*Return NULL ptr*/ R2=R2-1, dm_lnt=dm_0; /*Pt to heap #,clr len reg*/ R2=R2-1, pm_lnt=pm_0; /*Pt to heap len,clr len reg*/ dm_deallocation:R14=R14-R14, dm_ptr=R2; /*Set to 0 for unsigned comp*/ DM(1,dm_ptr)=R14; /*Write out a NULL*/ R0=PASS R4, dm_ptr=R4; /*Test for NULL ptr*/ IF EQ JUMP (PC, restore_state); /*ERROR if NULL*/ R3=PASS R0, R0=DM(1,dm_ptr); /*Fetch next ptr*/ DO scan_free UNTIL EQ; R13=R0-R2; /*Do an unsigned compare*/ NOP; /*CHIP ANOMALY: Late carry*/ R13=R14-R14+CI-1; /*Extend to double*/ IF GE JUMP (PC, check_postblock) (LA); /*In middle*/ R0=PASS R0, dm_ptr=R0; IF EQ JUMP (PC, check_preblock) (LA); /*At end of list*/ R15=PASS R3, R3=R0; scan_free: R0=DM(1,dm_ptr); /* Test if the de-allocated block is contigious with the end block*/ check_postblock:dm_ptr=R2; /*Point to length*/ R4=DM(dm_ptr,0); /*Fetch length*/ R5=R2+R4; /*Figure end address*/ R5=R5+1; /*Compute contig. blk add*/ R5=R5+1; COMP(R0,R5); /*Test for equal*/ IF NE DM(1,dm_ptr)=R0; /*Not contigious*/ IF NE JUMP (PC, check_preblock); dm_ptr=R0; /*Point to next block*/ R6=DM(dm_ptr,0); /*Fetch length*/ R6=R6+1, R7=DM(1,dm_ptr); /*Include extra block*/ R6=R6+1; R6=R6+R4, dm_ptr=R2; /*Add initial block*/ DM(dm_ptr,0)=R6; /*Write new length*/ dm_ptr=R2; DM(1,dm_ptr)=R7; /*Copy pointer*/ check_preblock: dm_ptr=R3; /*Point to previous block*/ R4=DM(dm_ptr,0); /*Fetch length*/ R5=R3+R4; /*Compute end address*/ R5=R5+1; /*Include extra blk*/ R5=R5+1; COMP(R2,R5); /*Test for equal*/ IF NE DM(1,dm_ptr)=R2; /*Set previous ptr*/ IF NE JUMP (PC, restore_state); dm_ptr=R2; /*Point to block*/ R6=DM(dm_ptr,0); /*Fetch length*/ R6=R6+1, R7=DM(1,dm_ptr); /*Include extra block*/ R6=R6+1; R6=R6+R4, dm_ptr=R3; /*Compute total length*/ DM(dm_ptr,0)=R6; /*Write out new length*/ DM(1,dm_ptr)=R7; restore_state: FETCH_RETURN get(R15,1); get(R14,2); get(R13,3); get(R7,4); get(R6,5); get(R5,6); get(R3,7); RETURN (DB); RESTORE_STACK RESTORE_FRAME .ENDSEG;