mirror of https://github.com/stella-emu/stella.git
Wire up new scanline count logic.
This commit is contained in:
parent
b78780c1cb
commit
fe8357cc74
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue