added delayed background color glitch developer option

This commit is contained in:
thrust26 2020-08-26 23:39:20 +02:00
parent c165c9b159
commit 859f33f54c
6 changed files with 60 additions and 4 deletions

View File

@ -41,6 +41,8 @@
* Added option to display detected settings info when a ROM is loaded. * Added option to display detected settings info when a ROM is loaded.
* Added another oddball TIA glitch option for delayed background color. (TODO: DOC)
* Replaced "Re-disassemble" with "Disassemble @ current line" in debugger. * Replaced "Re-disassemble" with "Disassemble @ current line" in debugger.
* Fixed bug when taking fullscreen snapshots; the dimensions were * Fixed bug when taking fullscreen snapshots; the dimensions were
@ -51,7 +53,7 @@
6.2.1 to 6.2.2 (August 25, 2020) 6.2.1 to 6.2.2 (August 25, 2020)
* Fixed bug in initial controller mapping. * Fixed a bug in initial controller mapping.
6.2 to 6.2.1: (June 20, 2020) 6.2 to 6.2.1: (June 20, 2020)

View File

@ -220,6 +220,7 @@ Settings::Settings()
setPermanent("dev.tia.blinvphase", "true"); setPermanent("dev.tia.blinvphase", "true");
setPermanent("dev.tia.delaypfbits", "true"); setPermanent("dev.tia.delaypfbits", "true");
setPermanent("dev.tia.delaypfcolor", "true"); setPermanent("dev.tia.delaypfcolor", "true");
setPermanent("dev.tia.delaybkcolor", "true");
setPermanent("dev.tia.delayplswap", "true"); setPermanent("dev.tia.delayplswap", "true");
setPermanent("dev.tia.delayblswap", "true"); setPermanent("dev.tia.delayblswap", "true");
setPermanent("dev.timemachine", true); setPermanent("dev.timemachine", true);
@ -659,13 +660,15 @@ void Settings::usage() const
<< " -dev.tia.type <standard|custom| Selects a TIA type\n" << " -dev.tia.type <standard|custom| Selects a TIA type\n"
<< " koolaidman|\n" << " koolaidman|\n"
<< " cosmicark|pesco|\n" << " cosmicark|pesco|\n"
<< " quickstep|heman|>\n" << " quickstep|\n"
<< " indy500|heman|>\n"
<< " -dev.tia.plinvphase <1|0> Enable inverted HMOVE clock phase for players\n" << " -dev.tia.plinvphase <1|0> Enable inverted HMOVE clock phase for players\n"
<< " -dev.tia.msinvphase <1|0> Enable inverted HMOVE clock phase for\n" << " -dev.tia.msinvphase <1|0> Enable inverted HMOVE clock phase for\n"
<< " missiles\n" << " missiles\n"
<< " -dev.tia.blinvphase <1|0> Enable inverted HMOVE clock phase for ball\n" << " -dev.tia.blinvphase <1|0> Enable inverted HMOVE clock phase for ball\n"
<< " -dev.tia.delaypfbits <1|0> Enable extra delay cycle for PF bits access\n" << " -dev.tia.delaypfbits <1|0> Enable extra delay cycle for PF bits access\n"
<< " -dev.tia.delaypfcolor <1|0> Enable extra delay cycle for PF color\n" << " -dev.tia.delaypfcolor <1|0> Enable extra delay cycle for PF color\n"
<< " -dev.tia.delaybkcolor <1|0> Enable extra delay cycle for background color\n"
<< " -dev.tia.delayplswap <1|0> Enable extra delay cycle for VDELP0/1 swap\n" << " -dev.tia.delayplswap <1|0> Enable extra delay cycle for VDELP0/1 swap\n"
<< " -dev.tia.delayblswap <1|0> Enable extra delay cycle for VDELBL swap\n" << " -dev.tia.delayblswap <1|0> Enable extra delay cycle for VDELBL swap\n"
<< endl << std::flush; << endl << std::flush;

View File

