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