This is file "free.asm", it is an optional substitution for the file "free.c". It is much more optimized, but works only for PIC18 in extended mode with Microchip MPLAB-C18.
;===============================================================================
; This file is part of "Heap Management For Small Microcontrollers".
; v1.05 (2009-06-29)
; isaacbavaresco@yahoo.com.br
;===============================================================================
; Copyright (c) 2007-2009, Isaac Marino Bavaresco
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; * Neither the name of the author nor the
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;===============================================================================
#include <P18CXXX.INC>
;===============================================================================
radix decimal
;===============================================================================
#include <heap_config.h>
;===============================================================================
#if USING_FREE_RTOS == 1
;-------------------------------------------------------------------------------
extern vTaskSuspendAll
extern xTaskResumeAll
#define LOCALS_SIZE 6
DISABLE_INTERRUPTS macro
call vTaskSuspendAll
endm
RESTORE_INTERRUPTS macro
call xTaskResumeAll
endm
;-------------------------------------------------------------------------------
#else ; USING_FREE_RTOS == 1
;-------------------------------------------------------------------------------
#define LOCALS_SIZE 7
DISABLE_INTERRUPTS macro
; Aux = INTCON & 0xc0;
movlw 0xc0
andwf INTCON,w,ACCESS
movwf [Aux+0]
; INTCON &= 0x3f;
movlw 0x3f
andwf INTCON,f,ACCESS
endm
RESTORE_INTERRUPTS macro
; INTCON |= Aux;
movf [Aux+0],w
iorwf INTCON,f,ACCESS
endm
;-------------------------------------------------------------------------------
#endif ; USING_FREE_RTOS == 1
;===============================================================================
ALLOC code
;===============================================================================
#define r 0
#define p 4
#define q 6
#define Aux2 8
#define Aux 10
extern __freelist
;===============================================================================
global free
;15: void free( void ram *r )
free: movff FSR2L, POSTINC1
movff FSR2H, POSTINC1
movff FSR1L,FSR2L
movff FSR1H,FSR2H
subfsr 2,4
;16: {
;17: struct _AllocBlock ram *p, *q;
; unsigned short Aux2;
; unsigned char Aux;
addfsr 1,LOCALS_SIZE
;18:
;19: if( r == NULL )
movf [r+0],w
iorwf [r+1],w
;20: return;
bnz NotNULL
bra Finish
;21:
;22: r = (unsigned char *)r - 2;
NotNULL: movlw 0x02
subwf [r+0],f
movlw 0
subwfb [r+1],f
DISABLE_INTERRUPTS
;23:
;24:
;25: for( p = __freelist.Next, q = &__freelist; p != NULL && p < (struct _AllocBlock ram *)r; q = p, p = p->Next )
movlw low __freelist
movwf [q+0]
movlw high __freelist
movwf [q+1]
movff __freelist+2,FSR0L ; p = __freelist.Next;
movff __freelist+3,FSR0H
Loop: movf FSR0L,w,ACCESS ; p != NULL
iorwf FSR0H,w,ACCESS
bz xa630
movf [r+0],w ; && p < (struct _AllocBlock ram *)r;
subwf FSR0L,w,ACCESS
movf [r+1],w
subwfb FSR0H,w,ACCESS
bc xa630
movf FSR0L,w,ACCESS ; q = p;
movwf [q+0]
movf FSR0H,w,ACCESS
movwf [q+1]
addfsr 0,2 ; p = p->Next );
movf POSTINC0,w,ACCESS
movff INDF0,FSR0H
movwf FSR0L,ACCESS
bra Loop
;26: ; /* Empty statement */
xa630: movf FSR0L,w
movwf [p+0]
movf FSR0H,w
movwf [p+1]
;29: q->Next = r;
movsf [q+0],FSR0L
movsf [q+1],FSR0H
addfsr 0,2
movsf [r+0],POSTINC0
movsf [r+1],POSTDEC0
;28: ((struct _AllocBlock ram *)r)->Next = p;
movsf [r+0],FSR0L
movsf [r+1],FSR0H
addfsr 0,2
movsf [p+0],POSTINC0
movsf [p+1],POSTDEC0
;31: if( (unsigned short)r + ((struct _AllocBlock ram *)r)->Length + 2 == (unsigned short)p )
;movsf [r+0],FSR0L
;movsf [r+1],FSR0H
subfsr 0,2
movf POSTINC0,w,ACCESS
addwf [r+0],w
movwf PRODL,ACCESS
movf POSTDEC0,w,ACCESS
addwfc [r+1],w
movwf PRODH,ACCESS
movlw 0x02
addwf PRODL,w,ACCESS
xorwf [p+0],w
bnz xa68e
movlw 0x00
addwfc PRODH,w,ACCESS
xorwf [p+1],w
bnz xa68e
;32: {
;34: ((struct _AllocBlock ram *)r)->Length += p->Length + 2;
;33: ((struct _AllocBlock ram *)r)->Next = p->Next;
movsf [p+0],FSR0L ; FSR0 = p;
movsf [p+1],FSR0H
movlw 0x02 ; Aux2 = p->Length + 2;
addwf POSTINC0,w,ACCESS
movwf [Aux2+0]
movlw 0x00
addwfc POSTINC0,w,ACCESS
movwf [Aux2+1]
movff POSTINC0,PRODL ; PROD = p->Next;
movff POSTINC0,PRODH
movsf [r+0],FSR0L ; FSR = r;
movsf [r+1],FSR0H
movf [Aux2+0],w ; r->Length += Aux2;
addwf POSTINC0,f,ACCESS
movf [Aux2+1],w
addwfc POSTINC0,f,ACCESS
movff PRODL,POSTINC0 ; r->Next = PROD;
movff PRODH,POSTINC0
;35: }
;36:
;37: if( (unsigned short)q + ((struct _AllocBlock ram *)q)->Length + 2 == (unsigned short)r )
xa68e: movsf [q+0],FSR0L ; FSR0 = q;
movsf [q+1],FSR0H
movf POSTINC0,w,ACCESS ; PROD = q->Length;
addwf [q+0],w
movwf PRODL,ACCESS
movf POSTDEC0,w,ACCESS
addwfc [q+1],w
movwf PRODH,ACCESS
movlw 0x02 ; if( PROD + 2 == r )
addwf PRODL,w,ACCESS ; {
xorwf [r+0],w
bnz Epilog
movlw 0x00
addwfc PRODH,w,ACCESS
xorwf [r+1],w
bnz Epilog
;38: {
;40: ((struct _AllocBlock ram *)q)->Length += ((struct _AllocBlock ram *)r)->Length + 2;
;39: ((struct _AllocBlock ram *)q)->Next = ((struct _AllocBlock ram *)r)->Next;
movsf [r+0],FSR0L ; FSR0 = r;
movsf [r+1],FSR0H
movlw 0x02 ; Aux2 = r->Length + 2;
addwf POSTINC0,w,ACCESS
movwf [Aux2+0]
movlw 0x00
addwfc POSTINC0,w,ACCESS
movwf [Aux2+1]
movff POSTINC0,PRODL ; PROD = r->Next;
movff POSTINC0,PRODH
movsf [q+0],FSR0L ; FSR0 = q;
movsf [q+1],FSR0H
movf [Aux2+0],w ; q->Length += Aux2;
addwf POSTINC0,f,ACCESS
movf [Aux2+1],w
addwfc POSTINC0,f,ACCESS
movff PRODL,POSTINC0 ; q->Next = PROD;
movff PRODH,POSTINC0
;41: }
;42: }
Epilog: RESTORE_INTERRUPTS
Finish: subfsr 1,LOCALS_SIZE + 1
movff POSTDEC1,FSR2H
movff INDF1,FSR2L
return 0
;===============================================================================
end
;===============================================================================
| file: /Techref/member/IMB-yahoo-J86/free.asm.htm, 8KB, , updated: 2010/4/14 14:59, local time: 2025/10/22 19:50,
owner: IMB-yahoo-J86,
216.73.216.20,10-1-5-169:LOG IN
|
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://massmind.ecomorder.com/Techref/member/IMB-yahoo-J86/free.asm.htm"> Heap Management For Small Microcontrollers - free.asm</A> |
| Did you find what you needed? |