Improve save-state card management (PR #983)

Initially all cards are removed before loading save-state.

Use new Registry "Configuration/Slot 2" location to save SSC's port name.
Use new Registry "Configuration/Slot 7" location to save HDV's image names.
Use new Registry "Configuration/Slot n" (and "Configuration/Slot Auxiliary") locations to save all other card types.

Command line: -s<slot> (eg. -s7 empty) now get persisted to the Registry.

Only update 'HDV Starting Directory' for slot7 & drive1.
This commit is contained in:
TomCh 2021-09-17 20:43:10 +01:00 committed by GitHub
parent 1b8d26051e
commit ed298b4fd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 232 additions and 203 deletions

View File

@ -25,7 +25,7 @@ enum SS_CARDTYPE
CT_SNESMAX, // 2 port Nintendo NES/SNES controller serial interface card CT_SNESMAX, // 2 port Nintendo NES/SNES controller serial interface card
}; };
enum SLOTS { SLOT0=0, SLOT1, SLOT2, SLOT3, SLOT4, SLOT5, SLOT6, SLOT7, NUM_SLOTS }; enum SLOTS { SLOT0=0, SLOT1, SLOT2, SLOT3, SLOT4, SLOT5, SLOT6, SLOT7, NUM_SLOTS, SLOT_AUX };
class Card class Card
{ {

View File

@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "CardManager.h" #include "CardManager.h"
#include "Core.h" #include "Core.h"
#include "Registry.h"
#include "Disk.h" #include "Disk.h"
#include "FourPlay.h" #include "FourPlay.h"
@ -38,15 +39,15 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "SerialComms.h" #include "SerialComms.h"
#include "SNESMAX.h" #include "SNESMAX.h"
void CardManager::Insert(UINT slot, SS_CARDTYPE type) void CardManager::InsertInternal(UINT slot, SS_CARDTYPE type)
{ {
if (type == CT_Empty)
return Remove(slot);
RemoveInternal(slot); RemoveInternal(slot);
switch (type) switch (type)
{ {
case CT_Empty:
m_slot[slot] = new EmptyCard;
break;
case CT_Disk2: case CT_Disk2:
m_slot[slot] = new Disk2InterfaceCard(slot); m_slot[slot] = new Disk2InterfaceCard(slot);
break; break;
@ -113,16 +114,23 @@ void CardManager::Insert(UINT slot, SS_CARDTYPE type)
} }
if (m_slot[slot] == NULL) if (m_slot[slot] == NULL)
m_slot[slot] = new EmptyCard; Remove(slot); // creates a new EmptyCard
}
void CardManager::Insert(UINT slot, SS_CARDTYPE type, bool updateRegistry/*=true*/)
{
InsertInternal(slot, type);
if (updateRegistry)
RegSetConfigSlotNewCardType(slot, type);
} }
void CardManager::RemoveInternal(UINT slot) void CardManager::RemoveInternal(UINT slot)
{ {
if (m_slot[slot] && m_slot[slot]->QueryType() == CT_MouseInterface) if (m_slot[slot] && m_slot[slot]->QueryType() == CT_MouseInterface)
m_pMouseCard = NULL; m_pMouseCard = NULL; // NB. object deleted below: delete m_slot[slot]
if (m_slot[slot] && m_slot[slot]->QueryType() == CT_SSC) if (m_slot[slot] && m_slot[slot]->QueryType() == CT_SSC)
m_pSSC = NULL; m_pSSC = NULL; // NB. object deleted below: delete m_slot[slot]
delete m_slot[slot]; delete m_slot[slot];
m_slot[slot] = NULL; m_slot[slot] = NULL;
@ -130,19 +138,18 @@ void CardManager::RemoveInternal(UINT slot)
void CardManager::Remove(UINT slot) void CardManager::Remove(UINT slot)
{ {
RemoveInternal(slot); Insert(slot, CT_Empty);
m_slot[slot] = new EmptyCard;
} }
void CardManager::InsertAux(SS_CARDTYPE type) void CardManager::InsertAuxInternal(SS_CARDTYPE type)
{ {
if (type == CT_Empty)
return RemoveAux();
RemoveAuxInternal(); RemoveAuxInternal();
switch (type) switch (type)
{ {
case CT_Empty:
m_aux = new EmptyCard;
break;
case CT_80Col: case CT_80Col:
m_aux = new DummyCard(type); m_aux = new DummyCard(type);
break; break;
@ -159,6 +166,14 @@ void CardManager::InsertAux(SS_CARDTYPE type)
// for consistency m_aux must never be NULL // for consistency m_aux must never be NULL
_ASSERT(m_aux != NULL); _ASSERT(m_aux != NULL);
if (m_aux == NULL)
RemoveAux(); // creates a new EmptyCard
}
void CardManager::InsertAux(SS_CARDTYPE type)
{
InsertAuxInternal(type);
RegSetConfigSlotNewCardType(SLOT_AUX, type);
} }
void CardManager::RemoveAuxInternal() void CardManager::RemoveAuxInternal()
@ -169,6 +184,5 @@ void CardManager::RemoveAuxInternal()
void CardManager::RemoveAux(void) void CardManager::RemoveAux(void)
{ {
RemoveAuxInternal(); InsertAux(CT_Empty);
m_aux = new EmptyCard;
} }

View File

@ -11,15 +11,15 @@ public:
m_pMouseCard(NULL), m_pMouseCard(NULL),
m_pSSC(NULL) m_pSSC(NULL)
{ {
Insert(0, CT_Empty); InsertInternal(SLOT0, CT_Empty);
Insert(1, CT_GenericPrinter); InsertInternal(SLOT1, CT_GenericPrinter);
Insert(2, CT_SSC); InsertInternal(SLOT2, CT_SSC);
Insert(3, CT_Uthernet); InsertInternal(SLOT3, CT_Uthernet);
Insert(4, CT_Empty); InsertInternal(SLOT4, CT_Empty);
Insert(5, CT_Empty); InsertInternal(SLOT5, CT_Empty);
Insert(6, CT_Disk2); InsertInternal(SLOT6, CT_Disk2);
Insert(7, CT_Empty); InsertInternal(SLOT7, CT_Empty);
InsertAux(CT_Extended80Col); // For Apple //e and above InsertAuxInternal(CT_Extended80Col); // For Apple //e and above
} }
~CardManager(void) ~CardManager(void)
{ {
@ -28,7 +28,7 @@ public:
RemoveAuxInternal(); RemoveAuxInternal();
} }
void Insert(UINT slot, SS_CARDTYPE type); void Insert(UINT slot, SS_CARDTYPE type, bool updateRegistry = true);
void Remove(UINT slot); void Remove(UINT slot);
SS_CARDTYPE QuerySlot(UINT slot) { _ASSERT(slot<NUM_SLOTS); return m_slot[slot]->QueryType(); } SS_CARDTYPE QuerySlot(UINT slot) { _ASSERT(slot<NUM_SLOTS); return m_slot[slot]->QueryType(); }
Card& GetRef(UINT slot) Card& GetRef(UINT slot)
@ -52,6 +52,8 @@ public:
bool IsSSCInstalled(void) { return m_pSSC != NULL; } bool IsSSCInstalled(void) { return m_pSSC != NULL; }
private: private:
void InsertInternal(UINT slot, SS_CARDTYPE type);
void InsertAuxInternal(SS_CARDTYPE type);
void RemoveInternal(UINT slot); void RemoveInternal(UINT slot);
void RemoveAuxInternal(void); void RemoveAuxInternal(void);

View File

@ -72,7 +72,7 @@ enum AppMode_e
#define REGVALUE_MB_VOLUME "Mockingboard Volume" #define REGVALUE_MB_VOLUME "Mockingboard Volume"
#define REGVALUE_SAVESTATE_FILENAME "Save State Filename" #define REGVALUE_SAVESTATE_FILENAME "Save State Filename"
#define REGVALUE_SAVE_STATE_ON_EXIT "Save State On Exit" #define REGVALUE_SAVE_STATE_ON_EXIT "Save State On Exit"
#define REGVALUE_HDD_ENABLED "Harddisk Enable" #define REGVALUE_HDD_ENABLED "Harddisk Enable" // Deprecated from 1.30.5
#define REGVALUE_JOYSTICK0_EMU_TYPE "Joystick0 Emu Type v3" // GH#434: Added at 1.26.3.0 (previously was "Joystick0 Emu Type") #define REGVALUE_JOYSTICK0_EMU_TYPE "Joystick0 Emu Type v3" // GH#434: Added at 1.26.3.0 (previously was "Joystick0 Emu Type")
#define REGVALUE_JOYSTICK1_EMU_TYPE "Joystick1 Emu Type v3" // GH#434: Added at 1.26.3.0 (previously was "Joystick1 Emu Type") #define REGVALUE_JOYSTICK1_EMU_TYPE "Joystick1 Emu Type v3" // GH#434: Added at 1.26.3.0 (previously was "Joystick1 Emu Type")
#define REGVALUE_OLD_JOYSTICK0_EMU_TYPE2 "Joystick0 Emu Type" // GH#434: Deprecated from 1.26.3.0 (previously was "Joystick 0 Emulation") #define REGVALUE_OLD_JOYSTICK0_EMU_TYPE2 "Joystick0 Emu Type" // GH#434: Deprecated from 1.26.3.0 (previously was "Joystick 0 Emulation")
@ -90,7 +90,6 @@ enum AppMode_e
#define REGVALUE_MOUSE_RESTRICT_TO_WINDOW "Mouse restrict to window" #define REGVALUE_MOUSE_RESTRICT_TO_WINDOW "Mouse restrict to window"
#define REGVALUE_THE_FREEZES_F8_ROM "The Freeze's F8 Rom" #define REGVALUE_THE_FREEZES_F8_ROM "The Freeze's F8 Rom"
#define REGVALUE_CIDERPRESSLOC "CiderPress Location" #define REGVALUE_CIDERPRESSLOC "CiderPress Location"
#define REGVALUE_CPM_CONFIG "CPM Config"
#define REGVALUE_DUMP_TO_PRINTER "Dump to printer" #define REGVALUE_DUMP_TO_PRINTER "Dump to printer"
#define REGVALUE_CONVERT_ENCODING "Convert printer encoding for clones" #define REGVALUE_CONVERT_ENCODING "Convert printer encoding for clones"
#define REGVALUE_FILTER_UNPRINTABLE "Filter unprintable characters" #define REGVALUE_FILTER_UNPRINTABLE "Filter unprintable characters"
@ -107,24 +106,25 @@ enum AppMode_e
#define REGVALUE_CUSTOM_SPEED "Custom Speed" #define REGVALUE_CUSTOM_SPEED "Custom Speed"
#define REGVALUE_EMULATION_SPEED "Emulation Speed" #define REGVALUE_EMULATION_SPEED "Emulation Speed"
#define REGVALUE_WINDOW_SCALE "Window Scale" #define REGVALUE_WINDOW_SCALE "Window Scale"
#define REGVALUE_UTHERNET_ACTIVE "Uthernet Active" // GH#977: Deprecated from 1.30.4 #define REGVALUE_UTHERNET_ACTIVE "Uthernet Active" // GH#977: Deprecated from 1.30.5
#define REGVALUE_UTHERNET_INTERFACE "Uthernet Interface" #define REGVALUE_UTHERNET_INTERFACE "Uthernet Interface"
#define REGVALUE_SLOT4 "Slot 4" // GH#977: Deprecated from 1.30.4 #define REGVALUE_SLOT4 "Slot 4" // GH#977: Deprecated from 1.30.4
#define REGVALUE_SLOT5 "Slot 5" // GH#977: Deprecated from 1.30.4 #define REGVALUE_SLOT5 "Slot 5" // GH#977: Deprecated from 1.30.4
#define REGVALUE_VERSION "Version" #define REGVALUE_VERSION "Version"
#define REG_CONFIG_SLOT_AUX "Slot Auxiliary"
#define REG_CONFIG_SLOT "Slot " #define REG_CONFIG_SLOT "Slot "
#define REGVALUE_CARD_TYPE "Card type" #define REGVALUE_CARD_TYPE "Card type"
#define REGVALUE_LAST_DISK_1 "Last Disk Image 1"
#define REGVALUE_LAST_DISK_2 "Last Disk Image 2"
#define REGVALUE_LAST_HARDDISK_1 "Last Harddisk Image 1"
#define REGVALUE_LAST_HARDDISK_2 "Last Harddisk Image 2"
// Preferences // Preferences
#define REG_PREFS "Preferences" #define REG_PREFS "Preferences"
#define REGVALUE_PREF_START_DIR "Starting Directory" #define REGVALUE_PREF_START_DIR "Starting Directory"
#define REGVALUE_PREF_LAST_DISK_1 "Last Disk Image 1"
#define REGVALUE_PREF_LAST_DISK_2 "Last Disk Image 2"
#define REGVALUE_PREF_WINDOW_X_POS "Window X-Position" #define REGVALUE_PREF_WINDOW_X_POS "Window X-Position"
#define REGVALUE_PREF_WINDOW_Y_POS "Window Y-Position" #define REGVALUE_PREF_WINDOW_Y_POS "Window Y-Position"
#define REGVALUE_PREF_HDV_START_DIR "HDV Starting Directory" #define REGVALUE_PREF_HDV_START_DIR "HDV Starting Directory"
#define REGVALUE_PREF_LAST_HARDDISK_1 "Last Harddisk Image 1"
#define REGVALUE_PREF_LAST_HARDDISK_2 "Last Harddisk Image 2"
#define WM_USER_BENCHMARK WM_USER+1 #define WM_USER_BENCHMARK WM_USER+1
#define WM_USER_SAVESTATE WM_USER+2 #define WM_USER_SAVESTATE WM_USER+2

View File

@ -4,7 +4,7 @@
#include "../CardManager.h" #include "../CardManager.h"
#include "../CPU.h" #include "../CPU.h"
#include "../DiskImage.h" // Disk_Status_e #include "../DiskImage.h" // Disk_Status_e
#include "../Harddisk.h" // HD_CardIsEnabled() #include "../Harddisk.h"
#include "../Interface.h" // VideoRefreshRate_e, GetVideoRefreshRate() #include "../Interface.h" // VideoRefreshRate_e, GetVideoRefreshRate()
#include "../Tfe/tfe.h" #include "../Tfe/tfe.h"
@ -17,13 +17,11 @@ public:
m_uSaveLoadStateMsg(0), m_uSaveLoadStateMsg(0),
m_videoRefreshRate( GetVideo().GetVideoRefreshRate() ) m_videoRefreshRate( GetVideo().GetVideoRefreshRate() )
{ {
m_bEnableHDD = HD_CardIsEnabled();
m_bEnableTheFreezesF8Rom = bEnableTheFreezesF8Rom; m_bEnableTheFreezesF8Rom = bEnableTheFreezesF8Rom;
memset(&m_Slot, 0, sizeof(m_Slot));
m_SlotAux = CT_Empty; for (UINT slot = SLOT0; slot < NUM_SLOTS; slot++)
m_Slot[SLOT4] = GetCardMgr().QuerySlot(SLOT4); m_Slot[slot] = GetCardMgr().QuerySlot(slot);
m_Slot[SLOT5] = GetCardMgr().QuerySlot(SLOT5); m_SlotAux = GetCardMgr().QueryAux();
m_Slot[SLOT7] = GetCardMgr().QuerySlot(SLOT7);
m_tfeInterface = get_tfe_interface(); m_tfeInterface = get_tfe_interface();
} }
@ -33,7 +31,7 @@ public:
m_Apple2Type = other.m_Apple2Type; m_Apple2Type = other.m_Apple2Type;
m_CpuType = other.m_CpuType; m_CpuType = other.m_CpuType;
memcpy(m_Slot, other.m_Slot, sizeof(m_Slot)); memcpy(m_Slot, other.m_Slot, sizeof(m_Slot));
m_bEnableHDD = other.m_bEnableHDD; m_SlotAux = other.m_SlotAux;
m_tfeInterface = other.m_tfeInterface; m_tfeInterface = other.m_tfeInterface;
m_bEnableTheFreezesF8Rom = other.m_bEnableTheFreezesF8Rom; m_bEnableTheFreezesF8Rom = other.m_bEnableTheFreezesF8Rom;
m_uSaveLoadStateMsg = other.m_uSaveLoadStateMsg; m_uSaveLoadStateMsg = other.m_uSaveLoadStateMsg;
@ -46,7 +44,7 @@ public:
return m_Apple2Type == other.m_Apple2Type && return m_Apple2Type == other.m_Apple2Type &&
m_CpuType == other.m_CpuType && m_CpuType == other.m_CpuType &&
memcmp(m_Slot, other.m_Slot, sizeof(m_Slot)) == 0 && memcmp(m_Slot, other.m_Slot, sizeof(m_Slot)) == 0 &&
m_bEnableHDD == other.m_bEnableHDD && m_SlotAux == other.m_SlotAux &&
m_tfeInterface == other.m_tfeInterface && m_tfeInterface == other.m_tfeInterface &&
m_bEnableTheFreezesF8Rom == other.m_bEnableTheFreezesF8Rom && m_bEnableTheFreezesF8Rom == other.m_bEnableTheFreezesF8Rom &&
m_uSaveLoadStateMsg == other.m_uSaveLoadStateMsg && m_uSaveLoadStateMsg == other.m_uSaveLoadStateMsg &&
@ -60,9 +58,8 @@ public:
eApple2Type m_Apple2Type; eApple2Type m_Apple2Type;
eCpuType m_CpuType; eCpuType m_CpuType;
SS_CARDTYPE m_Slot[NUM_SLOTS]; // 0..7 SS_CARDTYPE m_Slot[NUM_SLOTS];
SS_CARDTYPE m_SlotAux; SS_CARDTYPE m_SlotAux;
bool m_bEnableHDD;
std::string m_tfeInterface; std::string m_tfeInterface;
UINT m_bEnableTheFreezesF8Rom; UINT m_bEnableTheFreezesF8Rom;
UINT m_uSaveLoadStateMsg; UINT m_uSaveLoadStateMsg;

View File

@ -11,6 +11,7 @@ public:
virtual DWORD GetVolumeMax(void) = 0; // TODO:TC: Move out of here virtual DWORD GetVolumeMax(void) = 0; // TODO:TC: Move out of here
virtual bool SaveStateSelectImage(HWND hWindow, bool bSave) = 0; // TODO:TC: Move out of here virtual bool SaveStateSelectImage(HWND hWindow, bool bSave) = 0; // TODO:TC: Move out of here
virtual void ApplyNewConfig(const CConfigNeedingRestart& ConfigNew, const CConfigNeedingRestart& ConfigOld) = 0; virtual void ApplyNewConfig(const CConfigNeedingRestart& ConfigNew, const CConfigNeedingRestart& ConfigOld) = 0;
virtual void ApplyNewConfigFromSnapshot(const CConfigNeedingRestart& ConfigNew) = 0;
virtual void ConfigSaveApple2Type(eApple2Type apple2Type) = 0; virtual void ConfigSaveApple2Type(eApple2Type apple2Type) = 0;
virtual UINT GetScrollLockToggle(void) = 0; virtual UINT GetScrollLockToggle(void) = 0;

View File

@ -350,13 +350,8 @@ void CPageConfig::DlgOK(HWND hWnd)
if (GetCardMgr().IsSSCInstalled()) if (GetCardMgr().IsSSCInstalled())
{ {
CSuperSerialCard* pSSC = GetCardMgr().GetSSC();
const DWORD uNewSerialPort = (DWORD) SendDlgItemMessage(hWnd, IDC_SERIALPORT, CB_GETCURSEL, 0, 0); const DWORD uNewSerialPort = (DWORD) SendDlgItemMessage(hWnd, IDC_SERIALPORT, CB_GETCURSEL, 0, 0);
pSSC->CommSetSerialPort(hWnd, uNewSerialPort); GetCardMgr().GetSSC()->CommSetSerialPort(uNewSerialPort);
RegSaveString( TEXT(REG_CONFIG),
TEXT(REGVALUE_SERIAL_PORT_NAME),
TRUE,
pSSC->GetSerialPortName() );
} }
// //

View File

@ -80,6 +80,12 @@ INT_PTR CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARA
if (m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT5] == CT_Disk2 || m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT5] == CT_Disk2) if (m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT5] == CT_Disk2 || m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT5] == CT_Disk2)
m_PropertySheetHelper.SetSlot(SLOT5, m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT5]); m_PropertySheetHelper.SetSlot(SLOT5, m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT5]);
} }
// Support 'Cancel' case for Slot-7 HDD enabled/disabled - needed as the HarddiskInterfaceCard object is created on toggling the checkbox. See [*2]
if (m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT7] != m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT7])
{
if (m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT7] == CT_GenericHDD || m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT7] == CT_GenericHDD)
HD_SetEnabled(m_PropertySheetHelper.GetConfigOld().m_Slot[SLOT7] == CT_GenericHDD);
}
DlgCANCEL(hWnd); DlgCANCEL(hWnd);
break; break;
} }
@ -141,7 +147,14 @@ INT_PTR CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARA
} }
break; break;
case IDC_HDD_ENABLE: case IDC_HDD_ENABLE:
EnableHDD(hWnd, IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE)); {
const BOOL checked = IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE) ? TRUE : FALSE;
m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT7] = checked ? CT_GenericHDD : CT_Empty;
// NB. Unusual as it creates slot object when checkbox is toggled (instead of after OK)
// Needed as we need a HarddiskInterfaceCard object so that images can be inserted/ejected [*2]
HD_SetEnabled(m_PropertySheetHelper.GetConfigNew().m_Slot[SLOT7] == CT_GenericHDD);
EnableHDD(hWnd, checked);
}
break; break;
case IDC_HDD_SWAP: case IDC_HDD_SWAP:
HandleHDDSwap(hWnd); HandleHDDSwap(hWnd);
@ -251,12 +264,6 @@ void CPageDisk::DlgOK(HWND hWnd)
REGSAVE(TEXT(REGVALUE_ENHANCE_DISK_SPEED), (DWORD)bNewEnhanceDisk); REGSAVE(TEXT(REGVALUE_ENHANCE_DISK_SPEED), (DWORD)bNewEnhanceDisk);
} }
const bool bNewHDDIsEnabled = IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE) ? true : false;
if (bNewHDDIsEnabled != HD_CardIsEnabled())
{
m_PropertySheetHelper.GetConfigNew().m_bEnableHDD = bNewHDDIsEnabled;
}
m_PropertySheetHelper.PostMsgAfterClose(hWnd, m_Page); m_PropertySheetHelper.PostMsgAfterClose(hWnd, m_Page);
} }

