flycast/core/hw/maple/maple_cfg.cpp

261 lines
6.5 KiB
C++

#include "types.h"
#include "maple_if.h"
#include "maple_helper.h"
#include "maple_devs.h"
#include "maple_cfg.h"
#include "cfg/cfg.h"
#include "hw/naomi/naomi_cart.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);
extern u16 kcode[4];
extern u32 vks[4];
extern s8 joyx[4],joyy[4];
extern u8 rt[4],lt[4];
u8 GetBtFromSgn(s8 val)
{
return val+128;
}
u32 awave_button_mapping[] = {
AWAVE_SERVICE_KEY, // DC_BTN_C
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
AWAVE_TEST_KEY, // DC_BTN_Z
AWAVE_BTN3_KEY, // DC_BTN_Y
AWAVE_BTN2_KEY, // DC_BTN_X
AWAVE_COIN_KEY, // DC_BTN_D
// DC_DPAD2_UP
// DC_DPAD2_DOWN
// DC_DPAD2_LEFT
// DC_DPAD2_RIGHT
};
struct MapleConfigMap : IMapleConfigMap
{
maple_device* dev;
s32 player_num;
MapleConfigMap(maple_device* dev, s32 player_num = -1)
{
this->dev=dev;
this->player_num = player_num;
}
void SetVibration(float power, float inclination, u32 duration_ms)
{
int player_num = this->player_num == -1 ? dev->bus_id : this->player_num;
UpdateVibration(player_num, power, inclination, duration_ms);
}
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 DC_PLATFORM == DC_PLATFORM_DREAMCAST
pjs->kcode |= 0xF901; // mask off DPad2, C, D and Z
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];
#elif DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
pjs->kcode = 0xFFFF;
for (int i = 0; i < 16; i++)
{
if ((kcode[player_num] & (1 << i)) == 0)
pjs->kcode &= ~awave_button_mapping[i];
}
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[1].name != NULL && NaomiGameInputs->axes[1].type == Half)
{
// 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];
}
else
{
pjs->joy[PJAI_Y1] = GetBtFromSgn(joyy[player_num]);
pjs->joy[PJAI_X2] = rt[player_num];
pjs->joy[PJAI_Y2] = lt[player_num];
}
#endif
}
void SetImage(void* img)
{
//?
}
};
bool maple_atomiswave_coin_chute(int slot)
{
for (int i = 0; i < 16; i++)
{
if ((kcode[slot] & (1 << i)) == 0 && awave_button_mapping[i] == AWAVE_COIN_KEY)
return true;
}
return false;
}
void mcfg_Create(MapleDeviceType type, u32 bus, u32 port, s32 player_num = -1)
{
if (MapleDevices[bus][port] != NULL)
delete MapleDevices[bus][port];
maple_device* dev = maple_Create(type);
dev->Setup(maple_GetAddress(bus, port));
dev->config = new MapleConfigMap(dev, player_num);
dev->OnSetup();
MapleDevices[bus][port] = dev;
}
void mcfg_CreateNAOMIJamma()
{
mcfg_Create(MDT_NaomiJamma, 0, 5);
// mcfg_Create(MDT_Keyboard, 2, 5);
}
void mcfg_CreateAtomisWaveControllers()
{
// 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, ...
mcfg_Create(MDT_SegaController, 0, 5);
mcfg_Create(MDT_SegaController, 1, 5);
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);
// Faster Than Speed needs 1 std controller on port 0 (digital inputs) and one on port 2 (analog axes)
// Maximum Speed same
}
else if (settings.input.JammaSetup == 1)
{
// 4 players
mcfg_Create(MDT_SegaController, 2, 5);
mcfg_Create(MDT_SegaController, 3, 5);
}
else if (settings.input.JammaSetup == 5)
{
// 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);
}
else if (settings.input.JammaSetup == 3)
{
// Sega Bass Fishing Challenge needs a mouse (track-ball) on port 2
mcfg_Create(MDT_Mouse, 2, 5, 0);
}
}
void mcfg_CreateDevices()
{
for (int bus = 0; bus < MAPLE_PORTS; ++bus)
{
switch ((MapleDeviceType)settings.input.maple_devices[bus])
{
case MDT_SegaController:
mcfg_Create(MDT_SegaController, bus, 5);
if (settings.input.maple_expansion_devices[bus][0] != MDT_None)
mcfg_Create((MapleDeviceType)settings.input.maple_expansion_devices[bus][0], bus, 0);
if (settings.input.maple_expansion_devices[bus][1] != MDT_None)
mcfg_Create((MapleDeviceType)settings.input.maple_expansion_devices[bus][1], bus, 1);
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);
if (settings.input.maple_expansion_devices[bus][0] != MDT_None)
mcfg_Create((MapleDeviceType)settings.input.maple_expansion_devices[bus][0], bus, 0);
break;
}
}
}
void mcfg_DestroyDevices()
{
for (int i = 0; i < MAPLE_PORTS; i++)
for (int j=0;j<=5;j++)
{
if (MapleDevices[i][j] != NULL)
{
delete MapleDevices[i][j];
MapleDevices[i][j] = NULL;
}
}
}
void mcfg_SerializeDevices(void **data, unsigned int *total_size)
{
for (int i = 0; i < MAPLE_PORTS; i++)
for (int j = 0; j < 6; j++)
{
u8 **p = (u8 **)data;
if (MapleDevices[i][j] != NULL)
{
if (*p != NULL)
{
**p = MapleDevices[i][j]->get_device_type();
*p = *p + 1;
}
MapleDevices[i][j]->maple_serialize(data, total_size);
}
else if (*p != NULL)
{
**p = MDT_None;
*p = *p + 1;
}
*total_size = *total_size + 1;
}
}
void mcfg_UnserializeDevices(void **data, unsigned int *total_size)
{
mcfg_DestroyDevices();
for (int i = 0; i < MAPLE_PORTS; i++)
for (int j = 0; j < 6; j++)
{
u8 **p = (u8 **)data;
MapleDeviceType device_type = (MapleDeviceType)**p;
*p = *p + 1;
*total_size = *total_size + 1;
if (device_type != MDT_None)
{
mcfg_Create(device_type, i, j);
MapleDevices[i][j]->maple_unserialize(data, total_size);
}
}
}