]> git.sur5r.net Git - cc65/commitdiff
New used block structure for the heap
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 5 Jan 2005 21:05:11 +0000 (21:05 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 5 Jan 2005 21:05:11 +0000 (21:05 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3347 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/common/_heapblocksize.s

index 0a39f9abc9b233f05a65c3c48af69838a261e05a..2be32fef4301c85d6e7f2875339725d7ca73bd3f 100644 (file)
@@ -6,7 +6,7 @@
 ; Return the size of an allocated block.
 ;
 
-       .importzp       ptr1
+       .importzp       ptr1, ptr2
                .export         __heapblocksize
 
         .include        "_heap.inc"
 
 __heapblocksize:
 
-; Decrement the block pointer so it points to the admin data
+; Below the user data is a pointer that points to the start of the real
+; (raw) memory block. The first word of this block is the size. To access
+; the raw block pointer, we will decrement the high byte of the pointer,
+; the pointer is then at offset 254/255.
 
-        sub     #HEAP_ADMIN_SPACE       ; Assume it's less than 256
-        bcs     L1
+        sta     ptr1
         dex
-L1:     sta     ptr1
         stx     ptr1+1
+        ldy     #$FE
+        lda     (ptr1),y
+        sta     ptr2            ; Place the raw block pointer into ptr2
+        iny
+        lda     (ptr1),y
+        sta     ptr2+2
 
-; Load the size from the given block
+; Load the size from the raw block
 
-        ldy     #1
-        lda     (ptr1),y
+        ldy     #usedblock::size+1
+        lda     (ptr2),y
         tax
 .if (.cpu .bitand CPU_ISET_65SC02)
-        lda     (ptr1)
+        lda     (ptr2)
 .else
         dey
-        lda     (ptr1),y
+        lda     (ptr2),y
 .endif
 
-; Adjust it to the user visible size
+; Correct the raw block size so that is shows the user visible portion. To
+; do that, we must decrease the size by the amount of unused memory, which is
+; the difference between the user space pointer and the raw memory block
+; pointer. Since we have decremented the user space pointer by 256, we will
+; have to correct the result.
+;
+;       return size - (ptr1 + 256 - ptr2)
+;       return size - ptr1 - 256 + ptr2
 
-        sub     #HEAP_ADMIN_SPACE
-        bcs     L9
-        dex
+        dex                     ; - 256
+        add     ptr2
+        pha
+        txa
+        adc     ptr2+1
+        tax
+        pla
+        sub     ptr1
+        pha
+        txa
+        sbc     ptr1+1
+        tax
+        pla
 
 ; Done
 
-L9:     rts
+        rts