From 0f1b45cfa6f177054ec3cd70208dd468dbe99b7c Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Sat, 12 Jan 2019 23:28:52 +0700 Subject: [PATCH] Add hack for Lode Runner 3-D. The game uses very unique way to allocate frame buffers. It uses double buffering, but both buffers share the same address space (sic!) The game uses interlaced display mode, and lines in RDP buffers are interlaced too. Plugin's fb and VI emulation code can't handle it properly, so I just added a hack. Fixed Lode Runner 3-D: No video output if framebuffer is enabled #1937 --- src/Config.h | 2 +- src/FrameBuffer.cpp | 5 +++++ src/RSP.cpp | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Config.h b/src/Config.h index e438e769..2f1cde15 100644 --- a/src/Config.h +++ b/src/Config.h @@ -193,7 +193,7 @@ struct Config #define hack_WinBack (1<<10) //Hack for WinBack to remove gray rectangle in HLE mode #define hack_ZeldaMM (1<<11) //Special hacks for Zelda MM #define hack_ModifyVertexXyInShader (1<<12) //Pass screen coordinates provided in gSPModifyVertex to vertes shader. -#define hack_legoRacers (1<<13) //LEGO racers course map +#define hack_LodeRunner (1<<13) //Hack for Lode runner VI issues. #define hack_doNotResetOtherModeH (1<<14) //Don't reset othermode.h after dlist end. Quake and Quake 2 #define hack_doNotResetOtherModeL (1<<15) //Don't reset othermode.l after dlist end. Quake #define hack_LoadDepthTextures (1<<16) //Load textures for depth buffer diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 148878cb..d2f8d72e 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -1362,6 +1362,11 @@ void FrameBufferList::renderBuffer() --dstY0; } + if ((config.generalEmulation.hacks & hack_LodeRunner) != 0) { + srcY0 = 1; + XoffsetRight = XoffsetLeft = 0; + } + srcWidth = min(rdpRes.vi_width, (rdpRes.vi_hres * rdpRes.vi_x_add) >> 10); srcHeight = rdpRes.vi_width * ((rdpRes.vi_vres*rdpRes.vi_y_add + rdpRes.vi_y_start) >> 10) / pBuffer->m_width; diff --git a/src/RSP.cpp b/src/RSP.cpp index 7a70c0ea..0c54eca2 100644 --- a/src/RSP.cpp +++ b/src/RSP.cpp @@ -310,8 +310,8 @@ void RSP_Init() else if (strstr(RSP.romname, (const char *)"DOUBUTSUNOMORI") != nullptr || strstr(RSP.romname, (const char *)"ANIMAL FOREST") != nullptr) config.generalEmulation.hacks |= hack_subscreen; - else if (strstr(RSP.romname, (const char *)"LEGORacers") != nullptr) - config.generalEmulation.hacks |= hack_legoRacers; + else if (strstr(RSP.romname, (const char *)"Lode Runner 3D") != nullptr) + config.generalEmulation.hacks |= hack_LodeRunner; else if (strstr(RSP.romname, (const char *)"Blast") != nullptr) config.generalEmulation.hacks |= hack_blastCorps; else if (strstr(RSP.romname, (const char *)"MASK") != nullptr) // Zelda MM