/*  */

#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], fileout[MAXFNBUF];
UBYTE __far aux[MAXBUF];
int file_length;

			
struct ZX82_snapshot ZX82_Snap;
struct snapshot Snap;


SaveFile(char *);
LoadFile(char *);
Checksum(UBYTE *, int);

main(argc, argv)

int argc;
char *argv[];

{

int i=1;


	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(fileout,filein);
	if(--argc)
		strcpy(fileout,argv[++i]);
	strcat(fileout,".snapshot");
        
        if(LoadFile(filein)) {
        	if(ZX82_Snap.header.ZX_Type!=4) {
        		puts("Use ZX82toHB for regular files");
        	}
        	else {
        		if(ZX82_Snap.header.ZX_Comp) {
        			puts("Compressed files not yet supported");
        		}
        		else {
        			Snap.header.i=ZX82_Snap.snap.ZX_if_H_reg;
        			Snap.header.la=ZX82_Snap.snap.ZX_hl_L_alt;
        			Snap.header.ha=ZX82_Snap.snap.ZX_hl_H_alt;
        			Snap.header.ea=ZX82_Snap.snap.ZX_de_L_alt;
        			Snap.header.da=ZX82_Snap.snap.ZX_de_H_alt;
        			Snap.header.ca=ZX82_Snap.snap.ZX_bc_L_alt;
        			Snap.header.ba=ZX82_Snap.snap.ZX_bc_H_alt;
        			Snap.header.fa=ZX82_Snap.snap.ZX_af_L_alt;
        			Snap.header.aa=ZX82_Snap.snap.ZX_af_H_alt;
        			Snap.header.l=ZX82_Snap.snap.ZX_hl_L_reg;
        			Snap.header.h=ZX82_Snap.snap.ZX_hl_H_reg;
        			Snap.header.e=ZX82_Snap.snap.ZX_de_L_reg;
        			Snap.header.d=ZX82_Snap.snap.ZX_de_H_reg;
        			Snap.header.c=ZX82_Snap.snap.ZX_bc_L_reg;
        			Snap.header.b=ZX82_Snap.snap.ZX_bc_H_reg;
        			Snap.header.iy_l=ZX82_Snap.snap.ZX_iy_L_reg;
        			Snap.header.iy_h=ZX82_Snap.snap.ZX_iy_H_reg;
        			Snap.header.ix_l=ZX82_Snap.snap.ZX_ix_L_reg;
        			Snap.header.ix_h=ZX82_Snap.snap.ZX_ix_H_reg;
        			Snap.header.ie=ZX82_Snap.snap.ZX_rf_L_reg;
        			Snap.header.r=ZX82_Snap.snap.ZX_rf_H_reg;
        			Snap.header.f=ZX82_Snap.snap.ZX_af_L_reg;
        			Snap.header.a=ZX82_Snap.snap.ZX_af_H_reg;
        			i=ZX82_Snap.snap.ZX_sp_H_reg << 8;
        			i|=ZX82_Snap.snap.ZX_sp_L_reg;
        			i-=2;
        			Snap.header.sp_l=(UBYTE) (i & 0xFF);
        			Snap.header.sp_h=(UBYTE) (i >> 8);
        			Snap.header.im=ZX82_Snap.snap.ZX_IntMode;
        			Snap.header.border_color=ZX82_Snap.snap.ZX_Border;
        			Snap.data=ZX82_Snap.data;
        			SaveFile(fileout);
        		}
        	}
        }
	
}

void Copyright(void)
{
	puts("ZX82 to .snapshot (Mirage) converter (C)1997 by SRC");
}



SaveFile(char *ptr)

{

BPTR fh;

	if(!(fh=Open(ptr,MODE_NEWFILE))) {
		printf("Could not save file '%s'\n",ptr);
		return(0);
	}
	Write(fh,&(Snap.header),sizeof(Snap.header));
	Write(fh,Snap.data,data_length);
	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_Snap.header),sizeof(struct ZX82_header_base));
	Read(fh,&(ZX82_Snap.snap),sizeof(struct ZX82_header_snap));
	Read(fh,aux,data_length);	/* aux defined as global */
	ZX82_Snap.data=aux;
	Close(fh);
	return(1);
}

Checksum(UBYTE *ptr, int len)
{
int i,ck=0;
	for(i=0;i<len;i++)
		ck+=ptr[i];
	return(ck);
}