repo2/atari_chips/pokeyv2/pokeycfg.c @ 1463
| 1116 | markw | #include <conio.h>
  | 
      |
#include <stdlib.h>
  | 
      |||
| 1114 | markw | #include <stdio.h>
  | 
      |
| 1116 | markw | #include <unistd.h>
  | 
      |
| 1114 | markw | ||
| 1441 | markw | #ifdef SIDMAX
  | 
      |
unsigned char * sid = (unsigned char *) 0xd400;
  | 
      |||
unsigned char * config = (unsigned char *) 0xd4f0;
  | 
      |||
unsigned char * detect = (unsigned char *) 0xd4fc;
  | 
      |||
#define PRODUCT "Sidmax"
  | 
      |||
unsigned char col1()
  | 
      |||
{
  | 
      |||
	return 0x7;
  | 
      |||
}
  | 
      |||
unsigned char col2()
  | 
      |||
{
  | 
      |||
	return 0x8;
  | 
      |||
}
  | 
      |||
#define MODE_CORE 1
  | 
      |||
#define MODE_SID 2
  | 
      |||
#define MODE_POKEY 3
  | 
      |||
#define MODE_PSG 4
  | 
      |||
#define CORE_MONO 1
  | 
      |||
#define CORE_DIVIDE 2
  | 
      |||
#define CORE_RESTRICT 3
  | 
      |||
#define CORE_PHI 4
  | 
      |||
#define CORE_MAX 4
  | 
      |||
#define CORE_GTIA 101
  | 
      |||
#define CORE_OUTPUT 100
  | 
      |||
#define SID_AUTO 1
  | 
      |||
#define SID_TYPE2 2
  | 
      |||
#define SID_EXT 3
  | 
      |||
#define SID_MAX 3
  | 
      |||
#define SID_TYPE 100
  | 
      |||
#define PRESS_UP 145
  | 
      |||
#define PRESS_DOWN 17
  | 
      |||
#define PRESS_LEFT 157
  | 
      |||
#define PRESS_RIGHT 29
  | 
      |||
#else
  | 
      |||
| 1116 | markw | unsigned char * pokey = (unsigned char *) 0xd200;
  | 
      |
unsigned char * config = (unsigned char *) 0xd210;
  | 
      |||
| 1441 | markw | unsigned char * detect = (unsigned char *) 0xd20c;
  | 
      |
#define PRODUCT "Pokeymax"
  | 
      |||
unsigned char col1()
  | 
      |||
{
  | 
      |||
	return 0x46;
  | 
      |||
}
  | 
      |||
unsigned char col2()
  | 
      |||
{
  | 
      |||
	return 0x34;
  | 
      |||
}
  | 
      |||
#define MODE_CORE 1
  | 
      |||
#define MODE_POKEY 2
  | 
      |||
#define MODE_PSG 3
  | 
      |||
#define MODE_SID 4
  | 
      |||
| 1114 | markw | ||
| 1344 | markw | #define CORE_MONO 1
  | 
      |
#define CORE_DIVIDE 2
  | 
      |||
#define CORE_GTIA 3
  | 
      |||
#define CORE_RESTRICT 4
  | 
      |||
#define CORE_OUTPUT 5
  | 
      |||
#define CORE_PHI 6
  | 
      |||
| 1457 | markw | #define CORE_ADC 7
  | 
      |
#define CORE_SIO_DATA 8
  | 
      |||
#define CORE_MAX 8
  | 
      |||
| 1344 | markw | ||
| 1441 | markw | #define SID_TYPE 1
  | 
      |
#define SID_MAX 1
  | 
      |||
#define SID_TYPE2 100
  | 
      |||
#define SID_AUTO 101
  | 
      |||
#define SID_EXT 102
  | 
      |||
#define PRESS_UP '-'
  | 
      |||
#define PRESS_DOWN '='
  | 
      |||
#define PRESS_LEFT '+'
  | 
      |||
#define PRESS_RIGHT '*'
  | 
      |||
#endif
  | 
      |||
| 1344 | markw | #define POKEY_LINEAR 1
  | 
      |
#define POKEY_CHANNEL_MODE 2
  | 
      |||
#define POKEY_IRQ 3
  | 
      |||
#define POKEY_MAX 3
  | 
      |||
#define PSG_FREQUENCY 1
  | 
      |||
#define PSG_STEREO 2
  | 
      |||
#define PSG_ENVELOPE 3
  | 
      |||
#define PSG_VOLUME 4
  | 
      |||
#define PSG_MAX 4
  | 
      |||
unsigned char mode_maxline(unsigned char mode)
  | 
      |||
{
  | 
      |||
	switch (mode)
  | 
      |||
	{
  | 
      |||
| 1441 | markw | 		case MODE_CORE:
  | 
      |
| 1344 | markw | 			return CORE_MAX;
  | 
      |
| 1441 | markw | 		case MODE_POKEY:
  | 
      |
| 1344 | markw | 			return POKEY_MAX;
  | 
      |
| 1441 | markw | 		case MODE_PSG:
  | 
      |
| 1344 | markw | 			return PSG_MAX;
  | 
      |
| 1441 | markw | 		case MODE_SID:
  | 
      |
| 1344 | markw | 			return SID_MAX;
  | 
      |
	}
  | 
      |||
	return 0;
  | 
      |||
}
  | 
      |||
| 1117 | markw | unsigned char has_flash()
  | 
      |
{
  | 
      |||
	return ((config[1]&0x40) == 0x40);
  | 
      |||
}
  | 
      |||
| 1116 | markw | unsigned long readFlash(unsigned long addr, unsigned char cfgarea)
  | 
      |
| 1114 | markw | {
  | 
      |
	unsigned long res;
  | 
      |||
	unsigned char al;
  | 
      |||
| 1115 | markw | ||
| 1114 | markw | 	addr = addr<<2;
  | 
      |
	al = addr&0xff;
  | 
      |||
	config[13] = al|3;
  | 
      |||
	config[14] = (addr>>8)&0xff;
  | 
      |||
| 1311 | markw | 	config[11] = (((addr>>16)&0x7)<<3)|cfgarea<<2|2|1;
  | 
      |
| 1114 | markw | ||
	res = config[15];
  | 
      |||
	config[13] = al|2;
  | 
      |||
	res = res<<8;
  | 
      |||
	res |= config[15];
  | 
      |||
	config[13] = al|1;
  | 
      |||
	res = res<<8;
  | 
      |||
	res |= config[15];
  | 
      |||
	config[13] = al|0;
  | 
      |||
	res = res<<8;
  | 
      |||
	res |= config[15];
  | 
      |||
	return res;
  | 
      |||
}
  | 
      |||
| 1116 | markw | void writeFlash(unsigned long addr, unsigned char cfgarea, unsigned long data)
  | 
      |
| 1114 | markw | {
  | 
      |
| 1115 | markw | 	unsigned char al;
  | 
      |
| 1114 | markw | ||
| 1115 | markw | 	addr = addr<<2;
  | 
      |
	al = addr&0xff;
  | 
      |||
	config[13] = al|0;
  | 
      |||
	config[14] = (addr>>8)&0xff;
  | 
      |||
	config[15] = data&0xff;
  | 
      |||
	config[13] = al|1;
  | 
      |||
	data = data>>8;
  | 
      |||
	config[15] = data&0xff;
  | 
      |||
	config[13] = al|2;
  | 
      |||
	data = data>>8;
  | 
      |||
	config[15] = data&0xff;
  | 
      |||
	config[13] = al|3;
  | 
      |||
	data = data>>8;
  | 
      |||
	config[15] = data;
  | 
      |||
| 1294 | markw | 	config[11] = (((addr>>16)&0x7)<<3)|cfgarea<<2|2|0;
  | 
      |
| 1115 | markw | }
  | 
      |
| 1116 | markw | //void displayFlash(
  | 
      |
//{
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x0, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x1, 0));
  | 
      |||
//	cprintf("%lx ",eadFlash(config, 0x2, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x3, 0));
  | 
      |||
//	cprintf("\r\n");
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x2000, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x2001, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x2002, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x2003, 0));
  | 
      |||
//	cprintf("\r\n");
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x0, 1));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x1, 1));
  | 
      |||
//	cprintf("\r\n");
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x4000, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x4001, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x4002, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x4003, 0));
  | 
      |||
//	cprintf("\r\n");
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x6000, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x6001, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x6002, 0));
  | 
      |||
