1 // DGen/SDL v1.23+ 2 #ifndef RC_H_ 3 #define RC_H_ 4 5 #include <stddef.h> 6 #include <stdio.h> 7 #include <stdint.h> 8 9 // Define the different craptv types 10 #define NUM_CTV 5 // Include CTV_OFF 11 #define NUM_SCALING 7 12 #define CTV_OFF 0 13 #define CTV_BLUR 1 14 #define CTV_SCANLINE 2 15 #define CTV_INTERLACE 3 16 #define CTV_SWAB 4 17 18 // Define OR masks for key modifiers 19 #define KEYSYM_MOD_ALT 0x40000000 20 #define KEYSYM_MOD_SHIFT 0x20000000 21 #define KEYSYM_MOD_CTRL 0x10000000 22 #define KEYSYM_MOD_META 0x08000000 23 #define KEYSYM_MOD_MASK 0x78000000 24 25 // Macros to manage joystick buttons. 26 // 27 // Integer format (32b): 000000tt iiiiiiii aaaaaaaa bbbbbbbb 28 // 29 // t: type (0-3): 30 // 0 if not configured/invalid. 31 // 1 for a normal button, "a" is ignored, "b" is the button index. 32 // 2 for an axis, "a" is the axis index, "b" is the axis direction. 33 // 3 for a hat, "a" is the hat index, "b" is the hat direction. 34 // i: system identifier for joystick/joypad (0-255). 35 // a: axis or hat index (0-255). 36 // b: button number (0-255), axis direction (0 if negative, 128 if between, 37 // 255 if positive), or hat direction (0 = center, 1 = up, 2 = right, 38 // 3 = down, 4 = left). 39 #define JS_AXIS_NEGATIVE 0x00 40 #define JS_AXIS_BETWEEN 0x80 41 #define JS_AXIS_POSITIVE 0xff 42 43 #define JS_HAT_CENTERED 0 44 #define JS_HAT_UP 1 45 #define JS_HAT_RIGHT 2 46 #define JS_HAT_DOWN 3 47 #define JS_HAT_LEFT 4 48 49 #define JS_TYPE_BUTTON 0x01 50 #define JS_TYPE_AXIS 0x02 51 #define JS_TYPE_HAT 0x03 52 53 #define JS_MAKE_IDENTIFIER(i) (((i) & 0xff) << 16) 54 #define JS_MAKE_BUTTON(b) \ 55 ((JS_TYPE_BUTTON << 24) | ((b) & 0xff)) 56 #define JS_MAKE_AXIS(a, d) \ 57 ((JS_TYPE_AXIS << 24) | (((a) & 0xff) << 8) | ((d) & 0xff)) 58 #define JS_MAKE_HAT(h, d) \ 59 ((JS_TYPE_HAT << 24) | (((h) & 0xff) << 8) | ((d) & 0xff)) 60 61 #define JS_GET_IDENTIFIER(v) (((v) >> 16) & 0xff) 62 #define JS_IS_BUTTON(v) ((((v) >> 24) & 0xff) == JS_TYPE_BUTTON) 63 #define JS_IS_AXIS(v) ((((v) >> 24) & 0xff) == JS_TYPE_AXIS) 64 #define JS_IS_HAT(v) ((((v) >> 24) & 0xff) == JS_TYPE_HAT) 65 #define JS_GET_BUTTON(v) ((v) & 0xff) 66 #define JS_GET_AXIS(v) (((v) >> 8) & 0xff) 67 #define JS_GET_AXIS_DIR(v) JS_GET_BUTTON(v) 68 #define JS_GET_HAT(v) JS_GET_AXIS(v) 69 #define JS_GET_HAT_DIR(v) JS_GET_BUTTON(v) 70 71 #define JS_BUTTON(id, button) \ 72 (JS_MAKE_IDENTIFIER(id) | \ 73 JS_MAKE_BUTTON(button)) 74 #define JS_AXIS(id, axis, direction) \ 75 (JS_MAKE_IDENTIFIER(id) | \ 76 JS_MAKE_AXIS((axis), (direction))) 77 #define JS_HAT(id, hat, direction) \ 78 (JS_MAKE_IDENTIFIER(id) | \ 79 JS_MAKE_HAT((hat), (direction))) 80 81 // Macros to manage mouse events. 82 // 83 // Integer format (32b): 000000tt iiiiiiii 00000000 aaaaaaaa 84 // 85 // t: type (0-3): 86 // 0 if not configured/invalid. 87 // 1 for a button, "a" is the button index. 88 // 2 for a motion, "a" is the direction. 89 // i: system identifier for mouse (0-255). 90 // a: button number (0-255), motion direction ('u', 'd', 'l' and 'r' for "up", 91 // "down", "left" and "right"). 92 #define MO_TYPE_BUTTON JS_TYPE_BUTTON 93 #define MO_TYPE_MOTION JS_TYPE_AXIS 94 95 #define MO_GET_IDENTIFIER(v) JS_GET_IDENTIFIER(v) 96 #define MO_IS_BUTTON(v) JS_IS_BUTTON(v) 97 #define MO_IS_MOTION(v) JS_IS_AXIS(v) 98 #define MO_GET_BUTTON(v) JS_GET_BUTTON(v) 99 #define MO_GET_MOTION(v) MO_GET_BUTTON(v) 100 101 #define MO_BUTTON(id, button) JS_BUTTON(id, button) 102 #define MO_MOTION(id, direction) JS_AXIS(id, 0, direction) 103 104 // All the CTV engine names, in string form for the RC and message bar 105 extern const char *ctv_names[]; 106 107 // Scaling algorithms names 108 extern const char *scaling_names[]; 109 110 // CPU names 111 extern const char *emu_z80_names[]; 112 extern const char *emu_m68k_names[]; 113 114 // Provide a prototype to the parse_rc function in rc.cpp 115 extern void parse_rc(FILE *file, const char *name); 116 117 extern char *dump_keysym(intptr_t k); 118 extern char *dump_joypad(intptr_t k); 119 extern char *dump_mouse(intptr_t k); 120 extern void dump_rc(FILE *file); 121 122 extern intptr_t rc_number(const char *value, intptr_t *); 123 extern intptr_t rc_keysym(const char *code, intptr_t *); 124 extern intptr_t rc_boolean(const char *value, intptr_t *); 125 extern intptr_t rc_joypad(const char *desc, intptr_t *); 126 extern intptr_t rc_mouse(const char *desc, intptr_t *); 127 extern intptr_t rc_ctv(const char *value, intptr_t *); 128 extern intptr_t rc_scaling(const char *value, intptr_t *); 129 extern intptr_t rc_emu_z80(const char *value, intptr_t *); 130 extern intptr_t rc_emu_m68k(const char *value, intptr_t *); 131 extern intptr_t rc_region(const char *value, intptr_t *); 132 extern intptr_t rc_string(const char *value, intptr_t *); 133 extern intptr_t rc_rom_path(const char *value, intptr_t *); 134 extern intptr_t rc_bind(const char *value, intptr_t *variable); 135 extern intptr_t rc_soundrate(const char *value, intptr_t *); 136 137 extern struct rc_str *rc_str_list; 138 extern void rc_str_cleanup(void); 139 140 struct rc_field { 141 const char *fieldname; 142 intptr_t (*parser)(const char *, intptr_t *); 143 intptr_t *variable; 144 }; 145 146 #define RC_BIND_PREFIX "bind_" 147 #define RC_BIND_ITEMS 8 148 149 enum rc_binding_type { 150 RCBK, // Keysym. 151 RCBJ, // Joypad. 152 RCBM, // Mouse. 153 RCB_NUM 154 }; 155 156 struct rc_binding_item { 157 unsigned int assigned:1; // Whether item contains valid data. 158 enum rc_binding_type type:4; // See enum rc_binding_type. 159 intptr_t code; // keysym, joypad or mouse code. 160 }; 161 162 struct rc_binding { 163 struct rc_binding *prev; 164 struct rc_binding *next; 165 struct rc_binding_item item[RC_BIND_ITEMS]; 166 char *rc; // RC name for this binding. 167 // struct rc_field.variable points to the following member. 168 char *to; // Related action. 169 // Internal storage, don't touch. 170 // char rc[]; 171 }; 172 173 #define RC_FIELDS_SIZE 1024 174 175 extern struct rc_field rc_fields[RC_FIELDS_SIZE]; 176 extern struct rc_binding rc_binding_head; 177 178 extern struct rc_field *rc_binding_add(const char *rc, const char *to); 179 extern void rc_binding_del(struct rc_field *rcf); 180 181 struct rc_keysym { 182 const char *name; 183 long keysym; 184 }; 185 186 extern struct rc_keysym rc_keysyms[]; 187 188 #endif // RC_H_ 189