From 888556b124c52e80b3e72e5fb0b6c33a02f9e81d Mon Sep 17 00:00:00 2001 From: Christian Speckner Date: Mon, 17 Sep 2018 00:23:06 +0200 Subject: [PATCH] Another pass at resolving ystart issues. Reverts 02b0c13a and b9bbbe1 . --- src/emucore/Console.cxx | 84 +++++++++++++++++++------------------- src/emucore/Console.hxx | 3 ++ src/emucore/tia/TIA.cxx | 16 +++++--- src/emucore/tia/TIA.hxx | 7 +++- src/gui/GameInfoDialog.cxx | 28 +++---------- 5 files changed, 66 insertions(+), 72 deletions(-) diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index b77c0c033..46b3bfc04 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -87,6 +87,7 @@ Console::Console(OSystem& osystem, unique_ptr& cart, myCurrentFormat(0), // Unknown format @ start, myAutodetectedYstart(0), myYStartAutodetected(false), + myFormatAutodetected(false), myUserPaletteDefined(false), myConsoleTiming(ConsoleTiming::ntsc), myAudioSettings(audioSettings) @@ -143,6 +144,7 @@ Console::Console(OSystem& osystem, unique_ptr& cart, { autodetected = "*"; myCurrentFormat = 0; + myFormatAutodetected = true; } } @@ -284,8 +286,6 @@ void Console::autodetectYStart(bool reset) // Don't forget to reset the SC progress bars again myOSystem.settings().setValue("fastscbios", fastscbios); - - myYStartAutodetected = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -370,17 +370,17 @@ void Console::setFormat(uInt32 format) string saveformat, message; string autodetected = ""; - bool reset = true; myCurrentFormat = format; switch(myCurrentFormat) { case 0: // auto-detect { + if (myFormatAutodetected) return; + string oldDisplayFormat = myDisplayFormat; redetectFrameLayout(); - myTIA->update(); - reset = oldDisplayFormat != myDisplayFormat; + myFormatAutodetected = true; saveformat = "AUTO"; autodetected = "*"; myConsoleTiming = myDisplayFormat == "PAL" ? ConsoleTiming::pal : ConsoleTiming::ntsc; @@ -391,45 +391,48 @@ void Console::setFormat(uInt32 format) saveformat = myDisplayFormat = "NTSC"; myConsoleTiming = ConsoleTiming::ntsc; message = "NTSC mode"; + myFormatAutodetected = false; break; case 2: saveformat = myDisplayFormat = "PAL"; myConsoleTiming = ConsoleTiming::pal; message = "PAL mode"; + myFormatAutodetected = false; break; case 3: saveformat = myDisplayFormat = "SECAM"; myConsoleTiming = ConsoleTiming::secam; message = "SECAM mode"; + myFormatAutodetected = false; break; case 4: saveformat = myDisplayFormat = "NTSC50"; myConsoleTiming = ConsoleTiming::ntsc; message = "NTSC50 mode"; + myFormatAutodetected = false; break; case 5: saveformat = myDisplayFormat = "PAL60"; myConsoleTiming = ConsoleTiming::pal; message = "PAL60 mode"; + myFormatAutodetected = false; break; case 6: saveformat = myDisplayFormat = "SECAM60"; myConsoleTiming = ConsoleTiming::secam; message = "SECAM60 mode"; + myFormatAutodetected = false; break; } myProperties.set(Display_Format, saveformat); myConsoleInfo.DisplayFormat = myDisplayFormat + autodetected; - if(reset) - { - setPalette(myOSystem.settings().getString("palette")); - setTIAProperties(); - initializeVideo(); // takes care of refreshing the screen - initializeAudio(); // ensure that audio synthesis is set up to match emulation speed - myOSystem.resetFps(); // Reset FPS measurement - } + setPalette(myOSystem.settings().getString("palette")); + setTIAProperties(); + initializeVideo(); // takes care of refreshing the screen + initializeAudio(); // ensure that audio synthesis is set up to match emulation speed + myOSystem.resetFps(); // Reset FPS measurement myOSystem.frameBuffer().showMessage(message); @@ -696,31 +699,28 @@ void Console::changeYStart(int direction) else return; - ostringstream val; - val << ystart; if(ystart == 0) { redetectYStart(); ystart = myAutodetectedYstart; + myYStartAutodetected = true; - myOSystem.frameBuffer().showMessage("YStart autodetected"); + myProperties.set(Display_YStart, "0"); } - else - { - if(myAutodetectedYstart > 0 && myAutodetectedYstart == ystart) - { - // We've reached the auto-detect value, so reset - myOSystem.frameBuffer().showMessage("YStart " + val.str() + " (Auto)"); - val.str(""); - val << static_cast(0); - } - else - myOSystem.frameBuffer().showMessage("YStart " + val.str()); + else { + ostringstream ss; + ss << ystart; - myYStartAutodetected = false; + myProperties.set(Display_YStart, ss.str()); } - myProperties.set(Display_YStart, val.str()); - myTIA->setYStart(ystart); + if (ystart != myTIA->ystart()) myTIA->setYStart(ystart); + + ostringstream ss; + + if(myAutodetectedYstart == ystart) ss << "YStart " << ystart << " (Auto)"; + else ss << "YStart " << ystart; + + myOSystem.frameBuffer().showMessage(ss.str()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -728,20 +728,15 @@ void Console::updateYStart(uInt32 ystart) { if (ystart > TIAConstants::maxYStart) return; - ostringstream ss; - ss << ystart; - - if (ss.str() == myProperties.get(Display_YStart)) return; - - myProperties.set(Display_YStart, ss.str()); - if (ystart == 0) { + if (myYStartAutodetected) return; + redetectYStart(); - myTIA->setYStart(myAutodetectedYstart); - } else { - myTIA->setYStart(ystart); - myYStartAutodetected = false; + myYStartAutodetected = true; + ystart = myAutodetectedYstart; } + + if (ystart != myTIA->ystart()) myTIA->setYStart(ystart); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -782,6 +777,11 @@ void Console::setTIAProperties() uInt32 ystart = atoi(myProperties.get(Display_YStart).c_str()); if(ystart != 0) ystart = BSPF::clamp(ystart, 0u, TIAConstants::maxYStart); + else { + ystart = myAutodetectedYstart; + myYStartAutodetected = true; + } + uInt32 height = atoi(myProperties.get(Display_Height).c_str()); if(height != 0) height = BSPF::clamp(height, TIAConstants::minViewableHeight, TIAConstants::maxViewableHeight); @@ -801,7 +801,7 @@ void Console::setTIAProperties() myTIA->setLayout(FrameLayout::pal); } - myTIA->setYStart(myAutodetectedYstart ? myAutodetectedYstart : ystart); + myTIA->setYStart(ystart); myTIA->setHeight(height); myEmulationTiming.updateFrameLayout(myTIA->frameLayout()); diff --git a/src/emucore/Console.hxx b/src/emucore/Console.hxx index 9597a0da1..a8ab18785 100644 --- a/src/emucore/Console.hxx +++ b/src/emucore/Console.hxx @@ -420,6 +420,9 @@ class Console : public Serializable // Is ystart currently autodetected? bool myYStartAutodetected; + // Is the TV format autodetected? + bool myFormatAutodetected; + // Indicates whether an external palette was found and // successfully loaded bool myUserPaletteDefined; diff --git a/src/emucore/tia/TIA.cxx b/src/emucore/tia/TIA.cxx index 757baca7b..1ded2ef27 100644 --- a/src/emucore/tia/TIA.cxx +++ b/src/emucore/tia/TIA.cxx @@ -178,7 +178,7 @@ void TIA::reset() if (myFrameManager) { myFrameManager->reset(); - enableColorLoss(mySettings.getBool(mySettings.getBool("dev.settings") ? "dev.colorloss" : "plr.colorloss")); + frameReset(); // Recalculate the size of the display } myFrontBufferScanlines = myFrameBufferScanlines = 0; @@ -189,16 +189,20 @@ void TIA::reset() enableFixedColors(mySettings.getBool(mySettings.getBool("dev.settings") ? "dev.debugcolors" : "plr.debugcolors")); setFixedColorPalette(mySettings.getString("tia.dbgcolors")); - // Blank the various framebuffers; they may contain graphical garbage - memset(myBackBuffer, 0, 160 * TIAConstants::frameBufferHeight); - memset(myFrontBuffer, 0, 160 * TIAConstants::frameBufferHeight); - memset(myFramebuffer, 0, 160 * TIAConstants::frameBufferHeight); - #ifdef DEBUGGER_SUPPORT createAccessBase(); #endif // DEBUGGER_SUPPORT } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void TIA::frameReset() +{ + memset(myBackBuffer, 0, 160 * TIAConstants::frameBufferHeight); + memset(myFrontBuffer, 0, 160 * TIAConstants::frameBufferHeight); + memset(myFramebuffer, 0, 160 * TIAConstants::frameBufferHeight); + enableColorLoss(mySettings.getBool(mySettings.getBool("dev.settings") ? "dev.colorloss" : "plr.colorloss")); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void TIA::install(System& system) { diff --git a/src/emucore/tia/TIA.hxx b/src/emucore/tia/TIA.hxx index 1687331d4..c7ecac78b 100644 --- a/src/emucore/tia/TIA.hxx +++ b/src/emucore/tia/TIA.hxx @@ -136,6 +136,11 @@ class TIA : public Device */ void reset() override; + /** + Reset frame to current YStart/Height properties. + */ + void frameReset(); + /** Install TIA in the specified system. Invoked by the system when the TIA is attached to it. @@ -249,7 +254,7 @@ class TIA : public Device /** Changes the current Height/YStart properties. Note that calls to these method(s) must be eventually followed by - ::reset() for the changes to take effect. + ::frameReset() for the changes to take effect. */ void setHeight(uInt32 height) { myFrameManager->setFixedHeight(height); } void setYStart(uInt32 ystart) { myFrameManager->setYstart(ystart); } diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 00d85d267..ecd970fc9 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -531,22 +531,18 @@ void GameInfoDialog::saveConfig() myGameProperties.set(Controller_MouseAxis, mcontrol); // Display properties - const string& ystart = myGameProperties.get(Display_YStart); - uInt32 oldYStart = atoi(ystart.c_str()); - const string& height = myGameProperties.get(Display_Height); - uInt32 oldHeight = atoi(height.c_str()); - + myGameProperties.set(Display_YStart, myYStart->getValue() == 0 ? "0" : myYStart->getValueLabel()); myGameProperties.set(Display_Format, myFormat->getSelectedTag().toString()); - myGameProperties.set(Display_YStart, myYStart->getValueLabel() == "Auto" ? "0" : - myYStart->getValueLabel()); myGameProperties.set(Display_Height, myHeight->getValueLabel() == "Auto" ? "0" : myHeight->getValueLabel()); myGameProperties.set(Display_Phosphor, myPhosphor->getState() ? "YES" : "NO"); + myGameProperties.set(Display_PPBlend, myPPBlend->getValueLabel() == "Default" ? "0" : myPPBlend->getValueLabel()); // Always insert; if the properties are already present, nothing will happen instance().propSet().insert(myGameProperties); + instance().saveConfig(); // In any event, inform the Console if(instance().hasConsole()) @@ -563,28 +559,14 @@ void GameInfoDialog::saveConfig() // update 'Display' tab settings immediately instance().console().setFormat(myFormat->getSelected()); + instance().console().updateYStart(myYStart->getValue()); - // only call tia().reset() when values have changed - bool reset = false; - if(uInt32((myYStart->getValue()) != 0 || oldYStart != 0) && - uInt32(myYStart->getValue()) != instance().console().tia().ystart()) - { - instance().console().updateYStart(myYStart->getValue()); - reset = true; - } - if(uInt32((myHeight->getValue()) != TIAConstants::minViewableHeight - 1 || oldHeight != 0) && + if(uInt32(myHeight->getValue()) != TIAConstants::minViewableHeight - 1 && uInt32(myHeight->getValue()) != instance().console().tia().height()) { instance().console().tia().setHeight(myHeight->getValue()); - reset = true; } instance().frameBuffer().tiaSurface().enablePhosphor(myPhosphor->getState(), myPPBlend->getValue()); - if (reset) - instance().console().tia().reset(); - - // Certain calls above may blank the TIA image (notably, setFormat) - // So we make sure we have a valid image when the dialog exits - instance().console().tia().renderToFrameBuffer(); } }