mirror of
https://github.com/cc65/cc65.git
synced 2024-11-02 18:06:48 +00:00
79 lines
1.4 KiB
ArmAsm
79 lines
1.4 KiB
ArmAsm
;
|
|
; Ullrich von Bassewitz, 2003-02-01
|
|
;
|
|
; Return the amount of free memory on the heap.
|
|
;
|
|
; size_t _heapmemavail (void);
|
|
;
|
|
;
|
|
|
|
.importzp ptr1, ptr2
|
|
.export __heapmemavail
|
|
|
|
.include "_heap.inc"
|
|
|
|
.macpack generic
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; Code
|
|
|
|
__heapmemavail:
|
|
|
|
; size_t Size = 0;
|
|
|
|
lda #0
|
|
sta ptr2
|
|
sta ptr2+1
|
|
|
|
; struct freeblock* F = _heapfirst;
|
|
|
|
lda __heapfirst
|
|
sta ptr1
|
|
lda __heapfirst+1
|
|
@L1: sta ptr1+1
|
|
|
|
; while (F) {
|
|
|
|
ora ptr1
|
|
beq @L2 ; Jump if end of free list reached
|
|
|
|
; Size += F->size;
|
|
|
|
ldy #freeblock::size
|
|
lda (ptr1),y
|
|
add ptr2
|
|
sta ptr2
|
|
iny
|
|
lda (ptr1),y
|
|
adc ptr2+1
|
|
sta ptr2+1
|
|
|
|
; F = F->next;
|
|
|
|
iny ; Points to F->next
|
|
lda (ptr1),y
|
|
tax
|
|
iny
|
|
lda (ptr1),y
|
|
stx ptr1
|
|
jmp @L1
|
|
|
|
; return Size + (_heapend - _heapptr) * sizeof (*_heapend);
|
|
|
|
@L2: lda ptr2
|
|
add __heapend
|
|
sta ptr2
|
|
lda ptr2+1
|
|
adc __heapend+1
|
|
tax
|
|
|
|
lda ptr2
|
|
sub __heapptr
|
|
sta ptr2
|
|
txa
|
|
sbc __heapptr+1
|
|
tax
|
|
lda ptr2
|
|
|
|
rts
|