From 0d850e4cb0990be073f7e02f93712cdfaa158d7e Mon Sep 17 00:00:00 2001 From: Ian C Date: Mon, 23 Aug 2004 00:17:42 +0000 Subject: Forgot to add basic.[ch]! --- basic.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 basic.c (limited to 'basic.c') 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> + + + +*/ +static const char id[]="$Id$"; + +#include +#include +#include +#include + +#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 */ -- cgit v1.2.3