From 4acf4e3a734f53828fff500eb66194d480d1dd58 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Tue, 30 Jan 2024 15:40:48 +0100 Subject: [PATCH] made random hotspots peeks a developer option added check for duplicate hotkeys --- Changes.txt | 2 ++ docs/graphics/options_developer.png | Bin 5222 -> 5454 bytes docs/graphics/options_developer_emulation.png | Bin 5179 -> 5409 bytes docs/index.html | 8 ++++++++ src/common/DevSettingsHandler.cxx | 5 +++++ src/common/DevSettingsHandler.hxx | 1 + src/common/PKeyboardHandler.cxx | 18 ++++++++++++++++++ src/common/PKeyboardHandler.hxx | 5 +++++ src/emucore/Cart.cxx | 2 ++ src/emucore/Cart.hxx | 5 +++++ src/emucore/CartEnhanced.cxx | 2 +- src/emucore/CartFA.cxx | 5 ++++- src/emucore/CartFA.hxx | 3 ++- src/emucore/Settings.cxx | 2 ++ src/gui/DeveloperDialog.cxx | 15 ++++++++++++++- src/gui/DeveloperDialog.hxx | 3 ++- 16 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Changes.txt b/Changes.txt index 3dc2b695f..87e470ba5 100644 --- a/Changes.txt +++ b/Changes.txt @@ -50,6 +50,8 @@ * Fixed broken 7800 pause key support. + * Added developer option for random hotspot peek values. + * Added user defined CPU cycle timers to debugger. * Removed 'launcherroms' option, since it was causing some issues. diff --git a/docs/graphics/options_developer.png b/docs/graphics/options_developer.png index 6a8525a656345e966498292ad55bad2c916e5656..95460ab068a9096c8fb5d22b3b4f4c2d91b7f5ed 100644 GIT binary patch literal 5454 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 UQSI$I?pHG1);HCw)p;2Ge**XqWB>pF literal 5179 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 Q>Er
-<plr.|dev.>cpurandom <S,A,X,Y,P>
On reset, randomize the content of the specified CPU registers. + +
-dev.hsrandom <1|0>
+ When this option is enabled, peeks to hotspots return semi-random values.
-dev.tiadriven <1|0>
Set unused TIA pins to be randomly driven high or low on a read/peek. @@ -4567,6 +4570,11 @@ When loading a ROM, randomize the content of the specified CPU registers -plr.cpurandom
-dev.cpurandom + + Random hotspot peek values + Peeks to hotspots return semi-random values + -dev.hsrandom + Drive unused TIA pins ... Unused TIA pins are read random instead of the last databus values diff --git a/src/common/DevSettingsHandler.cxx b/src/common/DevSettingsHandler.cxx index e816076aa..bd9702f74 100644 --- a/src/common/DevSettingsHandler.cxx +++ b/src/common/DevSettingsHandler.cxx @@ -23,6 +23,7 @@ #include "Settings.hxx" #include "StateManager.hxx" #include "TIA.hxx" +#include "Cart.hxx" #include "DevSettingsHandler.hxx" @@ -47,6 +48,8 @@ void DevSettingsHandler::loadSettings(SettingsSet set) myRandomizeTIA[set] = settings.getBool(prefix + "tiarandom"); myRandomizeRAM[set] = settings.getBool(prefix + "ramrandom"); myRandomizeCPU[set] = settings.getString(prefix + "cpurandom"); + // Random hotspot peeks + myRandomHotspots[set] = devSettings ? settings.getBool("dev.hsrandom") : false; // Undriven TIA pins myUndrivenPins[set] = devSettings ? settings.getBool("dev.tiadriven") : false; #ifdef DEBUGGER_SUPPORT @@ -110,6 +113,7 @@ void DevSettingsHandler::saveSettings(SettingsSet set) if(devSettings) { + settings.setValue("dev.hsrandom", myRandomHotspots[set]); // Undriven TIA pins settings.setValue("dev.tiadriven", myUndrivenPins[set]); #ifdef DEBUGGER_SUPPORT @@ -168,6 +172,7 @@ void DevSettingsHandler::applySettings(SettingsSet set) if(myOSystem.hasConsole()) { + myOSystem.console().cartridge().enableRandomHotspots(myRandomHotspots[set]); myOSystem.console().tia().driveUnusedPinsRandom(myUndrivenPins[set]); // Notes: // - thumb exceptions not updated, because set in cart constructor diff --git a/src/common/DevSettingsHandler.hxx b/src/common/DevSettingsHandler.hxx index b3b324bd7..365d8c28d 100644 --- a/src/common/DevSettingsHandler.hxx +++ b/src/common/DevSettingsHandler.hxx @@ -58,6 +58,7 @@ class DevSettingsHandler std::array myTVJitterSense; std::array myTVJitterRec; std::array myDebugColors; + std::array myRandomHotspots; std::array myUndrivenPins; #ifdef DEBUGGER_SUPPORT std::array myRWPortBreak; diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx index cb85ec514..0b171ed36 100644 --- a/src/common/PKeyboardHandler.cxx +++ b/src/common/PKeyboardHandler.cxx @@ -70,8 +70,25 @@ PhysicalKeyboardHandler::PhysicalKeyboardHandler(OSystem& system, EventHandler& #ifdef DEBUGGER_SUPPORT setDefaultMapping(Event::NoType, EventMode::kPromptMode, updateDefaults); #endif +#ifdef DEBUG_BUILD + verifyDefaultMapping(DefaultCommonMapping, EventMode::kEmulationMode, "EmulationMode"); + verifyDefaultMapping(DefaultMenuMapping, EventMode::kMenuMode, "MenuMode"); +#endif } +#ifdef DEBUG_BUILD +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void PhysicalKeyboardHandler::verifyDefaultMapping( + PhysicalKeyboardHandler::EventMappingArray mapping, EventMode mode, string_view name) +{ + for(const auto& item1 : mapping) + for(const auto& item2 : mapping) + if(item1.event != item2.event && item1.key == item2.key && item1.mod == item2.mod) + cerr << "ERROR! Duplicate hotkey mapping found: " << name << ", " + << myKeyMap.getDesc(KeyMap::Mapping(mode, item1.key, item1.mod)) << "\n"; +} +#endif + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void PhysicalKeyboardHandler::loadSerializedMappings( string_view serializedMapping, EventMode mode) @@ -660,6 +677,7 @@ PhysicalKeyboardHandler::DefaultCommonMapping = { { Event::PhosphorDecrease, KBDK_4, KBDM_SHIFT | MOD3 }, { Event::PhosphorIncrease, KBDK_4, MOD3 }, { Event::TogglePhosphor, KBDK_P, MOD3 }, + //{ Event::PhosphorModeDecrease, KBDK_P, KBDM_SHIFT | KBDM_CTRL | MOD3 }, { Event::PhosphorModeIncrease, KBDK_P, KBDM_CTRL | MOD3 }, { Event::ScanlinesDecrease, KBDK_5, KBDM_SHIFT | MOD3 }, { Event::ScanlinesIncrease, KBDK_5, MOD3 }, diff --git a/src/common/PKeyboardHandler.hxx b/src/common/PKeyboardHandler.hxx index 7cdf5b247..2b3969afe 100644 --- a/src/common/PKeyboardHandler.hxx +++ b/src/common/PKeyboardHandler.hxx @@ -124,6 +124,11 @@ class PhysicalKeyboardHandler /** return event mode for given controller type */ static EventMode getMode(const Controller::Type type); +#ifdef DEBUG_BUILD + void verifyDefaultMapping(PhysicalKeyboardHandler::EventMappingArray mapping, + EventMode mode, string_view name); +#endif + private: OSystem& myOSystem; EventHandler& myHandler; diff --git a/src/emucore/Cart.cxx b/src/emucore/Cart.cxx index bd91358e3..3c98e1c93 100644 --- a/src/emucore/Cart.cxx +++ b/src/emucore/Cart.cxx @@ -37,6 +37,8 @@ Cartridge::Cartridge(const Settings& settings, string_view md5) for(uInt32 i = 0; i < 256; ++i) myRWPRandomValues[i] = rand.next(); + const bool devSettings = mySettings.getBool("dev.settings"); + myRandomHotspots = devSettings ? mySettings.getBool("dev.randomhs") : false; myRamReadAccesses.reserve(5); } diff --git a/src/emucore/Cart.hxx b/src/emucore/Cart.hxx index 2e031b8be..a859631b5 100644 --- a/src/emucore/Cart.hxx +++ b/src/emucore/Cart.hxx @@ -90,6 +90,8 @@ class Cartridge : public Device void unlockHotspots() { myHotspotsLocked = false; } bool hotspotsLocked() const { return myHotspotsLocked; } + void enableRandomHotspots(bool enable) { myRandomHotspots = enable; } + /** Get the default startup bank for a cart. This is the bank where the system will look at address 0xFFFC to determine where to @@ -437,6 +439,9 @@ class Cartridge : public Device // Semi-random values to use when a read from write port occurs std::array myRWPRandomValues; + // If myRandomHotspots is true, peeks to hotspots return semi-random values. + bool myRandomHotspots{false}; + private: // The startup bank to use (where to look for the reset vector address) uInt16 myStartBank{0}; diff --git a/src/emucore/CartEnhanced.cxx b/src/emucore/CartEnhanced.cxx index 4cdbd9d50..0fd9c476d 100644 --- a/src/emucore/CartEnhanced.cxx +++ b/src/emucore/CartEnhanced.cxx @@ -161,7 +161,7 @@ uInt8 CartridgeEnhanced::peek(uInt16 address) // hotspots in TIA range are reacting to pokes only if(hotspot() >= 0x80) - if(checkSwitchBank(address & ADDR_MASK, 0)) + if(checkSwitchBank(address & ADDR_MASK, 0) && myRandomHotspots) return myRWPRandomValues[address & 0xFF]; if(isRamBank(address)) diff --git a/src/emucore/CartFA.cxx b/src/emucore/CartFA.cxx index 6062e6941..f207da0dd 100644 --- a/src/emucore/CartFA.cxx +++ b/src/emucore/CartFA.cxx @@ -15,6 +15,7 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ +#include "System.hxx" #include "CartFA.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -30,8 +31,10 @@ CartridgeFA::CartridgeFA(const ByteBuffer& image, size_t size, bool CartridgeFA::checkSwitchBank(uInt16 address, uInt8) { // Switch banks if necessary - if((address >= 0x1FF8) && (address <= 0x1FFA)) + if((address >= 0x1FF8) && (address <= 0x1FFA)/* && (mySystem->getDataBusState() & 1) */) { + //if((mySystem->getDataBusState() & 1) == 0) + //cerr << std::hex << address << ": " << (mySystem->getDataBusState() & 1) << ", "; bank(address - 0x1FF8); return true; } diff --git a/src/emucore/CartFA.hxx b/src/emucore/CartFA.hxx index 503b3c8f5..67306c725 100644 --- a/src/emucore/CartFA.hxx +++ b/src/emucore/CartFA.hxx @@ -26,7 +26,8 @@ /** Cartridge class used for CBS' RAM Plus cartridges. There are three 4K - banks, accessible by read/write at $1FF8 - $1FFA, and 256 bytes of RAM. + banks, accessible by read/write at $1FF8 - $1FFA (note: D0 has to be 1 + for switching), and 256 bytes of RAM. RAM read port is $1100 - $11FF, write port is $1000 - $10FF. @author Bradford W. Mott, Thomas Jentzsch diff --git a/src/emucore/Settings.cxx b/src/emucore/Settings.cxx index 00bcbff3a..cdafa49b4 100644 --- a/src/emucore/Settings.cxx +++ b/src/emucore/Settings.cxx @@ -278,6 +278,7 @@ Settings::Settings() setPermanent("dev.ramrandom", "true"); setPermanent("dev.cpurandom", "SAXYP"); setPermanent("dev.tiarandom", "true"); + setPermanent("dev.hsrandom", "true"); setPermanent("dev.colorloss", "true"); #ifdef GUI_SUPPORT setPermanent("dev.tv.jitter", "true"); @@ -784,6 +785,7 @@ void Settings::usage() << " -dev.tv.jitter <1|0> Enable TV jitter effect\n" << " -dev.tv.jitter_sense <1-10> Set TV jitter effect sensitivity\n" << " -dev.tv.jitter_recovery <1-20> Set recovery time for TV jitter effect\n" + << " -dev.hsrandom <1|0> Randomize the hotspot peek values\n" << " -dev.tiadriven <1|0> Drive unqused TIA pins randomly on a\n" << " read/peek\n" #ifdef DEBUGGER_SUPPORT diff --git a/src/gui/DeveloperDialog.cxx b/src/gui/DeveloperDialog.cxx index a17b768cc..2df91e469 100644 --- a/src/gui/DeveloperDialog.cxx +++ b/src/gui/DeveloperDialog.cxx @@ -56,7 +56,7 @@ DeveloperDialog::DeveloperDialog(OSystem& osystem, DialogContainer& parent, // Set real dimensions setSize(53 * fontWidth + HBORDER * 2, - _th + VGAP * 3 + lineHeight + 13 * (lineHeight + VGAP) + buttonHeight + VBORDER * 3, + _th + VGAP * 3 + lineHeight + 14 * (lineHeight + VGAP) + buttonHeight + VBORDER * 3, max_w, max_h); // The tab widget @@ -183,6 +183,12 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font) } ypos += lineHeight + VGAP; + // How to handle undriven TIA pins + myRandomHotspotsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, + "Random hotspot peek values"); + wid.push_back(myRandomHotspotsWidget); + ypos += lineHeight + VGAP; + // How to handle undriven TIA pins myUndrivenPinsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Drive unused TIA pins randomly on a read/peek"); @@ -711,6 +717,8 @@ void DeveloperDialog::getWidgetStates(SettingsSet set) if(myRandomizeCPUWidget[i]->getState()) cpurandom += cpuregs[i]; myRandomizeCPU[set] = cpurandom; + // Random hotspot peeks + myRandomHotspots[set] = myRandomHotspotsWidget->getState(); // Undriven TIA pins myUndrivenPins[set] = myUndrivenPinsWidget->getState(); #ifdef DEBUGGER_SUPPORT @@ -768,6 +776,8 @@ void DeveloperDialog::setWidgetStates(SettingsSet set) for(int i = 0; i < 5; ++i) myRandomizeCPUWidget[i]->setState(BSPF::containsIgnoreCase(cpurandom, cpuregs[i])); + // Random hotspot peeks + myRandomHotspotsWidget->setState(myRandomHotspots[set]); // Undriven TIA pins myUndrivenPinsWidget->setState(myUndrivenPins[set]); #ifdef DEBUGGER_SUPPORT @@ -915,6 +925,8 @@ void DeveloperDialog::setDefaults() myRandomizeTIA[set] = devSettings; myRandomizeRAM[set] = true; myRandomizeCPU[set] = devSettings ? "SAXYP" : "AXYP"; + // Random hotspot peeks + myRandomHotspots[set] = devSettings; // Undriven TIA pins myUndrivenPins[set] = devSettings; #ifdef DEBUGGER_SUPPORT @@ -1091,6 +1103,7 @@ void DeveloperDialog::handleCommand(CommandSender* sender, int cmd, int data, in // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DeveloperDialog::handleSettings(bool devSettings) { + myRandomHotspotsWidget->setEnabled(devSettings); myUndrivenPinsWidget->setEnabled(devSettings); #ifdef DEBUGGER_SUPPORT myRWPortBreakWidget->setEnabled(devSettings); diff --git a/src/gui/DeveloperDialog.hxx b/src/gui/DeveloperDialog.hxx index def7ba4b9..8b57c6873 100644 --- a/src/gui/DeveloperDialog.hxx +++ b/src/gui/DeveloperDialog.hxx @@ -93,8 +93,9 @@ class DeveloperDialog : public Dialog, DevSettingsHandler CheckboxWidget* myRandomizeTIAWidget{nullptr}; CheckboxWidget* myRandomizeRAMWidget{nullptr}; StaticTextWidget* myRandomizeCPULabel{nullptr}; - CheckboxWidget* myUndrivenPinsWidget{nullptr}; std::array myRandomizeCPUWidget{nullptr}; + CheckboxWidget* myRandomHotspotsWidget{nullptr}; + CheckboxWidget* myUndrivenPinsWidget{nullptr}; #ifdef DEBUGGER_SUPPORT CheckboxWidget* myRWPortBreakWidget{nullptr}; CheckboxWidget* myWRPortBreakWidget{nullptr};