New save-state (.aws) v2:

. Format now extensible for supporting new hardware types in the future
. Include missing items like Apple2Type, CyclesThisVideoFrame (#255)
Continue to support loading of old v1 format.

Added card save/load for:
. Mouse (#260)
. HDD (#260)
. Printer

Extended card support for:
. SSC

Other:
. Added save-state v1 struct size checks
. Create SaveState_Structs_v2.h and split out common into SaveState_Structs_common.h
. Refactor HardDisk.cpp to use imagehandle; and consolidate with Disk.cpp
. Fix Disk/HD_GetFullPathName() which wasn't always returning full pathname
. Consolidate common GetImageTitle() and move into DiskImage.cpp
This commit is contained in:
tomcw
2015-02-13 22:40:53 +00:00
parent 0fc6d18139
commit 717c5cba84
48 changed files with 2195 additions and 756 deletions
+108 -3
View File
@@ -36,18 +36,19 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "..\resource\resource.h"
static DWORD inactivity = 0;
static int g_iPrinterIdleLimit = 10;
static FILE* file = NULL;
DWORD const PRINTDRVR_SIZE = APPLE_SLOT_SIZE;
TCHAR filepath[MAX_PATH * 2];
#define DEFAULT_PRINT_FILENAME "Printer.txt"
static char g_szPrintFilename[MAX_PATH] = {0};
bool g_bDumpToPrinter = false;
bool g_bConvertEncoding = true;
bool g_bFilterUnprintable = true;
bool g_bPrinterAppend = false;
int g_iPrinterIdleLimit = 10;
bool g_bEnableDumpToRealPrinter = false;
static UINT g_uSlot = 0;
//===========================================================================
static BYTE __stdcall PrintStatus(WORD, WORD, BYTE, BYTE, ULONG);
@@ -79,6 +80,8 @@ VOID PrintLoadRom(LPBYTE pCxRomPeripheral, const UINT uSlot)
//
RegisterIoHandler(uSlot, PrintStatus, PrintTransmit, NULL, NULL, NULL, NULL);
g_uSlot = uSlot;
}
//===========================================================================
@@ -245,8 +248,110 @@ unsigned int Printer_GetIdleLimit()
return g_iPrinterIdleLimit;
}
//unsigned int
void Printer_SetIdleLimit(unsigned int Duration)
{
g_iPrinterIdleLimit = Duration;
}
//===========================================================================
struct PrinterCard_Unit
{
DWORD Inactivity;
UINT PrinterIdleLimit;
char PrintFilename[MAX_PATH];
BOOL IsFileOpen;
BOOL DumpToPrinter;
BOOL ConvertEncoding;
BOOL FilterUnprintable;
BOOL PrinterAppend;
BOOL EnableDumpToRealPrinter;
};
struct SS_CARD_PRINTER
{
SS_CARD_HDR Hdr;
PrinterCard_Unit Unit;
};
void Printer_GetSnapshot(const HANDLE hFile)
{
SS_CARD_PRINTER CardPrinter;
SS_CARD_PRINTER* const pSS = &CardPrinter;
pSS->Hdr.UnitHdr.hdr.v2.Length = sizeof(SS_CARD_PRINTER);
pSS->Hdr.UnitHdr.hdr.v2.Type = UT_Card;
pSS->Hdr.UnitHdr.hdr.v2.Version = 1;
pSS->Hdr.Slot = g_uSlot;
pSS->Hdr.Type = CT_GenericPrinter;
CardPrinter.Unit.Inactivity = inactivity;
CardPrinter.Unit.PrinterIdleLimit = g_iPrinterIdleLimit;
memcpy(CardPrinter.Unit.PrintFilename, g_szPrintFilename, sizeof(CardPrinter.Unit.PrintFilename));
CardPrinter.Unit.IsFileOpen = (file != NULL);
CardPrinter.Unit.DumpToPrinter = g_bDumpToPrinter;
CardPrinter.Unit.ConvertEncoding = g_bConvertEncoding;
CardPrinter.Unit.FilterUnprintable = g_bFilterUnprintable;
CardPrinter.Unit.PrinterAppend = g_bPrinterAppend;
CardPrinter.Unit.EnableDumpToRealPrinter = g_bEnableDumpToRealPrinter;
//
DWORD dwBytesWritten;
BOOL bRes = WriteFile( hFile,
&CardPrinter,
CardPrinter.Hdr.UnitHdr.hdr.v2.Length,
&dwBytesWritten,
NULL);
if(!bRes || (dwBytesWritten != CardPrinter.Hdr.UnitHdr.hdr.v2.Length))
{
//dwError = GetLastError();
throw std::string("Save error: Printer Card");
}
}
void Printer_SetSnapshot(const HANDLE hFile)
{
SS_CARD_PRINTER CardPrinter;
DWORD dwBytesRead;
BOOL bRes = ReadFile( hFile,
&CardPrinter,
sizeof(CardPrinter),
&dwBytesRead,
NULL);
if (dwBytesRead != sizeof(CardPrinter))
throw std::string("Card: file corrupt");
if (CardPrinter.Hdr.Slot != 1) // fixme
throw std::string("Card: wrong slot");
if (CardPrinter.Hdr.UnitHdr.hdr.v2.Version > 1)
throw std::string("Card: wrong version");
if (CardPrinter.Hdr.UnitHdr.hdr.v2.Length != sizeof(SS_CARD_PRINTER))
throw std::string("Card: unit size mismatch");
ClosePrint(); // Close current print session (and close file handle)
inactivity = CardPrinter.Unit.Inactivity;
g_iPrinterIdleLimit = CardPrinter.Unit.PrinterIdleLimit;
memcpy(g_szPrintFilename, CardPrinter.Unit.PrintFilename, sizeof(g_szPrintFilename));
if (CardPrinter.Unit.IsFileOpen)
{
g_bPrinterAppend = true; // Re-open print-file in append mode
BOOL bRes = CheckPrint();
if (!bRes)
throw std::string("Printer Card: Unable to resume printing to file");
}
g_bDumpToPrinter = CardPrinter.Unit.DumpToPrinter == TRUE;
g_bConvertEncoding = CardPrinter.Unit.ConvertEncoding == TRUE;
g_bFilterUnprintable = CardPrinter.Unit.FilterUnprintable == TRUE;
g_bPrinterAppend = CardPrinter.Unit.PrinterAppend == TRUE;
g_bEnableDumpToRealPrinter = CardPrinter.Unit.EnableDumpToRealPrinter == TRUE;
}