#include <exec/memory.h>

#include "inc.h"
#include "defs.h"
#include "req_manx_5.c"
#include "zz_pointer.h"

extern int initsing[88];

void ExternToIntern(void);
void InternToExtern(void);
void SwapInternExtern(void);
int TestCard(void);

/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

void ExternToIntern(void)
{
	int chn,i;
	UBYTE buf[10];

	chn=WaitForK1();
	if (chn == -1)
	{
		MyReq("Error: K1 not present",NULL," Ok ");
		goto Ende;
	}

	if (!TestCard()) goto Ende;

	ZZ_POINTER(win);

	for (i=0;i<=2;i++)		/* i=0: Bank 1, i=1: Bank 2, i=2; Multi */
	{
		buf[0]=0xf0;	buf[1]=0x40;	/* externe Bank */
		buf[2]=chn; 	buf[3]=0x01;
		buf[4]=0x00;	buf[5]=0x03;
		buf[6]=0x01;	buf[7]=32*i;
		buf[8]=0xf7;
		PutMidiMsg(source,buf);
		Delay(50);			

		WaitPort(dest->DestPort);
		if (packet = GetMidiPacket(dest)) 
		{
			packet->MidiMsg[6]=0x00;					/* Umwandeln in interne Bank */

			PutMidiStream(source,NULL,packet->MidiMsg[0],packet->Length,packet->Length); /* und zurückschicken */
			Delay(50);
		}
		FreeMidiPacket(packet);		
	}

	Ende: CLEAR_POINTER(win);
}

	
/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

void InternToExtern(void)
{
	int chn,i;
	UBYTE buf[10];

	chn=WaitForK1();
	if (chn == -1)
	{
		MyReq("Error: K1 not present",NULL," Ok ");
		goto Ende;
	}

	if (!TestCard()) goto Ende;

	ZZ_POINTER(win);

	for (i=0;i<=2;i++)		/* i=0: Bank 1, i=1: Bank 2, i=2; Multi */
	{
		buf[0]=0xf0;	buf[1]=0x40;	/* interne Bank */
		buf[2]=chn; 	buf[3]=0x01;
		buf[4]=0x00;	buf[5]=0x03;
		buf[6]=0x00;	buf[7]=32*i;
		buf[8]=0xf7;
		PutMidiMsg(source,buf);
		Delay(50);			

		WaitPort(dest->DestPort);
		if (packet = GetMidiPacket(dest)) 
		{
			packet->MidiMsg[6]=0x01;					/* Umwandeln in interne Bank */
			PutMidiStream(source,NULL,packet->MidiMsg[0],packet->Length,packet->Length); /* und zurückschicken */
			Delay(50);
		}
		FreeMidiPacket(packet);		
	}

	Ende: CLEAR_POINTER(win);
}

/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

void SwapInternExtern(void)
{
	int chn,i;
	UBYTE buf[10];
	struct MidiPacket *packet1,*packet2;

	chn=WaitForK1();
	if (chn == -1)
	{
		MyReq("Error: K1 not present",NULL," Ok ");
		goto Ende;
	}

	if (!TestCard()) goto Ende;

	ZZ_POINTER(win);

	for (i=0;i<=2;i++)		/* i=0: Bank 1, i=1: Bank 2, i=2; Multi */
	{
		buf[0]=0xf0;	buf[1]=0x40;	/* interne Bank */
		buf[2]=chn; 	buf[3]=0x01;
		buf[4]=0x00;	buf[5]=0x03;
		buf[6]=0x00;	buf[7]=32*i;
		buf[8]=0xf7;
		PutMidiMsg(source,buf);
		Delay(50);			

		WaitPort(dest->DestPort);
		packet1 = GetMidiPacket(dest);

		buf[0]=0xf0;	buf[1]=0x40;	/* externe Bank */
		buf[2]=chn; 	buf[3]=0x01;
		buf[4]=0x00;	buf[5]=0x03;
		buf[6]=0x01;	buf[7]=32*i;
		buf[8]=0xf7;
		PutMidiMsg(source,buf);
		Delay(50);			

		WaitPort(dest->DestPort);
		packet2 = GetMidiPacket(dest);

		packet1->MidiMsg[6]=0x01;					/* Umwandeln in externe Bank */
		PutMidiStream(source,NULL,packet->MidiMsg[0],packet1->Length,packet->Length); /* und zurückschicken */
		Delay(50);

		packet2->MidiMsg[6]=0x00;					/* Umwandeln in interne Bank */
		PutMidiStream(source,NULL,packet->MidiMsg[0],packet2->Length,packet->Length);  /* und zurückschicken */
		Delay(50);

		FreeMidiPacket(packet1);		
		FreeMidiPacket(packet2);		
	}

	Ende: CLEAR_POINTER(win);
}

/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

int TestCard(void)
{
	int i,fo;
	unsigned char buf[97];
	char str[100];
	FILE *fp,*fopen();

	fo=creat("ram:k1-bank",0666);
	if (fo != -1)
	{
		buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20; 
		buf[4]=0x00; buf[5]=0x03; buf[6]=0x01; buf[7]=0x01;

		for (i=0;i<=87;i++)	buf[8+i]=initsing[i];    /* Singlessound an externe Card schicken */
		buf[96]=MS_EOX;						  /* und Reaktion abwarten */
		PutMidiMsg(source,buf);
		Delay(50);

		WaitPort(dest->DestPort);
		if (packet = GetMidiPacket(dest)) 
		{
			if (write(fo,packet->MidiMsg,packet->Length) != packet->Length); 
			FreeMidiPacket(packet);
		}
		close(fo);
	}

	fp=fopen("ram:k1-bank","r");
	for (i=0;i<=7;i++) str[i]=fgetc(fp);		/* Error-Code einlesen*/
	fclose(fp);
	DeleteFile("ram:k1-bank");
	
	if (str[3]==0x43)
	{
		MyReq("Sorry, there is no external card",NULL,"Go on");
		return(FALSE);
	}

	if (str[3]==0x42)
	{
		MyReq("Sorry, memory is write protected",NULL,"Go on");
		return(FALSE);
	}

	if (str[3]==0x41)
	{
		MyReq("Sorry, write error on card",NULL,"Go on");
		return(FALSE);
	}

	return(TRUE);
}

