diff --git a/src/engine/platform/sound/vsu.cpp b/src/engine/platform/sound/vsu.cpp index b2b6518eb..9e3832f9d 100644 --- a/src/engine/platform/sound/vsu.cpp +++ b/src/engine/platform/sound/vsu.cpp @@ -108,14 +108,14 @@ void VSU::Write(int timestamp, unsigned int A, unsigned char V) //Update(timestamp); - printf("VSU Write: %d, %08x %02x\n", timestamp, A, V); + //printf("VSU Write: %d, %08x %02x\n", timestamp, A, V); if(A < 0x280) WaveData[A >> 7][(A >> 2) & 0x1F] = V & 0x3F; else if(A < 0x400) { - if(A >= 0x300) - printf("Modulation mirror write? %08x %02x\n", A, V); + //if(A >= 0x300) + //printf("Modulation mirror write? %08x %02x\n", A, V); ModData[(A >> 2) & 0x1F] = V; } else if(A < 0x600) @@ -123,7 +123,7 @@ void VSU::Write(int timestamp, unsigned int A, unsigned char V) int ch = (A >> 6) & 0xF; //if(ch < 6) - printf("Ch: %d, Reg: %d, Value: %02x\n", ch, (A >> 2) & 0xF, V); + //printf("Ch: %d, Reg: %d, Value: %02x\n", ch, (A >> 2) & 0xF, V); if(ch > 5) { diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index dcdeffff9..7f3893f23 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -28,16 +28,62 @@ #define CHIP_DIVIDER 64 const char* regCheatSheetVB[]={ - "Select", "0", - "MasterVol", "1", - "FreqL", "2", - "FreqH", "3", - "DataCtl", "4", - "ChanVol", "5", - "WaveCtl", "6", - "NoiseCtl", "7", - "LFOFreq", "8", - "LFOCtl", "9", + "Wave0", "000", + "Wave1", "080", + "Wave2", "100", + "Wave3", "180", + "Wave4", "200", + "ModTable", "280", + + "S0INT", "400", + "S0LRV", "404", + "S0FQL", "408", + "S0FQH", "40C", + "S0EV0", "410", + "S0EV1", "414", + "S0RAM", "418", + + "S1INT", "440", + "S1LRV", "444", + "S1FQL", "448", + "S1FQH", "44C", + "S1EV0", "450", + "S1EV1", "454", + "S1RAM", "458", + + "S2INT", "480", + "S2LRV", "484", + "S2FQL", "488", + "S2FQH", "48C", + "S2EV0", "480", + "S2EV1", "484", + "S2RAM", "488", + + "S3INT", "4C0", + "S3LRV", "4C4", + "S3FQL", "4C8", + "S3FQH", "4CC", + "S3EV0", "4C0", + "S3EV1", "4C4", + "S3RAM", "4C8", + + "S4INT", "500", + "S4LRV", "504", + "S4FQL", "508", + "S4FQH", "50C", + "S4EV0", "510", + "S4EV1", "514", + "S4RAM", "518", + + "S5SWP", "51C", + + "S5INT", "540", + "S5LRV", "544", + "S5FQL", "548", + "S5FQH", "54C", + "S5EV0", "550", + "S5EV1", "554", + "S5RAM", "558", NULL }; @@ -89,25 +135,21 @@ void DivPlatformVB::acquire(short* bufL, short* bufR, size_t start, size_t len) //cycles+=2; writes.pop(); } - vb->EndFrame(4); + vb->EndFrame(16); tempL=0; tempR=0; for (int i=0; i<6; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=(vb->last_output[i][0]+vb->last_output[i][1])<<3; - tempL+=vb->last_output[i][0]<<3; - tempR+=vb->last_output[i][1]<<3; + oscBuf[i]->data[oscBuf[i]->needle++]=(vb->last_output[i][0]+vb->last_output[i][1])*8; + tempL+=vb->last_output[i][0]; + tempR+=vb->last_output[i][1]; } - //tempL/=6; - //tempR/=6; - if (tempL<-32768) tempL=-32768; if (tempL>32767) tempL=32767; if (tempR<-32768) tempR=-32768; if (tempR>32767) tempR=32767; - //printf("tempL: %d tempR: %d\n",tempL,tempR); bufL[h]=tempL; bufR[h]=tempR; } @@ -149,11 +191,11 @@ void DivPlatformVB::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol&31,MIN(31,chan[i].std.vol.val),31); + chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); if (chan[i].furnaceDac && chan[i].pcm) { // ignore for now } else { - //chWrite(i,0x04,0x80|chan[i].outVol); + chWrite(i,0x04,chan[i].outVol<<4); } } if (chan[i].std.duty.had && i>=4) { @@ -188,7 +230,7 @@ void DivPlatformVB::tick(bool sysTick) { chan[i].pan|=chan[i].std.panR.val&15; } if (chan[i].std.panL.had || chan[i].std.panR.had) { - //chWrite(i,0x05,isMuted[i]?0:chan[i].pan); + chWrite(i,0x01,isMuted[i]?0:chan[i].pan); } if (chan[i].std.pitch.had) { if (chan[i].std.pitch.mode) { @@ -233,21 +275,15 @@ void DivPlatformVB::tick(bool sysTick) { chan[i].dacRate=((double)chipClock/2)/MAX(1,off*chan[i].freq); if (dumpWrites) addWrite(0xffff0001+(i<<8),chan[i].dacRate); } + if (chan[i].freq<1) chan[i].freq=1; if (chan[i].freq>2047) chan[i].freq=2047; - chan[i].freq=2047-chan[i].freq; + chan[i].freq=2048-chan[i].freq; chWrite(i,0x02,chan[i].freq&0xff); chWrite(i,0x03,chan[i].freq>>8); if (chan[i].keyOn) { - //rWrite(16+i*5,0x80); - //chWrite(i,0x04,0x80|chan[i].vol); - chWrite(i,0x01,0xff); - //chWrite(i,0x00,0xff); - chWrite(i,0x04,0xf0); - chWrite(i,0x05,0x00); - chWrite(i,0x00,0x80); } if (chan[i].keyOff) { - chWrite(i,0x01,0); + chWrite(i,0x04,0); } if (chan[i].keyOn) chan[i].keyOn=false; if (chan[i].keyOff) chan[i].keyOff=false; @@ -322,13 +358,9 @@ int DivPlatformVB::dispatch(DivCommand c) { chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); chan[c.chan].freqChanged=true; chan[c.chan].note=c.value; - int noiseSeek=chan[c.chan].note; - if (noiseSeek<0) noiseSeek=0; - chWrite(c.chan,0x07,chan[c.chan].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); } chan[c.chan].active=true; chan[c.chan].keyOn=true; - //chWrite(c.chan,0x04,0x80|chan[c.chan].vol); chan[c.chan].macroInit(ins); if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; @@ -365,7 +397,7 @@ int DivPlatformVB::dispatch(DivCommand c) { if (!chan[c.chan].std.vol.has) { chan[c.chan].outVol=c.value; if (chan[c.chan].active && !chan[c.chan].pcm) { - //chWrite(c.chan,0x04,0x80|chan[c.chan].outVol); + chWrite(c.chan,0x04,chan[c.chan].outVol<<4); } } } @@ -437,7 +469,7 @@ int DivPlatformVB::dispatch(DivCommand c) { break; case DIV_CMD_PANNING: { chan[c.chan].pan=(c.value&0xf0)|(c.value2>>4); - //chWrite(c.chan,0x05,isMuted[c.chan]?0:chan[c.chan].pan); + chWrite(c.chan,0x01,isMuted[c.chan]?0:chan[c.chan].pan); break; } case DIV_CMD_LEGATO: @@ -453,7 +485,7 @@ int DivPlatformVB::dispatch(DivCommand c) { chan[c.chan].inPorta=c.value; break; case DIV_CMD_GET_VOLMAX: - return 31; + return 15; break; case DIV_ALWAYS_SET_VOLUME: return 1; @@ -466,7 +498,7 @@ int DivPlatformVB::dispatch(DivCommand c) { void DivPlatformVB::muteChannel(int ch, bool mute) { isMuted[ch]=mute; - //chWrite(ch,0x05,isMuted[ch]?0:chan[ch].pan); + chWrite(ch,0x01,isMuted[ch]?0:chan[ch].pan); if (!isMuted[ch] && (chan[ch].pcm && chan[ch].dacSample!=-1)) { //chWrite(ch,0x04,parent->song.disableSampleMacro?0xdf:(0xc0|chan[ch].outVol)); //chWrite(ch,0x06,chan[ch].dacOut&0x1f); @@ -478,7 +510,7 @@ void DivPlatformVB::forceIns() { chan[i].insChanged=true; chan[i].freqChanged=true; updateWave(i); - //chWrite(i,0x05,isMuted[i]?0:chan[i].pan); + chWrite(i,0x01,isMuted[i]?0:chan[i].pan); } } @@ -502,6 +534,10 @@ int DivPlatformVB::getRegisterPoolSize() { return 0x600; } +int DivPlatformVB::getRegisterPoolDepth() { + return 8; +} + void DivPlatformVB::reset() { while (!writes.empty()) writes.pop(); memset(regPool,0,0x600); @@ -525,6 +561,10 @@ void DivPlatformVB::reset() { lfoSpeed=255; // set per-channel initial panning for (int i=0; i<6; i++) { + chWrite(i,0x01,0xff); + chWrite(i,0x05,0x00); + chWrite(i,0x00,0x80); + chWrite(i,0x06,i); //chWrite(i,0x05,isMuted[i]?0:chan[i].pan); } delay=500; @@ -538,6 +578,10 @@ bool DivPlatformVB::keyOffAffectsArp(int ch) { return true; } +float DivPlatformVB::getPostAmp() { + return 6.0f; +} + void DivPlatformVB::notifyWaveChange(int wave) { for (int i=0; i<6; i++) { if (chan[i].wave==wave) { @@ -556,7 +600,7 @@ void DivPlatformVB::notifyInsDeletion(void* ins) { void DivPlatformVB::setFlags(const DivConfig& flags) { chipClock=20000000.0; antiClickEnabled=!flags.getBool("noAntiClick",false); - rate=chipClock/16; + rate=chipClock/64; for (int i=0; i<6; i++) { oscBuf[i]->rate=rate; } diff --git a/src/engine/platform/vb.h b/src/engine/platform/vb.h index 7bb229659..d01b9c059 100644 --- a/src/engine/platform/vb.h +++ b/src/engine/platform/vb.h @@ -101,12 +101,14 @@ class DivPlatformVB: public DivDispatch { DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); + int getRegisterPoolDepth(); void reset(); void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); + float getPostAmp(); void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 101b71ad1..51312eb11 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4415,6 +4415,7 @@ void FurnaceGUI::drawInsEdit() { ins->type==DIV_INS_FDS || (ins->type==DIV_INS_SWAN && !ins->amiga.useSample) || (ins->type==DIV_INS_PCE && !ins->amiga.useSample) || + (ins->type==DIV_INS_VBOY) || ins->type==DIV_INS_SCC || ins->type==DIV_INS_SNES || ins->type==DIV_INS_NAMCO) { @@ -4666,7 +4667,7 @@ void FurnaceGUI::drawInsEdit() { } if (ins->type==DIV_INS_TIA || ins->type==DIV_INS_AMIGA || ins->type==DIV_INS_SCC || ins->type==DIV_INS_PET || ins->type==DIV_INS_VIC || ins->type==DIV_INS_SEGAPCM || - ins->type==DIV_INS_FM) { + ins->type==DIV_INS_FM || ins->type==DIV_INS_VBOY) { dutyMax=0; } if (ins->type==DIV_INS_PCE || ins->type==DIV_INS_NAMCO) { @@ -4832,7 +4833,9 @@ void FurnaceGUI::drawInsEdit() { panMax=1; panSingle=true; } - if (ins->type==DIV_INS_X1_010 || ins->type==DIV_INS_PCE || ins->type==DIV_INS_MIKEY || ins->type==DIV_INS_SAA1099 || ins->type==DIV_INS_NAMCO || ins->type==DIV_INS_RF5C68) { + if (ins->type==DIV_INS_X1_010 || ins->type==DIV_INS_PCE || ins->type==DIV_INS_MIKEY || + ins->type==DIV_INS_SAA1099 || ins->type==DIV_INS_NAMCO || ins->type==DIV_INS_RF5C68 || + ins->type==DIV_INS_VBOY) { panMax=15; } if (ins->type==DIV_INS_SEGAPCM) {