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); + } +} |