1 /*
2  * ============================================================================
3  *  Title:    Event binding tables.
4  *  Author:   J. Zbiciak, R. Reynolds (GP2X)
5  * ============================================================================
6  *  These tables specify the bindable events and the default bindings.
7  * ============================================================================
8  */
9 
10 #include "config.h"
11 #include "lzoe/lzoe.h"
12 #include "file/file.h"
13 #include "periph/periph.h"
14 #include "cp1600/cp1600.h"
15 #include "cp1600/emu_link.h"
16 #include "mem/mem.h"
17 #include "ecs/ecs.h"
18 #include "bincfg/bincfg.h"
19 #include "bincfg/legacy.h"
20 #include "icart/icart.h"
21 #include "pads/pads.h"
22 #include "pads/pads_cgc.h"
23 #include "pads/pads_intv2pc.h"
24 #include "avi/avi.h"
25 #include "gfx/gfx.h"
26 #include "gfx/palette.h"
27 #include "snd/snd.h"
28 #include "ay8910/ay8910.h"
29 #include "demo/demo.h"
30 #include "stic/stic.h"
31 #include "ivoice/ivoice.h"
32 #include "speed/speed.h"
33 #include "debug/debug_.h"
34 #include "event/event.h"
35 #include "joy/joy.h"
36 #include "serializer/serializer.h"
37 #include "jlp/jlp.h"
38 #include "locutus/locutus_adapt.h"
39 #include "cheat/cheat.h"
40 #include "mapping.h"
41 #include "cfg.h"
42 #include <errno.h>
43 
44 
45 #define W(word) ((uint32_t*)&intv.word)
46 
47 /* ------------------------------------------------------------------------ */
48 /*  jzIntv internal event action table.  Keyboard and joystick inputs may   */
49 /*  be bound to any of these actions.  This table also ties the actions     */
50 /*  to the actual bits that the event action fiddles with.                  */
51 /*                                                                          */
52 /*  Notes on mnemonics:                                                     */
53 /*      PD0L        Left controller pad on base unit.                       */
54 /*      PD0R        Right controller pad on base unit.                      */
55 /*      PD1L        Left controller pad on ECS unit.                        */
56 /*      PD1R        Right controller pad on ECS unit.                       */
57 /*      PDxx_KP     Left Key Pad                                            */
58 /*      PDxx_A      Left Action Button  ([T]op, [L]eft, [R]ight)            */
59 /*      PDxx_D      Right Disc                                              */
60 /*      N, NE, etc  Compass directions.                                     */
61 /*                                                                          */
62 /*  The bit patterns at the right are AND and OR masks.  The first two      */
63 /*  are the AND masks for release/press.  The second two are OR masks       */
64 /*  for release/press.                                                      */
65 /* ------------------------------------------------------------------------ */
66 cfg_evtact_t  cfg_event_action[] =
67 {
68     /* -------------------------------------------------------------------- */
69     /*  Miscellaneous.                                                      */
70     /* -------------------------------------------------------------------- */
71     { "QUIT",       W(do_exit           ),  { 1,   1,  },   { 1,   1   } },
72     { "RESET",      W(do_reset          ),  { 0,   ~0U },   { 0,   ~0U } },
73     { "DUMP",       W(do_dump           ),  { ~0U, 0   },   { 0,   1   } },
74     { "LOAD",       W(do_load           ),  { ~0U, 0   },   { 0,   1   } },
75     { "RELOAD",     W(do_reload         ),  { ~0U, 0   },   { 0,   1   } },
76     { "MOVIE",      W(gfx.scrshot       ),  { ~0U, ~0U },   { GFX_MVTOG, 0} },
77     { "AVI",        W(gfx.scrshot       ),  { ~0U, ~0U },   { GFX_AVTOG, 0} },
78     { "SHOT",       W(gfx.scrshot       ),  { ~0U, ~0U },   { GFX_SHOT,  0} },
79     { "GRAMSHOT",   W(stic.debug_flags  ),  { ~0U, ~0U },   { STIC_GRAMSHOT,0}},
80     { "HIDE",       W(gfx.hidden        ),  { 0,   1   },   { 0,   1   } },
81     { "WTOG",       W(gfx.toggle        ),  { 0,   0   },   { GFX_WIND_TOG,0}},
82     { "WINDOW",     W(gfx.toggle        ),  { 0,   0   },   { GFX_WIND_ON, 0}},
83     { "FULLSC",     W(gfx.toggle        ),  { 0,   0   },   { GFX_WIND_OFF,0}},
84     { "BREAK",      W(debug.step_count  ),  { ~0U, 0   },   { 0,   0   } },
85     { "VOLUP",      W(snd.change_vol    ),  { ~0U, 0   },   { 0,   1   } },
86     { "VOLDN",      W(snd.change_vol    ),  { ~0U, 0   },   { 0,   2   } },
87     { "NA",         NULL,                   { 0,   0   },   { 0,   0   } },
88 
89     /* -------------------------------------------------------------------- */
90     /*  A rich set of pause actions, so we can tie them to things such as   */
91     /*  a window gaining/losing focus, or getting hidden/unhidden.          */
92     /* -------------------------------------------------------------------- */
93     { "PAUSE",      W(do_pause),  { ~0U, 0   },   { 0,         PAUSE_TOG } },
94     { "PAUSE_ON",   W(do_pause),  { ~0U, 0   },   { 0,         PAUSE_ON  } },
95     { "PAUSE_OFF",  W(do_pause),  { ~0U, 0   },   { 0,         PAUSE_OFF } },
96     { "PAUSE_HOLD", W(do_pause),  { 0,   0   },   { PAUSE_OFF, PAUSE_ON  } },
97 
98     /* -------------------------------------------------------------------- */
99     /*  Input map selection.                                                */
100     /* -------------------------------------------------------------------- */
101 #   define CHG_EVT_MAP(name, push, pop)                         \
102         {                                                       \
103             name, W(chg_evt_map),                               \
104             { EV_MAP_##pop == EV_MAP_NOP ? ~0U : 0, 0 },        \
105             { EV_MAP_##pop, EV_MAP_##push }                     \
106         }
107 
108     CHG_EVT_MAP("KBD0",    SET_0, NOP),
109     CHG_EVT_MAP("KBD1",    SET_1, NOP),
110     CHG_EVT_MAP("KBD2",    SET_2, NOP),
111     CHG_EVT_MAP("KBD3",    SET_3, NOP),
112     CHG_EVT_MAP("KBDn",    NEXT,  NOP),
113     CHG_EVT_MAP("KBDp",    PREV,  NOP),
114 
115     CHG_EVT_MAP("SETMAP0", SET_0, NOP),
116     CHG_EVT_MAP("SETMAP1", SET_1, NOP),
117     CHG_EVT_MAP("SETMAP2", SET_2, NOP),
118     CHG_EVT_MAP("SETMAP3", SET_3, NOP),
119     CHG_EVT_MAP("NEXTMAP", NEXT,  NOP),
120     CHG_EVT_MAP("PREVMAP", PREV,  NOP),
121 
122     CHG_EVT_MAP("SHF10",   SET_1, SET_0),
123     CHG_EVT_MAP("SHF20",   SET_2, SET_0),
124     CHG_EVT_MAP("SHF30",   SET_3, SET_0),
125     CHG_EVT_MAP("SHF01",   SET_0, SET_1),
126     CHG_EVT_MAP("SHF21",   SET_2, SET_1),
127     CHG_EVT_MAP("SHF31",   SET_3, SET_1),
128     CHG_EVT_MAP("SHF02",   SET_0, SET_2),
129     CHG_EVT_MAP("SHF12",   SET_1, SET_2),
130     CHG_EVT_MAP("SHF32",   SET_3, SET_2),
131     CHG_EVT_MAP("SHF03",   SET_0, SET_3),
132     CHG_EVT_MAP("SHF13",   SET_1, SET_3),
133     CHG_EVT_MAP("SHF23",   SET_2, SET_3),
134 
135     CHG_EVT_MAP("PSH0",    PSH_0, POP),
136     CHG_EVT_MAP("PSH1",    PSH_1, POP),
137     CHG_EVT_MAP("PSH2",    PSH_2, POP),
138     CHG_EVT_MAP("PSH3",    PSH_3, POP),
139 
140     CHG_EVT_MAP("POP",     POP,   NOP),
141     CHG_EVT_MAP("POP_UP",  NOP,   POP),  /* Pop on release */
142 
143 #   undef CHG_EVT_MAP
144 
145     /* -------------------------------------------------------------------- */
146     /*  Cheat events.                                                       */
147     /* -------------------------------------------------------------------- */
148     { "CHEAT0",     W(cheat.request),       { ~0U, ~0U },   { 0x01, 0  } },
149     { "CHEAT1",     W(cheat.request),       { ~0U, ~0U },   { 0x02, 0  } },
150     { "CHEAT2",     W(cheat.request),       { ~0U, ~0U },   { 0x04, 0  } },
151     { "CHEAT3",     W(cheat.request),       { ~0U, ~0U },   { 0x08, 0  } },
152     { "CHEAT4",     W(cheat.request),       { ~0U, ~0U },   { 0x10, 0  } },
153     { "CHEAT5",     W(cheat.request),       { ~0U, ~0U },   { 0x20, 0  } },
154     { "CHEAT6",     W(cheat.request),       { ~0U, ~0U },   { 0x40, 0  } },
155     { "CHEAT7",     W(cheat.request),       { ~0U, ~0U },   { 0x80, 0  } },
156 
157     /* -------------------------------------------------------------------- */
158     /*  PAD0: Left-hand controller keypad                                   */
159     /* -------------------------------------------------------------------- */
160     { "PD0L_KP1",   W(pad0.l[1]         ),  { 0,    ~0U  }, { 0,    0x81 } },
161     { "PD0L_KP2",   W(pad0.l[2]         ),  { 0,    ~0U  }, { 0,    0x41 } },
162     { "PD0L_KP3",   W(pad0.l[3]         ),  { 0,    ~0U  }, { 0,    0x21 } },
163     { "PD0L_KP4",   W(pad0.l[4]         ),  { 0,    ~0U  }, { 0,    0x82 } },
164     { "PD0L_KP5",   W(pad0.l[5]         ),  { 0,    ~0U  }, { 0,    0x42 } },
165     { "PD0L_KP6",   W(pad0.l[6]         ),  { 0,    ~0U  }, { 0,    0x22 } },
166     { "PD0L_KP7",   W(pad0.l[7]         ),  { 0,    ~0U  }, { 0,    0x84 } },
167     { "PD0L_KP8",   W(pad0.l[8]         ),  { 0,    ~0U  }, { 0,    0x44 } },
168     { "PD0L_KP9",   W(pad0.l[9]         ),  { 0,    ~0U  }, { 0,    0x24 } },
169     { "PD0L_KPC",   W(pad0.l[10]        ),  { 0,    ~0U  }, { 0,    0x88 } },
170     { "PD0L_KP0",   W(pad0.l[0]         ),  { 0,    ~0U  }, { 0,    0x48 } },
171     { "PD0L_KPE",   W(pad0.l[11]        ),  { 0,    ~0U  }, { 0,    0x28 } },
172 
173     /* -------------------------------------------------------------------- */
174     /*  PAD0: Right-hand controller keypad                                  */
175     /* -------------------------------------------------------------------- */
176     { "PD0R_KP1",   W(pad0.r[1]         ),  { 0,    ~0U  }, { 0,    0x81 } },
177     { "PD0R_KP2",   W(pad0.r[2]         ),  { 0,    ~0U  }, { 0,    0x41 } },
178     { "PD0R_KP3",   W(pad0.r[3]         ),  { 0,    ~0U  }, { 0,    0x21 } },
179     { "PD0R_KP4",   W(pad0.r[4]         ),  { 0,    ~0U  }, { 0,    0x82 } },
180     { "PD0R_KP5",   W(pad0.r[5]         ),  { 0,    ~0U  }, { 0,    0x42 } },
181     { "PD0R_KP6",   W(pad0.r[6]         ),  { 0,    ~0U  }, { 0,    0x22 } },
182     { "PD0R_KP7",   W(pad0.r[7]         ),  { 0,    ~0U  }, { 0,    0x84 } },
183     { "PD0R_KP8",   W(pad0.r[8]         ),  { 0,    ~0U  }, { 0,    0x44 } },
184     { "PD0R_KP9",   W(pad0.r[9]         ),  { 0,    ~0U  }, { 0,    0x24 } },
185     { "PD0R_KPC",   W(pad0.r[10]        ),  { 0,    ~0U  }, { 0,    0x88 } },
186     { "PD0R_KP0",   W(pad0.r[0]         ),  { 0,    ~0U  }, { 0,    0x48 } },
187     { "PD0R_KPE",   W(pad0.r[11]        ),  { 0,    ~0U  }, { 0,    0x28 } },
188 
189     /* -------------------------------------------------------------------- */
190     /*  PAD0: Action buttons.                                               */
191     /* -------------------------------------------------------------------- */
192     { "PD0L_A_T",   W(pad0.l[12]        ), { 0,    ~0U  }, { 0,    0xA0 } },
193     { "PD0L_A_L",   W(pad0.l[13]        ), { 0,    ~0U  }, { 0,    0x60 } },
194     { "PD0L_A_R",   W(pad0.l[14]        ), { 0,    ~0U  }, { 0,    0xC0 } },
195 
196     { "PD0R_A_T",   W(pad0.r[12]        ), { 0,    ~0U  }, { 0,    0xA0 } },
197     { "PD0R_A_L",   W(pad0.r[13]        ), { 0,    ~0U  }, { 0,    0x60 } },
198     { "PD0R_A_R",   W(pad0.r[14]        ), { 0,    ~0U  }, { 0,    0xC0 } },
199 
200     /* -------------------------------------------------------------------- */
201     /*  PAD0: The Controller DISC via Keyboard etc.                         */
202     /* -------------------------------------------------------------------- */
203     { "PD0L_D_E",   W(pad0.l[15]        ), { ~1,   ~0U  }, { 0,    1  } },
204     { "PD0L_D_ENE", W(pad0.l[15]        ), { ~3,   ~0U  }, { 0,    3  } },
205     { "PD0L_D_NE",  W(pad0.l[15]        ), { ~2,   ~0U  }, { 0,    2  } },
206     { "PD0L_D_NNE", W(pad0.l[15]        ), { ~6,   ~0U  }, { 0,    6  } },
207     { "PD0L_D_N",   W(pad0.l[15]        ), { ~4,   ~0U  }, { 0,    4  } },
208     { "PD0L_D_NNW", W(pad0.l[15]        ), { ~12,  ~0U  }, { 0,    12 } },
209     { "PD0L_D_NW",  W(pad0.l[15]        ), { ~8,   ~0U  }, { 0,    8  } },
210     { "PD0L_D_WNW", W(pad0.l[15]        ), { ~24,  ~0U  }, { 0,    24 } },
211     { "PD0L_D_W",   W(pad0.l[15]        ), { ~16,  ~0U  }, { 0,    16 } },
212     { "PD0L_D_WSW", W(pad0.l[15]        ), { ~48,  ~0U  }, { 0,    48 } },
213     { "PD0L_D_SW",  W(pad0.l[15]        ), { ~32,  ~0U  }, { 0,    32 } },
214     { "PD0L_D_SSW", W(pad0.l[15]        ), { ~96,  ~0U  }, { 0,    96 } },
215     { "PD0L_D_S",   W(pad0.l[15]        ), { ~64,  ~0U  }, { 0,    64 } },
216     { "PD0L_D_SSE", W(pad0.l[15]        ), { ~192, ~0U  }, { 0,    192} },
217     { "PD0L_D_SE",  W(pad0.l[15]        ), { ~128, ~0U  }, { 0,    128} },
218     { "PD0L_D_ESE", W(pad0.l[15]        ), { ~129, ~0U  }, { 0,    129} },
219 
220     { "PD0R_D_E",   W(pad0.r[15]        ), { ~1,   ~0U  }, { 0,    1  } },
221     { "PD0R_D_ENE", W(pad0.r[15]        ), { ~3,   ~0U  }, { 0,    3  } },
222     { "PD0R_D_NE",  W(pad0.r[15]        ), { ~2,   ~0U  }, { 0,    2  } },
223     { "PD0R_D_NNE", W(pad0.r[15]        ), { ~6,   ~0U  }, { 0,    6  } },
224     { "PD0R_D_N",   W(pad0.r[15]        ), { ~4,   ~0U  }, { 0,    4  } },
225     { "PD0R_D_NNW", W(pad0.r[15]        ), { ~12,  ~0U  }, { 0,    12 } },
226     { "PD0R_D_NW",  W(pad0.r[15]        ), { ~8,   ~0U  }, { 0,    8  } },
227     { "PD0R_D_WNW", W(pad0.r[15]        ), { ~24,  ~0U  }, { 0,    24 } },
228     { "PD0R_D_W",   W(pad0.r[15]        ), { ~16,  ~0U  }, { 0,    16 } },
229     { "PD0R_D_WSW", W(pad0.r[15]        ), { ~48,  ~0U  }, { 0,    48 } },
230     { "PD0R_D_SW",  W(pad0.r[15]        ), { ~32,  ~0U  }, { 0,    32 } },
231     { "PD0R_D_SSW", W(pad0.r[15]        ), { ~96,  ~0U  }, { 0,    96 } },
232     { "PD0R_D_S",   W(pad0.r[15]        ), { ~64,  ~0U  }, { 0,    64 } },
233     { "PD0R_D_SSE", W(pad0.r[15]        ), { ~192, ~0U  }, { 0,    192} },
234     { "PD0R_D_SE",  W(pad0.r[15]        ), { ~128, ~0U  }, { 0,    128} },
235     { "PD0R_D_ESE", W(pad0.r[15]        ), { ~129, ~0U  }, { 0,    129} },
236 
237     /* -------------------------------------------------------------------- */
238     /*  PAD0: The Controller DISC via Joystick                              */
239     /* -------------------------------------------------------------------- */
240     { "PD0L_J_E",   W(pad0.l[16]        ), { 0,    0    }, { 0,    1   }},
241     { "PD0L_J_ENE", W(pad0.l[16]        ), { 0,    0    }, { 0,    3   }},
242     { "PD0L_J_NE",  W(pad0.l[16]        ), { 0,    0    }, { 0,    2   }},
243     { "PD0L_J_NNE", W(pad0.l[16]        ), { 0,    0    }, { 0,    6   }},
244     { "PD0L_J_N",   W(pad0.l[16]        ), { 0,    0    }, { 0,    4   }},
245     { "PD0L_J_NNW", W(pad0.l[16]        ), { 0,    0    }, { 0,    12  }},
246     { "PD0L_J_NW",  W(pad0.l[16]        ), { 0,    0    }, { 0,    8   }},
247     { "PD0L_J_WNW", W(pad0.l[16]        ), { 0,    0    }, { 0,    24  }},
248     { "PD0L_J_W",   W(pad0.l[16]        ), { 0,    0    }, { 0,    16  }},
249     { "PD0L_J_WSW", W(pad0.l[16]        ), { 0,    0    }, { 0,    48  }},
250     { "PD0L_J_SW",  W(pad0.l[16]        ), { 0,    0    }, { 0,    32  }},
251     { "PD0L_J_SSW", W(pad0.l[16]        ), { 0,    0    }, { 0,    96  }},
252     { "PD0L_J_S",   W(pad0.l[16]        ), { 0,    0    }, { 0,    64  }},
253     { "PD0L_J_SSE", W(pad0.l[16]        ), { 0,    0    }, { 0,    192 }},
254     { "PD0L_J_SE",  W(pad0.l[16]        ), { 0,    0    }, { 0,    128 }},
255     { "PD0L_J_ESE", W(pad0.l[16]        ), { 0,    0    }, { 0,    129 }},
256 
257     { "PD0R_J_E",   W(pad0.r[16]        ), { 0,    0    }, { 0,    1   }},
258     { "PD0R_J_ENE", W(pad0.r[16]        ), { 0,    0    }, { 0,    3   }},
259     { "PD0R_J_NE",  W(pad0.r[16]        ), { 0,    0    }, { 0,    2   }},
260     { "PD0R_J_NNE", W(pad0.r[16]        ), { 0,    0    }, { 0,    6   }},
261     { "PD0R_J_N",   W(pad0.r[16]        ), { 0,    0    }, { 0,    4   }},
262     { "PD0R_J_NNW", W(pad0.r[16]        ), { 0,    0    }, { 0,    12  }},
263     { "PD0R_J_NW",  W(pad0.r[16]        ), { 0,    0    }, { 0,    8   }},
264     { "PD0R_J_WNW", W(pad0.r[16]        ), { 0,    0    }, { 0,    24  }},
265     { "PD0R_J_W",   W(pad0.r[16]        ), { 0,    0    }, { 0,    16  }},
266     { "PD0R_J_WSW", W(pad0.r[16]        ), { 0,    0    }, { 0,    48  }},
267     { "PD0R_J_SW",  W(pad0.r[16]        ), { 0,    0    }, { 0,    32  }},
268     { "PD0R_J_SSW", W(pad0.r[16]        ), { 0,    0    }, { 0,    96  }},
269     { "PD0R_J_S",   W(pad0.r[16]        ), { 0,    0    }, { 0,    64  }},
270     { "PD0R_J_SSE", W(pad0.r[16]        ), { 0,    0    }, { 0,    192 }},
271     { "PD0R_J_SE",  W(pad0.r[16]        ), { 0,    0    }, { 0,    128 }},
272     { "PD0R_J_ESE", W(pad0.r[16]        ), { 0,    0    }, { 0,    129 }},
273 
274     /* -------------------------------------------------------------------- */
275     /*  PAD0 "Raw" bit-level input bits for left and right.                 */
276     /* -------------------------------------------------------------------- */
277     { "PD0L_BIT_0", W(pad0.l[17]        ), { ~0x01, ~0U  }, { 0,   0x01 } },
278     { "PD0L_BIT_1", W(pad0.l[17]        ), { ~0x02, ~0U  }, { 0,   0x02 } },
279     { "PD0L_BIT_2", W(pad0.l[17]        ), { ~0x04, ~0U  }, { 0,   0x04 } },
280     { "PD0L_BIT_3", W(pad0.l[17]        ), { ~0x08, ~0U  }, { 0,   0x08 } },
281     { "PD0L_BIT_4", W(pad0.l[17]        ), { ~0x10, ~0U  }, { 0,   0x10 } },
282     { "PD0L_BIT_5", W(pad0.l[17]        ), { ~0x20, ~0U  }, { 0,   0x20 } },
283     { "PD0L_BIT_6", W(pad0.l[17]        ), { ~0x40, ~0U  }, { 0,   0x40 } },
284     { "PD0L_BIT_7", W(pad0.l[17]        ), { ~0x80, ~0U  }, { 0,   0x80 } },
285 
286     { "PD0R_BIT_0", W(pad0.r[17]        ), { ~0x01, ~0U  }, { 0,   0x01 } },
287     { "PD0R_BIT_1", W(pad0.r[17]        ), { ~0x02, ~0U  }, { 0,   0x02 } },
288     { "PD0R_BIT_2", W(pad0.r[17]        ), { ~0x04, ~0U  }, { 0,   0x04 } },
289     { "PD0R_BIT_3", W(pad0.r[17]        ), { ~0x08, ~0U  }, { 0,   0x08 } },
290     { "PD0R_BIT_4", W(pad0.r[17]        ), { ~0x10, ~0U  }, { 0,   0x10 } },
291     { "PD0R_BIT_5", W(pad0.r[17]        ), { ~0x20, ~0U  }, { 0,   0x20 } },
292     { "PD0R_BIT_6", W(pad0.r[17]        ), { ~0x40, ~0U  }, { 0,   0x40 } },
293     { "PD0R_BIT_7", W(pad0.r[17]        ), { ~0x80, ~0U  }, { 0,   0x80 } },
294 
295     /* -------------------------------------------------------------------- */
296     /*  PAD1: Left-hand controller keypad                                   */
297     /* -------------------------------------------------------------------- */
298     { "PD1L_KP1",   W(pad1.l[1]         ),  { 0,    ~0U  }, { 0,    0x81 } },
299     { "PD1L_KP2",   W(pad1.l[2]         ),  { 0,    ~0U  }, { 0,    0x41 } },
300     { "PD1L_KP3",   W(pad1.l[3]         ),  { 0,    ~0U  }, { 0,    0x21 } },
301     { "PD1L_KP4",   W(pad1.l[4]         ),  { 0,    ~0U  }, { 0,    0x82 } },
302     { "PD1L_KP5",   W(pad1.l[5]         ),  { 0,    ~0U  }, { 0,    0x42 } },
303     { "PD1L_KP6",   W(pad1.l[6]         ),  { 0,    ~0U  }, { 0,    0x22 } },
304     { "PD1L_KP7",   W(pad1.l[7]         ),  { 0,    ~0U  }, { 0,    0x84 } },
305     { "PD1L_KP8",   W(pad1.l[8]         ),  { 0,    ~0U  }, { 0,    0x44 } },
306     { "PD1L_KP9",   W(pad1.l[9]         ),  { 0,    ~0U  }, { 0,    0x24 } },
307     { "PD1L_KPC",   W(pad1.l[10]        ),  { 0,    ~0U  }, { 0,    0x88 } },
308     { "PD1L_KP0",   W(pad1.l[0]         ),  { 0,    ~0U  }, { 0,    0x48 } },
309     { "PD1L_KPE",   W(pad1.l[11]        ),  { 0,    ~0U  }, { 0,    0x28 } },
310 
311     /* -------------------------------------------------------------------- */
312     /*  PAD1: Right-hand controller keypad                                  */
313     /* -------------------------------------------------------------------- */
314     { "PD1R_KP1",   W(pad1.r[1]         ),  { 0,    ~0U  }, { 0,    0x81 } },
315     { "PD1R_KP2",   W(pad1.r[2]         ),  { 0,    ~0U  }, { 0,    0x41 } },
316     { "PD1R_KP3",   W(pad1.r[3]         ),  { 0,    ~0U  }, { 0,    0x21 } },
317     { "PD1R_KP4",   W(pad1.r[4]         ),  { 0,    ~0U  }, { 0,    0x82 } },
318     { "PD1R_KP5",   W(pad1.r[5]         ),  { 0,    ~0U  }, { 0,    0x42 } },
319     { "PD1R_KP6",   W(pad1.r[6]         ),  { 0,    ~0U  }, { 0,    0x22 } },
320     { "PD1R_KP7",   W(pad1.r[7]         ),  { 0,    ~0U  }, { 0,    0x84 } },
321     { "PD1R_KP8",   W(pad1.r[8]         ),  { 0,    ~0U  }, { 0,    0x44 } },
322     { "PD1R_KP9",   W(pad1.r[9]         ),  { 0,    ~0U  }, { 0,    0x24 } },
323     { "PD1R_KPC",   W(pad1.r[10]        ),  { 0,    ~0U  }, { 0,    0x88 } },
324     { "PD1R_KP0",   W(pad1.r[0]         ),  { 0,    ~0U  }, { 0,    0x48 } },
325     { "PD1R_KPE",   W(pad1.r[11]        ),  { 0,    ~0U  }, { 0,    0x28 } },
326 
327     /* -------------------------------------------------------------------- */
328     /*  PAD1: Action buttons.                                               */
329     /* -------------------------------------------------------------------- */
330     { "PD1L_A_T",   W(pad1.l[12]        ), { 0,    ~0U  }, { 0,    0xA0 } },
331     { "PD1L_A_L",   W(pad1.l[13]        ), { 0,    ~0U  }, { 0,    0x60 } },
332     { "PD1L_A_R",   W(pad1.l[14]        ), { 0,    ~0U  }, { 0,    0xC0 } },
333 
334     { "PD1R_A_T",   W(pad1.r[12]        ), { 0,    ~0U  }, { 0,    0xA0 } },
335     { "PD1R_A_L",   W(pad1.r[13]        ), { 0,    ~0U  }, { 0,    0x60 } },
336     { "PD1R_A_R",   W(pad1.r[14]        ), { 0,    ~0U  }, { 0,    0xC0 } },
337 
338     /* -------------------------------------------------------------------- */
339     /*  PAD1: The Controller DISC.                                          */
340     /* -------------------------------------------------------------------- */
341     { "PD1L_D_E",   W(pad1.l[15]        ), { ~1,   ~0U  }, { 0,    1  } },
342     { "PD1L_D_NE",  W(pad1.l[15]        ), { ~2,   ~0U  }, { 0,    2  } },
343     { "PD1L_D_N",   W(pad1.l[15]        ), { ~4,   ~0U  }, { 0,    4  } },
344     { "PD1L_D_NW",  W(pad1.l[15]        ), { ~8,   ~0U  }, { 0,    8  } },
345     { "PD1L_D_W",   W(pad1.l[15]        ), { ~16,  ~0U  }, { 0,    16 } },
346     { "PD1L_D_SW",  W(pad1.l[15]        ), { ~32,  ~0U  }, { 0,    32 } },
347     { "PD1L_D_S",   W(pad1.l[15]        ), { ~64,  ~0U  }, { 0,    64 } },
348     { "PD1L_D_SE",  W(pad1.l[15]        ), { ~128, ~0U  }, { 0,    128} },
349 
350     { "PD1R_D_E",   W(pad1.r[15]        ), { ~1,   ~0U  }, { 0,    1  } },
351     { "PD1R_D_NE",  W(pad1.r[15]        ), { ~2,   ~0U  }, { 0,    2  } },
352     { "PD1R_D_N",   W(pad1.r[15]        ), { ~4,   ~0U  }, { 0,    4  } },
353     { "PD1R_D_NW",  W(pad1.r[15]        ), { ~8,   ~0U  }, { 0,    8  } },
354     { "PD1R_D_W",   W(pad1.r[15]        ), { ~16,  ~0U  }, { 0,    16 } },
355     { "PD1R_D_SW",  W(pad1.r[15]        ), { ~32,  ~0U  }, { 0,    32 } },
356     { "PD1R_D_S",   W(pad1.r[15]        ), { ~64,  ~0U  }, { 0,    64 } },
357     { "PD1R_D_SE",  W(pad1.r[15]        ), { ~128, ~0U  }, { 0,    128} },
358 
359     /* -------------------------------------------------------------------- */
360     /*  PAD1: The Controller DISC via Joystick                              */
361     /* -------------------------------------------------------------------- */
362     { "PD1L_J_E",   W(pad1.l[16]        ), { 0,    0    }, { 0,    1   }},
363     { "PD1L_J_ENE", W(pad1.l[16]        ), { 0,    0    }, { 0,    3   }},
364     { "PD1L_J_NE",  W(pad1.l[16]        ), { 0,    0    }, { 0,    2   }},
365     { "PD1L_J_NNE", W(pad1.l[16]        ), { 0,    0    }, { 0,    6   }},
366     { "PD1L_J_N",   W(pad1.l[16]        ), { 0,    0    }, { 0,    4   }},
367     { "PD1L_J_NNW", W(pad1.l[16]        ), { 0,    0    }, { 0,    12  }},
368     { "PD1L_J_NW",  W(pad1.l[16]        ), { 0,    0    }, { 0,    8   }},
369     { "PD1L_J_WNW", W(pad1.l[16]        ), { 0,    0    }, { 0,    24  }},
370     { "PD1L_J_W",   W(pad1.l[16]        ), { 0,    0    }, { 0,    16  }},
371     { "PD1L_J_WSW", W(pad1.l[16]        ), { 0,    0    }, { 0,    48  }},
372     { "PD1L_J_SW",  W(pad1.l[16]        ), { 0,    0    }, { 0,    32  }},
373     { "PD1L_J_SSW", W(pad1.l[16]        ), { 0,    0    }, { 0,    96  }},
374     { "PD1L_J_S",   W(pad1.l[16]        ), { 0,    0    }, { 0,    64  }},
375     { "PD1L_J_SSE", W(pad1.l[16]        ), { 0,    0    }, { 0,    192 }},
376     { "PD1L_J_SE",  W(pad1.l[16]        ), { 0,    0    }, { 0,    128 }},
377     { "PD1L_J_ESE", W(pad1.l[16]        ), { 0,    0    }, { 0,    129 }},
378 
379     { "PD1R_J_E",   W(pad1.r[16]        ), { 0,    0    }, { 0,    1   }},
380     { "PD1R_J_ENE", W(pad1.r[16]        ), { 0,    0    }, { 0,    3   }},
381     { "PD1R_J_NE",  W(pad1.r[16]        ), { 0,    0    }, { 0,    2   }},
382     { "PD1R_J_NNE", W(pad1.r[16]        ), { 0,    0    }, { 0,    6   }},
383     { "PD1R_J_N",   W(pad1.r[16]        ), { 0,    0    }, { 0,    4   }},
384     { "PD1R_J_NNW", W(pad1.r[16]        ), { 0,    0    }, { 0,    12  }},
385     { "PD1R_J_NW",  W(pad1.r[16]        ), { 0,    0    }, { 0,    8   }},
386     { "PD1R_J_WNW", W(pad1.r[16]        ), { 0,    0    }, { 0,    24  }},
387     { "PD1R_J_W",   W(pad1.r[16]        ), { 0,    0    }, { 0,    16  }},
388     { "PD1R_J_WSW", W(pad1.r[16]        ), { 0,    0    }, { 0,    48  }},
389     { "PD1R_J_SW",  W(pad1.r[16]        ), { 0,    0    }, { 0,    32  }},
390     { "PD1R_J_SSW", W(pad1.r[16]        ), { 0,    0    }, { 0,    96  }},
391     { "PD1R_J_S",   W(pad1.r[16]        ), { 0,    0    }, { 0,    64  }},
392     { "PD1R_J_SSE", W(pad1.r[16]        ), { 0,    0    }, { 0,    192 }},
393     { "PD1R_J_SE",  W(pad1.r[16]        ), { 0,    0    }, { 0,    128 }},
394     { "PD1R_J_ESE", W(pad1.r[16]        ), { 0,    0    }, { 0,    129 }},
395 
396     /* -------------------------------------------------------------------- */
397     /*  PAD1 "Raw" bit-level input bits for left and right.                 */
398     /* -------------------------------------------------------------------- */
399     { "PD1L_BIT_0", W(pad1.l[17]        ), { ~0x01, ~0U  }, { 0,   0x01 } },
400     { "PD1L_BIT_1", W(pad1.l[17]        ), { ~0x02, ~0U  }, { 0,   0x02 } },
401     { "PD1L_BIT_2", W(pad1.l[17]        ), { ~0x04, ~0U  }, { 0,   0x04 } },
402     { "PD1L_BIT_3", W(pad1.l[17]        ), { ~0x08, ~0U  }, { 0,   0x08 } },
403     { "PD1L_BIT_4", W(pad1.l[17]        ), { ~0x10, ~0U  }, { 0,   0x10 } },
404     { "PD1L_BIT_5", W(pad1.l[17]        ), { ~0x20, ~0U  }, { 0,   0x20 } },
405     { "PD1L_BIT_6", W(pad1.l[17]        ), { ~0x40, ~0U  }, { 0,   0x40 } },
406     { "PD1L_BIT_7", W(pad1.l[17]        ), { ~0x80, ~0U  }, { 0,   0x80 } },
407 
408     { "PD1R_BIT_0", W(pad1.r[17]        ), { ~0x01, ~0U  }, { 0,   0x01 } },
409     { "PD1R_BIT_1", W(pad1.r[17]        ), { ~0x02, ~0U  }, { 0,   0x02 } },
410     { "PD1R_BIT_2", W(pad1.r[17]        ), { ~0x04, ~0U  }, { 0,   0x04 } },
411     { "PD1R_BIT_3", W(pad1.r[17]        ), { ~0x08, ~0U  }, { 0,   0x08 } },
412     { "PD1R_BIT_4", W(pad1.r[17]        ), { ~0x10, ~0U  }, { 0,   0x10 } },
413     { "PD1R_BIT_5", W(pad1.r[17]        ), { ~0x20, ~0U  }, { 0,   0x20 } },
414     { "PD1R_BIT_6", W(pad1.r[17]        ), { ~0x40, ~0U  }, { 0,   0x40 } },
415     { "PD1R_BIT_7", W(pad1.r[17]        ), { ~0x80, ~0U  }, { 0,   0x80 } },
416 
417     /*
418 00FFh|                  00FEh bits
419 bits |   0       1    2  3  4    5        6      7
420 -----+------------------------------------------------
421   0  | left,   comma, n, v, x, space,   [n/a], [n/a]
422   1  | period, m,     b, c, z, down,    [n/a], [n/a]
423   2  | scolon, k,     h, f, s, up,      [n/a], [n/a]
424   3  | p,      i,     y, r, w, q,       [n/a], [n/a]
425   4  | esc,    9,     7, 5, 3, 1,       [n/a], [n/a]
426   5  | 0,      8,     6, 4, 2, right,   [n/a], [n/a]
427   6  | enter,  o,     u, t, e, ctl,     [n/a], [n/a]
428   7  | [n/a],  l,     j, g, d, a,       shift, [n/a]
429   */
430 
431     /* -------------------------------------------------------------------- */
432     /*  ECS Keyboard                                                        */
433     /* -------------------------------------------------------------------- */
434 
435     /* bit 0 */
436     { "KEYB_LEFT",  W(pad1.k[ 0]        ), { ~  1, ~0U  }, { 0,      1} },
437     { "KEYB_PERIOD",W(pad1.k[ 0]        ), { ~  2, ~0U  }, { 0,      2} },
438     { "KEYB_SEMI",  W(pad1.k[ 0]        ), { ~  4, ~0U  }, { 0,      4} },
439     { "KEYB_P",     W(pad1.k[ 0]        ), { ~  8, ~0U  }, { 0,      8} },
440     { "KEYB_ESC",   W(pad1.k[ 0]        ), { ~ 16, ~0U  }, { 0,     16} },
441     { "KEYB_0",     W(pad1.k[ 0]        ), { ~ 32, ~0U  }, { 0,     32} },
442     { "KEYB_ENTER", W(pad1.k[ 0]        ), { ~ 64, ~0U  }, { 0,     64} },
443 
444     /* bit 1 */
445     { "KEYB_COMMA", W(pad1.k[ 1]        ), { ~  1, ~0U  }, { 0,      1} },
446     { "KEYB_M",     W(pad1.k[ 1]        ), { ~  2, ~0U  }, { 0,      2} },
447     { "KEYB_K",     W(pad1.k[ 1]        ), { ~  4, ~0U  }, { 0,      4} },
448     { "KEYB_I",     W(pad1.k[ 1]        ), { ~  8, ~0U  }, { 0,      8} },
449     { "KEYB_9",     W(pad1.k[ 1]        ), { ~ 16, ~0U  }, { 0,     16} },
450     { "KEYB_8",     W(pad1.k[ 1]        ), { ~ 32, ~0U  }, { 0,     32} },
451     { "KEYB_O",     W(pad1.k[ 1]        ), { ~ 64, ~0U  }, { 0,     64} },
452     { "KEYB_L",     W(pad1.k[ 1]        ), { ~128, ~0U  }, { 0,    128} },
453 
454     /* bit 2 */
455     { "KEYB_N",     W(pad1.k[ 2]        ), { ~  1, ~0U  }, { 0,      1} },
456     { "KEYB_B",     W(pad1.k[ 2]        ), { ~  2, ~0U  }, { 0,      2} },
457     { "KEYB_H",     W(pad1.k[ 2]        ), { ~  4, ~0U  }, { 0,      4} },
458     { "KEYB_Y",     W(pad1.k[ 2]        ), { ~  8, ~0U  }, { 0,      8} },
459     { "KEYB_7",     W(pad1.k[ 2]        ), { ~ 16, ~0U  }, { 0,     16} },
460     { "KEYB_6",     W(pad1.k[ 2]        ), { ~ 32, ~0U  }, { 0,     32} },
461     { "KEYB_U",     W(pad1.k[ 2]        ), { ~ 64, ~0U  }, { 0,     64} },
462     { "KEYB_J",     W(pad1.k[ 2]        ), { ~128, ~0U  }, { 0,    128} },
463 
464     /* bit 3 */
465     { "KEYB_V",     W(pad1.k[ 3]        ), { ~  1, ~0U  }, { 0,      1} },
466     { "KEYB_C",     W(pad1.k[ 3]        ), { ~  2, ~0U  }, { 0,      2} },
467     { "KEYB_F",     W(pad1.k[ 3]        ), { ~  4, ~0U  }, { 0,      4} },
468     { "KEYB_R",     W(pad1.k[ 3]        ), { ~  8, ~0U  }, { 0,      8} },
469     { "KEYB_5",     W(pad1.k[ 3]        ), { ~ 16, ~0U  }, { 0,     16} },
470     { "KEYB_4",     W(pad1.k[ 3]        ), { ~ 32, ~0U  }, { 0,     32} },
471     { "KEYB_T",     W(pad1.k[ 3]        ), { ~ 64, ~0U  }, { 0,     64} },
472     { "KEYB_G",     W(pad1.k[ 3]        ), { ~128, ~0U  }, { 0,    128} },
473 
474     /* bit 4 */
475     { "KEYB_X",     W(pad1.k[ 4]        ), { ~  1, ~0U  }, { 0,      1} },
476     { "KEYB_Z",     W(pad1.k[ 4]        ), { ~  2, ~0U  }, { 0,      2} },
477     { "KEYB_S",     W(pad1.k[ 4]        ), { ~  4, ~0U  }, { 0,      4} },
478     { "KEYB_W",     W(pad1.k[ 4]        ), { ~  8, ~0U  }, { 0,      8} },
479     { "KEYB_3",     W(pad1.k[ 4]        ), { ~ 16, ~0U  }, { 0,     16} },
480     { "KEYB_2",     W(pad1.k[ 4]        ), { ~ 32, ~0U  }, { 0,     32} },
481     { "KEYB_E",     W(pad1.k[ 4]        ), { ~ 64, ~0U  }, { 0,     64} },
482     { "KEYB_D",     W(pad1.k[ 4]        ), { ~128, ~0U  }, { 0,    128} },
483 
484     /* bit 5 */
485     { "KEYB_SPACE", W(pad1.k[ 5]        ), { ~  1, ~0U  }, { 0,      1} },
486     { "KEYB_DOWN",  W(pad1.k[ 5]        ), { ~  2, ~0U  }, { 0,      2} },
487     { "KEYB_UP",    W(pad1.k[ 5]        ), { ~  4, ~0U  }, { 0,      4} },
488     { "KEYB_Q",     W(pad1.k[ 5]        ), { ~  8, ~0U  }, { 0,      8} },
489     { "KEYB_1",     W(pad1.k[ 5]        ), { ~ 16, ~0U  }, { 0,     16} },
490     { "KEYB_RIGHT", W(pad1.k[ 5]        ), { ~ 32, ~0U  }, { 0,     32} },
491     { "KEYB_CTRL",  W(pad1.k[ 5]        ), { ~ 64, ~0U  }, { 0,     64} },
492     { "KEYB_A",     W(pad1.k[ 5]        ), { ~128, ~0U  }, { 0,    128} },
493 
494     /* bit 6 */
495     { "KEYB_SHIFT", W(pad1.k[ 6]        ), { ~128, ~0U  }, { 0,    128} },
496 
497     /* -------------------------------------------------------------------- */
498     /*  ECS Keyboard "Shifted" Keys.                                        */
499     /* -------------------------------------------------------------------- */
500     { "KEYB_EQUAL", W(pad1.k[ 5]), { ~( 16 << 8), ~0U  }, { 0, (16 << 8)} },
501     { "KEYB_QUOTE", W(pad1.k[ 4]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
502     { "KEYB_HASH",  W(pad1.k[ 4]), { ~( 16 << 8), ~0U  }, { 0, (16 << 8)} },
503     { "KEYB_DOLLAR",W(pad1.k[ 3]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
504     { "KEYB_PLUS",  W(pad1.k[ 3]), { ~( 16 << 8), ~0U  }, { 0, (16 << 8)} },
505     { "KEYB_MINUS", W(pad1.k[ 2]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
506     { "KEYB_SLASH", W(pad1.k[ 2]), { ~( 16 << 8), ~0U  }, { 0, (16 << 8)} },
507     { "KEYB_STAR",  W(pad1.k[ 1]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
508     { "KEYB_LPAREN",W(pad1.k[ 1]), { ~( 16 << 8), ~0U  }, { 0, (16 << 8)} },
509     { "KEYB_RPAREN",W(pad1.k[ 0]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
510     { "KEYB_CARET", W(pad1.k[ 5]), { ~(  4 << 8), ~0U  }, { 0, ( 4 << 8)} },
511     { "KEYB_QUEST", W(pad1.k[ 5]), { ~(  2 << 8), ~0U  }, { 0, ( 2 << 8)} },
512     { "KEYB_PCT",   W(pad1.k[ 0]), { ~(  1 << 8), ~0U  }, { 0, ( 1 << 8)} },
513     { "KEYB_SQUOTE",W(pad1.k[ 5]), { ~( 32 << 8), ~0U  }, { 0, (32 << 8)} },
514     { "KEYB_COLON", W(pad1.k[ 0]), { ~(  4 << 8), ~0U  }, { 0, ( 4 << 8)} },
515     { "KEYB_GREATER",W(pad1.k[0]), { ~(  2 << 8), ~0U  }, { 0, ( 2 << 8)} },
516     { "KEYB_LESS",  W(pad1.k[ 1]), { ~(  1 << 8), ~0U  }, { 0, ( 1 << 8)} },
517 
518     /* -------------------------------------------------------------------- */
519     /*  Synthesizer keyboard bindings.                                      */
520     /* -------------------------------------------------------------------- */
521     { "SYNTH_00",   W(pad1.k[ 0]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
522     { "SYNTH_01",   W(pad1.k[ 0]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
523     { "SYNTH_02",   W(pad1.k[ 0]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
524     { "SYNTH_03",   W(pad1.k[ 0]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
525     { "SYNTH_04",   W(pad1.k[ 0]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
526     { "SYNTH_05",   W(pad1.k[ 0]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
527     { "SYNTH_06",   W(pad1.k[ 0]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
528     { "SYNTH_07",   W(pad1.k[ 0]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
529     { "SYNTH_08",   W(pad1.k[ 1]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
530     { "SYNTH_09",   W(pad1.k[ 1]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
531     { "SYNTH_10",   W(pad1.k[ 1]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
532     { "SYNTH_11",   W(pad1.k[ 1]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
533     { "SYNTH_12",   W(pad1.k[ 1]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
534     { "SYNTH_13",   W(pad1.k[ 1]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
535     { "SYNTH_14",   W(pad1.k[ 1]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
536     { "SYNTH_15",   W(pad1.k[ 1]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
537     { "SYNTH_16",   W(pad1.k[ 2]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
538     { "SYNTH_17",   W(pad1.k[ 2]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
539     { "SYNTH_18",   W(pad1.k[ 2]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
540     { "SYNTH_19",   W(pad1.k[ 2]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
541     { "SYNTH_20",   W(pad1.k[ 2]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
542     { "SYNTH_21",   W(pad1.k[ 2]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
543     { "SYNTH_22",   W(pad1.k[ 2]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
544     { "SYNTH_23",   W(pad1.k[ 2]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
545     { "SYNTH_24",   W(pad1.k[ 3]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
546     { "SYNTH_25",   W(pad1.k[ 3]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
547     { "SYNTH_26",   W(pad1.k[ 3]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
548     { "SYNTH_27",   W(pad1.k[ 3]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
549     { "SYNTH_28",   W(pad1.k[ 3]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
550     { "SYNTH_29",   W(pad1.k[ 3]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
551     { "SYNTH_30",   W(pad1.k[ 3]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
552     { "SYNTH_31",   W(pad1.k[ 3]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
553     { "SYNTH_32",   W(pad1.k[ 4]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
554     { "SYNTH_33",   W(pad1.k[ 4]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
555     { "SYNTH_34",   W(pad1.k[ 4]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
556     { "SYNTH_35",   W(pad1.k[ 4]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
557     { "SYNTH_36",   W(pad1.k[ 4]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
558     { "SYNTH_37",   W(pad1.k[ 4]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
559     { "SYNTH_38",   W(pad1.k[ 4]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
560     { "SYNTH_39",   W(pad1.k[ 4]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
561     { "SYNTH_40",   W(pad1.k[ 5]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
562     { "SYNTH_41",   W(pad1.k[ 5]), { ~(  2 << 16), ~0U  }, { 0, (  2 << 16)} },
563     { "SYNTH_42",   W(pad1.k[ 5]), { ~(  4 << 16), ~0U  }, { 0, (  4 << 16)} },
564     { "SYNTH_43",   W(pad1.k[ 5]), { ~(  8 << 16), ~0U  }, { 0, (  8 << 16)} },
565     { "SYNTH_44",   W(pad1.k[ 5]), { ~( 16 << 16), ~0U  }, { 0, ( 16 << 16)} },
566     { "SYNTH_45",   W(pad1.k[ 5]), { ~( 32 << 16), ~0U  }, { 0, ( 32 << 16)} },
567     { "SYNTH_46",   W(pad1.k[ 5]), { ~( 64 << 16), ~0U  }, { 0, ( 64 << 16)} },
568     { "SYNTH_47",   W(pad1.k[ 5]), { ~(128 << 16), ~0U  }, { 0, (128 << 16)} },
569     { "SYNTH_48",   W(pad1.k[ 6]), { ~(  1 << 16), ~0U  }, { 0, (  1 << 16)} },
570 
571      /* Press 1+9 on controller 0 on the master component */
572     { "IPAUSE0",    W(pad0.l[1]         ),  { 0,    ~0U  }, { 0,    0xA5 } },
573 
574     /* Press 1+9 on controller 1 on the master component */
575     { "IPAUSE1",    W(pad0.r[1]         ),  { 0,    ~0U  }, { 0,    0xA5 } },
576 
577 };
578 
579 int cfg_event_action_cnt = (int)(sizeof(cfg_event_action)/sizeof(cfg_evtact_t));
580 
581 /* ------------------------------------------------------------------------ */
582 /*  Default key bindings table.                                             */
583 /*                                                                          */
584 /*  I really need to make sure there are rows in here for all possible      */
585 /*  key inputs, so that when I process a config file, I can just update     */
586 /*  this table directly.  Otherwise, I need to duplicate this table in      */
587 /*  order to change it.                                                     */
588 /*                                                                          */
589 /*  Column 1 is the default "primarily 1 player" setup.                     */
590 /*  Column 2 is the alternate "primarily 2 player" setup.                   */
591 /*  Column 3 is the ECS Keyboard setup.                                     */
592 /*  Column 4 is the Meta/Win/Cmd-key modified setup.                        */
593 /* ------------------------------------------------------------------------ */
594 
595 cfg_kbd_t  cfg_key_bind[] =
596 {
597 /* ------------------------------------------------------------------------ */
598 /*  Miscellaneous.                                                          */
599 /* ------------------------------------------------------------------------ */
600 { "QUIT",   {   "QUIT",         "QUIT",         "QUIT",         "QUIT"      }},
601 { "F1",     {   "QUIT",         "QUIT",         "QUIT",         "QUIT"      }},
602 { "ESCAPE", {   "NA",           "NA",           "KEYB_ESC",     "NA"        }},
603 #ifdef PLAT_MACOS
604 { "F3",     {   "WTOG",         "WTOG",         "WTOG",         "WTOG"      }},
605 { "LCMD",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
606 { "RCMD",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
607 { "LGUI",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
608 { "RGUI",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
609 #else
610 { "F9",     {   "WTOG",         "WTOG",         "WTOG",         "WTOG"      }},
611 #endif
612 #ifdef WIN32
613 { "LWIN",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
614 { "RWIN",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
615 { "LGUI",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
616 { "RGUI",   {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
617 #endif
618 { "F10",    {   "MOVIE",        "MOVIE",        "MOVIE",        "MOVIE"     }},
619 { "F11",    {   "SHOT",         "SHOT",         "SHOT",         "SHOT"      }},
620 { "F12",    {   "RESET",        "RESET",        "RESET",        "RESET"     }},
621 { "HIDE",   {   "HIDE",         "HIDE",         "HIDE",         "HIDE"      }},
622 //{ "F2",     {   "HIDE",         "HIDE",         "HIDE",         "HIDE"      }},
623 //{ "F2",     {   "DUMP",         "DUMP",         "DUMP",         "DUMP"      }},
624 //{ "F3",     {   "LOAD",         "LOAD",         "LOAD",         "LOAD"      }},
625 { "F4",     {   "BREAK",        "BREAK",        "BREAK",        "BREAK"     }},
626 { "F5",     {   "KBD0",         "KBD0",         "KBD0",         "KBD0"      }},
627 { "F6",     {   "KBD1",         "KBD1",         "KBD1",         "KBD1"      }},
628 { "F7",     {   "KBD2",         "KBD2",         "KBD2",         "KBD2"      }},
629 /*{ "F8",   {   "KBD3",         "KBD3",         "KBD3",         "KBD3"      }},*/
630 { "PAUSE",  {   "PAUSE",        "PAUSE",        "PAUSE",        "PAUSE"     }},
631 { "PAGEUP", {   "VOLUP",        "VOLUP",        "VOLUP",        "VOLUP"     }},
632 { "PAGEDOWN",{  "VOLDN",        "VOLDN",        "VOLDN",        "VOLDN"     }},
633 { "F8",     {   "PSH3",         "PSH3",         "PSH3",         "POP_UP"    }},
634 
635 { "FOCUS_LOST", /* Force windowed mode if we lose focus. */
636             {   "WINDOW",       "WINDOW",       "WINDOW",       "WINDOW"    }},
637 
638 /* ------------------------------------------------------------------------ */
639 /*  The numeric keypad.                                                     */
640 /* ------------------------------------------------------------------------ */
641 { "KP_7",   {   "PD0L_KP1",     "PD0L_KP1",     "KEYB_1",       "NA"        }},
642 { "KP_8",   {   "PD0L_KP2",     "PD0L_KP2",     "KEYB_2",       "NA"        }},
643 { "KP_9",   {   "PD0L_KP3",     "PD0L_KP3",     "KEYB_3",       "NA"        }},
644 { "KP_4",   {   "PD0L_KP4",     "PD0L_KP4",     "KEYB_4",       "NA"        }},
645 { "KP_5",   {   "PD0L_KP5",     "PD0L_KP5",     "KEYB_5",       "NA"        }},
646 { "KP_6",   {   "PD0L_KP6",     "PD0L_KP6",     "KEYB_6",       "NA"        }},
647 { "KP_1",   {   "PD0L_KP7",     "PD0L_KP7",     "KEYB_7",       "NA"        }},
648 { "KP_2",   {   "PD0L_KP8",     "PD0L_KP8",     "KEYB_8",       "NA"        }},
649 { "KP_3",   {   "PD0L_KP9",     "PD0L_KP9",     "KEYB_9",       "NA"        }},
650 { "KP_0",   {   "PD0L_KPC",     "PD0L_KPC",     "KEYB_0",       "NA"        }},
651 { "KP_PERIOD",{ "PD0L_KP0",     "PD0L_KP0",     "KEYB_PERIOD",  "NA"        }},
652 { "KP_ENTER", { "PD0L_KPE",     "PD0L_KPE",     "KEYB_ENTER",   "NA"        }},
653 
654 /* ------------------------------------------------------------------------ */
655 /*  The number keys.                                                        */
656 /* ------------------------------------------------------------------------ */
657 { "1",      {   "PD0R_KP1",     "PD0L_KP1",     "KEYB_1",       "NA"        }},
658 { "2",      {   "PD0R_KP2",     "PD0L_KP2",     "KEYB_2",       "NA"        }},
659 { "3",      {   "PD0R_KP3",     "PD0L_KP3",     "KEYB_3",       "NA"        }},
660 { "4",      {   "PD0R_KP4",     "PD0L_KP4",     "KEYB_4",       "NA"        }},
661 { "5",      {   "PD0R_KP5",     "PD0L_KP5",     "KEYB_5",       "NA"        }},
662 { "6",      {   "PD0R_KP6",     "PD0L_KP6",     "KEYB_6",       "NA"        }},
663 { "7",      {   "PD0R_KP7",     "PD0L_KP7",     "KEYB_7",       "NA"        }},
664 { "8",      {   "PD0R_KP8",     "PD0L_KP8",     "KEYB_8",       "NA"        }},
665 { "9",      {   "PD0R_KP9",     "PD0L_KP9",     "KEYB_9",       "NA"        }},
666 { "-",      {   "PD0R_KPC",     "PD0L_KPC",     "KEYB_MINUS",   "NA"        }},
667 { "0",      {   "PD0R_KP0",     "PD0L_KP0",     "KEYB_0",       "NA"        }},
668 { "=",      {   "PD0R_KPE",     "PD0L_KPE",     "KEYB_EQUAL",   "NA"        }},
669 
670 /* ------------------------------------------------------------------------ */
671 /*  Action buttons.                                                         */
672 /* ------------------------------------------------------------------------ */
673 { "RSHIFT", {   "PD0L_A_T",     "PD0L_A_T",     "KEYB_SHIFT",   "NA"        }},
674 { "RALT",   {   "PD0L_A_L",     "PD0L_A_L",     "NA",           "NA"        }},
675 { "RCTRL",  {   "PD0L_A_R",     "PD0L_A_R",     "KEYB_CTRL",    "NA"        }},
676 
677 { "LSHIFT", {   "PD0R_A_T",     "PD0L_A_T",     "KEYB_SHIFT",   "NA"        }},
678 { "LALT",   {   "PD0R_A_L",     "PD0L_A_L",     "NA",           "NA"        }},
679 { "LCTRL",  {   "PD0R_A_R",     "PD0L_A_R",     "KEYB_CTRL",    "NA"        }},
680 
681 /* ------------------------------------------------------------------------ */
682 /*  Movement keys.                                                          */
683 /* ------------------------------------------------------------------------ */
684 { "RIGHT",  {   "PD0L_D_E",     "PD0L_D_E",     "KEYB_RIGHT",   "NA"        }},
685 { "UP",     {   "PD0L_D_N",     "PD0L_D_N",     "KEYB_UP",      "NA"        }},
686 { "LEFT",   {   "PD0L_D_W",     "PD0L_D_W",     "KEYB_LEFT",    "NA"        }},
687 { "DOWN",   {   "PD0L_D_S",     "PD0L_D_S",     "KEYB_DOWN",    "NA"        }},
688 
689 { "K",      {   "PD0L_D_E",     "PD0L_D_E",     "KEYB_K",       "NA"        }},
690 { "O",      {   "PD0L_D_NE",    "PD0L_D_NE",    "KEYB_O",       "NA"        }},
691 { "I",      {   "PD0L_D_N",     "PD0L_D_N",     "KEYB_I",       "NA"        }},
692 { "U",      {   "PD0L_D_NW",    "PD0L_D_NW",    "KEYB_U",       "NA"        }},
693 { "J",      {   "PD0L_D_W",     "PD0L_D_W",     "KEYB_J",       "NA"        }},
694 { "N",      {   "PD0L_D_SW",    "PD0L_D_SW",    "KEYB_N",       "NA"        }},
695 { "M",      {   "PD0L_D_S",     "PD0L_D_S",     "KEYB_M",       "MOVIE"     }},
696 { ",",      {   "PD0L_D_SE",    "PD0L_D_SE",    "KEYB_COMMA",   "NA"        }},
697 
698 { "D",      {   "PD0R_D_E",     "PD0L_D_E",     "KEYB_D",       "NA"        }},
699 { "R",      {   "PD0R_D_NE",    "PD0L_D_NE",    "KEYB_R",       "RESET"     }},
700 { "E",      {   "PD0R_D_N",     "PD0L_D_N",     "KEYB_E",       "NA"        }},
701 { "W",      {   "PD0R_D_NW",    "PD0L_D_NW",    "KEYB_W",       "WTOG"      }},
702 { "S",      {   "PD0R_D_W",     "PD0L_D_W",     "KEYB_S",       "SHOT"      }},
703 { "Z",      {   "PD0R_D_SW",    "PD0L_D_SW",    "KEYB_Z",       "RELOAD"    }},
704 { "X",      {   "PD0R_D_S",     "PD0L_D_S",     "KEYB_X",       "NA"        }},
705 { "C",      {   "PD0R_D_SE",    "PD0L_D_SE",    "KEYB_C",       "BREAK"     }},
706 
707     /*
708 00FFh|                  00FEh bits
709 bits |   0       1    2  3  4    5        6      7
710 -----+------------------------------------------------
711   0  | left,   comma, n, v, x, space,   [n/a], [n/a]
712   1  | period, m,     b, c, z, down,    [n/a], [n/a]
713   2  | scolon, k,     h, f, s, up,      [n/a], [n/a]
714   3  | p,      i,     y, r, w, q,       [n/a], [n/a]
715   4  | esc,    9,     7, 5, 3, 1,       [n/a], [n/a]
716   5  | 0,      8,     6, 4, 2, right,   [n/a], [n/a]
717   6  | enter,  o,     u, t, e, ctl,     [n/a], [n/a]
718   7  | [n/a],  l,     j, g, d, a,       shift, [n/a]
719   */
720 
721 /* ------------------------------------------------------------------------ */
722 /*  ECS Keyboard remaining keys.                                            */
723 /* ------------------------------------------------------------------------ */
724 { "Q",      {   "NA",           "NA",           "KEYB_Q",       "QUIT"      }},
725 { "T",      {   "NA",           "NA",           "KEYB_T",       "NA"        }},
726 { "Y",      {   "NA",           "NA",           "KEYB_Y",       "NA"        }},
727 { "P",      {   "NA",           "NA",           "KEYB_P",       "PAUSE"     }},
728 
729 { "A",      {   "NA",           "NA",           "KEYB_A",       "AVI"       }},
730 { "F",      {   "NA",           "NA",           "KEYB_F",       "WTOG"      }},
731 { "G",      {   "NA",           "NA",           "KEYB_G",       "GRAMSHOT"  }},
732 { "H",      {   "NA",           "NA",           "KEYB_H",       "NA"        }},
733 { "L",      {   "NA",           "NA",           "KEYB_L",       "NA"        }},
734 
735 { "V",      {   "NA",           "NA",           "KEYB_V",       "AVI"       }},
736 #ifdef N900
737 { "B",      {   "QUIT",         "QUIT",         "QUIT",         "QUIT"      }},
738 #else
739 { "B",      {   "NA",           "NA",           "KEYB_B",       "NA"        }},
740 #endif
741 { ".",      {   "NA",           "NA",           "KEYB_PERIOD",  "NA"        }},
742 { ";",      {   "NA",           "NA",           "KEYB_SEMI",    "NA"        }},
743 
744 { "SPACE",  {   "NA",           "NA",           "KEYB_SPACE",   "NA"        }},
745 { "RETURN", {   "NA",           "NA",           "KEYB_ENTER",   "NA"        }},
746 {"BACKSPACE",{  "NA",           "NA",           "KEYB_LEFT",    "NA"        }},
747 
748 { "QUOTEDBL",{  "NA",           "NA",           "KEYB_QUOTE",   "NA"        }},
749 { "QUOTE",  {   "NA",           "NA",           "KEYB_QUOTE",   "NA"        }},
750 { "CARET",  {   "NA",           "NA",           "KEYB_CARET",   "NA"        }},
751 { "HASH",   {   "NA",           "NA",           "KEYB_HASH",    "NA"        }},
752 { "PLUS",   {   "NA",           "NA",           "KEYB_PLUS",    "NA"        }},
753 { "SLASH",  {   "NA",           "NA",           "KEYB_SLASH",   "NA"        }},
754 { "DOLLAR", {   "NA",           "NA",           "KEYB_DOLLAR",  "NA"        }},
755 { "ASTERISK",{  "NA",           "NA",           "KEYB_STAR",    "NA"        }},
756 { "LEFTPAREN",{ "NA",           "NA",           "KEYB_LPAREN",  "NA"        }},
757 { "RIGHTPAREN",{"NA",           "NA",           "KEYB_RPAREN",  "NA"        }},
758 { "QUESTION",{  "NA",           "NA",           "KEYB_QUEST",   "NA"        }},
759 { "COLON",  {   "NA",           "NA",           "KEYB_COLON",   "NA"        }},
760 { "GREATER",{   "NA",           "NA",           "KEYB_GREATER", "NA"        }},
761 { "LESS",   {   "NA",           "NA",           "KEYB_LESS",    "NA"        }},
762 
763 /* ------------------------------------------------------------------------ */
764 /*  Default Joystick 0 mapping.                                             */
765 /* ------------------------------------------------------------------------ */
766 { "JS0_E",    { "PD0L_J_E",     "PD0L_J_E",     "PD0L_J_E",     "PD0L_J_E"  }},
767 { "JS0_ENE",  { "PD0L_J_ENE",   "PD0L_J_ENE",   "PD0L_J_ENE",   "PD0L_J_ENE"}},
768 { "JS0_NE",   { "PD0L_J_NE",    "PD0L_J_NE",    "PD0L_J_NE",    "PD0L_J_NE" }},
769 { "JS0_NNE",  { "PD0L_J_NNE",   "PD0L_J_NNE",   "PD0L_J_NNE",   "PD0L_J_NNE"}},
770 { "JS0_N",    { "PD0L_J_N",     "PD0L_J_N",     "PD0L_J_N",     "PD0L_J_N"  }},
771 { "JS0_NNW",  { "PD0L_J_NNW",   "PD0L_J_NNW",   "PD0L_J_NNW",   "PD0L_J_NNW"}},
772 { "JS0_NW",   { "PD0L_J_NW",    "PD0L_J_NW",    "PD0L_J_NW",    "PD0L_J_NW" }},
773 { "JS0_WNW",  { "PD0L_J_WNW",   "PD0L_J_WNW",   "PD0L_J_WNW",   "PD0L_J_WNW"}},
774 { "JS0_W",    { "PD0L_J_W",     "PD0L_J_W",     "PD0L_J_W",     "PD0L_J_W"  }},
775 { "JS0_WSW",  { "PD0L_J_WSW",   "PD0L_J_WSW",   "PD0L_J_WSW",   "PD0L_J_WSW"}},
776 { "JS0_SW",   { "PD0L_J_SW",    "PD0L_J_SW",    "PD0L_J_SW",    "PD0L_J_SW" }},
777 { "JS0_SSW",  { "PD0L_J_SSW",   "PD0L_J_SSW",   "PD0L_J_SSW",   "PD0L_J_SSW"}},
778 { "JS0_S",    { "PD0L_J_S",     "PD0L_J_S",     "PD0L_J_S",     "PD0L_J_S"  }},
779 { "JS0_SSE",  { "PD0L_J_SSE",   "PD0L_J_SSE",   "PD0L_J_SSE",   "PD0L_J_SSE"}},
780 { "JS0_SE",   { "PD0L_J_SE",    "PD0L_J_SE",    "PD0L_J_SE",    "PD0L_J_SE" }},
781 { "JS0_ESE",  { "PD0L_J_ESE",   "PD0L_J_ESE",   "PD0L_J_ESE",   "PD0L_J_ESE"}},
782 
783 #ifndef GP2X
784 {"JS0_BTN_00",{ "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T"  }},
785 {"JS0_BTN_01",{ "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L"  }},
786 {"JS0_BTN_02",{ "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R"  }},
787 {"JS0_BTN_03",{ "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T"  }},
788 {"JS0_BTN_04",{ "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L"  }},
789 {"JS0_BTN_05",{ "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R"  }},
790 {"JS0_BTN_06",{ "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T"  }},
791 {"JS0_BTN_07",{ "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L"  }},
792 {"JS0_BTN_08",{ "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R"  }},
793 
794 #else /* GP2X specific mappings. */
795 
796 /* Directional controller */
797 {"JS0_BTN_00",{ "PD0L_D_N" ,    "PD0L_D_N" ,    "PD0L_D_N" ,    "PD0L_D_N"  }},
798 {"JS0_BTN_01",{ "PD0L_D_NW",    "PD0L_D_NW",    "PD0L_D_NW",    "PD0L_D_NW" }},
799 {"JS0_BTN_02",{ "PD0L_D_W" ,    "PD0L_D_W" ,    "PD0L_D_W" ,    "PD0L_D_W"  }},
800 {"JS0_BTN_03",{ "PD0L_D_SW",    "PD0L_D_SW",    "PD0L_D_SW",    "PD0L_D_SW" }},
801 {"JS0_BTN_04",{ "PD0L_D_S" ,    "PD0L_D_S" ,    "PD0L_D_S" ,    "PD0L_D_S"  }},
802 {"JS0_BTN_05",{ "PD0L_D_SE",    "PD0L_D_SE",    "PD0L_D_SE",    "PD0L_D_SE" }},
803 {"JS0_BTN_06",{ "PD0L_D_E" ,    "PD0L_D_E" ,    "PD0L_D_E" ,    "PD0L_D_E"  }},
804 {"JS0_BTN_07",{ "PD0L_D_NE",    "PD0L_D_NE",    "PD0L_D_NE",    "PD0L_D_NE" }},
805 
806 /* Others:  Action, Volume, Quit, etc. */
807 /* GP2X button mapping:
808     JS0_BTN_08  # start button
809     JS0_BTN_09  # select button
810     JS0_BTN_10  # button L
811     JS0_BTN_11  # button R
812     JS0_BTN_12  # button A
813     JS0_BTN_13  # button B
814     JS0_BTN_14  # button Y
815     JS0_BTN_15  # button X
816     JS0_BTN_16  # volume up
817     JS0_BTN_17  # volume down
818     JS0_BTN_18  # stick press, used for shifting to map 1
819 */
820 
821 {"JS0_BTN_08",{ "PD0R_KPE",   "QUIT"    ,   "PD0R_KPE",   "QUIT"       }},
822 {"JS0_BTN_09",{ "PD0R_KPC",   "RESET"   ,   "PD0R_KPC",   "RESET"      }},
823 {"JS0_BTN_10",{ "PD0L_D_W",   "PD0R_KP1",   "PD0L_D_W",   "PD0R_KP1"   }},
824 {"JS0_BTN_11",{ "PD0L_D_E",   "PD0R_KP2",   "PD0L_D_E",   "PD0R_KP2"   }},
825 {"JS0_BTN_12",{ "PD0L_A_T",   "PD0R_KP4",   "PD0L_A_T",   "PD0R_KP4"   }},
826 {"JS0_BTN_13",{ "PD0L_A_R",   "PD0R_KP5",   "PD0L_A_R",   "PD0R_KP5"   }},
827 {"JS0_BTN_14",{ "PD0L_A_T",   "PD0R_KP3",   "PD0L_A_T",   "PD0R_KP3"   }},
828 {"JS0_BTN_15",{ "PD0L_A_L",   "PD0R_KP6",   "PD0L_A_L",   "PD0R_KP6"   }},
829 {"JS0_BTN_16",{ "VOLUP"   ,   "PD0R_KP8",   "VOLUP"   ,   "PD0R_KP8"   }},
830 {"JS0_BTN_17",{ "VOLDN"   ,   "PD0R_KP7",   "VOLDN"   ,   "PD0R_KP7"   }},
831 {"JS0_BTN_18",{ "SHF10"   ,   "SHF10"   ,   "SHF10"   ,   "SHF10"      }},
832 #endif
833 
834 #ifndef WII
835 {"JS0_HAT0_E", {"PD0R_KP6",     "PD0R_KP6",     "PD0R_KP6",     "PD0R_KP6"  }},
836 {"JS0_HAT0_NE",{"PD0R_KP3",     "PD0R_KP3",     "PD0R_KP3",     "PD0R_KP3"  }},
837 {"JS0_HAT0_N", {"PD0R_KP2",     "PD0R_KP2",     "PD0R_KP2",     "PD0R_KP2"  }},
838 {"JS0_HAT0_NW",{"PD0R_KP1",     "PD0R_KP1",     "PD0R_KP1",     "PD0R_KP1"  }},
839 {"JS0_HAT0_W", {"PD0R_KP4",     "PD0R_KP4",     "PD0R_KP4",     "PD0R_KP4"  }},
840 {"JS0_HAT0_SW",{"PD0R_KP7",     "PD0R_KP7",     "PD0R_KP7",     "PD0R_KP7"  }},
841 {"JS0_HAT0_S", {"PD0R_KP8",     "PD0R_KP8",     "PD0R_KP8",     "PD0R_KP8"  }},
842 {"JS0_HAT0_SE",{"PD0R_KP9",     "PD0R_KP9",     "PD0R_KP9",     "PD0R_KP9"  }},
843 #else /* WII Specific Bindings */
844 
845 {"JS0_BTN_09", {"PD0L_KPE",     "QUIT"    ,     "PD0R_KPE",     "QUIT"      }},
846 {"JS0_BTN_10", {"PD0L_KPC",     "RESET"   ,     "PD0R_KPC",     "RESET"     }},
847 {"JS0_BTN_11", {"PD0L_KP5",     "PD0R_KP1",     "PD0L_D_W",     "PD0R_KP1"  }},
848 {"JS0_BTN_12", {"PD0L_KP0",     "PD0R_KP2",     "PD0L_D_E",     "PD0R_KP2"  }},
849 {"JS0_HAT0_E", {"PD0L_KP6",     "PD0R_KP6",     "PD0R_KP6",     "PD0R_KP6"  }},
850 {"JS0_HAT0_NE",{"PD0L_KP3",     "PD0R_KP3",     "PD0R_KP3",     "PD0R_KP3"  }},
851 {"JS0_HAT0_N", {"PD0L_KP2",     "PD0R_KP2",     "PD0R_KP2",     "PD0R_KP2"  }},
852 {"JS0_HAT0_NW",{"PD0L_KP1",     "PD0R_KP1",     "PD0R_KP1",     "PD0R_KP1"  }},
853 {"JS0_HAT0_W", {"PD0L_KP4",     "PD0R_KP4",     "PD0R_KP4",     "PD0R_KP4"  }},
854 {"JS0_HAT0_SW",{"PD0L_KP7",     "PD0R_KP7",     "PD0R_KP7",     "PD0R_KP7"  }},
855 {"JS0_HAT0_S", {"PD0L_KP8",     "PD0R_KP8",     "PD0R_KP8",     "PD0R_KP8"  }},
856 {"JS0_HAT0_SE",{"PD0L_KP9",     "PD0R_KP9",     "PD0R_KP9",     "PD0R_KP9"  }},
857 {"JS1_BTN_00", {"PD0R_A_T",     "PD0L_A_T",     "PD0L_A_T",     "PD0L_A_T"  }},
858 {"JS1_BTN_01", {"PD0R_A_L",     "PD0L_A_L",     "PD0L_A_L",     "PD0L_A_L"  }},
859 {"JS1_BTN_02", {"PD0R_A_R",     "PD0L_A_R",     "PD0L_A_R",     "PD0L_A_R"  }},
860 {"JS1_BTN_09", {"PD0R_KPE",     "QUIT"    ,     "PD0R_KPE",     "QUIT"      }},
861 {"JS1_BTN_10", {"PD0R_KPC",     "RESET"   ,     "PD0R_KPC",     "RESET"     }},
862 {"JS1_BTN_11", {"PD0R_KP5",     "PD0R_KP1",     "PD0L_D_W",     "PD0R_KP1"  }},
863 {"JS1_BTN_12", {"PD0R_KP0",     "PD0R_KP2",     "PD0L_D_E",     "PD0R_KP2"  }},
864 {"JS1_E",      {"PD0R_J_E",     "PD0L_J_E",     "PD0L_J_E",     "PD0L_J_E"  }},
865 {"JS1_ENE",    {"PD0R_J_ENE",   "PD0L_J_ENE",   "PD0L_J_ENE",   "PD0L_J_ENE"}},
866 {"JS1_NE",     {"PD0R_J_NE",    "PD0L_J_NE",    "PD0L_J_NE",    "PD0L_J_NE" }},
867 {"JS1_NNE",    {"PD0R_J_NNE",   "PD0L_J_NNE",   "PD0L_J_NNE",   "PD0L_J_NNE"}},
868 {"JS1_N",      {"PD0R_J_N",     "PD0L_J_N",     "PD0L_J_N",     "PD0L_J_N"  }},
869 {"JS1_NNW",    {"PD0R_J_NNW",   "PD0L_J_NNW",   "PD0L_J_NNW",   "PD0L_J_NNW"}},
870 {"JS1_NW",     {"PD0R_J_NW",    "PD0L_J_NW",    "PD0L_J_NW",    "PD0L_J_NW" }},
871 {"JS1_WNW",    {"PD0R_J_WNW",   "PD0L_J_WNW",   "PD0L_J_WNW",   "PD0L_J_WNW"}},
872 {"JS1_W",      {"PD0R_J_W",     "PD0L_J_W",     "PD0L_J_W",     "PD0L_J_W"  }},
873 {"JS1_WSW",    {"PD0R_J_WSW",   "PD0L_J_WSW",   "PD0L_J_WSW",   "PD0L_J_WSW"}},
874 {"JS1_SW",     {"PD0R_J_SW",    "PD0L_J_SW",    "PD0L_J_SW",    "PD0L_J_SW" }},
875 {"JS1_SSW",    {"PD0R_J_SSW",   "PD0L_J_SSW",   "PD0L_J_SSW",   "PD0L_J_SSW"}},
876 {"JS1_S",      {"PD0R_J_S",     "PD0L_J_S",     "PD0L_J_S",     "PD0L_J_S"  }},
877 {"JS1_SSE",    {"PD0R_J_SSE",   "PD0L_J_SSE",   "PD0L_J_SSE",   "PD0L_J_SSE"}},
878 {"JS1_SE",     {"PD0R_J_SE",    "PD0L_J_SE",    "PD0L_J_SE",    "PD0L_J_SE" }},
879 {"JS1_ESE",    {"PD0R_J_ESE",   "PD0L_J_ESE",   "PD0L_J_ESE",   "PD0L_J_ESE"}},
880 {"JS1_HAT0_E", {"PD0R_KP6",     "PD0R_KP6",     "PD0R_KP6",     "PD0R_KP6"  }},
881 {"JS1_HAT0_NE",{"PD0R_KP3",     "PD0R_KP3",     "PD0R_KP3",     "PD0R_KP3"  }},
882 {"JS1_HAT0_N", {"PD0R_KP2",     "PD0R_KP2",     "PD0R_KP2",     "PD0R_KP2"  }},
883 {"JS1_HAT0_NW",{"PD0R_KP1",     "PD0R_KP1",     "PD0R_KP1",     "PD0R_KP1"  }},
884 {"JS1_HAT0_W", {"PD0R_KP4",     "PD0R_KP4",     "PD0R_KP4",     "PD0R_KP4"  }},
885 {"JS1_HAT0_SW",{"PD0R_KP7",     "PD0R_KP7",     "PD0R_KP7",     "PD0R_KP7"  }},
886 {"JS1_HAT0_S", {"PD0R_KP8",     "PD0R_KP8",     "PD0R_KP8",     "PD0R_KP8"  }},
887 {"JS1_HAT0_SE",{"PD0R_KP9",     "PD0R_KP9",     "PD0R_KP9",     "PD0R_KP9"  }},
888 
889 /* Press 1+9 on controller 0 on the master component */
890 { "JS0_BTN_13",{"IPAUSE0",      "IPAUSE0",      "IPAUSE0",      "IPAUSE0"   }},
891 /* Press 1+9 on controller 1 on the master component */
892 { "JS1_BTN_13",{"IPAUSE1",      "IPAUSE1",      "IPAUSE1",      "IPAUSE1"   }},
893 #endif
894 #ifdef N900
895 { "Q",      {   "PD0R_KP1",     "PD0L_KP1",     "KEYB_1",       "NA"        }},
896 { "W",      {   "PD0R_KP2",     "PD0L_KP2",     "KEYB_2",       "NA"        }},
897 { "E",      {   "PD0R_KP3",     "PD0L_KP3",     "KEYB_3",       "NA"        }},
898 { "R",      {   "PD0R_KP4",     "PD0L_KP4",     "KEYB_4",       "NA"        }},
899 { "T",      {   "PD0R_KP5",     "PD0L_KP5",     "KEYB_5",       "NA"        }},
900 { "Y",      {   "PD0R_KP6",     "PD0L_KP6",     "KEYB_6",       "NA"        }},
901 { "U",      {   "PD0R_KP7",     "PD0L_KP7",     "KEYB_7",       "NA"        }},
902 { "I",      {   "PD0R_KP8",     "PD0L_KP8",     "KEYB_8",       "NA"        }},
903 { "O",      {   "PD0R_KP9",     "PD0L_KP9",     "KEYB_9",       "NA"        }},
904 { "COMMA",  {   "PD0R_KPC",     "PD0L_KPC",     "KEYB_MINUS",   "NA"        }},
905 { "P",      {   "PD0R_KP0",     "PD0L_KP0",     "KEYB_0",       "NA"        }},
906 { "F",      {   "BREAK",        "BREAK",        "BREAK",        "BREAK"     }},
907 { "G",      {   "KBD0",         "KBD0",         "KBD0",         "KBD0"      }},
908 { "H",      {   "KBD1",         "KBD1",         "KBD1",         "KBD1"      }},
909 { "J",      {   "RESET",        "RESET",        "RESET",        "RESET"     }},
910 #endif
911 { NULL,     {   NULL,           NULL,           NULL,           NULL        }},
912 };
913 
914 /* ======================================================================== */
915 /*  This program is free software; you can redistribute it and/or modify    */
916 /*  it under the terms of the GNU General Public License as published by    */
917 /*  the Free Software Foundation; either version 2 of the License, or       */
918 /*  (at your option) any later version.                                     */
919 /*                                                                          */
920 /*  This program is distributed in the hope that it will be useful,         */
921 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of          */
922 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       */
923 /*  General Public License for more details.                                */
924 /*                                                                          */
925 /*  You should have received a copy of the GNU General Public License along */
926 /*  with this program; if not, write to the Free Software Foundation, Inc., */
927 /*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.             */
928 /* ======================================================================== */
929 /*                 Copyright (c) 1998-2020, Joseph Zbiciak                  */
930 /* ======================================================================== */
931