struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / device / lib / r800 / __sdcc_bcall.s
blob378bdc96c08a19ea2c848fb9d2953346ccbcd68a
1 ;--------------------------------------------------------------------------
2 ; __sdcc_bcall.s
4 ; Copyright (C) 2011, Maarten Brock, 2015-2021 Philipp Klaus Krause
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.
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.
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.
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 ;--------------------------------------------------------------------------
29 ; This file contains generic trampolines for banked function calls.
30 ; They are not complete. Programmer must provide set_bank and get_bank
31 ; routines. Or rewrite whole code completely.
33 .area _CODE
35 .globl ___sdcc_bcall
36 .globl ___sdcc_bcall_abc
37 .globl ___sdcc_bcall_ehl
39 ; trampoline to call banked functions
40 ; used when legacy banking is enabled only
41 ; Usage:
42 ; call ___sdcc_bcall
43 ; .dw <function>
44 ; .dw <function_bank>
46 ___sdcc_bcall::
47 ex (sp), hl
48 ld c, (hl)
49 inc hl
50 ld b, (hl)
51 inc hl
52 ld a, (hl)
53 inc hl
54 inc hl
55 ex (sp), hl
57 ; trampoline to call banked functions with __z88dk_fastcall calling convention
58 ; Usage:
59 ; ld a, #<function_bank>
60 ; ld bc, #<function>
61 ; call ___sdcc_bcall_abc
63 ___sdcc_bcall_abc::
64 push hl
65 ld l, a
66 call get_bank ;must return A as current bank number, other registers expected to be unchanged
67 ld h, a
68 ld a, l
69 ex (sp), hl
70 inc sp
71 call ___sdcc_bjump_abc
72 dec sp
73 pop af
74 jp set_bank
76 ___sdcc_bjump_abc:
77 call set_bank ;set current bank to A, other registers expected to be unchanged
78 push bc
79 ret
81 ; default trampoline to call banked functions
82 ; Usage:
83 ; ld e, #<function_bank>
84 ; ld hl, #<function>
85 ; call ___sdcc_bcall_ehl
87 ___sdcc_bcall_ehl::
88 call get_bank
89 push af
90 inc sp
91 call ___sdcc_bjump_ehl
92 dec sp
93 pop bc
94 push af
95 ld a, b
96 call set_bank
97 pop af
98 ret
100 ___sdcc_bjump_ehl:
101 ld a, e
102 call set_bank
103 jp (hl)