summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2021-07-05 21:37:37 +0000
committerIan C <ianc@noddybox.co.uk>2021-07-05 21:37:37 +0000
commit06f2daa56e0eb8e592c015b07dbeb787bb081e4d (patch)
tree59c9a9c05fff8e4aff8b7ad045dc739151a7a027
parent0bc192bffbf28ba5733ae955916e5ebc72f3641f (diff)
Added TAP file loading.
-rw-r--r--include/gui.h4
-rw-r--r--include/snap.h6
-rw-r--r--include/spec.h2
-rw-r--r--source/gui.c2
-rw-r--r--source/main.c16
-rw-r--r--source/snap.c67
-rw-r--r--source/snapshot.c1
-rw-r--r--source/spec.c4
8 files changed, 70 insertions, 32 deletions
diff --git a/include/gui.h b/include/gui.h
index ed64ffe..027e2b6 100644
--- a/include/gui.h
+++ b/include/gui.h
@@ -21,6 +21,8 @@
#ifndef DSSPEC_GUI_H
#define DSSPEC_GUI_H
+#include <stdio.h>
+
int GUI_Menu(const char *opts[]);
void GUI_Alert(int fatal, const char *text);
void GUI_Config(void);
@@ -29,4 +31,6 @@ int GUI_FileSelect(char pwd[], char selected_file[],
int GUI_InputName(const char *prompt, const char *ext,
char name[], int maxlen);
+extern char last_dir[FILENAME_MAX];
+
#endif /* DSSPEC_GUI_H */
diff --git a/include/snap.h b/include/snap.h
index 62b6063..ce74bf3 100644
--- a/include/snap.h
+++ b/include/snap.h
@@ -37,7 +37,11 @@ typedef void (*SNAP_Poke)(Z80Word address, Z80Byte val);
/* Sets the active TAP file
*/
-void TAPSetTape(Z80Byte *tap, int len);
+void TAPOpenTape(const char *path);
+
+/* Close the active TAP file. Can be called when no tape is open.
+*/
+void TAPCloseTape(void);
/* Loads a block from a TAP file. Returns FALSE for failure.
*/
diff --git a/include/spec.h b/include/spec.h
index 8b7154b..47549a3 100644
--- a/include/spec.h
+++ b/include/spec.h
@@ -72,7 +72,7 @@ void SPECWritePort(Z80 *z80, Z80Word port, Z80Byte val);
/* Interface for snap
*/
-void SPECWriteSnap(Z80Word addr, Z80Byte val);
+void SPECWriteMemSNAP(Z80Word addr, Z80Byte val);
/* Interfaces to allows the SPEC to save/load itself as a snapshot to/from
a stream.
diff --git a/source/gui.c b/source/gui.c
index 604f910..94b7f94 100644
--- a/source/gui.c
+++ b/source/gui.c
@@ -59,6 +59,8 @@ typedef struct
static FSEL_File fsel[FSEL_MAX_FILES];
+char last_dir[FILENAME_MAX] = "/";
+
static void CheckPath(char *path)
{
diff --git a/source/main.c b/source/main.c
index f096f9a..0610a6f 100644
--- a/source/main.c
+++ b/source/main.c
@@ -31,6 +31,7 @@
#include "spec.h"
#include "config.h"
#include "snapshot.h"
+#include "snap.h"
#ifndef DSSPEC_VERSION
#define DSSPEC_VERSION "DEV " __TIME__ "/" __DATE__
@@ -61,7 +62,7 @@
static const char *main_menu[]=
{
"Reset Spectrum",
- "Select Tape",
+ "Load TAP File",
"Configure",
"Map Joypad to Keys",
"Save Memory Snapshot",
@@ -76,7 +77,7 @@ static const char *main_menu[]=
typedef enum
{
MenuReset,
- MenuSelectTape,
+ MenuLoadTAP,
MenuConfigure,
MenuMapJoypad,
MenuSaveSnapshot,
@@ -299,8 +300,17 @@ int main(int argc, char *argv[])
SPECReset(z80);
break;
- case MenuSelectTape:
+ case MenuLoadTAP:
+ {
+ char file[FILENAME_MAX];
+
+ if (GUI_FileSelect(last_dir, file, ".TAP"))
+ {
+ TAPCloseTape();
+ TAPOpenTape(file);
+ }
break;
+ }
case MenuConfigure:
GUI_Config();
diff --git a/source/snap.c b/source/snap.c
index 1ddb6b9..e998ba2 100644
--- a/source/snap.c
+++ b/source/snap.c
@@ -21,6 +21,9 @@
$Id: snap.c 4 2006-09-15 00:30:18Z ianc $
*/
+#include <stdlib.h>
+#include <stdio.h>
+
#include "snap.h"
/* ---------------------------------------- MACROS
@@ -38,45 +41,57 @@
/* ---------------------------------------- PRIVATE DATA
*/
-static Z80Byte *tap_file;
-static int tap_len;
-static int tap_ptr;
+static FILE *tapfile;
/* ---------------------------------------- PRIVATE FUNCTIONS
*/
-static Z80Byte GetByte(void)
+static Z80Byte GetTAPByte(void)
{
- Z80Byte ret=0;
+ int ret=0;
- if (tap_len)
+ if (tapfile)
{
- ret=tap_file[tap_ptr];
- tap_ptr=(tap_ptr+1)%tap_len;
+ ret = fgetc(tapfile);
+
+ if (ret == EOF)
+ {
+ ret = 0;
+ fclose(tapfile);
+ tapfile = NULL;
+ }
}
- return ret;
+ return (Z80Byte)ret;
}
-static Z80Word GetLSBWord(void)
+static Z80Word GetTAPLSBWord(void)
{
int c1,c2;
- c1=GetByte();
- c2=GetByte();
+ c1=GetTAPByte();
+ c2=GetTAPByte();
- return c1+(c2<<8);
+ return (Z80Word)(c1+(c2<<8));
}
/* ---------------------------------------- INTERFACES
*/
-void TAPSetTape(Z80Byte *tape, int len)
+void TAPOpenTape(const char *path)
{
- tap_file = tape;
- tap_len = len;
- tap_ptr = 0;
+ tapfile = fopen(path, "rb");
+}
+
+
+void TAPCloseTape(void)
+{
+ if (tapfile)
+ {
+ fclose(tapfile);
+ tapfile = NULL;
+ }
}
@@ -85,15 +100,15 @@ int TAPLoad(Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Poke poke)
Z80Word blen;
Z80Byte type,b,csum,tape_csum;
- if (!tap_file)
+ if (!tapfile)
{
return FALSE;
}
b=0;
- blen=GetLSBWord();
- type=GetByte();
+ blen=GetTAPLSBWord();
+ type=GetTAPByte();
csum=id;
/* Have we found the requested block?
@@ -106,7 +121,7 @@ int TAPLoad(Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Poke poke)
while(blen && *len)
{
- b=GetByte();
+ b=GetTAPByte();
csum^=b;
poke(*addr,b);
@@ -120,16 +135,20 @@ int TAPLoad(Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Poke poke)
*/
if (blen)
{
- tape_csum=GetByte();
+ tape_csum=GetTAPByte();
blen--;
}
else
+ {
tape_csum=b;
+ }
/* In case we've been request less bytes than the block size
*/
while(blen--)
- GetByte();
+ {
+ GetTAPByte();
+ }
/* Check the checksum
*/
@@ -140,7 +159,7 @@ int TAPLoad(Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Poke poke)
/* If it's the wrong type, skip it
*/
while(blen--)
- GetByte();
+ GetTAPByte();
return FALSE;
}
diff --git a/source/snapshot.c b/source/snapshot.c
index e75a359..61cffc2 100644
--- a/source/snapshot.c
+++ b/source/snapshot.c
@@ -137,7 +137,6 @@ void SNAP_Save(Z80 *cpu, SnapshotType type)
void SNAP_Load(Z80 *cpu, const char *optional_name, SnapshotType type)
{
- static char last_dir[FILENAME_MAX] = "/";
char file[FILENAME_MAX];
FILE *fp = NULL;
diff --git a/source/spec.c b/source/spec.c
index 5fa5060..e0698c2 100644
--- a/source/spec.c
+++ b/source/spec.c
@@ -306,7 +306,7 @@ static int EDCallback(Z80 *z80, Z80Val data)
if (TAPLoad(z80->AF.b[Z80_HI_WORD],
&z80->IX.w,
&z80->DE.w,
- SPECWriteSnap))
+ SPECWriteMemSNAP))
{
z80->AF.b[Z80_LO_WORD] |= eZ80_Carry;
z80->BC.w=0xb001;
@@ -394,7 +394,7 @@ void SPECWriteMem(Z80 *z80, Z80Word addr, Z80Byte val)
}
-void SPECWriteSnap(Z80Word addr, Z80Byte val)
+void SPECWriteMemSNAP(Z80Word addr, Z80Byte val)
{
if (addr>=ROMLEN)
{