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:
io_boards.emplace_back(new jvs_namco_jyu(1, this));
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:
io_boards.emplace_back(new jvs_namco_fcb(1, 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));
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()
{
@ -2678,7 +2676,6 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
LOGJVS("ana ");
if (lightgun_as_analog)
{
// Death Crimson / Confidential Mission
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)

View File

@ -419,7 +419,7 @@ void WriteMem_naomi(u32 address, u32 data, u32 size)
INFO_LOG(NAOMI, "called without cartridge");
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);
else
CurrentCartridge->WriteMem(address, data, size);

View File

@ -56,6 +56,7 @@ u32 RomCacheMapCount;
char naomi_game_id[33];
InputDescriptors *NaomiGameInputs;
u8 *naomi_default_eeprom;
bool naomi_rotate_screen;
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)
naomi_default_eeprom = game->eeprom_dump;
naomi_rotate_screen = game->rotation_flag == ROT270;
CurrentCartridge->Init();
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);
} catch (ReicastException& ex) {

View File

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

View File

@ -398,13 +398,21 @@ void LoadSpecialSettings()
INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", naomi_game_id);
settings.input.JammaSetup = JVS::OutTrigger;
}
if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
else if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", naomi_game_id);
settings.rend.TranslucentPolygonDepthMask = 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;
#endif
#if HOST_OS != OS_LINUX || defined(__ANDROID__) || defined(TARGET_PANDORA)
#if defined(__ANDROID__) || defined(TARGET_PANDORA)
settings.aica.BufferSize = 5644; // 128 ms
#else
settings.aica.BufferSize = 2822; // 64 ms
@ -1021,7 +1029,8 @@ void SaveSettings()
cfgSaveInt("config", "rend.ScreenStretching", settings.rend.ScreenStretching);
cfgSaveBool("config", "rend.Fog", settings.rend.Fog);
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", "pvr.rend", settings.pvr.rend);
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);
glCheck();
if (is_rtt || !settings.rend.WideScreen || matrices.IsClipped())
if (is_rtt || !settings.rend.WideScreen || matrices.IsClipped() || settings.rend.Rotate90)
{
float width;
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

View File

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

View File

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