From 7be8c8f327f72df42f533be230a5d1f54a76024e Mon Sep 17 00:00:00 2001 From: Christian Speckner Date: Tue, 13 Aug 2024 13:13:28 +0200 Subject: [PATCH 1/3] Gobble movement pulse on clock 0. --- src/emucore/tia/Ball.hxx | 6 +++--- src/emucore/tia/Missile.hxx | 2 +- src/emucore/tia/Player.hxx | 6 +++--- src/emucore/tia/TIA.cxx | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/emucore/tia/Ball.hxx b/src/emucore/tia/Ball.hxx index 74c44b7f1..5bfe8bb9c 100644 --- a/src/emucore/tia/Ball.hxx +++ b/src/emucore/tia/Ball.hxx @@ -167,7 +167,7 @@ class Ball : public Serializable /** Process a single movement tick. Inline for performance (implementation below). */ - FORCE_INLINE void movementTick(uInt32 clock, bool hblank); + FORCE_INLINE void movementTick(uInt32 clock, uInt32 hclock, bool hblank); /** Tick one color clock. Inline for performance (implementation below). @@ -341,7 +341,7 @@ class Ball : public Serializable // ############################################################################ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Ball::movementTick(uInt32 clock, bool hblank) +void Ball::movementTick(uInt32 clock, uInt32 hclock, bool hblank) { myLastMovementTick = myCounter; @@ -350,7 +350,7 @@ void Ball::movementTick(uInt32 clock, bool hblank) // Stop movement once the number of clocks according to HMBL is reached if (clock == myHmmClocks) isMoving = false; - else + else if (hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/Missile.hxx b/src/emucore/tia/Missile.hxx index 995a18650..aa54055a1 100644 --- a/src/emucore/tia/Missile.hxx +++ b/src/emucore/tia/Missile.hxx @@ -149,7 +149,7 @@ void Missile::movementTick(uInt8 clock, uInt8 hclock, bool hblank) // Stop movement once the number of clocks according to HMMx is reached if(clock == myHmmClocks) isMoving = false; - else + else if (hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/Player.hxx b/src/emucore/tia/Player.hxx index 222e2a7d5..289d22c1d 100644 --- a/src/emucore/tia/Player.hxx +++ b/src/emucore/tia/Player.hxx @@ -88,7 +88,7 @@ class Player : public Serializable bool save(Serializer& out) const override; bool load(Serializer& in) override; - FORCE_INLINE void movementTick(uInt32 clock, bool hblank); + FORCE_INLINE void movementTick(uInt32 clock, uInt32 hclock, bool hblank); FORCE_INLINE void tick(); @@ -158,14 +158,14 @@ class Player : public Serializable // ############################################################################ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Player::movementTick(uInt32 clock, bool hblank) +void Player::movementTick(uInt32 clock, uInt32 hclock, bool hblank) { if(isMoving) { // Stop movement once the number of clocks according to HMPx is reached if (clock == myHmmClocks) isMoving = false; - else + else if (hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/TIA.cxx b/src/emucore/tia/TIA.cxx index a7bb57f5d..658f53e69 100644 --- a/src/emucore/tia/TIA.cxx +++ b/src/emucore/tia/TIA.cxx @@ -1558,9 +1558,9 @@ FORCE_INLINE void TIA::tickMovement() myMissile0.movementTick(movementCounter, myHctr, hblank); myMissile1.movementTick(movementCounter, myHctr, hblank); - myPlayer0.movementTick(movementCounter, hblank); - myPlayer1.movementTick(movementCounter, hblank); - myBall.movementTick(movementCounter, hblank); + myPlayer0.movementTick(movementCounter, myHctr, hblank); + myPlayer1.movementTick(movementCounter, myHctr, hblank); + myBall.movementTick(movementCounter, myHctr, hblank); myMovementInProgress = myMissile0.isMoving || From f92d2fc6df249d7ec18717919755919fd2f304a0 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Tue, 13 Aug 2024 14:54:03 +0200 Subject: [PATCH 2/3] enhanced UI and settings for TIA glitch "short late HMOVEs" --- src/common/DevSettingsHandler.cxx | 9 ++++++++ src/common/DevSettingsHandler.hxx | 3 +++ src/emucore/Settings.cxx | 12 ++++++++-- src/emucore/tia/Ball.cxx | 7 ++++++ src/emucore/tia/Ball.hxx | 5 +++- src/emucore/tia/Missile.cxx | 7 ++++++ src/emucore/tia/Missile.hxx | 4 +++- src/emucore/tia/Player.cxx | 7 ++++++ src/emucore/tia/Player.hxx | 4 +++- src/emucore/tia/TIA.cxx | 26 +++++++++++++++++++++ src/emucore/tia/TIA.hxx | 21 +++++++++++++++++ src/gui/DeveloperDialog.cxx | 38 ++++++++++++++++++++++++++++--- src/gui/DeveloperDialog.hxx | 8 +++++++ 13 files changed, 143 insertions(+), 8 deletions(-) diff --git a/src/common/DevSettingsHandler.cxx b/src/common/DevSettingsHandler.cxx index c457c16d8..4b569385e 100644 --- a/src/common/DevSettingsHandler.cxx +++ b/src/common/DevSettingsHandler.cxx @@ -70,6 +70,9 @@ void DevSettingsHandler::loadSettings(SettingsSet set) myPlInvPhase[set] = devSettings ? settings.getBool("dev.tia.plinvphase") : false; myMsInvPhase[set] = devSettings ? settings.getBool("dev.tia.msinvphase") : false; myBlInvPhase[set] = devSettings ? settings.getBool("dev.tia.blinvphase") : false; + myPlLateHMove[set] = devSettings ? settings.getBool("dev.tia.pllatehmove") : false; + myMsLateHMove[set] = devSettings ? settings.getBool("dev.tia.mslatehmove") : false; + myBlLateHMove[set] = devSettings ? settings.getBool("dev.tia.bllatehmove") : false; myPFBits[set] = devSettings ? settings.getBool("dev.tia.delaypfbits") : false; myPFColor[set] = devSettings ? settings.getBool("dev.tia.delaypfcolor") : false; myPFScore[set] = devSettings ? settings.getBool("dev.tia.pfscoreglitch") : false; @@ -141,6 +144,9 @@ void DevSettingsHandler::saveSettings(SettingsSet set) settings.setValue("dev.tia.plinvphase", myPlInvPhase[set]); settings.setValue("dev.tia.msinvphase", myMsInvPhase[set]); settings.setValue("dev.tia.blinvphase", myBlInvPhase[set]); + settings.setValue("dev.tia.pllatehmove", myPlLateHMove[set]); + settings.setValue("dev.tia.mslatehmove", myMsLateHMove[set]); + settings.setValue("dev.tia.bllatehmove", myBlLateHMove[set]); settings.setValue("dev.tia.delaypfbits", myPFBits[set]); settings.setValue("dev.tia.delaypfcolor", myPFColor[set]); settings.setValue("dev.tia.pfscoreglitch", myPFScore[set]); @@ -197,6 +203,9 @@ void DevSettingsHandler::applySettings(SettingsSet set) myOSystem.console().tia().setPlInvertedPhaseClock(myPlInvPhase[set]); myOSystem.console().tia().setMsInvertedPhaseClock(myMsInvPhase[set]); myOSystem.console().tia().setBlInvertedPhaseClock(myBlInvPhase[set]); + myOSystem.console().tia().setPlShortLateHMove(myPlLateHMove[set]); + myOSystem.console().tia().setMsShortLateHMove(myMsLateHMove[set]); + myOSystem.console().tia().setBlShortLateHMove(myBlLateHMove[set]); myOSystem.console().tia().setPFBitsDelay(myPFBits[set]); myOSystem.console().tia().setPFColorDelay(myPFColor[set]); myOSystem.console().tia().setPFScoreGlitch(myPFScore[set]); diff --git a/src/common/DevSettingsHandler.hxx b/src/common/DevSettingsHandler.hxx index b2c304d3d..802809dde 100644 --- a/src/common/DevSettingsHandler.hxx +++ b/src/common/DevSettingsHandler.hxx @@ -73,6 +73,9 @@ class DevSettingsHandler std::array myPlInvPhase; std::array myMsInvPhase; std::array myBlInvPhase; + std::array myPlLateHMove; + std::array myMsLateHMove; + std::array myBlLateHMove; std::array myPFBits; std::array myPFColor; std::array myPFScore; diff --git a/src/emucore/Settings.cxx b/src/emucore/Settings.cxx index 8dd3c12eb..6df1bfe52 100644 --- a/src/emucore/Settings.cxx +++ b/src/emucore/Settings.cxx @@ -297,6 +297,9 @@ Settings::Settings() setPermanent("dev.tia.plinvphase", "true"); setPermanent("dev.tia.msinvphase", "true"); setPermanent("dev.tia.blinvphase", "true"); + setPermanent("dev.tia.pllatehmove", "true"); + setPermanent("dev.tia.mslatehmove", "true"); + setPermanent("dev.tia.bllatehmove", "true"); setPermanent("dev.tia.delaypfbits", "true"); setPermanent("dev.tia.delaypfcolor", "true"); setPermanent("dev.tia.pfscoreglitch", "true"); @@ -312,7 +315,7 @@ Settings::Settings() setPermanent("dev.extaccess", "true"); // Thumb ARM emulation options setPermanent("dev.thumb.trapfatal", "true"); - setPermanent("dev.arm.mips", CartridgeELF::MIPS_DEF); + setPermanent("dev.arm.mips", CartridgeELF::MIPS_DEF); #ifdef DEBUGGER_SUPPORT setPermanent("dev.thumb.inccycles", "true"); setPermanent("dev.thumb.cyclefactor", "1.05"); @@ -811,11 +814,16 @@ void Settings::usage() << " koolaidman|\n" << " cosmicark|pesco|\n" << " quickstep|matchie|\n" - << " indy500|heman|>\n" + << " indy500|heman|\n" + << " flashmenu>\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" << " missiles\n" << " -dev.tia.blinvphase <1|0> Enable inverted HMOVE clock phase for ball\n" + << " -dev.tia.pllatehmove <1|0> Enable short late HMOVE for players\n" + << " -dev.tia.mslatehmove <1|0> Enable short late HMOVE for\n" + << " missiles\n" + << " -dev.tia.bllatehmove <1|0> Enable short late HMOVE for ball\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.pfscoreglitch <1|0> Enable PF score mode color glitch\n" diff --git a/src/emucore/tia/Ball.cxx b/src/emucore/tia/Ball.cxx index 242f103bd..d9e3a5af4 100644 --- a/src/emucore/tia/Ball.cxx +++ b/src/emucore/tia/Ball.cxx @@ -45,6 +45,7 @@ void Ball::reset() myRenderCounter = 0; myInvertedPhaseClock = false; myUseInvertedPhaseClock = false; + myUseShortLateHMove = false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -153,6 +154,12 @@ void Ball::setInvertedPhaseClock(bool enable) myUseInvertedPhaseClock = enable; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Ball::setShortLateHMove(bool enable) +{ + myUseShortLateHMove = enable; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Ball::startMovement() { diff --git a/src/emucore/tia/Ball.hxx b/src/emucore/tia/Ball.hxx index 5bfe8bb9c..df468566c 100644 --- a/src/emucore/tia/Ball.hxx +++ b/src/emucore/tia/Ball.hxx @@ -108,6 +108,7 @@ class Ball : public Serializable Aid Man bug on some Jr. models. */ void setInvertedPhaseClock(bool enable); + void setShortLateHMove(bool enable); /** Start movement --- this is triggered by strobing HMOVE. @@ -323,6 +324,8 @@ class Ball : public Serializable */ bool myUseInvertedPhaseClock{false}; + bool myUseShortLateHMove{false}; + /** TIA instance. Required for flushing the line cache and requesting collision updates. */ @@ -350,7 +353,7 @@ void Ball::movementTick(uInt32 clock, uInt32 hclock, bool hblank) // Stop movement once the number of clocks according to HMBL is reached if (clock == myHmmClocks) isMoving = false; - else if (hclock != 0) + else if (!myUseShortLateHMove || hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/Missile.cxx b/src/emucore/tia/Missile.cxx index 4e1c9371d..8ed8ddda9 100644 --- a/src/emucore/tia/Missile.cxx +++ b/src/emucore/tia/Missile.cxx @@ -46,6 +46,7 @@ void Missile::reset() collision = myCollisionMaskDisabled; myInvertedPhaseClock = false; myUseInvertedPhaseClock = false; + myUseShortLateHMove = false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -199,6 +200,12 @@ void Missile::setInvertedPhaseClock(bool enable) myUseInvertedPhaseClock = enable; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Missile::setShortLateHMove(bool enable) +{ + myUseShortLateHMove = enable; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Missile::updateEnabled() { diff --git a/src/emucore/tia/Missile.hxx b/src/emucore/tia/Missile.hxx index aa54055a1..04f6fe4f6 100644 --- a/src/emucore/tia/Missile.hxx +++ b/src/emucore/tia/Missile.hxx @@ -60,6 +60,7 @@ class Missile : public Serializable void applyColorLoss(); void setInvertedPhaseClock(bool enable); + void setShortLateHMove(bool enable); void toggleCollisions(bool enabled); @@ -127,6 +128,7 @@ class Missile : public Serializable bool myInvertedPhaseClock{false}; bool myUseInvertedPhaseClock{false}; + bool myUseShortLateHMove{false}; TIA *myTIA{nullptr}; @@ -149,7 +151,7 @@ void Missile::movementTick(uInt8 clock, uInt8 hclock, bool hblank) // Stop movement once the number of clocks according to HMMx is reached if(clock == myHmmClocks) isMoving = false; - else if (hclock != 0) + else if (!myUseShortLateHMove || hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/Player.cxx b/src/emucore/tia/Player.cxx index 0925f25ee..5698d0c38 100644 --- a/src/emucore/tia/Player.cxx +++ b/src/emucore/tia/Player.cxx @@ -47,6 +47,7 @@ void Player::reset() myDividerChangeCounter = -1; myInvertedPhaseClock = false; myUseInvertedPhaseClock = false; + myUseShortLateHMove = false; myPattern = 0; setDivider(1); @@ -260,6 +261,12 @@ void Player::setInvertedPhaseClock(bool enable) myUseInvertedPhaseClock = enable; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Player::setShortLateHMove(bool enable) +{ + myUseShortLateHMove = enable; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Player::startMovement() { diff --git a/src/emucore/tia/Player.hxx b/src/emucore/tia/Player.hxx index 289d22c1d..823d627eb 100644 --- a/src/emucore/tia/Player.hxx +++ b/src/emucore/tia/Player.hxx @@ -60,6 +60,7 @@ class Player : public Serializable void applyColorLoss(); void setInvertedPhaseClock(bool enable); + void setShortLateHMove(bool enable); void startMovement(); @@ -143,6 +144,7 @@ class Player : public Serializable bool myIsDelaying{false}; bool myInvertedPhaseClock{false}; bool myUseInvertedPhaseClock{false}; + bool myUseShortLateHMove{false}; TIA* myTIA{nullptr}; @@ -165,7 +167,7 @@ void Player::movementTick(uInt32 clock, uInt32 hclock, bool hblank) // Stop movement once the number of clocks according to HMPx is reached if (clock == myHmmClocks) isMoving = false; - else if (hclock != 0) + else if (!myUseShortLateHMove || hclock != 0) { // Process the tick if we are in hblank. Otherwise, the tick is either masked // by an ordinary tick or merges two consecutive ticks into a single tick (inverted diff --git a/src/emucore/tia/TIA.cxx b/src/emucore/tia/TIA.cxx index 658f53e69..98ed5ffa3 100644 --- a/src/emucore/tia/TIA.cxx +++ b/src/emucore/tia/TIA.cxx @@ -978,6 +978,11 @@ void TIA::applyDeveloperSettings() ? mySettings.getBool("dev.tia.msinvphase") : BSPF::equalsIgnoreCase("cosmicark", mySettings.getString("dev.tia.type"))); setBlInvertedPhaseClock(custom ? mySettings.getBool("dev.tia.blinvphase") : false); + setPlShortLateHMove(custom + ? mySettings.getBool("dev.tia.pllatehmove") + : BSPF::equalsIgnoreCase("flashmenu", mySettings.getString("dev.tia.type"))); + setMsShortLateHMove(custom ? mySettings.getBool("dev.tia.mslatehmove") : false); + setBlShortLateHMove(custom ? mySettings.getBool("dev.tia.bllatehmove") : false); setPFBitsDelay(custom ? mySettings.getBool("dev.tia.delaypfbits") : BSPF::equalsIgnoreCase("pesco", mySettings.getString("dev.tia.type"))); @@ -1900,6 +1905,27 @@ void TIA::setBlInvertedPhaseClock(bool enable) myBall.setInvertedPhaseClock(enable); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void TIA::setPlShortLateHMove(bool enable) +{ + myPlayer0.setShortLateHMove(enable); + myPlayer1.setShortLateHMove(enable); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void TIA::setMsShortLateHMove(bool enable) +{ + myMissile0.setShortLateHMove(enable); + myMissile1.setShortLateHMove(enable); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void TIA::setBlShortLateHMove(bool enable) +{ + myBall.setShortLateHMove(enable); +} + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void TIA::delayedWrite(uInt8 address, uInt8 value) { diff --git a/src/emucore/tia/TIA.hxx b/src/emucore/tia/TIA.hxx index bd7873b46..75f47cf79 100644 --- a/src/emucore/tia/TIA.hxx +++ b/src/emucore/tia/TIA.hxx @@ -523,6 +523,27 @@ class TIA : public Device */ void setBlInvertedPhaseClock(bool enable); + /** + Enables/disables short late HMOVE for players. + + @param enable Whether to enable short late HMOVE for players + */ + void setPlShortLateHMove(bool enable); + + /** + Enables/disables short late HMOVE for missiles. + + @param enable Whether to enable short late HMOVE for missiles + */ + void setMsShortLateHMove(bool enable); + + /** + Enables/disables short late HMOVE for ball. + + @param enable Whether to enable short late HMOVE for ball + */ + void setBlShortLateHMove(bool enable); + /** This method should be called to update the TIA with a new scanline. */ diff --git a/src/gui/DeveloperDialog.cxx b/src/gui/DeveloperDialog.cxx index 282a62726..a049f25ce 100644 --- a/src/gui/DeveloperDialog.cxx +++ b/src/gui/DeveloperDialog.cxx @@ -229,8 +229,8 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font) myArmSpeedWidget = new SliderWidget(myTab, font, HBORDER + INDENT * 1, ypos - 1, fontWidth * 10, lineHeight, "Limit ARM speed (*) ", 0, kArmSpeedChanged, fontWidth * 9, " MIPS"); - myArmSpeedWidget->setMinValue(CartridgeELF::MIPS_MIN); - myArmSpeedWidget->setMaxValue(CartridgeELF::MIPS_MAX); + myArmSpeedWidget->setMinValue(CartridgeELF::MIPS_MIN); + myArmSpeedWidget->setMaxValue(CartridgeELF::MIPS_MAX); myArmSpeedWidget->setTickmarkIntervals((CartridgeELF::MIPS_MAX - CartridgeELF::MIPS_MIN) / 50); myArmSpeedWidget->setStepValue(2); myArmSpeedWidget->setToolTip("Limit emulation speed to simulate ARM CPU used for ELF."); @@ -238,7 +238,7 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font) ypos = myTab->getHeight() - fontHeight - infofont.getFontHeight() - VGAP - VBORDER; lwidth = infofont.getStringWidth("(*) Change requires a reload for ELF ROMs"); - new StaticTextWidget(myTab, infofont, HBORDER, ypos, lwidth, infofont.getFontHeight(), + new StaticTextWidget(myTab, infofont, HBORDER, ypos, lwidth, infofont.getFontHeight(), "(*) Change requires a reload for ELF ROMs"); // Add items for tab 0 @@ -286,6 +286,7 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font) VarList::push_back(items, "Glitched Matchie line", "matchie"); VarList::push_back(items, "Glitched Indy 500 menu", "indy500"); VarList::push_back(items, "Glitched He-Man title", "heman"); + VarList::push_back(items, "Shifted flashcart menu", "flashmenu"); VarList::push_back(items, "Custom", "custom"); myTIATypeWidget = new PopUpWidget(myTab, font, HBORDER + INDENT, ypos - 1, pwidth, lineHeight, items, "Chip type ", 0, kTIAType); @@ -314,6 +315,24 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font) wid.push_back(myBlInvPhaseWidget); ypos += lineHeight + VGAP * 1; + myLateHMoveLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, + "Short late HMOVEs for"); + myLateHMoveLabel->setToolTip("Objects react different to late HMOVEs"); + wid.push_back(myLateHMoveLabel); + ypos += lineHeight + VGAP * 1; + + myPlLateHMoveWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "Players"); + wid.push_back(myPlLateHMoveWidget); + + myMsLateHMoveWidget = new CheckboxWidget(myTab, font, myPlLateHMoveWidget->getRight() + fontWidth() * 2.5, + ypos + 1, "Missiles"); + wid.push_back(myMsLateHMoveWidget); + + myBlLateHMoveWidget = new CheckboxWidget(myTab, font, myMsLateHMoveWidget->getRight() + fontWidth() * 2.5, + ypos + 1, "Ball"); + wid.push_back(myBlLateHMoveWidget); + ypos += lineHeight + VGAP * 1; + myPlayfieldLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, "Delayed playfield"); myPlayfieldLabel->setToolTip("Playfield reacts one color clock slower to updates."); @@ -758,6 +777,9 @@ void DeveloperDialog::getWidgetStates(SettingsSet set) myPlInvPhase[set] = myPlInvPhaseWidget->getState(); myMsInvPhase[set] = myMsInvPhaseWidget->getState(); myBlInvPhase[set] = myBlInvPhaseWidget->getState(); + myPlLateHMove[set] = myPlLateHMoveWidget->getState(); + myMsLateHMove[set] = myMsLateHMoveWidget->getState(); + myBlLateHMove[set] = myBlLateHMoveWidget->getState(); myPFBits[set] = myPFBitsWidget->getState(); myPFColor[set] = myPFColorWidget->getState(); myPFScore[set] = myPFScoreWidget->getState(); @@ -1183,6 +1205,10 @@ void DeveloperDialog::handleTia() myPlInvPhaseWidget->setEnabled(enable); myMsInvPhaseWidget->setEnabled(enable); myBlInvPhaseWidget->setEnabled(enable); + myLateHMoveLabel->setEnabled(enable); + myPlLateHMoveWidget->setEnabled(enable); + myMsLateHMoveWidget->setEnabled(enable); + myBlLateHMoveWidget->setEnabled(enable); myPlayfieldLabel->setEnabled(enable); myBackgroundLabel->setEnabled(enable); myPFBitsWidget->setEnabled(enable); @@ -1200,6 +1226,9 @@ void DeveloperDialog::handleTia() myPlInvPhaseWidget->setState(myPlInvPhase[set]); myMsInvPhaseWidget->setState(myMsInvPhase[set]); myBlInvPhaseWidget->setState(myBlInvPhase[set]); + myPlLateHMoveWidget->setState(myPlLateHMove[set]); + myMsLateHMoveWidget->setState(myMsLateHMove[set]); + myBlLateHMoveWidget->setState(myBlLateHMove[set]); myPFBitsWidget->setState(myPFBits[set]); myPFColorWidget->setState(myPFColor[set]); myPFScoreWidget->setState(myPFScore[set]); @@ -1212,6 +1241,9 @@ void DeveloperDialog::handleTia() myPlInvPhaseWidget->setState(BSPF::equalsIgnoreCase("koolaidman", myTIATypeWidget->getSelectedTag().toString())); myMsInvPhaseWidget->setState(BSPF::equalsIgnoreCase("cosmicark", myTIATypeWidget->getSelectedTag().toString())); myBlInvPhaseWidget->setState(false); + myPlLateHMoveWidget->setState(BSPF::equalsIgnoreCase("flashmenu", myTIATypeWidget->getSelectedTag().toString())); + myMsLateHMoveWidget->setState(false); + myBlLateHMoveWidget->setState(false); myPFBitsWidget->setState(BSPF::equalsIgnoreCase("pesco", myTIATypeWidget->getSelectedTag().toString())); myPFColorWidget->setState(BSPF::equalsIgnoreCase("quickstep", myTIATypeWidget->getSelectedTag().toString())); myPFScoreWidget->setState(BSPF::equalsIgnoreCase("matchie", myTIATypeWidget->getSelectedTag().toString())); diff --git a/src/gui/DeveloperDialog.hxx b/src/gui/DeveloperDialog.hxx index 1a4c83489..41418e901 100644 --- a/src/gui/DeveloperDialog.hxx +++ b/src/gui/DeveloperDialog.hxx @@ -108,14 +108,22 @@ class DeveloperDialog : public Dialog, DevSettingsHandler // TIA widgets RadioButtonGroup* mySettingsGroupTia{nullptr}; PopUpWidget* myTIATypeWidget{nullptr}; + StaticTextWidget* myInvPhaseLabel{nullptr}; CheckboxWidget* myPlInvPhaseWidget{nullptr}; CheckboxWidget* myMsInvPhaseWidget{nullptr}; CheckboxWidget* myBlInvPhaseWidget{nullptr}; + + StaticTextWidget* myLateHMoveLabel{nullptr}; + CheckboxWidget* myPlLateHMoveWidget{nullptr}; + CheckboxWidget* myMsLateHMoveWidget{nullptr}; + CheckboxWidget* myBlLateHMoveWidget{nullptr}; + StaticTextWidget* myPlayfieldLabel{nullptr}; CheckboxWidget* myPFBitsWidget{nullptr}; CheckboxWidget* myPFColorWidget{nullptr}; CheckboxWidget* myPFScoreWidget{nullptr}; + StaticTextWidget* myBackgroundLabel{nullptr}; CheckboxWidget* myBKColorWidget{nullptr}; StaticTextWidget* mySwapLabel{nullptr}; From 64705f658f0b96fa429a00dfa84a9cc7fc5b52c7 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Wed, 14 Aug 2024 12:44:01 +0200 Subject: [PATCH 3/3] updated doc for short late HMOVEs --- docs/graphics/options_developer_tia.png | Bin 3782 -> 4374 bytes docs/index.html | 14 +++++++++++++- src/gui/DeveloperDialog.cxx | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/graphics/options_developer_tia.png b/docs/graphics/options_developer_tia.png index 21376b14b82a74b3a2baa0e2cfab3056e7825648..cbeffbf7449a71cbf242fd7d15ee0095866def7c 100644 GIT binary patch literal 4374 zcmb_gc{r5&+nD{+?w=(T0$*~*uz%2B%K)7xp+HSJX{ffyI5U31wXv>*>H$Q1^ zd{x)O!=w28(dA`gM@jH7F$Wv#y!)md1nRZD;%8(F*-Z}k>D$6Upd&3mpFM;-`K}<) z(QpHuD_8FiE@T=dPO9+hep&=4zkS3Fteg}39G73M6tGvgp6%9+y=X>1uu^`#l{&7y zx+*4hI&59%f(dksGjI7a_n27Yv37aMQ^E2YmS+2zm-9KafTQ$>oitjF(TWMhXJ9cm z!bzZnDike-_`q&&IpLhPHcd`PFV0IFkzo)k3||Hh5I4rKH<~(xp`AEoEMfmeT_liI zWKQkQ#C&y-?Dlo(pM^Jv7WTe)3-BO{&!?3d-BrBvjfZaEV9bew1=1&);oJ;k_EebP zf$0jqQ+yK8shnhl9MtU1K43C;gZ}=*$F>hf1%!}kYqh`*#hU<=BQ^PLKF~sL3%yQ8 z7lTtG%p%Y*$u%!mM^r0$`aFfzI+pm38eGPd^$+rVy>P%aFM>tf;6)j3BuF2UYb=G& zayjEz=TF#&#kmu$F#8wqGg**!34n^De>&t?ru_>9bFQgPkC$^I(Vf3zV$S7Sh4xJw zy~?y_)-8>r_=bK^(iiGRyEUtD%N)%2nHF5bQh$dB1rQ(Ol2`>wM}sXOLSg$Ln@yrD zX^cY{H`;8VmI$1eQ`L-$$H#@%`q22s`fmMu3le&toBOyr%j8y8@POArX3vLUxq z6anAy1jtFZ^5BeTp@VmND&o{|)vNnO7n2b(Wz*o=+EU|Ao_;(TjR}Q+U0PoyIWBB? z;kC9yUI<32!BvK z4SgG1qyESiY9v& zl`?(|qZwJS5~)l-2UVa}FL8-T)NHEIZbw}NY&l+u zJJ)i(dpvRyCLEZv6=a9QhP!P<_Ltj*{|c`@6h-_r1YZT|tZ zt!sG!fj@}jdw!nh38>LVd15)}O3=W;o8`LnJkh9$Bxsz<1s z6KbMPIjnHUFXljW@kv$nFGPbl=)$_NV>jo}widpaE`+lR;!8m{oprv}Ai8Nl#_C0t+?w z&0kQIcom5OivIV-KDC!-GRBMgbMCByzc+CYF?Xh}d6cp8#Y>D5{R05qT0^ikGVf74OlFcgGB(3!%ZO7CUp{A7tX`!!?5lQC^Dw^(o z_ch&-X%)wR(8E!10GF-D+Qyr- zR^&i^GT6DuC(ZmViihY0!*!>m00 z?`bwrcX_tWfO~X>U8tw7g|{;v*5`v2bCnvi3d&h{C!ec=_JMbhg=D2Qx}1>Mz?;JadAhz*+W3bF`R^n3J8U4Jp*AF% z*3Ay)uDzQn;4#}UGj9sl^tz|T4v?Z8a^tVd8ofe8Q@aI$8GVHDeTi!rW`6`4o;1>h zgSw<{uN{=K%dqi9#zq%d>E;-Gf3|%P7Ugg@*MOm1skPkx9LxkO@iW3&aTJ3ugRNl1 zRF?yGm4)F=@FCHsj^7VvDB?c0N(Kp zci2IEz(gZAo8-Wcd!~GmuLp&$@A++Jdau(U%B0QFh2*=?!EBGI;RX~7g(Bs)JX#eP z;n}h~TB1CbKU~v-$E5qv=d^n7EkOM{b-A}bAY8|!56I;V_T7xWayAG`!7n5{ESY=@ zEaI>l9U})}{+NBggUzmeJMT%P<(^M~az zUPglyudkvUcqa`?%G(l3O(S=y^6eWM&Qi9GncN9l5i>@*5%~Ih{=S^%BJ<7i6 zG=OalKn_Wen5G!^zFFH`2|xq>CD~u$qbz5Tno8AW;;52HWNWia#~2(FYoIy(`U!Ff zq7)rtfjY3gva3X$;-=y)F%J|nfoS6o*_gG@Ehh)jSszmi1Z*WAlzC@K#!eGN`*esN zXLLdos?K+v!?WfLAdhV-ArX(}QU)jU?aX@gWBFmDZa&19=nLNb{EvN5-(B9RcKP-j zV#QLU&CWA;)+!}$nHv^4L8_<98cPbE2=H+_CMKTvN2mXC=)*6FZW1$HKBiXfaU1qe z`mh3P)$urY1&nk^p=HVTWI7_Kh+@u>Gg_+Q+f7{+o>`Qh)b3&2zGtaPPsK$dr(hj7 z9v9sfZIOZx6rz2;Iwa4#OH{AVJI4|N1v`G0r zbkF!{sc>Pzf5^?>Tct{c4X9InxbzweVOSh)Gh?kfv9{itR!}teV5uZ52G}EfT^Z0J_%j2!aff_Z&#e$5(2)awx)c1FNmV+S9WY^h4VHj zOFuuqQauR{r{hxvVW^{koOop`^O29Q$JzA8IcKFUA$;SEb1)yDSi|q&m({SoyG8WQ zT9~3j2WFq4lk-nX0eBy+`5#5j$Q}7Ht z@#(ehSkXm&VZn9DE9zp~CZG+xaWf0LRnFdL(ejW+Q08?UJh{)W^<=LiwS*Jw#S(J5 zV1jn4kM%jM>!uCMBhu>S65*wvJ#L&dnKuy(FE866%9N`BcEsopROLbq(R&d!VOes5 zuPPO>9+f#RwfmU8(jYJTU9^@?18tnRlwO$_yn3ZJvHk}B7I+wd5}ce?SYbi~Ubw1v zI=mh-RRgG>`{4thr8~_sbZGrvI3)ziCuyXLvE9;Z*?ZETinu7w)72ovGXcq7Y9R*8 zS(^5yl;HuO3hwqMCwCfqt*-3U4yqonE+OsCib9qh?PHw58`Otre z4>5GZGXHwf@9Lsd9VP$UyoGSMEU;-SAxn0YA@>Cg_2rPRwSn_iT&MRhHl1%}tqd*` z2Ot|)u?XYWP_nL(DYm#<^&xU;tosnJ+3gNpR=Z;m-i1H)Gw#x4LW)_=N;c6)?D^QY z)mM?_)b=CH;3xDv~L{9*BZNgaja;zThfn!M-Wjy7_-PZTrw@5O)mzIo(w?7Nv+;X2b zptz%^Sn#1RE3aL&2~a;zX%WJN_wyF^t`!BZ-Wf!Crdv8a1?O9yjCQv;-x%lk8;ZZo zai0H(E`SLfi#f0TL3KNh`8e;3~6*hoMmJ)Wb{!_-(PO7!-roQ4V=Rv+arXS z#_(|0Q3U$>H4)a4!LV+dTVfR>o&d1j7ZOoko7WBZ#Jjo&;pq$2arG*Z(3Q10@yE05 z^r$6REu{mPetmNu;yV0gRo6(4;2lWnD<CYWTYXWPM1%d ziLm|3@qdtZY$SfOh$(l_2>Xkp7n<)Cw*Be><=#P z0>3gBy|-cW)_FhE*KbMRL#%kDGR$3_)SkX`b-%YU5EiS2fnI065#OrdS{Iy1IR$!g zp2>y=c?H;faa5-o6H;ZEP*f8MWkr2`+M`GV@dt8>fL!c%p|aN3))IjD1?a9>Z-H;D zj7dd;A{-^WTi`q1e6zgBe&2q1NQp?D941dFN-i|DmB4&&jn}u~6WX@e(l~)-jzswX z^bgE6=WDl69y$WkQZ@E;-VS(wwUs#ZPN;!sI(oFct zmLIMkzv`7^g2`K%lj%w8a4HxP+Es+UKtJ3_Y z7mg*};iwVjAwM}$jKKzj6BV4LekH~F8AR1$dHHO`8janWK+1S7Qn##r{$F-icr}<` z6Bb;}x^S4wrYx>&U`iiPkGJ~d{(Wt<*8dNnS%1+Sl6aV@gSaI_xiqv~zEC%uNPtJ;}F&cN1r0jDl4wXASdcw7S4 z*V)}JwzU4BQiZX}tn;sFmQmMKB(z+bHF=M9`2K&xae!FzWL6`m-3lWM7aKUFD2~Z8 zfvXCu`z~X5oFCWWMQw=G*mj z5;KE{+=+cBY!~?Lt}mQ9Xf94lKJnyn14*0jidyyJm7)ENi$X_-)s#n2Y<|pXH^9_B zaJlB9oQAg21Clvc!%?Xy(dteQ`2J|bL&*ZEr~OHG_Q$jkz|qj8IhQI49oo(Zz&WP- z_r6GNKj^h>5Wke37pWyo^`Si}D_`4R7-B1FErx`|djIM2r%x~27M3MQzX?9)S@Lah z>`<-3i#hf%^&L{aTC2S(``~9~jg{|9m6^!Yex=0a#)b*fGhtx(uJm}){%`^L@!Tw>^ z?yI)%rslSPvBu_!2q`@_DP%Um!&34!vy(lZ2{497Zc;!<%oTMs^lNyxLEBL z|1?Ao8^3Kyq;4qy3NsE;D^N5_v|j{OGIxz|AJvi0Wi`lY5|uDh(h#YEZ|EsqJqgls z)Y>PWp}>A`vhL3LTtKI3e}QaoT-2R->E>T%F(qbb+fOk$7S$4ENwl9tF-N+P^oI(T z%5m+R?SzSoa;#JQX%fQNouAKT>5gjC?ni?u^7QM|5|1O3s>F;}*l4>ajWmF`Z7GeI zOSauT^&zu?A&YUrox1=!D!JDm=k2rghQHBLs&2tBRvUUgP)ds;#T z$dPUg80c(U;~0ec85|z8>5kR?SadqWH1e}NgfZxl{shitn8UaVdmN`fK$UJiQh)nXLVNE*-s{E@&jQNCE0)0e>G{1 z6HuoSCj1ap=hd|IG3h_1GpxvbiGj;~^#hnU3Hjt%6F&zl77K^6>eL~RVV4rr!nA%< zla52QmHh3&hzVpiUWz=?2wH9(oP2l8_IG+ADbOw!(5}$@_aOXdBH9-pRrc^jO*zb< z^zLHR6Ym7WPq)Y%H4FL|C8TJ$+-Qhk;uhHs27ZZJ>1{HP-Um6-EL#3<*9o@Rx-&dh zwt4bljz@!mNDVL1&?gz(vXt0^`P!K`81toZa!+Sm&}YD^y7MeR#pizZ%g`Qy^X%XR zLHC;2tg(EK9dl)g-L`Liyl}|=E_h_zO|_@DDJ{ekUYlZ|aw&7v@q!YJAmrb}fF@-# z*;7@k`D1fyoNFP(2*q4Hw@>Qd#q8MaEPTk;Chu{d^EC@wo2*QyS+5dDcHpdE;ia8d zo~Ts#S-$CiP*8lUc<>I;Q>@lONm}D83Y5eUBOYAzN8T*t zl$5m=2V*x~yA15*qbZV|E$kXAG~5-y(a%th4rDXvBDBSeI0_V^G|(iPckWOngANbl zzABx2-(AJ1S(LiU!+?(z`iJD!6NWxs--Ui@+{)X>$gmCB`0L>RX)FJ$%lyBj0grxd z3O&P-X#)S?wq`Q&Sy**)cfs|HAbwtf^#n=zd8_t?n)P-t(Ie6b;md7jH81!>8yZUa zBTb6%syyVYg%fU~%w`=24X-nK=$Y#b+4+i&lW^(qw^Ou&+^bynlUfso7VQ{IE$qQz zguO?$8MleLt2FrKc-PxiNxgd$xkbfDkTw-lwoo~9DH@)O&=2Fb`W@j|a07H`<-DGT z(7&Xx_^3WG!H}? z+@w_hKV#e~;-+z>a`s{7U{@aV|GXQld|j|2xwrrCfb?g8OoD=1{w z3?^r=^h*3!When enabled, each external access (AtariVox/SaveKey EEPROM, PlusROM, Supercharger...) is signalled by a message. -
-dev.tia.type <standard|koolaidman|
cosmicark|pesco|quickstep|matchie|
indy500|heman|custom>
+
-dev.tia.type <standard|koolaidman|
cosmicark|pesco|quickstep|matchie|
indy500|heman|flashmenu|custom>
Set emulated TIA type. Only with 'custom' the following TIA options become relevant.
-dev.tia.plinvphase <1|0>
@@ -3705,6 +3705,15 @@
-dev.tia.blinvphase <1|0>
Enable/disable inverted HMOVE clock phase for ball. + +
-dev.tia.pllatehmove <1|0>
+ Enable/disable short late HMOVE for players (Flashcart menu shifted right). + +
-dev.tia.mslatehmove <1|0>
+ Enable/disable short late HMOVE for missiles. + +
-dev.tia.bllatehmove <1|0>
+ Enable/disable short late HMOVE for ball.
-dev.tia.delaypfbits <1|0>
Enable/disable playfield bits delayed by one color clock (stray playfield pixels in Pesco). @@ -4615,6 +4624,9 @@ Inverted HMOVE clock...Emulates the Kool-Aid Man collision and Cosmic Ark stars glitches for the given objects. -dev.tia.plinvphase
-dev.tia.msinvphase
-dev.tia.blinvphase + Short late HMOVEEmulates one pixel too short late HMOVEs for the given objects. + This causes e.g. shifted flashcart menues. + -dev.tia.pllatehmove
-dev.tia.mslatehmove
-dev.tia.bllatehmove Delayed PlayfieldEmulates playfield changes moved by one color clock. This e.g. causes glitches in Pesco (stray playfield pixel), Quick Step! (colored step borders) and Matchie (vertical line at pixel 79). diff --git a/src/gui/DeveloperDialog.cxx b/src/gui/DeveloperDialog.cxx index a049f25ce..0be0b786b 100644 --- a/src/gui/DeveloperDialog.cxx +++ b/src/gui/DeveloperDialog.cxx @@ -316,7 +316,7 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font) ypos += lineHeight + VGAP * 1; myLateHMoveLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, - "Short late HMOVEs for"); + "Short late HMOVE for"); myLateHMoveLabel->setToolTip("Objects react different to late HMOVEs"); wid.push_back(myLateHMoveLabel); ypos += lineHeight + VGAP * 1;