From 98b2a32eae0b7a98d7652ba6c368986656c6d656 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Fri, 17 Apr 2020 22:11:11 +0200 Subject: [PATCH] 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 --- core/hw/maple/maple_devs.cpp | 13 +++++-------- core/hw/naomi/naomi.cpp | 2 +- core/hw/naomi/naomi_cart.cpp | 4 ++++ core/hw/naomi/naomi_cart.h | 1 + core/nullDC.cpp | 17 +++++++++++++---- core/rend/gl4/gles.cpp | 2 +- core/rend/gles/gles.cpp | 2 +- core/rend/vulkan/drawer.cpp | 2 +- core/types.h | 3 ++- 9 files changed, 29 insertions(+), 17 deletions(-) diff --git a/core/hw/maple/maple_devs.cpp b/core/hw/maple/maple_devs.cpp index 4e33bc126..f6188b298 100755 --- a/core/hw/maple/maple_devs.cpp +++ b/core/hw/maple/maple_devs.cpp @@ -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) diff --git a/core/hw/naomi/naomi.cpp b/core/hw/naomi/naomi.cpp index 0d1ed7bc8..6d1aca66b 100644 --- a/core/hw/naomi/naomi.cpp +++ b/core/hw/naomi/naomi.cpp @@ -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); diff --git a/core/hw/naomi/naomi_cart.cpp b/core/hw/naomi/naomi_cart.cpp index b2c920434..8477fb08a 100644 --- a/core/hw/naomi/naomi_cart.cpp +++ b/core/hw/naomi/naomi_cart.cpp @@ -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) { diff --git a/core/hw/naomi/naomi_cart.h b/core/hw/naomi/naomi_cart.h index e9778444e..686982390 100644 --- a/core/hw/naomi/naomi_cart.h +++ b/core/hw/naomi/naomi_cart.h @@ -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; diff --git a/core/nullDC.cpp b/core/nullDC.cpp index 5e5a89802..8ac2f1aa3 100755 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -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); diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index 8205567cc..1ed4bb3eb 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -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; diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index f0c3797be..f57ccc401 100644 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -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 diff --git a/core/rend/vulkan/drawer.cpp b/core/rend/vulkan/drawer.cpp index 454aeab85..2f52d4ca0 100644 --- a/core/rend/vulkan/drawer.cpp +++ b/core/rend/vulkan/drawer.cpp @@ -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) diff --git a/core/types.h b/core/types.h index d0a4836cc..698659028 100644 --- a/core/types.h +++ b/core/types.h @@ -389,7 +389,8 @@ enum class JVS { WorldKicks, WorldKicksPCB, Keyboard, - OutTrigger + OutTrigger, + LightGunAsAnalog, }; struct settings_t