View File

@ -28,6 +28,10 @@ public:
{ {
m_PropertySheetHelper.ApplyNewConfig(ConfigNew, ConfigOld); m_PropertySheetHelper.ApplyNewConfig(ConfigNew, ConfigOld);
} }
void ApplyNewConfigFromSnapshot(const CConfigNeedingRestart& ConfigNew)
{
m_PropertySheetHelper.ApplyNewConfigFromSnapshot(ConfigNew);
}
void ConfigSaveApple2Type(eApple2Type apple2Type) void ConfigSaveApple2Type(eApple2Type apple2Type)
{ {
m_PropertySheetHelper.ConfigSaveApple2Type(apple2Type); m_PropertySheetHelper.ConfigSaveApple2Type(apple2Type);

View File

@ -125,18 +125,10 @@ void CPropertySheetHelper::SetSlot(UINT slot, SS_CARDTYPE newCardType)
if (slot >= NUM_SLOTS) if (slot >= NUM_SLOTS)
return; return;
// Two paths:
// 1) Via Config dialog: card not inserted yet
// 2) Snapshot_LoadState_v2(): card already inserted
if (GetCardMgr().QuerySlot(slot) == newCardType) if (GetCardMgr().QuerySlot(slot) == newCardType)
return; return;
GetCardMgr().Insert(slot, newCardType); GetCardMgr().Insert(slot, newCardType);
RegDeleteConfigSlotSection(slot);
std::string& regSection = RegGetConfigSlotSection(slot);
RegSaveValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, newCardType);
} }
// Used by: // Used by:
@ -356,14 +348,9 @@ void CPropertySheetHelper::ApplyNewConfig(const CConfigNeedingRestart& ConfigNew
if (CONFIG_CHANGED_LOCAL(m_Slot[slot])) if (CONFIG_CHANGED_LOCAL(m_Slot[slot]))
SetSlot(slot, ConfigNew.m_Slot[slot]); SetSlot(slot, ConfigNew.m_Slot[slot]);
// slot = SLOT7; slot = SLOT7;
// if (CONFIG_CHANGED_LOCAL(m_Slot[slot])) if (CONFIG_CHANGED_LOCAL(m_Slot[slot]))
// SetSlot(slot, ConfigNew.m_Slot[slot]); SetSlot(slot, ConfigNew.m_Slot[slot]);
if (CONFIG_CHANGED_LOCAL(m_bEnableHDD))
{
REGSAVE(TEXT(REGVALUE_HDD_ENABLED), ConfigNew.m_bEnableHDD ? 1 : 0);
}
if (CONFIG_CHANGED_LOCAL(m_bEnableTheFreezesF8Rom)) if (CONFIG_CHANGED_LOCAL(m_bEnableTheFreezesF8Rom))
{ {
@ -376,6 +363,14 @@ void CPropertySheetHelper::ApplyNewConfig(const CConfigNeedingRestart& ConfigNew
} }
} }
void CPropertySheetHelper::ApplyNewConfigFromSnapshot(const CConfigNeedingRestart& ConfigNew)
{
SaveComputerType(ConfigNew.m_Apple2Type);
SaveCpuType(ConfigNew.m_CpuType);
REGSAVE(TEXT(REGVALUE_THE_FREEZES_F8_ROM), ConfigNew.m_bEnableTheFreezesF8Rom);
REGSAVE(TEXT(REGVALUE_VIDEO_REFRESH_RATE), ConfigNew.m_videoRefreshRate);
}
void CPropertySheetHelper::ApplyNewConfig(void) void CPropertySheetHelper::ApplyNewConfig(void)
{ {
ApplyNewConfig(m_ConfigNew, m_ConfigOld); ApplyNewConfig(m_ConfigNew, m_ConfigOld);
@ -390,7 +385,7 @@ void CPropertySheetHelper::SaveCurrentConfig(void)
m_ConfigOld.m_Slot[SLOT4] = GetCardMgr().QuerySlot(SLOT4); m_ConfigOld.m_Slot[SLOT4] = GetCardMgr().QuerySlot(SLOT4);
m_ConfigOld.m_Slot[SLOT5] = GetCardMgr().QuerySlot(SLOT5); m_ConfigOld.m_Slot[SLOT5] = GetCardMgr().QuerySlot(SLOT5);
m_ConfigOld.m_Slot[SLOT6] = GetCardMgr().QuerySlot(SLOT6); // CPageDisk::HandleFloppyDriveCombo() needs this to be CT_Disk2 (temp, as will replace with PR #955) m_ConfigOld.m_Slot[SLOT6] = GetCardMgr().QuerySlot(SLOT6); // CPageDisk::HandleFloppyDriveCombo() needs this to be CT_Disk2 (temp, as will replace with PR #955)
m_ConfigOld.m_bEnableHDD = HD_CardIsEnabled(); m_ConfigOld.m_Slot[SLOT7] = GetCardMgr().QuerySlot(SLOT7);
m_ConfigOld.m_bEnableTheFreezesF8Rom = GetPropertySheet().GetTheFreezesF8Rom(); m_ConfigOld.m_bEnableTheFreezesF8Rom = GetPropertySheet().GetTheFreezesF8Rom();
m_ConfigOld.m_videoRefreshRate = GetVideo().GetVideoRefreshRate(); m_ConfigOld.m_videoRefreshRate = GetVideo().GetVideoRefreshRate();
m_ConfigOld.m_tfeInterface = get_tfe_interface(); m_ConfigOld.m_tfeInterface = get_tfe_interface();
@ -411,7 +406,7 @@ void CPropertySheetHelper::RestoreCurrentConfig(void)
SetSlot(SLOT3, m_ConfigOld.m_Slot[SLOT3]); SetSlot(SLOT3, m_ConfigOld.m_Slot[SLOT3]);
SetSlot(SLOT4, m_ConfigOld.m_Slot[SLOT4]); SetSlot(SLOT4, m_ConfigOld.m_Slot[SLOT4]);
SetSlot(SLOT5, m_ConfigOld.m_Slot[SLOT5]); SetSlot(SLOT5, m_ConfigOld.m_Slot[SLOT5]);
HD_SetEnabled(m_ConfigOld.m_bEnableHDD); HD_SetEnabled(m_ConfigOld.m_Slot[SLOT7] == CT_GenericHDD);
GetPropertySheet().SetTheFreezesF8Rom(m_ConfigOld.m_bEnableTheFreezesF8Rom); GetPropertySheet().SetTheFreezesF8Rom(m_ConfigOld.m_bEnableTheFreezesF8Rom);
m_ConfigNew.m_videoRefreshRate = m_ConfigOld.m_videoRefreshRate; // Not SetVideoRefreshRate(), as this re-inits much Video/NTSC state! m_ConfigNew.m_videoRefreshRate = m_ConfigOld.m_videoRefreshRate; // Not SetVideoRefreshRate(), as this re-inits much Video/NTSC state!
} }
@ -476,7 +471,7 @@ bool CPropertySheetHelper::HardwareConfigChanged(HWND hWnd)
if (CONFIG_CHANGED(m_Slot[SLOT5])) if (CONFIG_CHANGED(m_Slot[SLOT5]))
strMsgMain += GetSlot(SLOT5); strMsgMain += GetSlot(SLOT5);
if (CONFIG_CHANGED(m_bEnableHDD)) if (CONFIG_CHANGED(m_Slot[SLOT7]))
strMsgMain += ". Harddisk(s) have been plugged/unplugged\n"; strMsgMain += ". Harddisk(s) have been plugged/unplugged\n";
if (CONFIG_CHANGED(m_bEnableTheFreezesF8Rom)) if (CONFIG_CHANGED(m_bEnableTheFreezesF8Rom))

