1/* setjmp/longjmp routines for M68HC11 & M68HC12.
2 * Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr)
3 *
4 * The authors hereby grant permission to use, copy, modify, distribute,
5 * and license this software and its documentation for any purpose, provided
6 * that existing copyright notices are retained in all copies and that this
7 * notice is included verbatim in any distributions. No written agreement,
8 * license, or royalty fee is required for any of the authorized uses.
9 * Modifications to this software may be copyrighted by their authors
10 * and need not follow the licensing terms described here, provided that
11 * the new terms are clearly indicated on the first page of each file where
12 * they apply.
13 */
14
15#if __INT__ == 32
16# define val 4
17# define INT32(X) X
18#else
19# define val 2
20# define INT32(X)
21#endif
22
23#ifdef mc6811
24# define REG(X) *X
25#else
26# define REG(X) X
27#endif
28
29	.sect .text
30	.global setjmp
31	.global longjmp
32
33#ifdef mc6811
34setjmp:
35	xgdx
36	tsy
37	ldd	0,y
38	std	0,x
39	sty	2,x
40	ldd	REG(_.frame)
41	std	4,x
42	ldd	REG(_.d1)
43	std	6,x
44	ldd	REG(_.d2)
45	std	8,x
46	ldd	REG(_.d3)
47	std	10,x
48	ldd	REG(_.d4)
49	std	12,x
50	ldd	REG(_.d5)
51	std	14,x
52	ldd	REG(_.d6)
53	std	16,x
54	ldd	REG(_.d7)
55	std	18,x
56	ldd	REG(_.d8)
57	std	20,x
58INT32(	ldx	#0)
59	clra
60	clrb
61	rts
62#else
63setjmp:
64	xgdx
65	movw	0,sp,2,x+
66	sts	2,x+
67	movw	_.frame,2,x+
68	movw	_.d1,2,x+
69	movw	_.d2,2,x+
70	movw	_.d3,2,x+
71	movw	_.d4,2,x+
72	movw	_.d5,2,x+
73	movw	_.d6,2,x+
74	movw	_.d7,2,x+
75	movw	_.d8,2,x+
76INT32(	ldx	#0)
77	clra
78	clrb
79	rts
80#endif
81
82#ifdef mc6811
83longjmp:
84	xgdx
85	tsy
86	ldd	val,y
87	bne	do_jump
88	ldd	#1
89do_jump:
90	xgdy
91	ldd	4,x
92	std	REG(_.frame)
93	ldd	6,x
94	std	REG(_.d1)
95	ldd	8,x
96	std	REG(_.d2)
97	ldd	10,x
98	std	REG(_.d3)
99	ldd	12,x
100	std	REG(_.d4)
101	ldd	14,x
102	std	REG(_.d5)
103	ldd	16,x
104	std	REG(_.d6)
105	ldd	18,x
106	std	REG(_.d7)
107	ldd	20,x
108	std	REG(_.d8)
109	ldd	0,x
110	ldx	2,x
111	txs
112	std	0,x
113INT32(	ldx	#0)
114	xgdy
115	rts
116#else
117
118longjmp:
119	xgdx
120	ldy	val,sp
121	bne	do_jump
122	ldy	#1
123do_jump:
124	ldd	4,x+
125	movw	2,x+,_.frame
126	movw	0,x,_.d1
127	movw	2,x,_.d2
128	movw	4,x,_.d3
129	movw	6,x,_.d4
130	movw	8,x,_.d5
131	movw	10,x,_.d6
132	movw	12,x,_.d7
133	movw	14,x,_.d8
134	ldx	-4,x
135	txs
136	std	0,x
137INT32(	ldx	#0)
138	xgdy
139	rts
140#endif
141
142