diff options
| -rw-r--r-- | source/snapshot.c | 176 | 
1 files changed, 176 insertions, 0 deletions
| diff --git a/source/snapshot.c b/source/snapshot.c new file mode 100644 index 0000000..f5a8b9c --- /dev/null +++ b/source/snapshot.c @@ -0,0 +1,176 @@ +/* +    ds81 - Nintendo DS ZX81 emulator + +    Copyright (C) 2006  Ian Cowburn <ianc@noddybox.co.uk> + +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 2 of the License, or +    (at your option) any later version. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + +    ------------------------------------------------------------------------- + +    Provides the routines for snapshotting. + +*/ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <nds.h> + +#include "zx81.h" +#include "gui.h" + +#include "config.h" + +#include "ds81_debug.h" + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +/* ---------------------------------------- STATICS +*/ +static int		enabled; +static const char 	*magic = "V00_DS81"; + + +/* ---------------------------------------- PRIVATE FUNCTIONS +*/ +static void WriteMagic(FILE *fp) +{ +    const char *p = magic; + +    while(*p) +    { +    	fputc(*p++, fp); +    } +} + +static int CheckMagic(FILE *fp) +{ +    const char *p = magic; + +    while(*p) +    { +	if (fgetc(fp) != *p++) +	{ +	    return FALSE; +	} +    } + +    return TRUE; +} + + +/* ---------------------------------------- EXPORTED INTERFACES +*/ +void SNAP_Enable(int enable) +{ +    enabled = enable; +} + +void SNAP_Save(Z80 *cpu) +{ +    char base[FILENAME_MAX] = ""; +    char file[FILENAME_MAX]; +    FILE *fp = NULL; + +    if (!enabled) +    { +    	return; +    } + +    if(!GUI_InputName(base, 8) || !base[0]) +    { +    	return; +    } + +    strcat(base, ".D81"); + +    strcpy(file, DEFAULT_SNAPDIR); +    strcat(file, base); + +    fp = fopen(file, "wb"); + +    if (!fp) +    { +	fp = fopen(base, "wb"); +    } + +    if (fp) +    { +	WriteMagic(fp); +	SK_SaveSnapshot(fp); +	Z80SaveSnapshot(cpu, fp); +	ZX81SaveSnapshot(fp); +    	fclose(fp); +    } +} + +void SNAP_Load(Z80 *cpu, const char *optional_name) +{ +    static char last_dir[FILENAME_MAX] = "/"; +    char file[FILENAME_MAX]; +    FILE *fp = NULL; + +    if (!enabled) +    { +    	return; +    } + +    if (optional_name) +    { +	strcpy(file, DEFAULT_SNAPDIR); +    	strcat(file, optional_name); + +	fp = fopen(file, "rb"); + +	if (!fp) +	{ +	    fp = fopen(optional_name, "rb"); +	} +    } +    else +    { +    	if (GUI_FileSelect(last_dir, file, ".D81")) +	{ +	    fp = fopen(file, "rb"); +	} +    } + +    if (fp) +    { +	if (!CheckMagic(fp)) +	{ +	    GUI_Alert(FALSE, "Not a valid snapshot"); +	} +	else +	{ +	    DS81_DEBUG("Loading SK snap"); +	    SK_LoadSnapshot(fp); +	    DS81_DEBUG("Loading Z80 snap"); +	    Z80LoadSnapshot(cpu, fp); +	    DS81_DEBUG("Loading ZX81 snap"); +	    ZX81LoadSnapshot(fp); +	    DS81_DEBUG("Snap loaded"); +	} + +    	fclose(fp); +    } +} | 
