From a727db7cc509cbd897942be24e76247b9d1c6ff4 Mon Sep 17 00:00:00 2001 From: tomcw Date: Thu, 23 Dec 2021 15:56:14 +0000 Subject: [PATCH] Load save-state: . fix for II/II+ when VidHD's SHR is being updated (init memVidHD ptr). . refactor to consolidate all Mem* related initialisation. --- source/Memory.cpp | 37 +++++++++++++++++++++++++++++++------ source/Memory.h | 2 +- source/SaveState.cpp | 8 +------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/source/Memory.cpp b/source/Memory.cpp index d74d19efd..c561892e2 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -1731,8 +1731,17 @@ void MemInitializeIO(void) // Called by: // . Snapshot_LoadState_v2() -void MemInitializeCardSlotAndExpansionRomFromSnapshot(void) +void MemInitializeFromSnapshot(void) { + MemInitializeROM(); + MemInitializeCustomROM(); + MemInitializeCustomF8ROM(); + MemInitializeIO(); + + // + // Card and Expansion ROM + // + // Remove all the cards' ROMs at $Csnn if internal ROM is enabled if (IsAppleIIeOrAbove(GetApple2Type()) && SW_INTCXROM) IoHandlerCardsOut(); @@ -1740,13 +1749,27 @@ void MemInitializeCardSlotAndExpansionRomFromSnapshot(void) // Potentially init a card's expansion ROM const UINT uSlot = g_uPeripheralRomSlot; - if (ExpansionRom[uSlot] == NULL) - return; + if (ExpansionRom[uSlot] != NULL) + { + _ASSERT(g_eExpansionRomType == eExpRomPeripheral); - _ASSERT(g_eExpansionRomType == eExpRomPeripheral); + memcpy(pCxRomPeripheral + 0x800, ExpansionRom[uSlot], FIRMWARE_EXPANSION_SIZE); + // NB. Copied to /mem/ by UpdatePaging(TRUE) + } + + MemUpdatePaging(TRUE); + + // + // VidHD + // - memcpy(pCxRomPeripheral+0x800, ExpansionRom[uSlot], FIRMWARE_EXPANSION_SIZE); - // NB. Copied to /mem/ by UpdatePaging(TRUE) + memVidHD = NULL; + + if (IsApple2PlusOrClone(GetApple2Type()) && (GetCardMgr().QuerySlot(SLOT3) == CT_VidHD)) + { + VidHDCard* vidHD = dynamic_cast(GetCardMgr().GetObj(SLOT3)); + memVidHD = vidHD->IsWriteAux() ? memaux : NULL; + } } inline DWORD getRandomTime() @@ -1778,6 +1801,8 @@ void MemReset() memset(memdirty, 0, 0x100); + memVidHD = NULL; + // int iByte; diff --git a/source/Memory.h b/source/Memory.h index 65030d9b3..bab41f50d 100644 --- a/source/Memory.h +++ b/source/Memory.h @@ -84,7 +84,7 @@ void MemInitializeROM(void); void MemInitializeCustomROM(void); void MemInitializeCustomF8ROM(void); void MemInitializeIO(void); -void MemInitializeCardSlotAndExpansionRomFromSnapshot(void); +void MemInitializeFromSnapshot(void); BYTE MemReadFloatingBus(const ULONG uExecutedCycles); BYTE MemReadFloatingBus(const BYTE highbit, const ULONG uExecutedCycles); void MemReset (); diff --git a/source/SaveState.cpp b/source/SaveState.cpp index ffbd5ec54..a217608b6 100644 --- a/source/SaveState.cpp +++ b/source/SaveState.cpp @@ -499,13 +499,7 @@ static void Snapshot_LoadState_v2(void) const CConfigNeedingRestart configNew = CConfigNeedingRestart::Create(); GetPropertySheet().ApplyNewConfigFromSnapshot(configNew); // Saves new state to Registry (not slot/cards though) - MemInitializeROM(); - MemInitializeCustomROM(); - MemInitializeCustomF8ROM(); - MemInitializeIO(); - MemInitializeCardSlotAndExpansionRomFromSnapshot(); - - MemUpdatePaging(TRUE); + MemInitializeFromSnapshot(); DebugReset(); if (g_nAppMode == MODE_DEBUG)