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);
}
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:
break;
}
@ -1058,6 +1071,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write
w->writeC(write.val&0xff);
break;
case DIV_SYSTEM_C140:
case DIV_SYSTEM_C219:
w->writeC(0xd4);
w->writeS_BE(baseAddr2S|(write.addr&0x1ff));
w->writeC(write.val&0xff);
@ -1151,7 +1165,8 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
int hasOKIM6295=0;
int hasK051649=0;
int hasPCE=0;
int hasNamco=0;
int hasC140=0;
int c140Type=0;
int hasK053260=0;
int hasPOKEY=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* writeK053260[2]={NULL,NULL};
DivDispatch* writeC140[2]={NULL,NULL};
DivDispatch* writeC219[2]={NULL,NULL};
DivDispatch* writeNES[2]={NULL,NULL};
int writeNESIndex[2]={0,0};
@ -1785,18 +1801,36 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
}
break;
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);
willExport[i]=true;
writeC140[0]=disCont[i].dispatch;
} else if (!(hasNamco&0x40000000)) {
} else if (!(hasC140&0x40000000)) {
isSecond[i]=true;
CHIP_VOL_SECOND(40,1.0);
willExport[i]=true;
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++;
}
break;
@ -1895,13 +1929,13 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
w->writeI(hasOKIM6258);
w->writeC(0); // flags
w->writeC(0); // K flags
w->writeC(0); // C140 chip type
w->writeC(c140Type); // C140 chip type
w->writeC(0); // reserved
w->writeI(hasOKIM6295);
w->writeI(hasK051649);
w->writeI(hasK054539);
w->writeI(hasPCE);
w->writeI(hasNamco);
w->writeI(hasC140);
w->writeI(hasK053260);
w->writeI(hasPOKEY);
w->writeI(hasQSound);
@ -2211,6 +2245,19 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
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

View File

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