setjmp.s (2040B)
1;-------------------------------------------------------------------------- 2; setjmp.s 3; 4; Copyright (C) 2011-2014, Philipp Klaus Krause 5; 6; This library is free software; you can redistribute it and/or modify it 7; under the terms of the GNU 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 General Public License for more details. 15; 16; You should have received a copy of the GNU General Public License 17; along with this library; see the file COPYING. If not, write to the 18; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 19; MA 02110-1301, USA. 20; 21; As a special exception, if you link this library with other files, 22; some of which are compiled with SDCC, to produce an executable, 23; this library does not by itself cause the resulting executable to 24; be covered by the GNU General Public License. This exception does 25; not however invalidate any other reasons why the executable file 26; might be covered by the GNU General Public License. 27;-------------------------------------------------------------------------- 28 29 .area _CODE 30 31 .globl ___setjmp 32 33___setjmp: 34 pop hl 35 pop iy 36 push af 37 push hl 38 39 ; Store return address. 40 ld 0(iy), l 41 ld 1(iy), h 42 43 ; Store stack pointer. 44 xor a, a 45 ld l, a 46 ld h, a 47 add hl, sp 48 ld 2(iy), l 49 ld 3(iy), h 50 51 ; Store frame pointer. 52 push ix 53 pop hl 54 ld 4(iy), l 55 ld 5(iy), h 56 57 ; Return 0. 58 ld l, a 59 ld h, a 60 ret 61 62.globl _longjmp 63 64_longjmp: 65 pop af 66 pop iy 67 pop de 68 69 ; Ensure that return value is non-zero. 70 ld a, e 71 or a, d 72 jr NZ, jump 73 inc de 74jump: 75 76 ; Restore frame pointer. 77 ld l, 4(iy) 78 ld h, 5(iy) 79 push hl 80 pop ix 81 82 ; Adjust stack pointer. 83 ld l, 2(iy) 84 ld h, 3(iy) 85 ld sp, hl 86 pop hl 87 88 ; Move return value into hl. 89 ex de, hl 90 91 ; Jump. 92 ld c, 0(iy) 93 ld b, 1(iy) 94 push bc 95 ret