/* FIXME: need to add alt registers */
typedef int jmp_buf[7];
-int __setjmp __P((jmp_buf env));
void longjmp __P((jmp_buf env, int rv));
-
+#if defined(__SDCC_z80) || defined(__SDCC_z180)
+int __setjmp __P((jmp_buf env));
#define setjmp(x) __setjmp(x)
+#else
+int setjmp __P((jmp_buf env));
+#endif
#endif
ASM_OPT = -o
SRC_CRT0 = crt0_$(PLATFORM).s
OBJ_CRT0 = $(SRC_CRT0:.s=.o)
-SRC_ASM =
+SRC_ASM = setjmp_6809.s
OBJ_ASM = $(SRC_ASM:.s=.o)
SRC_C = __argv.c abort.c asctime.c assert.c atexit.c
SRC_C += bcmp.c bcopy.c bsearch.c bzero.c calloc.c cfree.c clock.c closedir.c
SRC_C += malloc.c mkfifo.c mkstemps.c nanosleep.c opendir.c pause.c perror.c
SRC_C += popen.c printf.c putenv.c putchar_wrapper.c putpwent.c pwent.c qsort.c
SRC_C += raise.c rand.c readdir.c readlink.c realloc.c regerror.c
-SRC_C += regsub.c remove.c rewind.c rindex.c setbuffer.c setenv.c setjmp.c
+SRC_C += regsub.c remove.c rewind.c rindex.c setbuffer.c setenv.c
SRC_C += setlocale.c setvbuf.c settimeofday.c sleep.c sprintf.c
SRC_C += stat.c stdio0.c stime.c
SRC_C += strcasecmp.c strcasestr.c strdup.c stricmp.c strlcpy.c strncasecmp.c
--- /dev/null
+; setjmp / longjmp for 6809 FUZIX
+; Copyright 2015 Tormod Volden
+
+ ; exported
+ .globl _setjmp
+ .globl _longjmp
+
+ .area .text
+
+; int setjmp(jmp_buf)
+_setjmp:
+ ldd ,s ; return address
+ sty ,x++
+ stu ,x++
+ sts ,x++
+ std ,x
+ ldx #0
+ rts
+
+; void longjmp(jmp_buf, int)
+_longjmp:
+ ; read back Y,U,S and return address
+ ldd 2,s ; second argument
+ bne @nz ; must not be 0
+ incb
+@nz ldy ,x++
+ ldu ,x++
+ lds ,x++ ; points to clobbered return address
+ ldx ,x
+ stx ,s ; restore return address
+ ; return given argument to setjmp caller
+ tfr d,x
+ rts
+