home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
prog
/
source
/
dcassem.lha
/
No.8
< prev
next >
Wrap
Text File
|
1988-05-14
|
2KB
|
57 lines
XREF _LVOAllocMem,_LVOFreeMem
;==============================================================================
; Success = AllocMemory( memtable )
; d0 a0
;
; Allocates all memory in the given table and returns false if it failed.
; memory table is formatted as follows:-
;
; size.l,type.w,offset.w
; ......
; -1
;
; Size is the required size for this chunk of memory.
; Type is the memory type required, it is always ored with MEMF_CLEAR
; Offset is the offset to store at (off the a5 global pointer)
;==============================================================================
AllocMemory movem.l a2/a6,-(sp)
movea.l SysLib(a5),a6 using exec library
movea.l a0,a2 stash memtable address
10$ move.l (a2)+,d0 get size
bmi.s MemAlloced last entry, return true
moveq.l #0,d1
move.w (a2)+,d1 get type
bset.l #MEMB_CLEAR,d1 clear it too
jsr _LVOAllocMem(a6) allocate it
move.w (a2)+,d1 get store offset
move.l d0,0(a5,d1.w) save it
bne.s 10$ OK, memory fetched
MemAlloced movem.l (sp)+,a2/a6 could return 0 if it failed
rts
;==============================================================================
; FreeMemory( memtable )
; a0
;
; Frees all the memory that was allocated by AllocMemory up to the first zero
; pointer (or allocation that failed). Use same table as used for AllocMemory.
;==============================================================================
FreeMemory movem.l a2/a6,-(sp)
movea.l SysLib(a5),a6 using exec library
movea.l a0,a2 stash table pointer
10$ move.l (a2)+,d0 end of list
bmi.s MemFreed yep, exit now
move.l (a2)+,d1 offset to lower word
move.l 0(a5,d1.w),d1 get pointer
beq.s MemFreed quit! alloc failed on this one
movea.l d1,a1
jsr _LVOFreeMem(a6)
bra.s 10$
MemFreed movem.l (sp)+,a2/a6
rts
END