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:
parent
764ae60740
commit
cf1d4e55cf
58 changed files with 726 additions and 91 deletions
|
|
@ -86,6 +86,7 @@ class DivPlatformAmiga: public DivDispatch {
|
|||
|
||||
int sep1, sep2;
|
||||
|
||||
friend void putDispatchChip(void*,int);
|
||||
friend void putDispatchChan(void*,int,int);
|
||||
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ class DivPlatformPCMDAC: public DivDispatch {
|
|||
int outDepth;
|
||||
bool outStereo;
|
||||
|
||||
friend void putDispatchChip(void*,int);
|
||||
friend void putDispatchChan(void*,int,int);
|
||||
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue