summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2004-08-23 00:17:42 +0000
committerIan C <ianc@noddybox.co.uk>2004-08-23 00:17:42 +0000
commit0d850e4cb0990be073f7e02f93712cdfaa158d7e (patch)
tree280858d6dfa921b10697ea861ae8ed7737fa5ac2
parente6db986176b96bcb4812321ee1f2eaf17f900528 (diff)
Forgot to add basic.[ch]!
-rw-r--r--basic.c204
-rw-r--r--basic.h65
2 files changed, 269 insertions, 0 deletions
diff --git a/basic.c b/basic.c
new file mode 100644
index 0000000..1251334
--- /dev/null
+++ b/basic.c
@@ -0,0 +1,204 @@
+/*
+
+ int2tap - Convert an Intel segment file to a loadable Spectrum tape file
+
+ Copyright (C) 2004 Ian Cowburn (ianc@noddybox.demon.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
+
+ -------------------------------------------------------------------------
+
+ A Spectrum BASIC line is constructed:
+
+ <2-byte line number HI/LO>
+ <2-byte length including RET LO/HI>
+ <Data>
+ <RET - 0x0d>
+
+*/
+static const char id[]="$Id$";
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "basic.h"
+
+static const char header_id[]=I2T_BASIC_H;
+
+
+/* ---------------------------------------- CONSTANTS
+*/
+#undef TRUE
+#undef FALSE
+
+#define TRUE 1
+#define FALSE 0
+
+
+/* Types for AddLine()
+*/
+#define TYPE_END 0
+#define TYPE_TOKEN 1
+#define TYPE_STRING 2
+
+/* Constants for some tokens
+*/
+#define TOK_VAL 176
+#define TOK_QUOTE 34
+#define TOK_CODE 175
+#define TOK_USR 192
+#define TOK_LOAD 239
+#define TOK_RAND 249
+#define TOK_CLEAR 253
+
+
+/* ---------------------------------------- GLOBALS
+*/
+extern const char *progname;
+
+static unsigned char mem[0x10000];
+static unsigned endptr;
+static unsigned line_no;
+
+
+/* ---------------------------------------- PRIVATE FUNCTIONS
+*/
+static void Poke(unsigned char b, int *len)
+{
+ if (len)
+ {
+ (*len)++;
+ }
+
+ mem[endptr++]=b;
+}
+
+
+static void AddLine(int type, ...)
+{
+ va_list va;
+ int len;
+ unsigned char *len_ptr;
+
+ Poke(line_no>>8,NULL);
+ Poke(line_no&0xff,NULL);
+ line_no+=10;
+
+ len_ptr=mem+endptr;
+ endptr+=2;
+ len=0;
+
+ va_start(va,type);
+
+ while(type!=TYPE_END)
+ {
+ char *str;
+
+ switch(type)
+ {
+ case TYPE_TOKEN:
+ Poke(va_arg(va,int),&len);
+ break;
+
+ case TYPE_STRING:
+ str=va_arg(va,char *);
+
+ Poke(TOK_QUOTE,&len);
+
+ while(*str)
+ {
+ Poke(*str++,&len);
+ }
+
+ Poke(TOK_QUOTE,&len);
+
+ break;
+
+ default:
+ break;
+ }
+
+ type=va_arg(va,int);
+ }
+
+ Poke(0x0d,&len);
+
+ *len_ptr++=len&0xff;
+ *len_ptr=len>>8;
+}
+
+
+
+/* ---------------------------------------- INTERFACES
+*/
+void BasicInit(void)
+{
+ endptr=0;
+ line_no=10;
+}
+
+
+void BasicClearLine(unsigned val)
+{
+ char no[64];
+
+ sprintf(no,"%u",val);
+
+ AddLine(TYPE_TOKEN,TOK_CLEAR,
+ TYPE_TOKEN,TOK_VAL,
+ TYPE_STRING,no,
+ TYPE_END);
+}
+
+
+void BasicLoadLine(void)
+{
+ AddLine(TYPE_TOKEN,TOK_LOAD,
+ TYPE_TOKEN,TOK_QUOTE,
+ TYPE_TOKEN,TOK_QUOTE,
+ TYPE_TOKEN,TOK_CODE,
+ TYPE_END);
+}
+
+
+void BasicRandUsr(unsigned val)
+{
+ char no[64];
+
+ sprintf(no,"%u",val);
+
+ AddLine(TYPE_TOKEN,TOK_RAND,
+ TYPE_TOKEN,TOK_USR,
+ TYPE_TOKEN,TOK_VAL,
+ TYPE_STRING,no,
+ TYPE_END);
+}
+
+
+const unsigned char *BasicBase(void)
+{
+ return mem;
+}
+
+
+const unsigned BasicLength(void)
+{
+ return endptr;
+}
+
+
+/* END OF FILE */
diff --git a/basic.h b/basic.h
new file mode 100644
index 0000000..3d48e6e
--- /dev/null
+++ b/basic.h
@@ -0,0 +1,65 @@
+/*
+
+ int2tap - Convert an Intel segment file to a loadable Spectrum tape file
+
+ Copyright (C) 2004 Ian Cowburn (ianc@noddybox.demon.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
+
+ -------------------------------------------------------------------------
+
+ $Id$
+
+*/
+
+#ifndef I2T_BASIC_H
+#define I2T_BASIC_H "$Id$"
+
+/* ---------------------------------------- INTERFACES
+*/
+
+/* Initialises a BASIC program
+*/
+void BasicInit(void);
+
+
+/* Add a 'CLEAR USR "val"' line
+*/
+void BasicClearLine(unsigned val);
+
+
+/* Add a 'LOAD "" CODE' line
+*/
+void BasicLoadLine(void);
+
+
+/* Add a 'RANDOMIZE USR "val"' line
+*/
+void BasicRandUsr(unsigned val);
+
+
+/* Get the base of the BASIC program
+*/
+const unsigned char *BasicBase(void);
+
+
+/* Get the length of the BASIC program
+*/
+const unsigned BasicLength(void);
+
+
+#endif
+
+/* END OF FILE */