consolidate mame2003 core files

This commit is contained in:
Mark W. Kidd 2019-01-16 22:45:53 -05:00
parent ad1d795839
commit 6012d5564c
4 changed files with 268 additions and 273 deletions

View File

@ -19,8 +19,6 @@ COREDEFINES += -D__LIBRETRO__ -DPI=3.1415927 -DM_PI=3.1415927
SOURCES_C := \
$(CORE_DIR)/mame2003/mame2003.c \
$(CORE_DIR)/mame2003/keyboard.c \
$(CORE_DIR)/mame2003/joystick.c \
$(CORE_DIR)/mame2003/video.c \
$(CORE_DIR)/bootstrap.c \
$(CORE_DIR)/mame.c \

View File

@ -1,128 +0,0 @@
#include <stdio.h>
#include "libretro.h"
#include "mame2003.h"
#include "input.h"
/******************************************************************************
Keymapping
******************************************************************************/
#define EMIT_RETRO_PAD(INDEX) \
{"RetroPad" #INDEX " Left", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_LEFT, JOYCODE_##INDEX##_LEFT}, \
{"RetroPad" #INDEX " Right", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_RIGHT, JOYCODE_##INDEX##_RIGHT}, \
{"RetroPad" #INDEX " Up", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_UP, JOYCODE_##INDEX##_UP}, \
{"RetroPad" #INDEX " Down", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_DOWN, JOYCODE_##INDEX##_DOWN}, \
{"RetroPad" #INDEX " B", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_B, JOYCODE_##INDEX##_BUTTON1}, \
{"RetroPad" #INDEX " Y", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_Y, JOYCODE_##INDEX##_BUTTON2}, \
{"RetroPad" #INDEX " X", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_X, JOYCODE_##INDEX##_BUTTON3}, \
{"RetroPad" #INDEX " A", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_A, JOYCODE_##INDEX##_BUTTON4}, \
{"RetroPad" #INDEX " L", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L, JOYCODE_##INDEX##_BUTTON5}, \
{"RetroPad" #INDEX " R", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R, JOYCODE_##INDEX##_BUTTON6}, \
{"RetroPad" #INDEX " L2", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L2, JOYCODE_##INDEX##_BUTTON7}, \
{"RetroPad" #INDEX " R2", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R2, JOYCODE_##INDEX##_BUTTON8}, \
{"RetroPad" #INDEX " L3", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L3, JOYCODE_##INDEX##_BUTTON9}, \
{"RetroPad" #INDEX " R3", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R3, JOYCODE_##INDEX##_BUTTON10}, \
{"RetroPad" #INDEX " Start", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_START, JOYCODE_##INDEX##_START}, \
{"RetroPad" #INDEX " Select", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_SELECT, JOYCODE_##INDEX##_SELECT}, \
{"RetroMouse" #INDEX " Left Click", ((INDEX - 1) * 18) + 16, JOYCODE_MOUSE_##INDEX##_BUTTON1}, \
{"RetroMouse" #INDEX " Right Click", ((INDEX - 1) * 18) + 17, JOYCODE_MOUSE_##INDEX##_BUTTON2}
struct JoystickInfo jsItems[] =
{
EMIT_RETRO_PAD(1),
EMIT_RETRO_PAD(2),
EMIT_RETRO_PAD(3),
EMIT_RETRO_PAD(4),
{0, 0, 0}
};
/******************************************************************************
Joystick & Mouse/Trackball
******************************************************************************/
int retroJsState[72];
int16_t mouse_x[4];
int16_t mouse_y[4];
int16_t analogjoy[4][4];
const struct JoystickInfo *osd_get_joy_list(void)
{
return jsItems;
}
int osd_is_joy_pressed(int joycode)
{
return (joycode >= 0) ? retroJsState[joycode] : 0;
}
int osd_is_joystick_axis_code(int joycode)
{
return 0;
}
void osd_lightgun_read(int player, int *deltax, int *deltay)
{
}
void osd_trak_read(int player, int *deltax, int *deltay)
{
*deltax = mouse_x[player];
*deltay = mouse_y[player];
}
int convert_analog_scale(int input)
{
static int libretro_analog_range = LIBRETRO_ANALOG_MAX - LIBRETRO_ANALOG_MIN;
static int analog_range = ANALOG_MAX - ANALOG_MIN;
return (input - LIBRETRO_ANALOG_MIN)*analog_range / libretro_analog_range + ANALOG_MIN;
}
void osd_analogjoy_read(int player,int analog_axis[MAX_ANALOG_AXES], InputCode analogjoy_input[MAX_ANALOG_AXES])
{
int i;
for (i = 0; i < MAX_ANALOG_AXES; i ++)
{
if (analogjoy[player][i])
analog_axis[i] = convert_analog_scale(analogjoy[player][i]);
}
analogjoy_input[0] = IPT_AD_STICK_X;
analogjoy_input[1] = IPT_AD_STICK_Y;
}
void osd_customize_inputport_defaults(struct ipd *defaults)
{
#if 0
unsigned int i = 0;
for( ; defaults[i].type != IPT_END; ++i)
{
struct ipd *entry = &defaults[i];
switch(entry->type)
{
case (IPT_BUTTON1 | IPF_PLAYER1):
fprintf(stderr, "IPT_BUTTON1 | IPF_PLAYER1.\n");
break;
default:
fprintf(stderr, "Label not known.\n");
}
}
#endif
}
// These calibration functions should never actually be used (as long as needs_calibration returns 0 anyway).
int osd_joystick_needs_calibration(void) { return 0; }
void osd_joystick_start_calibration(void){ }
const char *osd_joystick_calibrate_next(void) { return 0; }
void osd_joystick_calibrate(void) { }
void osd_joystick_end_calibration(void) { }

View File

@ -1,141 +0,0 @@
#include <stdio.h>
#include "libretro.h"
#include "mame2003.h"
#include "input.h"
/******************************************************************************
Keyboard
******************************************************************************/
extern const struct KeyboardInfo retroKeys[];
int retroKeyState[512];
const struct KeyboardInfo *osd_get_key_list(void)
{
return retroKeys;
}
int osd_is_key_pressed(int keycode)
{
return (keycode < 512 && keycode >= 0) ? retroKeyState[keycode] : 0;
}
int osd_readkey_unicode(int flush)
{
// TODO
return 0;
}
/******************************************************************************
Keymapping
******************************************************************************/
// Unassigned keycodes
// KEYCODE_OPENBRACE, KEYCODE_CLOSEBRACE, KEYCODE_BACKSLASH2, KEYCODE_STOP, KEYCODE_LWIN, KEYCODE_RWIN, KEYCODE_DEL_PAD, KEYCODE_PAUSE,
// The format for each systems key constants is RETROK_$(TAG) and KEYCODE_$(TAG)
// EMIT1(TAG): The tag value is the same between libretro and MAME
// EMIT2(RTAG, MTAG): The tag value is different between the two
// EXITX(TAG): MAME has no equivalent key.
#define EMIT2(RETRO, KEY) {(char*)#RETRO, RETROK_##RETRO, KEYCODE_##KEY}
#define EMIT1(KEY) {(char*)#KEY, RETROK_##KEY, KEYCODE_##KEY}
#define EMITX(KEY) {(char*)#KEY, RETROK_##KEY, KEYCODE_OTHER}
const struct KeyboardInfo retroKeys[] =
{
EMIT1(BACKSPACE),
EMIT1(TAB),
EMITX(CLEAR),
EMIT1(BACKSPACE),
EMIT1(TAB),
EMITX(CLEAR),
EMIT2(RETURN, ENTER),
EMITX(PAUSE),
EMIT2(ESCAPE, ESC),
EMIT1(SPACE),
EMITX(EXCLAIM),
EMIT2(QUOTEDBL, TILDE),
EMITX(HASH),
EMITX(DOLLAR),
EMITX(AMPERSAND),
EMIT1(QUOTE),
EMITX(LEFTPAREN),
EMITX(RIGHTPAREN),
EMIT1(ASTERISK),
EMIT2(PLUS, EQUALS),
EMIT1(COMMA),
EMIT1(MINUS),
EMITX(PERIOD),
EMIT1(SLASH),
EMIT1(0), EMIT1(1), EMIT1(2), EMIT1(3), EMIT1(4), EMIT1(5), EMIT1(6), EMIT1(7), EMIT1(8), EMIT1(9),
EMIT1(COLON),
EMITX(SEMICOLON),
EMITX(LESS),
EMITX(EQUALS),
EMITX(GREATER),
EMITX(QUESTION),
EMITX(AT),
EMITX(LEFTBRACKET),
EMIT1(BACKSLASH),
EMITX(RIGHTBRACKET),
EMITX(CARET),
EMITX(UNDERSCORE),
EMITX(BACKQUOTE),
EMIT2(a, A), EMIT2(b, B), EMIT2(c, C), EMIT2(d, D), EMIT2(e, E), EMIT2(f, F),
EMIT2(g, G), EMIT2(h, H), EMIT2(i, I), EMIT2(j, J), EMIT2(k, K), EMIT2(l, L),
EMIT2(m, M), EMIT2(n, N), EMIT2(o, O), EMIT2(p, P), EMIT2(q, Q), EMIT2(r, R),
EMIT2(s, S), EMIT2(t, T), EMIT2(u, U), EMIT2(v, V), EMIT2(w, W), EMIT2(x, X),
EMIT2(y, Y), EMIT2(z, Z),
EMIT2(DELETE, DEL),
EMIT2(KP0, 0_PAD), EMIT2(KP1, 1_PAD), EMIT2(KP2, 2_PAD), EMIT2(KP3, 3_PAD),
EMIT2(KP4, 4_PAD), EMIT2(KP5, 5_PAD), EMIT2(KP6, 6_PAD), EMIT2(KP7, 7_PAD),
EMIT2(KP8, 8_PAD), EMIT2(KP9, 9_PAD),
EMITX(KP_PERIOD),
EMIT2(KP_DIVIDE, SLASH_PAD),
EMITX(KP_MULTIPLY),
EMIT2(KP_MINUS, MINUS_PAD),
EMIT2(KP_PLUS, PLUS_PAD),
EMIT2(KP_ENTER, ENTER_PAD),
EMITX(KP_EQUALS),
EMIT1(UP), EMIT1(DOWN), EMIT1(RIGHT), EMIT1(LEFT),
EMIT1(INSERT), EMIT1(HOME), EMIT1(END), EMIT2(PAGEUP, PGUP), EMIT2(PAGEDOWN, PGDN),
EMIT1(F1), EMIT1(F2), EMIT1(F3), EMIT1(F4), EMIT1(F5), EMIT1(F6),
EMIT1(F7), EMIT1(F8), EMIT1(F9), EMIT1(F10), EMIT1(F11), EMIT1(F12),
EMITX(F13), EMITX(F14), EMITX(F15),
EMIT1(NUMLOCK),
EMIT1(CAPSLOCK),
EMIT2(SCROLLOCK, SCRLOCK),
EMIT1(RSHIFT), EMIT1(LSHIFT), EMIT2(RCTRL, RCONTROL), EMIT2(LCTRL, LCONTROL), EMIT1(RALT), EMIT1(LALT),
EMITX(RMETA), EMITX(LMETA), EMITX(LSUPER), EMITX(RSUPER),
EMITX(MODE),
EMITX(COMPOSE),
EMITX(HELP),
EMIT2(PRINT, PRTSCR),
EMITX(SYSREQ),
EMITX(BREAK),
EMIT1(MENU),
EMITX(POWER),
EMITX(EURO),
EMITX(UNDO),
{0, 0, 0}
};

View File

@ -7,14 +7,19 @@
*********************************************************************/
#include <stdint.h>
#include <string/stdstring.h>
#include <libretro.h>
#include <file_path.h>
#include <file/file_path.h>
#include "mame.h"
#include "driver.h"
#include "state.h"
#include "log.h"
#include "input.h"
#include "inptport.h"
#include "fileio.h"
#include "controls.h"
#include "usrintrf.h"
/* Part of libretro's API */
int gotFrame;
@ -787,3 +792,264 @@ bool retro_unserialize(const void * data, size_t size)
return false;
}
/******************************************************************************
Keymapping
******************************************************************************/
#define EMIT_RETRO_PAD(INDEX) \
{"RetroPad" #INDEX " Left", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_LEFT, JOYCODE_##INDEX##_LEFT}, \
{"RetroPad" #INDEX " Right", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_RIGHT, JOYCODE_##INDEX##_RIGHT}, \
{"RetroPad" #INDEX " Up", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_UP, JOYCODE_##INDEX##_UP}, \
{"RetroPad" #INDEX " Down", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_DOWN, JOYCODE_##INDEX##_DOWN}, \
{"RetroPad" #INDEX " B", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_B, JOYCODE_##INDEX##_BUTTON1}, \
{"RetroPad" #INDEX " Y", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_Y, JOYCODE_##INDEX##_BUTTON2}, \
{"RetroPad" #INDEX " X", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_X, JOYCODE_##INDEX##_BUTTON3}, \
{"RetroPad" #INDEX " A", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_A, JOYCODE_##INDEX##_BUTTON4}, \
{"RetroPad" #INDEX " L", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L, JOYCODE_##INDEX##_BUTTON5}, \
{"RetroPad" #INDEX " R", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R, JOYCODE_##INDEX##_BUTTON6}, \
{"RetroPad" #INDEX " L2", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L2, JOYCODE_##INDEX##_BUTTON7}, \
{"RetroPad" #INDEX " R2", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R2, JOYCODE_##INDEX##_BUTTON8}, \
{"RetroPad" #INDEX " L3", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_L3, JOYCODE_##INDEX##_BUTTON9}, \
{"RetroPad" #INDEX " R3", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_R3, JOYCODE_##INDEX##_BUTTON10}, \
{"RetroPad" #INDEX " Start", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_START, JOYCODE_##INDEX##_START}, \
{"RetroPad" #INDEX " Select", ((INDEX - 1) * 18) + RETRO_DEVICE_ID_JOYPAD_SELECT, JOYCODE_##INDEX##_SELECT}, \
{"RetroMouse" #INDEX " Left Click", ((INDEX - 1) * 18) + 16, JOYCODE_MOUSE_##INDEX##_BUTTON1}, \
{"RetroMouse" #INDEX " Right Click", ((INDEX - 1) * 18) + 17, JOYCODE_MOUSE_##INDEX##_BUTTON2}
struct JoystickInfo jsItems[] =
{
EMIT_RETRO_PAD(1),
EMIT_RETRO_PAD(2),
EMIT_RETRO_PAD(3),
EMIT_RETRO_PAD(4),
{0, 0, 0}
};
/******************************************************************************
Joystick & Mouse/Trackball
******************************************************************************/
int retroJsState[72];
int16_t mouse_x[4];
int16_t mouse_y[4];
int16_t analogjoy[4][4];
const struct JoystickInfo *osd_get_joy_list(void)
{
return jsItems;
}
int osd_is_joy_pressed(int joycode)
{
return (joycode >= 0) ? retroJsState[joycode] : 0;
}
int osd_is_joystick_axis_code(int joycode)
{
return 0;
}
void osd_lightgun_read(int player, int *deltax, int *deltay)
{
}
void osd_trak_read(int player, int *deltax, int *deltay)
{
*deltax = mouse_x[player];
*deltay = mouse_y[player];
}
int convert_analog_scale(int input)
{
static int libretro_analog_range = LIBRETRO_ANALOG_MAX - LIBRETRO_ANALOG_MIN;
static int analog_range = ANALOG_MAX - ANALOG_MIN;
return (input - LIBRETRO_ANALOG_MIN)*analog_range / libretro_analog_range + ANALOG_MIN;
}
void osd_analogjoy_read(int player,int analog_axis[MAX_ANALOG_AXES], InputCode analogjoy_input[MAX_ANALOG_AXES])
{
int i;
for (i = 0; i < MAX_ANALOG_AXES; i ++)
{
if (analogjoy[player][i])
analog_axis[i] = convert_analog_scale(analogjoy[player][i]);
}
analogjoy_input[0] = IPT_AD_STICK_X;
analogjoy_input[1] = IPT_AD_STICK_Y;
}
void osd_customize_inputport_defaults(struct ipd *defaults)
{
#if 0
unsigned int i = 0;
for( ; defaults[i].type != IPT_END; ++i)
{
struct ipd *entry = &defaults[i];
switch(entry->type)
{
case (IPT_BUTTON1 | IPF_PLAYER1):
fprintf(stderr, "IPT_BUTTON1 | IPF_PLAYER1.\n");
break;
default:
fprintf(stderr, "Label not known.\n");
}
}
#endif
}
// These calibration functions should never actually be used (as long as needs_calibration returns 0 anyway).
int osd_joystick_needs_calibration(void) { return 0; }
void osd_joystick_start_calibration(void){ }
const char *osd_joystick_calibrate_next(void) { return 0; }
void osd_joystick_calibrate(void) { }
void osd_joystick_end_calibration(void) { }
/******************************************************************************
Keyboard
******************************************************************************/
extern const struct KeyboardInfo retroKeys[];
int retroKeyState[512];
const struct KeyboardInfo *osd_get_key_list(void)
{
return retroKeys;
}
int osd_is_key_pressed(int keycode)
{
return (keycode < 512 && keycode >= 0) ? retroKeyState[keycode] : 0;
}
int osd_readkey_unicode(int flush)
{
// TODO
return 0;
}
/******************************************************************************
Keymapping
******************************************************************************/
// Unassigned keycodes
// KEYCODE_OPENBRACE, KEYCODE_CLOSEBRACE, KEYCODE_BACKSLASH2, KEYCODE_STOP, KEYCODE_LWIN, KEYCODE_RWIN, KEYCODE_DEL_PAD, KEYCODE_PAUSE,
// The format for each systems key constants is RETROK_$(TAG) and KEYCODE_$(TAG)
// EMIT1(TAG): The tag value is the same between libretro and MAME
// EMIT2(RTAG, MTAG): The tag value is different between the two
// EXITX(TAG): MAME has no equivalent key.
#define EMIT2(RETRO, KEY) {(char*)#RETRO, RETROK_##RETRO, KEYCODE_##KEY}
#define EMIT1(KEY) {(char*)#KEY, RETROK_##KEY, KEYCODE_##KEY}
#define EMITX(KEY) {(char*)#KEY, RETROK_##KEY, KEYCODE_OTHER}
const struct KeyboardInfo retroKeys[] =
{
EMIT1(BACKSPACE),
EMIT1(TAB),
EMITX(CLEAR),
EMIT1(BACKSPACE),
EMIT1(TAB),
EMITX(CLEAR),
EMIT2(RETURN, ENTER),
EMITX(PAUSE),
EMIT2(ESCAPE, ESC),
EMIT1(SPACE),
EMITX(EXCLAIM),
EMIT2(QUOTEDBL, TILDE),
EMITX(HASH),
EMITX(DOLLAR),
EMITX(AMPERSAND),
EMIT1(QUOTE),
EMITX(LEFTPAREN),
EMITX(RIGHTPAREN),
EMIT1(ASTERISK),
EMIT2(PLUS, EQUALS),
EMIT1(COMMA),
EMIT1(MINUS),
EMITX(PERIOD),
EMIT1(SLASH),
EMIT1(0), EMIT1(1), EMIT1(2), EMIT1(3), EMIT1(4), EMIT1(5), EMIT1(6), EMIT1(7), EMIT1(8), EMIT1(9),
EMIT1(COLON),
EMITX(SEMICOLON),
EMITX(LESS),
EMITX(EQUALS),
EMITX(GREATER),
EMITX(QUESTION),
EMITX(AT),
EMITX(LEFTBRACKET),
EMIT1(BACKSLASH),
EMITX(RIGHTBRACKET),
EMITX(CARET),
EMITX(UNDERSCORE),
EMITX(BACKQUOTE),
EMIT2(a, A), EMIT2(b, B), EMIT2(c, C), EMIT2(d, D), EMIT2(e, E), EMIT2(f, F),
EMIT2(g, G), EMIT2(h, H), EMIT2(i, I), EMIT2(j, J), EMIT2(k, K), EMIT2(l, L),
EMIT2(m, M), EMIT2(n, N), EMIT2(o, O), EMIT2(p, P), EMIT2(q, Q), EMIT2(r, R),
EMIT2(s, S), EMIT2(t, T), EMIT2(u, U), EMIT2(v, V), EMIT2(w, W), EMIT2(x, X),
EMIT2(y, Y), EMIT2(z, Z),
EMIT2(DELETE, DEL),
EMIT2(KP0, 0_PAD), EMIT2(KP1, 1_PAD), EMIT2(KP2, 2_PAD), EMIT2(KP3, 3_PAD),
EMIT2(KP4, 4_PAD), EMIT2(KP5, 5_PAD), EMIT2(KP6, 6_PAD), EMIT2(KP7, 7_PAD),
EMIT2(KP8, 8_PAD), EMIT2(KP9, 9_PAD),
EMITX(KP_PERIOD),
EMIT2(KP_DIVIDE, SLASH_PAD),
EMITX(KP_MULTIPLY),
EMIT2(KP_MINUS, MINUS_PAD),
EMIT2(KP_PLUS, PLUS_PAD),
EMIT2(KP_ENTER, ENTER_PAD),
EMITX(KP_EQUALS),
EMIT1(UP), EMIT1(DOWN), EMIT1(RIGHT), EMIT1(LEFT),
EMIT1(INSERT), EMIT1(HOME), EMIT1(END), EMIT2(PAGEUP, PGUP), EMIT2(PAGEDOWN, PGDN),
EMIT1(F1), EMIT1(F2), EMIT1(F3), EMIT1(F4), EMIT1(F5), EMIT1(F6),
EMIT1(F7), EMIT1(F8), EMIT1(F9), EMIT1(F10), EMIT1(F11), EMIT1(F12),
EMITX(F13), EMITX(F14), EMITX(F15),
EMIT1(NUMLOCK),
EMIT1(CAPSLOCK),
EMIT2(SCROLLOCK, SCRLOCK),
EMIT1(RSHIFT), EMIT1(LSHIFT), EMIT2(RCTRL, RCONTROL), EMIT2(LCTRL, LCONTROL), EMIT1(RALT), EMIT1(LALT),
EMITX(RMETA), EMITX(LMETA), EMITX(LSUPER), EMITX(RSUPER),
EMITX(MODE),
EMITX(COMPOSE),
EMITX(HELP),
EMIT2(PRINT, PRTSCR),
EMITX(SYSREQ),
EMITX(BREAK),
EMIT1(MENU),
EMITX(POWER),
EMITX(EURO),
EMITX(UNDO),
{0, 0, 0}
};