/* 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 */