]> git.sur5r.net Git - cc65/blob - libsrc/common/_heapmaxavail.s
Just removed some trailing spaces.
[cc65] / libsrc / common / _heapmaxavail.s
1 ;
2 ; Ullrich von Bassewitz, 2003-02-01
3 ;
4 ; Return the size of the largest free block on the heap.
5 ;
6 ; size_t _heapmaxavail (void);
7 ;
8 ;
9                             
10         .importzp       ptr1, ptr2
11         .export         __heapmaxavail
12
13         .include        "_heap.inc"
14
15         .macpack        generic
16
17 ;-----------------------------------------------------------------------------
18 ; Code
19
20 __heapmaxavail:
21
22 ; size_t Size = (_heapend - _heapptr) * sizeof (*_heapend);
23
24         lda     __heapend
25         sub     __heapptr
26         sta     ptr2
27         lda     __heapend+1
28         sbc     __heapptr+1
29         sta     ptr2+1
30
31 ; struct freeblock* F = _heapfirst;
32
33         lda     __heapfirst
34         sta     ptr1
35         lda     __heapfirst+1
36 @L1:    sta     ptr1+1
37
38 ; while (F) {
39
40         ora     ptr1
41         beq     @L3             ; Jump if end of free list reached
42
43 ; if (Size < F->size) {
44
45         ldy     #freeblock::size
46         lda     ptr2
47         sub     (ptr1),y
48         iny
49         lda     ptr2+1
50         sbc     (ptr1),y
51         bcs     @L2
52
53 ; Size = F->size;
54
55         ldy     #freeblock::size
56         lda     (ptr1),y
57         sta     ptr2
58         iny
59         lda     (ptr1),y
60         sta     ptr2+1
61
62 ; F = F->next;
63
64 @L2:    iny                     ; Points to F->next
65         lda     (ptr1),y
66         tax
67         iny
68         lda     (ptr1),y
69         stx     ptr1
70         jmp     @L1
71
72 ; if (Size < HEAP_ADMIN_SPACE) return 0;
73
74 @L3:    lda     ptr2
75         sub     #HEAP_ADMIN_SPACE
76         ldx     ptr2+1
77         bcs     @L5
78         bne     @L4
79         txa
80         rts
81
82 ; return Size - HEAP_ADMIN_SPACE;
83
84 @L4:    dex
85 @L5:    rts