Virtual Boy: more work

This commit is contained in:
tildearrow 2022-10-08 23:25:15 -05:00
parent 6179ef493c
commit 504778d975
4 changed files with 95 additions and 46 deletions

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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);

View File

@ -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) {