From 2e04ce348acba9cf227158586bab59b11794db24 Mon Sep 17 00:00:00 2001 From: Andrea Date: Sat, 13 Nov 2021 18:13:01 +0000 Subject: [PATCH] Add Card::Update() (PR #1000) And use it in ContinueExecution() --- source/Card.cpp | 18 ++++++++++++++++++ source/Card.h | 3 +++ source/CardManager.cpp | 11 +++++++++++ source/CardManager.h | 1 + source/Disk.cpp | 2 +- source/Disk.h | 3 ++- source/Disk2CardManager.cpp | 6 +++--- source/Disk2CardManager.h | 2 +- source/FourPlay.h | 5 +++-- source/Harddisk.h | 1 + source/LanguageCard.h | 6 ++++-- source/MouseInterface.h | 5 +++-- source/SAM.h | 5 +++-- source/SNESMAX.h | 1 + source/SerialComms.h | 5 +++-- source/Utilities.cpp | 4 ++-- source/Windows/AppleWin.cpp | 6 ++---- source/Windows/Win32Frame.cpp | 2 +- 18 files changed, 63 insertions(+), 23 deletions(-) diff --git a/source/Card.cpp b/source/Card.cpp index 5c8e26cc..78e8de41 100644 --- a/source/Card.cpp +++ b/source/Card.cpp @@ -52,3 +52,21 @@ void DummyCard::InitializeIO(LPBYTE pCxRomPeripheral) break; } } + +void DummyCard::Update(const ULONG nExecutedCycles) +{ + switch (QueryType()) + { + case CT_GenericPrinter: + PrintUpdate(nExecutedCycles); + break; + case CT_MockingboardC: + case CT_Phasor: + // only in slot 4 + if (m_slot == SLOT4) + { + MB_PeriodicUpdate(nExecutedCycles); + } + break; + } +} diff --git a/source/Card.h b/source/Card.h index 2f511af0..df340cab 100644 --- a/source/Card.h +++ b/source/Card.h @@ -36,6 +36,7 @@ public: virtual void InitializeIO(LPBYTE pCxRomPeripheral) = 0; virtual void Init(void) = 0; virtual void Reset(const bool powerCycle) = 0; + virtual void Update(const ULONG nExecutedCycles) = 0; SS_CARDTYPE QueryType(void) { return m_type; } protected: @@ -56,6 +57,7 @@ public: virtual void InitializeIO(LPBYTE pCxRomPeripheral) {} virtual void Init(void) {} virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} }; // @@ -69,4 +71,5 @@ public: virtual void InitializeIO(LPBYTE pCxRomPeripheral); virtual void Init(void) {} virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles); }; diff --git a/source/CardManager.cpp b/source/CardManager.cpp index 29346cf5..98022f16 100644 --- a/source/CardManager.cpp +++ b/source/CardManager.cpp @@ -199,3 +199,14 @@ void CardManager::InitializeIO(LPBYTE pCxRomPeripheral) } } } + +void CardManager::Update(const ULONG nExecutedCycles) +{ + for (UINT i = 0; i < NUM_SLOTS; ++i) + { + if (m_slot[i]) + { + m_slot[i]->Update(nExecutedCycles); + } + } +} diff --git a/source/CardManager.h b/source/CardManager.h index 3dab426b..f59ce6c5 100644 --- a/source/CardManager.h +++ b/source/CardManager.h @@ -58,6 +58,7 @@ public: bool IsSSCInstalled(void) { return m_pSSC != NULL; } void InitializeIO(LPBYTE pCxRomPeripheral); + void Update(const ULONG nExecutedCycles); private: void InsertInternal(UINT slot, SS_CARDTYPE type); diff --git a/source/Disk.cpp b/source/Disk.cpp index 8e7c3a7a..d4e73e6f 100644 --- a/source/Disk.cpp +++ b/source/Disk.cpp @@ -1691,7 +1691,7 @@ void __stdcall Disk2InterfaceCard::SetWriteMode(WORD, WORD, BYTE, BYTE, ULONG uE //=========================================================================== -void Disk2InterfaceCard::UpdateDriveState(DWORD cycles) +void Disk2InterfaceCard::Update(const ULONG cycles) { int loop = NUM_DRIVES; while (loop--) diff --git a/source/Disk.h b/source/Disk.h index 59a62966..65224e4c 100644 --- a/source/Disk.h +++ b/source/Disk.h @@ -131,6 +131,8 @@ public: virtual void Reset(const bool powerCycle); virtual void InitializeIO(LPBYTE pCxRomPeripheral); + virtual void Update(const ULONG nExecutedCycles); + void Destroy(void); // no, doesn't "destroy" the disk image. DiskIIManagerShutdown() void Boot(void); @@ -160,7 +162,6 @@ public: std::string GetCurrentPhaseString(void); LPCTSTR GetCurrentState(void); bool UserSelectNewDiskImage(const int drive, LPCSTR pszFilename=""); - void UpdateDriveState(DWORD cycles); bool DriveSwap(void); bool IsDriveConnected(int drive) { return m_floppyDrive[drive].m_isConnected; } diff --git a/source/Disk2CardManager.cpp b/source/Disk2CardManager.cpp index 4129fe7a..b1d007d6 100644 --- a/source/Disk2CardManager.cpp +++ b/source/Disk2CardManager.cpp @@ -48,13 +48,13 @@ bool Disk2CardManager::IsConditionForFullSpeed(void) return false; } -void Disk2CardManager::UpdateDriveState(UINT cycles) +void Disk2CardManager::Update(const ULONG nExecutedCycles) { for (UINT i = 0; i < NUM_SLOTS; i++) { if (GetCardMgr().QuerySlot(i) == CT_Disk2) { - dynamic_cast(GetCardMgr().GetRef(i)).UpdateDriveState(cycles); + GetCardMgr().GetRef(i).Update(nExecutedCycles); } } } @@ -65,7 +65,7 @@ void Disk2CardManager::Reset(const bool powerCycle /*=false*/) { if (GetCardMgr().QuerySlot(i) == CT_Disk2) { - dynamic_cast(GetCardMgr().GetRef(i)).Reset(powerCycle); + GetCardMgr().GetRef(i).Reset(powerCycle); } } } diff --git a/source/Disk2CardManager.h b/source/Disk2CardManager.h index a3c4332e..b41cb6f5 100644 --- a/source/Disk2CardManager.h +++ b/source/Disk2CardManager.h @@ -7,7 +7,7 @@ public: ~Disk2CardManager(void) {} bool IsConditionForFullSpeed(void); - void UpdateDriveState(UINT cycles); + void Update(const ULONG nExecutedCycles); void Reset(const bool powerCycle = false); bool GetEnhanceDisk(void); void SetEnhanceDisk(bool enhanceDisk); diff --git a/source/FourPlay.h b/source/FourPlay.h index b5fa0b39..81e09c72 100644 --- a/source/FourPlay.h +++ b/source/FourPlay.h @@ -11,8 +11,9 @@ public: } virtual ~FourPlayCard(void) {} - virtual void Init(void) {}; - virtual void Reset(const bool powerCycle) {}; + virtual void Init(void) {} + virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} virtual void InitializeIO(LPBYTE pCxRomPeripheral); diff --git a/source/Harddisk.h b/source/Harddisk.h index 5a0483a6..695b0f6b 100644 --- a/source/Harddisk.h +++ b/source/Harddisk.h @@ -87,6 +87,7 @@ public: virtual void Init(void) {} virtual void Reset(const bool powerCycle); + virtual void Update(const ULONG nExecutedCycles) {} virtual void InitializeIO(LPBYTE pCxRomPeripheral); void Destroy(void); diff --git a/source/LanguageCard.h b/source/LanguageCard.h index 6de8adfb..6ded0d1f 100644 --- a/source/LanguageCard.h +++ b/source/LanguageCard.h @@ -12,8 +12,10 @@ public: LanguageCardUnit(SS_CARDTYPE type = CT_LanguageCardIIe); virtual ~LanguageCardUnit(void); - virtual void Init(void) {}; - virtual void Reset(const bool powerCycle) {}; + virtual void Init(void) {} + virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} + virtual void InitializeIO(LPBYTE pCxRomPeripheral); virtual void SetMemorySize(UINT banks) {} // No-op for //e and slot-0 16K LC diff --git a/source/MouseInterface.h b/source/MouseInterface.h index 1cdd545f..a427efc0 100644 --- a/source/MouseInterface.h +++ b/source/MouseInterface.h @@ -11,8 +11,9 @@ public: CMouseInterface(UINT slot); virtual ~CMouseInterface(); - virtual void Init(void) {}; - virtual void Reset(const bool powerCycle) {}; + virtual void Init(void) {} + virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} virtual void InitializeIO(LPBYTE pCxRomPeripheral); // void Uninitialize(); diff --git a/source/SAM.h b/source/SAM.h index 4e90515f..2aa713bb 100644 --- a/source/SAM.h +++ b/source/SAM.h @@ -11,8 +11,9 @@ public: } virtual ~SAMCard(void) {} - virtual void Init(void) {}; - virtual void Reset(const bool powerCycle) {}; + virtual void Init(void) {} + virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} virtual void InitializeIO(LPBYTE pCxRomPeripheral); diff --git a/source/SNESMAX.h b/source/SNESMAX.h index aa6591c5..d7e0b49d 100644 --- a/source/SNESMAX.h +++ b/source/SNESMAX.h @@ -20,6 +20,7 @@ public: virtual void Init(void) {} virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} virtual void InitializeIO(LPBYTE pCxRomPeripheral); diff --git a/source/SerialComms.h b/source/SerialComms.h index ea7e01c0..b53fd55c 100644 --- a/source/SerialComms.h +++ b/source/SerialComms.h @@ -28,8 +28,9 @@ public: CSuperSerialCard(UINT slot); virtual ~CSuperSerialCard(); - virtual void Init(void) {}; - virtual void Reset(const bool powerCycle) {}; + virtual void Init(void) {} + virtual void Reset(const bool powerCycle) {} + virtual void Update(const ULONG nExecutedCycles) {} void InitializeIO(LPBYTE pCxRomPeripheral); void CommReset(); diff --git a/source/Utilities.cpp b/source/Utilities.cpp index f75715b2..bd2f2566 100644 --- a/source/Utilities.cpp +++ b/source/Utilities.cpp @@ -540,7 +540,7 @@ void ResetMachineState() { GetCardMgr().GetDisk2CardMgr().Reset(true); if (GetCardMgr().QuerySlot(SLOT7) == CT_GenericHDD) - dynamic_cast(GetCardMgr().GetRef(SLOT7)).Reset(true); + GetCardMgr().GetRef(SLOT7).Reset(true); g_bFullSpeed = 0; // Might've hit reset in middle of InternalCpuExecute() - so beep may get (partially) muted MemReset(); // calls CpuInitialize(), CNoSlotClock.Reset() @@ -595,7 +595,7 @@ void CtrlReset() GetPravets().Reset(); GetCardMgr().GetDisk2CardMgr().Reset(); if (GetCardMgr().QuerySlot(SLOT7) == CT_GenericHDD) - dynamic_cast(GetCardMgr().GetRef(SLOT7)).Reset(true); + GetCardMgr().GetRef(SLOT7).Reset(true); KeybReset(); if (GetCardMgr().IsSSCInstalled()) GetCardMgr().GetSSC()->CommReset(); diff --git a/source/Windows/AppleWin.cpp b/source/Windows/AppleWin.cpp index 017ed8c8..794e03f0 100644 --- a/source/Windows/AppleWin.cpp +++ b/source/Windows/AppleWin.cpp @@ -217,10 +217,8 @@ static void ContinueExecution(void) const DWORD uActualCyclesExecuted = CpuExecute(uCyclesToExecute, bVideoUpdate); g_dwCyclesThisFrame += uActualCyclesExecuted; - GetCardMgr().GetDisk2CardMgr().UpdateDriveState(uActualCyclesExecuted); + GetCardMgr().Update(uActualCyclesExecuted); JoyUpdateButtonLatch(nExecutionPeriodUsec); // Button latch time is independent of CPU clock frequency - PrintUpdate(uActualCyclesExecuted); - MB_PeriodicUpdate(uActualCyclesExecuted); // @@ -822,7 +820,7 @@ static void RepeatInitialization(void) GetCardMgr().GetDisk2CardMgr().Reset(true); // Switch from a booting A][+ to a non-autostart A][, so need to turn off floppy motor LogFileOutput("Main: DiskReset()\n"); if (GetCardMgr().QuerySlot(SLOT7) == CT_GenericHDD) - dynamic_cast(GetCardMgr().GetRef(SLOT7)).Reset(true); // GH#515 + GetCardMgr().GetRef(SLOT7).Reset(true); // GH#515 LogFileOutput("Main: HDDReset()\n"); if (!g_bSysClkOK) diff --git a/source/Windows/Win32Frame.cpp b/source/Windows/Win32Frame.cpp index 2ae4d47c..5c092523 100644 --- a/source/Windows/Win32Frame.cpp +++ b/source/Windows/Win32Frame.cpp @@ -296,7 +296,7 @@ void Win32Frame::Benchmark(void) while (cycles > 0) { DWORD executedcycles = CpuExecute(103, true); cycles -= executedcycles; - GetCardMgr().GetDisk2CardMgr().UpdateDriveState(executedcycles); + GetCardMgr().GetDisk2CardMgr().Update(executedcycles); JoyUpdateButtonLatch(executedcycles); } }