diff --git a/papers/newIns.md b/papers/newIns.md index 32152bd32..7b6512f0f 100644 --- a/papers/newIns.md +++ b/papers/newIns.md @@ -130,6 +130,9 @@ the following instrument types are available: - 61: GBA MinMod - 62: Bifurcator - 63: SID2 +- 64: Supervision +- 65: µPD1771C +- 66: SID3 the following feature codes are recognized: @@ -255,6 +258,8 @@ size | description | - 17: ex6 | - 18: ex7 | - 19: ex8 + | - 20: ex9 + | - 21: ex10 | - 255: stop reading and move on 1 | macro length 1 | macro loop diff --git a/src/engine/fileOps/text.cpp b/src/engine/fileOps/text.cpp index aa97ec3a6..06a94411f 100644 --- a/src/engine/fileOps/text.cpp +++ b/src/engine/fileOps/text.cpp @@ -221,6 +221,8 @@ SafeWriter* DivEngine::saveText(bool separatePatterns) { writeTextMacro(w,ins->std.ex6Macro,"ex6",header); writeTextMacro(w,ins->std.ex7Macro,"ex7",header); writeTextMacro(w,ins->std.ex8Macro,"ex8",header); + writeTextMacro(w,ins->std.ex9Macro,"ex9",header); + writeTextMacro(w,ins->std.ex10Macro,"ex10",header); writeTextMacro(w,ins->std.algMacro,"alg",header); writeTextMacro(w,ins->std.fbMacro,"fb",header); writeTextMacro(w,ins->std.fmsMacro,"fms",header); diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 9821e6d06..bdb16391c 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -360,6 +360,8 @@ DivInstrumentMacro* DivInstrumentSTD::macroByType(DivMacroType type) { CONSIDER(ex6Macro,DIV_MACRO_EX6) CONSIDER(ex7Macro,DIV_MACRO_EX7) CONSIDER(ex8Macro,DIV_MACRO_EX8) + CONSIDER(ex9Macro,DIV_MACRO_EX9) + CONSIDER(ex10Macro,DIV_MACRO_EX10) } return NULL; @@ -648,6 +650,8 @@ void DivInstrument::writeFeatureMA(SafeWriter* w) { writeMacro(w,std.ex6Macro); writeMacro(w,std.ex7Macro); writeMacro(w,std.ex8Macro); + writeMacro(w,std.ex9Macro); + writeMacro(w,std.ex10Macro); // "stop reading" code w->writeC(-1); @@ -1520,7 +1524,9 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo std.ex5Macro.len || std.ex6Macro.len || std.ex7Macro.len || - std.ex8Macro.len) { + std.ex8Macro.len || + std.ex9Macro.len || + std.ex10Macro.len) { featureMA=true; } @@ -1874,6 +1880,12 @@ void DivInstrument::readFeatureMA(SafeReader& reader, short version) { case 19: target=&std.ex8Macro; break; + case 20: + target=&std.ex9Macro; + break; + case 21: + target=&std.ex10Macro; + break; default: logW("invalid macro code %d!"); break; diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 8c79a7f90..2c7d91be7 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -123,7 +123,9 @@ enum DivMacroType: unsigned char { DIV_MACRO_EX5, DIV_MACRO_EX6, DIV_MACRO_EX7, - DIV_MACRO_EX8 + DIV_MACRO_EX8, + DIV_MACRO_EX9, + DIV_MACRO_EX10 }; enum DivMacroTypeOp: unsigned char { @@ -301,6 +303,8 @@ struct DivInstrumentSTD { DivInstrumentMacro ex6Macro; DivInstrumentMacro ex7Macro; DivInstrumentMacro ex8Macro; + DivInstrumentMacro ex9Macro; + DivInstrumentMacro ex10Macro; struct OpMacro { // ar, dr, mult, rr, sl, tl, dt2, rs, dt, d2r, ssgEnv; @@ -354,7 +358,9 @@ struct DivInstrumentSTD { ex5Macro(DIV_MACRO_EX5), ex6Macro(DIV_MACRO_EX6), ex7Macro(DIV_MACRO_EX7), - ex8Macro(DIV_MACRO_EX8) { + ex8Macro(DIV_MACRO_EX8), + ex9Macro(DIV_MACRO_EX9), + ex10Macro(DIV_MACRO_EX10) { for (int i=0; i<4; i++) { opMacros[i].amMacro.macroType=DIV_MACRO_OP_AM+(i<<5); opMacros[i].arMacro.macroType=DIV_MACRO_OP_AR+(i<<5); diff --git a/src/engine/macroInt.cpp b/src/engine/macroInt.cpp index 5e1e6a725..9978c7278 100644 --- a/src/engine/macroInt.cpp +++ b/src/engine/macroInt.cpp @@ -242,6 +242,8 @@ void DivMacroInt::mask(unsigned char id, bool enabled) { CONSIDER(ex6,17) CONSIDER(ex7,18) CONSIDER(ex8,19) + CONSIDER(ex9,20) + CONSIDER(ex10,21) CONSIDER_OP(0,0x20) CONSIDER_OP(2,0x40) @@ -309,6 +311,8 @@ void DivMacroInt::restart(unsigned char id) { CONSIDER(ex6,ex6Macro,17) CONSIDER(ex7,ex7Macro,18) CONSIDER(ex8,ex8Macro,19) + CONSIDER(ex9,ex9Macro,20) + CONSIDER(ex10,ex10Macro,21) CONSIDER_OP(0,0x20) CONSIDER_OP(2,0x40) @@ -418,6 +422,12 @@ void DivMacroInt::init(DivInstrument* which) { if (ins->std.ex8Macro.len>0) { ADD_MACRO(ex8,ins->std.ex8Macro); } + if (ins->std.ex9Macro.len>0) { + ADD_MACRO(ex9,ins->std.ex9Macro); + } + if (ins->std.ex10Macro.len>0) { + ADD_MACRO(ex10,ins->std.ex10Macro); + } // prepare FM operator macros for (int i=0; i<4; i++) { @@ -559,6 +569,8 @@ DivMacroStruct* DivMacroInt::structByType(unsigned char type) { CONSIDER(ex6,DIV_MACRO_EX6) CONSIDER(ex7,DIV_MACRO_EX7) CONSIDER(ex8,DIV_MACRO_EX8) + CONSIDER(ex9,DIV_MACRO_EX9) + CONSIDER(ex10,DIV_MACRO_EX10) } return NULL; diff --git a/src/engine/macroInt.h b/src/engine/macroInt.h index 0087dc77e..0010510e0 100644 --- a/src/engine/macroInt.h +++ b/src/engine/macroInt.h @@ -75,6 +75,7 @@ class DivMacroInt { DivMacroStruct duty, wave, pitch, ex1, ex2, ex3; DivMacroStruct alg, fb, fms, ams; DivMacroStruct panL, panR, phaseReset, ex4, ex5, ex6, ex7, ex8; + DivMacroStruct ex9, ex10; // FM operator macro struct IntOp { @@ -180,6 +181,8 @@ class DivMacroInt { ex6(DIV_MACRO_EX6), ex7(DIV_MACRO_EX7), ex8(DIV_MACRO_EX8), + ex9(DIV_MACRO_EX9), + ex10(DIV_MACRO_EX10), hasRelease(false) { memset(macroList,0,128*sizeof(void*)); memset(macroSource,0,128*sizeof(void*)); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 1a1b1134e..80fd30018 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -255,6 +255,14 @@ void DivPlatformTX81Z::tick(bool sysTick) { chan[i].state.ams=chan[i].std.ams.val; rWrite(chanOffs[i]+ADDR_FMS_AMS,((chan[i].state.fms&7)<<4)|(chan[i].state.ams&3)); } + if (chan[i].std.ex9.had) { + chan[i].state.fms2=chan[i].std.ex9.val; + rWrite(chanOffs[i]+ADDR_FMS2_AMS2,((chan[i].state.fms2&7)<<4)|(chan[i].state.ams2&3)); + } + if (chan[i].std.ex10.had) { + chan[i].state.ams2=chan[i].std.ex10.val; + rWrite(chanOffs[i]+ADDR_FMS2_AMS2,((chan[i].state.fms2&7)<<4)|(chan[i].state.ams2&3)); + } for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 0a2416363..19f9e3310 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -6649,9 +6649,10 @@ void FurnaceGUI::drawInsEdit() { macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FB),&ins->std.fbMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER])); if (ins->type!=DIV_INS_OPL && ins->type!=DIV_INS_OPL_DRUMS) { if (ins->type==DIV_INS_OPZ) { - // TODO: FMS2/AMS2 macros macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS),&ins->std.fmsMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER])); macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS),&ins->std.amsMacro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER])); + macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS2),&ins->std.ex9Macro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER])); + macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS2),&ins->std.ex10Macro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER])); } else { macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_FMS),&ins->std.fmsMacro,0,7,96,uiColors[GUI_COLOR_MACRO_OTHER])); macroList.push_back(FurnaceGUIMacroDesc(FM_NAME(FM_AMS),&ins->std.amsMacro,0,3,48,uiColors[GUI_COLOR_MACRO_OTHER]));