diff --git a/source/LanguageCard.cpp b/source/LanguageCard.cpp index 3ca2c513..801a5db4 100644 --- a/source/LanguageCard.cpp +++ b/source/LanguageCard.cpp @@ -112,11 +112,21 @@ BYTE __stdcall LanguageCardUnit::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValu if (MemOptimizeForModeChanging(PC, uAddr)) return bWrite ? 0 : MemReadFloatingBus(nExecutedCycles); + bool bBankChanged = GetLastSlotToSetMainMemLC() != SLOT0; + if (bBankChanged) + SetMemMainLanguageCard(NULL, SLOT0, true); // TODO: fix for non-//e + // IF THE MEMORY PAGING MODE HAS CHANGED, UPDATE OUR MEMORY IMAGES AND // WRITE TABLES. - if (lastmemmode != memmode) + if ((lastmemmode != memmode) || bBankChanged) { - SetMemMode((GetMemMode() & ~MF_LANGCARD_MASK) | (memmode & MF_LANGCARD_MASK)); + if (lastmemmode != memmode) + { +// UINT oldmode = GetMemMode(); + SetMemMode((GetMemMode() & ~MF_LANGCARD_MASK) | (memmode & MF_LANGCARD_MASK)); +// UINT newmode = GetMemMode(); +// LogOutput("[s%d] LC memmode: %08X -> %08X\n", pLC->m_slot, oldmode, newmode); + } MemUpdatePaging(0); // Initialize=0 } @@ -383,7 +393,12 @@ BYTE __stdcall Saturn128K::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULO if ((lastmemmode != memmode) || bBankChanged) { if (lastmemmode != memmode) + { +// UINT oldmode = GetMemMode(); SetMemMode((GetMemMode() & ~MF_LANGCARD_MASK) | (memmode & MF_LANGCARD_MASK)); +// UINT newmode = GetMemMode(); +// LogOutput("[s%d] LC memmode: %08X -> %08X\n", pLC->m_slot, oldmode, newmode); + } MemUpdatePaging(0); // Initialize=0 } diff --git a/source/Memory.cpp b/source/Memory.cpp index 4358c14a..171d4d5d 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -401,6 +401,11 @@ LPBYTE GetCxRomPeripheral(void) return pCxRomPeripheral; // Can be NULL if at MODE_LOGO } +UINT GetLastSlotToSetMainMemLC(void) +{ + return g_lastSlotToSetMainMemLC; +} + //============================================================================= static BYTE __stdcall IORead_C00x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nExecutedCycles) diff --git a/source/Memory.h b/source/Memory.h index cfa885ac..8ed81b6d 100644 --- a/source/Memory.h +++ b/source/Memory.h @@ -118,3 +118,4 @@ UINT GetRamWorksActiveBank(void); void SetMemMainLanguageCard(LPBYTE ptr, UINT slot, bool bMemMain=false); LPBYTE GetCxRomPeripheral(void); +UINT GetLastSlotToSetMainMemLC(void);