From eb926a668db1873409374c5cdf0b83ae24f32abb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 24 May 2022 00:24:52 -0500 Subject: [PATCH] MSM6258: it works --- src/engine/platform/msm6258.cpp | 61 ++++++++++++++-------- src/engine/platform/msm6258.h | 2 +- src/engine/platform/sound/oki/okim6258.cpp | 2 - 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index d9a68289..826d221b 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -24,7 +24,7 @@ #include #include -#define rWrite(v) if (!skipRegisterWrites) {writes.emplace(0,v); if (dumpWrites) {addWrite(0,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } const char** DivPlatformMSM6258::getRegisterSheet() { return NULL; @@ -40,19 +40,33 @@ void DivPlatformMSM6258::acquire(short* bufL, short* bufR, size_t start, size_t &bufL[h], NULL }; - if (delay<=0) { - if (!writes.empty()) { - //QueuedWrite& w=writes.front(); - //msm->command_w(w.val); - writes.pop(); - delay=32; + if (!writes.empty()) { + QueuedWrite& w=writes.front(); + switch (w.addr) { + case 0: + msm->ctrl_w(w.val); + break; + } + writes.pop(); + } + + if (sample>=0 && samplesong.sampleLen) { + DivSample* s=parent->getSample(sample); + unsigned char nextData=(s->dataVOX[samplePos]>>4)|(s->dataVOX[samplePos]<<4); + if (msm->data_w(nextData)) { + samplePos++; + if (samplePos>=(int)s->lengthVOX) { + sample=-1; + samplePos=0; + msm->ctrl_w(1); + } } - } else { - delay--; } msm->sound_stream_update(outs,1); - bufL[h]=msm->data_w(0)?32767:0; + if (isMuted[0]) { + bufL[h]=0; + } /*if (++updateOsc>=22) { updateOsc=0; @@ -83,8 +97,8 @@ int DivPlatformMSM6258::dispatch(DivCommand c) { if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - chan[c.chan].sample=ins->amiga.getSample(c.value); - if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { + sample=ins->amiga.getSample(c.value); + if (sample>=0 && samplesong.sampleLen) { //DivSample* s=parent->getSample(chan[c.chan].sample); if (c.value!=DIV_NOTE_NULL) { chan[c.chan].note=c.value; @@ -92,11 +106,8 @@ int DivPlatformMSM6258::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].keyOn=true; - msm->ctrl_w(1); - msm->ctrl_w(2); - //rWrite((8<getSample(12*sampleBank+c.value%12); - chan[c.chan].sample=12*sampleBank+c.value%12; - //rWrite((8<ctrl_w(1); msm->ctrl_w(2); } @@ -121,14 +130,18 @@ int DivPlatformMSM6258::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].keyOn=false; chan[c.chan].active=false; - //rWrite((8<