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