diff options
author | Ian C <ianc@noddybox.co.uk> | 2004-08-21 01:15:19 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2004-08-21 01:15:19 +0000 |
commit | 1c7d0b339d578511be239c175ef2096e6e8aa6e2 (patch) | |
tree | e85266d073f05229f579ed84ad7e33f7da86ddfa /tap.c | |
parent | 666bf8d5ef44953391f4cf08c51175aff3d4dc60 (diff) |
Added new files
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 */ |