View File

@ -34,6 +34,7 @@ public:
bool IsConfigChanged(void) { return m_ConfigNew != m_ConfigOld; } bool IsConfigChanged(void) { return m_ConfigNew != m_ConfigOld; }
void SetDoBenchmark(void) { m_bDoBenchmark = true; } void SetDoBenchmark(void) { m_bDoBenchmark = true; }
void ApplyNewConfig(const CConfigNeedingRestart& ConfigNew, const CConfigNeedingRestart& ConfigOld); void ApplyNewConfig(const CConfigNeedingRestart& ConfigNew, const CConfigNeedingRestart& ConfigOld);
void ApplyNewConfigFromSnapshot(const CConfigNeedingRestart& ConfigNew);
void ConfigSaveApple2Type(eApple2Type apple2Type); void ConfigSaveApple2Type(eApple2Type apple2Type);
void SetSlot(UINT slot, SS_CARDTYPE newCardType); void SetSlot(UINT slot, SS_CARDTYPE newCardType);

View File

@ -166,8 +166,8 @@ void Disk2InterfaceCard::LoadLastDiskImage(const int drive)
_ASSERT(drive == DRIVE_1 || drive == DRIVE_2); _ASSERT(drive == DRIVE_1 || drive == DRIVE_2);
const std::string regKey = (drive == DRIVE_1) const std::string regKey = (drive == DRIVE_1)
? REGVALUE_PREF_LAST_DISK_1 ? REGVALUE_LAST_DISK_1
: REGVALUE_PREF_LAST_DISK_2; : REGVALUE_LAST_DISK_2;
char pathname[MAX_PATH]; char pathname[MAX_PATH];
@ -175,7 +175,6 @@ void Disk2InterfaceCard::LoadLastDiskImage(const int drive)
if (RegLoadString(regSection.c_str(), regKey.c_str(), TRUE, pathname, MAX_PATH, TEXT(""))) if (RegLoadString(regSection.c_str(), regKey.c_str(), TRUE, pathname, MAX_PATH, TEXT("")))
{ {
m_saveDiskImage = false; m_saveDiskImage = false;
// Pass in ptr to local copy of filepath, since RemoveDisk() sets DiskPathFilename = ""
InsertDisk(drive, pathname, IMAGE_USE_FILES_WRITE_PROTECT_STATUS, IMAGE_DONT_CREATE); InsertDisk(drive, pathname, IMAGE_USE_FILES_WRITE_PROTECT_STATUS, IMAGE_DONT_CREATE);
m_saveDiskImage = true; m_saveDiskImage = true;
} }
@ -194,8 +193,8 @@ void Disk2InterfaceCard::SaveLastDiskImage(const int drive)
RegSaveValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, CT_Disk2); RegSaveValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, CT_Disk2);
const std::string regKey = (drive == DRIVE_1) const std::string regKey = (drive == DRIVE_1)
? REGVALUE_PREF_LAST_DISK_1 ? REGVALUE_LAST_DISK_1
: REGVALUE_PREF_LAST_DISK_2; : REGVALUE_LAST_DISK_2;
const std::string& pathName = DiskGetFullPathName(drive); const std::string& pathName = DiskGetFullPathName(drive);

