Skip to content

Commit

Permalink
Make Slot 0 more consistent with other slots. (PR AppleWin#1006)
Browse files Browse the repository at this point in the history
  • Loading branch information
audetto committed Dec 11, 2021
1 parent 010d352 commit 177c9fe
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 100 deletions.
55 changes: 38 additions & 17 deletions source/CardManager.cpp
Expand Up @@ -41,6 +41,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "SerialComms.h"
#include "SNESMAX.h"
#include "VidHD.h"
#include "LanguageCard.h"
#include "Memory.h"

void CardManager::InsertInternal(UINT slot, SS_CARDTYPE type)
{
Expand Down Expand Up @@ -102,18 +104,21 @@ void CardManager::InsertInternal(UINT slot, SS_CARDTYPE type)
break;

case CT_LanguageCard:
_ASSERT(m_pLanguageCard == NULL);
if (m_pLanguageCard) break; // Only support one language card
m_slot[slot] = m_pLanguageCard = LanguageCardSlot0::create(slot);
break;
case CT_Saturn128K:
{
if (slot != 0)
{
_ASSERT(0);
break;
}
}
m_slot[slot] = new DummyCard(type, slot);
_ASSERT(m_pLanguageCard == NULL);
if (m_pLanguageCard) break; // Only support one language card
m_slot[slot] = m_pLanguageCard = new Saturn128K(slot, Saturn128K::GetSaturnMemorySize());
break;
case CT_LanguageCardIIe:
_ASSERT(m_pLanguageCard == NULL);
if (m_pLanguageCard) break; // Only support one language card
m_slot[slot] = m_pLanguageCard = LanguageCardUnit::create(slot);
break;

case CT_LanguageCardIIe: // not a card
default:
_ASSERT(0);
break;
Expand All @@ -132,14 +137,27 @@ void CardManager::Insert(UINT slot, SS_CARDTYPE type, bool updateRegistry/*=true

void CardManager::RemoveInternal(UINT slot)
{
if (m_slot[slot] && m_slot[slot]->QueryType() == CT_MouseInterface)
m_pMouseCard = NULL; // NB. object deleted below: delete m_slot[slot]

if (m_slot[slot] && m_slot[slot]->QueryType() == CT_SSC)
m_pSSC = NULL; // NB. object deleted below: delete m_slot[slot]
if (m_slot[slot])
{
// NB. object deleted below: delete m_slot[slot]
switch (m_slot[slot]->QueryType())
{
case CT_MouseInterface:
m_pMouseCard = NULL;
break;
case CT_SSC:
m_pSSC = NULL;
break;
case CT_LanguageCard:
case CT_Saturn128K:
case CT_LanguageCardIIe:
m_pLanguageCard = NULL;
break;
}

delete m_slot[slot];
m_slot[slot] = NULL;
delete m_slot[slot];
m_slot[slot] = NULL;
}
}

void CardManager::Remove(UINT slot, bool updateRegistry/*=true*/)
Expand Down Expand Up @@ -195,6 +213,9 @@ void CardManager::RemoveAux(void)

void CardManager::InitializeIO(LPBYTE pCxRomPeripheral)
{
// if it is a //e then SLOT0 must be CT_LanguageCardIIe (and the other way round)
_ASSERT(IsApple2PlusOrClone(GetApple2Type()) != (m_slot[SLOT0]->QueryType() == CT_LanguageCardIIe));

for (UINT i = 0; i < NUM_SLOTS; ++i)
{
if (m_slot[i])
Expand All @@ -217,7 +238,7 @@ void CardManager::Update(const ULONG nExecutedCycles)

void CardManager::SaveSnapshot(YamlSaveHelper& yamlSaveHelper)
{
for (UINT i = 1; i < NUM_SLOTS; ++i)
for (UINT i = 0; i < NUM_SLOTS; ++i)
{
if (m_slot[i])
{
Expand Down
8 changes: 6 additions & 2 deletions source/CardManager.h
Expand Up @@ -9,7 +9,8 @@ class CardManager
public:
CardManager(void) :
m_pMouseCard(NULL),
m_pSSC(NULL)
m_pSSC(NULL),
m_pLanguageCard(NULL)
{
InsertInternal(SLOT0, CT_Empty);
InsertInternal(SLOT1, CT_GenericPrinter);
Expand Down Expand Up @@ -54,9 +55,11 @@ class CardManager
class CSuperSerialCard* GetSSC(void) { return m_pSSC; }
bool IsSSCInstalled(void) { return m_pSSC != NULL; }

class LanguageCardUnit* GetLanguageCard(void) { return m_pLanguageCard; }

void InitializeIO(LPBYTE pCxRomPeripheral);
void Update(const ULONG nExecutedCycles);
void SaveSnapshot(YamlSaveHelper& yamlSaveHelper); // It DOES NOT save SLOT0
void SaveSnapshot(YamlSaveHelper& yamlSaveHelper);

private:
void InsertInternal(UINT slot, SS_CARDTYPE type);
Expand All @@ -69,4 +72,5 @@ class CardManager
Disk2CardManager m_disk2CardMgr;
class CMouseInterface* m_pMouseCard;
class CSuperSerialCard* m_pSSC;
class LanguageCardUnit* m_pLanguageCard;
};
3 changes: 2 additions & 1 deletion source/Debugger/Debugger_Display.cpp
Expand Up @@ -38,6 +38,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "../CPU.h"
#include "../Windows/Win32Frame.h"
#include "../LanguageCard.h"
#include "../CardManager.h"
#include "../Memory.h"
#include "../Mockingboard.h"
#include "../NTSC.h"
Expand Down Expand Up @@ -2408,7 +2409,7 @@ void _DrawSoftSwitchLanguageCardBank( RECT & rect, const int iBankDisplay, int b
int iActiveBank = -1;
char sText[ 4 ] = "?"; // Default to RAMWORKS
if (GetCurrentExpansionMemType() == CT_RamWorksIII) { sText[0] = 'r'; iActiveBank = GetRamWorksActiveBank(); }
if (GetCurrentExpansionMemType() == CT_Saturn128K) { sText[0] = 's'; iActiveBank = GetLanguageCard()->GetActiveBank(); }
if (GetCurrentExpansionMemType() == CT_Saturn128K) { sText[0] = 's'; iActiveBank = GetCardMgr().GetLanguageCard()->GetActiveBank(); }

if (iActiveBank >= 0)
{
Expand Down
53 changes: 36 additions & 17 deletions source/LanguageCard.cpp
Expand Up @@ -38,10 +38,18 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

const UINT LanguageCardUnit::kMemModeInitialState = MF_BANK2 | MF_WRITERAM; // !INTCXROM

LanguageCardUnit::LanguageCardUnit(SS_CARDTYPE type/*=CT_LanguageCardIIe*/) :
Card(type, kSlot0),
LanguageCardUnit * LanguageCardUnit::create(UINT slot)
{
return new LanguageCardUnit(CT_LanguageCardIIe, slot);
}

LanguageCardUnit::LanguageCardUnit(SS_CARDTYPE type, UINT slot) :
Card(type, slot),
m_uLastRamWrite(0)
{
if (m_slot != LanguageCardUnit::kSlot0)
throw std::string("Card: wrong slot");

SetMemMainLanguageCard(NULL, true);
}

Expand All @@ -52,12 +60,13 @@ LanguageCardUnit::~LanguageCardUnit(void)

void LanguageCardUnit::InitializeIO(LPBYTE pCxRomPeripheral)
{
RegisterIoHandler(kSlot0, &LanguageCardUnit::IO, &LanguageCardUnit::IO, NULL, NULL, this, NULL);
RegisterIoHandler(m_slot, &LanguageCardUnit::IO, &LanguageCardUnit::IO, NULL, NULL, this, NULL);
}

BYTE __stdcall LanguageCardUnit::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nExecutedCycles)
{
LanguageCardUnit* pLC = (LanguageCardUnit*) MemGetSlotParameters(kSlot0);
UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
LanguageCardUnit* pLC = (LanguageCardUnit*) MemGetSlotParameters(uSlot);

DWORD memmode = GetMemMode();
DWORD lastmemmode = memmode;
Expand Down Expand Up @@ -136,12 +145,14 @@ bool LanguageCardUnit::IsOpcodeRMWabs(WORD addr)

//-------------------------------------

LanguageCardSlot0::LanguageCardSlot0(SS_CARDTYPE type/*=CT_LanguageCard*/)
: LanguageCardUnit(type)
LanguageCardSlot0 * LanguageCardSlot0::create(UINT slot)
{
if (m_slot != LanguageCardUnit::kSlot0)
throw std::string("Card: wrong slot");
return new LanguageCardSlot0(CT_LanguageCard, slot);
}

LanguageCardSlot0::LanguageCardSlot0(SS_CARDTYPE type, UINT slot)
: LanguageCardUnit(type, slot)
{
m_pMemory = new BYTE[kMemBankSize];
SetMemMainLanguageCard(m_pMemory);
}
Expand Down Expand Up @@ -234,8 +245,10 @@ bool LanguageCardSlot0::LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT versio

//-------------------------------------

Saturn128K::Saturn128K(UINT banks)
: LanguageCardSlot0(CT_Saturn128K)
UINT Saturn128K::g_uSaturnBanksFromCmdLine = 0;

Saturn128K::Saturn128K(UINT slot, UINT banks)
: LanguageCardSlot0(CT_Saturn128K, slot)
{
m_uSaturnTotalBanks = (banks == 0) ? kMaxSaturnBanks : banks;
m_uSaturnActiveBank = 0;
Expand Down Expand Up @@ -265,19 +278,14 @@ Saturn128K::~Saturn128K(void)
}
}

void Saturn128K::SetMemorySize(UINT banks)
{
m_uSaturnTotalBanks = banks;
}

UINT Saturn128K::GetActiveBank(void)
{
return m_uSaturnActiveBank;
}

void Saturn128K::InitializeIO(LPBYTE pCxRomPeripheral)
{
RegisterIoHandler(kSlot0, &Saturn128K::IO, &Saturn128K::IO, NULL, NULL, this, NULL);
RegisterIoHandler(m_slot, &Saturn128K::IO, &Saturn128K::IO, NULL, NULL, this, NULL);
}

BYTE __stdcall Saturn128K::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nExecutedCycles)
Expand All @@ -301,7 +309,8 @@ BYTE __stdcall Saturn128K::IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULO
1110 $C0NE select 16K Bank 7
1111 $C0NF select 16K Bank 8
*/
Saturn128K* pLC = (Saturn128K*) MemGetSlotParameters(kSlot0);
UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
Saturn128K* pLC = (Saturn128K*) MemGetSlotParameters(uSlot);

_ASSERT(pLC->m_uSaturnTotalBanks);
if (!pLC->m_uSaturnTotalBanks)
Expand Down Expand Up @@ -452,3 +461,13 @@ bool Saturn128K::LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT version)

return true;
}

void Saturn128K::SetSaturnMemorySize(UINT banks)
{
g_uSaturnBanksFromCmdLine = banks;
}

UINT Saturn128K::GetSaturnMemorySize()
{
return g_uSaturnBanksFromCmdLine;
}
21 changes: 16 additions & 5 deletions source/LanguageCard.h
Expand Up @@ -9,7 +9,9 @@
class LanguageCardUnit : public Card
{
public:
LanguageCardUnit(SS_CARDTYPE type = CT_LanguageCardIIe);
// in modern C++ this could be a 2nd constructor
static LanguageCardUnit * create(UINT slot);

virtual ~LanguageCardUnit(void);

virtual void Init(void) {}
Expand All @@ -18,7 +20,6 @@ class LanguageCardUnit : public Card


virtual void InitializeIO(LPBYTE pCxRomPeripheral);
virtual void SetMemorySize(UINT banks) {} // No-op for //e and slot-0 16K LC
virtual UINT GetActiveBank(void) { return 0; } // Always 0 as only 1x 16K bank
virtual void SaveSnapshot(YamlSaveHelper& yamlSaveHelper) { _ASSERT(0); } // Not used for //e
virtual bool LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT version) { _ASSERT(0); return false; } // Not used for //e
Expand All @@ -33,6 +34,9 @@ class LanguageCardUnit : public Card
static const UINT kMemModeInitialState;
static const UINT kSlot0 = SLOT0;

protected:
LanguageCardUnit(SS_CARDTYPE type, UINT slot);

private:
UINT m_uLastRamWrite;
};
Expand All @@ -44,7 +48,9 @@ class LanguageCardUnit : public Card
class LanguageCardSlot0 : public LanguageCardUnit
{
public:
LanguageCardSlot0(SS_CARDTYPE = CT_LanguageCard);
// in modern C++ this could be a 2nd constructor
static LanguageCardSlot0 * create(UINT slot);

virtual ~LanguageCardSlot0(void);

virtual void SaveSnapshot(YamlSaveHelper& yamlSaveHelper);
Expand All @@ -54,6 +60,7 @@ class LanguageCardSlot0 : public LanguageCardUnit
static std::string GetSnapshotCardName(void);

protected:
LanguageCardSlot0(SS_CARDTYPE type, UINT slot);
void SaveLCState(class YamlSaveHelper& yamlSaveHelper);
void LoadLCState(class YamlLoadHelper& yamlLoadHelper);

Expand All @@ -70,15 +77,17 @@ class LanguageCardSlot0 : public LanguageCardUnit
class Saturn128K : public LanguageCardSlot0
{
public:
Saturn128K(UINT banks);
Saturn128K(UINT slot, UINT banks);
virtual ~Saturn128K(void);

virtual void InitializeIO(LPBYTE pCxRomPeripheral);
virtual void SetMemorySize(UINT banks);
virtual UINT GetActiveBank(void);
virtual void SaveSnapshot(YamlSaveHelper& yamlSaveHelper);
virtual bool LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT version);

static UINT GetSaturnMemorySize();
static void SetSaturnMemorySize(UINT banks);

static BYTE __stdcall IO(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nExecutedCycles);

// "The boards consist of 16K banks of memory (4 banks for the 64K board, 8 banks for the 128K), accessed one at a time" - Ref: "64K/128K RAM BOARD", Saturn Systems, Ch.1 Introduction(pg-5)
Expand All @@ -88,6 +97,8 @@ class Saturn128K : public LanguageCardSlot0
private:
std::string GetSnapshotMemStructName(void);

static UINT g_uSaturnBanksFromCmdLine;

UINT m_uSaturnTotalBanks; // Will be > 0 if Saturn card is installed
UINT m_uSaturnActiveBank; // Saturn 128K Language Card Bank 0 .. 7
LPBYTE m_aSaturnBanks[kMaxSaturnBanks];
Expand Down

0 comments on commit 177c9fe

Please sign in to comment.