Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / _setjmp.c
1 /*-------------------------------------------------------------------------
2   setjmp.c - source file for ANSI routines setjmp & longjmp
3
4              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
5
6    This library is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Library General Public License as published by the
8    Free Software Foundation; either version 2, or (at your option) any
9    later version.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
20    In other words, you are welcome to use, share and improve this program.
21    You are forbidden to forbid anyone else to use, share and improve
22    what you give them.   Help stamp out software-hoarding!
23 -------------------------------------------------------------------------*/
24 #include <8051.h>
25 #include <setjmp.h>
26
27 #if defined(SDCC_USE_XSTACK)
28
29 static void dummy (void) __naked
30 {
31         __asm
32
33 ;------------------------------------------------------------
34 ;Allocation info for local variables in function 'setjmp'
35 ;------------------------------------------------------------
36 ;buf                       Allocated to registers dptr b
37 ;------------------------------------------------------------
38 ;../../device/lib/_setjmp.c:180:int setjmp (jmp_buf buf)
39 ;       -----------------------------------------
40 ;        function setjmp
41 ;       -----------------------------------------
42         .globl _setjmp
43 _setjmp:
44         ar2 = 0x02
45         ar3 = 0x03
46         ar4 = 0x04
47         ar5 = 0x05
48         ar6 = 0x06
49         ar7 = 0x07
50         ar0 = 0x00
51         ar1 = 0x01
52 ;../../device/lib/_setjmp.c:183:*buf++ = bpx;
53 ;     genPointerSet
54 ;     genGenPointerSet
55         mov     a,_bpx
56         lcall   __gptrput
57         inc     dptr
58 ;../../device/lib/_setjmp.c:184:*buf++ = spx;
59 ;     genPointerSet
60 ;     genGenPointerSet
61         mov     a,_spx
62         lcall   __gptrput
63         inc     dptr
64 ;../../device/lib/_setjmp.c:185:*buf++ = bp;
65 ;     genPointerSet
66 ;     genGenPointerSet
67         mov     a,_bp
68         lcall   __gptrput
69         inc     dptr
70 ;../../device/lib/_setjmp.c:186:*buf++ = SP;
71 ;     genPointerSet
72 ;     genGenPointerSet
73         mov     a,sp
74         lcall   __gptrput
75         inc     dptr
76 ;../../device/lib/_setjmp.c:187:*buf++ = *((unsigned char __data *) SP  );
77 ;     genCast
78 ;     genPointerGet
79 ;     genNearPointerGet
80 ;     genPointerSet
81 ;     genGenPointerSet
82         mov     r0,sp
83         mov     a,@r0
84         lcall   __gptrput
85         inc     dptr
86 ;../../device/lib/_setjmp.c:188:*buf   = *((unsigned char __data *)SP - 1);
87 ;     genCast
88 ;     genMinus
89 ;     genMinusDec
90 ;       peephole 177.g  optimized mov sequence
91         dec     r0
92 ;     genPointerGet
93 ;     genNearPointerGet
94         mov     a,@r0
95 ;     genPointerSet
96 ;     genGenPointerSet
97         lcall   __gptrput
98 ;../../device/lib/_setjmp.c:189:return 0;
99 ;     genRet
100         mov     dptr,#0x0000
101         ret
102
103 ;------------------------------------------------------------
104 ;Allocation info for local variables in function 'longjmp'
105 ;------------------------------------------------------------
106 ;rv                        Allocated to stack - offset -2
107 ;buf                       Allocated to registers dptr b
108 ;lsp                       Allocated to registers r5
109 ;------------------------------------------------------------
110 ;../../device/lib/_setjmp.c:192:int longjmp (jmp_buf buf, int rv)
111 ;       -----------------------------------------
112 ;        function longjmp
113 ;       -----------------------------------------
114         .globl _longjmp
115 _longjmp:
116 ;     genReceive
117         mov     r0,_spx
118         dec     r0
119         movx    a,@r0
120         mov     r2,a
121         dec     r0
122         movx    a,@r0
123         mov     r3,a
124 ;../../device/lib/_setjmp.c:193:bpx = *buf++;
125 ;     genPointerGet
126 ;     genGenPointerGet
127         lcall   __gptrget
128         mov     _bpx,a
129         inc     dptr
130 ;../../device/lib/_setjmp.c:194:spx = *buf++;
131 ;     genPointerGet
132 ;     genGenPointerGet
133         lcall   __gptrget
134         mov     _spx,a
135         inc     dptr
136 ;../../device/lib/_setjmp.c:195:bp = *buf++;
137 ;     genPointerGet
138 ;     genGenPointerGet
139         lcall   __gptrget
140         mov     _bp,a
141         inc     dptr
142 ;../../device/lib/_setjmp.c:196:lsp = *buf++;
143 ;     genPointerGet
144 ;     genGenPointerGet
145         lcall   __gptrget
146         inc     dptr
147 ;     genAssign
148         mov     r5,a
149 ;../../device/lib/_setjmp.c:197:*((unsigned char __data *) lsp) = *buf++;
150 ;     genCast
151         mov     r0,a
152 ;     genPointerGet
153 ;     genGenPointerGet
154         lcall   __gptrget
155         inc     dptr
156 ;     genPointerSet
157 ;     genNearPointerSet
158         mov     @r0,a
159 ;../../device/lib/_setjmp.c:198:*((unsigned char __data *) lsp - 1) = *buf;
160 ;     genMinus
161 ;     genMinusDec
162         dec     r0
163 ;     genPointerGet
164 ;     genGenPointerGet
165         lcall   __gptrget
166 ;     genPointerSet
167 ;     genNearPointerSet
168         mov     @r0,a
169 ;../../device/lib/_setjmp.c:199:SP = lsp;
170 ;     genAssign
171         mov     sp,r5
172 ;../../device/lib/_setjmp.c:200:return rv;
173 ;     genAssign
174         mov     dph,r2
175         mov     dpl,r3
176 ;     genRet
177         ret
178
179         __endasm;
180 }
181
182 #elif defined(SDCC_STACK_AUTO)
183
184 static void dummy (void) __naked
185 {
186         __asm
187
188 ;------------------------------------------------------------
189 ;Allocation info for local variables in function 'setjmp'
190 ;------------------------------------------------------------
191 ;buf                       Allocated to registers dptr b
192 ;------------------------------------------------------------
193 ;../../device/lib/_setjmp.c:122:int setjmp (unsigned char *buf)
194 ;       -----------------------------------------
195 ;        function setjmp
196 ;       -----------------------------------------
197         .globl _setjmp
198 _setjmp:
199         ar2 = 0x02
200         ar3 = 0x03
201         ar4 = 0x04
202         ar5 = 0x05
203         ar6 = 0x06
204         ar7 = 0x07
205         ar0 = 0x00
206         ar1 = 0x01
207 ;     genReceive
208 ;../../device/lib/_setjmp.c:125:*buf   = BP;
209 ;     genPointerSet
210 ;     genGenPointerSet
211         mov     a,_bp
212         lcall   __gptrput
213         inc     dptr
214 ;../../device/lib/_setjmp.c:126:*buf   = SP;
215 ;     genPointerSet
216 ;     genGenPointerSet
217         mov     a,sp
218         lcall   __gptrput
219         inc     dptr
220 ;../../device/lib/_setjmp.c:127:*buf++ = *((unsigned char __data *) SP  );
221 ;     genCast
222         mov     r0,sp
223 ;     genPointerGet
224 ;     genNearPointerGet
225         mov     a,@r0
226 ;     genPointerSet
227 ;     genGenPointerSet
228         lcall   __gptrput
229         inc     dptr
230 ;../../device/lib/_setjmp.c:128:*buf++ = *((unsigned char __data *)SP - 1);
231 ;     genCast
232 ;     genMinus
233 ;     genMinusDec
234         dec     r0
235 ;     genPointerGet
236 ;     genNearPointerGet
237         mov     a,@r0
238 ;     genPointerSet
239 ;     genGenPointerSet
240         lcall   __gptrput
241 ;../../device/lib/_setjmp.c:129:return 0;
242 ;     genRet
243         mov     dptr,#0x0000
244         ret
245
246 ;------------------------------------------------------------
247 ;Allocation info for local variables in function 'longjmp'
248 ;------------------------------------------------------------
249 ;rv                        Allocated to stack - offset -3
250 ;buf                       Allocated to registers dptr b
251 ;lsp                       Allocated to registers r5
252 ;------------------------------------------------------------
253 ;../../device/lib/_setjmp.c:28:int longjmp (jmp_buf buf, int rv)
254 ;       -----------------------------------------
255 ;        function longjmp
256 ;       -----------------------------------------
257         .globl _longjmp
258 _longjmp:
259         ar2 = 0x02
260         ar3 = 0x03
261         ar4 = 0x04
262         ar5 = 0x05
263         ar6 = 0x06
264         ar7 = 0x07
265         ar0 = 0x00
266         ar1 = 0x01
267 ;     genReceive
268         mov     r0,sp
269         dec     r0
270         dec     r0
271         mov     ar2,@r0
272         dec     r0
273         mov     ar3,@r0
274 ;../../device/lib/_setjmp.c:30:bp = *buf++;
275 ;     genPointerGet
276 ;     genGenPointerGet
277         lcall   __gptrget
278         inc     dptr
279 ;     genAssign
280         mov     _bp,a
281 ;../../device/lib/_setjmp.c:31:lsp = *buf++;
282 ;     genPointerGet
283 ;     genGenPointerGet
284         lcall   __gptrget
285         inc     dptr
286 ;     genAssign
287         mov     r5,a
288 ;../../device/lib/_setjmp.c:32:*((unsigned char __data *) lsp) = *buf++;
289 ;     genCast
290         mov     r0,a
291 ;     genPointerGet
292 ;     genGenPointerGet
293         lcall   __gptrget
294         inc     dptr
295 ;     genPointerSet
296 ;     genNearPointerSet
297         mov     @r0,a
298 ;../../device/lib/_setjmp.c:33:*((unsigned char __data *) lsp - 1) = *buf;
299 ;     genCast
300 ;     genMinus
301 ;     genMinusDec
302         dec     r0
303 ;     genPointerGet
304 ;     genGenPointerGet
305         lcall   __gptrget
306 ;     genPointerSet
307 ;     genNearPointerSet
308         mov     @r0,a
309 ;../../device/lib/_setjmp.c:34:SP = lsp;
310 ;     genAssign
311         mov     sp,r5
312 ;../../device/lib/_setjmp.c:35:return rv;
313 ;     genRet
314         mov     dph,r2
315         mov     dpl,r3
316         ret
317
318         __endasm;
319 }
320
321 #else
322
323 //extern unsigned char __data bp;
324
325 int setjmp (jmp_buf buf)
326 {
327     /* registers would have been saved on the
328        stack anyway so we need to save SP
329        and the return address */
330 //    *buf++ = bp;
331     *buf++ = SP;
332     *buf++ = *((unsigned char __data *) SP  );
333     *buf   = *((unsigned char __data *)SP - 1);
334     return 0;
335 }
336
337 int longjmp (jmp_buf buf, int rv)
338 {
339     unsigned char lsp;
340 //    bp = *buf++;
341     lsp = *buf++;
342     *((unsigned char __data *) lsp) = *buf++;
343     *((unsigned char __data *) lsp - 1) = *buf;
344     SP = lsp;
345     return rv;
346 }
347
348 #endif