View File

@ -209,49 +209,59 @@ static void NotifyInvalidImage(TCHAR* pszImageFilename)
BOOL HD_Insert(const int iDrive, const std::string& pathname); BOOL HD_Insert(const int iDrive, const std::string& pathname);
void HD_LoadLastDiskImage(const int iDrive) void HD_LoadLastDiskImage(const int drive)
{ {
_ASSERT(iDrive == HARDDISK_1 || iDrive == HARDDISK_2); _ASSERT(drive == HARDDISK_1 || drive == HARDDISK_2);
const char *pRegKey = (iDrive == HARDDISK_1) const std::string regKey = (drive == HARDDISK_1)
? REGVALUE_PREF_LAST_HARDDISK_1 ? REGVALUE_LAST_HARDDISK_1
: REGVALUE_PREF_LAST_HARDDISK_2; : REGVALUE_LAST_HARDDISK_2;
TCHAR sFilePath[MAX_PATH]; char pathname[MAX_PATH];
if (RegLoadString(TEXT(REG_PREFS), pRegKey, 1, sFilePath, MAX_PATH, TEXT("")))
std::string& regSection = RegGetConfigSlotSection(g_uSlot);
if (RegLoadString(regSection.c_str(), regKey.c_str(), TRUE, pathname, MAX_PATH, TEXT("")))
{ {
g_bSaveDiskImage = false; g_bSaveDiskImage = false;
// Pass in ptr to local copy of filepath, since RemoveDisk() sets DiskPathFilename = "" // todo: update comment for HD func HD_Insert(drive, pathname);
HD_Insert(iDrive, sFilePath);
g_bSaveDiskImage = true; g_bSaveDiskImage = true;
} }
} }
//=========================================================================== //===========================================================================
static void HD_SaveLastDiskImage(const int iDrive) static void HD_SaveLastDiskImage(const int drive)
{ {
_ASSERT(iDrive == HARDDISK_1 || iDrive == HARDDISK_2); _ASSERT(drive == HARDDISK_1 || drive == HARDDISK_2);
if (!g_bSaveDiskImage) if (!g_bSaveDiskImage)
return; return;
const std::string & pFileName = HD_GetFullPathName(iDrive); std::string& regSection = RegGetConfigSlotSection(g_uSlot);
RegSaveValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, CT_GenericHDD);
if (iDrive == HARDDISK_1) const std::string regKey = (drive == HARDDISK_1)
RegSaveString(TEXT(REG_PREFS), REGVALUE_PREF_LAST_HARDDISK_1, TRUE, pFileName); ? REGVALUE_LAST_HARDDISK_1
else : REGVALUE_LAST_HARDDISK_2;
RegSaveString(TEXT(REG_PREFS), REGVALUE_PREF_LAST_HARDDISK_2, TRUE, pFileName);
const std::string& pathName = HD_GetFullPathName(drive);
RegSaveString(regSection.c_str(), regKey.c_str(), TRUE, pathName);
// //
char szPathName[MAX_PATH]; // For now, only update 'HDV Starting Directory' for slot7 & drive1
strcpy(szPathName, pFileName.c_str()); // . otherwise you'll get inconsistent results if you set drive1, then drive2 (and the images were in different folders)
if (_tcsrchr(szPathName, TEXT(PATH_SEPARATOR))) if (g_uSlot != SLOT7 || drive != HARDDISK_1)
return;
TCHAR szPathName[MAX_PATH];
StringCbCopy(szPathName, MAX_PATH, pathName.c_str());
TCHAR* slash = _tcsrchr(szPathName, PATH_SEPARATOR);
if (slash != NULL)
{ {
char* pPathEnd = _tcsrchr(szPathName, TEXT(PATH_SEPARATOR))+1; slash[1] = '\0';
*pPathEnd = 0; RegSaveString(REG_PREFS, REGVALUE_PREF_HDV_START_DIR, 1, szPathName);
RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, szPathName);
} }
} }
@ -272,7 +282,7 @@ bool HD_CardIsEnabled(void)
// . LoadConfiguration() - Done at each restart // . LoadConfiguration() - Done at each restart
// . RestoreCurrentConfig() - Done when Config dialog is cancelled // . RestoreCurrentConfig() - Done when Config dialog is cancelled
// . Snapshot_LoadState_v2() - Done to default to disabled state // . Snapshot_LoadState_v2() - Done to default to disabled state
void HD_SetEnabled(const bool bEnabled) void HD_SetEnabled(const bool bEnabled, bool updateRegistry/*=true*/)
{ {
if(g_bHD_Enabled == bEnabled) if(g_bHD_Enabled == bEnabled)
return; return;
@ -280,7 +290,7 @@ void HD_SetEnabled(const bool bEnabled)
g_bHD_Enabled = bEnabled; g_bHD_Enabled = bEnabled;
if (bEnabled) if (bEnabled)
GetCardMgr().Insert(SLOT7, CT_GenericHDD); GetCardMgr().Insert(SLOT7, CT_GenericHDD, updateRegistry);
else else
GetCardMgr().Remove(SLOT7); GetCardMgr().Remove(SLOT7);
@ -886,7 +896,7 @@ bool HD_LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT slot, UINT version, co
if (!bResSelectImage1 && !bResSelectImage2) if (!bResSelectImage1 && !bResSelectImage2)
RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, strSaveStatePath); RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, strSaveStatePath);
HD_SetEnabled(true); HD_SetEnabled(true, false);
GetFrame().FrameRefreshStatus(DRAW_LEDS | DRAW_DISK_STATUS); GetFrame().FrameRefreshStatus(DRAW_LEDS | DRAW_DISK_STATUS);

