2013-12-19 17:10:14 +00:00
|
|
|
#include "maple_cfg.h"
|
2020-03-28 16:58:01 +00:00
|
|
|
#include "maple_helper.h"
|
|
|
|
#include "maple_if.h"
|
2019-04-06 17:36:57 +00:00
|
|
|
#include "hw/naomi/naomi_cart.h"
|
2021-03-01 09:13:40 +00:00
|
|
|
#include "cfg/option.h"
|
2021-10-16 15:56:21 +00:00
|
|
|
#include "stdclass.h"
|
2021-11-13 14:56:42 +00:00
|
|
|
#include "serialize.h"
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2021-09-11 16:50:11 +00:00
|
|
|
MapleInputState mapleInputState[4];
|
2021-11-13 14:56:42 +00:00
|
|
|
extern bool maple_ddt_pending_reset;
|
|
|
|
extern std::vector<std::pair<u32, std::vector<u32>>> mapleDmaOut;
|
2021-09-02 15:51:23 +00:00
|
|
|
|
2021-10-19 14:56:46 +00:00
|
|
|
void (*MapleConfigMap::UpdateVibration)(u32 port, float power, float inclination, u32 duration_ms);
|
|
|
|
|
2020-12-02 13:40:50 +00:00
|
|
|
static u8 GetBtFromSgn(s8 val)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
|
|
|
return val+128;
|
|
|
|
}
|
|
|
|
|
2020-12-02 13:40:50 +00:00
|
|
|
u32 awave_button_mapping[32] = {
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_BTN2_KEY, // DC_BTN_C
|
2019-04-06 17:36:57 +00:00
|
|
|
AWAVE_BTN1_KEY, // DC_BTN_B
|
|
|
|
AWAVE_BTN0_KEY, // DC_BTN_A
|
|
|
|
AWAVE_START_KEY, // DC_BTN_START
|
|
|
|
AWAVE_UP_KEY, // DC_DPAD_UP
|
|
|
|
AWAVE_DOWN_KEY, // DC_DPAD_DOWN
|
|
|
|
AWAVE_LEFT_KEY, // DC_DPAD_LEFT
|
|
|
|
AWAVE_RIGHT_KEY, // DC_DPAD_RIGHT
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_BTN4_KEY, // DC_BTN_Z (duplicated)
|
|
|
|
AWAVE_BTN4_KEY, // DC_BTN_Y
|
|
|
|
AWAVE_BTN3_KEY, // DC_BTN_X
|
2019-04-06 17:36:57 +00:00
|
|
|
AWAVE_COIN_KEY, // DC_BTN_D
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_SERVICE_KEY, // DC_DPAD2_UP
|
|
|
|
AWAVE_TEST_KEY, // DC_DPAD2_DOWN
|
2020-11-30 20:31:50 +00:00
|
|
|
0, // DC_DPAD2_LEFT
|
|
|
|
0, // DC_DPAD2_RIGHT
|
|
|
|
};
|
|
|
|
|
2020-12-02 13:40:50 +00:00
|
|
|
u32 awavelg_button_mapping[32] = {
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_BTN1_KEY, // DC_BTN_C
|
2020-11-30 20:31:50 +00:00
|
|
|
AWAVE_BTN0_KEY, // DC_BTN_B
|
|
|
|
AWAVE_TRIGGER_KEY, // DC_BTN_A
|
|
|
|
AWAVE_START_KEY, // DC_BTN_START
|
|
|
|
AWAVE_UP_KEY, // DC_DPAD_UP
|
|
|
|
AWAVE_DOWN_KEY, // DC_DPAD_DOWN
|
|
|
|
AWAVE_LEFT_KEY, // DC_DPAD_LEFT
|
|
|
|
AWAVE_RIGHT_KEY, // DC_DPAD_RIGHT
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_BTN4_KEY, // DC_BTN_Z
|
|
|
|
AWAVE_BTN3_KEY, // DC_BTN_Y
|
|
|
|
AWAVE_BTN2_KEY, // DC_BTN_X
|
2020-11-30 20:31:50 +00:00
|
|
|
AWAVE_COIN_KEY, // DC_BTN_D
|
2021-09-19 16:27:21 +00:00
|
|
|
AWAVE_SERVICE_KEY, // DC_DPAD2_UP
|
|
|
|
AWAVE_TEST_KEY, // DC_DPAD2_DOWN
|
2020-11-30 20:31:50 +00:00
|
|
|
0, // DC_DPAD2_LEFT
|
|
|
|
0, // DC_DPAD2_RIGHT
|
2020-12-02 13:40:50 +00:00
|
|
|
|
|
|
|
AWAVE_BTN0_KEY // DC_BTN_RELOAD (not needed for AW, mapped to BTN0 = pump)
|
2019-04-06 17:36:57 +00:00
|
|
|
};
|
|
|
|
|
2021-01-21 20:00:46 +00:00
|
|
|
inline u32 MapleConfigMap::playerNum()
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2021-01-22 14:11:04 +00:00
|
|
|
return dev->player_num;
|
2021-01-21 20:00:46 +00:00
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2021-01-21 20:00:46 +00:00
|
|
|
void MapleConfigMap::SetVibration(float power, float inclination, u32 duration_ms)
|
|
|
|
{
|
|
|
|
UpdateVibration(playerNum(), power, inclination, duration_ms);
|
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2021-01-21 20:00:46 +00:00
|
|
|
void MapleConfigMap::GetInput(PlainJoystickState* pjs)
|
|
|
|
{
|
2021-09-19 16:27:21 +00:00
|
|
|
const MapleInputState& inputState = mapleInputState[playerNum()];
|
2021-01-21 20:00:46 +00:00
|
|
|
|
|
|
|
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
|
2015-12-08 00:21:03 +00:00
|
|
|
{
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->kcode = inputState.kcode;
|
|
|
|
pjs->joy[PJAI_X1] = GetBtFromSgn(inputState.fullAxes[PJAI_X1]);
|
|
|
|
pjs->joy[PJAI_Y1] = GetBtFromSgn(inputState.fullAxes[PJAI_Y1]);
|
|
|
|
pjs->trigger[PJTI_R] = inputState.halfAxes[PJTI_R];
|
|
|
|
pjs->trigger[PJTI_L] = inputState.halfAxes[PJTI_L];
|
2015-12-08 00:21:03 +00:00
|
|
|
}
|
2021-01-21 20:00:46 +00:00
|
|
|
else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2021-07-05 17:44:08 +00:00
|
|
|
#ifdef LIBRETRO
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->kcode = inputState.kcode;
|
2021-07-05 17:44:08 +00:00
|
|
|
#else
|
2021-01-21 20:00:46 +00:00
|
|
|
const u32* mapping = settings.input.JammaSetup == JVS::LightGun ? awavelg_button_mapping : awave_button_mapping;
|
|
|
|
pjs->kcode = ~0;
|
|
|
|
for (u32 i = 0; i < ARRAY_SIZE(awave_button_mapping); i++)
|
2019-04-06 17:36:57 +00:00
|
|
|
{
|
2021-09-11 16:50:11 +00:00
|
|
|
if ((inputState.kcode & (1 << i)) == 0)
|
2021-01-21 20:00:46 +00:00
|
|
|
pjs->kcode &= ~mapping[i];
|
2019-04-06 17:36:57 +00:00
|
|
|
}
|
2021-07-05 17:44:08 +00:00
|
|
|
#endif
|
2021-01-21 20:00:46 +00:00
|
|
|
if (NaomiGameInputs != NULL)
|
2019-04-06 17:36:57 +00:00
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
for (u32 axis = 0; axis < PJAI_Count; axis++)
|
2019-07-09 21:52:19 +00:00
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
if (NaomiGameInputs->axes[axis].name != NULL)
|
2020-12-02 13:40:50 +00:00
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
if (NaomiGameInputs->axes[axis].type == Full)
|
2020-12-02 13:40:50 +00:00
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
switch (NaomiGameInputs->axes[axis].axis)
|
2020-12-02 13:40:50 +00:00
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
case 0:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = GetBtFromSgn(inputState.fullAxes[PJAI_X1]);
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = GetBtFromSgn(inputState.fullAxes[PJAI_Y1]);
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = GetBtFromSgn(inputState.fullAxes[PJAI_X2]);
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
case 3:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = GetBtFromSgn(inputState.fullAxes[PJAI_Y2]);
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
pjs->joy[axis] = 0x80;
|
|
|
|
break;
|
2020-12-02 13:40:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-01-21 20:00:46 +00:00
|
|
|
switch (NaomiGameInputs->axes[axis].axis)
|
|
|
|
{
|
|
|
|
case 4:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = inputState.halfAxes[PJTI_R];
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
case 5:
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[axis] = inputState.halfAxes[PJTI_L];
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
default:
|
2021-09-19 16:27:21 +00:00
|
|
|
pjs->joy[axis] = 0;
|
2021-01-21 20:00:46 +00:00
|
|
|
break;
|
|
|
|
}
|
2020-12-02 13:40:50 +00:00
|
|
|
}
|
2021-01-21 20:00:46 +00:00
|
|
|
if (NaomiGameInputs->axes[axis].inverted)
|
|
|
|
pjs->joy[axis] = pjs->joy[axis] == 0 ? 0xff : 0x100 - pjs->joy[axis];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pjs->joy[axis] = 0x80;
|
2020-12-02 13:40:50 +00:00
|
|
|
}
|
2019-07-09 21:52:19 +00:00
|
|
|
}
|
2019-04-06 17:36:57 +00:00
|
|
|
}
|
2021-01-21 20:00:46 +00:00
|
|
|
else
|
|
|
|
{
|
2021-09-11 16:50:11 +00:00
|
|
|
pjs->joy[PJAI_X1] = GetBtFromSgn(inputState.fullAxes[PJAI_X1]);
|
|
|
|
pjs->joy[PJAI_Y1] = GetBtFromSgn(inputState.fullAxes[PJAI_Y1]);
|
|
|
|
pjs->joy[PJAI_X2] = inputState.halfAxes[PJTI_R];
|
|
|
|
pjs->joy[PJAI_Y2] = inputState.halfAxes[PJTI_L];
|
2021-01-21 20:00:46 +00:00
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
2021-01-21 20:00:46 +00:00
|
|
|
}
|
|
|
|
void MapleConfigMap::SetImage(u8 *img)
|
|
|
|
{
|
|
|
|
push_vmu_screen(dev->bus_id, dev->bus_port, img);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MapleConfigMap::GetAbsCoordinates(int& x, int& y)
|
|
|
|
{
|
2021-09-26 19:28:31 +00:00
|
|
|
const MapleInputState& inputState = mapleInputState[playerNum()];
|
2021-10-19 14:56:46 +00:00
|
|
|
x = inputState.absPos.x;
|
|
|
|
y = inputState.absPos.y;
|
2021-01-21 20:00:46 +00:00
|
|
|
}
|
|
|
|
|
2021-05-19 09:32:38 +00:00
|
|
|
void MapleConfigMap::GetMouseInput(u8& buttons, int& x, int& y, int& wheel)
|
2021-01-21 20:00:46 +00:00
|
|
|
{
|
2021-10-19 14:56:46 +00:00
|
|
|
const MapleInputState& inputState = mapleInputState[playerNum()];
|
|
|
|
buttons = inputState.mouseButtons;
|
|
|
|
x = inputState.relPos.x;
|
|
|
|
y = inputState.relPos.y * (invertMouseY ? -1 : 1);
|
|
|
|
wheel = inputState.relPos.wheel;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MapleConfigMap::GetKeyboardInput(u8& shift, u8 keys[6])
|
|
|
|
{
|
|
|
|
const MapleInputState& inputState = mapleInputState[playerNum()];
|
|
|
|
shift = inputState.keyboard.shift;
|
|
|
|
memcpy(keys, inputState.keyboard.key, sizeof(inputState.keyboard.key));
|
2021-01-21 20:00:46 +00:00
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2019-04-06 17:36:57 +00:00
|
|
|
bool maple_atomiswave_coin_chute(int slot)
|
|
|
|
{
|
2021-07-07 07:48:10 +00:00
|
|
|
#ifdef LIBRETRO
|
2021-09-11 16:50:11 +00:00
|
|
|
return mapleInputState[slot].kcode & AWAVE_COIN_KEY;
|
2021-07-07 07:48:10 +00:00
|
|
|
#else
|
2019-04-06 17:36:57 +00:00
|
|
|
for (int i = 0; i < 16; i++)
|
|
|
|
{
|
2021-09-11 16:50:11 +00:00
|
|
|
if ((mapleInputState[slot].kcode & (1 << i)) == 0 && awave_button_mapping[i] == AWAVE_COIN_KEY)
|
2019-04-06 17:36:57 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2021-07-07 07:48:10 +00:00
|
|
|
#endif
|
2019-04-06 17:36:57 +00:00
|
|
|
}
|
|
|
|
|
2021-07-09 12:34:11 +00:00
|
|
|
static void mcfg_Create(MapleDeviceType type, u32 bus, u32 port, s32 player_num = -1)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2021-03-28 09:10:46 +00:00
|
|
|
delete MapleDevices[bus][port];
|
2018-08-13 11:00:24 +00:00
|
|
|
maple_device* dev = maple_Create(type);
|
2021-01-22 14:11:04 +00:00
|
|
|
dev->Setup(maple_GetAddress(bus, port), player_num);
|
|
|
|
dev->config = new MapleConfigMap(dev);
|
2013-12-19 17:10:14 +00:00
|
|
|
dev->OnSetup();
|
2018-08-13 11:00:24 +00:00
|
|
|
MapleDevices[bus][port] = dev;
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
|
2021-10-16 15:56:21 +00:00
|
|
|
static void createNaomiDevices()
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2019-07-09 21:52:19 +00:00
|
|
|
mcfg_DestroyDevices();
|
2018-08-20 11:36:34 +00:00
|
|
|
mcfg_Create(MDT_NaomiJamma, 0, 5);
|
2020-03-23 13:09:50 +00:00
|
|
|
if (settings.input.JammaSetup == JVS::Keyboard)
|
2021-10-19 14:56:46 +00:00
|
|
|
{
|
2021-07-09 12:34:11 +00:00
|
|
|
mcfg_Create(MDT_Keyboard, 1, 5, 0);
|
2021-10-19 14:56:46 +00:00
|
|
|
mcfg_Create(MDT_Keyboard, 2, 5, 1);
|
|
|
|
}
|
2020-03-23 16:48:43 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// Connect VMU B1
|
|
|
|
mcfg_Create(MDT_SegaController, 1, 5);
|
|
|
|
mcfg_Create(MDT_SegaVMU, 1, 0);
|
2020-03-24 22:22:57 +00:00
|
|
|
// Connect VMU C1
|
|
|
|
mcfg_Create(MDT_SegaController, 2, 5);
|
|
|
|
mcfg_Create(MDT_SegaVMU, 2, 0);
|
2020-03-23 16:48:43 +00:00
|
|
|
}
|
2018-08-20 11:36:34 +00:00
|
|
|
}
|
|
|
|
|
2021-10-16 15:56:21 +00:00
|
|
|
static void createAtomiswaveDevices()
|
2018-11-07 22:27:32 +00:00
|
|
|
{
|
2019-07-09 21:52:19 +00:00
|
|
|
mcfg_DestroyDevices();
|
2018-11-09 12:22:27 +00:00
|
|
|
// Looks like two controllers needs to be on bus 0 and 1 for digital inputs
|
|
|
|
// Then other devices on port 2 and 3 for analog axes, light guns, ...
|
2018-11-07 22:27:32 +00:00
|
|
|
mcfg_Create(MDT_SegaController, 0, 5);
|
2018-11-09 12:22:27 +00:00
|
|
|
mcfg_Create(MDT_SegaController, 1, 5);
|
2019-04-06 17:36:57 +00:00
|
|
|
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[0].name != NULL)
|
|
|
|
{
|
|
|
|
// Game needs analog axes
|
|
|
|
mcfg_Create(MDT_SegaController, 2, 5, 0);
|
|
|
|
mcfg_Create(MDT_SegaController, 3, 5, 1);
|
2019-04-08 17:14:55 +00:00
|
|
|
// Faster Than Speed needs 1 std controller on port 0 (digital inputs) and one on port 2 (analog axes)
|
|
|
|
// Maximum Speed same
|
|
|
|
}
|
2020-03-23 13:09:50 +00:00
|
|
|
else if (settings.input.JammaSetup == JVS::FourPlayers)
|
2019-04-08 17:14:55 +00:00
|
|
|
{
|
|
|
|
// 4 players
|
|
|
|
mcfg_Create(MDT_SegaController, 2, 5);
|
|
|
|
mcfg_Create(MDT_SegaController, 3, 5);
|
|
|
|
}
|
2020-03-23 13:09:50 +00:00
|
|
|
else if (settings.input.JammaSetup == JVS::LightGun)
|
2019-04-08 17:14:55 +00:00
|
|
|
{
|
|
|
|
// Clay Challenge needs 2 std controllers on port 0 & 1 (digital in) and light guns on port 2 & 3
|
|
|
|
// Sports Shooting same
|
|
|
|
mcfg_Create(MDT_LightGun, 2, 5, 0);
|
|
|
|
mcfg_Create(MDT_LightGun, 3, 5, 1);
|
|
|
|
}
|
2020-03-23 16:48:43 +00:00
|
|
|
else if (settings.input.JammaSetup == JVS::SegaMarineFishing || settings.input.JammaSetup == JVS::RotaryEncoders)
|
2019-04-08 17:14:55 +00:00
|
|
|
{
|
|
|
|
// Sega Bass Fishing Challenge needs a mouse (track-ball) on port 2
|
2021-01-21 20:00:46 +00:00
|
|
|
// Waiwai drive needs two track-balls
|
2019-04-08 17:14:55 +00:00
|
|
|
mcfg_Create(MDT_Mouse, 2, 5, 0);
|
2021-01-21 20:00:46 +00:00
|
|
|
mcfg_Create(MDT_Mouse, 3, 5, 1);
|
2021-10-19 14:56:46 +00:00
|
|
|
if (settings.content.gameId == "DRIVE")
|
|
|
|
{
|
|
|
|
MapleDevices[2][5]->config->invertMouseY = true;
|
|
|
|
MapleDevices[3][5]->config->invertMouseY = true;
|
|
|
|
}
|
2019-04-06 17:36:57 +00:00
|
|
|
}
|
2018-11-07 22:27:32 +00:00
|
|
|
}
|
2018-08-20 11:36:34 +00:00
|
|
|
|
2021-10-16 15:56:21 +00:00
|
|
|
static void createDreamcastDevices()
|
2018-08-16 08:20:42 +00:00
|
|
|
{
|
2019-02-12 10:30:24 +00:00
|
|
|
for (int bus = 0; bus < MAPLE_PORTS; ++bus)
|
|
|
|
{
|
2021-03-01 09:13:40 +00:00
|
|
|
switch (config::MapleMainDevices[bus])
|
2019-02-12 10:30:24 +00:00
|
|
|
{
|
|
|
|
case MDT_SegaController:
|
|
|
|
mcfg_Create(MDT_SegaController, bus, 5);
|
2021-03-01 09:13:40 +00:00
|
|
|
if (config::MapleExpansionDevices[bus][0] != MDT_None)
|
|
|
|
mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0);
|
|
|
|
if (config::MapleExpansionDevices[bus][1] != MDT_None)
|
|
|
|
mcfg_Create(config::MapleExpansionDevices[bus][1], bus, 1);
|
2019-02-12 10:30:24 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MDT_Keyboard:
|
|
|
|
mcfg_Create(MDT_Keyboard, bus, 5);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MDT_Mouse:
|
|
|
|
mcfg_Create(MDT_Mouse, bus, 5);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MDT_LightGun:
|
|
|
|
mcfg_Create(MDT_LightGun, bus, 5);
|
2021-03-01 09:13:40 +00:00
|
|
|
if (config::MapleExpansionDevices[bus][0] != MDT_None)
|
|
|
|
mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0);
|
2019-02-12 10:30:24 +00:00
|
|
|
break;
|
2019-07-12 17:18:39 +00:00
|
|
|
|
|
|
|
case MDT_TwinStick:
|
|
|
|
mcfg_Create(MDT_TwinStick, bus, 5);
|
2021-03-01 09:13:40 +00:00
|
|
|
if (config::MapleExpansionDevices[bus][0] != MDT_None)
|
|
|
|
mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0);
|
2019-07-12 17:18:39 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MDT_AsciiStick:
|
|
|
|
mcfg_Create(MDT_AsciiStick, bus, 5);
|
2021-03-01 09:13:40 +00:00
|
|
|
if (config::MapleExpansionDevices[bus][0] != MDT_None)
|
|
|
|
mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0);
|
2019-07-12 17:18:39 +00:00
|
|
|
break;
|
|
|
|
|
2019-07-13 13:30:10 +00:00
|
|
|
case MDT_None:
|
|
|
|
break;
|
|
|
|
|
2019-07-12 15:53:17 +00:00
|
|
|
default:
|
2021-03-01 09:13:40 +00:00
|
|
|
WARN_LOG(MAPLE, "Invalid device type %d for port %d", (MapleDeviceType)config::MapleMainDevices[bus], bus);
|
2019-07-12 15:53:17 +00:00
|
|
|
break;
|
2019-02-12 10:30:24 +00:00
|
|
|
}
|
|
|
|
}
|
2015-08-09 04:34:02 +00:00
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2021-10-16 15:56:21 +00:00
|
|
|
static void vmuDigest()
|
|
|
|
{
|
|
|
|
if (!config::GGPOEnable)
|
|
|
|
return;
|
|
|
|
MD5Sum md5;
|
|
|
|
for (int i = 0; i < MAPLE_PORTS; i++)
|
|
|
|
for (int j = 0; j < 6; j++)
|
|
|
|
{
|
|
|
|
const maple_device* device = MapleDevices[i][j];
|
|
|
|
if (device != nullptr)
|
|
|
|
{
|
|
|
|
size_t size;
|
|
|
|
const void *data = device->getData(size);
|
|
|
|
if (data != nullptr)
|
|
|
|
md5.add(data, size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
md5.getDigest(settings.network.md5.vmu);
|
|
|
|
}
|
|
|
|
|
|
|
|
void mcfg_CreateDevices()
|
|
|
|
{
|
|
|
|
switch (settings.platform.system)
|
|
|
|
{
|
|
|
|
case DC_PLATFORM_DREAMCAST:
|
|
|
|
createDreamcastDevices();
|
|
|
|
break;
|
|
|
|
case DC_PLATFORM_NAOMI:
|
|
|
|
createNaomiDevices();
|
|
|
|
break;
|
|
|
|
case DC_PLATFORM_ATOMISWAVE:
|
|
|
|
createAtomiswaveDevices();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
die("Unknown system");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
vmuDigest();
|
|
|
|
}
|
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
void mcfg_DestroyDevices()
|
|
|
|
{
|
2018-09-29 14:13:07 +00:00
|
|
|
for (int i = 0; i < MAPLE_PORTS; i++)
|
2014-01-03 17:32:32 +00:00
|
|
|
for (int j=0;j<=5;j++)
|
2018-09-29 14:13:07 +00:00
|
|
|
{
|
2018-10-29 15:31:44 +00:00
|
|
|
if (MapleDevices[i][j] != NULL)
|
|
|
|
{
|
|
|
|
delete MapleDevices[i][j];
|
|
|
|
MapleDevices[i][j] = NULL;
|
|
|
|
}
|
2018-09-29 14:13:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-13 14:56:42 +00:00
|
|
|
void mcfg_SerializeDevices(Serializer& ser)
|
2018-09-29 14:13:07 +00:00
|
|
|
{
|
2021-11-13 14:56:42 +00:00
|
|
|
ser << maple_ddt_pending_reset;
|
|
|
|
ser << (u32)mapleDmaOut.size();
|
|
|
|
for (const auto& pair : mapleDmaOut)
|
|
|
|
{
|
|
|
|
ser << pair.first; // u32 address
|
|
|
|
ser << (u32)pair.second.size();
|
|
|
|
ser.serialize(pair.second.data(), pair.second.size());
|
|
|
|
}
|
2018-09-29 14:13:07 +00:00
|
|
|
for (int i = 0; i < MAPLE_PORTS; i++)
|
|
|
|
for (int j = 0; j < 6; j++)
|
|
|
|
{
|
2021-01-22 14:11:04 +00:00
|
|
|
u8 deviceType = MDT_None;
|
|
|
|
maple_device* device = MapleDevices[i][j];
|
|
|
|
if (device != nullptr)
|
|
|
|
deviceType = device->get_device_type();
|
2021-11-13 14:56:42 +00:00
|
|
|
ser << deviceType;
|
2021-01-22 14:11:04 +00:00
|
|
|
if (device != nullptr)
|
2021-11-13 14:56:42 +00:00
|
|
|
device->serialize(ser);
|
2018-09-29 14:13:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-13 14:56:42 +00:00
|
|
|
void mcfg_DeserializeDevices(Deserializer& deser)
|
2018-09-29 14:13:07 +00:00
|
|
|
{
|
|
|
|
mcfg_DestroyDevices();
|
2021-11-13 14:56:42 +00:00
|
|
|
u8 eeprom[sizeof(maple_naomi_jamma::eeprom)];
|
|
|
|
if (deser.version() < Deserializer::V23)
|
|
|
|
{
|
|
|
|
deser >> eeprom;
|
|
|
|
deser.skip(128); // Unused eeprom space
|
|
|
|
deser.skip<bool>(); // EEPROM_loaded
|
|
|
|
}
|
|
|
|
deser >> maple_ddt_pending_reset;
|
|
|
|
mapleDmaOut.clear();
|
|
|
|
if (deser.version() >= Deserializer::V23)
|
|
|
|
{
|
|
|
|
u32 size;
|
|
|
|
deser >> size;
|
|
|
|
for (u32 i = 0; i < size; i++)
|
|
|
|
{
|
|
|
|
u32 address;
|
|
|
|
deser >> address;
|
|
|
|
u32 dataSize;
|
|
|
|
deser >> dataSize;
|
|
|
|
mapleDmaOut.emplace_back(address, std::vector<u32>(dataSize));
|
|
|
|
deser.deserialize(mapleDmaOut.back().second.data(), dataSize);
|
|
|
|
}
|
|
|
|
}
|
2018-09-29 14:13:07 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < MAPLE_PORTS; i++)
|
|
|
|
for (int j = 0; j < 6; j++)
|
|
|
|
{
|
2021-01-22 14:11:04 +00:00
|
|
|
u8 deviceType;
|
2021-11-13 14:56:42 +00:00
|
|
|
deser >> deviceType;
|
2021-01-22 14:11:04 +00:00
|
|
|
if (deviceType != MDT_None)
|
2018-09-29 14:13:07 +00:00
|
|
|
{
|
2021-01-22 14:11:04 +00:00
|
|
|
mcfg_Create((MapleDeviceType)deviceType, i, j);
|
2021-11-13 14:56:42 +00:00
|
|
|
MapleDevices[i][j]->deserialize(deser);
|
2018-09-29 14:13:07 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-13 14:56:42 +00:00
|
|
|
if (deser.version() < Deserializer::V23 && EEPROM != nullptr)
|
|
|
|
memcpy(EEPROM, eeprom, sizeof(eeprom));
|
2014-01-03 17:32:32 +00:00
|
|
|
}
|