/*  */

#include <libraries/dosextens.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include <clib/dos_protos.h>


#include "ZX.h"

void Copyright(void);

/* constants declaration */

#define MAXBUF 49152
#define MAXINBUF 7
#define MAXFNBUF 128

/* variables declaration */

char filein[MAXFNBUF], fileh[MAXFNBUF], fileb[MAXFNBUF];
UBYTE __far aux[MAXBUF];
int file_length;

			
struct ZX82_file ZX82_File;
struct Header header;
struct Bytes bytes;


SaveFileHeader(char *);
SaveFileBytes(char *);
LoadFile(char *);
Checksum(UBYTE *, int);

main(argc, argv)

int argc;
char *argv[];

{

int i=1;
char *name;


	Copyright();
	if(argc==1) {
badusage:	printf("Usage: %s filename [filename]\n",argv[0]);
		exit(1);
	}

/* insert options handling here */

	if(!(--argc))
		goto badusage;
	strcpy(filein,argv[i]);
	strcpy(fileh,filein);;
	strcpy(fileb,fileh);
	if(--argc)
		strcpy(fileh,argv[++i]);
	strcpy(fileb,fileh);
	strcat(fileh,".header");
        strcat(fileb,".bytes");
        
        if(LoadFile(filein)) {
        	if(ZX82_File.header.ZX_Type==4) {
        		puts("Use ZX82tosnap for snapshots");
        	}
        	else {
        		if(ZX82_File.header.ZX_Comp) {
        			puts("Compressed files not yet supported");
        		}
        		else {
        			bytes.data=ZX82_File.data;
		        	bytes.checksum=Checksum(bytes.data,file_length);
        			bytes.flag=0xFF;
        			bytes.checksum ^= bytes.flag;	/* add flag to checksum calculation */
        			header.flag=0;
        			header.type=ZX82_File.header.ZX_Type;
				if(header.type==6)		/* correct screen$ type from MGT */
					header.type=3;
        			name=FilePart(filein);
        			for(i=0;(i<10) && (name[i]!=0);i++) {
        				header.name[i]=name[i];
        				
        			}
        			for(;i<10;i++) {
        				header.name[i]=' ';
        				
        			}
        			header.length_l=ZX82_File.header.ZX_Length_L;
        			header.length_h=ZX82_File.header.ZX_Length_H;
        			header.start_l=ZX82_File.header.ZX_Start_L;
        			header.start_h=ZX82_File.header.ZX_Start_H;
        			header.blength_l=ZX82_File.header.ZX_ProgLen_L;
        			header.blength_h=ZX82_File.header.ZX_ProgLen_H;
        			header.checksum=Checksum((UBYTE *)&header,sizeof(header)-1);
        			if(SaveFileHeader(fileh))
        				SaveFileBytes(fileb);
        		}
        	}
        }
	
}

void Copyright(void)
{
	puts("ZX82 to generic .header/.bytes converter (C)1997 by SRC");
}


SaveFileHeader(char *ptr)

{

BPTR fh;

	if(!(fh=Open(ptr,MODE_NEWFILE))) {
		printf("Could not save file '%s'\n",ptr);
		return(0);
	}
	Write(fh,&header,sizeof(header));
	Close(fh);
	return(1);
}

SaveFileBytes(char *ptr)

{

BPTR fh;

	if(!(fh=Open(ptr,MODE_NEWFILE))) {
		printf("Could not save file '%s'\n",ptr);
		return(0);
	}
	Write(fh,&(bytes.flag),1);
	Write(fh,bytes.data,file_length);
	Write(fh,&(bytes.checksum),1);
	Close(fh);
	return(1);
}

LoadFile(char *ptr)
		
{
BPTR fh;


	if(!(fh=Open(ptr,MODE_OLDFILE))) {
		printf("Could not load file '%s'\n",ptr);
		return(0);
	}
	Read(fh,&(ZX82_File.header),sizeof(struct ZX82_header_base));
	file_length=Read(fh,aux,sizeof(aux));	/* aux defined as global */
	ZX82_File.data=aux;
	Close(fh);
	return(1);
}

Checksum(UBYTE *ptr, int len)
{
int i;
UBYTE ck=0;
	for(i=0;i<len;i++)
		ck^=ptr[i];	/* ^ means exclusive-OR */
	return(ck);
}