/* 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.
 */

#include <picolibc.h>

#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
	
