naomi: auto-rotate screen, no widescreen when rot, lightgun as analog

rotate screen for naomi games that need it
disable widescreen when rotating screen
detect lightgun games and enable proper settings
disable model 3 comm board for atomiswave
This commit is contained in:
Flyinghead 2020-04-17 22:11:11 +02:00
parent 3660cf49f4
commit 98b2a32eae
9 changed files with 29 additions and 17 deletions

View File

@ -1848,6 +1848,11 @@ struct maple_naomi_jamma : maple_sega_controller
case JVS::LightGun: case JVS::LightGun:
io_boards.emplace_back(new jvs_namco_jyu(1, this)); io_boards.emplace_back(new jvs_namco_jyu(1, this));
break; break;
case JVS::LightGunAsAnalog:
// Regular board sending lightgun coords as axis 0/1
io_boards.emplace_back(new jvs_837_13551(1, this));
io_boards.back()->lightgun_as_analog = true;
break;
case JVS::Mazan: case JVS::Mazan:
io_boards.emplace_back(new jvs_namco_fcb(1, this)); io_boards.emplace_back(new jvs_namco_fcb(1, this));
io_boards.emplace_back(new jvs_namco_fcb(2, this)); io_boards.emplace_back(new jvs_namco_fcb(2, this));
@ -1868,13 +1873,6 @@ struct maple_naomi_jamma : maple_sega_controller
io_boards.emplace_back(new jvs_namco_v226_pcb(1, this)); io_boards.emplace_back(new jvs_namco_v226_pcb(1, this));
break; break;
} }
if (settings.input.JammaSetup != JVS::Mazan)
for (int bus = 0; bus < MAPLE_PORTS; ++bus)
if ((MapleDeviceType)settings.input.maple_devices[bus] == MDT_LightGun)
{
io_boards.back()->lightgun_as_analog = true;
break;
}
} }
virtual ~maple_naomi_jamma() virtual ~maple_naomi_jamma()
{ {
@ -2678,7 +2676,6 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
LOGJVS("ana "); LOGJVS("ana ");
if (lightgun_as_analog) if (lightgun_as_analog)
{ {
// Death Crimson / Confidential Mission
u16 x = mo_x_abs * 0xFFFF / 639; u16 x = mo_x_abs * 0xFFFF / 639;
u16 y = mo_y_abs * 0xFFFF / 479; u16 y = mo_y_abs * 0xFFFF / 479;
if (mo_x_abs < 0 || mo_x_abs > 639 || mo_y_abs < 0 || mo_y_abs > 479) if (mo_x_abs < 0 || mo_x_abs > 639 || mo_y_abs < 0 || mo_y_abs > 479)

View File

@ -419,7 +419,7 @@ void WriteMem_naomi(u32 address, u32 data, u32 size)
INFO_LOG(NAOMI, "called without cartridge"); INFO_LOG(NAOMI, "called without cartridge");
return; return;
} }
if (address >= NAOMI_COMM2_CTRL_addr && address <= NAOMI_COMM2_STATUS1_addr) if (address >= NAOMI_COMM2_CTRL_addr && address <= NAOMI_COMM2_STATUS1_addr && settings.platform.system == DC_PLATFORM_NAOMI)
m3comm.WriteMem(address, data, size); m3comm.WriteMem(address, data, size);
else else
CurrentCartridge->WriteMem(address, data, size); CurrentCartridge->WriteMem(address, data, size);

View File

@ -56,6 +56,7 @@ u32 RomCacheMapCount;
char naomi_game_id[33]; char naomi_game_id[33];
InputDescriptors *NaomiGameInputs; InputDescriptors *NaomiGameInputs;
u8 *naomi_default_eeprom; u8 *naomi_default_eeprom;
bool naomi_rotate_screen;
extern MemChip *sys_rom; extern MemChip *sys_rom;
@ -355,10 +356,13 @@ static void naomi_cart_LoadZip(const char *filename)
} }
if (naomi_default_eeprom == NULL && game->eeprom_dump != NULL) if (naomi_default_eeprom == NULL && game->eeprom_dump != NULL)
naomi_default_eeprom = game->eeprom_dump; naomi_default_eeprom = game->eeprom_dump;
naomi_rotate_screen = game->rotation_flag == ROT270;
CurrentCartridge->Init(); CurrentCartridge->Init();
strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str()); strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str());
if (naomi_game_id[0] == '\0')
strcpy(naomi_game_id, game->name);
NOTICE_LOG(NAOMI, "NAOMI GAME ID [%s]", naomi_game_id); NOTICE_LOG(NAOMI, "NAOMI GAME ID [%s]", naomi_game_id);
} catch (ReicastException& ex) { } catch (ReicastException& ex) {

View File

@ -97,6 +97,7 @@ int naomi_cart_GetPlatform(const char *path);
extern char naomi_game_id[]; extern char naomi_game_id[];
extern u8 *naomi_default_eeprom; extern u8 *naomi_default_eeprom;
extern bool naomi_rotate_screen;
extern Cartridge *CurrentCartridge; extern Cartridge *CurrentCartridge;

View File

@ -398,13 +398,21 @@ void LoadSpecialSettings()
INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", naomi_game_id); INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", naomi_game_id);
settings.input.JammaSetup = JVS::OutTrigger; settings.input.JammaSetup = JVS::OutTrigger;
} }
else if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
{ {
INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", naomi_game_id); INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", naomi_game_id);
settings.rend.TranslucentPolygonDepthMask = true; settings.rend.TranslucentPolygonDepthMask = true;
tr_poly_depth_mask_game = true; tr_poly_depth_mask_game = true;
} }
else if (!strcmp(naomi_game_id, "THE MAZE OF THE KINGS")
|| !strcmp(naomi_game_id, " CONFIDENTIAL MISSION ---------")
|| !strcmp(naomi_game_id, "DEATH CRIMSON OX")
|| !strncmp(naomi_game_id, "hotd2", 5)) // House of the Dead 2
{
INFO_LOG(BOOT, "Enabling lightgun as analog setup for game %s", naomi_game_id);
settings.input.JammaSetup = JVS::LightGunAsAnalog;
}
settings.rend.Rotate90 = naomi_rotate_screen;
} }
} }
@ -800,7 +808,7 @@ void InitSettings()
settings.dispmanx.Keep_Aspect = true; settings.dispmanx.Keep_Aspect = true;
#endif #endif
#if HOST_OS != OS_LINUX || defined(__ANDROID__) || defined(TARGET_PANDORA) #if defined(__ANDROID__) || defined(TARGET_PANDORA)
settings.aica.BufferSize = 5644; // 128 ms settings.aica.BufferSize = 5644; // 128 ms
#else #else
settings.aica.BufferSize = 2822; // 64 ms settings.aica.BufferSize = 2822; // 64 ms
@ -1021,7 +1029,8 @@ void SaveSettings()
cfgSaveInt("config", "rend.ScreenStretching", settings.rend.ScreenStretching); cfgSaveInt("config", "rend.ScreenStretching", settings.rend.ScreenStretching);
cfgSaveBool("config", "rend.Fog", settings.rend.Fog); cfgSaveBool("config", "rend.Fog", settings.rend.Fog);
cfgSaveBool("config", "rend.FloatVMUs", settings.rend.FloatVMUs); cfgSaveBool("config", "rend.FloatVMUs", settings.rend.FloatVMUs);
cfgSaveBool("config", "rend.Rotate90", settings.rend.Rotate90); if (!naomi_rotate_screen || !settings.rend.Rotate90)
cfgSaveBool("config", "rend.Rotate90", settings.rend.Rotate90);
cfgSaveInt("config", "ta.skip", settings.pvr.ta_skip); cfgSaveInt("config", "ta.skip", settings.pvr.ta_skip);
cfgSaveInt("config", "pvr.rend", settings.pvr.rend); cfgSaveInt("config", "pvr.rend", settings.pvr.rend);
cfgSaveBool("config", "rend.PerStripSorting", settings.rend.PerStripSorting); cfgSaveBool("config", "rend.PerStripSorting", settings.rend.PerStripSorting);

