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<