Save-state:

. add ConfirmReboot
. Restore saved configuration
. Moved some config to Joystick & SerialCard
. save config
This commit is contained in:
tomcw 2015-08-21 21:45:21 +01:00
parent 18cd2afdd0
commit 2f4ee9466f
9 changed files with 192 additions and 45 deletions

View File

@ -56,6 +56,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Configuration\PropertySheet.h" #include "Configuration\PropertySheet.h"
#include "Tfe\Tfe.h" #include "Tfe\Tfe.h"
static UINT16 g_AppleWinVersion[4] = {0};
char VERSIONSTRING[16] = "xx.yy.zz.ww"; char VERSIONSTRING[16] = "xx.yy.zz.ww";
TCHAR *g_pAppTitle = TITLE_APPLE_2E_ENHANCED; TCHAR *g_pAppTitle = TITLE_APPLE_2E_ENHANCED;
@ -110,6 +111,11 @@ CSpeech g_Speech;
//=========================================================================== //===========================================================================
const UINT16* GetAppleWinVersion(void)
{
return &g_AppleWinVersion[0];
}
bool GetLoadedSaveStateFlag(void) bool GetLoadedSaveStateFlag(void)
{ {
return g_bLoadedSaveState; return g_bLoadedSaveState;
@ -366,7 +372,7 @@ static void LoadConfigOldJoystick(const UINT uJoyNum)
break; break;
} }
joytype[uJoyNum] = uNewJoyType; JoySetJoyType(uJoyNum, uNewJoyType);
} }
//Reads configuration from the registry entries //Reads configuration from the registry entries
@ -407,9 +413,15 @@ void LoadConfiguration(void)
// //
if (!REGLOAD(TEXT(REGVALUE_JOYSTICK0_EMU_TYPE), &joytype[JN_JOYSTICK0])) DWORD dwJoyType;
if (REGLOAD(TEXT(REGVALUE_JOYSTICK0_EMU_TYPE), &dwJoyType))
JoySetJoyType(JN_JOYSTICK0, dwJoyType);
else
LoadConfigOldJoystick(JN_JOYSTICK0); LoadConfigOldJoystick(JN_JOYSTICK0);
if (!REGLOAD(TEXT(REGVALUE_JOYSTICK1_EMU_TYPE), &joytype[JN_JOYSTICK1]))
if (REGLOAD(TEXT(REGVALUE_JOYSTICK1_EMU_TYPE), &dwJoyType))
JoySetJoyType(JN_JOYSTICK1, dwJoyType);
else
LoadConfigOldJoystick(JN_JOYSTICK1); LoadConfigOldJoystick(JN_JOYSTICK1);
REGLOAD(TEXT("Sound Emulation") ,&soundtype); REGLOAD(TEXT("Sound Emulation") ,&soundtype);
@ -898,11 +910,11 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
// Construct version string from fixed file info block // Construct version string from fixed file info block
unsigned long major = pFixedFileInfo->dwFileVersionMS >> 16; unsigned long major = g_AppleWinVersion[0] = pFixedFileInfo->dwFileVersionMS >> 16;
unsigned long minor = pFixedFileInfo->dwFileVersionMS & 0xffff; unsigned long minor = g_AppleWinVersion[1] = pFixedFileInfo->dwFileVersionMS & 0xffff;
unsigned long fix = pFixedFileInfo->dwFileVersionLS >> 16; unsigned long fix = g_AppleWinVersion[2] = pFixedFileInfo->dwFileVersionLS >> 16;
unsigned long fix_minor = pFixedFileInfo->dwFileVersionLS & 0xffff; unsigned long fix_minor = g_AppleWinVersion[3] = pFixedFileInfo->dwFileVersionLS & 0xffff;
sprintf(VERSIONSTRING, "%d.%d.%d.%d", major, minor, fix, fix_minor); // potential buffer overflow sprintf(VERSIONSTRING, "%d.%d.%d.%d", major, minor, fix, fix_minor); // potential buffer overflow
} }
} }

View File

@ -6,7 +6,7 @@
void SetCurrentCLK6502(); void SetCurrentCLK6502();
void SetCurrentImageDir(const char* pszImageDir); void SetCurrentImageDir(const char* pszImageDir);
extern const UINT16* GetAppleWinVersion(void);
extern char VERSIONSTRING[]; // Constructed in WinMain() extern char VERSIONSTRING[]; // Constructed in WinMain()
extern TCHAR *g_pAppTitle; extern TCHAR *g_pAppTitle;

