From 5dac609d92f0c317d9088a00c79b428c5f0eafae Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 27 Mar 2022 01:47:27 -0500 Subject: [PATCH] Genesis: better DAC write algorithm only write DAC if there aren't too many queued writes --- src/engine/platform/genesis.cpp | 8 ++++++-- src/engine/platform/genesisshared.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 46e24333..10a8762c 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -92,7 +92,9 @@ void DivPlatformGenesis::acquire_nuked(short* bufL, short* bufR, size_t start, s DivSample* s=parent->getSample(dacSample); if (s->samples>0) { if (!isMuted[5]) { - urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80); + if (writes.size()<16) { + urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80); + } } if (++dacPos>=s->samples) { if (s->loopStart>=0 && s->loopStart<(int)s->samples) { @@ -159,7 +161,9 @@ void DivPlatformGenesis::acquire_ymfm(short* bufL, short* bufR, size_t start, si DivSample* s=parent->getSample(dacSample); if (s->samples>0) { if (!isMuted[5]) { - urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80); + if (writes.size()<16) { + urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80); + } } if (++dacPos>=s->samples) { if (s->loopStart>=0 && s->loopStart<(int)s->samples) { diff --git a/src/engine/platform/genesisshared.h b/src/engine/platform/genesisshared.h index 6410ddb2..3d5320f6 100644 --- a/src/engine/platform/genesisshared.h +++ b/src/engine/platform/genesisshared.h @@ -44,6 +44,6 @@ static int orderedOps[4]={ #define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;} #define immWrite(a,v) if (!skipRegisterWrites) {writes.push_back(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } -#define urgentWrite(a,v) if (!skipRegisterWrites) {if (writes.empty() || writes.front().addrOrVal) {writes.push_back(QueuedWrite(a,v));} else {writes.push_front(QueuedWrite(a,v));}; if (dumpWrites) {addWrite(a,v);} } +#define urgentWrite(a,v) if (!skipRegisterWrites) {if (writes.empty() || writes.size()>16 || writes.front().addrOrVal) {writes.push_back(QueuedWrite(a,v));} else {writes.push_front(QueuedWrite(a,v));}; if (dumpWrites) {addWrite(a,v);} } #include "fmshared_OPN.h"