From 535c2dde7988c6e3d391f52d9398a2bd9b41fc3c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 11 Aug 2024 15:42:42 -0500 Subject: [PATCH 01/16] a --- ...Extended Mix).fur => I_won_t_be_there_again.fur} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename demos/opl/{I won't be there again (Extended Mix).fur => I_won_t_be_there_again.fur} (100%) diff --git a/demos/opl/I won't be there again (Extended Mix).fur b/demos/opl/I_won_t_be_there_again.fur similarity index 100% rename from demos/opl/I won't be there again (Extended Mix).fur rename to demos/opl/I_won_t_be_there_again.fur From 7591b2ed6ad5b2f7f90d2da19083952f162d5f89 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 12 Aug 2024 04:10:44 -0500 Subject: [PATCH 02/16] Byte-Sized Bop by Someone64 --- demos/nes/Byte-Sized Bop.fur | Bin 0 -> 5566 bytes src/gui/about.cpp | 1 + 2 files changed, 1 insertion(+) create mode 100644 demos/nes/Byte-Sized Bop.fur diff --git a/demos/nes/Byte-Sized Bop.fur b/demos/nes/Byte-Sized Bop.fur new file mode 100644 index 0000000000000000000000000000000000000000..2adcac8e613bb2d43dd8f0f2cd932f69b5e145dd GIT binary patch literal 5566 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 HKb-wPkl^5G literal 0 HcmV?d00001 diff --git a/src/gui/about.cpp b/src/gui/about.cpp index efd7c06f1..13c877186 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -180,6 +180,7 @@ const char* aboutLine[]={ "Slightly Large NC", "smaybius", "SnugglyBun", + "Someone64", "Spinning Square Waves", "src3453", "SuperJet Spade", From 1bdcbf95d3204671b88277e9b36d560b2b05e9e6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 12 Aug 2024 23:20:08 -0500 Subject: [PATCH 03/16] prepare a ROM export dialog --- src/gui/exportOptions.cpp | 11 +++++++++++ src/gui/gui.cpp | 8 ++++++++ src/gui/gui.h | 2 ++ 3 files changed, 21 insertions(+) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 4b4360839..904c88891 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -239,6 +239,10 @@ void FurnaceGUI::drawExportVGM(bool onWindow) { } } +void FurnaceGUI::drawExportROM(bool onWindow) { + +} + void FurnaceGUI::drawExportZSM(bool onWindow) { exitDisabledTimer=1; @@ -434,6 +438,10 @@ void FurnaceGUI::drawExport() { drawExportVGM(true); ImGui::EndTabItem(); } + if (ImGui::BeginTabItem(_("ROM"))) { + drawExportROM(true); + ImGui::EndTabItem(); + } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; @@ -488,6 +496,9 @@ void FurnaceGUI::drawExport() { case GUI_EXPORT_VGM: drawExportVGM(true); break; + case GUI_EXPORT_ROM: + drawExportROM(true); + break; case GUI_EXPORT_ZSM: drawExportZSM(true); break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 3ba5e2705..1d262ce16 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4295,6 +4295,10 @@ bool FurnaceGUI::loop() { drawExportVGM(); ImGui::EndMenu(); } + if (ImGui::BeginMenu(_("export ROM..."))) { + drawExportROM(); + ImGui::EndMenu(); + } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; @@ -4349,6 +4353,10 @@ bool FurnaceGUI::loop() { curExportType=GUI_EXPORT_VGM; displayExport=true; } + if (ImGui::MenuItem(_("export ROM..."))) { + curExportType=GUI_EXPORT_ROM; + displayExport=true; + } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; diff --git a/src/gui/gui.h b/src/gui/gui.h index 515d77fc8..50020e0db 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -651,6 +651,7 @@ enum FurnaceGUIExportTypes { GUI_EXPORT_AUDIO=0, GUI_EXPORT_VGM, + GUI_EXPORT_ROM, GUI_EXPORT_ZSM, GUI_EXPORT_TIUNA, GUI_EXPORT_CMD_STREAM, @@ -2686,6 +2687,7 @@ class FurnaceGUI { void drawExportAudio(bool onWindow=false); void drawExportVGM(bool onWindow=false); + void drawExportROM(bool onWindow=false); void drawExportZSM(bool onWindow=false); void drawExportTiuna(bool onWindow=false); void drawExportAmigaVal(bool onWindow=false); From 45eab67fd46d7f5b197d3429deefd31164b767e9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 13 Aug 2024 04:10:03 -0500 Subject: [PATCH 04/16] prepare more stuff --- CMakeLists.txt | 1 + src/engine/engine.h | 6 ++++ src/engine/export.h | 26 +++++++++++------ src/engine/exportDef.cpp | 60 +++++++++++++++++++++++++++++++++++++++ src/gui/exportOptions.cpp | 11 +++++++ 5 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 src/engine/exportDef.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b7bc35433..464283d9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -693,6 +693,7 @@ src/engine/configEngine.cpp src/engine/dispatchContainer.cpp src/engine/engine.cpp src/engine/export.cpp +src/engine/exportDef.cpp src/engine/fileOpsIns.cpp src/engine/fileOpsSample.cpp src/engine/filter.cpp diff --git a/src/engine/engine.h b/src/engine/engine.h index a2e900c81..7f19e946b 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -518,6 +518,7 @@ class DivEngine { static DivSysDef* sysDefs[DIV_MAX_CHIP_DEFS]; static DivSystem sysFileMapFur[DIV_MAX_CHIP_DEFS]; static DivSystem sysFileMapDMF[DIV_MAX_CHIP_DEFS]; + static DivROMExportDef* romExportDefs[DIV_ROM_MAX]; DivCSPlayer* cmdStreamInt; @@ -624,6 +625,7 @@ class DivEngine { bool deinitAudioBackend(bool dueToSwitchMaster=false); void registerSystems(); + void registerROMExports(); void initSongWithDesc(const char* description, bool inBase64=true, bool oldVol=false); void exchangeIns(int one, int two); @@ -884,6 +886,9 @@ class DivEngine { // get sys definition const DivSysDef* getSystemDef(DivSystem sys); + // get ROM export definition + const DivROMExportDef* getROMExportDef(DivROMExportOptions opt); + // convert sample rate format int fileToDivRate(int frate); int divToFileRate(int drate); @@ -1466,6 +1471,7 @@ class DivEngine { memset(pitchTable,0,4096*sizeof(int)); memset(effectSlotMap,-1,4096*sizeof(short)); memset(sysDefs,0,DIV_MAX_CHIP_DEFS*sizeof(void*)); + memset(romExportDefs,0,DIV_ROM_MAX*sizeof(void*)); memset(walked,0,8192); memset(oscBuf,0,DIV_MAX_OUTPUTS*(sizeof(float*))); memset(exportChannelMask,1,DIV_MAX_CHANS*sizeof(bool)); diff --git a/src/engine/export.h b/src/engine/export.h index 9445ecfe9..4911217c8 100644 --- a/src/engine/export.h +++ b/src/engine/export.h @@ -29,6 +29,8 @@ class DivEngine; enum DivROMExportOptions { DIV_ROM_ABSTRACT=0, DIV_ROM_AMIGA_VALIDATION, + DIV_ROM_ZSM, + DIV_ROM_TIUNA, DIV_ROM_MAX }; @@ -67,24 +69,30 @@ class DivROMExport { virtual ~DivROMExport() {} }; +enum DivROMExportReqPolicy { + // exactly these chips. + DIV_REQPOL_EXACT=0, + // specified chips must be present but any amount of them is acceptable. + DIV_REQPOL_ANY, + // at least one of the specified chips. + DIV_REQPOL_LAX +}; + struct DivROMExportDef { const char* name; const char* author; const char* description; - DivSystem requisites[32]; - int requisitesLen; + std::vector requisites; bool multiOutput; + DivROMExportReqPolicy requisitePolicy; - DivROMExportDef(const char* n, const char* a, const char* d, std::initializer_list req, bool multiOut): + DivROMExportDef(const char* n, const char* a, const char* d, std::initializer_list req, bool multiOut, DivROMExportReqPolicy reqPolicy): name(n), author(a), description(d), - multiOutput(multiOut) { - requisitesLen=0; - memset(requisites,0,32*sizeof(DivSystem)); - for (DivSystem i: req) { - requisites[requisitesLen++]=i; - } + multiOutput(multiOut), + requisitePolicy(reqPolicy) { + requisites=req; } }; diff --git a/src/engine/exportDef.cpp b/src/engine/exportDef.cpp new file mode 100644 index 000000000..bdf881e65 --- /dev/null +++ b/src/engine/exportDef.cpp @@ -0,0 +1,60 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "engine.h" + +DivROMExportDef* DivEngine::romExportDefs[DIV_ROM_MAX]; + +const DivROMExportDef* DivEngine::getROMExportDef(DivROMExportOptions opt) { + return romExportDefs[opt]; +} + +void DivEngine::registerROMExports() { + logD("registering ROM exports..."); + + romExportDefs[DIV_ROM_AMIGA_VALIDATION]=new DivROMExportDef( + "Amiga Validation", "tildearrow", + "a test export for ensuring Amiga emulation is accurate. do not use!", + {DIV_SYSTEM_AMIGA}, + true, DIV_REQPOL_EXACT + ); + + romExportDefs[DIV_ROM_ZSM]=new DivROMExportDef( + "Commander X16 ZSM", "ZeroByteOrg and MooingLemur", + "Commander X16 Zsound Music File.\n" + "for use with Melodius, Calliope and/or ZSMKit:\n" + "- https://github.com/mooinglemur/zsmkit (development)\n" + "- https://github.com/mooinglemur/melodius (player)\n" + "- https://github.com/ZeroByteOrg/calliope (player)\n", + { + DIV_SYSTEM_YM2151, DIV_SYSTEM_VERA + }, + true, DIV_REQPOL_LAX + ); + + romExportDefs[DIV_ROM_TIUNA]=new DivROMExportDef( + "Atari 2600 (TIunA)", "Natt Akuma", + "advanced driver with software tuning support.\n" + "see https://github.com/AYCEdemo/twin-tiuna for code.", + { + DIV_SYSTEM_TIA + }, + true, DIV_REQPOL_ANY + ); +} \ No newline at end of file diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 904c88891..582ba3055 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -240,7 +240,18 @@ void FurnaceGUI::drawExportVGM(bool onWindow) { } void FurnaceGUI::drawExportROM(bool onWindow) { + exitDisabledTimer=1; + + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) { + openFileDialog(GUI_FILE_EXPORT_ROM); + ImGui::CloseCurrentPopup(); + } } void FurnaceGUI::drawExportZSM(bool onWindow) { From a8122d3efdb638be39238902a8534209ec79411f Mon Sep 17 00:00:00 2001 From: MooingLemur Date: Sun, 11 Aug 2024 20:24:48 -0700 Subject: [PATCH 05/16] Add VERA 47.0.3 chip type --- src/engine/platform/sound/vera_psg.c | 5 +++-- src/engine/zsm.cpp | 8 -------- src/gui/sysConf.cpp | 6 +++++- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/sound/vera_psg.c b/src/engine/platform/sound/vera_psg.c index be080ace9..7ed3d48e5 100644 --- a/src/engine/platform/sound/vera_psg.c +++ b/src/engine/platform/sound/vera_psg.c @@ -5,6 +5,7 @@ // Chip revisions // 0: V 0.3.0 // 1: V 47.0.0 (9-bit volume, phase reset on mute) +// 2: V 47.0.3 (Pulse Width XOR on Saw and Triangle) #include "vera_psg.h" @@ -88,8 +89,8 @@ render(struct VERA_PSG* psg, int16_t *left, int16_t *right) uint8_t v = 0; switch (ch->waveform) { case WF_PULSE: v = (ch->phase >> 10) > ch->pw ? 0 : 63; break; - case WF_SAWTOOTH: v = ch->phase >> 11; break; - case WF_TRIANGLE: v = (ch->phase & 0x10000) ? (~(ch->phase >> 10) & 0x3F) : ((ch->phase >> 10) & 0x3F); break; + case WF_SAWTOOTH: v = (ch->phase >> 11) ^ (psg->chipType < 2 ? 0 : (ch->pw ^ 0x3f) & 0x3f); break; + case WF_TRIANGLE: v = ((ch->phase & 0x10000) ? (~(ch->phase >> 10) & 0x3F) : ((ch->phase >> 10) & 0x3F)) ^ (psg->chipType < 2 ? 0 : (ch->pw ^ 0x3f) & 0x3f); break; case WF_NOISE: v = ch->noiseval; break; } int8_t sv = (v ^ 0x20); diff --git a/src/engine/zsm.cpp b/src/engine/zsm.cpp index 87dbde8d2..75cc3d9da 100644 --- a/src/engine/zsm.cpp +++ b/src/engine/zsm.cpp @@ -133,14 +133,6 @@ void DivZSM::writePSG(unsigned char a, unsigned char v) { } else if (a>=64) { return writePCM(a-64,v); } - if (optimize) { - if ((a&3)==3 && v>64) { - // Pulse width on non-pulse waves is nonsense and wasteful - // No need to preserve state here because the next write that - // selects pulse will also set the pulse width in this register - v&=0xc0; - } - } if (psgState[psg_PREV][a]==v) { if (psgState[psg_NEW][a]!=v) { // NEW value is being reset to the same as PREV value diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 0875f25c1..6ce257357 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -2482,7 +2482,7 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl break; } case DIV_SYSTEM_VERA: { - int chipType=flags.getInt("chipType",1); + int chipType=flags.getInt("chipType",2); ImGui::Text(_("Chip revision:")); ImGui::Indent(); @@ -2494,6 +2494,10 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl chipType=1; altered=true; } + if (ImGui::RadioButton(_("V 47.0.3 (Tri/Saw PW XOR)"),chipType==2)) { + chipType=2; + altered=true; + } ImGui::Unindent(); if (altered) { From 3b9cf70ff56737b09981525aee8c2d7caa92c652 Mon Sep 17 00:00:00 2001 From: MooingLemur Date: Sun, 11 Aug 2024 20:47:40 -0700 Subject: [PATCH 06/16] VERA: bump default chip type --- src/engine/platform/vera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index e4e78933e..b6b7cf831 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -532,7 +532,7 @@ void DivPlatformVERA::poke(std::vector& wlist) { } void DivPlatformVERA::setFlags(const DivConfig& flags) { - psg->chipType=flags.getInt("chipType",1); + psg->chipType=flags.getInt("chipType",2); chipClock=25000000; CHECK_CUSTOM_CLOCK; rate=chipClock/512; From 0224882a429e37da05b26a8b3398bc02194ea12f Mon Sep 17 00:00:00 2001 From: MooingLemur Date: Sun, 11 Aug 2024 21:03:21 -0700 Subject: [PATCH 07/16] oops, should have been 47.0.2 --- src/engine/platform/sound/vera_psg.c | 2 +- src/gui/sysConf.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/sound/vera_psg.c b/src/engine/platform/sound/vera_psg.c index 7ed3d48e5..597aa5974 100644 --- a/src/engine/platform/sound/vera_psg.c +++ b/src/engine/platform/sound/vera_psg.c @@ -5,7 +5,7 @@ // Chip revisions // 0: V 0.3.0 // 1: V 47.0.0 (9-bit volume, phase reset on mute) -// 2: V 47.0.3 (Pulse Width XOR on Saw and Triangle) +// 2: V 47.0.2 (Pulse Width XOR on Saw and Triangle) #include "vera_psg.h" diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 6ce257357..f460a5434 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -2494,7 +2494,7 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl chipType=1; altered=true; } - if (ImGui::RadioButton(_("V 47.0.3 (Tri/Saw PW XOR)"),chipType==2)) { + if (ImGui::RadioButton(_("V 47.0.2 (Tri/Saw PW XOR)"),chipType==2)) { chipType=2; altered=true; } From b5e500d85d90fb7576394b8b77c9d4ae5c9e488b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 13 Aug 2024 04:14:46 -0500 Subject: [PATCH 08/16] dev217 --- src/engine/engine.h | 4 ++-- src/engine/fileOps/fur.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 7f19e946b..9ecf819ee 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -54,8 +54,8 @@ class DivWorkPool; #define DIV_UNSTABLE -#define DIV_VERSION "Import Test" -#define DIV_ENGINE_VERSION 216 +#define DIV_VERSION "dev217" +#define DIV_ENGINE_VERSION 217 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps/fur.cpp b/src/engine/fileOps/fur.cpp index 0251c410e..5483d8fb9 100644 --- a/src/engine/fileOps/fur.cpp +++ b/src/engine/fileOps/fur.cpp @@ -2094,6 +2094,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) { ds.systemFlags[i].set("oldPitch",true); } } + } else if (ds.version<217) { + for (int i=0; i Date: Tue, 13 Aug 2024 04:40:26 -0500 Subject: [PATCH 09/16] a menu --- src/engine/engine.cpp | 3 +++ src/engine/engine.h | 2 ++ src/gui/exportOptions.cpp | 22 +++++++++++++++++++++- src/gui/gui.cpp | 3 ++- src/gui/gui.h | 3 +++ 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 1a382b85e..bfde6906b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -3916,6 +3916,9 @@ bool DivEngine::preInit(bool noSafeMode) { // register systems if (!systemsRegistered) registerSystems(); + // register ROM exports + if (!romExportsRegistered) registerROMExports(); + // TODO: re-enable with a better approach // see issue #1581 /* diff --git a/src/engine/engine.h b/src/engine/engine.h index 9ecf819ee..e30334fd4 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -465,6 +465,7 @@ class DivEngine { bool midiIsDirectProgram; bool lowLatency; bool systemsRegistered; + bool romExportsRegistered; bool hasLoadedSomething; bool midiOutClock; bool midiOutTime; @@ -1365,6 +1366,7 @@ class DivEngine { midiIsDirectProgram(false), lowLatency(false), systemsRegistered(false), + romExportsRegistered(false), hasLoadedSomething(false), midiOutClock(false), midiOutTime(false), diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 582ba3055..c943779eb 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -241,7 +241,27 @@ void FurnaceGUI::drawExportVGM(bool onWindow) { void FurnaceGUI::drawExportROM(bool onWindow) { exitDisabledTimer=1; - + + const DivROMExportDef* def=e->getROMExportDef(romTarget); + + ImGui::Text("select target:"); + if (ImGui::BeginCombo("##ROMTarget",def==NULL?"":def->name)) { for (int i=0; igetROMExportDef((DivROMExportOptions)i); @@ -252,6 +252,7 @@ void FurnaceGUI::drawExportROM(bool onWindow) { if (ImGui::Selectable(newDef->name)) { romTarget=(DivROMExportOptions)i; romMultiFile=newDef->multiOutput; + romConfig=DivConfig(); if (newDef->fileExt==NULL) { romFilterName=""; romFilterExt=""; @@ -271,34 +272,66 @@ void FurnaceGUI::drawExportROM(bool onWindow) { ImGui::TextWrapped("%s",def->description); } - /* - ImGui::InputText(_("base song label name"),&asmBaseLabel); // TODO: validate label - if (ImGui::InputInt(_("max size in first bank"),&tiunaFirstBankSize,1,100)) { - if (tiunaFirstBankSize<0) tiunaFirstBankSize=0; - if (tiunaFirstBankSize>4096) tiunaFirstBankSize=4096; - } - if (ImGui::InputInt(_("max size in other banks"),&tiunaOtherBankSize,1,100)) { - if (tiunaOtherBankSize<16) tiunaOtherBankSize=16; - if (tiunaOtherBankSize>4096) tiunaOtherBankSize=4096; - } - - ImGui::Text(_("chips to export:")); - int selected=0; - for (int i=0; isong.systemLen; i++) { - DivSystem sys=e->song.system[i]; - bool isTIA=sys==DIV_SYSTEM_TIA; - ImGui::BeginDisabled((!isTIA) || (selected>=1)); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - if (!isTIA) { - ImGui::SetTooltip(_("this chip is not supported by the file format!")); - } else if (selected>=1) { - ImGui::SetTooltip(_("only one Atari TIA is supported!")); + ImGui::Separator(); + + bool altered=false; + + switch (romTarget) { + case DIV_ROM_TIUNA: { + String asmBaseLabel=romConfig.getString("baseLabel","song"); + int firstBankSize=romConfig.getInt("firstBankSize",3072); + int otherBankSize=romConfig.getInt("otherBankSize",4096-48); + + // TODO; validate label + if (ImGui::InputText(_("base song label name"),&asmBaseLabel)) { + altered=true; } + if (ImGui::InputInt(_("max size in first bank"),&firstBankSize,1,100)) { + if (firstBankSize<0) firstBankSize=0; + if (firstBankSize>4096) firstBankSize=4096; + altered=true; + } + if (ImGui::InputInt(_("max size in other banks"),&otherBankSize,1,100)) { + if (otherBankSize<16) otherBankSize=16; + if (otherBankSize>4096) otherBankSize=4096; + altered=true; + } + + ImGui::Text(_("chips to export:")); + int selected=0; + for (int i=0; isong.systemLen; i++) { + DivSystem sys=e->song.system[i]; + bool isTIA=sys==DIV_SYSTEM_TIA; + ImGui::BeginDisabled((!isTIA) || (selected>=1)); + if (ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i])) { + altered=true; + } + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + if (!isTIA) { + ImGui::SetTooltip(_("this chip is not supported by the file format!")); + } else if (selected>=1) { + ImGui::SetTooltip(_("only one Atari TIA is supported!")); + } + } + if (isTIA && willExport[i]) selected++; + + if (altered) { + romConfig.set("baseLabel",asmBaseLabel); + romConfig.set("firstBankSize",firstBankSize); + romConfig.set("otherBankSize",otherBankSize); + } + } + break; } - if (isTIA && willExport[i]) selected++; + case DIV_ROM_ABSTRACT: + ImGui::TextWrapped("%s",_("select a target from the menu at the top of this dialog.")); + break; + default: + ImGui::TextWrapped("%s",_("this export method doesn't offer any options.")); + break; } + /* */ if (onWindow) { diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d01589503..45d71e95f 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7933,9 +7933,6 @@ FurnaceGUI::FurnaceGUI(): vgmExportTrailingTicks(-1), drawHalt(10), zsmExportTickRate(60), - asmBaseLabel(""), - tiunaFirstBankSize(3072), - tiunaOtherBankSize(4096-48), macroPointSize(16), waveEditStyle(0), displayInsTypeListMakeInsSample(-1), diff --git a/src/gui/gui.h b/src/gui/gui.h index 7a7b8ed0f..7f0fd18ff 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1632,9 +1632,6 @@ class FurnaceGUI { int cvHiScore; int drawHalt; int zsmExportTickRate; - String asmBaseLabel; - int tiunaFirstBankSize; - int tiunaOtherBankSize; int macroPointSize; int waveEditStyle; int displayInsTypeListMakeInsSample; From 34517754ad017bc73564af6b3e3e7bd3a37ed4a7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 13 Aug 2024 18:42:11 -0500 Subject: [PATCH 15/16] port TIunA to export framework, part 4 index option --- src/engine/export/tiuna.cpp | 31 ++++++++++++++++++------------- src/gui/exportOptions.cpp | 31 ++++++++++++------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/engine/export/tiuna.cpp b/src/engine/export/tiuna.cpp index 985eba49f..397cee34f 100644 --- a/src/engine/export/tiuna.cpp +++ b/src/engine/export/tiuna.cpp @@ -183,16 +183,15 @@ static void writeCmd(std::vector& cmds, TiunaCmd& cmd, unsigned char void DivExportTiuna::run() { int loopOrder, loopOrderRow, loopEnd; - int tiaIdx; int tick=0; SafeWriter* w; std::map allCmds[2]; // config - int* sysToExport=NULL; String baseLabel=conf.getString("baseLabel","song"); int firstBankSize=conf.getInt("firstBankSize",3072); int otherBankSize=conf.getInt("otherBankSize",4096-48); + int tiaIdx=conf.getInt("sysToExport",-1); e->stop(); e->repeatPattern=false; @@ -210,23 +209,29 @@ void DivExportTiuna::run() { w=new SafeWriter; w->init(); - tiaIdx=-1; - - for (int i=0; isong.systemLen; i++) { - if (sysToExport!=NULL && !sysToExport[i]) continue; - if (e->song.system[i]==DIV_SYSTEM_TIA) { - tiaIdx=i; - e->disCont[i].dispatch->toggleRegisterDump(true); - break; + if (tiaIdx<0 || tiaIdx>=e->song.systemLen) { + tiaIdx=-1; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_TIA) { + tiaIdx=i; + break; + } } - } - if (tiaIdx<0) { - logAppend("ERROR: selected TIA system not found"); + if (tiaIdx<0) { + logAppend("ERROR: selected TIA system not found"); + failed=true; + running=false; + return; + } + } else if (e->song.system[tiaIdx]!=DIV_SYSTEM_TIA) { + logAppend("ERROR: selected chip is not a TIA!"); failed=true; running=false; return; } + e->disCont[tiaIdx].dispatch->toggleRegisterDump(true); + // write patterns // bool writeLoop=false; logAppend("recording sequence..."); diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 2ca8fa7e0..aca5523f0 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -281,6 +281,7 @@ void FurnaceGUI::drawExportROM(bool onWindow) { String asmBaseLabel=romConfig.getString("baseLabel","song"); int firstBankSize=romConfig.getInt("firstBankSize",3072); int otherBankSize=romConfig.getInt("otherBankSize",4096-48); + int sysToExport=romConfig.getInt("sysToExport",-1); // TODO; validate label if (ImGui::InputText(_("base song label name"),&asmBaseLabel)) { @@ -297,30 +298,22 @@ void FurnaceGUI::drawExportROM(bool onWindow) { altered=true; } - ImGui::Text(_("chips to export:")); - int selected=0; + ImGui::Text(_("chip to export:")); for (int i=0; isong.systemLen; i++) { DivSystem sys=e->song.system[i]; - bool isTIA=sys==DIV_SYSTEM_TIA; - ImGui::BeginDisabled((!isTIA) || (selected>=1)); - if (ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i])) { + bool isTIA=(sys==DIV_SYSTEM_TIA); + ImGui::BeginDisabled(!isTIA); + if (ImGui::RadioButton(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),sysToExport==i)) { + sysToExport=i; altered=true; } ImGui::EndDisabled(); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - if (!isTIA) { - ImGui::SetTooltip(_("this chip is not supported by the file format!")); - } else if (selected>=1) { - ImGui::SetTooltip(_("only one Atari TIA is supported!")); - } - } - if (isTIA && willExport[i]) selected++; - - if (altered) { - romConfig.set("baseLabel",asmBaseLabel); - romConfig.set("firstBankSize",firstBankSize); - romConfig.set("otherBankSize",otherBankSize); - } + } + if (altered) { + romConfig.set("baseLabel",asmBaseLabel); + romConfig.set("firstBankSize",firstBankSize); + romConfig.set("otherBankSize",otherBankSize); + romConfig.set("sysToExport",sysToExport); } break; } From f906b4ebe4bcc50468fe0de20c0985ff05e8df13 Mon Sep 17 00:00:00 2001 From: cam900 Date: Wed, 14 Aug 2024 17:54:20 +0900 Subject: [PATCH 16/16] Safety check for MSM6295 bankswitched address --- src/engine/platform/msm6295.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 916234f0e..6b40575b9 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -39,14 +39,25 @@ const char** DivPlatformMSM6295::getRegisterSheet() { } u8 DivPlatformMSM6295::read_byte(u32 address) { - if (adpcmMem==NULL || address>=getSampleMemCapacity(0)) { + if (adpcmMem==NULL) { return 0; } if (isBanked) { if (address<0x400) { - return adpcmMem[(bank[(address>>8)&0x3]<<16)|(address&0x3ff)]; + unsigned int bankedAddress=(bank[(address>>8)&0x3]<<16)|(address&0x3ff); + if (bankedAddress>=getSampleMemCapacity(0)) { + return 0; + } + return adpcmMem[bankedAddress&0xffffff]; } - return adpcmMem[(bank[(address>>16)&0x3]<<16)|(address&0xffff)]; + unsigned int bankedAddress=(bank[(address>>16)&0x3]<<16)|(address&0xffff); + if (bankedAddress>=getSampleMemCapacity(0)) { + return 0; + } + return adpcmMem[bankedAddress&0xffffff]; + } + if (address>=getSampleMemCapacity(0)) { + return 0; } return adpcmMem[address&0x3ffff]; }