//	cprintf("%lx ",readFlash(config, 0x6003, 0));
  | 
      |||
//	cprintf("\r\n");
  | 
      |||
//}
  | 
      |||
| 1114 | markw | ||
| 1116 | markw | void writeFlashContentsToFile()
  | 
      |
| 1115 | markw | {
  | 
      |
	FILE * output;
  | 
      |||
| 1117 | markw | 	unsigned long addr;
  | 
      |
| 1115 | markw | 	unsigned long * buffer = (unsigned long *)malloc(1024);
  | 
      |
| 1114 | markw | 	output = fopen("d3:flash.bin","w");
  | 
      |
	for (addr=0;addr!=0xe600;addr+=256)
  | 
      |||
	{
  | 
      |||
		unsigned short i;
  | 
      |||
		for (i=0;i!=256;++i)
  | 
      |||
| 1116 | markw | 			buffer[i] = readFlash(addr+i,0);
  | 
      |
| 1114 | markw | 		fwrite(&buffer[0],1024,1,output);
  | 
      |
	}
  | 
      |||
	fclose(output);
  | 
      |||
	free(buffer);
  | 
      |||
}
  | 
      |||
| 1116 | markw | void writeProtect(unsigned char onoff)
  | 
      |
| 1115 | markw | {
  | 
      |
| 1116 | markw | 	unsigned long data = readFlash(1, 1);
  | 
      |
| 1115 | markw | 	unsigned long mask = 0x1f;
  | 
      |
| 1311 | markw | 	unsigned long sectormask = 0x00700000;
  | 
      |
	unsigned long pagemask =   0x000fffff;
  | 
      |||
	data = data|sectormask|pagemask; //Spurious erase fix!
  | 
      |||
| 1115 | markw | 	mask = mask << 23;
  | 
      |
	if (onoff)
  | 
      |||
		data = data|mask;
  | 
      |||
	else
  | 
      |||
		data = data&~mask;
  | 
      |||
| 1116 | markw | 	writeFlash(1,1,data);
  | 
      |
| 1115 | markw | }
  | 
      |
| 1116 | markw | void flashContentsFromFile()
  | 
      |
| 1115 | markw | {
  | 
      |
	FILE * input;
  | 
      |||
	unsigned int addr;
  | 
      |||
	unsigned long * buffer = (unsigned long *)malloc(1024);
  | 
      |||
| 1116 | markw | 	writeProtect(0);
  | 
      |
| 1115 | markw | ||
	input = fopen("d3:flash.bin","r");
  | 
      |||
	for (addr=0;addr!=0xe600;addr+=256)
  | 
      |||
	{
  | 
      |||
		unsigned short i;
  | 
      |||
		fread(&buffer[0],1024,1,input);
  | 
      |||
		for (i=0;i!=256;++i)
  | 
      |||
| 1116 | markw | 			writeFlash(addr+i,0,buffer[i]);
  | 
      |
| 1115 | markw | 	}
  | 
      |
	fclose(input);
  | 
      |||
| 1116 | markw | 	writeProtect(1);
  | 
      |
| 1115 | markw | ||
	free(buffer);
  | 
      |||
}
  | 
      |||
| 1311 | markw | int getPageSize()
  | 
      |
{
  | 
      |||
	config[4] = 5; //e.g 114M08QC
  | 
      |||
               //    01234567
  | 
      |||
	return config[4]=='6' ? 1024 : 512; // 16Kb for up to 10M08, then 32Kb for 10M16
  | 
      |||
}
  | 
      |||
| 1116 | markw | void erasePageContainingAddress(unsigned long addr)
  | 
      |
| 1115 | markw | {
  | 
      |
	unsigned long data;
  | 
      |||
| 1311 | markw | 	unsigned long sectormask = 0x00700000;
  | 
      |
	unsigned long pagemask =   0x000fffff;
  | 
      |||
| 1117 | markw | 	unsigned long status;
  | 
      |
| 1115 | markw | ||
| 1116 | markw | 	data = readFlash(1,1);
  | 
      |
| 1311 | markw | 	data = data|sectormask;
  | 
      |
| 1115 | markw | 	data = data&~pagemask;
  | 
      |
| 1311 | markw | 	data = data|addr;
  | 
      |
| 1116 | markw | 	writeFlash(1,1,data);
  | 
      |
| 1115 | markw | ||
| 1117 | markw | 	for(;;)
  | 
      |
	{
  | 
      |||
		status = readFlash(0,1);
  | 
      |||
		if ((status&0x3)==0) break;
  | 
      |||
	}
  | 
      |||
| 1115 | markw | }
  | 
      |
| 1116 | markw | void eraseSector(unsigned char sector)
  | 
      |
| 1115 | markw | {
  | 
      |
	unsigned long data;
  | 
      |||
| 1311 | markw | 	unsigned long sectormask = 0x00700000;
  | 
      |
	unsigned long pagemask =   0x000fffff;
  | 
      |||
| 1117 | markw | 	unsigned long status;
  | 
      |
| 1115 | markw | ||
| 1116 | markw | 	data = readFlash(1,1);
  | 
      |
| 1311 | markw | 	data = data|pagemask;
  | 
      |
| 1115 | markw | 	data = data&~sectormask;
  | 
      |
	data = data|(((unsigned long)sector)<<20);
  | 
      |||
| 1116 | markw | 	writeFlash(1,1,data);
  | 
      |
| 1115 | markw | ||
| 1117 | markw | 	for(;;)
  | 
      |
	{
  | 
      |||
		status = readFlash(0,1);
  | 
      |||
		if ((status&0x3)==0) break;
  | 
      |||
	}
  | 
      |||
| 1115 | markw | }
  | 
      |
| 1344 | markw | void renderLine(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char activeLine, unsigned char line, unsigned char col)
  | 
      |
