Revision 1344
Added by markw almost 4 years ago
atari_chips/pokeyv2/init.c | ||
---|---|---|
buffer[5] = 0xff; // enable_all
|
||
|
||
buffer[6] = 0x10; // enable_all
|
||
buffer[7] = 0xff; // enable_all
|
||
|
||
// 0x80(0x200 8-bit) adpcm step table - 90
|
||
for (i=0x0; i!=89; ++i)
|
atari_chips/pokeyv2/pokeycfg.c | ||
---|---|---|
unsigned char * pokey = (unsigned char *) 0xd200;
|
||
unsigned char * config = (unsigned char *) 0xd210;
|
||
|
||
#define CORE_MONO 1
|
||
#define CORE_DIVIDE 2
|
||
#define CORE_GTIA 3
|
||
#define CORE_RESTRICT 4
|
||
#define CORE_OUTPUT 5
|
||
#define CORE_PHI 6
|
||
#define CORE_MAX 6
|
||
|
||
#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
|
||
|
||
#define SID_TYPE 1
|
||
#define SID_MAX 1
|
||
|
||
unsigned char mode_maxline(unsigned char mode)
|
||
{
|
||
switch (mode)
|
||
{
|
||
case 1:
|
||
return CORE_MAX;
|
||
case 2:
|
||
return POKEY_MAX;
|
||
case 3:
|
||
return PSG_MAX;
|
||
case 4:
|
||
return SID_MAX;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
unsigned char has_flash()
|
||
{
|
||
return ((config[1]&0x40) == 0x40);
|
||
... | ... | |
}
|
||
}
|
||
|
||
void renderLine(unsigned long * flash1, unsigned long * flash2, unsigned char activeLine, unsigned char line, unsigned char col)
|
||
void renderLine(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char activeLine, unsigned char line, unsigned char col)
|
||
{
|
||
unsigned char val;
|
||
unsigned char i;
|
||
... | ... | |
gotoxy(0,line+3);
|
||
val = (*flash1)&0xff;
|
||
|
||
switch(line)
|
||
switch (mode)
|
||
{
|
||
case 1:
|
||
revers(activeLine==1);
|
||
cprintf("Mixing : %s",((val&1)==1) ? "Non-linear" : "Linear");
|
||
break;
|
||
case 2:
|
||
revers(activeLine==2);
|
||
cprintf("Channel mode : %s",((val&4)==4) ? "On" : "Off");
|
||
break;
|
||
case 3:
|
||
revers(activeLine==3);
|
||
cprintf("IRQ : %s",((val&8)==8) ? "All pokey chips" : "Pokey 1");
|
||
break;
|
||
case 4:
|
||
revers(activeLine==4);
|
||
cprintf("Mono support : %s",((val&16)==16) ? "Play on both channels" : "Left only");
|
||
break;
|
||
case 5:
|
||
revers(activeLine==5);
|
||
cprintf("Post divide : ");
|
||
val = ((*flash1)>>8)&0xff;
|
||
for (i=0;i!=4;++i)
|
||
case 1: // Core
|
||
switch(line)
|
||
{
|
||
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==5 && col==i);
|
||
cprintf("%d=%d ",i+1,pd);
|
||
val = val>>2;
|
||
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;
|
||
}
|
||
break;
|
||
case 6:
|
||
revers(activeLine==6);
|
||
cprintf("GTIA mixing : ");
|
||
val = ((*flash1)>>16)&0xff;
|
||
for (i=0;i!=4;++i)
|
||
break;
|
||
case 2: // pokey
|
||
switch(line)
|
||
{
|
||
unsigned char pd = (val&0x1);
|
||
revers(activeLine==6 && col==i);
|
||
cprintf("%d=%d ",i+1,pd);
|
||
val = val>>1;
|
||
}
|
||
break;
|
||
case 7:
|
||
val = ((*flash1)>>24)&0xff;
|
||
revers(activeLine==7);
|
||
cprintf("PSG frequency : ");
|
||
switch (val&3)
|
||
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;
|
||
case 3: // psg
|
||
switch(line)
|
||
{
|
||
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;
|
||
case 4: // SID
|
||
switch(line)
|
||
{
|
||
case SID_TYPE:
|
||
revers(activeLine==SID_TYPE);
|
||
val = (*flash2)&0x3;
|
||
cprintf("SID version : ");
|
||
revers(activeLine==SID_TYPE && col==0);
|
||
switch(val)
|
||
{
|
||
case 0:
|
||
cprintf("2MHz");
|
||
break;
|
||
cprintf("1:8580 ");
|
||
break;
|
||
case 1:
|
||
cprintf("1MHz");
|
||
break;
|
||
cprintf("1:6581 ");
|
||
break;
|
||
case 2:
|
||
cprintf("PHI2");
|
||
break;
|
||
}
|
||
break;
|
||
case 8:
|
||
val = ((*flash1)>>24)&0xff;
|
||
revers(activeLine==8);
|
||
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 9:
|
||
val = ((*flash1)>>24)&0xff;
|
||
revers(activeLine==9);
|
||
cprintf("PSG envelope : ");
|
||
if ((val&16)==16)
|
||
cprintf("16 steps");
|
||
else
|
||
cprintf("32 steps");
|
||
break;
|
||
case 10:
|
||
val = ((*flash1)>>24)&0xff;
|
||
revers(activeLine==10);
|
||
cprintf("PSG volume : ");
|
||
if (((val&0x60)>>5)==3)
|
||
cprintf("Linear");
|
||
else
|
||
cprintf("Log %d",(val>>5)&3);
|
||
break;
|
||
case 11:
|
||
revers(activeLine==11);
|
||
val = (*flash2)&0x3;
|
||
cprintf("SID version : ");
|
||
revers(activeLine==11 && col==0);
|
||
switch(val)
|
||
{
|
||
case 0:
|
||
cprintf("1:8580 ");
|
||
break;
|
||
case 1:
|
||
cprintf("1:6581 ");
|
||
break;
|
||
case 2:
|
||
cprintf("1:8580Digi ");
|
||
break;
|
||
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;
|
||
}
|
||
revers(activeLine==11 && 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;
|
||
case 12:
|
||
revers(activeLine==12);
|
||
val = ((*flash2)>>8)&0x1f;
|
||
cprintf("Restrict : ");
|
||
revers(activeLine==12 && col==0);
|
||
if (val&2)
|
||
cprintf("quad ");
|
||
else if (val&1)
|
||
cprintf("dual ");
|
||
else
|
||
cprintf("mono ");
|
||
revers(activeLine==12 && col==1);
|
||
if (val&4)
|
||
cprintf(" sid ");
|
||
else
|
||
cprintf("!sid ");
|
||
revers(activeLine==12 && col==2);
|
||
if (val&8)
|
||
cprintf(" psg ");
|
||
else
|
||
cprintf("!psg ");
|
||
revers(activeLine==12 && col==3);
|
||
if (val&16)
|
||
cprintf(" covox");
|
||
else
|
||
cprintf("!covox");
|
||
break;
|
||
case 13:
|
||
revers(activeLine==13);
|
||
cprintf("PHI2->1MHz : %s",((val&32)==32) ? "PAL (5/9)" : "NTSC (4/7)");
|
||
break;
|
||
}
|
||
revers(0);
|
||
*flash2; // silence warning
|
||
}
|
||
|
||
|
||
void render(unsigned long * flash1, unsigned long * flash2, unsigned char activeLine, unsigned char line, unsigned char col)
|
||
void render(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char activeLine, unsigned char line, unsigned char col)
|
||
{
|
||
unsigned char pokeys;
|
||
unsigned char val;
|
||
... | ... | |
clrscr();
|
||
//textcolor(0xa);
|
||
chline(40);
|
||
cprintf("Pokeymax config v1.2 ");
|
||
cprintf("Pokeymax config v1.3 ");
|
||
cprintf(" Core:");
|
||
for (i=0;i!=8;++i)
|
||
{
|
||
... | ... | |
|
||
gotoxy(0,17);
|
||
chline(40);
|
||
cprintf("Options:\r\n");
|
||
cprintf(" (A)pply config\r\n");
|
||
if (has_flash())
|
||
{
|
||
... | ... | |
cprintf(" (U)pdate core/ (V)erify core\r\n");
|
||
}
|
||
cprintf(" (Q)uit\r\n");
|
||
cprintf("Use arrows and enter to change config");
|
||
cprintf("Use arrows and enter to change config\r\n");
|
||
cprintf("Press space to change section\r\n");
|
||
}
|
||
gotoxy(0,2);
|
||
|
||
... | ... | |
}
|
||
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);
|
||
|
||
if (line==255)
|
||
if (line>=254)
|
||
{
|
||
for (line=1;line<=13;++line)
|
||
renderLine(flash1,flash2,activeLine, line,col);
|
||
unsigned char maxline = mode_maxline(mode);
|
||
for (line=1;line<=maxline;++line)
|
||
renderLine(flash1,flash2,mode,activeLine, line,col);
|
||
*(unsigned char *)559 = prev559;
|
||
}
|
||
else
|
||
{
|
||
renderLine(flash1,flash2,activeLine, line,col);
|
||
renderLine(flash1,flash2,mode,activeLine, line,col);
|
||
if (wherex()>15)
|
||
cclear(40-wherex());
|
||
}
|
||
}
|
||
|
||
void changeValue(unsigned long * flash1, unsigned long * flash2, unsigned char line, unsigned char col)
|
||
void changeValue(unsigned long * flash1, unsigned long * flash2, unsigned char mode, unsigned char line, unsigned char col)
|
||
{
|
||
unsigned char shift;
|
||
unsigned char mask=1;
|
||
... | ... | |
|
||
unsigned long * flashaddr = flash1;
|
||
|
||
switch(line)
|
||
switch(mode)
|
||
{
|
||
case 1:
|
||
shift = 0;
|
||
break;
|
||
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;
|
||
}
|
||
break;
|
||
case 2:
|
||
shift = 2;
|
||
break;
|
||
switch(line)
|
||
{
|
||
case POKEY_LINEAR:
|
||
shift = 0;
|
||
break;
|
||
case POKEY_CHANNEL_MODE:
|
||
shift = 2;
|
||
break;
|
||
case POKEY_IRQ:
|
||
shift = 3;
|
||
break;
|
||
}
|
||
break;
|
||
case 3:
|
||
shift = 3;
|
||
break;
|
||
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;
|
||
case 4:
|
||
shift = 4;
|
||
break;
|
||
case 5:
|
||
shift = 8 + (col<<1);
|
||
mask = 3;
|
||
max = 3;
|
||
break;
|
||
case 6:
|
||
shift = 16 + col;
|
||
break;
|
||
case 7:
|
||
mask = 3;
|
||
shift = 24;
|
||
max = 2;
|
||
break;
|
||
case 8:
|
||
mask = 3;
|
||
shift = 26;
|
||
max = 3;
|
||
break;
|
||
case 9:
|
||
shift = 28;
|
||
break;
|
||
case 10:
|
||
mask = 3;
|
||
shift = 29;
|
||
max = 3;
|
||
break;
|
||
case 11:
|
||
flashaddr = flash2;
|
||
mask = 3;
|
||
shift = 0 + (col<<2);
|
||
max = 2;
|
||
break;
|
||
case 12:
|
||
flashaddr = flash2;
|
||
if (col==0)
|
||
{
|
||
mask = 3;
|
||
shift = 8;
|
||
max = 2;
|
||
}
|
||
else
|
||
{
|
||
mask = 1;
|
||
shift = 9 + col;
|
||
max = 1;
|
||
}
|
||
break;
|
||
case 13:
|
||
shift = 5;
|
||
break;
|
||
switch(line)
|
||
{
|
||
case SID_TYPE:
|
||
flashaddr = flash2;
|
||
mask = 3;
|
||
shift = 0 + (col<<2);
|
||
max = 2;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
tmp = mask;
|
||
... | ... | |
|
||
config[6] = flash2&0xff;
|
||
config[7] = (flash2>>8)&0xff;
|
||
config[9] = (flash2>>24)&0xff;
|
||
// SATURATE_NEXT <= flash_do(0);
|
||
// -- 1 reserved...
|
||
// CHANNEL_MODE_NEXT <= flash_do(2);
|
||
... | ... | |
unsigned long flash2;
|
||
unsigned char origbg;
|
||
unsigned char origbord;
|
||
unsigned char mode = 1;
|
||
if (pokey[12] != 1)
|
||
{
|
||
cprintf("Pokeymax not found!");
|
||
... | ... | |
(((unsigned long)config[2])<<8) |
|
||
(((unsigned long)config[0]));
|
||
flash2 =
|
||
(((unsigned long) config[9])<<24) |
|
||
(((unsigned long) config[7])<<8) |
|
||
((unsigned long) config[6]);
|
||
|
||
... | ... | |
|
||
while (!quit)
|
||
{
|
||
render(&flash1,&flash2,line,prevline,col);
|
||
render(&flash1,&flash2,line,line,col);
|
||
unsigned max_line = mode_maxline(mode);
|
||
render(&flash1,&flash2,mode,line,prevline,col);
|
||
render(&flash1,&flash2,mode,line,line,col);
|
||
|
||
prevline=line;
|
||
|
||
while (!kbhit());
|
||
switch (cgetc())
|
||
{
|
||
case ' ':
|
||
mode = mode+1;
|
||
if (mode==5) mode = 1;
|
||
line = 1;
|
||
col = 0;
|
||
prevline=255;
|
||
break;
|
||
case '-':
|
||
if (line>1)
|
||
line = line-1;
|
||
col = 0;
|
||
break;
|
||
case '=':
|
||
if (line<13)
|
||
if (line<max_line)
|
||
line = line+1;
|
||
col = 0;
|
||
break;
|
||
... | ... | |
break;
|
||
case '*':
|
||
col =col+1;
|
||
if (line==11)
|
||
if (mode==4 && line==SID_TYPE)
|
||
{
|
||
if (col>1)
|
||
col =1;
|
||
}
|
||
else if (mode==1 && line==CORE_OUTPUT)
|
||
{
|
||
if (col>4)
|
||
col =4;
|
||
}
|
||
else
|
||
{
|
||
if (col>3)
|
||
... | ... | |
}
|
||
break;
|
||
case CH_ENTER:
|
||
changeValue(&flash1,&flash2,line,col);
|
||
changeValue(&flash1,&flash2,mode,line,col);
|
||
break;
|
||
case 'a':
|
||
// Apply config
|
atari_chips/pokeyv2/pokeymax.vhd | ||
---|---|---|
-- 3=psg off
|
||
-- 4=sample off
|
||
|
||
-- output channel on/off
|
||
signal CHANNEL_EN_REG : std_logic_vector(4 downto 0);
|
||
signal CHANNEL_EN_NEXT : std_logic_vector(4 downto 0);
|
||
-- 0=0 (37)
|
||
-- 1=1
|
||
-- 2=2 L ext
|
||
-- 3=3 R ext
|
||
-- 4=spdif
|
||
|
||
-- ext clk enable
|
||
signal SID_ENABLE_NEXT : std_logic;
|
||
signal SID_ENABLE_REG : std_logic;
|
||
... | ... | |
SID_FILTER1_REG <= "10"; -- 0=8580,1=6581,2=digifix
|
||
SID_FILTER2_REG <= "10"; -- 0=8580,1=6581,2=digifix
|
||
RESTRICT_CAPABILITY_REG <= (others=>'1');
|
||
CHANNEL_EN_REG <= (others=>'1');
|
||
elsif (clk'event and clk='1') then
|
||
DETECT_RIGHT_REG <= DETECT_RIGHT_NEXT;
|
||
IRQ_EN_REG <= IRQ_EN_NEXT;
|
||
... | ... | |
SID_FILTER1_REG <= SID_FILTER1_NEXT;
|
||
SID_FILTER2_REG <= SID_FILTER2_NEXT;
|
||
RESTRICT_CAPABILITY_REG <= RESTRICT_CAPABILITY_NEXT;
|
||
CHANNEL_EN_REG <= CHANNEL_EN_NEXT;
|
||
end if;
|
||
end process;
|
||
|
||
... | ... | |
CPU_FLASH_REQUEST_REG,CPU_FLASH_WRITE_N_REG,CPU_FLASH_CFG_REG,CPU_FLASH_ADDR_REG,CPU_FLASH_DATA_REG,
|
||
CPU_FLASH_COMPLETE,CONFIG_FLASH_COMPLETE,CONFIG_FLASH_ADDR,flash_do_slow,
|
||
RESTRICT_CAPABILITY_REG,
|
||
CHANNEL_EN_REG,
|
||
PAL_REG
|
||
)
|
||
begin
|
||
... | ... | |
CPU_FLASH_DATA_NEXT <= CPU_FLASH_DATA_REG;
|
||
|
||
RESTRICT_CAPABILITY_NEXT <= RESTRICT_CAPABILITY_REG;
|
||
CHANNEL_EN_NEXT <= CHANNEL_EN_REG;
|
||
|
||
PAL_NEXT <= PAL_REG;
|
||
|
||
... | ... | |
-- 6-7 reserved
|
||
RESTRICT_CAPABILITY_NEXT <= flash_do_slow(12 downto 8);
|
||
-- 13-15 reserved
|
||
-- 16-23 reserved (used in sidmax)
|
||
CHANNEL_EN_NEXT <= flash_do_slow(28 downto 24);
|
||
-- 29-31 reserved
|
||
when others =>
|
||
end case;
|
||
elsif (CONFIG_WRITE_ENABLE='1') then
|
||
... | ... | |
RESTRICT_CAPABILITY_NEXT(4 downto 0) <= WRITE_DATA(4 downto 0);
|
||
end if;
|
||
|
||
if (addr_decoded4(9)='1') then
|
||
CHANNEL_EN_NEXT(4 downto 0) <= WRITE_DATA(4 downto 0);
|
||
end if;
|
||
|
||
if (addr_decoded4(12)='1') then
|
||
if (WRITE_DATA=x"3F") then
|
||
CONFIG_ENABLE_NEXT <= '1';
|
||
... | ... | |
CPU_FLASH_CFG_REG,CPU_FLASH_ADDR_REG,CPU_FLASH_DATA_REG,
|
||
CPU_FLASH_REQUEST_REG, CPU_FLASH_WRITE_N_REG,
|
||
RESTRICT_CAPABILITY_REG,
|
||
CHANNEL_EN_REG,
|
||
PAL_REG
|
||
)
|
||
variable ACTUAL_CAPABILITY : std_logic_vector(7 downto 0);
|
||
... | ... | |
CONFIG_DO(4 downto 0) <= RESTRICT_CAPABILITY_REG(4 downto 0);
|
||
end if;
|
||
|
||
if (addr_decoded4(9)='1') then
|
||
CONFIG_DO(4 downto 0) <= CHANNEL_EN_REG(4 downto 0);
|
||
end if;
|
||
|
||
if (addr_decoded4(12)='1') then
|
||
CONFIG_DO <= x"01";
|
||
end if;
|
||
... | ... | |
spdif_out => spdif_out
|
||
);
|
||
|
||
EXT(SPDIF_BIT) <= spdif_out;
|
||
EXT(SPDIF_BIT) <= spdif_out when CHANNEL_EN_REG(4)='1' else 'Z';
|
||
end generate spdif_on;
|
||
|
||
-- io extension
|
||
... | ... | |
|
||
|
||
--1->pin37
|
||
AUD(1) <= AUDIO_0_SIGMADELTA;
|
||
AUD(1) <= AUDIO_0_SIGMADELTA when CHANNEL_EN_REG(0)='1' else '0';
|
||
|
||
-- ext AUD pins:
|
||
AUD(2) <= AUDIO_1_SIGMADELTA;
|
||
AUD(3) <= AUDIO_2_SIGMADELTA;
|
||
AUD(4) <= AUDIO_3_SIGMADELTA;
|
||
AUD(2) <= AUDIO_1_SIGMADELTA when CHANNEL_EN_REG(1)='1' else '0';
|
||
AUD(3) <= AUDIO_2_SIGMADELTA when CHANNEL_EN_REG(2)='1' else '0';
|
||
AUD(4) <= AUDIO_3_SIGMADELTA when CHANNEL_EN_REG(3)='1' else '0';
|
||
|
||
IRQ <= '0' when (IRQ_EN_REG='1' and (and_reduce(POKEY_IRQ)='0')) or (IRQ_EN_REG='0' and POKEY_IRQ(0)='0') or (SAMPLE_IRQ='1') else 'Z';
|
||
|
Also available in: Unified diff
Add disable support for each audio output. Split config screen into pages since it was getting too long!