1 
2 // automatically generated by m4 from headers in proto subdir
3 
4 
5 #ifndef __IM2_H__
6 #define __IM2_H__
7 
8 #include <stdint.h>
9 
10 extern void im2_init(void *im2_table_address) __preserves_regs(b,c,d,e,iyl,iyh);
11 extern void im2_init_fastcall(void *im2_table_address) __preserves_regs(b,c,d,e,h,l,iyl,iyh) __z88dk_fastcall;
12 #define im2_init(a) im2_init_fastcall(a)
13 
14 
15 extern void *im2_install_isr(uint8_t vector,void *isr) __preserves_regs(b,c,iyl,iyh);
16 extern void *im2_install_isr_callee(uint8_t vector,void *isr) __preserves_regs(b,c,iyl,iyh) __z88dk_callee;
17 #define im2_install_isr(a,b) im2_install_isr_callee(a,b)
18 
19 
20 extern void *im2_create_generic_isr(uint8_t num_callbacks,void *address) __preserves_regs(iyl,iyh);
21 extern void *im2_create_generic_isr_callee(uint8_t num_callbacks,void *address) __preserves_regs(iyl,iyh) __z88dk_callee;
22 #define im2_create_generic_isr(a,b) im2_create_generic_isr_callee(a,b)
23 
24 
25 extern void *im2_create_generic_isr_8080(uint8_t num_callbacks,void *address) __preserves_regs(iyl,iyh);
26 extern void *im2_create_generic_isr_8080_callee(uint8_t num_callbacks,void *address) __preserves_regs(iyl,iyh) __z88dk_callee;
27 #define im2_create_generic_isr_8080(a,b) im2_create_generic_isr_8080_callee(a,b)
28 
29 
30 extern void im2_append_generic_callback(uint8_t vector,void *callback) __preserves_regs(iyl,iyh);
31 extern void im2_append_generic_callback_callee(uint8_t vector,void *callback) __preserves_regs(iyl,iyh) __z88dk_callee;
32 #define im2_append_generic_callback(a,b) im2_append_generic_callback_callee(a,b)
33 
34 
35 extern void im2_prepend_generic_callback(uint8_t vector,void *callback) __preserves_regs(iyl,iyh);
36 extern void im2_prepend_generic_callback_callee(uint8_t vector,void *callback) __preserves_regs(iyl,iyh) __z88dk_callee;
37 #define im2_prepend_generic_callback(a,b) im2_prepend_generic_callback_callee(a,b)
38 
39 
40 extern int im2_remove_generic_callback(uint8_t vector,void *callback) __preserves_regs(iyl,iyh);
41 extern int im2_remove_generic_callback_callee(uint8_t vector,void *callback) __preserves_regs(iyl,iyh) __z88dk_callee;
42 #define im2_remove_generic_callback(a,b) im2_remove_generic_callback_callee(a,b)
43 
44 
45 
46 #ifdef __CLANG
47 
48 #define IM2_DEFINE_ISR(name)       error clang does not support IM2_DEFINE_ISR;
49 #define IM2_DEFINE_ISR_8080(name)  error clang does not support IM2_DEFINE_ISR_8080;
50 
51 #endif
52 
53 #ifdef __SCCZ80
54 
55 #define IM2_DEFINE_ISR(name)  void name(void) \
56 { \
57 asm("\tEXTERN\tasm_im2_push_registers\n" \
58 "\tEXTERN\tasm_im2_pop_registers\n" \
59 "\n" \
60 "\tcall\tasm_im2_push_registers\n" \
61 "\tcall\t__im2_isr_" #name "\n" \
62 "\tcall\tasm_im2_pop_registers\n" \
63 "\n" \
64 "\tei\n" \
65 "\treti\n" \
66 ); \
67 } \
68 void _im2_isr_##name(void)
69 
70 #define IM2_DEFINE_ISR_8080(name)  void name(void) \
71 { \
72 asm("\tEXTERN\tasm_im2_push_registers_8080\n" \
73 "\tEXTERN\tasm_im2_pop_registers_8080\n" \
74 "\n" \
75 "\tcall\tasm_im2_push_registers_8080\n" \
76 "\tcall\t__im2_isr_8080_" #name "\n" \
77 "\tcall\tasm_im2_pop_registers_8080\n" \
78 "\n" \
79 "\tei\n" \
80 "\treti\n" \
81 ); \
82 } \
83 void _im2_isr_8080_##name(void)
84 
85 #if __SPECTRUM || __ZXNEXT
86 
87 #define IM2_DEFINE_ISR_WITH_BASIC(name)  void name(void) \
88 { \
89 asm("\tEXTERN\tasm_im2_push_registers\n" \
90 "\tEXTERN\tasm_im2_pop_registers\n" \
91 "\n" \
92 "\tcall\tasm_im2_push_registers\n" \
93 "\tcall\t__im2_isr_" #name "\n" \
94 "\tcall\tasm_im2_pop_registers\n" \
95 "\n" \
96 "\tpush iy\n" \
97 "\tld iy,0x5c3a\n" \
98 "\tcall 0x0038\n" \
99 "\tpop iy\n" \
100 "\treti\n" \
101 ); \
102 } \
103 void _im2_isr_##name(void)
104 
105 #endif
106 
107 #endif
108 
109 #ifdef __SDCC
110 
111 #define IM2_DEFINE_ISR(name)  void name(void) __naked \
112 { \
113 	__asm \
114 	EXTERN	asm_im2_push_registers \
115    EXTERN	asm_im2_pop_registers \
116 	\
117 	call	asm_im2_push_registers \
118 	call   __im2_isr_##name \
119 	call   asm_im2_pop_registers \
120 	\
121 	ei \
122 	reti \
123 	__endasm; \
124 } \
125 void _im2_isr_##name(void)
126 
127 #define IM2_DEFINE_ISR_8080(name)  void name(void) __critical __interrupt(0)
128 
129 #if __SPECTRUM || __ZXNEXT
130 
131 #define IM2_DEFINE_ISR_WITH_BASIC(name)  void name(void) __naked \
132 { \
133 	__asm \
134 	EXTERN	asm_im2_push_registers \
135 	EXTERN	asm_im2_pop_registers \
136 	\
137 	call	asm_im2_push_registers \
138 	call   __im2_isr_##name \
139 	call   asm_im2_pop_registers \
140 	\
141 	push iy \
142 	ld iy,0x5c3a \
143 	call 0x0038 \
144 	pop iy \
145 	ret \
146 	__endasm; \
147 } \
148 void _im2_isr_##name(void)
149 
150 #endif
151 
152 #endif
153 
154 
155 #endif
156