Wire up new scanline count logic.

This commit is contained in:
Christian Speckner 2020-01-05 23:14:44 +01:00
parent b78780c1cb
commit fe8357cc74
7 changed files with 60 additions and 41 deletions

View File

@ -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);

View File

@ -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());

View File

@ -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.

View File

@ -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.
*/

View File

@ -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);
}

View File

@ -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};

View File

@ -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;