diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index acb7af66..767db912 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -295,6 +295,8 @@ struct DivRegWrite { */ unsigned int addr; unsigned int val; + DivRegWrite(): + addr(0), val(0) {} DivRegWrite(unsigned int a, unsigned int v): addr(a), val(v) {} }; diff --git a/src/engine/fixedQueue.h b/src/engine/fixedQueue.h new file mode 100644 index 00000000..ad43f160 --- /dev/null +++ b/src/engine/fixedQueue.h @@ -0,0 +1,140 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _FIXED_QUEUE_H +#define _FIXED_QUEUE_H + +#include +#include "../ta-log.h" + +template struct FixedQueue { + size_t readPos, writePos; + T data[items]; + + T& front(); + T& back(); + bool pop(); + bool push(const T& item); + + bool pop_front(); + bool pop_back(); + bool push_front(const T& item); + bool push_back(const T& item); + void clear(); + bool empty(); + size_t size(); + FixedQueue(): + readPos(0), + writePos(0) {} +}; + +template T& FixedQueue::front() { + return data[readPos]; +} + +template T& FixedQueue::back() { + if (writePos==0) return data[items-1]; + return data[writePos-1]; +} + +template bool FixedQueue::pop() { + if (readPos==writePos) return false; + if (++readPos>=items) readPos=0; + return true; +} + +template bool FixedQueue::push(const T& item) { + if (writePos==(readPos-1)) { + logW("queue overflow!"); + return false; + } + if (writePos==items-1 && readPos==0) { + logW("queue overflow!"); + return false; + } + data[writePos]=item; + if (++writePos>=items) writePos=0; + return true; +} + +template bool FixedQueue::pop_front() { + if (readPos==writePos) return false; + if (++readPos>=items) readPos=0; + return true; +} + +template bool FixedQueue::push_back(const T& item) { + if (writePos==(readPos-1)) { + logW("queue overflow!"); + return false; + } + if (writePos==items-1 && readPos==0) { + logW("queue overflow!"); + return false; + } + data[writePos]=item; + if (++writePos>=items) writePos=0; + return true; +} + +template bool FixedQueue::pop_back() { + if (readPos==writePos) return false; + if (writePos>0) { + writePos--; + } else { + writePos=items-1; + } + return true; +} + +template bool FixedQueue::push_front(const T& item) { + if (readPos==(writePos+1)) { + logW("stack overflow!"); + return false; + } + if (readPos==0 && writePos==items-1) { + logW("stack overflow!"); + return false; + } + if (readPos>0) { + readPos--; + } else { + readPos=items-1; + } + data[readPos]=item; + return true; +} + +template void FixedQueue::clear() { + readPos=0; + writePos=0; +} + +template bool FixedQueue::empty() { + return (readPos==writePos); +} + +template size_t FixedQueue::size() { + if (readPos>writePos) { + return items+writePos-readPos; + } + return writePos-readPos; +} + +#endif diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index 1c793296..a05a5994 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -21,7 +21,6 @@ #define _AMIGA_H #include "../dispatch.h" -#include #include "../waveSynth.h" class DivPlatformAmiga: public DivDispatch { diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 0e38bf96..20110b9d 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -878,7 +878,7 @@ void DivPlatformArcade::poke(std::vector& wlist) { } void DivPlatformArcade::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,256); if (useYMFM) { fm_ymfm->reset(); diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index edcdd8d1..b5720f19 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -20,7 +20,6 @@ #ifndef _ARCADE_H #define _ARCADE_H #include "fmshared_OPM.h" -#include #include "../../../extern/opm/opm.h" #include "sound/ymfm/ymfm_opm.h" diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index c32a4ee2..5d9a5593 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -25,7 +25,7 @@ #include #define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;} -#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(regRemap(a),v); if (dumpWrites) {addWrite(regRemap(a),v);} } +#define immWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(regRemap(a),v)); if (dumpWrites) {addWrite(regRemap(a),v);} } #define CHIP_DIVIDER (extMode?extDiv:((sunsoft||clockSel)?16:8)) diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index 04e3aed1..999db1e5 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -20,7 +20,7 @@ #ifndef _AY_H #define _AY_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/ay8910.h" class DivPlatformAY8910: public DivDispatch { @@ -89,9 +89,10 @@ class DivPlatformAY8910: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; ay8910_device* ay; DivDispatchOscBuffer* oscBuf[3]; unsigned char regPool[16]; diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 8561548d..10421942 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -25,7 +25,7 @@ #include #define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;} -#define immWrite2(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define immWrite2(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER (clockSel?8:4) diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index 3b47cf0d..113aed91 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -20,7 +20,7 @@ #ifndef _AY8930_H #define _AY8930_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/ay8910.h" class DivPlatformAY8930: public DivDispatch { @@ -99,9 +99,10 @@ class DivPlatformAY8930: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; ay8930_device* ay; DivDispatchOscBuffer* oscBuf[3]; unsigned char regPool[32]; diff --git a/src/engine/platform/bubsyswsg.h b/src/engine/platform/bubsyswsg.h index 784396bf..c3891bf6 100644 --- a/src/engine/platform/bubsyswsg.h +++ b/src/engine/platform/bubsyswsg.h @@ -21,7 +21,6 @@ #define _K005289_H #include "../dispatch.h" -#include #include "../waveSynth.h" #include "vgsound_emu/src/k005289/k005289.hpp" diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 5c1521ab..6ca85ffe 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -23,7 +23,7 @@ #include #include "../../ta-log.h" -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_FREQBASE 524288 diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index 5f67b956..0da59fc8 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -21,7 +21,7 @@ #define _C64_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/c64/sid.h" #include "sound/c64_fp/SID.h" #include "sound/c64_d/dsid.h" @@ -62,9 +62,10 @@ class DivPlatformC64: public DivDispatch { struct QueuedWrite { unsigned char addr; unsigned char val; + QueuedWrite(): addr(0), val(0) {} QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char filtControl, filtRes, vol; unsigned char writeOscBuf; diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index f388e860..adb342f3 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -26,9 +26,8 @@ #define PITCH_OFFSET ((double)(16*2048*(chanMax+1))) #define NOTE_ES5506(c,note) (parent->calcBaseFreq(chipClock,chan[c].pcm.freqOffs,note,false)) -#define rWrite(a,...) {if(!skipRegisterWrites) {hostIntf32.emplace(4,(a),__VA_ARGS__); }} -//#define rRead(a,st,...) {hostIntf32.emplace(st,4,(a),__VA_ARGS__);} -#define immWrite(a,...) {hostIntf32.emplace(4,(a),__VA_ARGS__);} +#define rWrite(a,...) {if(!skipRegisterWrites) {hostIntf32.push_back(QueuedHostIntf(4,(a),__VA_ARGS__)); }} +#define immWrite(a,...) {hostIntf32.push_back(QueuedHostIntf(4,(a),__VA_ARGS__));} #define pageWrite(p,a,...) \ if (!skipRegisterWrites) { \ if (curPage!=(p)) { \ @@ -118,15 +117,15 @@ void DivPlatformES5506::acquire(short** buf, size_t len) { while (!hostIntf32.empty()) { QueuedHostIntf w=hostIntf32.front(); if (w.isRead && (w.read!=NULL)) { - hostIntf8.emplace(w.state,0,w.addr,w.read,w.mask); - hostIntf8.emplace(w.state,1,w.addr,w.read,w.mask); - hostIntf8.emplace(w.state,2,w.addr,w.read,w.mask); - hostIntf8.emplace(w.state,3,w.addr,w.read,w.mask,w.delay); + hostIntf8.push(QueuedHostIntf(w.state,0,w.addr,w.read,w.mask)); + hostIntf8.push(QueuedHostIntf(w.state,1,w.addr,w.read,w.mask)); + hostIntf8.push(QueuedHostIntf(w.state,2,w.addr,w.read,w.mask)); + hostIntf8.push(QueuedHostIntf(w.state,3,w.addr,w.read,w.mask,w.delay)); } else { - hostIntf8.emplace(0,w.addr,w.val,w.mask); - hostIntf8.emplace(1,w.addr,w.val,w.mask); - hostIntf8.emplace(2,w.addr,w.val,w.mask); - hostIntf8.emplace(3,w.addr,w.val,w.mask,w.delay); + hostIntf8.push(QueuedHostIntf(0,w.addr,w.val,w.mask)); + hostIntf8.push(QueuedHostIntf(1,w.addr,w.val,w.mask)); + hostIntf8.push(QueuedHostIntf(2,w.addr,w.val,w.mask)); + hostIntf8.push(QueuedHostIntf(3,w.addr,w.val,w.mask,w.delay)); } hostIntf32.pop(); } @@ -1095,8 +1094,6 @@ DivMacroInt* DivPlatformES5506::getChanMacroInt(int ch) { void DivPlatformES5506::reset() { while (!hostIntf32.empty()) hostIntf32.pop(); while (!hostIntf8.empty()) hostIntf8.pop(); - while (!queuedRead.empty()) queuedRead.pop(); - while (!queuedReadState.empty()) queuedReadState.pop(); for (int i=0; i<32; i++) { chan[i]=DivPlatformES5506::Channel(); chan[i].std.setEngine(parent); diff --git a/src/engine/platform/es5506.h b/src/engine/platform/es5506.h index 1502d03e..b7658c52 100644 --- a/src/engine/platform/es5506.h +++ b/src/engine/platform/es5506.h @@ -22,7 +22,7 @@ #include "../dispatch.h" #include "../engine.h" -#include +#include "../fixedQueue.h" #include "../macroInt.h" #include "../sample.h" #include "vgsound_emu/src/es550x/es5506.hpp" @@ -238,6 +238,15 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { unsigned int* read; unsigned short delay; bool isRead; + QueuedHostIntf(): + state(0), + step(0), + addr(0), + val(0), + mask(0), + read(NULL), + delay(0), + isRead(false) {} QueuedHostIntf(unsigned char s, unsigned char a, unsigned int v, unsigned int m=(unsigned int)(~0), unsigned short d=0): state(0), step(s), @@ -257,17 +266,8 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { delay(d), isRead(true) {} }; - struct QueuedReadState { - unsigned int* read; - unsigned char state; - QueuedReadState(unsigned int* r, unsigned char s): - read(r), - state(s) {} - }; - std::queue hostIntf32; - std::queue hostIntf8; - std::queue queuedRead; - std::queue queuedReadState; + FixedQueue hostIntf32; + FixedQueue hostIntf8; int cycle, curPage, volScale; unsigned char maskedVal; unsigned int irqv; diff --git a/src/engine/platform/fmsharedbase.h b/src/engine/platform/fmsharedbase.h index b59b419d..c0fb7dd2 100644 --- a/src/engine/platform/fmsharedbase.h +++ b/src/engine/platform/fmsharedbase.h @@ -22,7 +22,7 @@ #include "../dispatch.h" #include "../instrument.h" -#include +#include "../fixedQueue.h" #define KVS(x,y) ((chan[x].state.op[y].kvs==2 && isOutput[chan[x].state.alg][y]) || chan[x].state.op[y].kvs==1) @@ -79,9 +79,10 @@ class DivPlatformFMBase: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::deque writes; + FixedQueue writes; unsigned char lastBusy; int delay; diff --git a/src/engine/platform/ga20.cpp b/src/engine/platform/ga20.cpp index 7794d61a..901927dd 100644 --- a/src/engine/platform/ga20.cpp +++ b/src/engine/platform/ga20.cpp @@ -22,7 +22,7 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if(!skipRegisterWrites) {writes.emplace(a,v); if(dumpWrites) addWrite(a,v);}} +#define rWrite(a,v) {if(!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if(dumpWrites) addWrite(a,v);}} #define CHIP_DIVIDER 64 @@ -68,7 +68,7 @@ void DivPlatformGA20::acquire(short** buf, size_t len) { ga20.write(w.addr,w.val); regPool[w.addr]=w.val; writes.pop(); - delay=w.delay; + delay=1; } } short *buffer[4]={ @@ -361,9 +361,7 @@ DivDispatchOscBuffer* DivPlatformGA20::getOscBuffer(int ch) { } void DivPlatformGA20::reset() { - while (!writes.empty()) { - writes.pop(); - } + writes.clear(); memset(regPool,0,32); ga20.device_reset(); delay=0; diff --git a/src/engine/platform/ga20.h b/src/engine/platform/ga20.h index 1e06378f..691b68f0 100644 --- a/src/engine/platform/ga20.h +++ b/src/engine/platform/ga20.h @@ -21,7 +21,7 @@ #define _GA20_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../macroInt.h" #include "sound/ga20/iremga20.h" @@ -47,15 +47,14 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf { DivDispatchOscBuffer* oscBuf[4]; bool isMuted[4]; struct QueuedWrite { - unsigned short addr; + unsigned char addr; unsigned char val; - unsigned short delay; - QueuedWrite(unsigned short a, unsigned char v, unsigned short d=1): + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), - val(v), - delay(d) {} + val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned int sampleOffGA20[256]; bool sampleLoaded[256]; diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index a475b7da..8d61b334 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -22,8 +22,8 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } -#define immWrite(a,v) {writes.emplace(a,v); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } +#define immWrite(a,v) {writes.push(QueuedWrite(a,v)); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER 16 diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index 8ba70a91..e68a94f8 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -23,7 +23,7 @@ #include "../dispatch.h" #include "../waveSynth.h" #include "sound/gb/gb.h" -#include +#include "../fixedQueue.h" class DivPlatformGB: public DivDispatch { struct Channel: public SharedChannel { @@ -62,11 +62,12 @@ class DivPlatformGB: public DivDispatch { unsigned char lastPan; DivWaveSynth ws; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; int antiClickPeriodCount, antiClickWavePos; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index fcd96972..20e87d61 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -284,7 +284,7 @@ void DivPlatformGenesis::acquire(short** buf, size_t len) { } void DivPlatformGenesis::fillStream(std::vector& stream, int sRate, size_t len) { - while (!writes.empty()) writes.pop_front(); + writes.clear(); for (size_t i=0; ireset(); diff --git a/src/engine/platform/k007232.cpp b/src/engine/platform/k007232.cpp index bb0bf7a9..d1037988 100644 --- a/src/engine/platform/k007232.cpp +++ b/src/engine/platform/k007232.cpp @@ -22,7 +22,7 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if(!skipRegisterWrites) {writes.emplace(a,v); if(dumpWrites) addWrite(a,v);}} +#define rWrite(a,v) {if(!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if(dumpWrites) addWrite(a,v);}} #define CHIP_DIVIDER 64 diff --git a/src/engine/platform/k007232.h b/src/engine/platform/k007232.h index 842310da..b1025f57 100644 --- a/src/engine/platform/k007232.h +++ b/src/engine/platform/k007232.h @@ -21,7 +21,7 @@ #define _K007232_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../macroInt.h" #include "vgsound_emu/src/k007232/k007232.hpp" @@ -57,12 +57,13 @@ class DivPlatformK007232: public DivDispatch, public k007232_intf { unsigned short addr; unsigned char val; unsigned short delay; + QueuedWrite(): addr(0), val(0), delay(1) {} QueuedWrite(unsigned short a, unsigned char v, unsigned short d=1): addr(a), val(v), delay(d) {} }; - std::queue writes; + FixedQueue writes; unsigned int sampleOffK007232[256]; bool sampleLoaded[256]; diff --git a/src/engine/platform/msm5232.cpp b/src/engine/platform/msm5232.cpp index 55df6128..4a810728 100644 --- a/src/engine/platform/msm5232.cpp +++ b/src/engine/platform/msm5232.cpp @@ -23,7 +23,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define NOTE_LINEAR(x) ((x)<<7) diff --git a/src/engine/platform/msm5232.h b/src/engine/platform/msm5232.h index b1d83cf0..abdb72f0 100644 --- a/src/engine/platform/msm5232.h +++ b/src/engine/platform/msm5232.h @@ -21,7 +21,7 @@ #define _MSM5232_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/oki/msm5232.h" class DivPlatformMSM5232: public DivDispatch { @@ -46,11 +46,12 @@ class DivPlatformMSM5232: public DivDispatch { unsigned char groupAR[2]; unsigned char groupDR[2]; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; int cycles, curChan, delay, detune, clockDriftAccum; unsigned int clockDriftLFOPos, clockDriftLFOSpeed; diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 31002a9c..7f4d2e63 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -24,7 +24,7 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } const char** DivPlatformMSM6258::getRegisterSheet() { return NULL; diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index 0c19d976..2c18d90c 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -21,7 +21,7 @@ #define _MSM6258_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/oki/okim6258.h" class DivPlatformMSM6258: public DivDispatch { @@ -42,9 +42,10 @@ class DivPlatformMSM6258: public DivDispatch { struct QueuedWrite { unsigned short addr; unsigned char val; + QueuedWrite(): addr(0), val(0) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; okim6258_device* msm; unsigned char lastBusy; diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 2aff0006..3d823d16 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -23,8 +23,8 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } -#define rWriteDelay(a,v,d) if (!skipRegisterWrites) {writes.emplace(a,v,d); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } +#define rWriteDelay(a,v,d) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v,d)); if (dumpWrites) {addWrite(a,v);} } const char** DivPlatformMSM6295::getRegisterSheet() { return NULL; diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index df140693..dfa59a0c 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -21,7 +21,7 @@ #define _MSM6295_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "vgsound_emu/src/msm6295/msm6295.hpp" class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf { @@ -41,12 +41,13 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf { unsigned short addr; unsigned char val; unsigned short delay; + QueuedWrite(): addr(0), val(0), delay(96) {} QueuedWrite(unsigned short a, unsigned char v, unsigned short d=96): addr(a), val(v), delay(d) {} }; - std::queue writes; + FixedQueue writes; msm6295_core msm; unsigned char lastBusy; diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 1063349d..7e10a01e 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -23,8 +23,8 @@ #include #define rRead(a,v) n163.addr_w(a); n163.data_r(v); -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } -#define rWriteMask(a,v,m) if (!skipRegisterWrites) {writes.emplace(a,v,m); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } +#define rWriteMask(a,v,m) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v,m)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) \ if (c<=chanMax) { \ rWrite(0x78-(c<<3)+(a&7),v) \ diff --git a/src/engine/platform/n163.h b/src/engine/platform/n163.h index 49c0ff05..0c5e5913 100644 --- a/src/engine/platform/n163.h +++ b/src/engine/platform/n163.h @@ -21,7 +21,7 @@ #define _N163_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../waveSynth.h" #include "vgsound_emu/src/n163/n163.hpp" @@ -54,12 +54,13 @@ class DivPlatformN163: public DivDispatch { DivDispatchOscBuffer* oscBuf[8]; bool isMuted[8]; struct QueuedWrite { - unsigned char addr; - unsigned char val; - unsigned char mask; - QueuedWrite(unsigned char a, unsigned char v, unsigned char m=~0): addr(a), val(v), mask(m) {} + unsigned char addr; + unsigned char val; + unsigned char mask; + QueuedWrite(): addr(0), val(0), mask(~0) {} + QueuedWrite(unsigned char a, unsigned char v, unsigned char m=~0): addr(a), val(v), mask(m) {} }; - std::queue writes; + FixedQueue writes; unsigned char initChanMax; unsigned char chanMax; short loadWave, loadPos, loadLen; diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 088f1e63..5b804b23 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -22,7 +22,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_FREQBASE 4194304 diff --git a/src/engine/platform/namcowsg.h b/src/engine/platform/namcowsg.h index 9d418a9d..6aaef095 100644 --- a/src/engine/platform/namcowsg.h +++ b/src/engine/platform/namcowsg.h @@ -21,7 +21,7 @@ #define _NAMCOWSG_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../waveSynth.h" #include "sound/namco.h" @@ -41,11 +41,12 @@ class DivPlatformNamcoWSG: public DivDispatch { DivDispatchOscBuffer* oscBuf[8]; bool isMuted[8]; struct QueuedWrite { - unsigned short addr; - unsigned char val; - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} + unsigned short addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; namco_audio_device* namco; int devType, chans; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index d340aa31..3578dbd9 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -24,7 +24,7 @@ #include #define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;} -#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define immWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define KVSL(x,y) ((chan[x].state.op[orderedOpsL1[ops==4][y]].kvs==2 && isOutputL[ops==4][chan[x].state.alg][y]) || chan[x].state.op[orderedOpsL1[ops==4][y]].kvs==1) diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index aae0e800..f4881c29 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -21,7 +21,7 @@ #define _OPL_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../../../extern/opl/opl3.h" #include "sound/ymfm/ymfm_adpcm.h" @@ -64,9 +64,10 @@ class DivPlatformOPL: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; opl3_chip fm; unsigned char* adpcmBMem; size_t adpcmBMemLen; diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 38b892e8..d081fabc 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -24,7 +24,7 @@ #include #define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;} -#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define immWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_FREQBASE 1180068 diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index 4e72936d..7333f729 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -21,7 +21,7 @@ #define _OPLL_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" extern "C" { #include "../../../extern/Nuked-OPLL/opll.h" @@ -50,9 +50,10 @@ class DivPlatformOPLL: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; opll_t fm; int delay, lastCustomMemory; unsigned char lastBusy; diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 47e5bbcd..b6f43e2d 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -22,7 +22,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) \ if (!skipRegisterWrites) { \ if (curChan!=c) { \ @@ -531,7 +531,7 @@ int DivPlatformPCE::getRegisterPoolSize() { } void DivPlatformPCE::reset() { - while (!writes.empty()) writes.pop(); + writes.clear(); memset(regPool,0,128); for (int i=0; i<6; i++) { chan[i]=DivPlatformPCE::Channel(); diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 9b8c610c..baca7770 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -21,7 +21,7 @@ #define _PCE_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../waveSynth.h" #include "sound/pce_psg.h" @@ -60,11 +60,12 @@ class DivPlatformPCE: public DivDispatch { bool antiClickEnabled; bool updateLFO; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(9) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char lastPan; int cycles, curChan, delay; diff --git a/src/engine/platform/pcmdac.h b/src/engine/platform/pcmdac.h index f9435e3e..8ef10149 100644 --- a/src/engine/platform/pcmdac.h +++ b/src/engine/platform/pcmdac.h @@ -21,7 +21,6 @@ #define _PCM_DAC_H #include "../dispatch.h" -#include #include "../waveSynth.h" class DivPlatformPCMDAC: public DivDispatch { diff --git a/src/engine/platform/pcspkr.h b/src/engine/platform/pcspkr.h index 23b3c0b4..0437a90c 100644 --- a/src/engine/platform/pcspkr.h +++ b/src/engine/platform/pcspkr.h @@ -21,7 +21,7 @@ #define _PCSPKR_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include #include #include @@ -40,12 +40,16 @@ class DivPlatformPCSpeaker: public DivDispatch { struct RealQueueVal { int tv_sec, tv_nsec; unsigned short val; + RealQueueVal(): + tv_sec(0), + tv_nsec(0), + val(0) {} RealQueueVal(int sec, int nsec, unsigned short v): tv_sec(sec), tv_nsec(nsec), val(v) {} }; - std::queue realQueue; + FixedQueue realQueue; std::mutex realQueueLock; bool isMuted[1]; bool on, flip, lastOn, realOutEnabled; diff --git a/src/engine/platform/pokey.cpp b/src/engine/platform/pokey.cpp index 790346e1..08b6da9f 100644 --- a/src/engine/platform/pokey.cpp +++ b/src/engine/platform/pokey.cpp @@ -21,7 +21,7 @@ #include "../engine.h" #include "../../ta-log.h" -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER 1 diff --git a/src/engine/platform/pokey.h b/src/engine/platform/pokey.h index b5087517..979f6075 100644 --- a/src/engine/platform/pokey.h +++ b/src/engine/platform/pokey.h @@ -21,7 +21,7 @@ #define _POKEY_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" extern "C" { #include "sound/pokey/mzpokeysnd.h" @@ -43,11 +43,12 @@ class DivPlatformPOKEY: public DivDispatch { DivDispatchOscBuffer* oscBuf[4]; bool isMuted[4]; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char audctl, skctl; bool audctlChanged, skctlChanged; unsigned char oscBufDelay; diff --git a/src/engine/platform/pv1000.h b/src/engine/platform/pv1000.h index 852bf120..740f16c4 100644 --- a/src/engine/platform/pv1000.h +++ b/src/engine/platform/pv1000.h @@ -22,7 +22,6 @@ #include "../dispatch.h" #include "sound/d65modified.h" -#include class DivPlatformPV1000: public DivDispatch { struct Channel: public SharedChannel { diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h index 9c090f19..aff53f67 100644 --- a/src/engine/platform/qsound.h +++ b/src/engine/platform/qsound.h @@ -21,7 +21,6 @@ #define _QSOUND_H #include "../dispatch.h" -#include #include "sound/qsound.h" class DivPlatformQSound: public DivDispatch { diff --git a/src/engine/platform/rf5c68.h b/src/engine/platform/rf5c68.h index 94ced515..4ba40318 100644 --- a/src/engine/platform/rf5c68.h +++ b/src/engine/platform/rf5c68.h @@ -21,7 +21,6 @@ #define _RF5C68_H #include "../dispatch.h" -#include #include "sound/rf5c68.h" class DivPlatformRF5C68: public DivDispatch { diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 7682d318..803a6cad 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -23,7 +23,7 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER 2 diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index 43e3cc87..ffd79db7 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -21,7 +21,7 @@ #define _SAA_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../../../extern/SAASound/src/SAASound.h" class DivPlatformSAA1099: public DivDispatch { @@ -44,9 +44,10 @@ class DivPlatformSAA1099: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; CSAASound* saa_saaSound; unsigned char regPool[32]; unsigned char lastBusy; diff --git a/src/engine/platform/scc.h b/src/engine/platform/scc.h index b8b892af..f075753a 100644 --- a/src/engine/platform/scc.h +++ b/src/engine/platform/scc.h @@ -21,7 +21,6 @@ #define _SCC_H #include "../dispatch.h" -#include #include "../waveSynth.h" #include "vgsound_emu/src/scc/scc.hpp" diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 20032a1b..b9af8a91 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -23,7 +23,7 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) rWrite(((c)<<3)+(a),v) void DivPlatformSegaPCM::acquire(short** buf, size_t len) { diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index b818306b..067054fe 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -23,7 +23,7 @@ #include "../dispatch.h" #include "../instrument.h" #include "sound/segapcm.h" -#include +#include "../fixedQueue.h" class DivPlatformSegaPCM: public DivDispatch { protected: @@ -59,9 +59,10 @@ class DivPlatformSegaPCM: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; segapcm_device pcm; int delay; int pcmL, pcmR, pcmCycles; diff --git a/src/engine/platform/sm8521.cpp b/src/engine/platform/sm8521.cpp index e72616bd..52c3442c 100644 --- a/src/engine/platform/sm8521.cpp +++ b/src/engine/platform/sm8521.cpp @@ -22,7 +22,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER 64 diff --git a/src/engine/platform/sm8521.h b/src/engine/platform/sm8521.h index b0a119fb..02e2f458 100644 --- a/src/engine/platform/sm8521.h +++ b/src/engine/platform/sm8521.h @@ -21,7 +21,7 @@ #define _SM8521_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../waveSynth.h" #include "sound/sm8521.h" @@ -46,11 +46,12 @@ class DivPlatformSM8521: public DivDispatch { DivDispatchOscBuffer* oscBuf[3]; bool isMuted[3]; struct QueuedWrite { - unsigned short addr; - unsigned char val; - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} + unsigned short addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; bool antiClickEnabled; struct sm8521_t sm8521; diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index f8858aab..640f364e 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -22,7 +22,7 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);}}} +#define rWrite(a,v) {if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);}}} const char* regCheatSheetSN[]={ "DATA", "0", diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index efdfff44..692c0a42 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -25,7 +25,7 @@ extern "C" { #include "../../../extern/Nuked-PSG/ympsg.h" } -#include +#include "../fixedQueue.h" class DivPlatformSMS: public DivDispatch { struct Channel: public SharedChannel { @@ -59,9 +59,10 @@ class DivPlatformSMS: public DivDispatch { unsigned short addr; unsigned char val; bool addrOrVal; + QueuedWrite(): addr(0), val(0), addrOrVal(false) {} QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; - std::queue writes; + FixedQueue writes; friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index 68637be8..cec51c0c 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -22,7 +22,7 @@ #include "../dispatch.h" #include "../waveSynth.h" -#include +#include "../fixedQueue.h" #include "sound/snes/SPC_DSP.h" class DivPlatformSNES: public DivDispatch { @@ -81,9 +81,10 @@ class DivPlatformSNES: public DivDispatch { struct QueuedWrite { unsigned char addr; unsigned char val; + QueuedWrite(): addr(0), val(0) {} QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; signed char sampleMem[65536]; signed char copyOfSampleMem[65536]; diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 728d7a91..b38b9f86 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -23,7 +23,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) rWrite(((c)<<5)|(a),v); #define CHIP_DIVIDER 2 diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index de67c2fa..d83ae477 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -21,7 +21,7 @@ #define _SU_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/su.h" class DivPlatformSoundUnit: public DivDispatch { @@ -72,11 +72,12 @@ class DivPlatformSoundUnit: public DivDispatch { DivDispatchOscBuffer* oscBuf[8]; bool isMuted[8]; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char lastPan; bool sampleMemSize; unsigned char ilCtrl, ilSize, fil1; diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index f2fc6d43..04039e6e 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -21,8 +21,8 @@ #include "../engine.h" #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);}} -#define postWrite(a,v) postDACWrites.emplace(a,v); +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);}} +#define postWrite(a,v) postDACWrites.push(DivRegWrite(a,v)); #define CHIP_DIVIDER 32 diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index cff6cc62..72ddae39 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -23,7 +23,7 @@ #include "../dispatch.h" #include "../waveSynth.h" #include "sound/swan.h" -#include +#include "../fixedQueue.h" class DivPlatformSwan: public DivDispatch { struct Channel: public SharedChannel { @@ -46,12 +46,13 @@ class DivPlatformSwan: public DivDispatch { unsigned char regPool[0x80]; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; - std::queue postDACWrites; + FixedQueue writes; + FixedQueue postDACWrites; WSwan* ws; void updateWave(int ch); friend void putDispatchChip(void*,int); diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index 5d21e1ad..90140da9 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -23,7 +23,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } const char* regCheatSheetT6W28[]={ "Data0", "0", diff --git a/src/engine/platform/t6w28.h b/src/engine/platform/t6w28.h index d324a09c..33c03a88 100644 --- a/src/engine/platform/t6w28.h +++ b/src/engine/platform/t6w28.h @@ -21,7 +21,7 @@ #define _T6W28_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "sound/t6w28/T6W28_Apu.h" class DivPlatformT6W28: public DivDispatch { @@ -38,11 +38,12 @@ class DivPlatformT6W28: public DivDispatch { bool isMuted[4]; bool easyNoise; struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char lastPan; int cycles, curChan, delay; diff --git a/src/engine/platform/tia.h b/src/engine/platform/tia.h index 95ae9917..4e7420b7 100644 --- a/src/engine/platform/tia.h +++ b/src/engine/platform/tia.h @@ -21,7 +21,6 @@ #define _TIA_H #include "../dispatch.h" -#include #include "sound/tia/Audio.h" class DivPlatformTIA: public DivDispatch { diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 86128340..6e70895b 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -986,7 +986,7 @@ void DivPlatformTX81Z::poke(std::vector& wlist) { } void DivPlatformTX81Z::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,330); fm_ymfm->reset(); if (dumpWrites) { diff --git a/src/engine/platform/tx81z.h b/src/engine/platform/tx81z.h index d1ebd543..d0bc759c 100644 --- a/src/engine/platform/tx81z.h +++ b/src/engine/platform/tx81z.h @@ -21,7 +21,7 @@ #define _TX81Z_H #include "fmshared_OPM.h" -#include +#include "../fixedQueue.h" #include "sound/ymfm/ymfm_opz.h" class DivTXInterface: public ymfm::ymfm_interface { diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index 3701b5aa..9edaf2db 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -22,7 +22,7 @@ #include //#define rWrite(a,v) pendingWrites[a]=v; -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) rWrite(0x400+((c)<<6)+((a)<<2),v); #define CHIP_DIVIDER 16 diff --git a/src/engine/platform/vb.h b/src/engine/platform/vb.h index 09193f25..2efcdd1b 100644 --- a/src/engine/platform/vb.h +++ b/src/engine/platform/vb.h @@ -21,7 +21,7 @@ #define _PLATFORM_VB_H #include "../dispatch.h" -#include +#include "../fixedQueue.h" #include "../waveSynth.h" #include "sound/vsu.h" @@ -44,11 +44,12 @@ class DivPlatformVB: public DivDispatch { DivDispatchOscBuffer* oscBuf[6]; bool isMuted[6]; struct QueuedWrite { - unsigned short addr; - unsigned char val; - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} + unsigned short addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char lastPan; int cycles, curChan, delay; diff --git a/src/engine/platform/vic20.h b/src/engine/platform/vic20.h index 5125bd96..e233d984 100644 --- a/src/engine/platform/vic20.h +++ b/src/engine/platform/vic20.h @@ -22,7 +22,6 @@ #include "../dispatch.h" #include "sound/vic20sound.h" -#include class DivPlatformVIC20: public DivDispatch { struct Channel: public SharedChannel { diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index b52bc106..96088d93 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -22,7 +22,7 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) rWrite(0x9000+(c<<12)+(a&3),v) const char* regCheatSheetVRC6[]={ diff --git a/src/engine/platform/vrc6.h b/src/engine/platform/vrc6.h index 5a241610..df0aa92e 100644 --- a/src/engine/platform/vrc6.h +++ b/src/engine/platform/vrc6.h @@ -20,7 +20,7 @@ #ifndef _VRC6_H #define _VRC6_H -#include +#include "../fixedQueue.h" #include "../dispatch.h" #include "vgsound_emu/src/vrcvi/vrcvi.hpp" @@ -47,11 +47,12 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf { DivDispatchOscBuffer* oscBuf[3]; bool isMuted[3]; struct QueuedWrite { - unsigned short addr; - unsigned char val; - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} + unsigned short addr; + unsigned char val; + QueuedWrite(): addr(0), val(0) {} + QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v) {} }; - std::queue writes; + FixedQueue writes; unsigned char sampleBank; unsigned char writeOscBuf; vrcvi_core vrc6; diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 135ad140..68cccca4 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -974,7 +974,7 @@ void DivPlatformYM2203::poke(std::vector& wlist) { } void DivPlatformYM2203::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,256); if (dumpWrites) { addWrite(0xffffffff,0); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 589d90d3..02a5ffa0 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1481,7 +1481,7 @@ void DivPlatformYM2608::poke(std::vector& wlist) { } void DivPlatformYM2608::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,512); if (dumpWrites) { addWrite(0xffffffff,0); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 66c2f411..4fbf7859 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1441,7 +1441,7 @@ void DivPlatformYM2610::poke(std::vector& wlist) { } void DivPlatformYM2610::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,512); if (dumpWrites) { addWrite(0xffffffff,0); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index d38ad525..4fff4727 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1508,7 +1508,7 @@ void DivPlatformYM2610B::poke(std::vector& wlist) { } void DivPlatformYM2610B::reset() { - while (!writes.empty()) writes.pop_front(); + writes.clear(); memset(regPool,0,512); if (dumpWrites) { addWrite(0xffffffff,0); diff --git a/src/engine/platform/ymz280b.h b/src/engine/platform/ymz280b.h index 3fb4a7dc..14a67dc9 100644 --- a/src/engine/platform/ymz280b.h +++ b/src/engine/platform/ymz280b.h @@ -21,7 +21,6 @@ #define _YMZ280B_H #include "../dispatch.h" -#include #include "sound/ymz280b.h" class DivPlatformYMZ280B: public DivDispatch { diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index 047dc2cb..3592c049 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -260,7 +260,6 @@ int DivPlatformZXBeeper::getRegisterPoolSize() { } void DivPlatformZXBeeper::reset() { - while (!writes.empty()) writes.pop(); memset(regPool,0,128); for (int i=0; i<6; i++) { chan[i]=DivPlatformZXBeeper::Channel(); diff --git a/src/engine/platform/zxbeeper.h b/src/engine/platform/zxbeeper.h index 3e120354..9bd3678a 100644 --- a/src/engine/platform/zxbeeper.h +++ b/src/engine/platform/zxbeeper.h @@ -21,7 +21,6 @@ #define _ZXBEEPER_H #include "../dispatch.h" -#include class DivPlatformZXBeeper: public DivDispatch { struct Channel: public SharedChannel { @@ -35,12 +34,6 @@ class DivPlatformZXBeeper: public DivDispatch { Channel chan[6]; DivDispatchOscBuffer* oscBuf[6]; bool isMuted[6]; - struct QueuedWrite { - unsigned char addr; - unsigned char val; - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} - }; - std::queue writes; unsigned char lastPan, ulaOut; int cycles, curChan, sOffTimer, delay, curSample, curSamplePeriod;