View File

@ -214,12 +214,12 @@ void CPageInput::DlgOK(HWND hWnd)
if (JoySetEmulationType(hWnd, m_nJoy0ChoiceTranlationTbl[uNewJoyType0], JN_JOYSTICK0, bIsSlot4Mouse)) if (JoySetEmulationType(hWnd, m_nJoy0ChoiceTranlationTbl[uNewJoyType0], JN_JOYSTICK0, bIsSlot4Mouse))
{ {
REGSAVE(TEXT(REGVALUE_JOYSTICK0_EMU_TYPE), joytype[0]); REGSAVE(TEXT(REGVALUE_JOYSTICK0_EMU_TYPE), JoyGetJoyType(0));
} }
if (JoySetEmulationType(hWnd, m_nJoy1ChoiceTranlationTbl[uNewJoyType1], JN_JOYSTICK1, bIsSlot4Mouse)) if (JoySetEmulationType(hWnd, m_nJoy1ChoiceTranlationTbl[uNewJoyType1], JN_JOYSTICK1, bIsSlot4Mouse))
{ {
REGSAVE(TEXT(REGVALUE_JOYSTICK1_EMU_TYPE), joytype[1]); REGSAVE(TEXT(REGVALUE_JOYSTICK1_EMU_TYPE), JoyGetJoyType(1));
} }
JoySetTrim((short)SendDlgItemMessage(hWnd, IDC_SPIN_XTRIM, UDM_GETPOS, 0, 0), true); JoySetTrim((short)SendDlgItemMessage(hWnd, IDC_SPIN_XTRIM, UDM_GETPOS, 0, 0), true);
@ -305,7 +305,7 @@ void CPageInput::InitJoystickChoices(HWND hWnd, int nJoyNum, int nIdcValue)
for(UINT i=nJC_KEYBD_CURSORS; i<nJC_MAX; i++) for(UINT i=nJC_KEYBD_CURSORS; i<nJC_MAX; i++)
{ {
if( ( (i == nJC_KEYBD_CURSORS) || (i == nJC_KEYBD_NUMPAD) ) && if( ( (i == nJC_KEYBD_CURSORS) || (i == nJC_KEYBD_NUMPAD) ) &&
( (joytype[nOtherJoyNum] == nJC_KEYBD_CURSORS) || (joytype[nOtherJoyNum] == nJC_KEYBD_NUMPAD) ) ( (JoyGetJoyType(nOtherJoyNum) == nJC_KEYBD_CURSORS) || (JoyGetJoyType(nOtherJoyNum) == nJC_KEYBD_NUMPAD) )
) )
{ {
continue; continue;
@ -314,7 +314,7 @@ void CPageInput::InitJoystickChoices(HWND hWnd, int nJoyNum, int nIdcValue)
if (i == nJC_MOUSE && bIsSlot4Mouse) if (i == nJC_MOUSE && bIsSlot4Mouse)
continue; continue;
if(joytype[nOtherJoyNum] != i) if (JoyGetJoyType(nOtherJoyNum) != i)
{ {
memcpy(pszMem, ppszJoyChoices[i], strlen(ppszJoyChoices[i])+1); memcpy(pszMem, ppszJoyChoices[i], strlen(ppszJoyChoices[i])+1);
pszMem += strlen(ppszJoyChoices[i])+1; pszMem += strlen(ppszJoyChoices[i])+1;
@ -324,7 +324,7 @@ void CPageInput::InitJoystickChoices(HWND hWnd, int nJoyNum, int nIdcValue)
*pszMem = 0x00; // Doubly null terminated *pszMem = 0x00; // Doubly null terminated
m_PropertySheetHelper.FillComboBox(hWnd, nIdcValue, pnzJoystickChoices, joytype[nJoyNum]); m_PropertySheetHelper.FillComboBox(hWnd, nIdcValue, pnzJoystickChoices, JoyGetJoyType(nJoyNum));
} }
void CPageInput::InitSlotOptions(HWND hWnd) void CPageInput::InitSlotOptions(HWND hWnd)

View File

@ -91,7 +91,7 @@ static int joysubx[2] = {0,0};
static int joysuby[2] = {0,0}; static int joysuby[2] = {0,0};
// Value persisted to Registry for REGVALUE_JOYSTICK0_EMU_TYPE // Value persisted to Registry for REGVALUE_JOYSTICK0_EMU_TYPE
DWORD joytype[2] = {J0C_JOYSTICK1, J1C_DISABLED}; // Emulation Type for joysticks #0 & #1 static DWORD joytype[2] = {J0C_JOYSTICK1, J1C_DISABLED}; // Emulation Type for joysticks #0 & #1
static BOOL setbutton[3] = {0,0,0}; // Used when a mouse button is pressed/released static BOOL setbutton[3] = {0,0,0}; // Used when a mouse button is pressed/released
@ -753,6 +753,30 @@ void JoyDisableUsingMouse()
//=========================================================================== //===========================================================================
void JoySetJoyType(UINT num, DWORD type)
{
_ASSERT(num <= JN_JOYSTICK1);
if (num > JN_JOYSTICK1)
return;
joytype[num] = type;
// Refresh centre positions whenever 'joytype' changes
JoySetTrim(JoyGetTrim(true) , true);
JoySetTrim(JoyGetTrim(false), false);
}
DWORD JoyGetJoyType(UINT num)
{
_ASSERT(num <= JN_JOYSTICK1);
if (num > JN_JOYSTICK1)
return J0C_DISABLED;
return joytype[num];
}
//===========================================================================
void JoySetTrim(short nValue, bool bAxisX) void JoySetTrim(short nValue, bool bAxisX)
{ {
if(bAxisX) if(bAxisX)
@ -831,12 +855,18 @@ void JoySetSnapshot_v1(const unsigned __int64 JoyCntrResetCycle)
// //
void JoyGetSnapshot(unsigned __int64& rJoyCntrResetCycle) void JoyGetSnapshot(unsigned __int64& rJoyCntrResetCycle, short* pJoystick0Trim, short* pJoystick1Trim)
{ {
rJoyCntrResetCycle = g_nJoyCntrResetCycle; rJoyCntrResetCycle = g_nJoyCntrResetCycle;
pJoystick0Trim[0] = JoyGetTrim(true);
pJoystick0Trim[1] = JoyGetTrim(false);
pJoystick1Trim[0] = 0; // TBD: not implemented yet
pJoystick1Trim[1] = 0; // TBD: not implemented yet
} }
void JoySetSnapshot(const unsigned __int64 JoyCntrResetCycle) void JoySetSnapshot(const unsigned __int64 JoyCntrResetCycle, const short* pJoystick0Trim, const short* pJoystick1Trim)
{ {
g_nJoyCntrResetCycle = JoyCntrResetCycle; g_nJoyCntrResetCycle = JoyCntrResetCycle;
JoySetTrim(pJoystick0Trim[0], true);
JoySetTrim(pJoystick0Trim[1], false);
} }

View File

@ -5,8 +5,6 @@ enum JOYNUM {JN_JOYSTICK0=0, JN_JOYSTICK1};
enum JOY0CHOICE {J0C_DISABLED=0, J0C_JOYSTICK1, J0C_KEYBD_CURSORS, J0C_KEYBD_NUMPAD, J0C_MOUSE, J0C_MAX}; enum JOY0CHOICE {J0C_DISABLED=0, J0C_JOYSTICK1, J0C_KEYBD_CURSORS, J0C_KEYBD_NUMPAD, J0C_MOUSE, J0C_MAX};
enum JOY1CHOICE {J1C_DISABLED=0, J1C_JOYSTICK2, J1C_KEYBD_CURSORS, J1C_KEYBD_NUMPAD, J1C_MOUSE, J1C_MAX}; enum JOY1CHOICE {J1C_DISABLED=0, J1C_JOYSTICK2, J1C_KEYBD_CURSORS, J1C_KEYBD_NUMPAD, J1C_MOUSE, J1C_MAX};
extern DWORD joytype[2];
enum {JOYSTICK_MODE_FLOATING=0, JOYSTICK_MODE_CENTERING}; // Joystick centering control enum {JOYSTICK_MODE_FLOATING=0, JOYSTICK_MODE_CENTERING}; // Joystick centering control
void JoyInitialize(); void JoyInitialize();
@ -21,12 +19,14 @@ BOOL JoyUsingKeyboard();
BOOL JoyUsingKeyboardCursors(); BOOL JoyUsingKeyboardCursors();
BOOL JoyUsingKeyboardNumpad(); BOOL JoyUsingKeyboardNumpad();
void JoyDisableUsingMouse(); void JoyDisableUsingMouse();
void JoySetJoyType(UINT num, DWORD type);
DWORD JoyGetJoyType(UINT num);
void JoySetTrim(short nValue, bool bAxisX); void JoySetTrim(short nValue, bool bAxisX);
short JoyGetTrim(bool bAxisX); short JoyGetTrim(bool bAxisX);
void JoyportControl(const UINT uControl); void JoyportControl(const UINT uControl);
void JoySetSnapshot_v1(const unsigned __int64 JoyCntrResetCycle); void JoySetSnapshot_v1(const unsigned __int64 JoyCntrResetCycle);
void JoyGetSnapshot(unsigned __int64& rJoyCntrResetCycle); void JoyGetSnapshot(unsigned __int64& rJoyCntrResetCycle, short* pJoystick0Trim, short* pJoystick1Trim);
void JoySetSnapshot(const unsigned __int64 JoyCntrResetCycle); void JoySetSnapshot(const unsigned __int64 JoyCntrResetCycle, const short* pJoystick0Trim, const short* pJoystick1Trim);
BYTE __stdcall JoyReadButton(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); BYTE __stdcall JoyReadButton(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE __stdcall JoyReadPosition(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); BYTE __stdcall JoyReadPosition(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

View File

@ -291,7 +291,7 @@ static void LoadUnitApple2(DWORD Length, DWORD Version)
m_ConfigNew.m_Apple2Type = g_Apple2Type; m_ConfigNew.m_Apple2Type = g_Apple2Type;
CpuSetSnapshot(Apple2Unit.CPU6502); CpuSetSnapshot(Apple2Unit.CPU6502);
JoySetSnapshot(Apple2Unit.Joystick.JoyCntrResetCycle); JoySetSnapshot(Apple2Unit.Joystick.JoyCntrResetCycle, &Apple2Unit.Joystick.Joystick0Trim[0], &Apple2Unit.Joystick.Joystick1Trim[0]);
KeybSetSnapshot(Apple2Unit.Keyboard.LastKey); KeybSetSnapshot(Apple2Unit.Keyboard.LastKey);
SpkrSetSnapshot(Apple2Unit.Speaker.SpkrLastCycle); SpkrSetSnapshot(Apple2Unit.Speaker.SpkrLastCycle);
VideoSetSnapshot(Apple2Unit.Video); VideoSetSnapshot(Apple2Unit.Video);
@ -428,23 +428,22 @@ static void LoadUnitCard(DWORD Length, DWORD Version)
} }
} }
#if 0
static void LoadUnitConfig(DWORD Length, DWORD Version) static void LoadUnitConfig(DWORD Length, DWORD Version)
{ {
SS_APPLEWIN_CONFIG Cfg; SS_APPLEWIN_CONFIG Config;
if (Version != UNIT_CONFIG_VER) if (Version != UNIT_CONFIG_VER)
throw std::string("Config: Version mismatch"); throw std::string("Config: Version mismatch");
if (Length != sizeof(Cfg)) if (Length != sizeof(Config))
throw std::string("Config: Length mismatch"); throw std::string("Config: Length mismatch");
if (SetFilePointer(m_hFile, -(LONG)sizeof(Cfg.UnitHdr), NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER) if (SetFilePointer(m_hFile, -(LONG)sizeof(Config.UnitHdr), NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER)
throw std::string("Config: file corrupt"); throw std::string("Config: file corrupt");
DWORD dwBytesRead; DWORD dwBytesRead;
BOOL bRes = ReadFile( m_hFile, BOOL bRes = ReadFile( m_hFile,
&Cfg, &Config,
Length, Length,
&dwBytesRead, &dwBytesRead,
NULL); NULL);
@ -452,10 +451,38 @@ static void LoadUnitConfig(DWORD Length, DWORD Version)
if (dwBytesRead != Length) if (dwBytesRead != Length)
throw std::string("Config: file corrupt"); throw std::string("Config: file corrupt");
// todo: // Restore all config state
//m_ConfigNew.m_bEnhanceDisk;
//Config.Cfg.AppleWinVersion // Nothing to do
g_eVideoType = Config.Cfg.VideoMode;
g_uHalfScanLines = Config.Cfg.IsHalfScanLines;
g_bConfirmReboot = Config.Cfg.IsConfirmReboot;
monochrome = Config.Cfg.MonochromeColor;
SetViewportScale(Config.Cfg.WindowScale);
g_dwSpeed = Config.Cfg.CpuSpeed;
SetCurrentCLK6502();
JoySetJoyType(JN_JOYSTICK0, Config.Cfg.JoystickType[0]);
JoySetJoyType(JN_JOYSTICK1, Config.Cfg.JoystickType[1]);
sg_PropertySheet.SetJoystickCursorControl(Config.Cfg.IsAllowCursorsToBeRead);
sg_PropertySheet.SetAutofire(Config.Cfg.IsAutofire);
sg_PropertySheet.SetJoystickCenteringControl(Config.Cfg.IsKeyboardAutocentering);
//Config.Cfg.IsSwapButton0and1; // TBD: not implemented yet
sg_PropertySheet.SetScrollLockToggle(Config.Cfg.IsScrollLockToggle);
sg_PropertySheet.SetMouseShowCrosshair(Config.Cfg.IsMouseShowCrosshair);
sg_PropertySheet.SetMouseRestrictToWindow(Config.Cfg.IsMouseRestrictToWindow);
soundtype = Config.Cfg.SoundType;
SpkrSetVolume(Config.Cfg.SpeakerVolume, sg_PropertySheet.GetVolumeMax());
MB_SetVolume(Config.Cfg.MockingboardVolume, sg_PropertySheet.GetVolumeMax());
enhancedisk = Config.Cfg.IsEnhancedDiskSpeed;
g_bSaveStateOnExit = Config.Cfg.IsSaveStateOnExit ? true : false;
g_bPrinterAppend = Config.Cfg.IsAppendToFile ? true : false;
sg_PropertySheet.SetTheFreezesF8Rom(Config.Cfg.IsUsingFreezesF8Rom);
} }
#endif
static void Snapshot_LoadState_v2(DWORD dwVersion) static void Snapshot_LoadState_v2(DWORD dwVersion)
{ {
@ -467,6 +494,7 @@ static void Snapshot_LoadState_v2(DWORD dwVersion)
CConfigNeedingRestart ConfigOld; CConfigNeedingRestart ConfigOld;
ConfigOld.m_Slot[1] = CT_GenericPrinter; // fixme ConfigOld.m_Slot[1] = CT_GenericPrinter; // fixme
ConfigOld.m_Slot[2] = CT_SSC; // 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[6] = CT_Disk2; // fixme
ConfigOld.m_Slot[7] = ConfigOld.m_bEnableHDD ? CT_GenericHDD : CT_Empty; // fixme ConfigOld.m_Slot[7] = ConfigOld.m_bEnableHDD ? CT_GenericHDD : CT_Empty; // fixme
//ConfigOld.m_SlotAux = ?; // fixme //ConfigOld.m_SlotAux = ?; // fixme
@ -515,11 +543,9 @@ static void Snapshot_LoadState_v2(DWORD dwVersion)
case UT_Card: case UT_Card:
LoadUnitCard(UnitHdr.hdr.v2.Length, UnitHdr.hdr.v2.Version); LoadUnitCard(UnitHdr.hdr.v2.Length, UnitHdr.hdr.v2.Version);
break; break;
#if 0
case UT_Config: case UT_Config:
LoadUnitConfig(UnitHdr.hdr.v2.Length, UnitHdr.hdr.v2.Version); LoadUnitConfig(UnitHdr.hdr.v2.Length, UnitHdr.hdr.v2.Version);
break; break;
#endif
default: default:
// Log then skip unsupported unit type // Log then skip unsupported unit type
break; break;
@ -577,22 +603,84 @@ void Snapshot_LoadState()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// todo:
// . "Uthernet Active"
static void SaveUnitConfig()
{
SS_APPLEWIN_CONFIG Config;
memset(&Config, 0, sizeof(Config));
Config.UnitHdr.hdr.v2.Length = sizeof(Config);
Config.UnitHdr.hdr.v2.Type = UT_Config;
Config.UnitHdr.hdr.v2.Version = UNIT_CONFIG_VER;
//
memcpy(Config.Cfg.AppleWinVersion, GetAppleWinVersion(), sizeof(Config.Cfg.AppleWinVersion));
Config.Cfg.VideoMode = g_eVideoType;
Config.Cfg.IsHalfScanLines = g_uHalfScanLines;
Config.Cfg.IsConfirmReboot = g_bConfirmReboot;
Config.Cfg.MonochromeColor = monochrome;
Config.Cfg.WindowScale = GetViewportScale();
Config.Cfg.CpuSpeed = g_dwSpeed;
Config.Cfg.JoystickType[0] = JoyGetJoyType(JN_JOYSTICK0);
Config.Cfg.JoystickType[1] = JoyGetJoyType(JN_JOYSTICK1);
Config.Cfg.IsAllowCursorsToBeRead = sg_PropertySheet.GetJoystickCursorControl();
Config.Cfg.IsAutofire = (sg_PropertySheet.GetAutofire(1)<<1) | sg_PropertySheet.GetAutofire(0);
Config.Cfg.IsKeyboardAutocentering = sg_PropertySheet.GetJoystickCenteringControl();
Config.Cfg.IsSwapButton0and1 = 0; // TBD: not implemented yet
Config.Cfg.IsScrollLockToggle = sg_PropertySheet.GetScrollLockToggle();
Config.Cfg.IsMouseShowCrosshair = sg_PropertySheet.GetMouseShowCrosshair();
Config.Cfg.IsMouseRestrictToWindow = sg_PropertySheet.GetMouseRestrictToWindow();
Config.Cfg.SoundType = soundtype;
Config.Cfg.SpeakerVolume = SpkrGetVolume();
Config.Cfg.MockingboardVolume = MB_GetVolume();
Config.Cfg.IsEnhancedDiskSpeed = enhancedisk;
Config.Cfg.IsSaveStateOnExit = g_bSaveStateOnExit;
Config.Cfg.IsAppendToFile = g_bPrinterAppend;
Config.Cfg.IsUsingFreezesF8Rom = sg_PropertySheet.GetTheFreezesF8Rom();
//
DWORD dwBytesWritten;
BOOL bRes = WriteFile( m_hFile,
&Config,
Config.UnitHdr.hdr.v2.Length,
&dwBytesWritten,
NULL);
if(!bRes || (dwBytesWritten != Config.UnitHdr.hdr.v2.Length))
{
//dwError = GetLastError();
throw std::string("Save error: Config");
}
}
// todo:
// . Uthernet card
void Snapshot_SaveState() void Snapshot_SaveState()
{ {
try try
{ {
m_hFile = CreateFile( g_strSaveStatePathname.c_str(), m_hFile = CreateFile( g_strSaveStatePathname.c_str(),
GENERIC_WRITE, GENERIC_WRITE,
0, 0,
NULL, NULL,
CREATE_ALWAYS, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL,
NULL); NULL);
DWORD dwError = GetLastError(); DWORD dwError = GetLastError();
_ASSERT((dwError == 0) || (dwError == ERROR_ALREADY_EXISTS)); _ASSERT((dwError == 0) || (dwError == ERROR_ALREADY_EXISTS));
// todo: handle ERROR_ALREADY_EXISTS - ask if user wants to replace existing file // todo: handle ERROR_ALREADY_EXISTS - ask if user wants to replace existing file
// - at this point any old file will have been truncated to zero
if(m_hFile == INVALID_HANDLE_VALUE) if(m_hFile == INVALID_HANDLE_VALUE)
{ {
@ -621,7 +709,7 @@ void Snapshot_SaveState()
Apple2Unit.Apple2Type = g_Apple2Type; Apple2Unit.Apple2Type = g_Apple2Type;
CpuGetSnapshot(Apple2Unit.CPU6502); CpuGetSnapshot(Apple2Unit.CPU6502);
JoyGetSnapshot(Apple2Unit.Joystick.JoyCntrResetCycle); JoyGetSnapshot(Apple2Unit.Joystick.JoyCntrResetCycle, &Apple2Unit.Joystick.Joystick0Trim[0], &Apple2Unit.Joystick.Joystick1Trim[0]);
KeybGetSnapshot(Apple2Unit.Keyboard.LastKey); KeybGetSnapshot(Apple2Unit.Keyboard.LastKey);
SpkrGetSnapshot(Apple2Unit.Speaker.SpkrLastCycle); SpkrGetSnapshot(Apple2Unit.Speaker.SpkrLastCycle);
VideoGetSnapshot(Apple2Unit.Video); VideoGetSnapshot(Apple2Unit.Video);
@ -668,6 +756,10 @@ void Snapshot_SaveState()
DiskGetSnapshot(m_hFile); DiskGetSnapshot(m_hFile);
HD_GetSnapshot(m_hFile); HD_GetSnapshot(m_hFile);
//
SaveUnitConfig();
} }
catch(std::string szMessage) catch(std::string szMessage)
{ {

View File

@ -73,6 +73,7 @@ enum SS_CARDTYPE
CT_80Col, // 80 column card (no memory) CT_80Col, // 80 column card (no memory)
CT_Extended80Col, // Extended 80-col card (64K) CT_Extended80Col, // Extended 80-col card (64K)
CT_RamWorksIII, // RamWorksIII (up to 8MB) CT_RamWorksIII, // RamWorksIII (up to 8MB)
CT_Uthernet,
}; };
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////

View File

@ -27,6 +27,8 @@ struct SS_CPU6502_v2
struct SS_IO_Joystick_v2 struct SS_IO_Joystick_v2
{ {
unsigned __int64 JoyCntrResetCycle; unsigned __int64 JoyCntrResetCycle;
short Joystick0Trim[2]; // [x,y]
short Joystick1Trim[2]; // [x,y]
}; };
struct SS_IO_Keyboard_v2 struct SS_IO_Keyboard_v2
@ -90,27 +92,31 @@ struct APPLEWIN_SNAPSHOT_v2
struct SS_AW_CFG struct SS_AW_CFG
{ {
UINT32 AppleWinVersion; UINT16 AppleWinVersion[4]; // major,minor,fix,fix_minor
UINT32 VideoMode; UINT32 VideoMode;
UINT32 IsHalfScanLines;
UINT32 IsConfirmReboot;
UINT32 MonochromeColor; UINT32 MonochromeColor;
float ClockFreqMHz; UINT32 WindowScale;
UINT32 CpuSpeed;
// //
UINT32 JoystickType[2]; UINT32 JoystickType[2];
UINT32 JoystickTrim[2];
UINT32 IsAllowCursorsToBeRead; UINT32 IsAllowCursorsToBeRead;
UINT32 IsAutofire; UINT32 IsAutofire;
UINT32 IsKeyboardAutocentering; UINT32 IsKeyboardAutocentering;
UINT32 IsSwapButton0and1; UINT32 IsSwapButton0and1;
UINT32 IsScrollLockToggle;
UINT32 IsMouseShowCrosshair;
UINT32 IsMouseRestrictToWindow;
// //
UINT32 SoundType;
UINT32 SpeakerVolume; UINT32 SpeakerVolume;
UINT32 MockingboardVolume; UINT32 MockingboardVolume;
// //
UINT32 IsEnhancedDiskSpeed; UINT32 IsEnhancedDiskSpeed;
UINT32 IsSaveStateOnExit;
// //
UINT32 IsEncodingConversionForClones;
UINT32 IsFilterUnprintableChars;
UINT32 IsAppendToFile; UINT32 IsAppendToFile;
UINT32 TerminatePrintingAfterIdleSecs;
UINT32 IsUsingFreezesF8Rom; UINT32 IsUsingFreezesF8Rom;
}; };

View File

@ -1340,6 +1340,8 @@ struct SSC_Unit
bool vbRxIrqPending; bool vbRxIrqPending;
bool bWrittenTx; bool bWrittenTx;
char SerialPortName[8];
}; };
struct SS_CARD_SSC struct SS_CARD_SSC
@ -1376,6 +1378,8 @@ void CSuperSerialCard::GetSnapshot(const HANDLE hFile)
Unit.vbRxIrqPending = m_vbRxIrqPending; Unit.vbRxIrqPending = m_vbRxIrqPending;
Unit.bWrittenTx = m_bWrittenTx; Unit.bWrittenTx = m_bWrittenTx;
strncpy_s(Unit.SerialPortName, sizeof(Unit.SerialPortName), GetSerialPortName(), _TRUNCATE);
// //
DWORD dwBytesWritten; DWORD dwBytesWritten;
@ -1428,4 +1432,6 @@ void CSuperSerialCard::SetSnapshot(const HANDLE hFile)
m_vbTxIrqPending = Unit.vbTxIrqPending; m_vbTxIrqPending = Unit.vbTxIrqPending;
m_vbRxIrqPending = Unit.vbRxIrqPending; m_vbRxIrqPending = Unit.vbRxIrqPending;
m_bWrittenTx = Unit.bWrittenTx; m_bWrittenTx = Unit.bWrittenTx;
SetSerialPortName(Unit.SerialPortName);
} }