input: implement reload. remap some naomi games input

implement lightgun reload (dc, naomi)
kcode[] set to 32 bits
revamped mapping for naomi keys
remapped btns for some naomi games
display game button/axes names in UI
This commit is contained in:
Flyinghead 2020-12-02 14:40:50 +01:00
parent 9a61407125
commit adeacd89f4
22 changed files with 409 additions and 308 deletions

View File

@ -4,31 +4,12 @@
#include "hw/naomi/naomi_cart.h"
#include "input/gamepad_device.h"
#define HAS_VMU
/*
bus_x=0{p0=1{config};p1=2{config};config;}
Plugins:
Input Source
EventMap -- 'Raw' interface, source_name[seid]:mode
KeyMap -- translated chars ( no re-mapping possible)
Output
Image
*/
/*
MapleConfig:
InputUpdate(&fmt);
ImageUpdate(data);
*/
void UpdateInputState(u32 port);
void UpdateVibration(u32 port, float power, float inclination, u32 duration_ms);
u8 GetBtFromSgn(s8 val)
static u8 GetBtFromSgn(s8 val)
{
return val+128;
}
u32 awave_button_mapping[16] = {
u32 awave_button_mapping[32] = {
AWAVE_SERVICE_KEY, // DC_BTN_C
AWAVE_BTN1_KEY, // DC_BTN_B
AWAVE_BTN0_KEY, // DC_BTN_A
@ -47,7 +28,7 @@ u32 awave_button_mapping[16] = {
0, // DC_DPAD2_RIGHT
};
u32 awavelg_button_mapping[16] = {
u32 awavelg_button_mapping[32] = {
AWAVE_SERVICE_KEY, // DC_BTN_C
AWAVE_BTN0_KEY, // DC_BTN_B
AWAVE_TRIGGER_KEY, // DC_BTN_A
@ -64,6 +45,8 @@ u32 awavelg_button_mapping[16] = {
AWAVE_BTN4_KEY, // DC_DPAD2_DOWN
0, // DC_DPAD2_LEFT
0, // DC_DPAD2_RIGHT
AWAVE_BTN0_KEY // DC_BTN_RELOAD (not needed for AW, mapped to BTN0 = pump)
};
struct MapleConfigMap : IMapleConfigMap
@ -86,34 +69,78 @@ struct MapleConfigMap : IMapleConfigMap
void GetInput(PlainJoystickState* pjs)
{
int player_num = this->player_num == -1 ? dev->bus_id : this->player_num;
UpdateInputState(player_num);
pjs->kcode=kcode[player_num];
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
pjs->joy[PJAI_X1]=GetBtFromSgn(joyx[player_num]);
pjs->joy[PJAI_Y1]=GetBtFromSgn(joyy[player_num]);
pjs->trigger[PJTI_R]=rt[player_num];
pjs->trigger[PJTI_L]=lt[player_num];
pjs->kcode = kcode[player_num];
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
pjs->joy[PJAI_Y1] = GetBtFromSgn(joyy[player_num]);
pjs->trigger[PJTI_R] = rt[player_num];
pjs->trigger[PJTI_L] = lt[player_num];
}
else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{
const u32* mapping = settings.input.JammaSetup == JVS::LightGun ? awavelg_button_mapping : awave_button_mapping;
pjs->kcode = 0xFFFF;
for (int i = 0; i < 16; i++)
pjs->kcode = ~0;
for (u32 i = 0; i < ARRAY_SIZE(awave_button_mapping); i++)
{
if ((kcode[player_num] & (1 << i)) == 0)
pjs->kcode &= ~mapping[i];
}
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[1].name != NULL && NaomiGameInputs->axes[1].type == Half)
if (NaomiGameInputs != NULL)
{
// Driving games: put axis 2 on RT (accel) and axis 3 on LT (brake)
pjs->joy[PJAI_Y1] = rt[player_num];
pjs->joy[PJAI_X2] = lt[player_num];
for (u32 axis = 0; axis < PJAI_Count; axis++)
{
if (NaomiGameInputs->axes[axis].name != NULL)
{
if (NaomiGameInputs->axes[axis].type == Full)
{
switch (NaomiGameInputs->axes[axis].axis)
{
case 0:
pjs->joy[axis] = GetBtFromSgn(joyx[player_num]);
break;
case 1:
pjs->joy[axis] = GetBtFromSgn(joyy[player_num]);
break;
case 2:
pjs->joy[axis] = GetBtFromSgn(joyrx[player_num]);
break;
case 3:
pjs->joy[axis] = GetBtFromSgn(joyry[player_num]);
break;
default:
pjs->joy[axis] = 0x80;
break;
}
}
else
{
switch (NaomiGameInputs->axes[axis].axis)
{
case 4:
pjs->joy[axis] = rt[player_num];
break;
case 5:
pjs->joy[axis] = lt[player_num];
break;
default:
pjs->joy[axis] = 0x80;
break;
}
}
if (NaomiGameInputs->axes[axis].inverted)
pjs->joy[axis] = pjs->joy[axis] == 0 ? 0xff : 0x100 - pjs->joy[axis];
}
else
{
pjs->joy[axis] = 0x80;
}
}
}
else
{
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
pjs->joy[PJAI_Y1] = GetBtFromSgn(joyy[player_num]);
pjs->joy[PJAI_X2] = rt[player_num];
pjs->joy[PJAI_Y2] = lt[player_num];

View File

@ -1,21 +1,6 @@
#pragma once
#include "types.h"
enum PlainJoystickButtonId
{
PJBI_B = 1,
PJBI_A = 2,
PJBI_START = 3,
PJBI_DPAD_UP = 4,
PJBI_DPAD_DOWN = 5,
PJBI_DPAD_LEFT = 6,
PJBI_DPAD_RIGHT = 7,
PJBI_Y = 9,
PJBI_X = 10,
PJBI_Count=16
};
enum PlainJoystickAxisId
{
PJAI_X1 = 0,
@ -38,12 +23,11 @@ struct PlainJoystickState
{
PlainJoystickState()
{
kcode=0xFFFF;
joy[0]=joy[1]=joy[2]=joy[3]=0x80;
trigger[0]=trigger[1]=0;
}
u32 kcode;
u32 kcode = ~0;
u8 joy[PJAI_Count];
u8 trigger[PJTI_Count];

View File

@ -8,6 +8,7 @@
#include "stdclass.h"
#include <algorithm>
#include <array>
#include <cstdlib>
#include <zlib.h>
#include <xxhash.h>
@ -340,10 +341,7 @@ struct maple_atomiswave_controller: maple_sega_controller
if (index < 2 || index > 5)
return 0x80;
index -= 2;
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[index].name != NULL && NaomiGameInputs->axes[index].inverted)
return pjs.joy[index] == 0 ? 0xff : 0x100 - pjs.joy[index];
else
return pjs.joy[index];
return pjs.joy[index];
}
};
@ -811,23 +809,18 @@ struct maple_sega_vmu: maple_base
{
case MFID_3_Clock:
{
u32 bp=r32();
u32 bp = r32();
if (bp)
{
INFO_LOG(MAPLE, "BEEP : %08X", bp);
}
return MDRS_DeviceReply;//just ko
}
break;
return MDRS_DeviceReply; //just ko
default:
{
INFO_LOG(MAPLE, "VMU: command MDCF_SetCondition -> Bad function used, returning MDRE_UnknownFunction");
return MDRE_UnknownFunction;//bad function
}
break;
INFO_LOG(MAPLE, "VMU: command MDCF_SetCondition -> Bad function used, returning MDRE_UnknownFunction");
return MDRE_UnknownFunction; //bad function
}
}
break;
case MDC_DeviceReset:
return MDRS_DeviceReply;
@ -1367,6 +1360,8 @@ struct maple_mouse : maple_base
struct maple_lightgun : maple_base
{
virtual u32 transform_kcode(u32 kcode) {
if ((kcode & DC_BTN_RELOAD) == 0)
kcode &= ~DC_BTN_A; // trigger
return kcode | 0xFF01;
}
@ -1445,7 +1440,13 @@ struct maple_lightgun : maple_base
virtual bool get_lightgun_pos() override
{
read_lightgun_position(mo_x_abs, mo_y_abs);
PlainJoystickState pjs;
config->GetInput(&pjs);
if ((pjs.kcode & DC_BTN_RELOAD) == 0)
read_lightgun_position(-1, -1);
else
read_lightgun_position(mo_x_abs, mo_y_abs);
return true;
}
};
@ -1453,6 +1454,7 @@ struct maple_lightgun : maple_base
struct atomiswave_lightgun : maple_lightgun
{
virtual u32 transform_kcode(u32 kcode) override {
// No need for reload on AW
return (kcode & AWAVE_TRIGGER_KEY) == 0 ? ~AWAVE_BTN0_KEY : ~0;
}
};
@ -1484,7 +1486,7 @@ void load_naomi_eeprom()
}
}
static u32 naomi_button_mapping[] = {
static u32 naomi_button_mapping[32] = {
NAOMI_SERVICE_KEY, // DC_BTN_C
NAOMI_BTN1_KEY, // DC_BTN_B
NAOMI_BTN0_KEY, // DC_BTN_A
@ -1501,8 +1503,83 @@ static u32 naomi_button_mapping[] = {
NAOMI_BTN5_KEY, // DC_DPAD2_DOWN
NAOMI_BTN6_KEY, // DC_DPAD2_LEFT
NAOMI_BTN7_KEY, // DC_DPAD2_RIGHT
0, // DC_BTN_RELOAD
NAOMI_BTN8_KEY,
};
extern u32 awave_button_mapping[32];
extern u32 awavelg_button_mapping[32];
const char *GetCurrentGameButtonName(DreamcastKey key)
{
if (NaomiGameInputs == nullptr || key == EMU_BTN_NONE)
return nullptr;
u32 pos = 0;
u32 val = (u32)key;
while ((val & 1) == 0)
{
pos++;
val >>= 1;
}
u32 arcade_key;
if (settings.platform.system == DC_PLATFORM_NAOMI)
{
if (pos >= ARRAY_SIZE(naomi_button_mapping))
return nullptr;
arcade_key = naomi_button_mapping[pos];
}
else
{
if (pos >= ARRAY_SIZE(awave_button_mapping))
return nullptr;
const u32* mapping = settings.input.JammaSetup == JVS::LightGun ? awavelg_button_mapping : awave_button_mapping;
arcade_key = mapping[pos];
}
for (int i = 0; NaomiGameInputs->buttons[i].source != 0; i++)
if (NaomiGameInputs->buttons[i].source == arcade_key)
return NaomiGameInputs->buttons[i].name;
return nullptr;
}
const char *GetCurrentGameAxisName(DreamcastKey axis)
{
if (NaomiGameInputs == nullptr || axis == EMU_BTN_NONE)
return nullptr;
for (int i = 0; NaomiGameInputs->axes[i].name != nullptr; i++)
{
DreamcastKey cur_axis;
switch (NaomiGameInputs->axes[i].axis)
{
case 0:
cur_axis = DC_AXIS_X;
break;
case 1:
cur_axis = DC_AXIS_Y;
break;
case 2:
cur_axis = DC_AXIS_X2;
break;
case 3:
cur_axis = DC_AXIS_Y2;
break;
case 4:
cur_axis = DC_AXIS_RT;
break;
case 5:
cur_axis = DC_AXIS_LT;
break;
default:
cur_axis = EMU_BTN_NONE;
break;
}
if (cur_axis == axis)
return NaomiGameInputs->axes[i].name;
}
return nullptr;
}
/*
* Sega JVS I/O board
@ -1520,7 +1597,7 @@ public:
this->node_id = node_id;
this->parent = parent;
this->first_player = first_player;
init_p2_mapping();
init_mappings();
}
virtual ~jvs_io_board() = default;
@ -1533,28 +1610,47 @@ public:
protected:
virtual const char *get_id() = 0;
virtual u16 read_analog_axis(int player_num, int player_axis, bool inverted);
virtual u32 read_digital_in(int player_num) {
if (player_num >= (int)ARRAY_SIZE(kcode))
return 0;
u32 buttons = 0;
if (player_num > 0 && !p2_mappings.empty())
{
// Check for P1 buttons mapped to P2 inputs
u32 keycode = ~kcode[player_num - 1];
for (const auto& pair : p2_mappings)
if ((keycode & pair.first) != 0)
buttons |= pair.second;
return buttons;
}
u32 keycode = ~kcode[player_num];
for (int i = 0; i < 16; i++)
virtual void read_digital_in(u16 *v)
{
memset(v, 0, sizeof(u16) * 4);
for (u32 player = first_player; player < ARRAY_SIZE(kcode); player++)
{
if ((keycode & (1 << i)) != 0)
buttons |= naomi_button_mapping[i];
u32 keycode = ~kcode[player];
if (keycode == 0)
continue;
if (keycode & DC_BTN_RELOAD)
keycode |= DC_BTN_A;
// P1 mapping (only for P2)
if (player == 1)
{
for (u32 i = 0; i < p1_mapping.size(); i++)
if ((keycode & (1 << i)) != 0)
v[0] |= p1_mapping[i];
}
// normal mapping
for (u32 i = 0; i < cur_mapping.size(); i++)
if ((keycode & (1 << i)) != 0)
v[player - first_player] |= cur_mapping[i];
// P2 mapping (only for P1)
if (player == 0)
{
bool found = false;
for (u32 i = 0; i < p2_mapping.size(); i++)
{
if ((keycode & (1 << i)) != 0)
v[1] |= p2_mapping[i];
if (p2_mapping[i] != 0)
found = true;
}
if (found)
// if there are P2 mappings for P1 then there's only 1 player
break;
}
}
return buttons;
}
virtual void write_digital_out(int count, u8 *data) { }
u32 player_count = 0;
@ -1567,29 +1663,41 @@ protected:
bool init_in_progress = false;
private:
void init_p2_mapping()
void init_mappings()
{
p1_mapping.fill(0);
p2_mapping.fill(0);
memcpy(&cur_mapping[0], naomi_button_mapping, sizeof(naomi_button_mapping));
if (NaomiGameInputs == nullptr)
// Use default mapping
return;
for (int i = 0; NaomiGameInputs->buttons[i].name != nullptr; i++)
for (int i = 0; NaomiGameInputs->buttons[i].source != 0; i++)
{
const ButtonDescriptor& button = NaomiGameInputs->buttons[i];
if (button.p2_mask == 0)
continue;
for (int i = 0; i < 16; i++)
u32 source = NaomiGameInputs->buttons[i].source;
for (u32 j = 0; j < ARRAY_SIZE(naomi_button_mapping); j++)
{
if (naomi_button_mapping[i] == button.mask)
if (naomi_button_mapping[j] == source)
{
p2_mappings.push_back(std::make_pair(1 << i, button.p2_mask));
p1_mapping[j] = NaomiGameInputs->buttons[i].p1_target;
p2_mapping[j] = NaomiGameInputs->buttons[i].p2_target;
u32 target = NaomiGameInputs->buttons[i].target;
if (target == 0 && p1_mapping[j] == 0 && p2_mapping[j] == 0)
target = source;
cur_mapping[j] = target;
break;
}
}
}
}
u8 node_id;
maple_naomi_jamma *parent;
u8 first_player;
std::vector<std::pair<u32, u32>> p2_mappings;
std::array<u32, 32> cur_mapping;
std::array<u32, 32> p1_mapping;
std::array<u32, 32> p2_mapping;
};
// Most common JVS board
@ -1700,35 +1808,29 @@ public:
{
}
protected:
virtual u32 read_digital_in(int player_num) override {
u32 rv = jvs_837_13844::read_digital_in(player_num);
virtual void read_digital_in(u16 *v) override
{
jvs_837_13844::read_digital_in(v);
// The drive board RX0-7 is connected to the following player inputs
if (player_num == 0)
{
rv |= NAOMI_BTN2_KEY | NAOMI_BTN3_KEY | NAOMI_BTN4_KEY | NAOMI_BTN5_KEY;
if (drive_board & 16)
rv &= ~NAOMI_BTN5_KEY;
if (drive_board & 32)
rv &= ~NAOMI_BTN4_KEY;
if (drive_board & 64)
rv &= ~NAOMI_BTN3_KEY;
if (drive_board & 128)
rv &= ~NAOMI_BTN2_KEY;
}
else if (player_num == 1)
{
rv |= NAOMI_BTN2_KEY | NAOMI_BTN3_KEY | NAOMI_BTN4_KEY | NAOMI_BTN5_KEY;
if (drive_board & 1)
rv &= ~NAOMI_BTN5_KEY;
if (drive_board & 2)
rv &= ~NAOMI_BTN4_KEY;
if (drive_board & 4)
rv &= ~NAOMI_BTN3_KEY;
if (drive_board & 8)
rv &= ~NAOMI_BTN2_KEY;
}
return rv;
v[0] |= NAOMI_BTN2_KEY | NAOMI_BTN3_KEY | NAOMI_BTN4_KEY | NAOMI_BTN5_KEY;
if (drive_board & 16)
v[0] &= ~NAOMI_BTN5_KEY;
if (drive_board & 32)
v[0] &= ~NAOMI_BTN4_KEY;
if (drive_board & 64)
v[0] &= ~NAOMI_BTN3_KEY;
if (drive_board & 128)
v[0] &= ~NAOMI_BTN2_KEY;
v[1] |= NAOMI_BTN2_KEY | NAOMI_BTN3_KEY | NAOMI_BTN4_KEY | NAOMI_BTN5_KEY;
if (drive_board & 1)
v[1] &= ~NAOMI_BTN5_KEY;
if (drive_board & 2)
v[1] &= ~NAOMI_BTN4_KEY;
if (drive_board & 4)
v[1] &= ~NAOMI_BTN3_KEY;
if (drive_board & 8)
v[1] &= ~NAOMI_BTN2_KEY;
}
virtual void write_digital_out(int count, u8 *data) override {
@ -1846,31 +1948,20 @@ public:
protected:
virtual const char *get_id() override { return "SEGA ENTERPRISES,LTD.;I/O BD JVS;837-13551 ;Ver1.00;98/10"; }
virtual u32 read_digital_in(int player_num) override {
u32 keycode1 = jvs_io_board::read_digital_in(0);
u32 keycode2 = jvs_io_board::read_digital_in(1);
u32 keycode3 = jvs_io_board::read_digital_in(2);
u32 keycode4 = jvs_io_board::read_digital_in(3);
virtual void read_digital_in(u16 *v) override
{
jvs_io_board::read_digital_in(v);
// main button
return ((keycode1 & NAOMI_BTN0_KEY) << 6) // start
| ((keycode2 & NAOMI_BTN0_KEY) << 2) // left
| ((keycode3 & NAOMI_BTN0_KEY) << 1) // right
| ((keycode4 & NAOMI_BTN0_KEY) >> 1) // btn1
// soft kick
// | ((~keycode1 & NAOMI_BTN1_KEY) >> 1) // btn2
// | ((~keycode2 & NAOMI_BTN1_KEY) >> 3) // btn4
// | ((~keycode3 & NAOMI_BTN1_KEY) >> 5) // btn6
// | ((~keycode4 & NAOMI_BTN1_KEY) >> 7) // test?
// // hard kick
// | ((~keycode1 & NAOMI_BTN2_KEY) >> 1) // btn3
// | ((~keycode2 & NAOMI_BTN2_KEY) >> 3) // btn5
// | ((~keycode3 & NAOMI_BTN2_KEY) >> 5) // btn7
// | ((~keycode4 & NAOMI_BTN2_KEY) >> 7) // coin?
v[0] = ((v[0] & NAOMI_BTN0_KEY) << 6) // start
| ((v[1] & NAOMI_BTN0_KEY) << 2) // left
| ((v[2] & NAOMI_BTN0_KEY) << 1) // right
| ((v[3] & NAOMI_BTN0_KEY) >> 1) // btn1
// enter
| ((keycode1 & NAOMI_BTN3_KEY) << 3) // btn0
| ((v[0] & NAOMI_BTN3_KEY) << 3) // btn0
// service menu
| (keycode1 & (NAOMI_TEST_KEY | NAOMI_SERVICE_KEY | NAOMI_UP_KEY | NAOMI_DOWN_KEY));
| (v[0] & (NAOMI_TEST_KEY | NAOMI_SERVICE_KEY | NAOMI_UP_KEY | NAOMI_DOWN_KEY));
}
u16 read_joystick_x(int joy_num)
{
s8 axis_x = joyx[joy_num];
@ -1936,15 +2027,19 @@ public:
protected:
virtual const char *get_id() override { return "SEGA ENTERPRISES,LTD.;I/O BD JVS;837-13551 ;Ver1.00;98/10"; }
virtual u32 read_digital_in(int player_num) override {
u32 keycode = jvs_io_board::read_digital_in(player_num);
u8 trigger = rt[player_num] >> 2;
// Ball button
return ((trigger & 0x20) << 3) | ((trigger & 0x10) << 5) | ((trigger & 0x08) << 7)
| ((trigger & 0x04) << 9) | ((trigger & 0x02) << 11) | ((trigger & 0x01) << 13)
// other buttons
| (keycode & (NAOMI_SERVICE_KEY | NAOMI_TEST_KEY | NAOMI_START_KEY))
| ((keycode & NAOMI_BTN0_KEY) >> 4); // remap button4 to button0 (change button)
virtual void read_digital_in(u16 *v) override
{
jvs_io_board::read_digital_in(v);
for (u32 player = 0; player < player_count; player++)
{
u8 trigger = rt[player] >> 2;
// Ball button
v[player] = ((trigger & 0x20) << 3) | ((trigger & 0x10) << 5) | ((trigger & 0x08) << 7)
| ((trigger & 0x04) << 9) | ((trigger & 0x02) << 11) | ((trigger & 0x01) << 13)
// other buttons
| (v[player] & (NAOMI_SERVICE_KEY | NAOMI_TEST_KEY | NAOMI_START_KEY))
| ((v[player] & NAOMI_BTN0_KEY) >> 4); // remap button4 to button0 (change button)
}
}
u16 read_joystick_x(int joy_num)
@ -2774,8 +2869,6 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
if (jvs_cmd >= 0x20 && jvs_cmd <= 0x38) // Read inputs and more
{
LOGJVS("JVS Node %d: ", node_id);
PlainJoystickState pjs;
parent->config->GetInput(&pjs);
JVS_STATUS1(); // status
for (u32 cmdi = 0; cmdi < length_in; )
@ -2786,18 +2879,18 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
{
JVS_STATUS1(); // report byte
u16 btns[4];
read_digital_in(btns);
JVS_OUT((btns[0] & NAOMI_TEST_KEY) ? 0x80 : 0x00); // test, tilt1, tilt2, tilt3, unused, unused, unused, unused
LOGJVS("btns ");
for (int player = 0; player < buffer_in[cmdi + 1]; player++)
{
u16 cur_btns = read_digital_in(first_player + player);
if (player == 0)
JVS_OUT((cur_btns & NAOMI_TEST_KEY) ? 0x80 : 0x00); // test, tilt1, tilt2, tilt3, unused, unused, unused, unused
LOGJVS("P%d %02x ", player + 1 + first_player, cur_btns >> 8);
JVS_OUT(cur_btns >> 8);
LOGJVS("P%d %02x ", player + 1 + first_player, btns[player] >> 8);
JVS_OUT(btns[player] >> 8);
if (buffer_in[cmdi + 2] == 2)
{
LOGJVS("%02x ", cur_btns & 0xFF);
JVS_OUT(cur_btns);
LOGJVS("%02x ", btns[player] & 0xFF);
JVS_OUT(btns[player]);
}
}
cmdi += 3;
@ -2809,7 +2902,7 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
JVS_STATUS1(); // report byte
LOGJVS("coins ");
u32 mask = 0;
for (int i = 0; i < 16; i++)
for (u32 i = 0; i < ARRAY_SIZE(naomi_button_mapping); i++)
{
if (naomi_button_mapping[i] == NAOMI_COIN_KEY)
{
@ -2819,7 +2912,7 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
}
for (int slot = 0; slot < buffer_in[cmdi + 1]; slot++)
{
u16 keycode = ~kcode[first_player + slot];
u32 keycode = ~kcode[first_player + slot];
bool coin_chute = false;
if (keycode & mask)
{
@ -2847,13 +2940,19 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
LOGJVS("ana ");
if (lightgun_as_analog)
{
u16 x = mo_x_abs * 0xFFFF / 639;
u16 y = mo_y_abs * 0xFFFF / 479;
if (mo_x_abs < 0 || mo_x_abs > 639 || mo_y_abs < 0 || mo_y_abs > 479)
u16 x;
u16 y;
if (mo_x_abs < 0 || mo_x_abs > 639 || mo_y_abs < 0 || mo_y_abs > 479
|| (kcode[first_player] & DC_BTN_RELOAD) == 0)
{
x = 0;
y = 0;
}
else
{
x = mo_x_abs * 0xFFFF / 639;
y = mo_y_abs * 0xFFFF / 479;
}
LOGJVS("x,y:%4x,%4x ", x, y);
JVS_OUT(x >> 8); // X, MSB
JVS_OUT(x); // X, LSB
@ -2863,7 +2962,6 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
}
int full_axis_count = 0;
int half_axis_count = 0;
for (; axis < buffer_in[cmdi + 1]; axis++)
{
u16 axis_value;
@ -2874,15 +2972,14 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
const AxisDescriptor& axisDesc = NaomiGameInputs->axes[axis];
if (axisDesc.type == Half)
{
if (half_axis_count == 0)
if (axisDesc.axis == 4)
axis_value = rt[first_player] << 8;
else if (half_axis_count == 1)
else if (axisDesc.axis == 5)
axis_value = lt[first_player] << 8;
else
axis_value = 0;
if (axisDesc.inverted)
axis_value = 0xff00u - axis_value;
half_axis_count++;
}
else
{
@ -2950,6 +3047,8 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
u32 yr = 0x1fe - 0x40;
s16 x = mo_x_abs * xr / 639 + 0x37;
s16 y = mo_y_abs * yr / 479 + 0x40;
if ((kcode[first_player] & DC_BTN_RELOAD) == 0)
x = y = 0;
LOGJVS("lightgun %4x,%4x ", x, y);
JVS_OUT(x >> 8); // X, MSB
JVS_OUT(x); // X, LSB

View File

@ -1,6 +1,7 @@
#pragma once
#include "types.h"
#include <cmath>
#include "input/gamepad.h"
enum MapleDeviceType
{
@ -145,3 +146,6 @@ extern f32 mo_y_delta;
extern f32 mo_wheel_delta;
#define SWAP32(a) ((((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff))
const char *GetCurrentGameButtonName(DreamcastKey key);
const char *GetCurrentGameAxisName(DreamcastKey axis);

View File

@ -19,6 +19,7 @@ maple_device* MapleDevices[4][6];
int maple_schid;
void UpdateInputState();
/*
Maple host controller
Direct processing, async interrupt handling
@ -145,6 +146,9 @@ static void maple_DoDma()
return;
}
#endif
UpdateInputState();
const bool swap_msb = (SB_MMSEL == 0);
u32 xfer_count=0;
bool last = false;

View File

@ -103,9 +103,11 @@ extern Cartridge *CurrentCartridge;
struct ButtonDescriptor
{
u32 mask;
u32 source;
const char *name;
u32 p2_mask;
u32 target;
u32 p2_target; // map P1 input to JVS P2
u32 p1_target; // map P2 input to JVS P1
};
enum AxisType {

View File

@ -37,9 +37,10 @@ static InputDescriptors _18wheelr_inputs = {
{
{ NAOMI_BTN0_KEY, "HORN" },
{ NAOMI_DOWN_KEY, "VIEW" },
{ NAOMI_BTN1_KEY, "SHIFT L", NAOMI_DOWN_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN2_KEY, "SHIFT H", NAOMI_UP_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN3_KEY, "SHIFT R", NAOMI_LEFT_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN1_KEY, "SHIFT L", 0, NAOMI_DOWN_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN2_KEY, "SHIFT H", 0, NAOMI_UP_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN3_KEY, "SHIFT R", 0, NAOMI_LEFT_KEY | NAOMI_DOWN_KEY },
// This button uses P2 inputs for P1
NAO_START_DESC
NAO_BASE_BTN_DESC
{ 0 },
@ -55,9 +56,9 @@ static InputDescriptors _18wheelr_inputs = {
static InputDescriptors alienfnt_inputs = {
{
{ NAOMI_BTN0_KEY, "LEFT SHOT" },
{ NAOMI_BTN1_KEY, "ROTATION R" },
{ NAOMI_BTN2_KEY, "RIGHT SHOT" },
{ NAOMI_BTN3_KEY, "ROTATION L" },
{ NAOMI_BTN3_KEY, "ROTATION R", NAOMI_BTN1_KEY },
{ NAOMI_BTN1_KEY, "RIGHT SHOT", NAOMI_BTN2_KEY },
{ NAOMI_BTN2_KEY, "ROTATION L", NAOMI_BTN3_KEY },
NAO_START_DESC
NAO_BASE_BTN_DESC
{ 0 },
@ -80,12 +81,12 @@ static InputDescriptors alpilot_inputs = {
{ 0 },
},
{
{ "ELEVATOR", Full, 0 },
{ "AILERON", Full, 1 },
{ "", Full, 2 },
{ "RUDDER PEDAL", Full, 3 },
{ "THRUST LEVER L", Half, 4 },
{ "THRUST LEVER R", Half, 5 },
{ "ELEVATOR", Full, 1 },
{ "AILERON", Full, 0 },
{ "", Full, 3 },
{ "RUDDER PEDAL", Full, 2 },
{ "THRUST LEVER L", Half, 5 },
{ "THRUST LEVER R", Half, 4 },
{ NULL },
},
};
@ -156,20 +157,6 @@ static InputDescriptors trigger_inputs = {
},
};
static InputDescriptors deathcox_inputs = {
{
{ NAOMI_BTN0_KEY, "TRIGGER" },
NAO_START_DESC
NAO_BASE_BTN_DESC
{ 0 },
},
{
{ "GUN-X", Full, 0 },
{ "GUN-Y", Full, 1 },
{ NULL },
},
};
static InputDescriptors gunsur2_inputs = {
{
{ NAOMI_BTN0_KEY, "GUN BUTTON" },
@ -190,8 +177,8 @@ static InputDescriptors gunsur2_inputs = {
static InputDescriptors jambo_inputs = {
{
{ NAOMI_UP_KEY, "LEVER UP", NAOMI_DOWN_KEY }, // This button uses P2 inputs for P1
{ NAOMI_DOWN_KEY, "LEVER DOWN", NAOMI_UP_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN1_KEY, "LEVER UP", 0, NAOMI_DOWN_KEY }, // This button uses P2 inputs for P1
{ NAOMI_BTN0_KEY, "LEVER DOWN", 0, NAOMI_UP_KEY }, // This button uses P2 inputs for P1
NAO_START_DESC
NAO_BASE_BTN_DESC
{ 0 },
@ -248,11 +235,9 @@ static InputDescriptors sfz3ugd_inputs = {
static InputDescriptors ninjaslt_inputs = {
{
{ NAOMI_BTN0_KEY, "ENTER" },
{ NAOMI_BTN2_KEY, "START 1P" },
{ NAOMI_BTN3_KEY, "START 2P" },
{ NAOMI_BTN4_KEY, "TRIGGER 1P" },
{ NAOMI_BTN5_KEY, "TRIGGER 2P" },
{ NAOMI_BTN2_KEY, "ENTER", NAOMI_BTN0_KEY },
{ NAOMI_START_KEY, "START", NAOMI_BTN2_KEY, 0, NAOMI_BTN3_KEY },
{ NAOMI_BTN0_KEY, "TRIGGER", NAOMI_BTN4_KEY, 0, NAOMI_BTN5_KEY },
{ NAOMI_UP_KEY, "SELECT UP" },
{ NAOMI_DOWN_KEY, "SELECT DOWN" },
NAO_BASE_BTN_DESC
@ -271,14 +256,14 @@ static InputDescriptors vonot_inputs = {
{ NAOMI_RIGHT_KEY, "L RIGHT" },
{ NAOMI_BTN0_KEY, "L TRIGGER" },
{ NAOMI_BTN1_KEY, "L TURBO" },
{ NAOMI_BTN2_KEY, "QM" },
{ NAOMI_BTN8_KEY, "QM" },
// These buttons use P2 inputs for P1
{ NAOMI_BTN3_KEY, "R TRIGGER", NAOMI_BTN0_KEY },
{ NAOMI_BTN4_KEY, "R TURBO", NAOMI_BTN1_KEY },
{ NAOMI_BTN5_KEY, "R UP", NAOMI_UP_KEY },
{ NAOMI_BTN6_KEY, "R DOWN", NAOMI_DOWN_KEY },
{ NAOMI_BTN7_KEY, "R LEFT", NAOMI_LEFT_KEY },
{ NAOMI_BTN8_KEY, "R RIGHT", NAOMI_RIGHT_KEY },
{ NAOMI_BTN2_KEY, "R TRIGGER", 0, NAOMI_BTN0_KEY },
{ NAOMI_BTN3_KEY, "R TURBO", 0, NAOMI_BTN1_KEY },
{ NAOMI_BTN4_KEY, "R UP", 0, NAOMI_UP_KEY },
{ NAOMI_BTN5_KEY, "R DOWN", 0, NAOMI_DOWN_KEY },
{ NAOMI_BTN6_KEY, "R LEFT", 0, NAOMI_LEFT_KEY },
{ NAOMI_BTN7_KEY, "R RIGHT", 0, NAOMI_RIGHT_KEY },
NAO_START_DESC
NAO_BASE_BTN_DESC
@ -347,18 +332,18 @@ static InputDescriptors tokyobus_inputs = {
{ NAOMI_LEFT_KEY, "ANNOUNCE" },
{ NAOMI_RIGHT_KEY, "DOOR CLOSE" },
// These buttons uses P2 inputs for P1
{ NAOMI_BTN1_KEY, "WINKER RIGHT", NAOMI_BTN0_KEY },
{ NAOMI_BTN2_KEY, "WINKER LEFT", NAOMI_BTN1_KEY },
{ NAOMI_BTN3_KEY, "SHIFT FRONT", NAOMI_UP_KEY },
{ NAOMI_BTN4_KEY, "SHIFT REVERSE", NAOMI_DOWN_KEY },
{ NAOMI_BTN1_KEY, "WINKER RIGHT", 0, NAOMI_BTN0_KEY },
{ NAOMI_BTN2_KEY, "WINKER LEFT", 0, NAOMI_BTN1_KEY },
{ NAOMI_BTN3_KEY, "SHIFT FRONT", 0, NAOMI_UP_KEY },
{ NAOMI_BTN4_KEY, "SHIFT REVERSE", 0, NAOMI_DOWN_KEY },
NAO_START_DESC
NAO_BASE_BTN_DESC
{ 0 },
},
{
{ "HANDLE", Full, 0 },
{ "ACCEL", Half, 1 },
{ "BRAKE", Half, 2 },
{ "ACCEL", Half, 4 },
{ "BRAKE", Half, 5 },
{ NULL },
},
};
@ -372,13 +357,14 @@ static InputDescriptors wrungp_inputs = {
},
{
{ "HANDLE BAR", Full, 0 },
{ "THROTTLE LEVER", Half, 1, true },
{ "THROTTLE LEVER", Half, 4, true },
{ "ROLL", Full, 2 },
{ "PITCH", Full, 3 },
{ NULL },
},
};
// Standard cabinet. The Deluxe version has different (and more) inputs.
static InputDescriptors marine_fishing_inputs = {
{
{ NAOMI_START_KEY, "CAST" },
@ -391,7 +377,7 @@ static InputDescriptors marine_fishing_inputs = {
{ "ROD X", Full, 0 },
{ "STICK X", Full, 2 },
{ "STICK Y", Full, 3 },
{ "REEL SPEED", Half, 0 },
{ "REEL SPEED", Half, 4 },
{ NULL },
},
};
@ -401,9 +387,9 @@ static InputDescriptors f355_inputs = {
{ NAOMI_BTN0_KEY, "ASSIST SC" },
{ NAOMI_BTN1_KEY, "ASSIST TC" },
{ NAOMI_BTN2_KEY, "ASSIST ABS" },
{ NAOMI_BTN3_KEY, "ASSIST IBS", NAOMI_BTN1_KEY },
{ NAOMI_BTN4_KEY, "WING SHIFT L", NAOMI_DOWN_KEY },
{ NAOMI_BTN5_KEY, "WING SHIFT R", NAOMI_UP_KEY },
{ NAOMI_BTN3_KEY, "ASSIST IBS", 0, NAOMI_BTN1_KEY },
{ NAOMI_BTN4_KEY, "WING SHIFT L", 0, NAOMI_DOWN_KEY },
{ NAOMI_BTN5_KEY, "WING SHIFT R", 0, NAOMI_UP_KEY },
// Manual gearshift (Deluxe only)
// L R
@ -420,8 +406,8 @@ static InputDescriptors f355_inputs = {
{ 0 },
},
{
{ "ACCEL", Half, 0 },
{ "BRAKE", Half, 1 },
{ "ACCEL", Half, 4 },
{ "BRAKE", Half, 5 },
{ "CLUTCH", Full, 2 }, // Deluxe only
{ "unused", Full, 4 },
{ "HANDLE", Full, 0 },
@ -465,8 +451,8 @@ static InputDescriptors ftspeed_inputs = {
},
{
{ "STEERING WHEEL", Full, 0 },
{ "GAS PEDAL", Half, 1 },
{ "BRAKE PEDAL", Half, 2 },
{ "GAS PEDAL", Half, 4 },
{ "BRAKE PEDAL", Half, 5 },
{ NULL },
},
};
@ -515,8 +501,8 @@ static InputDescriptors maxspeed_inputs = {
},
{
{ "STEERING", Full, 0 },
{ "ACCELERATOR", Half, 1 },
{ "BRAKE", Half, 2 },
{ "ACCELERATOR", Half, 4 },
{ "BRAKE", Half, 5 },
{ NULL },
},
};
@ -563,6 +549,9 @@ static InputDescriptors blockpong_inputs = {
},
{
{ "ANALOG X", Full, 0, true },
{ "ANALOG Y", Full, 1 },
{ "ANALOG X", Full, 0 }, // for P2
{ "ANALOG Y", Full, 1 }, // for P2
{ NULL },
},
};

View File

@ -35,10 +35,10 @@ enum DreamcastKey
DC_DPAD2_DOWN = 1 << 13,
DC_DPAD2_LEFT = 1 << 14,
DC_DPAD2_RIGHT = 1 << 15,
DC_BTN_RELOAD = 1 << 16, // Not a real button but handled like one
// System buttons
EMU_BTN_NONE = 0,
EMU_BTN_ESCAPE = 1 << 16,
EMU_BTN_TRIGGER_LEFT = 1 << 17,
EMU_BTN_TRIGGER_RIGHT = 1 << 18,
EMU_BTN_MENU = 1 << 19,
@ -47,6 +47,7 @@ enum DreamcastKey
EMU_BTN_ANA_DOWN = 1 << 22,
EMU_BTN_ANA_LEFT = 1 << 23,
EMU_BTN_ANA_RIGHT = 1 << 24,
EMU_BTN_ESCAPE = 1 << 25,
// Real axes
DC_AXIS_LT = 0x10000,

View File

@ -29,7 +29,7 @@
#define MAPLE_PORT_CFG_PREFIX "maple_"
// Gamepads
u16 kcode[4] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF };
u32 kcode[4] = { ~0u, ~0u, ~0u, ~0u };
s8 joyx[4];
s8 joyy[4];
s8 joyrx[4];
@ -63,44 +63,44 @@ bool GamepadDevice::gamepad_btn_input(u32 code, bool pressed)
if (key == EMU_BTN_NONE)
return false;
if (key < 0x10000)
if (key <= DC_BTN_RELOAD)
{
if (pressed)
{
kcode[port] &= ~(u16)key;
kcode[port] &= ~key;
// Avoid two opposite dpad keys being pressed simultaneously
switch (key)
{
case DC_DPAD_UP:
kcode[port] |= (u16)DC_DPAD_DOWN;
kcode[port] |= DC_DPAD_DOWN;
break;
case DC_DPAD_DOWN:
kcode[port] |= (u16)DC_DPAD_UP;
kcode[port] |= DC_DPAD_UP;
break;
case DC_DPAD_LEFT:
kcode[port] |= (u16)DC_DPAD_RIGHT;
kcode[port] |= DC_DPAD_RIGHT;
break;
case DC_DPAD_RIGHT:
kcode[port] |= (u16)DC_DPAD_LEFT;
kcode[port] |= DC_DPAD_LEFT;
break;
case DC_DPAD2_UP:
kcode[port] |= (u16)DC_DPAD2_DOWN;
kcode[port] |= DC_DPAD2_DOWN;
break;
case DC_DPAD2_DOWN:
kcode[port] |= (u16)DC_DPAD2_UP;
kcode[port] |= DC_DPAD2_UP;
break;
case DC_DPAD2_LEFT:
kcode[port] |= (u16)DC_DPAD2_RIGHT;
kcode[port] |= DC_DPAD2_RIGHT;
break;
case DC_DPAD2_RIGHT:
kcode[port] |= (u16)DC_DPAD2_LEFT;
kcode[port] |= DC_DPAD2_LEFT;
break;
default:
break;
}
}
else
kcode[port] |= (u16)key;
kcode[port] |= key;
#ifdef TEST_AUTOMATION
if (record_input != NULL)
fprintf(record_input, "%ld button %x %04x\n", sh4_sched_now64(), port, kcode[port]);

View File

@ -101,7 +101,9 @@ private:
void replay_input();
#endif
extern u16 kcode[4];
extern u32 kcode[4];
extern u8 rt[4], lt[4];
extern s8 joyx[4], joyy[4];
extern s8 joyrx[4], joyry[4];
void UpdateVibration(u32 port, float power, float inclination, u32 duration_ms);

View File

@ -54,6 +54,7 @@ button_list[] =
{ EMU_BTN_ANA_DOWN, "compat", "btn_analog_down" },
{ EMU_BTN_ANA_LEFT, "compat", "btn_analog_left" },
{ EMU_BTN_ANA_RIGHT, "compat", "btn_analog_right" },
{ DC_BTN_RELOAD, "dreamcast", "reload" },
};
static struct

View File

@ -202,8 +202,7 @@ void input_evdev_close()
EvdevGamepadDevice::CloseDevices();
}
// FIXME this shouldn't be done by port. Need something like: handle_events() then get_port(0), get_port(2), ...
bool input_evdev_handle(u32 port)
bool input_evdev_handle()
{
#ifdef USE_UDEV
get_udev_events();

View File

@ -3,4 +3,4 @@
extern void input_evdev_init();
extern void input_evdev_close();
extern bool input_evdev_handle(u32 port);
extern bool input_evdev_handle();

View File

@ -73,18 +73,18 @@ void os_SetupInput()
#endif
}
void UpdateInputState(u32 port)
void UpdateInputState()
{
#if defined(USE_JOYSTICK)
input_joystick_handle(joystick_fd, port);
input_joystick_handle(joystick_fd, 0);
#endif
#if defined(USE_EVDEV)
input_evdev_handle(port);
input_evdev_handle();
#endif
#if defined(USE_SDL)
input_sdl_handle(port);
input_sdl_handle();
#endif
}

View File

@ -39,7 +39,7 @@
#include "log/LogManager.h"
#include "emulator.h"
extern void UpdateInputState(u32 port);
extern void UpdateInputState();
extern bool game_started;
extern int screen_width, screen_height;
@ -158,7 +158,7 @@ void ImGui_Impl_NewFrame()
ImGuiIO& io = ImGui::GetIO();
UpdateInputState(0);
UpdateInputState();
// Read keyboard modifiers inputs
io.KeyCtrl = (kb_shift & (0x01 | 0x10)) != 0;
@ -446,18 +446,22 @@ const DreamcastKey button_keys[] = {
DC_BTN_START, DC_BTN_A, DC_BTN_B, DC_BTN_X, DC_BTN_Y, DC_DPAD_UP, DC_DPAD_DOWN, DC_DPAD_LEFT, DC_DPAD_RIGHT,
EMU_BTN_MENU, EMU_BTN_ESCAPE, EMU_BTN_FFORWARD, EMU_BTN_TRIGGER_LEFT, EMU_BTN_TRIGGER_RIGHT,
DC_BTN_C, DC_BTN_D, DC_BTN_Z, DC_DPAD2_UP, DC_DPAD2_DOWN, DC_DPAD2_LEFT, DC_DPAD2_RIGHT,
DC_BTN_RELOAD,
EMU_BTN_ANA_UP, EMU_BTN_ANA_DOWN, EMU_BTN_ANA_LEFT, EMU_BTN_ANA_RIGHT
};
const char *button_names[] = {
"Start", "A", "B", "X", "Y", "DPad Up", "DPad Down", "DPad Left", "DPad Right",
"Menu", "Exit", "Fast-forward", "Left Trigger", "Right Trigger",
"C", "D", "Z", "Right Dpad Up", "Right DPad Down", "Right DPad Left", "Right DPad Right",
"Reload",
"Left Stick Up", "Left Stick Down", "Left Stick Left", "Left Stick Right"
};
const char *arcade_button_names[] = {
"Start", "Button 1", "Button 2", "Button 3", "Button 4", "Up", "Down", "Left", "Right",
"Menu", "Exit", "Fast-forward", "N/A", "N/A",
"Service", "Coin", "Test", "Button 5", "Button 6", "Button 7", "Button 8", "N/A", "N/A", "N/A", "N/A"
"Service", "Coin", "Test", "Button 5", "Button 6", "Button 7", "Button 8",
"Reload",
"N/A", "N/A", "N/A", "N/A"
};
const DreamcastKey axis_keys[] = {
DC_AXIS_X, DC_AXIS_Y, DC_AXIS_LT, DC_AXIS_RT, DC_AXIS_X2, DC_AXIS_Y2, EMU_AXIS_DPAD1_X, EMU_AXIS_DPAD1_Y,
@ -556,11 +560,10 @@ static void controller_mapping_popup(std::shared_ptr<GamepadDevice> gamepad)
if (ImGui::BeginPopupModal("Controller Mapping", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove))
{
const float width = screen_width / 2;
const float col0_width = ImGui::CalcTextSize("Right DPad Downxxx").x + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetStyle().ItemSpacing.x;
const float col1_width = width
const float col_width = (width
- ImGui::GetStyle().GrabMinSize
- (col0_width + ImGui::GetStyle().ItemSpacing.x)
- (ImGui::CalcTextSize("Map").x + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetStyle().ItemSpacing.x);
- (0 + ImGui::GetStyle().ItemSpacing.x)
- (ImGui::CalcTextSize("Map").x + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetStyle().ItemSpacing.x)) / 2;
std::shared_ptr<InputMapping> input_mapping = gamepad->get_input_mapping();
if (input_mapping == NULL || ImGui::Button("Done", ImVec2(100 * scaling, 30 * scaling)))
@ -599,13 +602,20 @@ static void controller_mapping_popup(std::shared_ptr<GamepadDevice> gamepad)
ImGui::BeginChildFrame(ImGui::GetID("buttons"), ImVec2(width, 0), ImGuiWindowFlags_None);
ImGui::Columns(3, "bindings", false);
ImGui::SetColumnWidth(0, col0_width);
ImGui::SetColumnWidth(1, col1_width);
ImGui::SetColumnWidth(0, col_width);
ImGui::SetColumnWidth(1, col_width);
for (u32 j = 0; j < ARRAY_SIZE(button_keys); j++)
{
sprintf(key_id, "key_id%d", j);
ImGui::PushID(key_id);
ImGui::Text("%s", arcade_button_mode ? arcade_button_names[j] : button_names[j]);
const char *btn_name = arcade_button_mode ? arcade_button_names[j] : button_names[j];
const char *game_btn_name = GetCurrentGameButtonName(button_keys[j]);
if (game_btn_name != nullptr)
ImGui::Text("%s - %s", btn_name, game_btn_name);
else
ImGui::Text("%s", btn_name);
ImGui::NextColumn();
u32 code = input_mapping->get_button_code(gamepad_port, button_keys[j]);
if (code != (u32)-1)
@ -638,14 +648,21 @@ static void controller_mapping_popup(std::shared_ptr<GamepadDevice> gamepad)
ImGui::Text(" Analog Axes ");
ImGui::BeginChildFrame(ImGui::GetID("analog"), ImVec2(width, 0), ImGuiWindowFlags_None);
ImGui::Columns(3, "bindings", false);
ImGui::SetColumnWidth(0, col0_width);
ImGui::SetColumnWidth(1, col1_width);
ImGui::SetColumnWidth(0, col_width);
ImGui::SetColumnWidth(1, col_width);
for (u32 j = 0; j < ARRAY_SIZE(axis_keys); j++)
{
sprintf(key_id, "axis_id%d", j);
ImGui::PushID(key_id);
ImGui::Text("%s", arcade_button_mode ? arcade_axis_names[j] : axis_names[j]);
const char *axis_name = arcade_button_mode ? arcade_axis_names[j] : axis_names[j];
const char *game_axis_name = GetCurrentGameAxisName(axis_keys[j]);
if (game_axis_name != nullptr)
ImGui::Text("%s - %s", axis_name, game_axis_name);
else
ImGui::Text("%s", axis_name);
ImGui::NextColumn();
u32 code = input_mapping->get_axis_code(gamepad_port, axis_keys[j]);
if (code != (u32)-1)

View File

@ -99,11 +99,9 @@ static void set_mouse_position(int x, int y)
}
}
// FIXME this shouldn't be done by port. Need something like: handle_events() then get_port(0), get_port(2), ...
void input_sdl_handle(u32 port)
void input_sdl_handle()
{
if (port == 0) // FIXME hack
SDLGamepadDevice::UpdateRumble();
SDLGamepadDevice::UpdateRumble();
#define SET_FLAG(field, mask, expr) (field) = ((expr) ? ((field) & ~(mask)) : ((field) | (mask)))
SDL_Event event;

View File

@ -3,7 +3,7 @@
#include "types.h"
extern void input_sdl_init();
extern void input_sdl_handle(u32 port);
extern void input_sdl_handle();
extern void sdl_window_create();
extern void sdl_window_set_text(const char* text);
extern void sdl_window_destroy();

View File

@ -209,29 +209,17 @@ static Win32KeyboardDevice keyboard(0);
void ToggleFullscreen();
void UpdateInputState(u32 port)
void UpdateInputState()
{
#if defined(USE_SDL)
input_sdl_handle(port);
input_sdl_handle();
#else
/*
Disabled for now. Need new EMU_BTN_ANA_LEFT/RIGHT/.. virtual controller keys
joyx[port]=joyy[port]=0;
if (GetAsyncKeyState('J'))
joyx[port]-=126;
if (GetAsyncKeyState('L'))
joyx[port]+=126;
if (GetAsyncKeyState('I'))
joyy[port]-=126;
if (GetAsyncKeyState('K'))
joyy[port]+=126;
*/
std::shared_ptr<XInputGamepadDevice> gamepad = XInputGamepadDevice::GetXInputDevice(port);
if (gamepad != NULL)
gamepad->ReadInput();
for (int port = 0; port < 4; port++)
{
std::shared_ptr<XInputGamepadDevice> gamepad = XInputGamepadDevice::GetXInputDevice(port);
if (gamepad != nullptr)
gamepad->ReadInput();
}
#endif
}

View File

@ -134,8 +134,6 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_screenDpi(JNIEnv *env
screen_dpi = screenDpi;
}
bool egl_makecurrent();
extern int screen_width,screen_height;
float vjoy_pos[15][8];
@ -150,21 +148,14 @@ static ANativeWindow *g_window = 0;
void os_DoEvents()
{
// @@@ Nothing here yet
}
void os_CreateWindow()
{
}
//
// Platform-specific NullDC functions
//
void UpdateInputState(u32 Port)
void UpdateInputState()
{
// @@@ Nothing here yet
}
void common_linux_setup();
@ -339,8 +330,6 @@ JNIEXPORT jint JNICALL Java_com_reicast_emulator_emu_JNIdc_data(JNIEnv *env, job
return 0;
}
extern void egl_stealcntx();
static void *render_thread_func(void *)
{
#ifdef USE_VULKAN
@ -387,19 +376,16 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_rendinitJava(JNIEnv *
{
screen_width = width;
screen_height = height;
// FIXME egl_stealcntx();
rend_init_renderer();
}
JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_rendframeJava(JNIEnv *env,jobject obj)
{
// FIXME egl_stealcntx();
return (jboolean)rend_single_frame();
}
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_rendtermJava(JNIEnv * env, jobject obj)
{
// FIXME egl_stealcntx();
rend_term_renderer();
}

View File

@ -87,7 +87,7 @@ void os_CreateWindow() {
void os_SetupInput() {
}
void UpdateInputState(u32 port) {
void UpdateInputState() {
}

View File

@ -54,9 +54,9 @@ void os_SetWindowText(const char * text) {
void os_DoEvents() {
}
void UpdateInputState(u32 port) {
void UpdateInputState() {
#if defined(USE_SDL)
input_sdl_handle(port);
input_sdl_handle();
#endif
}

View File

@ -24,7 +24,7 @@ void os_SetupInput()
{
}
void UpdateInputState(u32 port)
void UpdateInputState()
{
}