diff --git a/.gitignore b/.gitignore index 06812e61e..09314bb24 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,3 @@ res/docpdf/manual.pdf res/docpdf/.venv res/docpdf/htmldoc/ res/furnace.appdata.xml -compile_commands.json diff --git a/extern/ESFMu/.clangd b/extern/ESFMu/.clangd deleted file mode 100644 index f6023d41f..000000000 --- a/extern/ESFMu/.clangd +++ /dev/null @@ -1,2 +0,0 @@ -CompileFlags: - Add: ["-xc", "-Wall", "-Wextra"] diff --git a/src/engine/platform/esfm.cpp b/src/engine/platform/esfm.cpp index 88d7a8051..f02fd6ef5 100644 --- a/src/engine/platform/esfm.cpp +++ b/src/engine/platform/esfm.cpp @@ -26,14 +26,14 @@ #define CHIP_FREQBASE (32768*288) -#define OFFSET_AM_VIB_SUS_KSR_MULT 0x00 -#define OFFSET_KSL_TL 0x01 -#define OFFSET_AR_DR 0x02 -#define OFFSET_SL_RR 0x03 -#define OFFSET_FREQL 0x04 -#define OFFSET_FREQH_BLOCK_DELAY 0x05 -#define OFFSET_DAM_DVB_LEFT_RIGHT_MODIN 0x06 -#define OFFSET_OUTLVL_NOISE_WS 0x07 +#define ADDR_AM_VIB_SUS_KSR_MULT 0x00 +#define ADDR_KSL_TL 0x01 +#define ADDR_AR_DR 0x02 +#define ADDR_SL_RR 0x03 +#define ADDR_FREQL 0x04 +#define ADDR_FREQH_BLOCK_DELAY 0x05 +#define ADDR_DAM_DVB_LEFT_RIGHT_MODIN 0x06 +#define ADDR_OUTLVL_NOISE_WS 0x07 #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; 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 { - rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); - 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_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); + if (KVS(i,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } 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; DivInstrumentFM::Operator& op=chan[i].state.fm.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) { - int o=3; - unsigned short baseAddr=i*32+o*8; + unsigned short baseAddr=i*32+3*8; DivInstrumentESFM& ins=chan[i].state.esfm; - DivInstrumentFM::Operator& op=chan[i].state.fm.op[o]; - DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o]; + DivInstrumentFM::Operator& op=chan[i].state.fm.op[3]; + DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[3]; ins.noise=chan[i].std.duty.val; 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 { - 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { @@ -187,30 +186,30 @@ void DivPlatformESFM::tick(bool sysTick) { } 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 { - 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) { 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) { 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) { // operator panning opE.left=(m.rs.val&2)!=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) { // modIn 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) { @@ -224,9 +223,9 @@ void DivPlatformESFM::tick(bool sysTick) { } 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 { - 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) { 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); for (int o=0; o<4; o++) { unsigned short baseAddr=i*32+o*8; - immWrite(baseAddr+OFFSET_SL_RR,0x0f); + immWrite(baseAddr+ADDR_SL_RR,0x0f); hardResetElapsed++; } } @@ -313,8 +312,8 @@ void DivPlatformESFM::tick(bool sysTick) { chan[i].freqL[o]=freqt&0xff; chan[i].freqH[o]=freqt>>8; } - immWrite(baseAddr+OFFSET_FREQL,chan[i].freqL[o]); - immWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5)); + immWrite(baseAddr+ADDR_FREQL,chan[i].freqL[o]); + immWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5)); hardResetElapsed+=2; } chan[i].freqChanged=false; @@ -342,7 +341,7 @@ void DivPlatformESFM::tick(bool sysTick) { for (int o=0; o<4; o++) { unsigned short baseAddr=i*32+o*8; 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) { 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; 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 { - rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); - 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_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); + if (KVS(ch,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); } 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; 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 { - rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); - 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_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5)); + if (KVS(ch,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); } 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+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf)); - rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf)); - rWrite(baseAddr+OFFSET_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_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_AR_DR,(op.ar<<4)|(op.dr&0xf)); + rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf)); + rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[ch].freqH[o]|(opE.delay<<5)); + 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++) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[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)); + if (KVS(c.chan,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { - rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); } } break; @@ -494,7 +493,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.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; } @@ -551,7 +550,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } case DIV_CMD_FM_TL: { @@ -560,10 +559,10 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; op.tl=c.value2&63; - 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)); + if (KVS(c.chan,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { - rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); } break; } @@ -573,7 +572,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -581,7 +580,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -591,7 +590,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -599,7 +598,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -609,7 +608,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -617,7 +616,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -627,7 +626,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -635,7 +634,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -645,7 +644,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -653,7 +652,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -663,7 +662,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -671,7 +670,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -681,7 +680,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -689,7 +688,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -699,7 +698,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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 { unsigned int o=c.value; @@ -707,7 +706,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; 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; } @@ -720,9 +719,9 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned char noise=chan[c.chan].state.esfm.noise&3; op.ws=c.value2&7; 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 { - 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 { @@ -734,9 +733,9 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned char noise=chan[c.chan].state.esfm.noise&3; op.ws=c.value2&7; 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 { - 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; @@ -748,10 +747,10 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; op.ksl=c.value2&3; - 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)); + if (KVS(c.chan,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { - rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); } } } else { @@ -760,10 +759,10 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; op.ksl=c.value2&3; - 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)); + if (KVS(c.chan,o)) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { - rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6)); } } break; @@ -775,7 +774,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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; } 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]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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; } case DIV_CMD_FM_FIXFREQ: { @@ -809,9 +808,9 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; - opE.left=c.value2&1; - opE.right=(c.value2&2)>>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)); + opE.left=(c.value2&0xf0)!=0; + opE.right=(c.value2&0x0f)!=0; + 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; } case DIV_CMD_ESFM_OUTLVL: { @@ -823,9 +822,9 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned char noise=chan[c.chan].state.esfm.noise&3; opE.outLvl=c.value2&7; 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 { - 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 { @@ -837,9 +836,9 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned char noise=chan[c.chan].state.esfm.noise&3; opE.outLvl=c.value2&7; 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 { - 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; @@ -851,7 +850,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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 { unsigned int o=c.value; @@ -860,7 +859,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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; } @@ -870,7 +869,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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 { unsigned int o=c.value; @@ -878,21 +877,20 @@ int DivPlatformESFM::dispatch(DivCommand c) { unsigned short baseAddr=c.chan*32+o*8; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; 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; } case DIV_CMD_STD_NOISE_MODE: { - unsigned int o=3; - unsigned short baseAddr=c.chan*32+o*8; - DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o]; - DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; + unsigned short baseAddr=c.chan*32+3*8; + DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[3]; + DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[3]; DivInstrumentESFM insE=chan[c.chan].state.esfm; insE.noise=c.value&3; 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 { - 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; } @@ -901,7 +899,7 @@ int DivPlatformESFM::dispatch(DivCommand c) { if (o >= 4) break; DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o]; if (opE.fixed) break; - opE.dt=c.value2; + opE.dt=c.value2-0x80; chan[c.chan].freqChanged=true; break; } @@ -1032,8 +1030,8 @@ void DivPlatformESFM::poke(std::vector& wlist) { } void DivPlatformESFM::setFlags(const DivConfig& flags) { - rate=49716; chipClock=COLOR_NTSC*4.0; + rate=chipClock/288.0; } int DivPlatformESFM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { diff --git a/src/engine/platform/esfm.h b/src/engine/platform/esfm.h index 5fc000c20..698313ad8 100644 --- a/src/engine/platform/esfm.h +++ b/src/engine/platform/esfm.h @@ -23,8 +23,8 @@ // ESFM register address space technically spans 0x800 (2048) bytes, // but we only need the first 0x254 (596) during normal use. -// Rounding it up to 0x260 (608) bytes, the nearest multiple of 16. -#define ESFM_REG_POOL_SIZE 0x260 +// Rounding it up to 0x400 bytes, the nearest power of 2. +#define ESFM_REG_POOL_SIZE 0x400 class DivPlatformESFM: public DivDispatch { struct Channel: public SharedChannel { diff --git a/src/engine/song.h b/src/engine/song.h index fd7304050..4545ed126 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -132,7 +132,6 @@ enum DivSystem { DIV_SYSTEM_TED, DIV_SYSTEM_C140, DIV_SYSTEM_C219, - DIV_SYSTEM_C352, DIV_SYSTEM_ESFM }; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index ae25e6673..c348de34c 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -392,14 +392,6 @@ int negEffectVal(unsigned char, unsigned char 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 int effectValAnd(unsigned char, unsigned char val) { 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>}}, {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>}}, - {0x20, {DIV_CMD_ESFM_OP_PANNING, "20xy: Set panning of operator 1 (x: left; y: right)", constVal<0>, effectValNibbleFlagPackReversed}}, - {0x21, {DIV_CMD_ESFM_OP_PANNING, "21xy: Set panning of operator 2 (x: left; y: right)", constVal<1>, effectValNibbleFlagPackReversed}}, - {0x22, {DIV_CMD_ESFM_OP_PANNING, "22xy: Set panning of operator 3 (x: left; y: right)", constVal<2>, effectValNibbleFlagPackReversed}}, - {0x23, {DIV_CMD_ESFM_OP_PANNING, "23xy: Set panning of operator 4 (x: left; y: right)", constVal<3>, 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>, effectVal}}, + {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>, 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>}}, {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>}}, {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>}}, {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}}, - {0x41, {DIV_CMD_FM_DT, "41xx: Set detune of operator 2 (80: center)", constVal<1>, effectValExcessOf80Hex}}, - {0x42, {DIV_CMD_FM_DT, "42xx: Set detune of operator 3 (80: center)", constVal<2>, effectValExcessOf80Hex}}, - {0x43, {DIV_CMD_FM_DT, "43xx: Set detune of operator 4 (80: center)", constVal<3>, 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>, effectVal}}, + {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>, 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>}}, {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>}}, @@ -1980,7 +1972,7 @@ void DivEngine::registerSystems() { sysDefs[DIV_SYSTEM_ESFM]=new DivSysDef( "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"}, {"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}, diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 3e7dffbec..ef3b35c8c 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -49,7 +49,7 @@ const char* esfmParamLongNames[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]={