C219: presets and VGM export

This commit is contained in:
tildearrow 2023-08-28 18:21:49 -05:00
parent 2fddd9e4d4
commit 35faa8c23c
2 changed files with 64 additions and 7 deletions

View file

@ -596,6 +596,19 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write
w->writeC(0); w->writeC(0);
} }
break; break;
case DIV_SYSTEM_C219:
for (int i=0; i<16; i++) {
w->writeC(0xd4); // mute
w->writeS_BE(baseAddr2S|(i<<4)|0);
w->writeC(0);
w->writeC(0xd4);
w->writeS_BE(baseAddr2S|(i<<4)|1);
w->writeC(0);
w->writeC(0xd4); // keyoff
w->writeS_BE(baseAddr2S|(i<<4)|5);
w->writeC(0);
}
break;
default: default:
break; break;
} }
@ -1058,6 +1071,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write
w->writeC(write.val&0xff); w->writeC(write.val&0xff);
break; break;
case DIV_SYSTEM_C140: case DIV_SYSTEM_C140:
case DIV_SYSTEM_C219:
w->writeC(0xd4); w->writeC(0xd4);
w->writeS_BE(baseAddr2S|(write.addr&0x1ff)); w->writeS_BE(baseAddr2S|(write.addr&0x1ff));
w->writeC(write.val&0xff); w->writeC(write.val&0xff);
@ -1151,7 +1165,8 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
int hasOKIM6295=0; int hasOKIM6295=0;
int hasK051649=0; int hasK051649=0;
int hasPCE=0; int hasPCE=0;
int hasNamco=0; int hasC140=0;
int c140Type=0;
int hasK053260=0; int hasK053260=0;
int hasPOKEY=0; int hasPOKEY=0;
int hasQSound=0; int hasQSound=0;
@ -1236,6 +1251,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
DivDispatch* writeGA20[2]={NULL,NULL}; DivDispatch* writeGA20[2]={NULL,NULL};
DivDispatch* writeK053260[2]={NULL,NULL}; DivDispatch* writeK053260[2]={NULL,NULL};
DivDispatch* writeC140[2]={NULL,NULL}; DivDispatch* writeC140[2]={NULL,NULL};
DivDispatch* writeC219[2]={NULL,NULL};
DivDispatch* writeNES[2]={NULL,NULL}; DivDispatch* writeNES[2]={NULL,NULL};
int writeNESIndex[2]={0,0}; int writeNESIndex[2]={0,0};
@ -1785,18 +1801,36 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
} }
break; break;
case DIV_SYSTEM_C140: case DIV_SYSTEM_C140:
if (!hasNamco) { if (!hasC140) {
// ?!?!?! // ?!?!?!
hasNamco=disCont[i].dispatch->rate/2; hasC140=disCont[i].dispatch->rate/2;
CHIP_VOL(40,1.0); CHIP_VOL(40,1.0);
willExport[i]=true; willExport[i]=true;
writeC140[0]=disCont[i].dispatch; writeC140[0]=disCont[i].dispatch;
} else if (!(hasNamco&0x40000000)) { } else if (!(hasC140&0x40000000)) {
isSecond[i]=true; isSecond[i]=true;
CHIP_VOL_SECOND(40,1.0); CHIP_VOL_SECOND(40,1.0);
willExport[i]=true; willExport[i]=true;
writeC140[1]=disCont[i].dispatch; writeC140[1]=disCont[i].dispatch;
hasNamco|=0x40000000; hasC140|=0x40000000;
howManyChips++;
}
break;
case DIV_SYSTEM_C219:
if (!hasC140) {
// ?!?!?!
hasC140=disCont[i].dispatch->rate/2;
CHIP_VOL(40,1.0);
willExport[i]=true;
writeC219[0]=disCont[i].dispatch;
c140Type=2;
} else if (!(hasC140&0x40000000)) {
isSecond[i]=true;
CHIP_VOL_SECOND(40,1.0);
willExport[i]=true;
writeC219[1]=disCont[i].dispatch;
hasC140|=0x40000000;
c140Type=2;
howManyChips++; howManyChips++;
} }
break; break;
@ -1895,13 +1929,13 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
w->writeI(hasOKIM6258); w->writeI(hasOKIM6258);
w->writeC(0); // flags w->writeC(0); // flags
w->writeC(0); // K flags w->writeC(0); // K flags
w->writeC(0); // C140 chip type w->writeC(c140Type); // C140 chip type
w->writeC(0); // reserved w->writeC(0); // reserved
w->writeI(hasOKIM6295); w->writeI(hasOKIM6295);
w->writeI(hasK051649); w->writeI(hasK051649);
w->writeI(hasK054539); w->writeI(hasK054539);
w->writeI(hasPCE); w->writeI(hasPCE);
w->writeI(hasNamco); w->writeI(hasC140);
w->writeI(hasK053260); w->writeI(hasK053260);
w->writeI(hasPOKEY); w->writeI(hasPOKEY);
w->writeI(hasQSound); w->writeI(hasQSound);
@ -2211,6 +2245,19 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
w->writeC(mem[i]>>8); w->writeC(mem[i]>>8);
} }
} }
if (writeC219[i]!=NULL && writeC219[i]->getSampleMemUsage()>0) {
w->writeC(0x67);
w->writeC(0x66);
w->writeC(0x8d);
unsigned short* mem=(unsigned short*)writeC219[i]->getSampleMem();
size_t memLen=writeC219[i]->getSampleMemUsage();
w->writeI((memLen+8)|(i*0x80000000));
w->writeI(writeC219[i]->getSampleMemCapacity());
w->writeI(0);
for (size_t i=0; i<memLen; i++) {
w->writeC(mem[i]);
}
}
} }
// initialize streams // initialize streams

View file

@ -2030,6 +2030,11 @@ void FurnaceGUI::initSystemPresets() {
CH(DIV_SYSTEM_C140, 1.0f, 0, "") CH(DIV_SYSTEM_C140, 1.0f, 0, "")
} }
); );
ENTRY(
"Namco NA-1/2", {
CH(DIV_SYSTEM_C219, 1.0f, 0, "")
}
);
ENTRY( ENTRY(
"Taito Arcade", { "Taito Arcade", {
CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "")
@ -2557,6 +2562,11 @@ void FurnaceGUI::initSystemPresets() {
CH(DIV_SYSTEM_C140, 1.0f, 0, "") CH(DIV_SYSTEM_C140, 1.0f, 0, "")
} }
); );
ENTRY(
"Namco C219", {
CH(DIV_SYSTEM_C219, 1.0f, 0, "")
}
);
CATEGORY_END; CATEGORY_END;
CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound."); CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound.");