View File

@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
void HD_Destroy(void); void HD_Destroy(void);
bool HD_CardIsEnabled(void); bool HD_CardIsEnabled(void);
void HD_SetEnabled(const bool bEnabled); void HD_SetEnabled(const bool bEnabled, bool updateRegistry = true);
const std::string & HD_GetFullName(const int iDrive); const std::string & HD_GetFullName(const int iDrive);
const std::string & HD_GetFullPathName(const int iDrive); const std::string & HD_GetFullPathName(const int iDrive);
void HD_GetFilenameAndPathForSaveState(std::string& filename, std::string& path); void HD_GetFilenameAndPathForSaveState(std::string& filename, std::string& path);

View File

@ -158,8 +158,15 @@ void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value) {
static std::string& RegGetSlotSection(UINT slot) static std::string& RegGetSlotSection(UINT slot)
{ {
static std::string section; static std::string section;
section = REG_CONFIG_SLOT; if (slot == SLOT_AUX)
section += (char)('0' + slot); {
section = REG_CONFIG_SLOT_AUX;
}
else
{
section = REG_CONFIG_SLOT;
section += (char)('0' + slot);
}
return section; return section;
} }
@ -177,8 +184,7 @@ void RegDeleteConfigSlotSection(UINT slot)
if (!g_sConfigFile.empty()) if (!g_sConfigFile.empty())
{ {
std::string section = REG_CONFIG "\\"; std::string& section = RegGetConfigSlotSection(slot);
section += RegGetSlotSection(slot);
return _ini::RegDeleteString(section.c_str(), peruser); return _ini::RegDeleteString(section.c_str(), peruser);
} }
@ -194,11 +200,21 @@ void RegDeleteConfigSlotSection(UINT slot)
&keyhandle); &keyhandle);
if (status == ERROR_SUCCESS) if (status == ERROR_SUCCESS)
{ {
std::string& keySlot = RegGetSlotSection(slot); std::string& section = RegGetSlotSection(slot);
LSTATUS status2 = RegDeleteKey(keyhandle, keySlot.c_str()); LSTATUS status2 = RegDeleteKey(keyhandle, section.c_str());
if (status2 != ERROR_SUCCESS && status2 != ERROR_FILE_NOT_FOUND) if (status2 != ERROR_SUCCESS && status2 != ERROR_FILE_NOT_FOUND)
_ASSERT(0); _ASSERT(0);
} }
RegCloseKey(keyhandle); RegCloseKey(keyhandle);
} }
void RegSetConfigSlotNewCardType(UINT slot, SS_CARDTYPE type)
{
RegDeleteConfigSlotSection(slot);
std::string regSection;
regSection = RegGetConfigSlotSection(slot);
RegSaveValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, type);
}

