setjmp.s (2658B)
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 .module longjmp 30 31 .area _HOME 32 33 .globl ___setjmp 34 35___setjmp: 36 pop bc 37 pop de 38 push de 39 push bc 40 41 ; Store stack pointer. 42 ldhl sp, #0 43 push de 44 push hl 45 pop de 46 pop hl 47 ld (hl), e 48 inc hl 49 ld (hl), d 50 inc hl 51 52 ; Store return address. 53 ld (hl), c 54 inc hl 55 ld (hl), b 56 57 ; Return 0. 58 xor a, a 59 ld e, a 60 ld d, a 61 ret 62 63.globl _longjmp 64 65_longjmp: 66 pop af 67 pop hl 68 pop de 69 70 ; Ensure that return value is non-zero. 71 ld a, e 72 or a, d 73 jr NZ, 0001$ 74 inc de 750001$: 76 77 ; Get stack pointer. 78 ld c, (hl) 79 inc hl 80 ld b, (hl) 81 inc hl 82 83 ; Adjust stack pointer. 84 push hl 85 push bc 86 pop hl 87 pop bc 88 ld sp, hl 89 push bc 90 pop hl 91 92 ; Get return address. 93 ld c, (hl) 94 inc hl 95 ld b, (hl) 96 97 ; Set return address. 98 pop af 99 push bc 100 101 ; Return value is in de. 102 103 ; Jump. 104 ret 105