@ -285,6 +285,7 @@ bool TIA::save(Serializer& out) const
out.putByte(myPFBitsDelay); out.putByte(myPFBitsDelay);
out.putByte(myPFColorDelay); out.putByte(myPFColorDelay);
out.putByte(myBKColorDelay);
out.putByte(myPlSwapDelay); out.putByte(myPlSwapDelay);
} }
catch(...) catch(...)
@ -356,6 +357,7 @@ bool TIA::load(Serializer& in)
myPFBitsDelay = in.getByte(); myPFBitsDelay = in.getByte();
myPFColorDelay = in.getByte(); myPFColorDelay = in.getByte();
myBKColorDelay = in.getByte();
myPlSwapDelay = in.getByte(); myPlSwapDelay = in.getByte();
// Re-apply dev settings // Re-apply dev settings
@ -605,8 +607,13 @@ bool TIA::poke(uInt16 address, uInt8 value)
case COLUBK: case COLUBK:
{ {
value &= 0xFE; value &= 0xFE;
myBackground.setColor(value); if(myBKColorDelay)
myShadowRegisters[address] = value; myDelayQueue.push(COLUBK, value, 1);
else
{
myBackground.setColor(value);
myShadowRegisters[address] = value;
}
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
uInt16 dataAddr = mySystem->m6502().lastDataAddressForPoke(); uInt16 dataAddr = mySystem->m6502().lastDataAddressForPoke();
if(dataAddr) if(dataAddr)
@ -918,6 +925,9 @@ void TIA::applyDeveloperSettings()
setPFColorDelay(custom setPFColorDelay(custom
? mySettings.getBool("dev.tia.delaypfcolor") ? mySettings.getBool("dev.tia.delaypfcolor")
: BSPF::equalsIgnoreCase("quickstep", mySettings.getString("dev.tia.type"))); : BSPF::equalsIgnoreCase("quickstep", mySettings.getString("dev.tia.type")));
setBKColorDelay(custom
? mySettings.getBool("dev.tia.delaybkcolor")
: BSPF::equalsIgnoreCase("indy500", mySettings.getString("dev.tia.type")));
setPlSwapDelay(custom setPlSwapDelay(custom
? mySettings.getBool("dev.tia.delayplswap") ? mySettings.getBool("dev.tia.delayplswap")
: BSPF::equalsIgnoreCase("heman", mySettings.getString("dev.tia.type"))); : BSPF::equalsIgnoreCase("heman", mySettings.getString("dev.tia.type")));
@ -930,6 +940,7 @@ void TIA::applyDeveloperSettings()
setBlInvertedPhaseClock(false); setBlInvertedPhaseClock(false);
setPFBitsDelay(false); setPFBitsDelay(false);
setPFColorDelay(false); setPFColorDelay(false);
setBKColorDelay(false);
setPlSwapDelay(false); setPlSwapDelay(false);
setBlSwapDelay(false); setBlSwapDelay(false);
} }
@ -1608,6 +1619,12 @@ void TIA::setPFColorDelay(bool delayed)
myPFColorDelay = delayed ? 1 : 0; myPFColorDelay = delayed ? 1 : 0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIA::setBKColorDelay(bool delayed)
{
myBKColorDelay = delayed ? 1 : 0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIA::setPlSwapDelay(bool delayed) void TIA::setPlSwapDelay(bool delayed)
{ {
@ -1683,6 +1700,10 @@ void TIA::delayedWrite(uInt8 address, uInt8 value)
myPlayfield.pf2(value); myPlayfield.pf2(value);
break; break;
case COLUBK:
myBackground.setColor(value);
break;
case COLUPF: case COLUPF:
myPlayfield.setColor(value); myPlayfield.setColor(value);
myBall.setColor(value); myBall.setColor(value);

View File

@ -435,6 +435,13 @@ class TIA : public Device
*/ */
void setPFColorDelay(bool delayed); void setPFColorDelay(bool delayed);
/**
Enables/disables delayed background colors.
@param delayed Wether to enable delayed background colors
*/
void setBKColorDelay(bool delayed);
/** /**
Enables/disables delayed player swapping. Enables/disables delayed player swapping.
@ -740,6 +747,7 @@ class TIA : public Device
*/ */
uInt8 myPFBitsDelay{0}; uInt8 myPFBitsDelay{0};
uInt8 myPFColorDelay{0}; uInt8 myPFColorDelay{0};
uInt8 myBKColorDelay{0};
uInt8 myPlSwapDelay{0}; uInt8 myPlSwapDelay{0};
uInt8 myBlSwapDelay{0}; uInt8 myBlSwapDelay{0};

View File

@ -233,6 +233,7 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
VarList::push_back(items, "Faulty Cosmic Ark stars", "cosmicark"); VarList::push_back(items, "Faulty Cosmic Ark stars", "cosmicark");
VarList::push_back(items, "Glitched Pesco", "pesco"); VarList::push_back(items, "Glitched Pesco", "pesco");
VarList::push_back(items, "Glitched Quick Step!", "quickstep"); VarList::push_back(items, "Glitched Quick Step!", "quickstep");
VarList::push_back(items, "Glitched Indy 500 menu", "indy500");
VarList::push_back(items, "Glitched He-Man title", "heman"); VarList::push_back(items, "Glitched He-Man title", "heman");
VarList::push_back(items, "Custom", "custom"); VarList::push_back(items, "Custom", "custom");
myTIATypeWidget = new PopUpWidget(myTab, font, HBORDER + INDENT, ypos - 1, myTIATypeWidget = new PopUpWidget(myTab, font, HBORDER + INDENT, ypos - 1,
@ -271,6 +272,15 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
wid.push_back(myPFColorWidget); wid.push_back(myPFColorWidget);
ypos += lineHeight + VGAP * 1; ypos += lineHeight + VGAP * 1;
myBackgroundLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1,
"Delayed background");
wid.push_back(myBackgroundLabel);
ypos += lineHeight + VGAP * 1;
myBKColorWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "Color");
wid.push_back(myBKColorWidget);
ypos += lineHeight + VGAP * 1;
ostringstream ss; ostringstream ss;
ss << "Delayed VDEL" << ELLIPSIS << " swap for"; ss << "Delayed VDEL" << ELLIPSIS << " swap for";
mySwapLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, ss.str()); mySwapLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, ss.str());
@ -644,6 +654,7 @@ void DeveloperDialog::loadSettings(SettingsSet set)
myBlInvPhase[set] = devSettings ? instance().settings().getBool("dev.tia.blinvphase") : false; myBlInvPhase[set] = devSettings ? instance().settings().getBool("dev.tia.blinvphase") : false;
myPFBits[set] = devSettings ? instance().settings().getBool("dev.tia.delaypfbits") : false; myPFBits[set] = devSettings ? instance().settings().getBool("dev.tia.delaypfbits") : false;
myPFColor[set] = devSettings ? instance().settings().getBool("dev.tia.delaypfcolor") : false; myPFColor[set] = devSettings ? instance().settings().getBool("dev.tia.delaypfcolor") : false;
myBKColor[set] = devSettings ? instance().settings().getBool("dev.tia.delaybkcolor") : false;
myPlSwap[set] = devSettings ? instance().settings().getBool("dev.tia.delayplswap") : false; myPlSwap[set] = devSettings ? instance().settings().getBool("dev.tia.delayplswap") : false;
myBlSwap[set] = devSettings ? instance().settings().getBool("dev.tia.delayblswap") : false; myBlSwap[set] = devSettings ? instance().settings().getBool("dev.tia.delayblswap") : false;
@ -708,6 +719,7 @@ void DeveloperDialog::saveSettings(SettingsSet set)
instance().settings().setValue("dev.tia.blinvphase", myBlInvPhase[set]); instance().settings().setValue("dev.tia.blinvphase", myBlInvPhase[set]);
instance().settings().setValue("dev.tia.delaypfbits", myPFBits[set]); instance().settings().setValue("dev.tia.delaypfbits", myPFBits[set]);
instance().settings().setValue("dev.tia.delaypfcolor", myPFColor[set]); instance().settings().setValue("dev.tia.delaypfcolor", myPFColor[set]);
instance().settings().setValue("dev.tia.delaybkcolor", myBKColor[set]);
instance().settings().setValue("dev.tia.delayplswap", myPlSwap[set]); instance().settings().setValue("dev.tia.delayplswap", myPlSwap[set]);
instance().settings().setValue("dev.tia.delayblswap", myBlSwap[set]); instance().settings().setValue("dev.tia.delayblswap", myBlSwap[set]);
} }
@ -762,6 +774,7 @@ void DeveloperDialog::getWidgetStates(SettingsSet set)
myBlInvPhase[set] = myBlInvPhaseWidget->getState(); myBlInvPhase[set] = myBlInvPhaseWidget->getState();
myPFBits[set] = myPFBitsWidget->getState(); myPFBits[set] = myPFBitsWidget->getState();
myPFColor[set] = myPFColorWidget->getState(); myPFColor[set] = myPFColorWidget->getState();
myBKColor[set] = myBKColorWidget->getState();
myPlSwap[set] = myPlSwapWidget->getState(); myPlSwap[set] = myPlSwapWidget->getState();
myBlSwap[set] = myBlSwapWidget->getState(); myBlSwap[set] = myBlSwapWidget->getState();
@ -909,6 +922,7 @@ void DeveloperDialog::saveConfig()
instance().console().tia().setBlInvertedPhaseClock(myBlInvPhaseWidget->getState()); instance().console().tia().setBlInvertedPhaseClock(myBlInvPhaseWidget->getState());
instance().console().tia().setPFBitsDelay(myPFBitsWidget->getState()); instance().console().tia().setPFBitsDelay(myPFBitsWidget->getState());
instance().console().tia().setPFColorDelay(myPFColorWidget->getState()); instance().console().tia().setPFColorDelay(myPFColorWidget->getState());
instance().console().tia().setBKColorDelay(myBKColorWidget->getState());
instance().console().tia().setPlSwapDelay(myPlSwapWidget->getState()); instance().console().tia().setPlSwapDelay(myPlSwapWidget->getState());
instance().console().tia().setBlSwapDelay(myBlSwapWidget->getState()); instance().console().tia().setBlSwapDelay(myBlSwapWidget->getState());
} }
@ -995,6 +1009,7 @@ void DeveloperDialog::setDefaults()
myBlInvPhase[set] = devSettings ? true : false; myBlInvPhase[set] = devSettings ? true : false;
myPFBits[set] = devSettings ? true : false; myPFBits[set] = devSettings ? true : false;
myPFColor[set] = devSettings ? true : false; myPFColor[set] = devSettings ? true : false;
myBKColor[set] = devSettings ? true : false;
myPlSwap[set] = devSettings ? true : false; myPlSwap[set] = devSettings ? true : false;
myBlSwap[set] = devSettings ? true : false; myBlSwap[set] = devSettings ? true : false;
@ -1210,8 +1225,10 @@ void DeveloperDialog::handleTia()
myMsInvPhaseWidget->setEnabled(enable); myMsInvPhaseWidget->setEnabled(enable);
myBlInvPhaseWidget->setEnabled(enable); myBlInvPhaseWidget->setEnabled(enable);
myPlayfieldLabel->setEnabled(enable); myPlayfieldLabel->setEnabled(enable);
myBackgroundLabel->setEnabled(enable);
myPFBitsWidget->setEnabled(enable); myPFBitsWidget->setEnabled(enable);
myPFColorWidget->setEnabled(enable); myPFColorWidget->setEnabled(enable);
myBKColorWidget->setEnabled(enable);
mySwapLabel->setEnabled(enable); mySwapLabel->setEnabled(enable);
myPlSwapWidget->setEnabled(enable); myPlSwapWidget->setEnabled(enable);
myBlSwapWidget->setEnabled(enable); myBlSwapWidget->setEnabled(enable);
@ -1223,6 +1240,7 @@ void DeveloperDialog::handleTia()
myBlInvPhaseWidget->setState(myBlInvPhase[SettingsSet::developer]); myBlInvPhaseWidget->setState(myBlInvPhase[SettingsSet::developer]);
myPFBitsWidget->setState(myPFBits[SettingsSet::developer]); myPFBitsWidget->setState(myPFBits[SettingsSet::developer]);
myPFColorWidget->setState(myPFColor[SettingsSet::developer]); myPFColorWidget->setState(myPFColor[SettingsSet::developer]);
myBKColorWidget->setState(myBKColor[SettingsSet::developer]);
myPlSwapWidget->setState(myPlSwap[SettingsSet::developer]); myPlSwapWidget->setState(myPlSwap[SettingsSet::developer]);
myBlSwapWidget->setState(myBlSwap[SettingsSet::developer]); myBlSwapWidget->setState(myBlSwap[SettingsSet::developer]);
} }
@ -1233,6 +1251,7 @@ void DeveloperDialog::handleTia()
myBlInvPhaseWidget->setState(false); myBlInvPhaseWidget->setState(false);
myPFBitsWidget->setState(BSPF::equalsIgnoreCase("pesco", myTIATypeWidget->getSelectedTag().toString())); myPFBitsWidget->setState(BSPF::equalsIgnoreCase("pesco", myTIATypeWidget->getSelectedTag().toString()));
myPFColorWidget->setState(BSPF::equalsIgnoreCase("quickstep", myTIATypeWidget->getSelectedTag().toString())); myPFColorWidget->setState(BSPF::equalsIgnoreCase("quickstep", myTIATypeWidget->getSelectedTag().toString()));
myBKColorWidget->setState(BSPF::equalsIgnoreCase("indy500", myTIATypeWidget->getSelectedTag().toString()));
myPlSwapWidget->setState(BSPF::equalsIgnoreCase("heman", myTIATypeWidget->getSelectedTag().toString())); myPlSwapWidget->setState(BSPF::equalsIgnoreCase("heman", myTIATypeWidget->getSelectedTag().toString()));
myBlSwapWidget->setState(false); myBlSwapWidget->setState(false);
} }

