cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

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