Code review suggestions

Haven't had a good peer review in ages.
This commit is contained in:
Kagamiin~ 2023-10-26 09:43:01 -03:00
parent 59d56b169b
commit 170248e61a
7 changed files with 122 additions and 136 deletions

1
.gitignore vendored
View file

@ -35,4 +35,3 @@ res/docpdf/manual.pdf
res/docpdf/.venv res/docpdf/.venv
res/docpdf/htmldoc/ res/docpdf/htmldoc/
res/furnace.appdata.xml res/furnace.appdata.xml
compile_commands.json

View file

@ -1,2 +0,0 @@
CompileFlags:
Add: ["-xc", "-Wall", "-Wextra"]

View file

@ -26,14 +26,14 @@
#define CHIP_FREQBASE (32768*288) #define CHIP_FREQBASE (32768*288)
#define OFFSET_AM_VIB_SUS_KSR_MULT 0x00 #define ADDR_AM_VIB_SUS_KSR_MULT 0x00
#define OFFSET_KSL_TL 0x01 #define ADDR_KSL_TL 0x01
#define OFFSET_AR_DR 0x02 #define ADDR_AR_DR 0x02
#define OFFSET_SL_RR 0x03 #define ADDR_SL_RR 0x03
#define OFFSET_FREQL 0x04 #define ADDR_FREQL 0x04
#define OFFSET_FREQH_BLOCK_DELAY 0x05 #define ADDR_FREQH_BLOCK_DELAY 0x05
#define OFFSET_DAM_DVB_LEFT_RIGHT_MODIN 0x06 #define ADDR_DAM_DVB_LEFT_RIGHT_MODIN 0x06
#define OFFSET_OUTLVL_NOISE_WS 0x07 #define ADDR_OUTLVL_NOISE_WS 0x07
#define KEY_ON_REGS_START (18*8*4) #define KEY_ON_REGS_START (18*8*4)
@ -72,13 +72,13 @@ void DivPlatformESFM::tick(bool sysTick) {
unsigned char noise=chan[i].state.esfm.noise&3; unsigned char noise=chan[i].state.esfm.noise&3;
if (isMuted[i]) { if (isMuted[i]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
if (KVS(i, o)) { if (KVS(i,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
} }
@ -99,7 +99,7 @@ void DivPlatformESFM::tick(bool sysTick) {
unsigned short baseAddr=i*32+o*8; unsigned short baseAddr=i*32+o*8;
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o];
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
} }
@ -120,17 +120,16 @@ void DivPlatformESFM::tick(bool sysTick) {
} }
if (chan[i].std.duty.had) { if (chan[i].std.duty.had) {
int o=3; unsigned short baseAddr=i*32+3*8;
unsigned short baseAddr=i*32+o*8;
DivInstrumentESFM& ins=chan[i].state.esfm; DivInstrumentESFM& ins=chan[i].state.esfm;
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[i].state.fm.op[3];
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[3];
ins.noise=chan[i].std.duty.val; ins.noise=chan[i].std.duty.val;
if (isMuted[i]) { if (isMuted[i]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?ins.noise&3:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((ins.noise&3)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?ins.noise&3:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((ins.noise&3)<<3)|((opE.outLvl&7)<<5));
} }
} }
@ -142,40 +141,40 @@ void DivPlatformESFM::tick(bool sysTick) {
if (m.am.had) { if (m.am.had) {
op.am=m.am.val; op.am=m.am.val;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
if (m.vib.had) { if (m.vib.had) {
op.vib=m.vib.val; op.vib=m.vib.val;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
if (m.sus.had) { if (m.sus.had) {
op.sus=m.sus.val; op.sus=m.sus.val;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
if (m.ksr.had) { if (m.ksr.had) {
op.ksr=m.ksr.val; op.ksr=m.ksr.val;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
if (m.mult.had) { if (m.mult.had) {
op.mult=m.mult.val; op.mult=m.mult.val;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
if (m.ar.had) { if (m.ar.had) {
op.ar=m.ar.val; op.ar=m.ar.val;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
if (m.dr.had) { if (m.dr.had) {
op.dr=m.dr.val; op.dr=m.dr.val;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
if (m.sl.had) { if (m.sl.had) {
op.sl=m.sl.val; op.sl=m.sl.val;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
if (m.rr.had) { if (m.rr.had) {
op.rr=m.rr.val; op.rr=m.rr.val;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
if (m.tl.had || m.ksl.had) { if (m.tl.had || m.ksl.had) {
@ -187,30 +186,30 @@ void DivPlatformESFM::tick(bool sysTick) {
} }
if (KVS(i, o)) { if (KVS(i, o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
if (m.dam.had) { if (m.dam.had) {
op.dam=m.dam.val; op.dam=m.dam.val;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
if (m.dvb.had) { if (m.dvb.had) {
op.dvb=m.dvb.val; op.dvb=m.dvb.val;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
if (m.rs.had) { if (m.rs.had) {
// operator panning // operator panning
opE.left=(m.rs.val&2)!=0; opE.left=(m.rs.val&2)!=0;
opE.right=(m.rs.val&1)!=0; opE.right=(m.rs.val&1)!=0;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
if (m.d2r.had) { if (m.d2r.had) {
// modIn // modIn
opE.modIn=m.d2r.val; opE.modIn=m.d2r.val;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
if (m.egt.had | m.ws.had) { if (m.egt.had | m.ws.had) {
@ -224,9 +223,9 @@ void DivPlatformESFM::tick(bool sysTick) {
} }
if (isMuted[i]) { if (isMuted[i]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
} }
} }
@ -253,7 +252,7 @@ void DivPlatformESFM::tick(bool sysTick) {
} }
if (m.dt2.had) { if (m.dt2.had) {
opE.delay=m.dt2.val; opE.delay=m.dt2.val;
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5)); rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
} }
} }
} }
@ -285,7 +284,7 @@ void DivPlatformESFM::tick(bool sysTick) {
// logI("chan[%d] hard reset, slrr := 0x0f", i); // logI("chan[%d] hard reset, slrr := 0x0f", i);
for (int o=0; o<4; o++) { for (int o=0; o<4; o++) {
unsigned short baseAddr=i*32+o*8; unsigned short baseAddr=i*32+o*8;
immWrite(baseAddr+OFFSET_SL_RR,0x0f); immWrite(baseAddr+ADDR_SL_RR,0x0f);
hardResetElapsed++; hardResetElapsed++;
} }
} }
@ -313,8 +312,8 @@ void DivPlatformESFM::tick(bool sysTick) {
chan[i].freqL[o]=freqt&0xff; chan[i].freqL[o]=freqt&0xff;
chan[i].freqH[o]=freqt>>8; chan[i].freqH[o]=freqt>>8;
} }
immWrite(baseAddr+OFFSET_FREQL,chan[i].freqL[o]); immWrite(baseAddr+ADDR_FREQL,chan[i].freqL[o]);
immWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5)); immWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
hardResetElapsed+=2; hardResetElapsed+=2;
} }
chan[i].freqChanged=false; chan[i].freqChanged=false;
@ -342,7 +341,7 @@ void DivPlatformESFM::tick(bool sysTick) {
for (int o=0; o<4; o++) { for (int o=0; o<4; o++) {
unsigned short baseAddr=i*32+o*8; unsigned short baseAddr=i*32+o*8;
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
immWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); immWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
if (i<16) { if (i<16) {
immWrite(KEY_ON_REGS_START+i, 1); immWrite(KEY_ON_REGS_START+i, 1);
@ -385,13 +384,13 @@ void DivPlatformESFM::muteChannel(int ch, bool mute) {
unsigned char noise=chan[ch].state.esfm.noise&3; unsigned char noise=chan[ch].state.esfm.noise&3;
if (isMuted[ch]) { if (isMuted[ch]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
if (KVS(ch, o)) { if (KVS(ch,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
} }
@ -408,21 +407,21 @@ void DivPlatformESFM::commitState(int ch, DivInstrument* ins) {
unsigned char noise=chan[ch].state.esfm.noise&3; unsigned char noise=chan[ch].state.esfm.noise&3;
if (isMuted[ch]) { if (isMuted[ch]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
if (KVS(ch, o)) { if (KVS(ch,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[ch].freqH[o]|(opE.delay<<5)); rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[ch].freqH[o]|(opE.delay<<5));
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[ch].globalPan)&1)<<4)|(((opE.right&(chan[ch].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[ch].globalPan)&1)<<4)|(((opE.right&(chan[ch].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
} }
} }
@ -471,10 +470,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
for (int o=0; o<4; o++) { for (int o=0; o<4; o++) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
if (KVS(c.chan, o)) { if (KVS(c.chan,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
break; break;
@ -494,7 +493,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
break; break;
} }
@ -551,7 +550,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.mult=c.value2&15; op.mult=c.value2&15;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
break; break;
} }
case DIV_CMD_FM_TL: { case DIV_CMD_FM_TL: {
@ -560,10 +559,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.tl=c.value2&63; op.tl=c.value2&63;
if (KVS(c.chan, o)) { if (KVS(c.chan,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
break; break;
} }
@ -573,7 +572,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ar=c.value2&15; op.ar=c.value2&15;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -581,7 +580,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ar=c.value2&15; op.ar=c.value2&15;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
break; break;
} }
@ -591,7 +590,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.dr=c.value2&15; op.dr=c.value2&15;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -599,7 +598,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.dr=c.value2&15; op.dr=c.value2&15;
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
} }
break; break;
} }
@ -609,7 +608,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.sl=c.value2&15; op.sl=c.value2&15;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -617,7 +616,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.sl=c.value2&15; op.sl=c.value2&15;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
break; break;
} }
@ -627,7 +626,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.rr=c.value2&15; op.rr=c.value2&15;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -635,7 +634,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.rr=c.value2&15; op.rr=c.value2&15;
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
} }
break; break;
} }
@ -645,7 +644,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.am=c.value2&1; op.am=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -653,7 +652,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.am=c.value2&1; op.am=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
break; break;
} }
@ -663,7 +662,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.vib=c.value2&1; op.vib=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -671,7 +670,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.vib=c.value2&1; op.vib=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
break; break;
} }
@ -681,7 +680,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.sus=c.value2&1; op.sus=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -689,7 +688,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.sus=c.value2&1; op.sus=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
break; break;
} }
@ -699,7 +698,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ksr=c.value2&1; op.ksr=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -707,7 +706,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ksr=c.value2&1; op.ksr=c.value2&1;
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf)); rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
} }
break; break;
} }
@ -720,9 +719,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned char noise=chan[c.chan].state.esfm.noise&3; unsigned char noise=chan[c.chan].state.esfm.noise&3;
op.ws=c.value2&7; op.ws=c.value2&7;
if (isMuted[c.chan]) { if (isMuted[c.chan]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
} }
} }
} else { } else {
@ -734,9 +733,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned char noise=chan[c.chan].state.esfm.noise&3; unsigned char noise=chan[c.chan].state.esfm.noise&3;
op.ws=c.value2&7; op.ws=c.value2&7;
if (isMuted[c.chan]) { if (isMuted[c.chan]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
} }
} }
break; break;
@ -748,10 +747,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ksl=c.value2&3; op.ksl=c.value2&3;
if (KVS(c.chan, o)) { if (KVS(c.chan,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
} else { } else {
@ -760,10 +759,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
op.ksl=c.value2&3; op.ksl=c.value2&3;
if (KVS(c.chan, o)) { if (KVS(c.chan,o)) {
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
} else { } else {
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
} }
} }
break; break;
@ -775,7 +774,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
op.dam=c.value2&1; op.dam=c.value2&1;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
break; break;
} }
case DIV_CMD_FM_PM_DEPTH: { case DIV_CMD_FM_PM_DEPTH: {
@ -785,7 +784,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
op.dvb=c.value2&1; op.dvb=c.value2&1;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
break; break;
} }
case DIV_CMD_FM_FIXFREQ: { case DIV_CMD_FM_FIXFREQ: {
@ -809,9 +808,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
opE.left=c.value2&1; opE.left=(c.value2&0xf0)!=0;
opE.right=(c.value2&2)>>1; opE.right=(c.value2&0x0f)!=0;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
break; break;
} }
case DIV_CMD_ESFM_OUTLVL: { case DIV_CMD_ESFM_OUTLVL: {
@ -823,9 +822,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned char noise=chan[c.chan].state.esfm.noise&3; unsigned char noise=chan[c.chan].state.esfm.noise&3;
opE.outLvl=c.value2&7; opE.outLvl=c.value2&7;
if (isMuted[c.chan]) { if (isMuted[c.chan]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
} }
} }
} else { } else {
@ -837,9 +836,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned char noise=chan[c.chan].state.esfm.noise&3; unsigned char noise=chan[c.chan].state.esfm.noise&3;
opE.outLvl=c.value2&7; opE.outLvl=c.value2&7;
if (isMuted[c.chan]) { if (isMuted[c.chan]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
} }
} }
break; break;
@ -851,7 +850,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
opE.modIn=c.value2&7; opE.modIn=c.value2&7;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -860,7 +859,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
opE.modIn=c.value2&7; opE.modIn=c.value2&7;
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7)); rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
} }
break; break;
} }
@ -870,7 +869,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
opE.delay=c.value2&7; opE.delay=c.value2&7;
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5)); rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
} }
} else { } else {
unsigned int o=c.value; unsigned int o=c.value;
@ -878,21 +877,20 @@ int DivPlatformESFM::dispatch(DivCommand c) {
unsigned short baseAddr=c.chan*32+o*8; unsigned short baseAddr=c.chan*32+o*8;
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
opE.delay=c.value2&7; opE.delay=c.value2&7;
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5)); rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
} }
break; break;
} }
case DIV_CMD_STD_NOISE_MODE: { case DIV_CMD_STD_NOISE_MODE: {
unsigned int o=3; unsigned short baseAddr=c.chan*32+3*8;
unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[3];
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[3];
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
DivInstrumentESFM insE=chan[c.chan].state.esfm; DivInstrumentESFM insE=chan[c.chan].state.esfm;
insE.noise=c.value&3; insE.noise=c.value&3;
if (isMuted[c.chan]) { if (isMuted[c.chan]) {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|0); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|0);
} else { } else {
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|((opE.outLvl&7)<<5)); rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|((opE.outLvl&7)<<5));
} }
break; break;
} }
@ -901,7 +899,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
if (o >= 4) break; if (o >= 4) break;
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
if (opE.fixed) break; if (opE.fixed) break;
opE.dt=c.value2; opE.dt=c.value2-0x80;
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
} }
@ -1032,8 +1030,8 @@ void DivPlatformESFM::poke(std::vector<DivRegWrite>& wlist) {
} }
void DivPlatformESFM::setFlags(const DivConfig& flags) { void DivPlatformESFM::setFlags(const DivConfig& flags) {
rate=49716;
chipClock=COLOR_NTSC*4.0; chipClock=COLOR_NTSC*4.0;
rate=chipClock/288.0;
} }
int DivPlatformESFM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { int DivPlatformESFM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {

View file

@ -23,8 +23,8 @@
// ESFM register address space technically spans 0x800 (2048) bytes, // ESFM register address space technically spans 0x800 (2048) bytes,
// but we only need the first 0x254 (596) during normal use. // but we only need the first 0x254 (596) during normal use.
// Rounding it up to 0x260 (608) bytes, the nearest multiple of 16. // Rounding it up to 0x400 bytes, the nearest power of 2.
#define ESFM_REG_POOL_SIZE 0x260 #define ESFM_REG_POOL_SIZE 0x400
class DivPlatformESFM: public DivDispatch { class DivPlatformESFM: public DivDispatch {
struct Channel: public SharedChannel<int> { struct Channel: public SharedChannel<int> {

View file

@ -132,7 +132,6 @@ enum DivSystem {
DIV_SYSTEM_TED, DIV_SYSTEM_TED,
DIV_SYSTEM_C140, DIV_SYSTEM_C140,
DIV_SYSTEM_C219, DIV_SYSTEM_C219,
DIV_SYSTEM_C352,
DIV_SYSTEM_ESFM DIV_SYSTEM_ESFM
}; };

View file

@ -392,14 +392,6 @@ int negEffectVal(unsigned char, unsigned char val) {
return -(int)val; return -(int)val;
}; };
int effectValNibbleFlagPackReversed(unsigned char, unsigned char val) {
return (((val&0x0f)!=0)<<1)|((val&0xf0)!=0);
}
int effectValExcessOf80Hex(unsigned char, unsigned char val) {
return val-0x80;
}
template<const int mask> int effectValAnd(unsigned char, unsigned char val) { template<const int mask> int effectValAnd(unsigned char, unsigned char val) {
return val&mask; return val&mask;
}; };
@ -635,20 +627,20 @@ void DivEngine::registerSystems() {
{0x1b, {DIV_CMD_FM_AR, "1Bxx: Set attack of operator 2 (0 to F)", constVal<1>, effectValAnd<15>}}, {0x1b, {DIV_CMD_FM_AR, "1Bxx: Set attack of operator 2 (0 to F)", constVal<1>, effectValAnd<15>}},
{0x1c, {DIV_CMD_FM_AR, "1Cxx: Set attack of operator 3 (0 to F)", constVal<2>, effectValAnd<15>}}, {0x1c, {DIV_CMD_FM_AR, "1Cxx: Set attack of operator 3 (0 to F)", constVal<2>, effectValAnd<15>}},
{0x1d, {DIV_CMD_FM_AR, "1Dxx: Set attack of operator 4 (0 to F)", constVal<3>, effectValAnd<15>}}, {0x1d, {DIV_CMD_FM_AR, "1Dxx: Set attack of operator 4 (0 to F)", constVal<3>, effectValAnd<15>}},
{0x20, {DIV_CMD_ESFM_OP_PANNING, "20xy: Set panning of operator 1 (x: left; y: right)", constVal<0>, effectValNibbleFlagPackReversed}}, {0x20, {DIV_CMD_ESFM_OP_PANNING, "20xy: Set panning of operator 1 (x: left; y: right)", constVal<0>, effectVal}},
{0x21, {DIV_CMD_ESFM_OP_PANNING, "21xy: Set panning of operator 2 (x: left; y: right)", constVal<1>, effectValNibbleFlagPackReversed}}, {0x21, {DIV_CMD_ESFM_OP_PANNING, "21xy: Set panning of operator 2 (x: left; y: right)", constVal<1>, effectVal}},
{0x22, {DIV_CMD_ESFM_OP_PANNING, "22xy: Set panning of operator 3 (x: left; y: right)", constVal<2>, effectValNibbleFlagPackReversed}}, {0x22, {DIV_CMD_ESFM_OP_PANNING, "22xy: Set panning of operator 3 (x: left; y: right)", constVal<2>, effectVal}},
{0x23, {DIV_CMD_ESFM_OP_PANNING, "23xy: Set panning of operator 4 (x: left; y: right)", constVal<3>, effectValNibbleFlagPackReversed}}, {0x23, {DIV_CMD_ESFM_OP_PANNING, "23xy: Set panning of operator 4 (x: left; y: right)", constVal<3>, effectVal}},
{0x24, {DIV_CMD_ESFM_OUTLVL, "24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}}, {0x24, {DIV_CMD_ESFM_OUTLVL, "24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
{0x25, {DIV_CMD_ESFM_MODIN, "25xy: Set modulation input level (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}}, {0x25, {DIV_CMD_ESFM_MODIN, "25xy: Set modulation input level (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
{0x26, {DIV_CMD_ESFM_ENV_DELAY, "26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay from 0 to 7)", effectOpVal<4>, effectValAnd<7>}}, {0x26, {DIV_CMD_ESFM_ENV_DELAY, "26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
{0x27, {DIV_CMD_STD_NOISE_MODE, "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)", effectValAnd<3>}}, {0x27, {DIV_CMD_STD_NOISE_MODE, "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)", effectValAnd<3>}},
{0x2a, {DIV_CMD_FM_WS, "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 7)", effectOpVal<4>, effectValAnd<7>}}, {0x2a, {DIV_CMD_FM_WS, "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
{0x2f, {DIV_CMD_FM_FIXFREQ, "2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 to 7)", effectOpValNoZero<4>, effectValAnd<7>}}, {0x2f, {DIV_CMD_FM_FIXFREQ, "2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 to 7)", effectOpValNoZero<4>, effectValAnd<7>}},
{0x40, {DIV_CMD_FM_DT, "40xx: Set detune of operator 1 (80: center)", constVal<0>, effectValExcessOf80Hex}}, {0x40, {DIV_CMD_FM_DT, "40xx: Set detune of operator 1 (80: center)", constVal<0>, effectVal}},
{0x41, {DIV_CMD_FM_DT, "41xx: Set detune of operator 2 (80: center)", constVal<1>, effectValExcessOf80Hex}}, {0x41, {DIV_CMD_FM_DT, "41xx: Set detune of operator 2 (80: center)", constVal<1>, effectVal}},
{0x42, {DIV_CMD_FM_DT, "42xx: Set detune of operator 3 (80: center)", constVal<2>, effectValExcessOf80Hex}}, {0x42, {DIV_CMD_FM_DT, "42xx: Set detune of operator 3 (80: center)", constVal<2>, effectVal}},
{0x43, {DIV_CMD_FM_DT, "43xx: Set detune of operator 4 (80: center)", constVal<3>, effectValExcessOf80Hex}}, {0x43, {DIV_CMD_FM_DT, "43xx: Set detune of operator 4 (80: center)", constVal<3>, effectVal}},
{0x50, {DIV_CMD_FM_AM, "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)", effectOpVal<4>, effectValAnd<1>}}, {0x50, {DIV_CMD_FM_AM, "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)", effectOpVal<4>, effectValAnd<1>}},
{0x51, {DIV_CMD_FM_SL, "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)", effectOpVal<4>, effectValAnd<15>}}, {0x51, {DIV_CMD_FM_SL, "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)", effectOpVal<4>, effectValAnd<15>}},
{0x52, {DIV_CMD_FM_RR, "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)", effectOpVal<4>, effectValAnd<15>}}, {0x52, {DIV_CMD_FM_RR, "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)", effectOpVal<4>, effectValAnd<15>}},
@ -1980,7 +1972,7 @@ void DivEngine::registerSystems() {
sysDefs[DIV_SYSTEM_ESFM]=new DivSysDef( sysDefs[DIV_SYSTEM_ESFM]=new DivSysDef(
"ESS ES1xxx series (ESFM)", NULL, 0xd1, 0, 18, true, false, 0, false, 0, "ESS ES1xxx series (ESFM)", NULL, 0xd1, 0, 18, true, false, 0, false, 0,
"A unique FM synth featured in PC sound cards.\nBased on the OPL3 design, but with lots of its features extended.", "a unique FM synth featured in PC sound cards.\nbased on the OPL3 design, but with lots of its features extended.",
{"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8", "FM 9", "FM 10", "FM 11", "FM 12", "FM 13", "FM 14", "FM 15", "FM 16", "FM 17", "FM 18"}, {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8", "FM 9", "FM 10", "FM 11", "FM 12", "FM 13", "FM 14", "FM 15", "FM 16", "FM 17", "FM 18"},
{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"}, {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"},
{DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM}, {DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM},

View file

@ -49,7 +49,7 @@ const char* esfmParamLongNames[9]={
}; };
const char* esfmParamNames[9]={ const char* esfmParamNames[9]={
"OP4 Noise Mode", "Env. Delay", "Output Level", "ModInput", "Left", "Right", "Coarse Tn.", "Detune", "Fixed" "OP4 Noise Mode", "Env. Delay", "Output Level", "ModInput", "Left", "Right", "Tune", "Detune", "Fixed"
}; };
const char* esfmParamShortNames[9]={ const char* esfmParamShortNames[9]={