diff options
Diffstat (limited to 'tap.c')
-rw-r--r-- | tap.c | 171 |
1 files changed, 171 insertions, 0 deletions
@@ -0,0 +1,171 @@ +/* + + 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 + + ------------------------------------------------------------------------- + +*/ +static const char id[]="$Id$"; + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "tap.h" + +static const char header_id[]=I2T_TAP_H; + + +/* ---------------------------------------- CONSTANTS +*/ +#undef TRUE +#undef FALSE + +#define TRUE 1 +#define FALSE 0 + + +/* ---------------------------------------- TYPES +*/ + + +/* ---------------------------------------- GLOBALS +*/ +extern const char *progname; + +static FILE *fp; +static int file_no; + + +/* ---------------------------------------- PRIVATE FUNCTIONS +*/ +unsigned char TapWord(unsigned w, unsigned char chk) +{ + putc(w&0xff,fp); + chk^=w&0xff; + putc(w>>8,fp); + chk^=w>>8; + return chk; +} + +unsigned char TapByte(unsigned char c, unsigned char chk) +{ + putc(c,fp); + chk^=c; + return chk; +} + +unsigned char TapString(char *p, int len, unsigned char chk) +{ + while(len--) + { + chk=TapByte(*p++,chk); + } + + return chk; +} + +unsigned char TapStream(const unsigned char p[0x10000], + unsigned addr, unsigned len, unsigned char chk) +{ + while(len--) + { + chk=TapByte(p[addr],chk); + addr=(addr+1)&0xffff; + } + + return chk; +} + +/* ---------------------------------------- INTERFACES +*/ + +int TapOpen(const char *filename) +{ + file_no=0; + + if (!(fp=fopen(filename,"wb"))) + { + fprintf(stderr,"%s: Failed to create %s\n",progname,filename); + } + + return fp!=NULL; +} + + +void TapWrite(const unsigned char mem[0x1000], + unsigned addr, unsigned len, int is_code) +{ + char name[11]={0}; + unsigned char chk; + + sprintf(name,"%10.10d",file_no); + file_no=(file_no+1)%10000; + + /* Output file header + */ + chk=TapWord(19,chk); + chk=TapByte(0,chk); + + if (is_code) + { + chk=TapByte(3,chk); + } + else + { + chk=TapByte(3,chk); + } + + chk=TapString(name,10,chk); + chk=TapWord(len,chk); + + if (is_code) + { + chk=TapWord(addr,chk); + chk=TapWord(32768,chk); + } + else + { + chk=TapWord(0,chk); + chk=TapWord(0,chk); + } + + TapByte(chk,0); + + /* Output file data + */ + chk=0; + + chk=TapWord(len+2,chk); + chk=TapStream(mem,addr,len,chk); + TapByte(chk,0); +} + + +void TapClose(void) +{ + if (fp) + { + fclose(fp); + fp=NULL; + } +} + + +/* END OF FILE */ |