View File

@ -751,7 +751,7 @@ static bool RenderFrame()
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(struct PolyParam) * pvrrc.global_param_tr.used(), pvrrc.global_param_tr.head(), GL_STATIC_DRAW); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(struct PolyParam) * pvrrc.global_param_tr.used(), pvrrc.global_param_tr.head(), GL_STATIC_DRAW);
glCheck(); glCheck();
if (is_rtt || !settings.rend.WideScreen || matrices.IsClipped()) if (is_rtt || !settings.rend.WideScreen || matrices.IsClipped() || settings.rend.Rotate90)
{ {
float width; float width;
float height; float height;

View File

@ -1140,7 +1140,7 @@ bool RenderFrame()
} }
} }
bool wide_screen_on = !is_rtt && settings.rend.WideScreen && !matrices.IsClipped(); bool wide_screen_on = !is_rtt && settings.rend.WideScreen && !matrices.IsClipped() && !settings.rend.Rotate90;
//Color is cleared by the background plane //Color is cleared by the background plane

View File

@ -101,7 +101,7 @@ TileClipping BaseDrawer::SetTileClip(u32 val, vk::Rect2D& clipRect)
void BaseDrawer::SetBaseScissor() void BaseDrawer::SetBaseScissor()
{ {
bool wide_screen_on = settings.rend.WideScreen && !pvrrc.isRenderFramebuffer bool wide_screen_on = settings.rend.WideScreen && !pvrrc.isRenderFramebuffer
&& !matrices.IsClipped(); && !matrices.IsClipped() && !settings.rend.Rotate90;
if (!wide_screen_on) if (!wide_screen_on)
{ {
if (pvrrc.isRenderFramebuffer) if (pvrrc.isRenderFramebuffer)

View File

@ -389,7 +389,8 @@ enum class JVS {
WorldKicks, WorldKicks,
WorldKicksPCB, WorldKicksPCB,
Keyboard, Keyboard,
OutTrigger OutTrigger,
LightGunAsAnalog,
}; };
struct settings_t struct settings_t