in cores/genesis/gx/gx_input.c [211:484]
static void pad_update(s8 chan, u8 i)
{
/* PAD status */
u16 p = PAD_ButtonsHeld(chan);
s8 x = PAD_StickX (chan);
s8 y = PAD_StickY (chan);
/* Retrieve current key mapping */
u16 *pad_keymap = config.pad_keymap[chan];
/* Default fast-forward key combo */
if ((p & PAD_TRIGGER_R) && (PAD_ButtonsDown(0) & PAD_BUTTON_START))
{
audioSync ^= AUDIO_WAIT;
videoSync = (audioSync && config.vsync && (gc_pal != vdp_pal)) ? VIDEO_WAIT : 0;
return;
}
/* User configurable menu combo */
if ((p & pad_keymap[KEY_MENU]) == pad_keymap[KEY_MENU])
{
ConfigRequested = 1;
return;
}
/* Default menu key (right analog stick if not needed by emulated device) */
if ((input.dev[i] < DEVICE_XE_1AP) && (PAD_SubStickX(chan) > ANALOG_SENSITIVITY))
{
ConfigRequested = 1;
return;
}
/* Emulated device */
switch (input.dev[i])
{
case DEVICE_PAD6B:
{
/* X,Y,Z,MODE buttons */
if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X;
if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y;
if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z;
if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE;
}
case DEVICE_PAD3B:
{
/* A button */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A;
}
case DEVICE_PAD2B:
{
/* D-PAD */
if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP;
else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN;
if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT;
else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT;
/* default buttons */
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START;
break;
}
case DEVICE_XE_1AP:
{
/* Left Stick analog position [0-255] */
input.analog[i][0] = (x + 128);
input.analog[i][1] = y ? (127 - y) : (128 - y);
/* Right Stick analog position [0-255] */
x = PAD_SubStickX(chan);
y = PAD_SubStickY(chan);
/* Emulated stick is unidirectional but can be rotated */
if (abs(x) > abs(y))
{
input.analog[i+1][0] = (x + 128);
}
else
{
input.analog[i+1][0] = (y + 128);
}
/* Buttons */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_XE_A;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_XE_B;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_XE_C;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_XE_START;
if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_XE_D;
if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_XE_E1;
if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_XE_E2;
if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_XE_SELECT;
break;
}
case DEVICE_SPORTSPAD:
{
/* Y analog position [0-255] */
input.analog[i][1] = y ? (127 - y) : (128 - y);
}
case DEVICE_PADDLE:
{
/* X analog position [0-255] */
input.analog[i][0] = (x + 128);
/* Buttons */
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START;
break;
}
case DEVICE_LIGHTGUN:
{
/* Gun screen position (x,y) */
input.analog[i][0] += x / ANALOG_SENSITIVITY;
input.analog[i][1] -= y / ANALOG_SENSITIVITY;
/* Limits */
if (input.analog[i][0] < 0) input.analog[i][0] = 0;
else if (input.analog[i][0] > bitmap.viewport.w) input.analog[i][0] = bitmap.viewport.w;
if (input.analog[i][1] < 0) input.analog[i][1] = 0;
else if (input.analog[i][1] > bitmap.viewport.h) input.analog[i][1] = bitmap.viewport.h;
/* Buttons */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START;
break;
}
case DEVICE_MOUSE:
{
/* Mouse relative movement (-255,255) */
input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2;
input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2;
/* Y-Axis inversion */
if (config.invert_mouse)
{
input.analog[i][1] = -input.analog[i][1];
}
/* Buttons */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_MOUSE_CENTER;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_MOUSE_LEFT;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_MOUSE_RIGHT;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START;
break;
}
case DEVICE_PICO:
{
/* D-PAD */
if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP;
else if (p & PAD_BUTTON_DOWN) input.pad[0] |= INPUT_DOWN;
if (p & PAD_BUTTON_LEFT) input.pad[0] |= INPUT_LEFT;
else if (p & PAD_BUTTON_RIGHT) input.pad[0] |= INPUT_RIGHT;
/* PEN screen position (x,y) */
input.analog[0][0] += x / ANALOG_SENSITIVITY;
input.analog[0][1] -= y / ANALOG_SENSITIVITY;
/* Limits */
if (input.analog[0][0] > 0x17c) input.analog[0][0] = 0x17c;
else if (input.analog[0][0] < 0x3c) input.analog[0][0] = 0x3c;
if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc;
else if (input.analog[0][1] > 0x2f7) input.analog[0][1] = 0x2f7;
/* PEN & RED button */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_PICO_RED;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_PICO_PEN;
/* PAGE index increment */
if (p & pad_keymap[KEY_BUTTONC]) pico_current = (pico_current + 1) & 7;
break;
}
case DEVICE_TEREBI:
{
/* PEN screen position (x,y) */
input.analog[0][0] += x / ANALOG_SENSITIVITY;
input.analog[0][1] -= y / ANALOG_SENSITIVITY;
/* Limits */
if (input.analog[0][0] < 0) input.analog[0][0] = 0;
else if (input.analog[0][0] > 250) input.analog[0][0] = 250;
if (input.analog[0][1] < 0) input.analog[0][1] = 0;
else if (input.analog[0][1] > 250) input.analog[0][1] = 250;
/* PEN button */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_BUTTON1;
break;
}
case DEVICE_GRAPHIC_BOARD:
{
/* PEN screen position (x,y) */
input.analog[0][0] += x / ANALOG_SENSITIVITY;
input.analog[0][1] -= y / ANALOG_SENSITIVITY;
/* Limits */
if (input.analog[0][0] < 0) input.analog[0][0] = 0;
else if (input.analog[0][0] > 255) input.analog[0][0] = 255;
if (input.analog[0][1] < 0) input.analog[0][1] = 0;
else if (input.analog[0][1] > 255) input.analog[0][1] = 255;
/* MODE buttons */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_GRAPHIC_PEN;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_GRAPHIC_DO;
if (p & pad_keymap[KEY_BUTTONC]) input.pad[0] |= INPUT_GRAPHIC_MENU;
break;
}
case DEVICE_ACTIVATOR:
{
/* Left & right analog stick angle [0-360] */
float ang;
/* Left stick values */
if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY))
{
/* Calculate angle (in degree) */
ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI);
if (x < 0) ang += 180.0;
/* 8 bottom sensors = 8 areas */
if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2L;
else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3L;
else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4L;
else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5L;
else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6L;
else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7L;
else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8L;
else input.pad[i] |= INPUT_ACTIVATOR_1L;
}
/* Right stick values */
x = PAD_SubStickX(chan);
y = PAD_SubStickY(chan);
if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY))
{
/* Calculate angle (in degree) */
ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI);
if (x < 0) ang += 180.0;
/* 8 top sensors = 8 areas */
if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2U;
else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3U;
else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4U;
else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5U;
else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6U;
else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7U;
else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8U;
else input.pad[i] |= INPUT_ACTIVATOR_1U;
}
break;
}
}
}