mirror of
https://github.com/cc65/cc65.git
synced 2024-11-11 01:05:25 +00:00
78 lines
1.4 KiB
ArmAsm
78 lines
1.4 KiB
ArmAsm
|
;
|
||
|
; Ullrich von Bassewitz, 2003-02-01
|
||
|
;
|
||
|
; Return the size of the largest free block on the heap.
|
||
|
;
|
||
|
; size_t __fastcall__ _heapmaxavail (void);
|
||
|
;
|
||
|
;
|
||
|
|
||
|
.importzp ptr1, ptr2
|
||
|
.export __heapmaxavail
|
||
|
|
||
|
.include "_heap.inc"
|
||
|
|
||
|
.macpack generic
|
||
|
|
||
|
;-----------------------------------------------------------------------------
|
||
|
; Code
|
||
|
|
||
|
__heapmaxavail:
|
||
|
|
||
|
; size_t Size = (_heapend - _heapptr) * sizeof (*_heapend);
|
||
|
|
||
|
lda __heapend
|
||
|
sub __heapptr
|
||
|
sta ptr2
|
||
|
lda __heapend+1
|
||
|
sbc __heapptr+1
|
||
|
sta ptr2+1
|
||
|
|
||
|
; struct freeblock* F = _heapfirst;
|
||
|
|
||
|
lda __heapfirst
|
||
|
sta ptr1
|
||
|
lda __heapfirst+1
|
||
|
@L1: sta ptr1+1
|
||
|
|
||
|
; while (F) {
|
||
|
|
||
|
ora ptr1
|
||
|
beq @L3 ; Jump if end of free list reached
|
||
|
|
||
|
; if (Size < F->size) {
|
||
|
|
||
|
ldy #freeblock_size
|
||
|
lda ptr2
|
||
|
sub (ptr1),y
|
||
|
iny
|
||
|
lda ptr2+1
|
||
|
sbc (ptr1),y
|
||
|
bcs @L2
|
||
|
|
||
|
; Size = F->size;
|
||
|
|
||
|
ldy #freeblock_size
|
||
|
lda (ptr1),y
|
||
|
sta ptr2
|
||
|
iny
|
||
|
lda (ptr1),y
|
||
|
sta ptr2+1
|
||
|
|
||
|
; F = F->next;
|
||
|
|
||
|
@L2: iny ; Points to F->next
|
||
|
lda (ptr1),y
|
||
|
tax
|
||
|
iny
|
||
|
lda (ptr1),y
|
||
|
stx ptr1
|
||
|
jmp @L1
|
||
|
|
||
|
; return Size;
|
||
|
|
||
|
@L3: lda ptr2
|
||
|
ldx ptr2+1
|
||
|
rts
|
||
|
|