From b219c3580da55f3396a2d8df8301a777b783d833 Mon Sep 17 00:00:00 2001
From: Ian C <ianc@noddybox.co.uk>
Date: Sat, 24 Jan 2004 02:17:57 +0000
Subject: Changed tape loading to use functions for peek/poke

---
 src/Makefile |  4 ++--
 src/snap.c   | 17 +++++++++++------
 src/snap.h   |  9 ++++++---
 src/spec.c   | 27 +++++++++++++++++++++------
 4 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index addc749..003f717 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -18,7 +18,7 @@
 # 
 # -------------------------------------------------------------------------
 # 
-# $Id: Makefile,v 1.9 2004-01-24 01:47:55 ianc Exp $
+# $Id: Makefile,v 1.10 2004-01-24 02:17:57 ianc Exp $
 # 
 
 
@@ -96,7 +96,7 @@ main.o: /usr/local/include/SDL/SDL_keysym.h
 main.o: /usr/local/include/SDL/SDL_mouse.h /usr/local/include/SDL/SDL_video.h
 main.o: /usr/local/include/SDL/SDL_mutex.h /usr/local/include/SDL/SDL_quit.h
 main.o: /usr/local/include/SDL/SDL_version.h z80/z80.h spec.h gfx.h gui.h
-main.o: memmenu.h config.h exit.h util.h
+main.o: memmenu.h config.h kbbmp.h exit.h util.h
 spec.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h
 spec.o: /usr/include/sys/_types.h /usr/include/machine/_types.h
 spec.o: /usr/include/stdio.h /usr/include/string.h /usr/include/strings.h
diff --git a/src/snap.c b/src/snap.c
index c67c0bf..bbc074b 100644
--- a/src/snap.c
+++ b/src/snap.c
@@ -26,6 +26,7 @@
 static const char ident[]="$Id$";
 
 #include "snap.h"
+#include "util.h"
 
 static const char ident_h[]=ESPEC_SNAP_H;
 
@@ -94,7 +95,7 @@ static void PutByte(FILE *fp, Z80Byte b)
 
 /* ---------------------------------------- INTERFACES
 */
-int TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
+int TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Poke poke)
 {
     Z80Word blen;
     Z80Byte type,b,csum,tape_csum;
@@ -128,8 +129,7 @@ int TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
 	    b=GetByte(fp);
 	    csum^=b;
 
-	    if (*addr>=ROMLEN)
-	    	mem[*addr]=b;
+	    poke(*addr,b);
 
 	    (*addr)++;
 	    (*len)--;
@@ -153,6 +153,7 @@ int TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
 
 	/* Check the checksum
 	*/
+	Debug("csum = %d, tape csum = %d\n",csum,tape_csum);
 	return csum==tape_csum;
     }
     else
@@ -167,7 +168,7 @@ int TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
 }
 
 
-int TAPSave(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
+int TAPSave(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, SNAP_Peek peek)
 {
     Z80Byte csum;
 
@@ -185,8 +186,12 @@ int TAPSave(FILE *fp, Z80Byte id, Z80Word *addr, Z80Word *len, Z80Byte *mem)
 
     while(*len)
     {
-    	PutByte(fp,mem[*addr]);
-	csum^=mem[*addr];
+	Z80Byte b;
+
+	b=peek(*addr);
+
+    	PutByte(fp,b);
+	csum^=b;
 	(*addr)++;
 	(*len)--;
     }
diff --git a/src/snap.h b/src/snap.h
index 04d771a..d1978b6 100644
--- a/src/snap.h
+++ b/src/snap.h
@@ -35,18 +35,21 @@
 /* ---------------------------------------- INTERFACES
 */
 
+typedef Z80Byte	(*SNAP_Peek)(Z80Word address);
+typedef void	(*SNAP_Poke)(Z80Word address, Z80Byte val);
+
+
 /* Loads a block from a TAP file.  Returns FALSE for failure.
-   Won't write below location 0x4000 in mem.
 */
 int	TAPLoad(FILE *fp, Z80Byte id, Z80Word *addr,
-		Z80Word *len, Z80Byte *mem);
+		Z80Word *len, SNAP_Poke poke);
 
 
 /* Saves a block to a TAP file.  Returns FALSE for failure
    (which it never does as long as fp is not NULL).
 */
 int	TAPSave(FILE *fp, Z80Byte id, Z80Word *addr,
-		Z80Word *len, Z80Byte *mem);
+		Z80Word *len, SNAP_Peek peek);
 
 
 /* Copies a string.  The result must be freed.
diff --git a/src/spec.c b/src/spec.c
index 7f0bd7f..1fba973 100644
--- a/src/spec.c
+++ b/src/spec.c
@@ -244,6 +244,19 @@ static void DumpZ80(Z80 *z80)
 
 /* ---------------------------------------- PRIVATE FUNCTIONS
 */
+static Z80Byte Peek(Z80Word addr)
+{
+    return mem[addr];
+}
+
+
+static void Poke(Z80Word addr, Z80Byte val)
+{
+    if (addr>=ROMLEN)
+	mem[addr]=val;
+}
+
+
 void DrawScanlineAt(int y, int sline)
 {
     int aline;
@@ -339,13 +352,13 @@ static int EDCallback(Z80 *z80, Z80Val data)
 	    }
 	    else
 	    {
-	    	if (TAPSave(tape_out,HIBYTE(state.AF),&state.IX,&state.DE,mem))
+	    	if (TAPSave(tape_out,HIBYTE(state.AF),&state.IX,&state.DE,Peek))
 		{
-		    state.AF&=~eZ80_Carry;
+		    state.AF|=eZ80_Carry;
 		}
 		else
 		{
-		    state.AF|=eZ80_Carry;
+		    state.AF&=~eZ80_Carry;
 		}
 	    }
 	    break;
@@ -357,13 +370,13 @@ static int EDCallback(Z80 *z80, Z80Val data)
 	    }
 	    else
 	    {
-	    	if (TAPLoad(tape_in,HIBYTE(state.AF),&state.IX,&state.DE,mem))
+	    	if (TAPLoad(tape_in,HIBYTE(state.AF),&state.IX,&state.DE,Poke))
 		{
-		    state.AF&=~eZ80_Carry;
+		    state.AF|=eZ80_Carry;
 		}
 		else
 		{
-		    state.AF|=eZ80_Carry;
+		    state.AF&=~eZ80_Carry;
 		}
 	    }
 	    break;
@@ -595,6 +608,8 @@ const Z80Label *SPECGetLabel(void)
 {
     static const Z80Label label[]=
     	{
+	    {0x04c6,	"SAVE"},
+	    {0x0562,	"LOAD"},
 	    {0x5c00,	"KSTATE"},
 	    {0x5c01,	"KSTATE+1"},
 	    {0x5c02,	"KSTATE+2"},
-- 
cgit v1.2.3