From d69fbd5c28937d43ecdc8693155614a493e9d3d4 Mon Sep 17 00:00:00 2001 From: tomcw Date: Wed, 13 Mar 2024 21:56:11 +0000 Subject: [PATCH] Save-state: fix for IIe - add new 'MMU LC Mode' --- source/LanguageCard.cpp | 2 +- source/Memory.cpp | 31 ++++++++++++++++++++++--------- source/SaveState.cpp | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/source/LanguageCard.cpp b/source/LanguageCard.cpp index 06a0f8d8..bc953830 100644 --- a/source/LanguageCard.cpp +++ b/source/LanguageCard.cpp @@ -394,7 +394,7 @@ BYTE __stdcall Saturn128K::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULO bBankChanged = GetLastSlotToSetMainMemLC() != uSlot; if (bBankChanged) { - ::SetMemMainLanguageCard(pLC->m_pMemory, uSlot); + ::SetMemMainLanguageCard(pLC->m_aSaturnBanks[pLC->m_uSaturnActiveBank], uSlot); } } diff --git a/source/Memory.cpp b/source/Memory.cpp index 9afd4b21..03e6dec6 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -2234,6 +2234,7 @@ void MemRemoveNoSlotClock(void) #define SS_YAML_KEY_PERIPHERALROMSLOT "Peripheral ROM Slot" #define SS_YAML_KEY_ANNUNCIATOR "Annunciator" #define SS_YAML_KEY_LASTSLOTTOSETMAINMEMLC "Last Slot to Set Main Mem LC" +#define SS_YAML_KEY_MMULCMODE "MMU LC Mode" // @@ -2298,12 +2299,15 @@ void MemSaveSnapshot(YamlSaveHelper& yamlSaveHelper) // Scope so that "Memory" & "Main Memory" are at same indent level { YamlSaveHelper::Label state(yamlSaveHelper, "%s:\n", MemGetSnapshotStructName().c_str()); - DWORD saveMemMode = g_memmode; - if (IsApple2PlusOrClone(GetApple2Type())) - saveMemMode &= ~MF_LANGCARD_MASK; // For II,II+: clear LC bits - set later by slot-0 LC or Saturn - yamlSaveHelper.SaveHexUint32(SS_YAML_KEY_MEMORYMODE, saveMemMode); - if (!IsApple2PlusOrClone(GetApple2Type())) // NB. This is set later for II,II+ by slot-0 LC or Saturn + // LC bits + // . For II,II+: set later by slot-0 LC or Saturn + // . For //e,//c: set in SS_YAML_KEY_MMULCMODE + yamlSaveHelper.SaveHexUint32(SS_YAML_KEY_MEMORYMODE, g_memmode & ~MF_LANGCARD_MASK); // Clear LC bits + if (!IsApple2PlusOrClone(GetApple2Type())) // NB. Thesed are set later for II,II+ by slot-0 LC or Saturn + { + yamlSaveHelper.SaveHexUint32(SS_YAML_KEY_MMULCMODE, g_memmode & MF_LANGCARD_MASK); yamlSaveHelper.SaveUint(SS_YAML_KEY_LASTRAMWRITE, GetLastRamWrite() ? 1 : 0); + } yamlSaveHelper.SaveHexUint8(SS_YAML_KEY_IOSELECT, IO_SELECT); yamlSaveHelper.SaveHexUint8(SS_YAML_KEY_IOSELECT_INT, INTC8ROM ? 1 : 0); yamlSaveHelper.SaveUint(SS_YAML_KEY_EXPANSIONROMTYPE, (UINT) g_eExpansionRomType); @@ -2353,12 +2357,21 @@ bool MemLoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT unitVersion) else { UINT uMemMode = yamlLoadHelper.LoadUint(SS_YAML_KEY_MEMORYMODE); - if (IsApple2PlusOrClone(GetApple2Type())) - uMemMode &= ~MF_LANGCARD_MASK; // For II,II+: clear LC bits - set later by slot-0 LC or Saturn + if (IsApple2PlusOrClone(GetApple2Type()) || unitVersion >= 9) + uMemMode &= ~MF_LANGCARD_MASK; // For II,II+: clear LC bits - set later by slot-0 LC or Saturn (or some other slot-n Saturn) + // For //e,//c: (>=v9) clear LC bits - set later after reading all cards and we know which card contributes these bits + // For //e (<9): don't clear, as only old versions only supported the IIe LC from the MMU SetMemMode(uMemMode); - if (!IsApple2PlusOrClone(GetApple2Type())) - SetLastRamWrite( yamlLoadHelper.LoadUint(SS_YAML_KEY_LASTRAMWRITE) ? TRUE : FALSE ); // NB. This is set later for II,II+ by slot-0 LC or Saturn + if (!IsApple2PlusOrClone(GetApple2Type())) // NB. These are set later for II,II+ by slot-0 LC or Saturn + { + if (unitVersion >= 9) + { + UINT LCMemMode = yamlLoadHelper.LoadUint(SS_YAML_KEY_MMULCMODE); + dynamic_cast(GetCardMgr().GetRef(SLOT0)).SetLCMemMode(LCMemMode); + } + SetLastRamWrite(yamlLoadHelper.LoadUint(SS_YAML_KEY_LASTRAMWRITE) ? TRUE : FALSE); + } } if (unitVersion >= 3) diff --git a/source/SaveState.cpp b/source/SaveState.cpp index 5c079951..bce5f697 100644 --- a/source/SaveState.cpp +++ b/source/SaveState.cpp @@ -67,7 +67,7 @@ static YamlHelper yamlHelper; // v6: Added 'Unit Miscellaneous' for NoSlotClock(NSC) // v7: Extended: joystick (added 'Paddle Inactive Cycle') // v8: Added 'Unit Game I/O Connector' for Game I/O Connector -// v9: Extended: memory (added 'Last Slot to Set Main Mem LC') +// v9: Extended: memory (added 'Last Slot to Set Main Mem LC', 'MMU LC Mode') #define UNIT_APPLE2_VER 9 #define UNIT_SLOTS_VER 1