Fix ADPCM-A playback

Add per-chip debug function
Add YM2203, YM2608, YM2610/B debug window
Extend YM2612 debug window
Remove unnecessary values in YM2151, Sega PCM platform
This commit is contained in:
cam900 2022-09-23 23:24:02 +09:00
parent 764ae60740
commit cf1d4e55cf
58 changed files with 726 additions and 91 deletions

View file

@ -86,6 +86,7 @@ class DivPlatformAmiga: public DivDispatch {
int sep1, sep2;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -833,9 +833,6 @@ void DivPlatformArcade::reset() {
}
lastBusy=60;
pcmCycles=0;
pcmL=0;
pcmR=0;
delay=0;
amDepth=0x7f;
pmDepth=0x7f;
@ -846,8 +843,6 @@ void DivPlatformArcade::reset() {
immWrite(0x19,amDepth);
immWrite(0x19,0x80|pmDepth);
//rWrite(0x1b,0x00);
extMode=false;
}
void DivPlatformArcade::setFlags(unsigned int flags) {

View file

@ -79,14 +79,13 @@ class DivPlatformArcade: public DivPlatformOPM {
DivDispatchOscBuffer* oscBuf[8];
opm_t fm;
int baseFreqOff;
int pcmL, pcmR, pcmCycles;
unsigned char amDepth, pmDepth;
ymfm::ym2151* fm_ymfm;
ymfm::ym2151::output_data out_ymfm;
DivArcadeInterface iface;
bool extMode, useYMFM;
bool useYMFM;
bool isMuted[8];
@ -96,6 +95,7 @@ class DivPlatformArcade: public DivPlatformOPM {
void acquire_nuked(short* bufL, short* bufR, size_t start, size_t len);
void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -146,7 +146,8 @@ class DivPlatformAY8910: public DivDispatch {
size_t ayBufLen;
void updateOutSel(bool immediate=false);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -150,7 +150,8 @@ class DivPlatformAY8930: public DivDispatch {
void updateOutSel(bool immediate=false);
void immWrite(unsigned char a, unsigned char v);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -62,7 +62,8 @@ class DivPlatformBubSysWSG: public DivDispatch {
k005289_core k005289;
unsigned short regPool[4];
void updateWave(int ch);
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -82,7 +82,8 @@ class DivPlatformC64: public DivDispatch {
SID sid;
reSIDfp::SID sid_fp;
unsigned char regPool[32];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void acquire_classic(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -33,7 +33,8 @@ class DivPlatformDummy: public DivDispatch {
Channel chan[128];
DivDispatchOscBuffer* oscBuf[128];
bool isMuted[128];
unsigned char chans;
unsigned char chans;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -77,7 +77,8 @@ class DivPlatformFDS: public DivDispatch {
unsigned char regPool[128];
void updateWave();
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void doWrite(unsigned short addr, unsigned char data);

View file

@ -92,7 +92,8 @@ class DivPlatformGB: public DivDispatch {
unsigned char regPool[128];
unsigned char procMute();
void updateWave();
void updateWave();
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -115,7 +115,8 @@ class DivPlatformGenesis: public DivPlatformOPN {
bool ladder;
unsigned char dacVolTable[128];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
inline void processDAC();

View file

@ -51,7 +51,8 @@ class DivPlatformGenesisExt: public DivPlatformGenesis {
pan(3) {}
};
OpChannel opChan[4];
bool isOpMuted[4];
bool isOpMuted[4];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
int dispatch(DivCommand c);

View file

@ -84,7 +84,8 @@ class DivPlatformLynx: public DivDispatch {
Channel chan[4];
DivDispatchOscBuffer* oscBuf[4];
bool isMuted[4];
std::unique_ptr<Lynx::Mikey> mikey;
std::unique_ptr<Lynx::Mikey> mikey;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -67,7 +67,8 @@ class DivPlatformMMC5: public DivDispatch {
unsigned char writeOscBuf;
struct _mmc5* mmc5;
unsigned char regPool[128];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -87,6 +87,7 @@ class DivPlatformMSM6258: public DivDispatch {
int delay, updateOsc, sample, samplePos;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -74,6 +74,7 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf {
bool rateSel=false, rateSelInit=false;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -89,6 +89,7 @@ class DivPlatformN163: public DivDispatch {
unsigned char regPool[128];
void updateWave(int ch, int wave, int pos, int len);
void updateWaveCh(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -74,6 +74,7 @@ class DivPlatformNamcoWSG: public DivDispatch {
int devType, chans;
unsigned char regPool[512];
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -79,6 +79,7 @@ class DivPlatformNES: public DivDispatch {
xgm::NES_DMC* nes2_NP;
unsigned char regPool[128];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void doWrite(unsigned short addr, unsigned char data);

View file

@ -118,6 +118,7 @@ class DivPlatformOPL: public DivDispatch {
int toFreq(int freq);
double NOTE_ADPCMB(int note);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void acquire_nuked(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -93,6 +93,7 @@ class DivPlatformOPLL: public DivDispatch {
int octave(int freq);
int toFreq(int freq);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void acquire_nuked(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -91,6 +91,7 @@ class DivPlatformPCE: public DivDispatch {
PCE_PSG* pce;
unsigned char regPool[128];
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -77,6 +77,7 @@ class DivPlatformPCMDAC: public DivDispatch {
int outDepth;
bool outStereo;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -84,6 +84,7 @@ class DivPlatformPCSpeaker: public DivDispatch {
unsigned short freq, lastFreq;
unsigned char regPool[2];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void beepFreq(int freq, int delay=0);

View file

@ -62,6 +62,7 @@ class DivPlatformPET: public DivDispatch {
bool isMuted;
unsigned char regPool[16];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -72,6 +72,7 @@ class DivPlatformQSound: public DivDispatch {
struct qsound_chip chip;
unsigned short regPool[512];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -71,6 +71,7 @@ class DivPlatformRF5C68: public DivDispatch {
size_t sampleMemLen;
rf5c68_device rf5c68;
unsigned char regPool[144];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -72,6 +72,7 @@ class DivPlatformSAA1099: public DivDispatch {
size_t saaBufLen;
unsigned char saaEnv[2];
unsigned char saaNoise[2];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void acquire_saaSound(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -65,6 +65,7 @@ class DivPlatformSCC: public DivDispatch {
unsigned char regBase;
unsigned char regPool[225];
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -441,8 +441,6 @@ void DivPlatformSegaPCM::reset() {
pcmR=0;
sampleBank=0;
delay=0;
amDepth=0x7f;
pmDepth=0x7f;
if (dumpWrites) {
for (int i=0; i<16; i++) {
@ -451,8 +449,6 @@ void DivPlatformSegaPCM::reset() {
addWrite(0x10003+(i<<3),0x7f);
}
}
extMode=false;
}
void DivPlatformSegaPCM::setFlags(unsigned int flags) {

View file

@ -80,21 +80,19 @@ class DivPlatformSegaPCM: public DivDispatch {
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
};
std::queue<QueuedWrite> writes;
int delay, baseFreqOff;
int delay;
int pcmL, pcmR, pcmCycles;
unsigned char sampleBank;
unsigned char lastBusy;
unsigned char amDepth, pmDepth;
unsigned char regPool[256];
bool extMode, useYMFM;
bool isMuted[16];
short oldWrites[256];
short pendingWrites[256];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -78,6 +78,7 @@ class DivPlatformSMS: public DivDispatch {
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
};
std::queue<QueuedWrite> writes;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
void acquire_nuked(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -113,6 +113,7 @@ class DivPlatformSoundUnit: public DivDispatch {
void writeControl(int ch);
void writeControlUpper(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -74,6 +74,7 @@ class DivPlatformSwan: public DivDispatch {
std::queue<QueuedWrite> writes;
WSwan* ws;
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -46,6 +46,7 @@ class DivPlatformTIA: public DivDispatch {
unsigned char chanOscCounter;
TIA::Audio tia;
unsigned char regPool[16];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
unsigned char dealWithFreq(unsigned char shape, int base, int pitch);

View file

@ -88,6 +88,7 @@ class DivPlatformTX81Z: public DivPlatformOPM {
int octave(int freq);
int toFreq(int freq);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -60,6 +60,7 @@ class DivPlatformVERA: public DivDispatch {
struct VERA_PCM* pcm;
int calcNoteFreq(int ch, int note);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -63,6 +63,7 @@ class DivPlatformVIC20: public DivDispatch {
unsigned char regPool[16];
sound_vic20_t* vic;
void updateWave(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View file

@ -78,6 +78,7 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf {
vrcvi_core vrc6;
unsigned char regPool[13];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -120,6 +120,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf {
double NoteX1_010(int ch, int note);
void updateWave(int ch);
void updateEnvelope(int ch);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
u8 read_byte(u32 address);

View file

@ -94,6 +94,7 @@ class DivPlatformYM2203: public DivPlatformOPN {
bool extMode;
unsigned char prescale;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -63,7 +63,6 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
}
if (opChan[ch].insChanged) { // TODO how does this work?
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
}
opChan[ch].insChanged=false;
@ -103,22 +102,6 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
}
opChan[ch].ins=c.value;
break;
case DIV_CMD_PANNING: {
if (c.value==0 && c.value2==0) {
opChan[ch].pan=3;
} else {
opChan[ch].pan=(c.value2>0)|((c.value>0)<<1);
}
DivInstrument* ins=parent->getIns(opChan[ch].ins,DIV_INS_FM);
if (parent->song.sharedExtStat) {
for (int i=0; i<4; i++) {
if (ch==i) continue;
opChan[i].pan=opChan[ch].pan;
}
}
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
break;
}
case DIV_CMD_PITCH: {
opChan[ch].pitch=c.value;
opChan[ch].freqChanged=true;

View file

@ -29,13 +29,29 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 {
signed char konCycles;
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
int vol;
unsigned char pan;
// UGLY
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
inPorta(false), mask(true), vol(0), pan(3) {}
OpChannel():
freqH(0),
freqL(0),
freq(0),
baseFreq(0),
pitch(0),
pitch2(0),
portaPauseFreq(0),
ins(-1),
active(false),
insChanged(true),
freqChanged(false),
keyOn(false),
keyOff(false),
portaPause(false),
inPorta(false),
mask(true),
vol(0) {}
};
OpChannel opChan[4];
bool isOpMuted[4];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
int dispatch(DivCommand c);

View file

@ -546,14 +546,14 @@ void DivPlatformYM2608::tick(bool sysTick) {
if (!isMuted[i] && (chan[i].std.vol.had || chan[i].std.panL.had)) {
immWrite(0x18+(i-9),isMuted[i]?0:((chan[i].pan<<6)|chan[i].outVol));
}
if (chan[i].keyOff) {
writeRSSOff|=(1<<(i-9));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
writeRSSOn|=(1<<(i-9));
chan[i].keyOn=false;
}
}
if (chan[i].keyOff) {
writeRSSOff|=(1<<(i-9));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
writeRSSOn|=(1<<(i-9));
chan[i].keyOn=false;
}
}
// ADPCM-B
@ -854,6 +854,13 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
}
break;
}
case DIV_CMD_ADPCMA_GLOBAL_VOLUME: {
if (globalRSSVolume!=(c.value&0x3f)) {
globalRSSVolume=c.value&0x3f;
immWrite(0x11,globalRSSVolume&0x3f);
}
break;
}
case DIV_CMD_GET_VOLUME: {
return chan[c.chan].vol;
break;
@ -1184,7 +1191,7 @@ void DivPlatformYM2608::forceIns() {
if (i>14) { // ADPCM-B
immWrite(0x10b,chan[i].outVol);
} else {
immWrite(0x18+(i-9),isMuted[i]?0:((chan[i].pan<<6)|chan[i].vol));
immWrite(0x18+(i-9),isMuted[i]?0:((chan[i].pan<<6)|chan[i].outVol));
}
}
@ -1267,7 +1274,7 @@ void DivPlatformYM2608::reset() {
immWrite(0x22,0x08);
// PCM volume
immWrite(0x11,0x3f); // A
immWrite(0x11,globalRSSVolume); // A
immWrite(0x10b,0xff); // B
// ADPCM limit

View file

@ -110,6 +110,7 @@ class DivPlatformYM2608: public DivPlatformOPN {
double NOTE_OPNB(int ch, int note);
double NOTE_ADPCMB(int note);
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -477,7 +477,7 @@ void DivPlatformYM2608Ext::forceIns() {
if (i>14) { // ADPCM-B
immWrite(0x10b,chan[i].outVol);
} else {
immWrite(0x18+(i-9),isMuted[i]?0:((chan[i].pan<<6)|chan[i].vol));
immWrite(0x18+(i-9),isMuted[i]?0:((chan[i].pan<<6)|chan[i].outVol));
}
}
ay->forceIns();

View file

@ -31,11 +31,29 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 {
int vol;
unsigned char pan;
// UGLY
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
inPorta(false), mask(true), vol(0), pan(3) {}
OpChannel():
freqH(0),
freqL(0),
freq(0),
baseFreq(0),
pitch(0),
pitch2(0),
portaPauseFreq(0),
ins(-1),
active(false),
insChanged(true),
freqChanged(false),
keyOn(false),
keyOff(false),
portaPause(false),
inPorta(false),
mask(true),
vol(0),
pan(3) {}
};
OpChannel opChan[4];
bool isOpMuted[4];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
int dispatch(DivCommand c);

View file

@ -484,16 +484,16 @@ void DivPlatformYM2610::tick(bool sysTick) {
if (!isMuted[i] && (chan[i].std.vol.had || chan[i].std.panL.had)) {
immWrite(0x108+(i-adpcmAChanOffs),isMuted[i]?0:((chan[i].pan<<6)|chan[i].outVol));
}
if (chan[i].keyOff) {
writeADPCMAOff|=(1<<(i-adpcmAChanOffs));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
if (chan[i].sample>=0 && chan[i].sample<parent->song.sampleLen) {
writeADPCMAOn|=(1<<(i-adpcmAChanOffs));
}
chan[i].keyOn=false;
}
if (chan[i].keyOff) {
writeADPCMAOff|=(1<<(i-adpcmAChanOffs));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
if (chan[i].sample>=0 && chan[i].sample<parent->song.sampleLen) {
writeADPCMAOn|=(1<<(i-adpcmAChanOffs));
}
chan[i].keyOn=false;
}
}
// ADPCM-B
@ -1246,7 +1246,7 @@ void DivPlatformYM2610::reset() {
immWrite(0x22,0x08);
// PCM volume
immWrite(0x101,0x3f); // A
immWrite(0x101,globalADPCMAVolume); // A
immWrite(0x1b,0xff); // B
}
@ -1259,7 +1259,7 @@ bool DivPlatformYM2610::keyOffAffectsArp(int ch) {
}
void DivPlatformYM2610::notifyInsChange(int ins) {
for (int i=0; i<14; i++) {
for (int i=0; i<chanNum; i++) {
if (chan[i].ins==ins) {
chan[i].insChanged=true;
}

View file

@ -35,6 +35,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base<14> {
1, 2, 4, 5
};
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -546,16 +546,16 @@ void DivPlatformYM2610B::tick(bool sysTick) {
if (!isMuted[i] && (chan[i].std.vol.had || chan[i].std.panL.had)) {
immWrite(0x108+(i-adpcmAChanOffs),isMuted[i]?0:((chan[i].pan<<6)|chan[i].outVol));
}
if (chan[i].keyOff) {
writeADPCMAOff|=(1<<(i-adpcmAChanOffs));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
if (chan[i].sample>=0 && chan[i].sample<parent->song.sampleLen) {
writeADPCMAOn|=(1<<(i-adpcmAChanOffs));
}
chan[i].keyOn=false;
}
if (chan[i].keyOff) {
writeADPCMAOff|=(1<<(i-adpcmAChanOffs));
chan[i].keyOff=false;
}
if (chan[i].keyOn) {
if (chan[i].sample>=0 && chan[i].sample<parent->song.sampleLen) {
writeADPCMAOn|=(1<<(i-adpcmAChanOffs));
}
chan[i].keyOn=false;
}
}
// ADPCM-B
@ -1325,7 +1325,7 @@ bool DivPlatformYM2610B::keyOffAffectsArp(int ch) {
}
void DivPlatformYM2610B::notifyInsChange(int ins) {
for (int i=0; i<16; i++) {
for (int i=0; i<chanNum; i++) {
if (chan[i].ins==ins) {
chan[i].insChanged=true;
}

View file

@ -31,6 +31,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base<16> {
0, 1, 2, 4, 5, 6
};
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -24,6 +24,7 @@
class DivPlatformYM2610BExt: public DivPlatformYM2610B {
DivPlatformYM2610Base::OpChannel opChan[4];
bool isOpMuted[4];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
int dispatch(DivCommand c);

View file

@ -24,6 +24,7 @@
class DivPlatformYM2610Ext: public DivPlatformYM2610 {
DivPlatformYM2610Base::OpChannel opChan[4];
bool isOpMuted[4];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
int dispatch(DivCommand c);

View file

@ -71,6 +71,7 @@ class DivPlatformYMZ280B: public DivDispatch {
size_t sampleMemLen;
ymz280b_device ymz280b;
unsigned char regPool[256];
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:

View file

@ -72,6 +72,7 @@ class DivPlatformZXBeeper: public DivDispatch {
int tempR[32];
unsigned char regPool[128];
bool sampleOut;
friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);