
/*************************************************************************
**
** o5_Disk.c
** Copyright (c) 1995,1996 Daniel Kahlin <tlr@stacken.kth.se>
**
** Commands: WRITEDISK, WRITEZIP, READDISK, READZIP
**
** NOT MACHINE DEPENDENT
**
******/

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>
#include <ctype.h>

#include "Main_rev.h"

#include "Main.h"
#include "Block.h"
#include "Protocol.h"
#include "Convert.h"
#include "cbm.h"

#include "mach.h"

#define WD_TEMPLATE "FROM/A,DEVICE/N,DEBUG/S"

struct wd_args {
	UBYTE *as_from;
	ULONG *as_device;
	ULONG as_debug;
};

#define WZ_TEMPLATE "FROM/A,DEVICE/N,DEBUG/S"

struct wz_args {
	UBYTE *as_from;
	ULONG *as_device;
	ULONG as_debug;
};

#define RD_TEMPLATE "TO/A,DEVICE/N,DEBUG/S"

struct rd_args {
	UBYTE *as_to;
	ULONG *as_device;
	ULONG as_debug;
};

#define RZ_TEMPLATE "TO/A,DEVICE/N,DEBUG/S"

struct rz_args {
	UBYTE *as_to;
	ULONG *as_device;
	ULONG as_debug;
};

struct rd_args rd_argarray;
struct wd_args wd_argarray;
struct rz_args rz_argarray;
struct wz_args wz_argarray;


void readdisk(char *inbuffer,int device);
void writedisk(char *inbuffer,int device);

/*************************************************************************
**
** WRITEDISK
**
******/
void o5_WriteDisk(char *myparams)
{
	UBYTE *inbuffer=NULL;
	char *filename;
	ULONG	len;
	int device;

	if (!(mach_rdargs(WD_TEMPLATE,(LONG *)&wd_argarray,myparams)))
		panic("error in args");
	if (wd_argarray.as_debug)
		debug=DBG_FULL;

	filename=wd_argarray.as_from;

	inbuffer=LoadFile(filename);
	len=jsize(inbuffer);
	if (len!=174848)
		panic("wrong size of diskimage %d",len);


	device=o5config.device;
	if (wd_argarray.as_device)
		device=*(wd_argarray.as_device);

	writedisk(inbuffer,device);


	printf("Ok!\n");
}



/*************************************************************************
**
** WRITEZIP
**
******/
void o5_WriteZip(char *myparams)
{
	UBYTE *inbuffer=NULL;
	char *fromname;
	char *filename;
	char path[MACH_PATHLEN];
	ULONG	len;
	int device;

	if (!(mach_rdargs(WZ_TEMPLATE,(LONG *)&wz_argarray,myparams)))
		panic("error in args");
	if (wz_argarray.as_debug)
		debug=DBG_FULL;

	fromname=wz_argarray.as_from;


	filename=mach_getpath(fromname,path,MACH_PATHLEN);
	
/* if name begins with "<1,2,3,4>!" skip the first two chars */
	if (strlen(filename)>2) {
		if ((*(filename+1)=='!') && (*(filename)>='1') && (*(filename)<='4')) { 
			filename+=2;
		}
	}


	len=174848;
	if (!(inbuffer=jalloc(len)))
		panic("no mem");

	printf("unzipping...\n");
	dounzip(filename,path,inbuffer);

	device=o5config.device;
	if (wz_argarray.as_device)
		device=*(wz_argarray.as_device);

	writedisk(inbuffer,device);
	/*SaveFile(filename,inbuffer,len);*/

}



/*************************************************************************
**
** READDISK
**
******/
void o5_ReadDisk(char *myparams)
{
	UBYTE *inbuffer=NULL;
	char *filename;
	ULONG	len;
	int device;

	if (!(mach_rdargs(RD_TEMPLATE,(LONG *)&rd_argarray,myparams)))
		panic("error in args");
	if (rd_argarray.as_debug)
		debug=DBG_FULL;

	filename=rd_argarray.as_to;

	len=174848;
	if (!(inbuffer=jalloc(len)))
		panic("no mem");

	device=o5config.device;
	if (rd_argarray.as_device)
		device=*(rd_argarray.as_device);

	readdisk(inbuffer,device);


	SaveFile(filename,inbuffer,len);
	printf("Ok!\n");
}


/*************************************************************************
**
** READZIP
**
******/
void o5_ReadZip(char *myparams)
{
	UBYTE *inbuffer=NULL;
	char *fromname;
	char *filename;
	char path[MACH_PATHLEN];
	ULONG	len;
	int device;

	if (!(mach_rdargs(RZ_TEMPLATE,(LONG *)&rz_argarray,myparams)))
		panic("error in args");
	if (rz_argarray.as_debug)
		debug=DBG_FULL;

	fromname=rz_argarray.as_to;

	len=174848;
	if (!(inbuffer=jalloc(len)))
		panic("no mem");

	device=o5config.device;
	if (rz_argarray.as_device)
		device=*(rz_argarray.as_device);


	filename=mach_getpath(fromname,path,MACH_PATHLEN);
	
/* if name begins with "<1,2,3,4>!" skip the first two chars */
	if (strlen(filename)>2) {
		if ((*(filename+1)=='!') && (*(filename)>='1') && (*(filename)<='4')) { 
			filename+=2;
		}
	}


	readdisk(inbuffer,device);

	printf("zipping...\n");
	dozip(filename,path,inbuffer);

	printf("Ok!\n");
}




/*************************************************************************
**
** writedisk
**
******/
void writedisk(char *inbuffer,int device)
{
	UBYTE *buffer=NULL;
	ULONG blen=NULL;
	char name[64];

	char *ptr;
	int track, numtracks;

	track=1;
	numtracks=5;
	ptr=inbuffer;
	while (track<=35) {
		if (((track+numtracks-1))>35) {
			numtracks=35-track+1;
		} 
		printf("writing %d-%d\n",track,track+numtracks-1);
		ptr=bl_sendtrack(track,numtracks,ptr,device);
		track+=numtracks;
	}

	bl_recvstatus(&buffer,&blen,device);
	petscii2str(buffer,&name[0],sizeof(name));
	printf("diskstatus: %s\n",&name[0]);
}

/*************************************************************************
**
** readdisk
**
******/
void readdisk(char *inbuffer,int device)
{
	UBYTE *buffer=NULL;
	ULONG blen=NULL;
	char name[64];

	char *ptr;
	int track, numtracks;

	track=1;
	numtracks=5;
	ptr=inbuffer;
	while (track<=35) {
		if (((track+numtracks-1))>35) {
			numtracks=35-track+1;
		} 
		printf("reading %d-%d\n",track,track+numtracks-1);
		ptr=bl_recvtrack(track,numtracks,ptr,device);
		track+=numtracks;
	}

	bl_recvstatus(&buffer,&blen,device);
	petscii2str(buffer,&name[0],sizeof(name));
	printf("diskstatus: %s\n",&name[0]);
}
