diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index 0a4531d90..8b3ccd20d 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -696,11 +696,13 @@ void Console::setTIAProperties() { // Assume we've got ~262 scanlines (NTSC-like format) myTIA->setLayout(FrameLayout::ntsc); + myTIA->setAdjustScanlines(myOSystem.settings().getInt("tia.adjustscanlines.ntsc")); } else { // Assume we've got ~312 scanlines (PAL-like format) myTIA->setLayout(FrameLayout::pal); + myTIA->setAdjustScanlines(myOSystem.settings().getInt("tia.adjustscanlines.pal")); } myTIA->setVcenter(vcenter); diff --git a/src/emucore/Settings.cxx b/src/emucore/Settings.cxx index 6a5fad19a..d6a566766 100644 --- a/src/emucore/Settings.cxx +++ b/src/emucore/Settings.cxx @@ -256,9 +256,9 @@ void Settings::validate() if (f <= 0) setValue("speed", "1.0"); i = getInt("tia.adjustscanlines.ntsc"); - if(i < -50 || i > 50) setValue("tia.adjustscanlines.ntsc", "90"); + if(i < -25 || i > 25) setValue("tia.adjustscanlines.ntsc", "90"); i = getInt("tia.adjustscanlines.pal"); - if(i < -50 || i > 50) setValue("tia.adjustscanlines.pal", "100"); + if(i < -25 || i > 25) setValue("tia.adjustscanlines.pal", "100"); s = getString("tia.dbgcolors"); sort(s.begin(), s.end()); diff --git a/src/emucore/tia/TIA.hxx b/src/emucore/tia/TIA.hxx index 0f6336128..0ff1afb67 100644 --- a/src/emucore/tia/TIA.hxx +++ b/src/emucore/tia/TIA.hxx @@ -260,6 +260,9 @@ class TIA : public Device void setLayout(FrameLayout layout) { myFrameManager->setLayout(layout); } FrameLayout frameLayout() const { return myFrameManager->layout(); } + void setAdjustScanlines(Int32 adjustScanlines) { myFrameManager->setAdjustScanlines(adjustScanlines); } + Int32 adjustScanlines() const { return myFrameManager->adjustScanlines(); } + /** Enables/disables color-loss for PAL modes only. diff --git a/src/emucore/tia/frame-manager/AbstractFrameManager.hxx b/src/emucore/tia/frame-manager/AbstractFrameManager.hxx index 5f11fd39c..a4b285a3e 100644 --- a/src/emucore/tia/frame-manager/AbstractFrameManager.hxx +++ b/src/emucore/tia/frame-manager/AbstractFrameManager.hxx @@ -170,6 +170,10 @@ class AbstractFrameManager : public Serializable */ virtual Int32 vcenter() const { return 0; } + virtual void setAdjustScanlines(Int32 adjustScanlines) {} + + virtual Int32 adjustScanlines() const { return 0; } + /** * The corresponding start line. */ diff --git a/src/emucore/tia/frame-manager/FrameManager.cxx b/src/emucore/tia/frame-manager/FrameManager.cxx index 4aa2a2bbc..053c3c665 100644 --- a/src/emucore/tia/frame-manager/FrameManager.cxx +++ b/src/emucore/tia/frame-manager/FrameManager.cxx @@ -24,13 +24,12 @@ enum Metrics: uInt32 { vblankNTSC = 37, vblankPAL = 45, - kernelNTSC = 192, - kernelPAL = 228, - overscanNTSC = 30, - overscanPAL = 36, vsync = 3, + frameSizeNTSC = 262, + frameSizePAL = 312, + baseHeightNTSC = 240, + baseHeightPAL = 288, maxLinesVsync = 50, - visibleOverscan = 20, initialGarbageFrames = TIAConstants::initialGarbageFrames, ystartNTSC = 34, ystartPAL = 39 @@ -40,8 +39,7 @@ enum Metrics: uInt32 { FrameManager::FrameManager() { reset(); - updateYStart(); - onLayoutChange(); + recalculateMetrics(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -118,7 +116,14 @@ void FrameManager::setVcenter(Int32 vcenter) if (vcenter < TIAConstants::minVcenter || vcenter > TIAConstants::maxVcenter) return; myVcenter = vcenter; - updateYStart(); + recalculateMetrics(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameManager::setAdjustScanlines(Int32 adjustScanlines) +{ + myAdjustScanlines = adjustScanlines; + recalculateMetrics(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -163,26 +168,7 @@ void FrameManager::setState(FrameManager::State state) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameManager::onLayoutChange() { - switch (layout()) - { - case FrameLayout::ntsc: - myVblankLines = Metrics::vblankNTSC; - myKernelLines = Metrics::kernelNTSC; - myOverscanLines = Metrics::overscanNTSC; - break; - - case FrameLayout::pal: - myVblankLines = Metrics::vblankPAL; - myKernelLines = Metrics::kernelPAL; - myOverscanLines = Metrics::overscanPAL; - break; - - default: - throw runtime_error("frame manager: invalid TV mode"); - } - - myFrameLines = Metrics::vsync + myVblankLines + myKernelLines + myOverscanLines; - myHeight = myKernelLines + Metrics::visibleOverscan; + recalculateMetrics(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -202,8 +188,6 @@ bool FrameManager::onSave(Serializer& out) const out.putInt(myLastY); out.putInt(myVblankLines); - out.putInt(myKernelLines); - out.putInt(myOverscanLines); out.putInt(myFrameLines); out.putInt(myHeight); out.putInt(myYStart); @@ -225,8 +209,6 @@ bool FrameManager::onLoad(Serializer& in) myLastY = in.getInt(); myVblankLines = in.getInt(); - myKernelLines = in.getInt(); - myOverscanLines = in.getInt(); myFrameLines = in.getInt(); myHeight = in.getInt(); myYStart = in.getInt(); @@ -237,7 +219,32 @@ bool FrameManager::onLoad(Serializer& in) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameManager::updateYStart() { - myYStart = (layout() == FrameLayout::ntsc ? Metrics::ystartNTSC : Metrics::ystartPAL) - myVcenter; +void FrameManager::recalculateMetrics() { + uInt32 ystartBase; + uInt32 baseHeight; + + switch (layout()) + { + case FrameLayout::ntsc: + myVblankLines = Metrics::vblankNTSC; + myFrameLines = Metrics::frameSizeNTSC; + ystartBase = Metrics::ystartNTSC; + baseHeight = Metrics::baseHeightNTSC; + break; + + case FrameLayout::pal: + myVblankLines = Metrics::vblankPAL; + myFrameLines = Metrics::frameSizePAL; + ystartBase = Metrics::ystartPAL; + baseHeight = Metrics::baseHeightPAL; + break; + + default: + throw runtime_error("frame manager: invalid TV mode"); + } + + myHeight = baseHeight + myAdjustScanlines * 2; + myYStart = ystartBase + baseHeight - myHeight + myVcenter; + myJitterEmulation.setYStart(myYStart); } diff --git a/src/emucore/tia/frame-manager/FrameManager.hxx b/src/emucore/tia/frame-manager/FrameManager.hxx index 2f47d5ccc..a876298f5 100644 --- a/src/emucore/tia/frame-manager/FrameManager.hxx +++ b/src/emucore/tia/frame-manager/FrameManager.hxx @@ -48,6 +48,10 @@ class FrameManager: public AbstractFrameManager { Int32 vcenter() const override { return myVcenter; } + void setAdjustScanlines(Int32 adjustScanlines) override; + + Int32 adjustScanlines() const override { return myAdjustScanlines; } + uInt32 startLine() const override { return myYStart; } void setLayout(FrameLayout mode) override { layout(mode); } @@ -79,7 +83,7 @@ class FrameManager: public AbstractFrameManager { void updateIsRendering(); - void updateYStart(); + void recalculateMetrics(); private: @@ -89,12 +93,11 @@ class FrameManager: public AbstractFrameManager { uInt32 myY{0}, myLastY{0}; uInt32 myVblankLines{0}; - uInt32 myKernelLines{0}; - uInt32 myOverscanLines{0}; uInt32 myFrameLines{0}; uInt32 myHeight{0}; uInt32 myYStart{0}; Int32 myVcenter{0}; + Int32 myAdjustScanlines{0}; bool myJitterEnabled{false}; diff --git a/src/gui/VideoDialog.cxx b/src/gui/VideoDialog.cxx index 91802e430..7da3b6a66 100644 --- a/src/gui/VideoDialog.cxx +++ b/src/gui/VideoDialog.cxx @@ -140,7 +140,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent, new SliderWidget(myTab, font, xpos, ypos-1, swidth, lineHeight, "NTSC scanlines adjust ", lwidth, 0, fontWidth * 4, ""); - myAdjustScanlinesNTSC->setMinValue(-50); myAdjustScanlinesNTSC->setMaxValue(50); + myAdjustScanlinesNTSC->setMinValue(-25); myAdjustScanlinesNTSC->setMaxValue(25); myAdjustScanlinesNTSC->setTickmarkIntervals(2); wid.push_back(myAdjustScanlinesNTSC); ypos += lineHeight + VGAP; @@ -150,7 +150,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent, new SliderWidget(myTab, font, xpos, ypos-1, swidth, lineHeight, "PAL scanlines adjust ", lwidth, 0, fontWidth * 4, ""); - myAdjustScanlinesPAL->setMinValue(-50); myAdjustScanlinesPAL->setMaxValue(50); + myAdjustScanlinesPAL->setMinValue(-25); myAdjustScanlinesPAL->setMaxValue(25); myAdjustScanlinesPAL->setTickmarkIntervals(2); wid.push_back(myAdjustScanlinesPAL); ypos += lineHeight + VGAP;