6809: Implement setjmp/longjmp
authorTormod Volden <debian.tormod@gmail.com>
Sat, 23 May 2015 18:07:30 +0000 (20:07 +0200)
committerAlan Cox <alan@linux.intel.com>
Sat, 23 May 2015 22:05:35 +0000 (23:05 +0100)
Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Library/include/setjmp.h
Library/libs/Makefile.6809
Library/libs/setjmp_6809.s [new file with mode: 0644]

index d240a75..a9fd7e1 100644 (file)
@@ -7,9 +7,12 @@
 /* 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
index b7cc75c..a721a77 100644 (file)
@@ -9,7 +9,7 @@ CC_NOOPT = $(CC_OPT)
 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
@@ -27,7 +27,7 @@ SRC_C += localtim.c localtim_r.c lseek.c lsearch.c lstat.c ltoa.c ltostr.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
diff --git a/Library/libs/setjmp_6809.s b/Library/libs/setjmp_6809.s
new file mode 100644 (file)
index 0000000..a0a5325
--- /dev/null
@@ -0,0 +1,34 @@
+; 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
+