View File

@ -13,3 +13,4 @@ void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value);
std::string& RegGetConfigSlotSection(UINT slot); std::string& RegGetConfigSlotSection(UINT slot);
void RegDeleteConfigSlotSection(UINT slot); void RegDeleteConfigSlotSection(UINT slot);
void RegSetConfigSlotNewCardType(UINT slot, enum SS_CARDTYPE type);

View File

@ -286,6 +286,7 @@ static void ParseUnitApple2(YamlLoadHelper& yamlLoadHelper, UINT version)
KeybLoadSnapshot(yamlLoadHelper, version); KeybLoadSnapshot(yamlLoadHelper, version);
SpkrLoadSnapshot(yamlLoadHelper); SpkrLoadSnapshot(yamlLoadHelper);
GetVideo().VideoLoadSnapshot(yamlLoadHelper, version); GetVideo().VideoLoadSnapshot(yamlLoadHelper, version);
m_ConfigNew.m_videoRefreshRate = GetVideo().GetVideoRefreshRate();
MemLoadSnapshot(yamlLoadHelper, version); MemLoadSnapshot(yamlLoadHelper, version);
// g_Apple2Type may've changed: so redraw frame (title, buttons, leds, etc) // g_Apple2Type may've changed: so redraw frame (title, buttons, leds, etc)
@ -300,6 +301,8 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
if (unitVersion != UNIT_SLOTS_VER) if (unitVersion != UNIT_SLOTS_VER)
throw std::string(SS_YAML_KEY_UNIT ": Slots: Version mismatch"); throw std::string(SS_YAML_KEY_UNIT ": Slots: Version mismatch");
bool cardInserted[NUM_SLOTS] = {};
while (1) while (1)
{ {
std::string scalar = yamlLoadHelper.GetMapNextSlotNumber(); std::string scalar = yamlLoadHelper.GetMapNextSlotNumber();
@ -308,7 +311,7 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
const int slot = strtoul(scalar.c_str(), NULL, 10); // NB. aux slot supported as a different "unit" const int slot = strtoul(scalar.c_str(), NULL, 10); // NB. aux slot supported as a different "unit"
// NB. slot-0 only supported for Apple II or II+ (or similar clones) // NB. slot-0 only supported for Apple II or II+ (or similar clones)
if (slot < 0 || slot > 7) if (slot < SLOT0 || slot > SLOT7)
throw std::string("Slots: Invalid slot #: ") + scalar; throw std::string("Slots: Invalid slot #: ") + scalar;
yamlLoadHelper.GetSubMap(scalar); yamlLoadHelper.GetSubMap(scalar);
@ -324,8 +327,9 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
if (card == Printer_GetSnapshotCardName()) if (card == Printer_GetSnapshotCardName())
{ {
bRes = Printer_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_GenericPrinter; type = CT_GenericPrinter;
GetCardMgr().Insert(slot, type);
bRes = Printer_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
else if (card == CSuperSerialCard::GetSnapshotCardName()) else if (card == CSuperSerialCard::GetSnapshotCardName())
{ {
@ -341,18 +345,21 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
} }
else if (card == Z80_GetSnapshotCardName()) else if (card == Z80_GetSnapshotCardName())
{ {
bRes = Z80_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_Z80; type = CT_Z80;
GetCardMgr().Insert(slot, type);
bRes = Z80_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
else if (card == MB_GetSnapshotCardName()) else if (card == MB_GetSnapshotCardName())
{ {
bRes = MB_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_MockingboardC; type = CT_MockingboardC;
GetCardMgr().Insert(slot, type);
bRes = MB_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
else if (card == Phasor_GetSnapshotCardName()) else if (card == Phasor_GetSnapshotCardName())
{ {
bRes = Phasor_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
type = CT_Phasor; type = CT_Phasor;
GetCardMgr().Insert(slot, type);
bRes = Phasor_LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
else if (card == Disk2InterfaceCard::GetSnapshotCardName()) else if (card == Disk2InterfaceCard::GetSnapshotCardName())
{ {
@ -362,21 +369,21 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
} }
else if (card == HD_GetSnapshotCardName()) else if (card == HD_GetSnapshotCardName())
{ {
bRes = HD_LoadSnapshot(yamlLoadHelper, slot, cardVersion, g_strSaveStatePath);
m_ConfigNew.m_bEnableHDD = true;
type = CT_GenericHDD; type = CT_GenericHDD;
GetCardMgr().Insert(slot, type);
bRes = HD_LoadSnapshot(yamlLoadHelper, slot, cardVersion, g_strSaveStatePath);
} }
else if (card == LanguageCardSlot0::GetSnapshotCardName()) else if (card == LanguageCardSlot0::GetSnapshotCardName())
{ {
type = CT_LanguageCard; type = CT_LanguageCard;
SetExpansionMemType(type); SetExpansionMemType(type); // calls GetCardMgr().Insert() & InsertAux()
CreateLanguageCard(); CreateLanguageCard();
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion); bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
else if (card == Saturn128K::GetSnapshotCardName()) else if (card == Saturn128K::GetSnapshotCardName())
{ {
type = CT_Saturn128K; type = CT_Saturn128K;
SetExpansionMemType(type); SetExpansionMemType(type); // calls GetCardMgr().Insert() & InsertAux()
CreateLanguageCard(); CreateLanguageCard();
bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion); bRes = GetLanguageCard()->LoadSnapshot(yamlLoadHelper, slot, cardVersion);
} }
@ -397,14 +404,19 @@ static void ParseSlots(YamlLoadHelper& yamlLoadHelper, UINT unitVersion)
throw std::string("Slots: Unknown card: " + card); // todo: don't throw - just ignore & continue throw std::string("Slots: Unknown card: " + card); // todo: don't throw - just ignore & continue
} }
if (bRes) cardInserted[slot] = true;
{
m_ConfigNew.m_Slot[slot] = type;
}
yamlLoadHelper.PopMap(); yamlLoadHelper.PopMap();
yamlLoadHelper.PopMap(); yamlLoadHelper.PopMap();
} }
// Save-state may not contain any info about empty slots, so ensure they are set to empty
for (UINT slot = SLOT0; slot < NUM_SLOTS; slot++)
{
if (cardInserted[slot])
continue;
GetCardMgr().Remove(slot);
}
} }
//--- //---
@ -466,44 +478,17 @@ static void Snapshot_LoadState_v2(void)
restart = true; restart = true;
CConfigNeedingRestart ConfigOld;
//ConfigOld.m_Slot[0] = CT_LanguageCard; // fixme: II/II+=LC, //e=empty
ConfigOld.m_Slot[1] = CT_GenericPrinter; // fixme
ConfigOld.m_Slot[2] = CT_SSC; // fixme
//ConfigOld.m_Slot[3] = CT_Uthernet; // todo
ConfigOld.m_Slot[6] = CT_Disk2; // fixme
ConfigOld.m_Slot[7] = ConfigOld.m_bEnableHDD ? CT_GenericHDD : CT_Empty; // fixme
//ConfigOld.m_SlotAux = ?; // fixme
for (UINT i=0; i<NUM_SLOTS; i++)
m_ConfigNew.m_Slot[i] = CT_Empty;
m_ConfigNew.m_SlotAux = CT_Empty;
m_ConfigNew.m_bEnableHDD = false;
//m_ConfigNew.m_bEnableTheFreezesF8Rom = ?; // todo: when support saving config //m_ConfigNew.m_bEnableTheFreezesF8Rom = ?; // todo: when support saving config
for (UINT slot = SLOT0; slot < NUM_SLOTS; slot++)
GetCardMgr().Remove(slot);
GetCardMgr().RemoveAux();
MemReset(); // Also calls CpuInitialize() MemReset(); // Also calls CpuInitialize()
GetPravets().Reset(); GetPravets().Reset();
if (GetCardMgr().IsSSCInstalled())
{
GetCardMgr().GetSSC()->CommReset();
}
else
{
_ASSERT(GetCardMgr().QuerySlot(SLOT2) == CT_Empty);
ConfigOld.m_Slot[2] = CT_Empty;
}
if (GetCardMgr().QuerySlot(SLOT4) == CT_MouseInterface)
GetCardMgr().Remove(SLOT4); // Remove Mouse card from slot-4
if (GetCardMgr().QuerySlot(SLOT5) == CT_Disk2)
GetCardMgr().Remove(SLOT5); // Remove Disk2 card from slot-5
GetCardMgr().GetDisk2CardMgr().Reset(false);
HD_Reset(); HD_Reset();
HD_SetEnabled(false); HD_SetEnabled(false); // Set disabled & also removes card from slot 7
KeybReset(); KeybReset();
GetVideo().VideoResetState(); GetVideo().VideoResetState();
@ -530,7 +515,7 @@ static void Snapshot_LoadState_v2(void)
// . A change in h/w via loading a save-state avoids this VM restart // . A change in h/w via loading a save-state avoids this VM restart
// The latter is the desired approach (as the former needs a "power-on" / F2 to start things again) // The latter is the desired approach (as the former needs a "power-on" / F2 to start things again)
GetPropertySheet().ApplyNewConfig(m_ConfigNew, ConfigOld); // Mainly just saves (some) new state to Registry GetPropertySheet().ApplyNewConfigFromSnapshot(m_ConfigNew); // Saves new state to Registry (not slot/cards though)
MemInitializeROM(); MemInitializeROM();
MemInitializeCustomROM(); MemInitializeCustomROM();

View File

@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Interface.h" #include "Interface.h"
#include "Log.h" #include "Log.h"
#include "Memory.h" #include "Memory.h"
#include "Registry.h"
#include "YamlHelper.h" #include "YamlHelper.h"
#include "../resource/resource.h" #include "../resource/resource.h"
@ -71,7 +72,6 @@ CSuperSerialCard::CSuperSerialCard(UINT slot) :
m_bCfgSupportDCD(false), m_bCfgSupportDCD(false),
m_pExpansionRom(NULL) m_pExpansionRom(NULL)
{ {
m_ayCurrentSerialPortName.clear();
m_dwSerialPortItem = 0; m_dwSerialPortItem = 0;
m_hCommHandle = INVALID_HANDLE_VALUE; m_hCommHandle = INVALID_HANDLE_VALUE;
@ -86,6 +86,14 @@ CSuperSerialCard::CSuperSerialCard(UINT slot) :
memset(&m_o, 0, sizeof(m_o)); memset(&m_o, 0, sizeof(m_o));
InternalReset(); InternalReset();
//
char serialPortName[CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM];
std::string& regSection = RegGetConfigSlotSection(m_uSlot);
RegLoadString(regSection.c_str(), REGVALUE_SERIAL_PORT_NAME, TRUE, serialPortName, sizeof(serialPortName), TEXT(""));
SetSerialPortName(serialPortName);
} }
void CSuperSerialCard::InternalReset() void CSuperSerialCard::InternalReset()
@ -983,7 +991,7 @@ void CSuperSerialCard::CommDestroy()
//=========================================================================== //===========================================================================
// dwNewSerialPortItem is the drop-down list item // dwNewSerialPortItem is the drop-down list item
void CSuperSerialCard::CommSetSerialPort(HWND hWindow, DWORD dwNewSerialPortItem) void CSuperSerialCard::CommSetSerialPort(DWORD dwNewSerialPortItem)
{ {
if (m_dwSerialPortItem == dwNewSerialPortItem) if (m_dwSerialPortItem == dwNewSerialPortItem)
return; return;
@ -995,14 +1003,21 @@ void CSuperSerialCard::CommSetSerialPort(HWND hWindow, DWORD dwNewSerialPortItem
m_dwSerialPortItem = dwNewSerialPortItem; m_dwSerialPortItem = dwNewSerialPortItem;
if (m_dwSerialPortItem == m_uTCPChoiceItemIdx) if (m_dwSerialPortItem == m_uTCPChoiceItemIdx)
m_ayCurrentSerialPortName = TEXT_SERIAL_TCP; {
else if (m_dwSerialPortItem != 0) { m_currentSerialPortName = TEXT_SERIAL_TCP;
}
else if (m_dwSerialPortItem != 0)
{
TCHAR temp[SIZEOF_SERIALCHOICE_ITEM]; TCHAR temp[SIZEOF_SERIALCHOICE_ITEM];
sprintf(temp, TEXT_SERIAL_COM"%d", m_vecSerialPortsItems[m_dwSerialPortItem]); sprintf(temp, TEXT_SERIAL_COM"%d", m_vecSerialPortsItems[m_dwSerialPortItem]);
m_ayCurrentSerialPortName = temp; m_currentSerialPortName = temp;
} }
else else
m_ayCurrentSerialPortName.clear(); // "None" {
m_currentSerialPortName.clear(); // "None"
}
SetRegistrySerialPortName();
} }
//=========================================================================== //===========================================================================
@ -1337,10 +1352,10 @@ char* CSuperSerialCard::GetSerialPortChoices()
return m_aySerialPortChoices; return m_aySerialPortChoices;
} }
// Called by LoadConfiguration() // Called by ctor & LoadSnapshot()
void CSuperSerialCard::SetSerialPortName(const char* pSerialPortName) void CSuperSerialCard::SetSerialPortName(const char* pSerialPortName)
{ {
m_ayCurrentSerialPortName = pSerialPortName; m_currentSerialPortName = pSerialPortName;
// Init m_aySerialPortChoices, so that we have choices to show if serial is active when we 1st open Config dialog // Init m_aySerialPortChoices, so that we have choices to show if serial is active when we 1st open Config dialog
GetSerialPortChoices(); GetSerialPortChoices();
@ -1372,11 +1387,17 @@ void CSuperSerialCard::SetSerialPortName(const char* pSerialPortName)
} }
else else
{ {
m_ayCurrentSerialPortName.clear(); // "None" m_currentSerialPortName.clear(); // "None"
m_dwSerialPortItem = 0; m_dwSerialPortItem = 0;
} }
} }
void CSuperSerialCard::SetRegistrySerialPortName(void)
{
std::string& regSection = RegGetConfigSlotSection(m_uSlot);
RegSaveString(regSection.c_str(), REGVALUE_SERIAL_PORT_NAME, TRUE, GetSerialPortName());
}
//=========================================================================== //===========================================================================
// Unit version history: // Unit version history:
@ -1498,6 +1519,7 @@ bool CSuperSerialCard::LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT slot, U
std::string serialPortName = yamlLoadHelper.LoadString(SS_YAML_KEY_SERIALPORTNAME); std::string serialPortName = yamlLoadHelper.LoadString(SS_YAML_KEY_SERIALPORTNAME);
SetSerialPortName(serialPortName.c_str()); SetSerialPortName(serialPortName.c_str());
SetRegistrySerialPortName();
return true; return true;
} }

