diff options
Diffstat (limited to 'newlib/libc/machine/m68hc11/setjmp.S')
-rw-r--r-- | newlib/libc/machine/m68hc11/setjmp.S | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/newlib/libc/machine/m68hc11/setjmp.S b/newlib/libc/machine/m68hc11/setjmp.S new file mode 100644 index 000000000..38d1188dc --- /dev/null +++ b/newlib/libc/machine/m68hc11/setjmp.S @@ -0,0 +1,141 @@ +/* setjmp/longjmp routines for M68HC11 & M68HC12. + * Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr) + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#if __INT__ == 32 +# define val 4 +# define INT32(X) X +#else +# define val 2 +# define INT32(X) +#endif + +#ifdef mc6811 +# define REG(X) *X +#else +# define REG(X) X +#endif + + .sect .text + .global setjmp + .global longjmp + +#ifdef mc6811 +setjmp: + xgdx + tsy + ldd 0,y + std 0,x + sty 2,x + ldd REG(_.frame) + std 4,x + ldd REG(_.d1) + std 6,x + ldd REG(_.d2) + std 8,x + ldd REG(_.d3) + std 10,x + ldd REG(_.d4) + std 12,x + ldd REG(_.d5) + std 14,x + ldd REG(_.d6) + std 16,x + ldd REG(_.d7) + std 18,x + ldd REG(_.d8) + std 20,x +INT32( ldx #0) + clra + clrb + rts +#else +setjmp: + xgdx + movw 0,sp,2,x+ + sts 2,x+ + movw _.frame,2,x+ + movw _.d1,2,x+ + movw _.d2,2,x+ + movw _.d3,2,x+ + movw _.d4,2,x+ + movw _.d5,2,x+ + movw _.d6,2,x+ + movw _.d7,2,x+ + movw _.d8,2,x+ +INT32( ldx #0) + clra + clrb + rts +#endif + +#ifdef mc6811 +longjmp: + xgdx + tsy + ldd val,y + bne do_jump + ldd #1 +do_jump: + xgdy + ldd 4,x + std REG(_.frame) + ldd 6,x + std REG(_.d1) + ldd 8,x + std REG(_.d2) + ldd 10,x + std REG(_.d3) + ldd 12,x + std REG(_.d4) + ldd 14,x + std REG(_.d5) + ldd 16,x + std REG(_.d6) + ldd 18,x + std REG(_.d7) + ldd 20,x + std REG(_.d8) + ldd 0,x + ldx 2,x + txs + std 0,x +INT32( ldx #0) + xgdy + rts +#else + +longjmp: + xgdx + ldy val,sp + bne do_jump + ldy #1 +do_jump: + ldd 4,x+ + movw 2,x+,_.frame + movw 0,x,_.d1 + movw 2,x,_.d2 + movw 4,x,_.d3 + movw 6,x,_.d4 + movw 8,x,_.d5 + movw 10,x,_.d6 + movw 12,x,_.d7 + movw 14,x,_.d8 + ldx -4,x + txs + std 0,x +INT32( ldx #0) + xgdy + rts +#endif + |