Skip to content

Commit

Permalink
enhanced UI and settings for TIA glitch "short late HMOVEs"
Browse files Browse the repository at this point in the history
  • Loading branch information
thrust26 committed Aug 13, 2024
1 parent 7be8c8f commit f92d2fc
Show file tree
Hide file tree
Showing 13 changed files with 143 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/common/DevSettingsHandler.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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]);
Expand Down
3 changes: 3 additions & 0 deletions src/common/DevSettingsHandler.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ class DevSettingsHandler
std::array<bool, numSets> myPlInvPhase;
std::array<bool, numSets> myMsInvPhase;
std::array<bool, numSets> myBlInvPhase;
std::array<bool, numSets> myPlLateHMove;
std::array<bool, numSets> myMsLateHMove;
std::array<bool, numSets> myBlLateHMove;
std::array<bool, numSets> myPFBits;
std::array<bool, numSets> myPFColor;
std::array<bool, numSets> myPFScore;
Expand Down
12 changes: 10 additions & 2 deletions src/emucore/Settings.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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");
Expand Down Expand Up @@ -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"
Expand Down
7 changes: 7 additions & 0 deletions src/emucore/tia/Ball.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ void Ball::reset()
myRenderCounter = 0;
myInvertedPhaseClock = false;
myUseInvertedPhaseClock = false;
myUseShortLateHMove = false;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expand Down Expand Up @@ -153,6 +154,12 @@ void Ball::setInvertedPhaseClock(bool enable)
myUseInvertedPhaseClock = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Ball::setShortLateHMove(bool enable)
{
myUseShortLateHMove = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Ball::startMovement()
{
Expand Down
5 changes: 4 additions & 1 deletion src/emucore/tia/Ball.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions src/emucore/tia/Missile.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ void Missile::reset()
collision = myCollisionMaskDisabled;
myInvertedPhaseClock = false;
myUseInvertedPhaseClock = false;
myUseShortLateHMove = false;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expand Down Expand Up @@ -199,6 +200,12 @@ void Missile::setInvertedPhaseClock(bool enable)
myUseInvertedPhaseClock = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Missile::setShortLateHMove(bool enable)
{
myUseShortLateHMove = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Missile::updateEnabled()
{
Expand Down
4 changes: 3 additions & 1 deletion src/emucore/tia/Missile.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class Missile : public Serializable
void applyColorLoss();

void setInvertedPhaseClock(bool enable);
void setShortLateHMove(bool enable);

void toggleCollisions(bool enabled);

Expand Down Expand Up @@ -127,6 +128,7 @@ class Missile : public Serializable

bool myInvertedPhaseClock{false};
bool myUseInvertedPhaseClock{false};
bool myUseShortLateHMove{false};

TIA *myTIA{nullptr};

Expand All @@ -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
Expand Down
7 changes: 7 additions & 0 deletions src/emucore/tia/Player.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ void Player::reset()
myDividerChangeCounter = -1;
myInvertedPhaseClock = false;
myUseInvertedPhaseClock = false;
myUseShortLateHMove = false;
myPattern = 0;

setDivider(1);
Expand Down Expand Up @@ -260,6 +261,12 @@ void Player::setInvertedPhaseClock(bool enable)
myUseInvertedPhaseClock = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::setShortLateHMove(bool enable)
{
myUseShortLateHMove = enable;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::startMovement()
{
Expand Down
4 changes: 3 additions & 1 deletion src/emucore/tia/Player.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class Player : public Serializable
void applyColorLoss();

void setInvertedPhaseClock(bool enable);
void setShortLateHMove(bool enable);

void startMovement();

Expand Down Expand Up @@ -143,6 +144,7 @@ class Player : public Serializable
bool myIsDelaying{false};
bool myInvertedPhaseClock{false};
bool myUseInvertedPhaseClock{false};
bool myUseShortLateHMove{false};

TIA* myTIA{nullptr};

Expand All @@ -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
Expand Down
26 changes: 26 additions & 0 deletions src/emucore/tia/TIA.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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")));
Expand Down Expand Up @@ -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)
{
Expand Down
21 changes: 21 additions & 0 deletions src/emucore/tia/TIA.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
38 changes: 35 additions & 3 deletions src/gui/DeveloperDialog.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -229,16 +229,16 @@ 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.");
wid.push_back(myArmSpeedWidget);

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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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.");
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand All @@ -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]);
Expand All @@ -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()));
Expand Down
Loading

0 comments on commit f92d2fc

Please sign in to comment.