View File

@ -34,15 +34,14 @@ public:
void CommInitialize(LPBYTE pCxRomPeripheral, UINT uSlot); void CommInitialize(LPBYTE pCxRomPeripheral, UINT uSlot);
void CommReset(); void CommReset();
void CommDestroy(); void CommDestroy();
void CommSetSerialPort(HWND hWindow, DWORD dwNewSerialPortItem); void CommSetSerialPort(DWORD dwNewSerialPortItem);
static std::string GetSnapshotCardName(void); static std::string GetSnapshotCardName(void);
void SaveSnapshot(class YamlSaveHelper& yamlSaveHelper); void SaveSnapshot(class YamlSaveHelper& yamlSaveHelper);
bool LoadSnapshot(class YamlLoadHelper& yamlLoadHelper, UINT slot, UINT version); bool LoadSnapshot(class YamlLoadHelper& yamlLoadHelper, UINT slot, UINT version);
char* GetSerialPortChoices(); char* GetSerialPortChoices();
DWORD GetSerialPort() { return m_dwSerialPortItem; } // Drop-down list item DWORD GetSerialPort() { return m_dwSerialPortItem; } // Drop-down list item
const std::string & GetSerialPortName() { return m_ayCurrentSerialPortName; } const std::string& GetSerialPortName() { return m_currentSerialPortName; }
void SetSerialPortName(const char* pSerialPortName);
bool IsActive() { return (m_hCommHandle != INVALID_HANDLE_VALUE) || (m_hCommListenSocket != INVALID_SOCKET); } bool IsActive() { return (m_hCommHandle != INVALID_HANDLE_VALUE) || (m_hCommListenSocket != INVALID_SOCKET); }
void SupportDCD(bool bEnable) { m_bCfgSupportDCD = bEnable; } // Status void SupportDCD(bool bEnable) { m_bCfgSupportDCD = bEnable; } // Status
@ -80,6 +79,8 @@ private:
void CommThUninit(); void CommThUninit();
UINT GetNumSerialPortChoices() { return m_vecSerialPortsItems.size(); } UINT GetNumSerialPortChoices() { return m_vecSerialPortsItems.size(); }
void ScanCOMPorts(); void ScanCOMPorts();
void SetSerialPortName(const char* pSerialPortName);
void SetRegistrySerialPortName(void);
void SaveSnapshotDIPSW(class YamlSaveHelper& yamlSaveHelper, std::string key, SSC_DIPSW& dipsw); void SaveSnapshotDIPSW(class YamlSaveHelper& yamlSaveHelper, std::string key, SSC_DIPSW& dipsw);
void LoadSnapshotDIPSW(class YamlLoadHelper& yamlLoadHelper, std::string key, SSC_DIPSW& dipsw); void LoadSnapshotDIPSW(class YamlLoadHelper& yamlLoadHelper, std::string key, SSC_DIPSW& dipsw);
@ -89,7 +90,7 @@ public:
static const UINT SIZEOF_SERIALCHOICE_ITEM = 12*sizeof(char); static const UINT SIZEOF_SERIALCHOICE_ITEM = 12*sizeof(char);
private: private:
std::string m_ayCurrentSerialPortName; std::string m_currentSerialPortName;
DWORD m_dwSerialPortItem; DWORD m_dwSerialPortItem;
static const UINT SERIALPORTITEM_INVALID_COM_PORT = 0; static const UINT SERIALPORTITEM_INVALID_COM_PORT = 0;

