repo2/atari_chips/pokeyv2/pokeycfg.c @ 1476
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;
|
|
}
|
|||