;=============================================================================== ; ; FreeObjectHandles ; ; Free all handles used while assembling a source ; ; in fp Stack frame ; ; out nothing ; ; destroy d0-d2/a0-a1 ; ;=============================================================================== FreeObjectHandles: move.w BIN_HD(fp),d0 bsr FreeHandle clr.w BIN_HD(fp) move.w LABELS_HD(fp),d0 bsr.s FreeHandle clr.w LABELS_HD(fp) rts ;=============================================================================== ; ; FreeHandle ; ; Free an handle, deleting the file if it belongs to one ; Return without error if Handle is H_NULL ; ; in d0.w Handle ; fp Stack frame ; ; out nothing ; ; destroy d0-d2/a0-a1 ; ;=============================================================================== FreeHandle: move.w d0,-(sp) beq.s \End RAMT RAM_kernel::Hd2Sym move.l a0,d0 bne.s \FreeFile ROMT HeapFree ; No symbol associated to this handle, free it bra.s \End \FreeFile: ; A file is associated to the handle, its SYM_ENTRY is at a0 pea (a0) jsr UNLINK(fp) addq.l #4,sp \End: addq.l #2,sp rts ;=============================================================================== ; ; AllocHandle ; ; Allocate an handle on the heap ; Will call NeedRAM if first attempt fails. NeedRAM checks is swapping is allowed ; Will call MainExit if the handle could not be allocated ; ; in d0.l size ; fp Stack frame ; ; out d0.w handle ; a0 ptr to the handle ; ; destroy d0-d2/a0-a1 ; ;=============================================================================== AllocHandle: move.l d0,-(sp) move.l d0,-(sp) ROMT HeapAlloc addq.l #4,sp tst.w d0 bne.s \End moveq.l #0,d0 ; We can archive all bsr NeedRAM ROMT HeapAlloc tst.w d0 bne.s \End move.w #ERROR_MEMORY,ERROR(fp) pea StrErrorMemory(pc) bsr PrintToStderr bra MainExit \End: movea.w d0,a0 trap #3 addq.l #4,sp rts ;=============================================================================== ; ; ReallocHandle ; ; Reallocate an handle on the heap ; ; SwapOut is automatically called for this handle ; Call NeedRAM if first attempt fails. NeedRAM checks is swapping is allowed ; Call MainExit if the handle could not be allocated ; ; in d0.l size ; d1.w handle ; fp Stack frame ; ; out d0.w handle ; a0 ptr to the handle ; ; destroy d0-d2/a0-a1 ;=============================================================================== ReallocHandle: move.l d0,-(sp) move.w d1,-(sp) move.l d0,-(sp) move.w d1,-(sp) move.w d1,d0 bsr SwapOut jsr REALLOC(fp) ; Use Pedrom's realloc to allow files larger than 64 kb addq.l #6,sp tst.w d0 bne.s \End move.w (sp),d0 ; This handle musn't be swapped ! bsr NeedRAM jsr REALLOC(fp) tst.w d0 bne.s \End move.w #ERROR_MEMORY,ERROR(fp) pea StrErrorMemory(pc) bsr PrintToStderr bra MainExit \End: movea.w d0,a0 trap #3 addq.l #6,sp rts ;=============================================================================== ; ; NeedRAM ; ; Swap all possible data in flash, if allowed by the flag ; This function is called only by AllocHandle and ReallocHandle ; It won't throw an error if nothing can be swapped, calling functions will do that ; ; in d0.w Handle which musn't be swapped in case of reallocation ; Set to 0 by swapout to prevent a random file to be not swapped in ; fp Stack frame ; ; out nothing ; ; destroy nothing ; ;=============================================================================== NeedRAM: movem.l d0-d5/a0-a1,-(sp) move.w d0,d3 ;---------------------------------------------------------------------- ; Check if swapping is allowed ;---------------------------------------------------------------------- movea.l CURRENT_FLAGS_PTR(fp),a0 move.l (a0),d0 btst.l #BIT_SWAP,d0 beq.s \End ;---------------------------------------------------------------------- ; Try to swap all availables handles and files ; It doesn't matter if all files are not really put in flash, the ; next (re)allocation will fail, that's all. ; So don't check if something is really performed ;---------------------------------------------------------------------- ;---------------------------------------------------------------------- ; Swap sources files ;---------------------------------------------------------------------- move.w FILES_LIST_HD(fp),d4 moveq.l #0,d5 \Loop: movea.w d4,a0 trap #3 cmp.w (a0)+,d5 beq.s \EndLoop move.w d5,d0 mulu.w #FILE.sizeof,d0 move.w FILE.Handle(a0,d0.l),d0 ; SwapIn () needs the Z-Flag to be set if the handle exists, so don't change that ! bsr.s \SwapIn addq.w #1,d5 bra.s \Loop \EndLoop: ;---------------------------------------------------------------------- ; Swap objects handles ;---------------------------------------------------------------------- move.w FILES_LIST_HD(fp),d0 bsr.s \SwapIn ; SwapIn () needs the Z-Flag to be set if the handle exists, so don't change that ! move.w BIN_HD(fp),d0 bsr.s \SwapIn move.w LABELS_HD(fp),d0 bsr.s \SwapIn \End: movem.l (sp)+,d0-d5/a0-a1 rts ;------------------------------------------------------------------------------- ; Swap a file : ; - chekc that the handle exists ; - check that the handle mustn't be kept in RAM ; - get a tmp filename if the handle doesn't belong to a file ; - create a file and give it the handle ; - archive the file ; ; This function is called only by NeedRAM ;------------------------------------------------------------------------------- \SwapIn: beq.s \NoSwapIn ; Handle not created yep (Z-flag already set) cmp.w d0,d3 ; Handle currently reallocated : don't swap it beq.s \NoSwapIn lea -18(sp),sp ; Frame buffer for pdtlib::Hd2FullName movea.l sp,a0 move.w d0,d2 ; Save handle jsr HD_2_FULL_NAME(fp) tst.w d0 bne.s \ArchiveFile ; This handle already belongs to a file move.w d2,-(sp) ; Save Hd suba.l a0,a0 ; Use PedroM internal buffer jsr TMPNAM(fp) ; We don't care about the filename itself and don't have to save it move.w (sp)+,d0 ; Hd pea (a0) ; Save filename jsr CREATE_FILE(fp) movea.l (sp)+,a0 ; Filename tst.w d0 beq.s \Fail \ArchiveFile: jsr ARCHIVE_FILE(fp) \Fail: lea 18(sp),sp \NoSwapIn: rts ;=============================================================================== ; ; SwapOut ; ; Swap an handle in RAM. If it fails, call NeedRAM, then retry. ; If it fails again, throw an error and call Main Exit ; ; in d0.w Handle which must be swapped in RAM ; fp Stack frame ; ; out nothing ; ; destroy nothing ; ;=============================================================================== SwapOut: movem.l d0-d3/a0-a2,-(sp) move.w d0,d3 ;---------------------------------------------------------------------- ; Check if the file is already in RAM ;---------------------------------------------------------------------- movea.w d0,a0 trap #3 cmpa.l ROM_BASE(fp),a0 bcs.s \End ; Already in RAM ;---------------------------------------------------------------------- ; Try twice to pop in RAM. Call NeedRAM if first attempt fails ;---------------------------------------------------------------------- bsr.s \Unarchive bne.s \End bsr NeedRAM ; d0 already set to 0 bsr.s \Unarchive bne.s \End ;---------------------------------------------------------------------- ; Failed. Throw an error and quit ;---------------------------------------------------------------------- move.w #ERROR_MEMORY,ERROR(fp) pea StrErrorMemory(pc) bsr PrintToStderr bra MainExit ;---------------------------------------------------------------------- ; Success ;---------------------------------------------------------------------- \End: movem.l (sp)+,d0-d3/a0-a2 rts ;---------------------------------------------------------------------- ; Unarchive a file. Z-flag set according to success ;---------------------------------------------------------------------- \Unarchive: lea -18(sp),sp ; Buffer for pdtlib::Hd2FullName move.w d3,d0 ; Handle movea.l sp,a0 jsr HD_2_FULL_NAME(fp) jsr UNARCHIVE_FILE(fp) tst.w d0 lea 18(sp),sp rts