From b3ec0df929bd9bc8dfe2557931281cc89f347c41 Mon Sep 17 00:00:00 2001 From: Brendan Robert Date: Sat, 6 Apr 2024 11:59:29 -0500 Subject: [PATCH] Speed adjusts down for portrait animation --- .../src/main/java/jace/LawlessLegends.java | 1 - .../src/main/java/jace/core/Motherboard.java | 2 +- .../src/main/java/jace/core/TimedDevice.java | 4 +++ .../main/java/jace/lawless/LawlessHacks.java | 31 +++++++++++++++++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Platform/Apple/tools/jace/src/main/java/jace/LawlessLegends.java b/Platform/Apple/tools/jace/src/main/java/jace/LawlessLegends.java index fef8b9f2..7c727d69 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/LawlessLegends.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/LawlessLegends.java @@ -167,7 +167,6 @@ public class LawlessLegends extends Application { resetEmulator(); configureEmulatorForGame(); bootWatchdog(); - // Emulator.getComputer().getCpu().trace=true; } else { startListener.unregister(); } diff --git a/Platform/Apple/tools/jace/src/main/java/jace/core/Motherboard.java b/Platform/Apple/tools/jace/src/main/java/jace/core/Motherboard.java index 3beb9dd1..4986c15a 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/core/Motherboard.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/core/Motherboard.java @@ -123,5 +123,5 @@ public class Motherboard extends IndependentTimedDevice { if (accelorationRequestors.remove(requester) && accelorationRequestors.isEmpty()) { disableTempMaxSpeed(); } - } + } } diff --git a/Platform/Apple/tools/jace/src/main/java/jace/core/TimedDevice.java b/Platform/Apple/tools/jace/src/main/java/jace/core/TimedDevice.java index 901319cd..b9d88389 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/core/TimedDevice.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/core/TimedDevice.java @@ -124,6 +124,10 @@ public abstract class TimedDevice extends Device { } } + public final boolean isMaxSpeedEnabled() { + return maxspeed; + } + public final boolean isMaxSpeed() { return forceMaxspeed || maxspeed; } diff --git a/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java b/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java index 1aa02285..646310c5 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java @@ -19,7 +19,10 @@ import java.util.regex.Pattern; import jace.Emulator; import jace.apple2e.VideoDHGR; import jace.cheat.Cheats; +import jace.core.Computer; +import jace.core.Motherboard; import jace.core.RAMEvent; +import jace.core.TimedDevice; import javafx.util.Duration; /** @@ -117,9 +120,11 @@ public class LawlessHacks extends Cheats { private Map keyReadAddresses = new TreeMap<>(); long lastKeyStatus = 0; + long lastKnownSpeed = -1; + boolean isCurrentlyMaxSpeed = false; private void adjustAnimationSpeed(RAMEvent e) { + int pc = Emulator.withComputer(c->c.getCpu().getProgramCounter(), 0); if (DEBUG) { - int pc = Emulator.withComputer(c->c.getCpu().getProgramCounter(), 0); keyReadAddresses.put(pc, keyReadAddresses.getOrDefault(pc, 0) + 1); if ((System.currentTimeMillis() - lastKeyStatus) >= 10000) { lastKeyStatus = System.currentTimeMillis(); @@ -129,8 +134,28 @@ public class LawlessHacks extends Cheats { }); } } - // D5FE: Key-in routine used when animating portraits - } + Motherboard m = Emulator.withComputer(Computer::getMotherboard, null); + long currentSpeed = m.getSpeedInHz(); + if (pc == 0x0D5FE) { + long slowerSpeed = (long) (TimedDevice.NTSC_1MHZ * 1.5); + // We are waiting for a key in portait mode, slow to 1.5x + if (currentSpeed > slowerSpeed || m.isMaxSpeedEnabled()) { + lastKnownSpeed = currentSpeed; + isCurrentlyMaxSpeed = m.isMaxSpeedEnabled(); + m.setSpeedInHz(slowerSpeed); + m.setMaxSpeed(false); + m.cancelSpeedRequest(this); + } + } else { + // We're in some other mode, go back the default speed + if (currentSpeed < lastKnownSpeed || isCurrentlyMaxSpeed) { + m.setSpeedInHz(lastKnownSpeed); + m.setMaxSpeed(isCurrentlyMaxSpeed); + isCurrentlyMaxSpeed = false; + lastKnownSpeed = -1; + } + } + } public static final String SCORE_NONE = "none"; public static final String SCORE_COMMON = "common";