This file is part of SimpleRTOS2
; I found the following message in Microchip's support site. The URL is:
; http://support2.microchip.com/KBSearch/KB_Ticket.aspx?ID=Tt6UJ9A0003LM
;
; Unfortunately these pseudo-instructions don't work as inline assembly,
; so I had to make this separate .asm module.
; The functions are used inside 'port.c' and are called by 'pxPortInitialiseStack'
; (GetTMPDATALen, GetTMPDATAStrt, GetMATHDATALen, GetMATHDATAStrt) and
; by the macros 'portSAVE_CONTEXT' (SaveTMP_MATH) and 'portRESTORE_CONTEXT'
; (RestoreTMP_MATH').
;-------------------------------------------------------------------------------
; Start of the message:
;-------------------------------------------------------------------------------
;
; Issue
;
; I'm developping a RTOS for the PIC18F258 using MPLAB-C18. I need to save in the
; task context the "MATH_DATA" and ".tmpdata" sections. But their address and size
; are only known after linking. The question is: How can I know the address and
; size of both sections at run time?
;
; Thanks
;
; Solution
; You CAN get the section location and size at runtime using MPASM.
; There are a few undocumented operators and pseudo-instructions.
;
; The SCNSZ operators give you the size of the section.
; The SCNSTART operators give you the starting address of a section.
; The SCNEND operators give you the ending address of a section.
; The SCNSTART_LFSR pseudo-instruction gives you an LFSR instruction with the starting address of the section.
; The SCNEND_LFSR pseudo-instruction gives you an LFSR instruction with the ending address of the section.
;
; Example:
; CODE
; movlw SCNSZ_LOW .tmpdata
; movlw SCNSZ_HIGH .tmpdata
; movlw SCNSZ_UPPER .tmpdata
; movlw SCNSTART_LOW .tmpdata
; movlw SCNSTART_HIGH .tmpdata
; movlw SCNSTART_UPPER .tmpdata
; movlw SCNEND_LOW .tmpdata
; movlw SCNEND_HIGH .tmpdata
; movlw SCNEND_UPPER .tmpdata
;
; SCNSTART_LFSR 0, .tmpdata
; SCNEND_LFSR 0, .tmpdata
;
; END
;
; These operators and pseudo-instructions will be documented in the next revision
; of the MPASM User's Guide.
;
;-------------------------------------------------------------------------------
; End of the message
;-------------------------------------------------------------------------------
;===============================================================================
; Copyright (c) 2007-2008, 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.
;===============================================================================
; isaacbavaresco@yahoo.com.br
;===============================================================================
#include <P18CXXX.INC>
;===============================================================================
radix decimal
;===============================================================================
code
;===============================================================================
global GetTMPDATAStrt
GetTMPDATAStrt: movlw SCNSTART_LOW .tmpdata
movwf PRODL
movlw SCNSTART_HIGH .tmpdata
movwf PRODH
return 0
;===============================================================================
global GetTMPDATALen
GetTMPDATALen: movlw SCNSZ_LOW .tmpdata
return 0
;===============================================================================
global GetMATHDATAStrt
GetMATHDATAStrt:movlw SCNSTART_LOW MATH_DATA
movwf PRODL
movlw SCNSTART_HIGH MATH_DATA
movwf PRODH
return 0
;===============================================================================
global GetMATHDATALen
GetMATHDATALen: movlw SCNSZ_LOW MATH_DATA
return 0
;===============================================================================
global SaveTMP_MATH
SaveTMP_MATH:
SCNSTART_LFSR 0, .tmpdata
movlw SCNSZ_LOW .tmpdata
SaveLoop1: movff POSTINC0,PREINC1
addlw -1
bnz SaveLoop1
SCNSTART_LFSR 0, MATH_DATA
movlw SCNSZ_LOW MATH_DATA
SaveLoop2: movff POSTINC0,PREINC1
addlw -1
bnz SaveLoop2
return 0
;===============================================================================
global RestoreTMP_MATH
RestoreTMP_MATH:
SCNEND_LFSR 0, MATH_DATA
movlw SCNSZ_LOW MATH_DATA
RestoreLoop1: movff POSTDEC1,POSTDEC0
addlw -1
bnz RestoreLoop1
SCNEND_LFSR 0, .tmpdata
movlw SCNSZ_LOW .tmpdata
RestoreLoop2: movff POSTDEC1,POSTDEC0
addlw -1
bnz RestoreLoop2
return 0
;===============================================================================
end
;===============================================================================