View File

@ -181,18 +181,6 @@ void LoadConfiguration(void)
break; break;
} }
TCHAR serialPortName[CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM];
if (RegLoadString(
TEXT(REG_CONFIG),
TEXT(REGVALUE_SERIAL_PORT_NAME),
TRUE,
serialPortName,
CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM))
{
if (GetCardMgr().IsSSCInstalled())
GetCardMgr().GetSSC()->SetSerialPortName(serialPortName);
}
REGLOAD_DEFAULT(TEXT(REGVALUE_EMULATION_SPEED), &g_dwSpeed, SPEED_NORMAL); REGLOAD_DEFAULT(TEXT(REGVALUE_EMULATION_SPEED), &g_dwSpeed, SPEED_NORMAL);
GetVideo().Config_Load_Video(); GetVideo().Config_Load_Video();
SetCurrentCLK6502(); // Pre: g_dwSpeed && Config_Load_Video()->SetVideoRefreshRate() SetCurrentCLK6502(); // Pre: g_dwSpeed && Config_Load_Video()->SetVideoRefreshRate()
@ -264,7 +252,7 @@ void LoadConfiguration(void)
if (RegLoadValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, &dwTmp)) if (RegLoadValue(regSection.c_str(), REGVALUE_CARD_TYPE, TRUE, &dwTmp))
{ {
GetCardMgr().Insert(slot, (SS_CARDTYPE)dwTmp); GetCardMgr().Insert(slot, (SS_CARDTYPE)dwTmp, false);
if (slot == SLOT3) if (slot == SLOT3)
{ {
@ -281,6 +269,11 @@ void LoadConfiguration(void)
tfe_enabled = 0; tfe_enabled = 0;
} }
} }
else if (slot == SLOT7)
{
if ((SS_CARDTYPE)dwTmp == CT_GenericHDD) // TODO: move this to when HarddiskInterfaceCard object is instantiated
HD_SetEnabled(true, false);
}
} }
else // legacy (AppleWin 1.30.3 or earlier) else // legacy (AppleWin 1.30.3 or earlier)
{ {
@ -459,16 +452,7 @@ void InsertHardDisks(LPCSTR szImageName_harddisk[NUM_HARDDISKS], bool& bBoot)
if (!szImageName_harddisk[HARDDISK_1] && !szImageName_harddisk[HARDDISK_2]) if (!szImageName_harddisk[HARDDISK_1] && !szImageName_harddisk[HARDDISK_2])
return; return;
// Enable the Harddisk controller card HD_SetEnabled(true); // Enable the Harddisk controller card
HD_SetEnabled(true);
DWORD dwTmp;
BOOL res = REGLOAD(TEXT(REGVALUE_HDD_ENABLED), &dwTmp);
if (!res || !dwTmp)
REGSAVE(TEXT(REGVALUE_HDD_ENABLED), 1); // Config: HDD Enabled
//
bool bRes = true; bool bRes = true;
@ -493,11 +477,6 @@ void InsertHardDisks(LPCSTR szImageName_harddisk[NUM_HARDDISKS], bool& bBoot)
void UnplugHardDiskControllerCard(void) void UnplugHardDiskControllerCard(void)
{ {
HD_SetEnabled(false); HD_SetEnabled(false);
DWORD dwTmp;
BOOL res = REGLOAD(TEXT(REGVALUE_HDD_ENABLED), &dwTmp);
if (!res || dwTmp)
REGSAVE(TEXT(REGVALUE_HDD_ENABLED), 0); // Config: HDD Disabled
} }
void GetAppleWindowTitle() void GetAppleWindowTitle()

View File

@ -745,7 +745,7 @@ static void RepeatInitialization(void)
VideoSwitchVideocardPalette(RGB_GetVideocard(), GetVideo().GetVideoType()); VideoSwitchVideocardPalette(RGB_GetVideocard(), GetVideo().GetVideoType());
// Allow the 4 hardcoded slots to be configurated as empty // Allow the 4 hardcoded slots to be configurated as empty
// NB. this state is not persisted to the Registry/conf.ini (just as '-s7 empty' isn't) // NB. this state *is* persisted to the Registry/conf.ini (just like '-s7 empty' is)
// TODO: support bSlotEmpty[] for slots: 0,4,5 // TODO: support bSlotEmpty[] for slots: 0,4,5
if (g_cmdLine.bSlotEmpty[SLOT1]) if (g_cmdLine.bSlotEmpty[SLOT1])
GetCardMgr().Remove(SLOT1); GetCardMgr().Remove(SLOT1);
@ -772,7 +772,7 @@ static void RepeatInitialization(void)
{ {
bool temp = false; bool temp = false;
InsertFloppyDisks(SLOT5, g_cmdLine.szImageName_drive[SLOT5], g_cmdLine.driveConnected[SLOT5], temp); InsertFloppyDisks(SLOT5, g_cmdLine.szImageName_drive[SLOT5], g_cmdLine.driveConnected[SLOT5], temp);
//g_cmdLine.szImageName_drive[SLOT5][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT5][DRIVE_2] = NULL; // *Do* insert on a restart (since no way they could have changed) g_cmdLine.szImageName_drive[SLOT5][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT5][DRIVE_2] = NULL; // Don't insert on a restart
InsertFloppyDisks(SLOT6, g_cmdLine.szImageName_drive[SLOT6], g_cmdLine.driveConnected[SLOT6], g_cmdLine.bBoot); InsertFloppyDisks(SLOT6, g_cmdLine.szImageName_drive[SLOT6], g_cmdLine.driveConnected[SLOT6], g_cmdLine.bBoot);
g_cmdLine.szImageName_drive[SLOT6][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT6][DRIVE_2] = NULL; // Don't insert on a restart g_cmdLine.szImageName_drive[SLOT6][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT6][DRIVE_2] = NULL; // Don't insert on a restart
@ -782,7 +782,7 @@ static void RepeatInitialization(void)
if (g_cmdLine.bSlotEmpty[SLOT7]) if (g_cmdLine.bSlotEmpty[SLOT7])
{ {
HD_SetEnabled(false); // Disable HDD controller, but don't persist this to Registry/conf.ini (consistent with other '-sn empty' cmds) HD_SetEnabled(false); // Disable HDD controller, and persist this to Registry/conf.ini (consistent with other '-sn empty' cmds)
Snapshot_UpdatePath(); // If save-state's filename is a harddisk, and the floppy is in the same path, then the filename won't be updated Snapshot_UpdatePath(); // If save-state's filename is a harddisk, and the floppy is in the same path, then the filename won't be updated
} }
} }