From 941948fc11e7b945061a9f1bef64e7ba3a3abb97 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Fri, 8 May 2026 22:08:58 +0200 Subject: [PATCH] Revert "gui, heap: modified how the heap works." This reverts commit abe0bef99ac3ad7bd5f9dadc90235ecc8a13260b. --- avr/modules/heap/main.asm | 272 +++++++++++---------------- avr/modules/lcd2/gui/base/layout.asm | 4 +- 2 files changed, 116 insertions(+), 160 deletions(-) diff --git a/avr/modules/heap/main.asm b/avr/modules/heap/main.asm index 9f05225..a3938ac 100644 --- a/avr/modules/heap/main.asm +++ b/avr/modules/heap/main.asm @@ -48,31 +48,24 @@ heapDblFree: .byte 1 Heap_Init: ldi xl, LOW(HEAP_START) ldi xh, HIGH(HEAP_START) - ldi r24, LOW((HEAP_SIZE-8) & 0xfffc) ; size minus chunk header, chunk footer, start, end - ldi r25, HIGH((HEAP_SIZE-8) & 0xfffc) ; we allocate multiples of 4 bytes + ldi r24, LOW((HEAP_SIZE-6) & 0xfffc) ; size minus chunk header, chunk footer, start, end + ldi r25, HIGH((HEAP_SIZE-6) & 0xfffc) ; we allocate multiples of 4 bytes clr r16 sts heapUsed, r16 sts heapUsed+1, r16 - ; write start header (two zero bytes) + st X+, r16 ; write start header st X+, r16 - st X+, r16 - ; X now points to first chunk sts heapPtr, xl ; store global vars sts heapPtr+1, xh sts heapFree, r24 sts heapFree+1, r25 - ; store header of first chunk (bit0=0, meaning: free chunk) - st X+, r24 + st X+, r24 ; store header of first chunk st X+, r25 add xl, r24 adc xh, r25 - ; store footer of first chunk - st X+, r24 + st X+, r24 ; store footer of first chunk st X+, r25 - ; write end header (two zero bytes) - st X+, r16 - st X+, r16 - ; okay + st X+, r16 ; write end footer sec ret ; @end @@ -131,7 +124,7 @@ Heap_AllocAndZero_ret: ; @routine heapAllocFirstFit ; ; @param r25:r24 number of bytes to alloc -; @return CFLAG set if okay, cleared otherwise +; @return CFLAG set of okay, cleared otherwise ; @return X start of allocated memory ; @clobbers r16, r17, r18, r19, r24, r25, X @@ -143,24 +136,20 @@ heapAllocFirstFit: lds xh, heapPtr+1 heapAllocFirstFit_loop: - ; read chunk header - ld r18, X+ - ld r19, X+ ; X now points to first data byte of chunk - ; zero-header found? - mov r16, r18 + ld r18, X+ ; read chunk header + ld r19, X+ + mov r16, r18 ; heap end reached? or r16, r19 - breq heapAllocFirstFit_memFull ; yes, memory full - ; chunk in use? + breq heapAllocFirstFit_memFull sbrc r18, HEAP_HEADER_BIT_USED rjmp heapAllocFirstFit_next ; jump if used ; current chunk free, check size - andi r18, 0xfc ; clear lower two bits + andi r18, 0xfc mov r16, r18 mov r17, r19 sub r16, r24 sbc r17, r25 ; r17:r16=remainder brcs heapAllocFirstFit_next ; too small - ; chunk size is okay, use it rcall heapUseChunk sec ret @@ -172,82 +161,12 @@ heapAllocFirstFit_next: rjmp heapAllocFirstFit_loop heapAllocFirstFit_memFull: - bigcall Led1_SetFastTiming clc ret ; @end -; --------------------------------------------------------------------------- -; @routine heapUseChunk -; -; @param r25:r24 wanted size -; @param r17:r16 size of current chunk minus wanted size (remainder) -; @param X points to data of current chunk -; @clobbers - -heapUseChunk: - push xl - push xh - tst r17 - brne heapUseChunk_split - cpi r16, 8 ; at least 8 bytes left? - brcs heapUseChunk_directAlloc ; nope, use full chunk -heapUseChunk_split: - sbiw xh:xl, 2 ; go back to chunk header - ; X points to start of chunk header - mov r18, r24 - sbr r18, (1<