View File

@ -115,6 +115,8 @@ class DeveloperDialog : public Dialog
StaticTextWidget* myPlayfieldLabel{nullptr}; StaticTextWidget* myPlayfieldLabel{nullptr};
CheckboxWidget* myPFBitsWidget{nullptr}; CheckboxWidget* myPFBitsWidget{nullptr};
CheckboxWidget* myPFColorWidget{nullptr}; CheckboxWidget* myPFColorWidget{nullptr};
StaticTextWidget* myBackgroundLabel{nullptr};
CheckboxWidget* myBKColorWidget{nullptr};
StaticTextWidget* mySwapLabel{nullptr}; StaticTextWidget* mySwapLabel{nullptr};
CheckboxWidget* myPlSwapWidget{nullptr}; CheckboxWidget* myPlSwapWidget{nullptr};
CheckboxWidget* myBlSwapWidget{nullptr}; CheckboxWidget* myBlSwapWidget{nullptr};
@ -172,6 +174,7 @@ class DeveloperDialog : public Dialog
std::array<bool, 2> myBlInvPhase; std::array<bool, 2> myBlInvPhase;
std::array<bool, 2> myPFBits; std::array<bool, 2> myPFBits;
std::array<bool, 2> myPFColor; std::array<bool, 2> myPFColor;
std::array<bool, 2> myBKColor;
std::array<bool, 2> myPlSwap; std::array<bool, 2> myPlSwap;
std::array<bool, 2> myBlSwap; std::array<bool, 2> myBlSwap;
// States sets // States sets