summaryrefslogtreecommitdiff
path: root/source/tapes.c
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2006-10-09 00:32:14 +0000
committerIan C <ianc@noddybox.co.uk>2006-10-09 00:32:14 +0000
commita50b3820e29af6d12b86c55afb8be1aee9091558 (patch)
treea3e74e4706488db0701bc992b1eb75e29d52e7a1 /source/tapes.c
parent09a74c822519bae9d20f79b8e7808f19c5094e7f (diff)
Working version with a few games included
Diffstat (limited to 'source/tapes.c')
-rw-r--r--source/tapes.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/source/tapes.c b/source/tapes.c
new file mode 100644
index 0000000..adac3b6
--- /dev/null
+++ b/source/tapes.c
@@ -0,0 +1,175 @@
+/*
+ ds81 - Nintendo DS ZX81 emulator.
+
+ Copyright (C) 2006 Ian Cowburn
+
+ 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.
+
+ $Id$
+*/
+
+#include <nds.h>
+
+#include "tapes.h"
+#include "framebuffer.h"
+#include "zx81.h"
+
+#include "maze_bin.h"
+#include "maze_inlay_bin.h"
+#include "cpatrol_bin.h"
+#include "cpatrol_inlay_bin.h"
+#include "sabotage_bin.h"
+#include "sabotage_inlay_bin.h"
+
+
+/* ---------------------------------------- STATIC DATA
+*/
+typedef struct
+{
+ const u8 *tape;
+ const u32 *tape_len;
+ sImage img;
+ void *source_pcx;
+ const char *text;
+} Tape;
+
+#define NO_TAPES 3
+
+static Tape tapes[NO_TAPES]=
+ {
+ {
+ maze_bin,
+ &maze_bin_size,
+ {0},
+ maze_inlay_bin,
+ "%3d monster maze%\n"
+ "(c) 1983 Malcom E. Evans\n\n"
+ "Escape the maze and its T-Rex\n"
+ "\n\n"
+ "%note% when the screen goes grey\n"
+ "for 30-60 seconds this is not a\n"
+ "problem, and is the game creating\n"
+ "the lair of rex."
+ },
+ {
+ cpatrol_bin,
+ &cpatrol_bin_size,
+ {0},
+ cpatrol_inlay_bin,
+ "%city patrol%\n"
+ "(c) 1982 Don Priestley\n\n"
+ "Defend the city from the aliens.\n\n"
+ "yes - that parallax city was\n"
+ "done with a text mode and the\n"
+ "equivalent of a 0.8mhz z80"
+ },
+ {
+ sabotage_bin,
+ &sabotage_bin_size,
+ {0},
+ sabotage_inlay_bin,
+ "%sabotage%\n"
+ "(c) 1982 Don Priestley\n\n"
+ "Destroy the boxes before the\n"
+ "guard finds you.\n\n"
+ "or find the saboteur as the\n"
+ "guard.\n\n"
+ "while this game may not feature\n"
+ "the dazzling graphics of other\n"
+ "ZX81 games it more than makes\n"
+ "up with a simply joyous\n"
+ "gameplay mechanic.\n"
+ }
+ };
+
+
+static int current=0;
+
+/* ---------------------------------------- PRIVATE INTERFACES
+*/
+static void InitTapes(void)
+{
+ static int init=FALSE;
+ int f;
+
+ if (init)
+ {
+ return;
+ }
+
+ init=TRUE;
+
+ for(f=0;f<NO_TAPES;f++)
+ {
+ loadPCX(tapes[f].source_pcx,&tapes[f].img);
+ image8to16(&tapes[f].img);
+ }
+}
+
+static void DisplayTape(Tape *t)
+{
+ FB_Clear();
+ FB_Blit(&t->img,255-t->img.width,0);
+
+ FB_Print("LEFT/RIGHT",0,0,FB_RGB(255,255,255),-1);
+ FB_Print("to choose",0,10,FB_RGB(255,255,255),-1);
+ FB_Print("A to select",0,30,FB_RGB(255,255,255),-1);
+ FB_Print("B to cancel",0,40,FB_RGB(255,255,255),-1);
+
+ ZX81DisplayString(t->text);
+}
+
+/* ---------------------------------------- PUBLIC INTERFACES
+*/
+void SelectTape(void)
+{
+ int done=FALSE;
+
+ InitTapes();
+
+ while(!done)
+ {
+ uint32 key=0;
+
+ DisplayTape(tapes+current);
+
+ do
+ {
+ swiWaitForVBlank();
+ } while(!(key=keysDownRepeat()));
+
+ if (key & KEY_LEFT)
+ {
+ if (--current<0)
+ {
+ current=NO_TAPES-1;
+ }
+ }
+ else if (key & KEY_RIGHT)
+ {
+ current=(current+1)%NO_TAPES;
+ }
+ else if (key & KEY_A)
+ {
+ done=TRUE;
+ ZX81SetTape(tapes[current].tape,*tapes[current].tape_len);
+ }
+ else if (key & KEY_B)
+ {
+ done=TRUE;
+ }
+ }
+}
+