]> git.sur5r.net Git - cc65/blobdiff - libsrc/common/malloc.s
The spans do now contain the size of a span, no longer the end offset.
[cc65] / libsrc / common / malloc.s
index 6b69b4199c038f18e90ef48a9d458bd8f5b46494..0f22090bbc5282028f311677cb54671bd02504f9 100644 (file)
@@ -150,21 +150,21 @@ _malloc:
 
        jmp     @L4
 
-@L3:   ldy     #freeblock_size
+@L3:   ldy     #freeblock::size
                lda     (ptr2),y
                sub     ptr1
        tax                             ; Remember low byte for later
-       iny                             ; Y points to freeblock_size+1
+       iny                             ; Y points to freeblock::size+1
                lda     (ptr2),y
        sbc     ptr1+1
        bcs     BlockFound              ; Beware: Contents of a/x/y are known!
 
 ; Next block in list
 
-       iny                             ; Points to freeblock_next
+       iny                             ; Points to freeblock::next
        lda     (ptr2),y
        tax
-       iny                             ; Points to freeblock_next+1
+       iny                             ; Points to freeblock::next+1
        lda     (ptr2),y
        stx     ptr2
        sta     ptr2+1
@@ -214,20 +214,20 @@ TakeFromTop:
 
 BlockFound:
                bne     SliceBlock              ; Block is large enough to slice
-       cpx     #HEAP_MIN_BLOCKSIZE+1   ; Check low byte
+               cpx     #HEAP_MIN_BLOCKSIZE     ; Check low byte
                bcs     SliceBlock              ; Jump if block is large enough to slice
 
 ; The block is too small to slice it. Use the block in full. The block
 ; does already contain the correct size word, all we have to do is to
 ; remove it from the free list.
 
-               ldy     #freeblock_prev+1       ; Load f->prev
+               ldy     #freeblock::prev+1      ; Load f->prev
        lda     (ptr2),y
        sta     ptr3+1
        dey
        lda     (ptr2),y
        sta     ptr3
-       dey                             ; Points to freeblock_next+1
+       dey                             ; Points to freeblock::next+1
        ora     ptr3+1
        beq     @L1                     ; Jump if f->prev zero
 
@@ -309,17 +309,27 @@ SliceBlock:
        stx     ptr2
        sta     ptr2+1
 
-; Fill the size into the admin space of the block and return the user pointer
+; Fill the size and start address into the admin space of the block
+; (struct usedblock) and return the user pointer
 
 FillSizeAndRet:
-       ldy     #freeblock_size         ; *p = size;
-       lda     ptr1                    ; Low byte of block size
+       ldy     #usedblock::size        ; p->size = size;
+       lda     ptr1                    ; Low byte of block size
        sta     (ptr2),y
-       iny                             ; Points to freeblock_size+1
+       iny                             ; Points to freeblock::size+1
        lda     ptr1+1
        sta     (ptr2),y
 
 RetUserPtr:
+        ldy     #usedblock::start       ; p->start = p
+        lda     ptr2
+        sta     (ptr2),y
+        iny
+        lda     ptr2+1
+        sta     (ptr2),y
+
+; Return the user pointer, which points behind the struct usedblock
+
        lda     ptr2                    ; return ++p;
        ldx     ptr2+1
        add     #HEAP_ADMIN_SPACE