| 1114 | markw | {
  | 
      |
| 1116 | markw |     unsigned char val;
  | 
      |
    unsigned char i;
  | 
      |||
| 1114 | markw | ||
| 1245 | markw |     gotoxy(0,line+3);
  | 
      |
    val = (*flash1)&0xff;
  | 
      |||
| 1116 | markw | ||
| 1344 | markw |     switch (mode)
  | 
      |
| 1114 | markw |     {
  | 
      |
| 1441 | markw |     case MODE_CORE: // Core
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
| 1245 | markw |         {
  | 
      |
| 1344 | markw |         case CORE_MONO:
  | 
      |
            revers(activeLine==CORE_MONO);
  | 
      |||
            cprintf("Mono support  : %s",((val&16)==16) ? "Play on both channels" : "Left only");
  | 
      |||
            break;
  | 
      |||
        case CORE_DIVIDE:
  | 
      |||
            revers(activeLine==CORE_DIVIDE);
  | 
      |||
            cprintf("Post divide   : ");
  | 
      |||
            val = ((*flash1)>>8)&0xff;
  | 
      |||
            for (i=0;i!=4;++i)
  | 
      |||
            {
  | 
      |||
                    unsigned char pd = (val&0x3);
  | 
      |||
            		switch (pd)
  | 
      |||
            		{
  | 
      |||
            		        case 0:
  | 
      |||
            		    	    pd = 1;
  | 
      |||
            		    	    break;
  | 
      |||
            		        case 1:
  | 
      |||
            		    	    pd = 2;
  | 
      |||
            		    	    break;
  | 
      |||
            		        case 2:
  | 
      |||
            		    	    pd = 4;
  | 
      |||
            		    	    break;
  | 
      |||
            		        case 3:
  | 
      |||
            		    	    pd = 8;
  | 
      |||
            		    	    break;
  | 
      |||
            		}
  | 
      |||
                    revers(activeLine==CORE_DIVIDE && col==i);
  | 
      |||
                    cprintf("%d=%d ",i+1,pd);
  | 
      |||
                    val = val>>2;
  | 
      |||
            }
  | 
      |||
            break;
  | 
      |||
        case CORE_GTIA:
  | 
      |||
            revers(activeLine==CORE_GTIA);
  | 
      |||
            cprintf("GTIA mixing   : ");
  | 
      |||
            val = ((*flash1)>>16)&0xff;
  | 
      |||
            for (i=0;i!=4;++i)
  | 
      |||
            {
  | 
      |||
                    unsigned char pd = (val&0x1);
  | 
      |||
                    revers(activeLine==CORE_GTIA && col==i);
  | 
      |||
                    cprintf("%d=%d ",i+1,pd);
  | 
      |||
                    val = val>>1;
  | 
      |||
            }
  | 
      |||
            break;
  | 
      |||
        case CORE_RESTRICT:
  | 
      |||
            revers(activeLine==CORE_RESTRICT);
  | 
      |||
            val = ((*flash2)>>8)&0x1f;
  | 
      |||
            cprintf("Restrict      : ");
  | 
      |||
            revers(activeLine==CORE_RESTRICT && col==0);
  | 
      |||
            if (val&2)
  | 
      |||
        	    cprintf("quad ");
  | 
      |||
            else if (val&1)
  | 
      |||
        	    cprintf("dual ");
  | 
      |||
            else
  | 
      |||
        	    cprintf("mono ");
  | 
      |||
            revers(activeLine==CORE_RESTRICT && col==1);
  | 
      |||
            if (val&4)
  | 
      |||
        	    cprintf(" sid ");
  | 
      |||
            else
  | 
      |||
        	    cprintf("!sid ");
  | 
      |||
            revers(activeLine==CORE_RESTRICT && col==2);
  | 
      |||
            if (val&8)
  | 
      |||
        	    cprintf(" psg ");
  | 
      |||
            else
  | 
      |||
        	    cprintf("!psg ");
  | 
      |||
            revers(activeLine==CORE_RESTRICT && col==3);
  | 
      |||
            if (val&16)
  | 
      |||
        	    cprintf(" covox");
  | 
      |||
            else
  | 
      |||
        	    cprintf("!covox");
  | 
      |||
    	break;
  | 
      |||
        case CORE_OUTPUT:
  | 
      |||
            revers(activeLine==CORE_OUTPUT);
  | 
      |||
            val = ((*flash2)>>24)&0x1f;
  | 
      |||
            cprintf("Output        : ");
  | 
      |||
            for (i=0;i!=5;++i)
  | 
      |||
            {
  | 
      |||
                    unsigned char pd = (val&0x1);
  | 
      |||
                    revers(activeLine==CORE_OUTPUT && col==i);
  | 
      |||
                    cprintf("%d=%d ",i+1,pd);
  | 
      |||
                    val = val>>1;
  | 
      |||
            }
  | 
      |||
    	break;
  | 
      |||
        case CORE_PHI:
  | 
      |||
            revers(activeLine==CORE_PHI);
  | 
      |||
            cprintf("PHI2->1MHz    : %s",((val&32)==32) ? "PAL (5/9)" : "NTSC (4/7)");
  | 
      |||
    	break;
  | 
      |||
| 1457 | markw | #ifndef SIDMAX
  | 
      |
	case CORE_ADC:
  | 
      |||
            revers(activeLine==CORE_ADC);
  | 
      |||
            val = ((*flash1)>>20)&0x3;
  | 
      |||
	    if (val == 3) val = 4;
  | 
      |||
            cprintf("ADC volume    : %dx",val);
  | 
      |||
	break;
  | 
      |||
	case CORE_SIO_DATA:
  | 
      |||
            revers(activeLine==CORE_SIO_DATA);
  | 
      |||
            val = ((*flash1)>>22)&0x3;
  | 
      |||
	    if (val == 3) val = 4;
  | 
      |||
            cprintf("SIO DATA vol  : %dx",val);
  | 
      |||
	break;
  | 
      |||
#endif
  | 
      |||
| 1245 | markw |         }
  | 
      |
| 1344 | markw |     break;
  | 
      |
| 1441 | markw |     case MODE_POKEY: // pokey
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
| 1245 | markw |         {
  | 
      |
| 1344 | markw |         case POKEY_LINEAR:
  | 
      |
            revers(activeLine==POKEY_LINEAR);
  | 
      |||
            cprintf("Mixing        : %s",((val&1)==1) ? "Non-linear" : "Linear");
  | 
      |||
            break;
  | 
      |||
        case POKEY_CHANNEL_MODE:
  | 
      |||
            revers(activeLine==POKEY_CHANNEL_MODE);
  | 
      |||
            cprintf("Channel mode  : %s",((val&4)==4) ? "On" : "Off");
  | 
      |||
            break;
  | 
      |||
        case POKEY_IRQ:
  | 
      |||
            revers(activeLine==POKEY_IRQ);
  | 
      |||
            cprintf("IRQ           : %s",((val&8)==8) ? "All pokey chips" : "Pokey 1");
  | 
      |||
    	break;
  | 
      |||
	}
  | 
      |||
    break;
  | 
      |||
| 1441 | markw |     case MODE_PSG: // psg
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
| 1245 | markw |         {
  | 
      |
| 1344 | markw |         case PSG_FREQUENCY:
  | 
      |
            val = ((*flash1)>>24)&0xff;
  | 
      |||
            revers(activeLine==PSG_FREQUENCY);
  | 
      |||
            cprintf("PSG frequency : ");
  | 
      |||
            switch (val&3)
  | 
      |||
            {
  | 
      |||
        	case 0:
  | 
      |||
        		cprintf("2MHz");
  | 
      |||
        	    break;
  | 
      |||
        	case 1:
  | 
      |||
        		cprintf("1MHz");
  | 
      |||
        	    break;
  | 
      |||
        	case 2:
  | 
      |||
        		cprintf("PHI2");
  | 
      |||
        	    break;
  | 
      |||
            }
  | 
      |||
            break;
  | 
      |||
        case PSG_STEREO:
  | 
      |||
            val = ((*flash1)>>24)&0xff;
  | 
      |||
            revers(activeLine==PSG_STEREO);
  | 
      |||
            cprintf("PSG stereo    : ");
  | 
      |||
            switch ((val&12)>>2)
  | 
      |||
            {
  | 
      |||
            case 0:
  | 
      |||
                    cprintf("mono   (L:ABC R:ABC)");
  | 
      |||
                    break;
  | 
      |||
            case 1:
  | 
      |||
                    cprintf("polish (L:AB  R:BC )");
  | 
      |||
                    break;
  | 
      |||
            case 2:
  | 
      |||
                    cprintf("czech  (L:AC  R:BC )");
  | 
      |||
                    break;
  | 
      |||
            case 3:
  | 
      |||
                    cprintf("l/r    (L:111 R:222)");
  | 
      |||
                    break;
  | 
      |||
            }
  | 
      |||
    	break;
  | 
      |||
        case PSG_ENVELOPE:
  | 
      |||
            val = ((*flash1)>>24)&0xff;
  | 
      |||
            revers(activeLine==PSG_ENVELOPE);
  | 
      |||
            cprintf("PSG envelope  : ");
  | 
      |||
            if ((val&16)==16)
  | 
      |||
                    cprintf("16 steps");
  | 
      |||
            else
  | 
      |||
                    cprintf("32 steps");
  | 
      |||
            break;
  | 
      |||
        case PSG_VOLUME:
  | 
      |||
            val = ((*flash1)>>24)&0xff;
  | 
      |||
            revers(activeLine==PSG_VOLUME);
  | 
      |||
            cprintf("PSG volume    : ");
  | 
      |||
            if (((val&0x60)>>5)==3)
  | 
      |||
        	    cprintf("Linear");
  | 
      |||
            else
  | 
      |||
        	    cprintf("Log %d",(val>>5)&3);
  | 
      |||
    	break;
  | 
      |||
	}
  | 
      |||
    break;
  | 
      |||
| 1441 | markw |     case MODE_SID: // SID
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
        {
  | 
      |||
| 1441 | markw |         case SID_AUTO:
  | 
      |
            revers(activeLine==SID_AUTO);
  | 
      |||
            val = ((*flash2)>>16)&0x10;
  | 
      |||
            cprintf("SID detect    : ");
  | 
      |||
            revers(activeLine==SID_AUTO);
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("Manual ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x10:
  | 
      |||
                cprintf("Auto   ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
    	break;
  | 
      |||
| 1344 | markw |         case SID_TYPE:
  | 
      |
            revers(activeLine==SID_TYPE);
  | 
      |||
            val = (*flash2)&0x3;
  | 
      |||
            cprintf("SID version   : ");
  | 
      |||
            revers(activeLine==SID_TYPE && col==0);
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
| 1245 | markw |     	case 0:
  | 
      |
| 1344 | markw |             	cprintf("1:8580     ");
  | 
      |
    		break;
  | 
      |||
| 1245 | markw |     	case 1:
  | 
      |
| 1344 | markw |                     cprintf("1:6581     ");
  | 
      |
    		break;
  | 
      |||
| 1245 | markw |     	case 2:
  | 
      |
| 1344 | markw |                     cprintf("1:8580Digi ");
  | 
      |
    		break;
  | 
      |||
    	}
  | 
      |||
            revers(activeLine==SID_TYPE && col==1);
  | 
      |||
            val = (*flash2)&0x30;
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("2:8580     ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x10:
  | 
      |||
                    cprintf("2:6581     ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x20:
  | 
      |||
                    cprintf("2:8580Digi ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
    	break;
  | 
      |||
| 1441 | markw |         case SID_TYPE2:
  | 
      |
            revers(activeLine==SID_TYPE2);
  | 
      |||
            val = (*flash2)&0x1;
  | 
      |||
            cprintf("SID version   : ");
  | 
      |||
            revers(activeLine==SID_TYPE2 && col==0);
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("1:8580     ");
  | 
      |||
    		break;
  | 
      |||
    	case 1:
  | 
      |||
                    cprintf("1:6581     ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
            revers(activeLine==SID_TYPE2 && col==1);
  | 
      |||
            val = (*flash2)&0x10;
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("2:8580     ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x10:
  | 
      |||
                    cprintf("2:6581     ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
    	break;
  | 
      |||
	case SID_EXT:
  | 
      |||
            revers(activeLine==SID_EXT);
  | 
      |||
            val = ((*flash2)>>16)&0x3;
  | 
      |||
            cprintf("SID ext       : ");
  | 
      |||
            revers(activeLine==SID_EXT && col==0);
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("1:GND      ");
  | 
      |||
    		break;
  | 
      |||
    	case 1:
  | 
      |||
            	cprintf("1:Digifix  ");
  | 
      |||
    		break;
  | 
      |||
    	case 2:
  | 
      |||
                cprintf("1:ADC      ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
            revers(activeLine==SID_EXT && col==1);
  | 
      |||
            val = ((*flash2)>>16)&0xc;
  | 
      |||
    	switch(val)
  | 
      |||
    	{
  | 
      |||
    	case 0:
  | 
      |||
            	cprintf("2:GND      ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x4:
  | 
      |||
                cprintf("2:Digifix  ");
  | 
      |||
    		break;
  | 
      |||
    	case 0x8:
  | 
      |||
                cprintf("2:ADC      ");
  | 
      |||
    		break;
  | 
      |||
    	}
  | 
      |||
    	break;
  | 
      |||
| 1287 | markw | 	}
  | 
      |
| 1116 | markw |     }
  | 
      |
| 1245 | markw |     revers(0);
  | 
      |
    *flash2; // silence warning
  | 
      |||
}
  | 
      |||
| 1344 | markw | void render(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char activeLine, unsigned char line, unsigned char col)
  | 
      |
| 1245 | markw | {
  | 
      |
    unsigned char pokeys;
  | 
      |||
    unsigned char val;
  | 
      |||
    unsigned char i;
  | 
      |||
| 1441 | markw | #ifndef SIDMAX
  | 
      |
| 1245 | markw |     unsigned char prev559;
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1245 | markw |     if (line ==255)
  | 
      |
    {
  | 
      |||
| 1441 | markw | #ifndef SIDMAX
  | 
      |
| 1245 | markw | 	    prev559 = *(unsigned char *)559;
  | 
      |
	    *(unsigned char *)559 = 0;
  | 
      |||
| 1441 | markw | #endif
  | 
      |
| 1245 | markw | 	    clrscr();
  | 
      |
	    //textcolor(0xa);
  | 
      |||
	    chline(40);
  | 
      |||
| 1457 | markw | 	    cprintf(PRODUCT " config v1.5 ");
  | 
      |
| 1245 | markw |             cprintf(" Core:");
  | 
      |
            for (i=0;i!=8;++i)
  | 
      |||
            {
  | 
      |||
                    config[4] = i;
  | 
      |||
                    cprintf("%c",config[4]);
  | 
      |||
            }
  | 
      |||
	    gotoxy(0,3);
  | 
      |||
	    chline(40);
  | 
      |||
	    gotoxy(0,17);
  | 
      |||
	    chline(40);
  | 
      |||
	    cprintf("  (A)pply config\r\n");
  | 
      |||
	    if (has_flash())
  | 
      |||
	    {
  | 
      |||
		    cprintf("  (S)tore config\r\n");
  | 
      |||
| 1311 | markw | 		    cprintf("  (U)pdate core/ (V)erify core\r\n");
  | 
      |
| 1245 | markw | 	    }
  | 
      |
	    cprintf("  (Q)uit\r\n");
  | 
      |||
| 1344 | markw | 	    cprintf("Use arrows and enter to change config\r\n");
  | 
      |
	    cprintf("Press space to change section\r\n");
  | 
      |||
| 1245 | markw |     }
  | 
      |
    gotoxy(0,2);
  | 
      |||
| 1199 | markw |     val = ((*flash2)>>8)&0x1f;
  | 
      |
    config[7] = val;
  | 
      |||
| 1116 | markw |     val = config[1];
  | 
      |
    pokeys = val&0x3;
  | 
      |||
    switch (pokeys)
  | 
      |||
    {
  | 
      |||
| 1114 | markw | 	    case 0:
  | 
      |
| 1199 | markw | 		    pokeys = 1;
  | 
      |
| 1114 | markw | 		    break;
  | 
      |
	    case 1:
  | 
      |||
| 1199 | markw | 		    pokeys = 2;
  | 
      |
| 1114 | markw | 		    break;
  | 
      |
	    case 2:
  | 
      |||
| 1199 | markw | 		    pokeys = 4;
  | 
      |
		    break;
  | 
      |||
| 1198 | markw | 	    case 3:
  | 
      |
| 1342 | markw | 		    pokeys = 4;
  | 
      |
| 1114 | markw | 		    break;
  | 
      |
| 1116 | markw |     }
  | 
      |
| 1441 | markw | #ifdef SIDMAX
  | 
      |
    cprintf("Sid:%d pokey:%d psg:%d covox:%d sample:%d",(val&4)==4 ? 2 : 0,pokeys,(val&8)==8 ? 2 : 0,(val&16)==16 ? 1 : 0,(val&32)==32 ? 1 : 0);
  | 
      |||
#else
  | 
      |||
| 1245 | markw |     cprintf("Pokey:%d sid:%d psg:%d covox:%d sample:%d",pokeys,(val&4)==4 ? 2 : 0,(val&8)==8 ? 2 : 0,(val&16)==16 ? 1 : 0,(val&32)==32 ? 1 : 0);
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1116 | markw | ||
| 1344 | markw |     if (line>=254)
  | 
      |
| 1116 | markw |     {
  | 
      |
| 1344 | markw | 	    unsigned char maxline = mode_maxline(mode);
  | 
      |
	    for (line=1;line<=maxline;++line)
  | 
      |||
		    renderLine(flash1,flash2,mode,activeLine, line,col);
  | 
      |||
| 1441 | markw | #ifndef SIDMAX
  | 
      |
| 1245 | markw | 	    *(unsigned char *)559 = prev559;
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1116 | markw |     }
  | 
      |
    else
  | 
      |||
| 1117 | markw |     {
  | 
      |
| 1344 | markw |     	renderLine(flash1,flash2,mode,activeLine, line,col);
  | 
      |
| 1245 | markw |         if (wherex()>15)
  | 
      |
            cclear(40-wherex());
  | 
      |||
| 1117 | markw |     }
  | 
      |
| 1116 | markw | }
  | 
      |
| 1344 | markw | void changeValue(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char line, unsigned char col)
  | 
      |
| 1116 | markw | {
  | 
      |
    unsigned char shift;
  | 
      |||
    unsigned char mask=1;
  | 
      |||
    unsigned char max=1;
  | 
      |||
    unsigned char val;
  | 
      |||
    unsigned long tmp;
  | 
      |||
| 1185 | markw |     unsigned long * flashaddr = flash1;
  | 
      |
| 1116 | markw | ||
| 1344 | markw |     switch(mode)
  | 
      |
| 1116 | markw |     {
  | 
      |
| 1441 | markw |     case MODE_CORE:
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
        {
  | 
      |||
        case CORE_MONO:
  | 
      |||
    	    shift = 4;
  | 
      |||
    	    break;
  | 
      |||
        case CORE_DIVIDE:
  | 
      |||
    	    shift = 8 + (col<<1);
  | 
      |||
    	    mask = 3;
  | 
      |||
    	    max = 3;
  | 
      |||
    	    break;
  | 
      |||
        case CORE_GTIA:
  | 
      |||
    	    shift = 16 + col;
  | 
      |||
    	    break;
  | 
      |||
        case CORE_RESTRICT:
  | 
      |||
            flashaddr = flash2;
  | 
      |||
    	    if (col==0)
  | 
      |||
    	    {
  | 
      |||
    	    	mask = 3;
  | 
      |||
                	shift = 8;
  | 
      |||
    	    	max = 2;
  | 
      |||
    	    }
  | 
      |||
    	    else
  | 
      |||
    	    {
  | 
      |||
    	    	mask = 1;
  | 
      |||
                	shift = 9 + col;
  | 
      |||
    	    	max = 1;
  | 
      |||
    	    }
  | 
      |||
    	    break;
  | 
      |||
        case CORE_OUTPUT:
  | 
      |||
            flashaddr = flash2;
  | 
      |||
    	    shift = 24 + col;
  | 
      |||
    	    break;
  | 
      |||
        case CORE_PHI:
  | 
      |||
    	    shift = 5;
  | 
      |||
    	    break;
  | 
      |||
| 1457 | markw |         case CORE_ADC:
  | 
      |
    	    shift = 20;
  | 
      |||
	    mask = 3;
  | 
      |||
	    max = 3;
  | 
      |||
    	    break;
  | 
      |||
        case CORE_SIO_DATA:
  | 
      |||
    	    shift = 22;
  | 
      |||
	    mask = 3;
  | 
      |||
	    max = 3;
  | 
      |||
    	    break;
  | 
      |||
| 1344 | markw |         }
  | 
      |
        break;
  | 
      |||
| 1441 | markw |     case MODE_POKEY:
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
        {
  | 
      |||
        case POKEY_LINEAR:
  | 
      |||
    	    shift = 0;
  | 
      |||
    	    break;
  | 
      |||
        case POKEY_CHANNEL_MODE:
  | 
      |||
    	    shift = 2;
  | 
      |||
    	    break;
  | 
      |||
        case POKEY_IRQ:
  | 
      |||
    	    shift = 3;
  | 
      |||
    	    break;
  | 
      |||
        }
  | 
      |||
        break;
  | 
      |||
| 1441 | markw |     case MODE_PSG:
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
        {
  | 
      |||
        case PSG_FREQUENCY:
  | 
      |||
    	    mask = 3;
  | 
      |||
                shift = 24;
  | 
      |||
    	    max = 2;
  | 
      |||
    	    break;
  | 
      |||
        case PSG_STEREO:
  | 
      |||
    	    mask = 3;
  | 
      |||
                shift = 26;
  | 
      |||
    	    max = 3;
  | 
      |||
    	    break;
  | 
      |||
        case PSG_ENVELOPE:
  | 
      |||
                shift = 28;
  | 
      |||
    	    break;
  | 
      |||
        case PSG_VOLUME:
  | 
      |||
    	    mask = 3;
  | 
      |||
                shift = 29;
  | 
      |||
    	    max = 3;
  | 
      |||
    	    break;
  | 
      |||
        }
  | 
      |||
        break;
  | 
      |||
| 1441 | markw |     case MODE_SID:
  | 
      |
| 1344 | markw |         switch(line)
  | 
      |
        {
  | 
      |||
| 1441 | markw |         case SID_AUTO:
  | 
      |
                flashaddr = flash2;
  | 
      |||
    	    mask = 1;
  | 
      |||
                shift = 20;
  | 
      |||
    	    max = 1;
  | 
      |||
    	    break;
  | 
      |||
| 1344 | markw |         case SID_TYPE:
  | 
      |
                flashaddr = flash2;
  | 
      |||
    	    mask = 3;
  | 
      |||
                shift = 0 + (col<<2);
  | 
      |||
    	    max = 2;
  | 
      |||
    	    break;
  | 
      |||
| 1441 | markw |         case SID_TYPE2:
  | 
      |
                flashaddr = flash2;
  | 
      |||
    	    mask = 1;
  | 
      |||
                shift = 0 + (col<<2);
  | 
      |||
    	    max = 1;
  | 
      |||
    	    break;
  | 
      |||
        case SID_EXT:
  | 
      |||
                flashaddr = flash2;
  | 
      |||
    	    mask = 3;
  | 
      |||
                shift = 16 + (col<<1);
  | 
      |||
    	    max = 2;
  | 
      |||
    	    break;
  | 
      |||
| 1344 | markw |         }
  | 
      |
        break;
  | 
      |||
| 1116 | markw |     }
  | 
      |
    tmp = mask;
  | 
      |||
    tmp = tmp<<shift;
  | 
      |||
| 1185 | markw |     val = ((*flashaddr)&tmp)>>shift;
  | 
      |
    *flashaddr = (*flashaddr)&~tmp;
  | 
      |||
| 1116 | markw |     val = val+1;
  | 
      |
    if (val>max) val=0;
  | 
      |||
    tmp = val;
  | 
      |||
    tmp = tmp<<shift;
  | 
      |||
| 1185 | markw |     *flashaddr |= tmp;
  | 
      |
| 1116 | markw | }
  | 
      |
| 1117 | markw | void applyConfig(unsigned long flash1, unsigned long flash2)
  | 
      |
{
  | 
      |||
| 1294 | markw |     clrscr();
  | 
      |
| 1441 | markw |     bgcolor(col1());
  | 
      |
| 1294 | markw |     //textcolor(0xa);
  | 
      |
    chline(40);
  | 
      |||
    cprintf("Applying config\r\n");
  | 
      |||
    chline(40);
  | 
      |||
    cprintf("Press Y to confirm\r\n");
  | 
      |||
    while(!kbhit());
  | 
      |||
    if (cgetc()=='y')
  | 
      |||
    {
  | 
      |||
| 1117 | markw | 	config[0] = flash1&0xff;
  | 
      |
	config[2] = (flash1>>8)&0xff;
  | 
      |||
	config[3] = (flash1>>16)&0xff;
  | 
      |||
	config[5] = (flash1>>24)&0xff;
  | 
      |||
| 1245 | markw | ||
	config[6] = flash2&0xff;
  | 
      |||
	config[7] = (flash2>>8)&0xff;
  | 
      |||
| 1441 | markw | 	config[8] = (flash2>>16)&0xff;
  | 
      |
| 1344 | markw | 	config[9] = (flash2>>24)&0xff;
  | 
      |
| 1117 | markw | //	                                   SATURATE_NEXT <= flash_do(0);
  | 
      |
//                                        -- 1 reserved...
  | 
      |||
//                                CHANNEL_MODE_NEXT <= flash_do(2);
  | 
      |||
//                                IRQ_EN_NEXT <= flash_do(3);
  | 
      |||
//                                DETECT_RIGHT_NEXT <= flash_do(4);
  | 
      |||
//                                        -- 5-7 reserved
  | 
      |||
//                                POST_DIVIDE_NEXT <= flash_do(15 downto 8);
  | 
      |||
//                                GTIA_ENABLE_NEXT <= flash_do(19 downto 16);
  | 
      |||
| 1457 | markw | //                                ADC_VOLUME_NEXT <= flash_do_slow(21 downto 20);
  | 
      |
//                                SIO_DATA_VOLUME_NEXT <= flash_do_slow(23 downto 22);
  | 
      |||
| 1117 | markw | //                                PSG_FREQ_NEXT <= flash_do(25 downto 24);
  | 
      |
//                                PSG_STEREOMODE_NEXT <= flash_do(27 downto 26);
  | 
      |||
//                                PSG_ENVELOPE16_NEXT <= flash_do(28);
  | 
      |||
//                                        -- 31 downto 29 reserved
  | 
      |||
| 1294 | markw |     }
  | 
      |
    bgcolor(0x00);
  | 
      |||
| 1117 | markw | }
  | 
      |
| 1116 | markw | void saveConfig(unsigned long flash1, unsigned long flash2)
  | 
      |
{
  | 
      |||
    clrscr();
  | 
      |||
| 1441 | markw |     bgcolor(col1());
  | 
      |
| 1116 | markw |     //textcolor(0xa);
  | 
      |
    chline(40);
  | 
      |||
    cprintf("Saving config\r\n");
  | 
      |||
| 1342 | markw |     cprintf("NB: this does not apply now!\r\n");
  | 
      |
| 1116 | markw |     chline(40);
  | 
      |
    cprintf("Press Y to confirm\r\n");
  | 
      |||
    while(!kbhit());
  | 
      |||
    if (cgetc()=='y')
  | 
      |||
    {
  | 
      |||
| 1296 | markw | 	unsigned int pagesize = getPageSize();
  | 
      |
        unsigned long * buffer = (unsigned long *)malloc(pagesize*4);
  | 
      |||
| 1116 | markw | 	unsigned short i = 0;
  | 
      |
| 1342 | markw | 	unsigned int failCount = 0;
  | 
      |
| 1116 | markw | ||
	cprintf("Backing up page\r\n");
  | 
      |||
| 1296 | markw | 	for (i=2;i!=pagesize;++i)
  | 
      |
| 1116 | markw | 	{
  | 
      |
		buffer[i] = readFlash(i,0);
  | 
      |||
	}
  | 
      |||
| 1117 | markw | 	writeProtect(0);
  | 
      |
| 1342 | markw | 	while (1)
  | 
      |
| 1116 | markw | 	{
  | 
      |
| 1342 | markw | 		unsigned char failed = 0;
  | 
      |
		cprintf("Erasing page\r\n");
  | 
      |||
		erasePageContainingAddress(0);
  | 
      |||
		cprintf("Writing\r\n");
  | 
      |||
		buffer[0] = flash1;
  | 
      |||
		buffer[1] = flash2;
  | 
      |||
		for (i=0;i!=pagesize;++i)
  | 
      |||
		{
  | 
      |||
			writeFlash(i,0,buffer[i]);
  | 
      |||
		}
  | 
      |||
		cprintf("Verifying\r\n");
  | 
      |||
		for (i=0;i!=pagesize;++i)
  | 
      |||
		{
  | 
      |||
			unsigned long val = readFlash(i,0);
  | 
      |||
			if (val!=buffer[i])
  | 
      |||
			{
  | 
      |||
				cprintf("Verify failed at %04x\r\n",i);
  | 
      |||
				cprintf("read:%08x\r\n",val);
  | 
      |||
				cprintf("buffer:%08x\r\n",buffer[i]);
  | 
      |||
				failed = 1;
  | 
      |||
				break;
  | 
      |||
			}
  | 
      |||
		}
  | 
      |||
		if (failed)
  | 
      |||
		{
  | 
      |||
			cprintf("Verify FAILED\r\n");
  | 
      |||
			cprintf("Press key to retry or q to give up\r\n");
  | 
      |||
	        	while(!kbhit());
  | 
      |||
    			if (cgetc()=='q')
  | 
      |||
				break;
  | 
      |||
		}
  | 
      |||
		else
  | 
      |||
		{
  | 
      |||
			cprintf("Verify pass\r\n");
  | 
      |||
			cprintf("Press key to continue\r\n");
  | 
      |||
	        	while(!kbhit());
  | 
      |||
			cgetc();
  | 
      |||
			break;
  | 
      |||
		}
  | 
      |||
| 1116 | markw | 	}
  | 
      |
| 1117 | markw | 	writeProtect(1);
  | 
      |
| 1116 | markw | ||
        free(buffer);
  | 
      |||
    }
  | 
      |||
    bgcolor(0x00);
  | 
      |||
}
  | 
      |||
void updateCore()
  | 
      |||
{
  | 
      |||
    unsigned long flash1 = readFlash(0,0);
  | 
      |||
    unsigned long flash2 = readFlash(1,0); //unused for now
  | 
      |||
| 1441 | markw | #ifdef SIDMAX
  | 
      |
    char filename[] = "core.bin";
  | 
      |||
#else
  | 
      |||
| 1309 | markw |     char filename[] = "d4:core.bin";
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1116 | markw | ||
    clrscr();
  | 
      |||
| 1441 | markw |     bgcolor(col2());
  | 
      |
| 1116 | markw |     //textcolor(0xa);
  | 
      |
    chline(40);
  | 
      |||
    cprintf("Updating core\r\n");
  | 
      |||
    chline(40);
  | 
      |||
| 1441 | markw | #ifdef SIDMAX
  | 
      |
    cprintf("Please insert core.bin into drive\r\n");
  | 
      |||
#else
  | 
      |||
| 1117 | markw |     cprintf("Please insert core.bin into D4\r\n");
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1117 | markw |     cprintf("Press Y to confirm core update\r\n");
  | 
      |
| 1116 | markw |     while(!kbhit());
  | 
      |
    if (cgetc()=='y')
  | 
      |||
    {
  | 
      |||
| 1441 | markw |     	FILE * input = fopen(filename,"rb");
  | 
      |
| 1116 | markw |     	if (!input)
  | 
      |
    	{
  | 
      |||
| 1441 | markw |     		cprintf("Failed to open %s!\r\n",filename);
  | 
      |
| 1117 | markw |     		sleep(3);
  | 
      |
| 1116 | markw |     	}
  | 
      |
    	else
  | 
      |||
    	{
  | 
      |||
	    unsigned char version[8];
  | 
      |||
	    unsigned char valid;
  | 
      |||
| 1294 | markw | 	    unsigned char i,j;
  | 
      |
| 1116 | markw | ||
| 1117 | markw | 	    cprintf("\r\n");
  | 
      |
            chline(40);
  | 
      |||
            cprintf("DO NOT TURN OFF THE COMPUTER\r\n");
  | 
      |||
            chline(40);
  | 
      |||
	    cprintf("\r\n");
  | 
      |||
| 1116 | markw | 	    cprintf("File opened\r\n");
  | 
      |
	    fread(&version[0],8,1,input);
  | 
      |||
| 1117 | markw | 	    // Verify validity!
  | 
      |
| 1233 | markw | 	    valid = 1;
  | 
      |
| 1117 | markw |   	    for (i=3;i!=8;++i)
  | 
      |
| 1116 | markw |   	    {
  | 
      |
  	            config[4] = i;
  | 
      |||
                    if (config[4]!=version[i])
  | 
      |||
	            {
  | 
      |||
| 1233 | markw | 			  valid = 0;
  | 
      |
| 1294 | markw | ||
	          	  cprintf("Invalid core\r\n");
  | 
      |||
			  cprintf("Current:");
  | 
      |||
			  for (j=0;j!=8;++j)
  | 
      |||
			  {
  | 
      |||
				  config[4] = j;
  | 
      |||
				  cprintf("%c",config[4]);
  | 
      |||
			  }
  | 
      |||
			  cprintf("\r\nFile   :");
  | 
      |||
			  for (j=0;j!=8;++j)
  | 
      |||
				  cprintf("%c",version[j]);
  | 
      |||
			  config[4] = 5;
  | 
      |||
			  if (config[4] == version[5])
  | 
      |||
			  {
  | 
      |||
			  	cprintf("\r\nPress any key to quit or f to force\r\n");
  | 
      |||
    			  	if (cgetc()=='f')
  | 
      |||
			  	{
  | 
      |||
			  	        cprintf("FORCED!\r\n");
  | 
      |||
					cprintf("You may need to change wiring!\r\n");
  | 
      |||
			  	        valid = 1;
  | 
      |||
			  	}
  | 
      |||
			  }
  | 
      |||
			  else
  | 
      |||
			  {
  | 
      |||
			  	cprintf("\r\nCore is for a different FPGA!\r\n");
  | 
      |||
			  	cprintf("Press any key to quit\r\n");
  | 
      |||
                                cgetc();
  | 
      |||
			  }
  | 
      |||
| 1116 | markw | 	          	  break;
  | 
      |
	            }
  | 
      |||
  	    }
  | 
      |||
	    if (valid)
  | 
      |||
	    {
  | 
      |||
| 1117 | markw | 	    	//fseek(input,0,SEEK_SET);
  | 
      |
	        fclose(input);
  | 
      |||
| 1309 | markw | 		input = fopen(filename,"r");
  | 
      |
| 1116 | markw | ||
	    	cprintf("Erasing");
  | 
      |||
| 1448 | markw | 	    	writeProtect(0);
  | 
      |
| 1116 | markw | 	    	eraseSector(1);
  | 
      |
	    	cputc('.');
  | 
      |||
| 1448 | markw | 	    	writeProtect(0);
  | 
      |
| 1116 | markw | 	    	eraseSector(2);
  | 
      |
	    	cputc('.');
  | 
      |||
| 1448 | markw | 	    	writeProtect(0);
  | 
      |
| 1116 | markw | 	    	eraseSector(3);
  | 
      |
	    	cputc('.');
  | 
      |||
| 1448 | markw | 	    	writeProtect(0);
  | 
      |
| 1116 | markw | 	    	eraseSector(4);
  | 
      |
	    	cprintf(" Done\r\n");
  | 
      |||
| 1126 | markw | 		config[4] = 5; //e.g 114M08QC
  | 
      |
		               //    01234567
  | 
      |||
| 1294 | markw | 		j = config[4];
  | 
      |
		config[4] = 4;
  | 
      |||
	    	cprintf("Flashing M%c%c... please wait",config[4],j);
  | 
      |||
| 1448 | markw | 	    	writeProtect(0);
  | 
      |
| 1116 | markw | 	    	{
  | 
      |
| 1117 | markw | 	    	    unsigned long addr;
  | 
      |
| 1126 | markw | 	    	    unsigned long maxaddr;
  | 
      |
| 1116 | markw | 	    	    unsigned long * buffer = (unsigned long *)malloc(1024);
  | 
      |
		    unsigned char t=0;
  | 
      |||
| 1300 | markw |                     config[4] = 5;
  | 
      |
| 1294 | markw | 		    maxaddr = config[4]=='4' ? 0xd600 : config[4]=='8' ? 0xe600 : 0x19800; // d600 for m04, e600 for m08. Default to 08 so DEVELPR works
  | 
      |
| 1126 | markw | ||
	    	    for (addr=0;addr!=maxaddr;addr+=256)
  | 
      |||
| 1116 | markw | 	    	    {
  | 
      |
| 1117 | markw | 	    	    	unsigned long i;
  | 
      |
| 1116 | markw | 			gotoxy(0,20);
  | 
      |
| 1294 | markw | 			cprintf("%c  %d/%d      ",(t ? '/' : '\\'),(unsigned short)(1+(addr>>8)),(unsigned short)(maxaddr>>8));
  | 
      |
| 1116 | markw | 			t = !t;
  | 
      |
| 1309 | markw | 	    	    	i = fread(&buffer[0],1024,1,input);
  | 
      |
			if (i!=1)
  | 
      |||
			{
  | 
      |||
				cprintf("\r\nError reading disk!\r\n");
  | 
      |||
				cprintf("Press key then START AGAIN!\r\n");
  | 
      |||
				fclose(input);
  | 
      |||
| 1448 | markw |                                 writeProtect(1);
  | 
      |
| 1309 | markw |     				while(!kbhit());
  | 
      |
				return;
  | 
      |||
			}
  | 
      |||
| 1116 | markw | 	    	    	if (addr==0)
  | 
      |
	    	    	{
  | 
      |||
				// keep our config...
  | 
      |||
	    	    		buffer[0] = flash1;
  | 
      |||
	    	    		buffer[1] = flash2;
  | 
      |||
	    	    	}
  | 
      |||
| 1117 | markw | 	    	    	for (i=0;i!=256;++i)
  | 
      |
| 1116 | markw | 			{
  | 
      |
| 1309 | markw | 				if (buffer[i]!=0xffffffff)
  | 
      |
				{
  | 
      |||
					bordercolor(i);
  | 
      |||
		    	    		writeFlash(addr+i,0,buffer[i]);
  | 
      |||
				}
  | 
      |||
| 1116 | markw | 			}
  | 
      |
	    	    }
  | 
      |||
	    	    writeProtect(1);
  | 
      |||
	    	    free(buffer);
  | 
      |||
	    	}
  | 
      |||
| 1114 | markw | 	    }
  | 
      |
| 1116 | markw |     	}
  | 
      |
    	fclose(input);
  | 
      |||
    }
  | 
      |||
    bgcolor(0x00);
  | 
      |||
| 1117 | markw |     bordercolor(0x00);
  | 
      |
    //writeFlashContentsToFile();
  | 
      |||
| 1116 | markw | }
  | 
      |
| 1114 | markw | ||
| 1311 | markw | void verifyCore()
  | 
      |
{
  | 
      |||
    unsigned long flash1 = readFlash(0,0);
  | 
      |||
    unsigned long flash2 = readFlash(1,0); //unused for now
  | 
      |||
| 1441 | markw | #ifdef SIDMAX
  | 
      |
    char filename[] = "core.bin";
  | 
      |||
#else
  | 
      |||
| 1311 | markw |     char filename[] = "d4:core.bin";
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1311 | markw | ||
    clrscr();
  | 
      |||
| 1441 | markw |     bgcolor(col2());
  | 
      |
| 1311 | markw |     //textcolor(0xa);
  | 
      |
    chline(40);
  | 
      |||
    cprintf("Verifying core\r\n");
  | 
      |||
    chline(40);
  | 
      |||
| 1441 | markw | #ifdef SIDMAX
  | 
      |
    cprintf("Please insert core.bin into drive\r\n");
  | 
      |||
#else
  | 
      |||
| 1311 | markw |     cprintf("Please insert core.bin into D4\r\n");
  | 
      |
| 1441 | markw | #endif
  | 
      |
| 1311 | markw |     cprintf("Press Y to confirm core verify\r\n");
  | 
      |
    while(!kbhit());
  | 
      |||
    if (cgetc()=='y')
  | 
      |||
    {
  | 
      |||
| 1441 | markw |     	FILE * input = fopen(filename,"rb");
  | 
      |
| 1311 | markw | 	int j;
  | 
      |
    	unsigned long addr;
  | 
      |||
    	unsigned long maxaddr;
  | 
      |||
    	unsigned long * buffer = (unsigned long *)malloc(1024);
  | 
      |||
	unsigned char t=0;
  | 
      |||
    	if (!input)
  | 
      |||
    	{
  | 
      |||
    		cprintf("Failed to open file!\r\n");
  | 
      |||
    		sleep(3);
  | 
      |||
    	}
  | 
      |||
    	//fseek(input,0,SEEK_SET);
  | 
      |||
        fclose(input);
  | 
      |||
	input = fopen(filename,"r");
  | 
      |||
	config[4] = 5; //e.g 114M08QC
  | 
      |||
	               //    01234567
  | 
      |||
	j = config[4];
  | 
      |||
	config[4] = 4;
  | 
      |||
    	cprintf("Verifying M%c%c... please wait",config[4],j);
  | 
      |||
        config[4] = 5;
  | 
      |||
	maxaddr = config[4]=='4' ? 0xd600 : config[4]=='8' ? 0xe600 : 0x19800; // d600 for m04, e600 for m08. Default to 08 so DEVELPR works
  | 
      |||
    	for (addr=0;addr!=maxaddr;addr+=256)
  | 
      |||
    	{
  | 
      |||
    	    unsigned long i;
  | 
      |||
	    gotoxy(0,20);
  | 
      |||
	    cprintf("%c  %d/%d      ",(t ? '/' : '\\'),(unsigned short)(1+(addr>>8)),(unsigned short)(maxaddr>>8));
  | 
      |||
	    t = !t;
  | 
      |||
            i = fread(&buffer[0],1024,1,input);
  | 
      |||
	    if (i!=1)
  | 
      |||
	    {
  | 
      |||
	    	cprintf("\r\nError reading disk!\r\n");
  | 
      |||
	    	cprintf("Press key then START AGAIN!\r\n");
  | 
      |||
	    	fclose(input);
  | 
      |||
	    	while(!kbhit());
  | 
      |||
   		bgcolor(0x00);
  | 
      |||
		bordercolor(0x00);
  | 
      |||
	    	return;
  | 
      |||
	    }
  | 
      |||
            if (addr==0)
  | 
      |||
            {
  | 
      |||
            // keep our config...
  | 
      |||
            	buffer[0] = flash1;
  | 
      |||
            	buffer[1] = flash2;
  | 
      |||
            }
  | 
      |||
            for (i=0;i!=256;++i)
  | 
      |||
	    {
  | 
      |||
		unsigned long val;
  | 
      |||
                bordercolor(i);
  | 
      |||
		val = readFlash(addr+i,0);
  | 
      |||
		if (val!=buffer[i])
  | 
      |||
		{
  | 
      |||
	    		cprintf("\r\nError at address %08lx\r\n",addr+i);
  | 
      |||
			cprintf("disk:%08lx flash:%08lx\r\n",buffer[i],val);
  | 
      |||
	    		cprintf("Press key to continue\r\n");
  | 
      |||
	    		fclose(input);
  | 
      |||
	    		while(!kbhit());
  | 
      |||
	    		return;
  | 
      |||
		}
  | 
      |||
	    }
  | 
      |||
    	}
  | 
      |||
    	free(buffer);
  | 
      |||
    	fclose(input);
  | 
      |||
    }
  | 
      |||
    bgcolor(0x00);
  | 
      |||
    bordercolor(0x00);
  | 
      |||
    //writeFlashContentsToFile();
  | 
      |||
}
  | 
      |||
| 1116 | markw | int main (void)
  | 
      |
{
  | 
      |||
| 1309 | markw |     unsigned int i;
  | 
      |
| 1245 | markw |     unsigned char prevline,line,col,quit;
  | 
      |
| 1116 | markw |     unsigned long flash1;
  | 
      |
    unsigned long flash2;
  | 
      |||
| 1245 | markw |     unsigned char origbg;
  | 
      |
    unsigned char origbord;
  | 
      |||
| 1344 | markw |     unsigned char mode = 1;
  | 
      |
| 1441 | markw |     if (*detect != 1)
  | 
      |
| 1116 | markw |     {
  | 
      |
| 1441 | markw | 	    cprintf(PRODUCT " not found!");
  | 
      |
| 1116 | markw | 	    sleep(5);
  | 
      |
	    return -1;
  | 
      |||
    }
  | 
      |||
| 1245 | markw |     origbg = bgcolor(0);
  | 
      |
    origbord = bordercolor(0);
  | 
      |||
| 1116 | markw | ||
| 1441 | markw |     *detect = 0x3f; // select config area
  | 
      |
| 1116 | markw | ||
    // We have just 8 bytes of data for config
  | 
      |||
| 1135 | markw |     flash1 = 0; //readFlash(0,0);
  | 
      |
    flash2 = 0; //readFlash(1,0); //unused for now
  | 
      |||
| 1116 | markw | ||
| 1135 | markw |     flash1 =
  | 
      |
	    (((unsigned long)config[5])<<24) |
  | 
      |||
	    (((unsigned long)config[3])<<16) |
  | 
      |||
	    (((unsigned long)config[2])<<8) |
  | 
      |||
	    (((unsigned long)config[0]));
  | 
      |||
| 1188 | markw |     flash2 =
  | 
      |
| 1344 | markw | 	    (((unsigned long) config[9])<<24) |
  | 
      |
| 1198 | markw | 	    (((unsigned long) config[7])<<8) |
  | 
      |
| 1188 | markw | 	    ((unsigned long) config[6]);
  | 
      |
| 1135 | markw | ||
| 1245 | markw |     prevline = 255;
  | 
      |
| 1116 | markw |     line = 1;
  | 
      |
    col = 0;
  | 
      |||
    quit = 0;
  | 
      |||
    while (!quit)
  | 
      |||
    {
  | 
      |||
| 1344 | markw | 	unsigned max_line = mode_maxline(mode);
  | 
      |
        render(&flash1,&flash2,mode,line,prevline,col);
  | 
      |||
        render(&flash1,&flash2,mode,line,line,col);
  | 
      |||
| 1116 | markw | ||
| 1245 | markw | 	prevline=line;
  | 
      |
| 1116 | markw | 	while (!kbhit());
  | 
      |
        switch (cgetc())
  | 
      |||
	{
  | 
      |||
| 1344 | markw | 	case ' ':
  | 
      |
		mode = mode+1;
  | 
      |||
		if (mode==5) mode = 1;
  | 
      |||
		line = 1;
  | 
      |||
		col = 0;
  | 
      |||
		prevline=255;
  | 
      |||
		break;
  | 
      |||
| 1441 | markw |         case PRESS_UP:
  | 
      |
| 1116 | markw | 		if (line>1)
  | 
      |
		    line = line-1;
  | 
      |||
		col = 0;
  | 
      |||
		break;
  | 
      |||
| 1441 | markw |         case PRESS_DOWN:
  | 
      |
| 1344 | markw | 		if (line<max_line)
  | 
      |
| 1116 | markw | 		    line = line+1;
  | 
      |
		col = 0;
  | 
      |||
		break;
  | 
      |||
| 1441 | markw |         case PRESS_LEFT:
  | 
      |
| 1116 | markw | 		if (col>0)
  | 
      |
			col =col-1;
  | 
      |||
		break;
  | 
      |||
| 1441 | markw |         case PRESS_RIGHT:
  | 
      |
| 1198 | markw | 		col =col+1;
  | 
      |
| 1344 | markw |     		if (mode==4 && line==SID_TYPE)
  | 
      |
| 1198 | markw | 		{
  | 
      |
			if (col>1)
  | 
      |||
				col =1;
  | 
      |||
		}
  | 
      |||
| 1344 | markw | 		else if (mode==1 && line==CORE_OUTPUT)
  | 
      |
		{
  | 
      |||
			if (col>4)
  | 
      |||
				col =4;
  | 
      |||
		}
  | 
      |||
| 1198 | markw | 		else
  | 
      |
		{
  | 
      |||
			if (col>3)
  | 
      |||
				col =3;
  | 
      |||
		}
  | 
      |||
| 1116 | markw | 		break;
  | 
      |
        case CH_ENTER:
  | 
      |||
| 1344 | markw | 		changeValue(&flash1,&flash2,mode,line,col);
  | 
      |
| 1116 | markw | 		break;
  | 
      |
| 1117 | markw |         case 'a':
  | 
      |
		// Apply config
  | 
      |||
		applyConfig(flash1,flash2);
  | 
      |||
| 1294 | markw |     		prevline = 255;
  | 
      |
| 1117 | markw | 		break;
  | 
      |
| 1116 | markw |         case 's':
  | 
      |
		// Save config
  | 
      |||
| 1117 | markw |                 if (has_flash()) saveConfig(flash1,flash2);
  | 
      |
| 1294 | markw |     		prevline = 255;
  | 
      |
| 1116 | markw | 		break;
  | 
      |
        case 'u':
  | 
      |||
		// Update core
  | 
      |||
| 1117 | markw |                 if (has_flash()) updateCore();
  | 
      |
| 1294 | markw |     		prevline = 255;
  | 
      |
| 1116 | markw | 		break;
  | 
      |
| 1311 | markw | 	case 'v':
  | 
      |
		// Verify core
  | 
      |||
		if (has_flash()) verifyCore();
  | 
      |||
		prevline = 255;
  | 
      |||
		break;
  | 
      |||
| 1116 | markw |         case 'q':
  | 
      |
| 1245 | markw | 		clrscr();
  | 
      |
| 1116 | markw | 		quit = 1;
  | 
      |
		break;
  | 
      |||
| 1309 | markw |         case 'x':
  | 
      |
		clrscr();
  | 
      |||
		cprintf("Hex dump of flash from 0x400\r\n");
  | 
      |||
		for (i=0;i!=64;++i)
  | 
      |||
		{
  | 
      |||
			unsigned long val = readFlash(i+0x400, 0);
  | 
      |||
			cprintf("%08lx",val);
  | 
      |||
		}
  | 
      |||
		while (!kbhit());
  | 
      |||
    		prevline = 255;
  | 
      |||
		break;
  | 
      |||
| 1116 | markw |         }
  | 
      |
    }
  | 
      |||
/*	    displayFlash(config);
  | 
      |||
| 1115 | markw | 	    //writeFlashContentsToFile(config);
  | 
      |
	    //erasePageContainingAddress(config,0x0);
  | 
      |||
	    eraseSector(config,1);
  | 
      |||
	    eraseSector(config,2);
  | 
      |||
	    eraseSector(config,3);
  | 
      |||
	    eraseSector(config,4);
  | 
      |||
	    displayFlash(config);
  | 
      |||
	    flashContentsFromFile(config);
  | 
      |||
| 1116 | markw | 	    displayFlash(config);*/
  | 
      |
| 1114 | markw | ||
| 1441 | markw |     *detect = 0x0; // deselect config area
  | 
      |
| 1245 | markw |     bgcolor(origbg);
  | 
      |
    bordercolor(origbord);
  | 
      |||
| 1114 | markw |     return EXIT_SUCCESS;
  | 
      |
}
  | 
      |||