Fixes for II+ with (a) s0=LC or (b) s0=Saturn

This commit is contained in:
tomcw 2024-03-09 21:26:44 +00:00
parent 8e4c3366fb
commit d17e108b30
2 changed files with 20 additions and 7 deletions

View File

@ -52,7 +52,8 @@ LanguageCardUnit * LanguageCardUnit::create(UINT slot)
LanguageCardUnit::LanguageCardUnit(SS_CARDTYPE type, UINT slot) :
Card(type, slot),
m_uLastRamWrite(0),
m_memmode(kMemModeInitialState)
m_memmode(kMemModeInitialState),
m_pMemory(NULL)
{
if (type != CT_Saturn128K && m_slot != LanguageCardUnit::kSlot0)
ThrowErrorInvalidSlot();
@ -77,6 +78,7 @@ BYTE __stdcall LanguageCardUnit::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValu
{
UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
LanguageCardUnit* pLC = (LanguageCardUnit*) MemGetSlotParameters(uSlot);
_ASSERT(uSlot == SLOT0);
DWORD memmode = pLC->GetLCMemMode();
DWORD lastmemmode = memmode;
@ -107,15 +109,20 @@ BYTE __stdcall LanguageCardUnit::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValu
pLC->SetLastRamWrite( ((uAddr & 1) && !bWrite) ); // UTAIIe:5-23
pLC->SetLCMemMode(memmode);
const bool bBankChanged = GetLastSlotToSetMainMemLC() != SLOT0;
if (bBankChanged)
{
if (pLC->QueryType() == CT_LanguageCardIIe)
SetMemMainLanguageCard(NULL, SLOT0, true);
else // CT_LanguageCard
SetMemMainLanguageCard(pLC->m_pMemory, SLOT0);
}
//
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) || bBankChanged)
@ -383,6 +390,12 @@ BYTE __stdcall Saturn128K::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULO
pLC->SetLastRamWrite(uAddr & 1); // Saturn differs from Apple's 16K LC: any access (LC is read-only)
pLC->SetLCMemMode(memmode);
bBankChanged = GetLastSlotToSetMainMemLC() != uSlot;
if (bBankChanged)
{
::SetMemMainLanguageCard(pLC->m_pMemory, uSlot);
}
}
// NB. Saturn can be put in any slot but MemOptimizeForModeChanging() currently only supports LC in slot 0.

View File

@ -39,6 +39,8 @@ public:
protected:
LanguageCardUnit(SS_CARDTYPE type, UINT slot);
LPBYTE m_pMemory;
private:
UINT m_uLastRamWrite;
UINT m_memmode;
@ -67,8 +69,6 @@ protected:
void SaveLCState(class YamlSaveHelper& yamlSaveHelper);
void LoadLCState(class YamlLoadHelper& yamlLoadHelper);
LPBYTE m_pMemory;
private:
const std::string& GetSnapshotMemStructName(void);
};