/*-------------------------------------------------------------------------
setjmp.c - source file for ANSI routines setjmp & longjmp
Copyright (C) 1999, Sandeep Dutta . sandeep.dutta@usa.net
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this library; see the file COPYING. If not, write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
As a special exception, if you link this library with other files,
some of which are compiled with SDCC, to produce an executable,
this library does not by itself cause the resulting executable to
be covered by the GNU General Public License. This exception does
not however invalidate any other reasons why the executable file
might be covered by the GNU General Public License.
-------------------------------------------------------------------------*/
#include <sdcc-lib.h>
#define __SDCC_HIDE_LONGJMP
#include <setjmp.h>
#if defined(__SDCC_ds390)
#include <ds80c390.h>
int __setjmp (jmp_buf buf)
{
unsigned char sp, esp;
unsigned long lsp;
/* registers would have been saved on the
stack anyway so we need to save SP
and the return address */
__critical {
sp = SP;
esp = ESP;
}
lsp = sp;
lsp |= (unsigned int)(esp << 8);
lsp |= 0x400000;
*buf++ = lsp;
*buf++ = lsp >> 8;
*buf++ = *((unsigned char __xdata *) lsp - 0);
*buf++ = *((unsigned char __xdata *) lsp - 1);
*buf++ = *((unsigned char __xdata *) lsp - 2);
return 0;
}
{
unsigned long lsp;
lsp = *buf++;
lsp |= (unsigned int)(*buf++ << 8);
lsp |= 0x400000;
*((unsigned char __xdata *) lsp - 0) = *buf++;
*((unsigned char __xdata *) lsp - 1) = *buf++;
*((unsigned char __xdata *) lsp - 2) = *buf++;
__critical {
SP = lsp;
ESP = lsp >> 8;
}
return rv ? rv : 1;
}
#elif defined(__SDCC_STACK_AUTO) && defined(__SDCC_USE_XSTACK)
static void dummy (void) __naked
{
__asm
;------------------------------------------------------------
;Allocation info for local variables in function 'setjmp'
;------------------------------------------------------------
;buf Allocated to registers dptr b
;------------------------------------------------------------
;..
/..
/device
/lib
/_setjmp.
c:180:int setjmp (jmp_buf buf
)
; -----------------------------------------
; -----------------------------------------
.globl ___setjmp
___setjmp:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
;../../device/lib/_setjmp.c:183:*buf++ = bpx;
; genPointerSet
; genGenPointerSet
mov a,_bpx
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:184:*buf++ = spx;
; genPointerSet
; genGenPointerSet
mov a,_spx
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:185:*buf++ = bp;
; genPointerSet
; genGenPointerSet
mov a,_bp
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:186:*buf++ = SP;
; genPointerSet
; genGenPointerSet
mov a,sp
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:187:*buf++ = *((unsigned char __data *) SP );
; genCast
; genPointerGet
; genNearPointerGet
; genPointerSet
; genGenPointerSet
mov r0,sp
mov a,@r0
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:188:*buf = *((unsigned char __data *)SP - 1);
; genCast
; genMinus
; genMinusDec
; peephole 177.g optimized mov sequence
dec r0
; genPointerGet
; genNearPointerGet
mov a,@r0
; genPointerSet
; genGenPointerSet
lcall __gptrput
#ifdef __SDCC_MODEL_HUGE
inc dptr
;../../device/lib/_setjmp.c:189:*buf = *((unsigned char __data *)SP - 2);
; genCast
; genMinus
; genMinusDec
; peephole 177.g optimized mov sequence
dec r0
; genPointerGet
; genNearPointerGet
mov a,@r0
; genPointerSet
; genGenPointerSet
lcall __gptrput
#endif
;../../device/lib/_setjmp.c:190:return 0;
; genRet
mov dptr,#0x0000
_RETURN
;------------------------------------------------------------
;Allocation info for local variables in function 'longjmp'
;------------------------------------------------------------
;rv Allocated to stack - offset -2
;buf Allocated to registers dptr b
;lsp Allocated to registers r5
;------------------------------------------------------------
;..
/..
/device
/lib
/_setjmp.
c:192:int longjmp (jmp_buf buf
, int rv
)
; -----------------------------------------
; -----------------------------------------
.globl _longjmp
_longjmp:
; genReceive
mov r0,_spx
dec r0
movx a,@r0
mov r2,a
dec r0
movx a,@r0
mov r3,a
;../../device/lib/_setjmp.c:193:bpx = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
mov _bpx,a
inc dptr
;../../device/lib/_setjmp.c:194:spx = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
mov _spx,a
inc dptr
;../../device/lib/_setjmp.c:195:bp = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
mov _bp,a
inc dptr
;../../device/lib/_setjmp.c:196:lsp = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
inc dptr
; genAssign
mov r5,a
;../../device/lib/_setjmp.c:197:*((unsigned char __data *) lsp) = *buf++;
; genCast
mov r0,a
; genPointerGet
; genGenPointerGet
lcall __gptrget
inc dptr
; genPointerSet
; genNearPointerSet
mov @r0,a
;../../device/lib/_setjmp.c:198:*((unsigned char __data *) lsp - 1) = *buf;
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genGenPointerGet
lcall __gptrget
; genPointerSet
; genNearPointerSet
mov @r0,a
#ifdef __SDCC_MODEL_HUGE
inc dptr
;../../device/lib/_setjmp.c:199:*((unsigned char __data *) lsp - 2) = *buf;
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genGenPointerGet
lcall __gptrget
; genPointerSet
; genNearPointerSet
mov @r0,a
#endif
;../../device/lib/_setjmp.c:200:SP = lsp;
; genAssign
mov sp,r5
;../../device/lib/_setjmp.c:201:return rv ? rv : 1;
; genAssign
mov dph,r2
mov dpl,r3
mov a,r2
orl a,r3
jnz 00001$
inc dptr
; genRet
00001$:
_RETURN
__endasm;
}
#elif defined(__SDCC_STACK_AUTO)
static void dummy (void) __naked
{
__asm
;------------------------------------------------------------
;Allocation info for local variables in function 'setjmp'
;------------------------------------------------------------
;buf Allocated to registers dptr b
;------------------------------------------------------------
;..
/..
/device
/lib
/_setjmp.
c:122:int setjmp (unsigned char *buf
)
; -----------------------------------------
; -----------------------------------------
.globl ___setjmp
___setjmp:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
; genReceive
;../../device/lib/_setjmp.c:125:*buf = BP;
; genPointerSet
; genGenPointerSet
mov a,_bp
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:126:*buf = SP;
; genPointerSet
; genGenPointerSet
mov a,sp
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:127:*buf++ = *((unsigned char __data *) SP );
; genCast
mov r0,sp
; genPointerGet
; genNearPointerGet
mov a,@r0
; genPointerSet
; genGenPointerSet
lcall __gptrput
inc dptr
;../../device/lib/_setjmp.c:128:*buf++ = *((unsigned char __data *)SP - 1);
; genCast
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genNearPointerGet
mov a,@r0
; genPointerSet
; genGenPointerSet
lcall __gptrput
#ifdef __SDCC_MODEL_HUGE
inc dptr
;../../device/lib/_setjmp.c:129:*buf++ = *((unsigned char __data *)SP - 2);
; genCast
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genNearPointerGet
mov a,@r0
; genPointerSet
; genGenPointerSet
lcall __gptrput
#endif
;../../device/lib/_setjmp.c:130:return 0;
; genRet
mov dptr,#0x0000
_RETURN
;------------------------------------------------------------
;Allocation info for local variables in function 'longjmp'
;------------------------------------------------------------
;rv Allocated to stack - offset -3
;buf Allocated to registers dptr b
;lsp Allocated to registers r5
;------------------------------------------------------------
;..
/..
/device
/lib
/_setjmp.
c:28:int longjmp (jmp_buf buf
, int rv
)
; -----------------------------------------
; -----------------------------------------
.globl _longjmp
_longjmp:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
; genReceive
mov r0,sp
dec r0
dec r0
#ifdef __SDCC_MODEL_HUGE
dec r0
#endif
mov ar2,@r0
dec r0
mov ar3,@r0
;../../device/lib/_setjmp.c:30:bp = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
inc dptr
; genAssign
mov _bp,a
;../../device/lib/_setjmp.c:31:lsp = *buf++;
; genPointerGet
; genGenPointerGet
lcall __gptrget
inc dptr
; genAssign
mov r5,a
;../../device/lib/_setjmp.c:32:*((unsigned char __data *) lsp) = *buf++;
; genCast
mov r0,a
; genPointerGet
; genGenPointerGet
lcall __gptrget
inc dptr
; genPointerSet
; genNearPointerSet
mov @r0,a
;../../device/lib/_setjmp.c:33:*((unsigned char __data *) lsp - 1) = *buf;
; genCast
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genGenPointerGet
lcall __gptrget
; genPointerSet
; genNearPointerSet
mov @r0,a
#ifdef __SDCC_MODEL_HUGE
inc dptr
;../../device/lib/_setjmp.c:34:*((unsigned char __data *) lsp - 2) = *buf;
; genCast
; genMinus
; genMinusDec
dec r0
; genPointerGet
; genGenPointerGet
lcall __gptrget
; genPointerSet
; genNearPointerSet
mov @r0,a
#endif
;../../device/lib/_setjmp.c:35:SP = lsp;
; genAssign
mov sp,r5
;../../device/lib/_setjmp.c:36:return rv ? rv : 1;
; genAssign
mov dph,r2
mov dpl,r3
mov a,r2
orl a,r3
jnz 00001$
inc dptr
; genRet
00001$:
_RETURN
__endasm;
}
#else
#include <8051.h>
extern unsigned char __data spx;
extern unsigned char __data bpx;
int __setjmp (jmp_buf buf)
{
/* registers would have been saved on the
stack anyway so we need to save SP
and the return address */
#ifdef __SDCC_USE_XSTACK
*buf++ = spx;
*buf++ = bpx;
#endif
*buf++ = SP;
*buf++ = *((unsigned char __data *) SP - 0);
*buf++ = *((unsigned char __data *) SP - 1);
#ifdef __SDCC_MODEL_HUGE
*buf++ = *((unsigned char __data *) SP - 2);
#endif
return 0;
}
{
unsigned char lsp;
#ifdef __SDCC_USE_XSTACK
spx = *buf++;
bpx = *buf++;
#endif
lsp = *buf++;
*((unsigned char __data *) lsp - 0) = *buf++;
*((unsigned char __data *) lsp - 1) = *buf++;
#ifdef __SDCC_MODEL_HUGE
*((unsigned char __data *) lsp - 2) = *buf++;
#endif
SP = lsp;
return rv ? rv : 1;
}
#endif