chip flags rewrite, part 2

move systemFlags to legacy status
This commit is contained in:
tildearrow 2022-09-29 03:29:24 -05:00
parent 82eed26094
commit 0acca7458d
9 changed files with 40 additions and 231 deletions

View file

@ -1122,7 +1122,7 @@ void DivEngine::initSongWithDesc(const int* description) {
song.system[index]=(DivSystem)description[i]; song.system[index]=(DivSystem)description[i];
song.systemVol[index]=description[i+1]; song.systemVol[index]=description[i+1];
song.systemPan[index]=description[i+2]; song.systemPan[index]=description[i+2];
song.systemFlags[index]=description[i+3]; song.systemFlagsOld[index]=description[i+3];
index++; index++;
chanCount+=getChannelCount(song.system[index]); chanCount+=getChannelCount(song.system[index]);
if (chanCount>=DIV_MAX_CHANS) break; if (chanCount>=DIV_MAX_CHANS) break;
@ -1345,7 +1345,7 @@ void DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
} }
song.system[index]=which; song.system[index]=which;
song.systemFlags[index]=0; song.systemFlagsOld[index]=0;
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
BUSY_END; BUSY_END;
@ -1371,7 +1371,7 @@ bool DivEngine::addSystem(DivSystem which) {
song.system[song.systemLen]=which; song.system[song.systemLen]=which;
song.systemVol[song.systemLen]=64; song.systemVol[song.systemLen]=64;
song.systemPan[song.systemLen]=0; song.systemPan[song.systemLen]=0;
song.systemFlags[song.systemLen++]=0; song.systemFlagsOld[song.systemLen++]=0;
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
BUSY_END; BUSY_END;
@ -1415,7 +1415,7 @@ bool DivEngine::removeSystem(int index, bool preserveOrder) {
song.system[i]=song.system[i+1]; song.system[i]=song.system[i+1];
song.systemVol[i]=song.systemVol[i+1]; song.systemVol[i]=song.systemVol[i+1];
song.systemPan[i]=song.systemPan[i+1]; song.systemPan[i]=song.systemPan[i+1];
song.systemFlags[i]=song.systemFlags[i+1]; song.systemFlagsOld[i]=song.systemFlagsOld[i+1];
} }
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
@ -1541,9 +1541,9 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
song.systemPan[dest]^=song.systemPan[src]; song.systemPan[dest]^=song.systemPan[src];
song.systemPan[src]^=song.systemPan[dest]; song.systemPan[src]^=song.systemPan[dest];
song.systemFlags[src]^=song.systemFlags[dest]; song.systemFlagsOld[src]^=song.systemFlagsOld[dest];
song.systemFlags[dest]^=song.systemFlags[src]; song.systemFlagsOld[dest]^=song.systemFlagsOld[src];
song.systemFlags[src]^=song.systemFlags[dest]; song.systemFlagsOld[src]^=song.systemFlagsOld[dest];
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
@ -3470,9 +3470,9 @@ void DivEngine::setOrder(unsigned char order) {
void DivEngine::setSysFlags(int system, unsigned int flags, bool restart) { void DivEngine::setSysFlags(int system, unsigned int flags, bool restart) {
BUSY_BEGIN_SOFT; BUSY_BEGIN_SOFT;
saveLock.lock(); saveLock.lock();
song.systemFlags[system]=flags; song.systemFlagsOld[system]=flags;
saveLock.unlock(); saveLock.unlock();
disCont[system].dispatch->setFlags(song.systemFlags[system]); disCont[system].dispatch->setFlags(song.systemFlagsOld[system]);
disCont[system].setRates(got.rate); disCont[system].setRates(got.rate);
if (restart && isPlaying()) { if (restart && isPlaying()) {
playSub(false); playSub(false);
@ -3630,7 +3630,7 @@ void DivEngine::rescanAudioDevices() {
void DivEngine::initDispatch() { void DivEngine::initDispatch() {
BUSY_BEGIN; BUSY_BEGIN;
for (int i=0; i<song.systemLen; i++) { for (int i=0; i<song.systemLen; i++) {
disCont[i].init(song.system[i],this,getChannelCount(song.system[i]),got.rate,song.systemFlags[i]); disCont[i].init(song.system[i],this,getChannelCount(song.system[i]),got.rate,song.systemFlagsOld[i]);
disCont[i].setRates(got.rate); disCont[i].setRates(got.rate);
disCont[i].setQuality(lowQuality); disCont[i].setQuality(lowQuality);
} }

View file

@ -1235,7 +1235,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
// system props // system props
for (int i=0; i<32; i++) { for (int i=0; i<32; i++) {
ds.systemFlags[i]=reader.readI(); ds.systemFlagsOld[i]=reader.readI();
} }
// handle compound systems // handle compound systems
@ -2373,7 +2373,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
ds.systemLen=(chCount+3)/4; ds.systemLen=(chCount+3)/4;
for(int i=0; i<ds.systemLen; i++) { for(int i=0; i<ds.systemLen; i++) {
ds.system[i]=DIV_SYSTEM_AMIGA; ds.system[i]=DIV_SYSTEM_AMIGA;
ds.systemFlags[i]=1|(80<<8)|(bypassLimits?4:0)|((ds.systemLen>1 || bypassLimits)?2:0); // PAL ds.systemFlagsOld[i]=1|(80<<8)|(bypassLimits?4:0)|((ds.systemLen>1 || bypassLimits)?2:0); // PAL
} }
for(int i=0; i<chCount; i++) { for(int i=0; i<chCount; i++) {
ds.subsong[0]->chanShow[i]=true; ds.subsong[0]->chanShow[i]=true;
@ -2579,7 +2579,7 @@ bool DivEngine::loadFC(unsigned char* file, size_t len) {
ds.system[0]=DIV_SYSTEM_AMIGA; ds.system[0]=DIV_SYSTEM_AMIGA;
ds.systemVol[0]=64; ds.systemVol[0]=64;
ds.systemPan[0]=0; ds.systemPan[0]=0;
ds.systemFlags[0]=1|(80<<8); // PAL ds.systemFlagsOld[0]=1|(80<<8); // PAL
ds.systemName="Amiga"; ds.systemName="Amiga";
seqLen=reader.readI_BE(); seqLen=reader.readI_BE();
@ -3219,11 +3219,11 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) {
} }
if (expansions&16) { if (expansions&16) {
ds.system[systemID]=DIV_SYSTEM_N163; ds.system[systemID]=DIV_SYSTEM_N163;
ds.systemFlags[systemID++]=n163Chans; ds.systemFlagsOld[systemID++]=n163Chans;
} }
if (expansions&32) { if (expansions&32) {
ds.system[systemID]=DIV_SYSTEM_AY8910; ds.system[systemID]=DIV_SYSTEM_AY8910;
ds.systemFlags[systemID++]=38; // Sunsoft 5B ds.systemFlagsOld[systemID++]=38; // Sunsoft 5B
} }
ds.systemLen=systemID; ds.systemLen=systemID;
@ -3734,7 +3734,7 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
} }
for (int i=0; i<32; i++) { for (int i=0; i<32; i++) {
w->writeI(song.systemFlags[i]); w->writeI(song.systemFlagsOld[i]);
} }
// song name // song name

View file

@ -25,6 +25,7 @@
#define DIV_MAX_CHANS 128 #define DIV_MAX_CHANS 128
#include "../ta-utils.h" #include "../ta-utils.h"
#include "config.h"
#include "orders.h" #include "orders.h"
#include "instrument.h" #include "instrument.h"
#include "pattern.h" #include "pattern.h"
@ -232,202 +233,10 @@ struct DivSong {
unsigned char systemLen; unsigned char systemLen;
signed char systemVol[32]; signed char systemVol[32];
signed char systemPan[32]; signed char systemPan[32];
// interpretation of these flags varies depending on system. // this one will be removed soon...
// - most systems: unsigned int systemFlagsOld[32];
// - bit 0: PAL // ...and replaced with... this!
// - NES: DivConfig systemFlags[32];
// - bit 0-1: system type
// - 0: NTSC
// - 1: PAL
// - 2: Dendy
// - SMS/SN76489:
// - bit 0-1, 8-15: clock rate
// - 0000: 3.58MHz (NTSC)
// - 0001: 3.55MHz (PAL)
// - 0002: 4MHz (Other)
// - 0003: 1.79MHz (half NTSC)
// - 0100: 3MHz
// - 0101: 2MHz
// - 0102: 447KHz (NTSC / 8)
// - bit 2-3, 6-7: chip type
// - 00: Sega VDP (16-bit noise)
// - 04: real SN76489 (15-bit noise)
// - 08: real SN76489 with Atari-like short noise buzz (15-bit noise)
// - 0c: Game Gear (16-bit noise, stereo)
// - 40: real SN76489A (17-bit noise)
// - 44: real SN76496 (17-bit noise)
// - 48: NCR 8496 (16-bit noise)
// - 4c: Tandy PSSJ-3 (16-bit noise)
// - 80: real SN94624 (15-bit noise)
// - 84: real SN76494 (17-bit noise)
// - bit 4: disable noise phase reset
// - YM2612/YM3438:
// - bit 0-30: clock rate
// - 0: Genesis NTSC (7.67MHz)
// - 1: Genesis PAL (7.61MHz)
// - 2: FM Towns (8MHz)
// - 3: AtGames Genesis (6.13MHz)
// - 4: Sega System 32 (8.06MHz)
// - bit 31: DAC distortion
// - 0: disable
// - 1: enable
// - YM2151:
// - bit 0-7: clock rate
// - 0: 3.58MHz (NTSC)
// - 1: 3.55MHz (PAL)
// - 2: 4MHz
// - YM2610(B):
// - bit 0-7: clock rate
// - 0: 8MHz (Neo Geo MVS)
// - 1: 8.06MHz (Neo Geo AES)
// - AY-3-8910/AY8930:
// - bit 0-3: clock rate
// - 0: 1.79MHz (MSX NTSC)
// - 1: 1.77MHz (ZX Spectrum, MSX PAL, etc.)
// - 2: 1.75MHz (ZX Spectrum)
// - 3: 2MHz (Atari ST)
// - 4: 1.5MHz (Vectrex)
// - 5: 1MHz (Amstrad CPC)
// - 6: 0.89MHz (Sunsoft 5B)
// - 7: 1.67MHz
// - 8: 0.83MHz (Sunsoft 5B on PAL)
// - 9: 1.10MHz (Gamate/VIC-20 PAL)
// - 10: 2.097152MHz (Game Boy)
// - 11: 3.58MHz (Darky)
// - 12: 3.6MHz (Darky)
// - 13: 1.25MHz
// - 14: 1.536MHz
// - bit 4-5: chip type (ignored on AY8930)
// - 0: AY-3-8910 or similar
// - 1: YM2149
// - 2: Sunsoft 5B
// - 3: AY-3-8914
// - bit 6: stereo (ignored on Sunsoft 5B)
// - 0: mono
// - 1: stereo ABC
// - bit 7: clock divider pin (YM2149, AY8930)
// - 0: high (disable divider)
// - 1: low (internally divided to half)
// - SAA1099:
// - bit 0-1: clock rate
// - 0: 8MHz (SAM Coupé)
// - 1: 7.15MHz (Game Blaster, NTSC)
// - 2: 7.09MHz (PAL)
// - Amiga:
// - bit 0: clock rate
// - 0: 7.15MHz (NTSC)
// - 1: 7.09MHz (PAL)
// - bit 1: model
// - 0: Amiga 500
// - 1: Amiga 1200
// - bit 8-14: stereo separation
// - 0 is 0% while 127 is 100%
// - PC Speaker:
// - bit 0-1: speaker type
// - 0: unfiltered
// - 1: cone
// - 2: piezo
// - 3: real (TODO)
// - QSound:
// - bit 12-20: echo feedback
// - Valid values are 0-255
// - bit 0-11: echo delay length
// - Valid values are 0-2725
// - 0 is max length, 2725 is min length
// - OPLL:
// - bit 0-3: clock rate
// - 0: NTSC (3.58MHz)
// - 1: PAL (3.55MHz)
// - 2: Other (4MHz)
// - 3: half NTSC (1.79MHz)
// - bit 4-7: patch set
// - 0: YM2413
// - 1: YMF281
// - 2: YM2423
// - 3: VRC7
// - 4: custom (TODO)
// - X1-010:
// - bit 0-3: clock rate
// - 0: 16MHz (Seta 1)
// - 1: 16.67MHz (Seta 2)
// - bit 4: stereo
// - 0: mono
// - 1: stereo
// - YM2203:
// - bit 0-4: clock rate
// - 0: 3.58MHz (NTSC)
// - 1: 3.55MHz (PAL)
// - 2: 4MHz
// - 3: 3MHz
// - 4: 3.9936MHz (PC-88, PC-98)
// - 5: 1.5MHz
// - bit 5-6: output rate
// - 0: FM: clock / 72, SSG: clock / 16
// - 1: FM: clock / 36, SSG: clock / 8
// - 2: FM: clock / 24, SSG: clock / 4
// - YM2608:
// - bit 0-4: clock rate
// - 0: 8MHz
// - 1: 7.987MHz (PC-88, PC-98)
// - bit 5-6: output rate
// - 0: FM: clock / 144, SSG: clock / 32
// - 1: FM: clock / 72, SSG: clock / 16
// - 2: FM: clock / 48, SSG: clock / 8
// - YM3526, YM3812, Y8950:
// - bit 0-7: clock rate
// - 0: 3.58MHz (NTSC)
// - 1: 3.55MHz (PAL)
// - 2: 4MHz
// - 3: 3MHz
// - 4: 3.9936MHz (PC-88, PC-98)
// - 5: 3.5MHz
// - YMF262:
// - bit 0-7: clock rate
// - 0: 14.32MHz (NTSC)
// - 1: 14.19MHz (PAL)
// - 2: 14MHz
// - 3: 16MHz
// - 4: 15MHz
// - YMF289B: (TODO)
// - bit 0-7: clock rate
// - 0: 33.8688MHz
// - 1: 28.64MHz (NTSC)
// - 2: 28.38MHz (PAL)
// - MSM6295:
// - bit 0-6: clock rate
// - 0: 1MHz
// - 1: 1.056MHz
// - 2: 4MHz
// - 3: 4.224MHz
// - 4: 3.58MHz (NTSC)
// - 5: 1.79MHz (Half NTSC)
// - 6: 1.023MHz
// - 7: 0.895MHz (Quarter NTSC)
// - 8: 2MHz
// - 9: 2.112MHz
// - 10: 0.875MHz
// - 11: 0.9375MHz
// - 12: 1.5MHz
// - 13: 3MHz
// - 14: 1.193MHz
// - bit 7: Output rate
// - 0: clock / 132
// - 1: clock / 165
// - SCC/+:
// - bit 0-6: clock rate
// - 0: 1.79MHz (MSX NTSC)
// - 1: 1.77MHz (PAL)
// - 2: 1.5MHz
// - 3: 2MHz
// - YMZ280B:
// - bit 0-7: clock rate
// - 0: 16.9344MHz
// - 1: 14.32MHz (NTSC)
// - 2: 14.19MHz (PAL)
// - 3: 16MHz
// - 4: 16.67MHz
// - 5: 14MHz
unsigned int systemFlags[32];
// song information // song information
String name, author, systemName; String name, author, systemName;
@ -623,7 +432,7 @@ struct DivSong {
system[i]=DIV_SYSTEM_NULL; system[i]=DIV_SYSTEM_NULL;
systemVol[i]=64; systemVol[i]=64;
systemPan[i]=0; systemPan[i]=0;
systemFlags[i]=0; systemFlagsOld[i]=0;
} }
subsong.push_back(new DivSubSong); subsong.push_back(new DivSubSong);
system[0]=DIV_SYSTEM_YM2612; system[0]=DIV_SYSTEM_YM2612;

View file

@ -61,7 +61,7 @@ String DivEngine::getSongSystemLegacyName(DivSong& ds, bool isMultiSystemAccepta
return "help! what's going on!"; return "help! what's going on!";
case 1: case 1:
if (ds.system[0]==DIV_SYSTEM_AY8910) { if (ds.system[0]==DIV_SYSTEM_AY8910) {
switch (ds.systemFlags[0]&0x3f) { switch (ds.systemFlagsOld[0]&0x3f) {
case 0: // AY-3-8910, 1.79MHz case 0: // AY-3-8910, 1.79MHz
case 1: // AY-3-8910, 1.77MHz case 1: // AY-3-8910, 1.77MHz
case 2: // AY-3-8910, 1.75MHz case 2: // AY-3-8910, 1.75MHz
@ -88,35 +88,35 @@ String DivEngine::getSongSystemLegacyName(DivSong& ds, bool isMultiSystemAccepta
return "Intellivision (PAL)"; return "Intellivision (PAL)";
default: default:
if ((ds.systemFlags[0]&0x30)==0x00) { if ((ds.systemFlagsOld[0]&0x30)==0x00) {
return "AY-3-8910"; return "AY-3-8910";
} else if ((ds.systemFlags[0]&0x30)==0x10) { } else if ((ds.systemFlagsOld[0]&0x30)==0x10) {
return "Yamaha YM2149"; return "Yamaha YM2149";
} else if ((ds.systemFlags[0]&0x30)==0x20) { } else if ((ds.systemFlagsOld[0]&0x30)==0x20) {
return "Overclocked Sunsoft 5B"; return "Overclocked Sunsoft 5B";
} else if ((ds.systemFlags[0]&0x30)==0x30) { } else if ((ds.systemFlagsOld[0]&0x30)==0x30) {
return "Intellivision"; return "Intellivision";
} }
} }
} else if (ds.system[0]==DIV_SYSTEM_SMS) { } else if (ds.system[0]==DIV_SYSTEM_SMS) {
switch (ds.systemFlags[0]&0x0f) { switch (ds.systemFlagsOld[0]&0x0f) {
case 0: case 1: case 0: case 1:
return "Sega Master System"; return "Sega Master System";
case 6: case 6:
return "BBC Micro"; return "BBC Micro";
} }
} else if (ds.system[0]==DIV_SYSTEM_YM2612) { } else if (ds.system[0]==DIV_SYSTEM_YM2612) {
switch (ds.systemFlags[0]&3) { switch (ds.systemFlagsOld[0]&3) {
case 2: case 2:
return "FM Towns"; return "FM Towns";
} }
} else if (ds.system[0]==DIV_SYSTEM_YM2151) { } else if (ds.system[0]==DIV_SYSTEM_YM2151) {
switch (ds.systemFlags[0]&3) { switch (ds.systemFlagsOld[0]&3) {
case 2: case 2:
return "Sharp X68000"; return "Sharp X68000";
} }
} else if (ds.system[0]==DIV_SYSTEM_SAA1099) { } else if (ds.system[0]==DIV_SYSTEM_SAA1099) {
switch (ds.systemFlags[0]&3) { switch (ds.systemFlagsOld[0]&3) {
case 0: case 0:
return "SAM Coupé"; return "SAM Coupé";
} }

View file

@ -939,7 +939,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
if (!hasSN) { if (!hasSN) {
hasSN=disCont[i].dispatch->chipClock; hasSN=disCont[i].dispatch->chipClock;
willExport[i]=true; willExport[i]=true;
switch ((song.systemFlags[i]>>2)&3) { switch ((song.systemFlagsOld[i]>>2)&3) {
case 1: // real SN case 1: // real SN
snNoiseConfig=3; snNoiseConfig=3;
snNoiseSize=15; snNoiseSize=15;
@ -1054,7 +1054,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
ayConfig=0x03; ayConfig=0x03;
hasClockDivider=true; hasClockDivider=true;
} else { } else {
switch ((song.systemFlags[i]>>4)&3) { switch ((song.systemFlagsOld[i]>>4)&3) {
default: default:
case 0: // AY8910 case 0: // AY8910
ayConfig=0x00; ayConfig=0x00;
@ -1073,10 +1073,10 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
break; break;
} }
} }
if (hasClockDivider && ((song.systemFlags[i]>>7)&1)) { if (hasClockDivider && ((song.systemFlagsOld[i]>>7)&1)) {
ayFlags|=0x10; ayFlags|=0x10;
} }
if (hasStereo && ((song.systemFlags[i]>>6)&1)) { if (hasStereo && ((song.systemFlagsOld[i]>>6)&1)) {
ayFlags|=0x80; ayFlags|=0x80;
} }
willExport[i]=true; willExport[i]=true;
@ -1304,7 +1304,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
// chips even though the only difference is the output resolution // chips even though the only difference is the output resolution
// these system types are currently handled by reusing isSecond flag // these system types are currently handled by reusing isSecond flag
// also this system is not dual-able // also this system is not dual-able
if ((song.systemFlags[i]>>4)==1) { if ((song.systemFlagsOld[i]>>4)==1) {
if (!hasRFC1) { if (!hasRFC1) {
hasRFC1=disCont[i].dispatch->chipClock; hasRFC1=disCont[i].dispatch->chipClock;
isSecond[i]=true; isSecond[i]=true;

View file

@ -3438,7 +3438,7 @@ bool FurnaceGUI::loop() {
if (ImGui::BeginMenu("configure chip...")) { if (ImGui::BeginMenu("configure chip...")) {
for (int i=0; i<e->song.systemLen; i++) { for (int i=0; i<e->song.systemLen; i++) {
if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSP%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSP%d",i+1,getSystemName(e->song.system[i]),i).c_str())) {
drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true); drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true);
ImGui::TreePop(); ImGui::TreePop();
} }
} }

View file

@ -1904,7 +1904,7 @@ void FurnaceGUI::drawInsEdit() {
if (e->song.system[i]==DIV_SYSTEM_VRC7) { if (e->song.system[i]==DIV_SYSTEM_VRC7) {
isPresent[3]=true; isPresent[3]=true;
} else if (e->song.system[i]==DIV_SYSTEM_OPLL || e->song.system[i]==DIV_SYSTEM_OPLL_DRUMS) { } else if (e->song.system[i]==DIV_SYSTEM_OPLL || e->song.system[i]==DIV_SYSTEM_OPLL_DRUMS) {
isPresent[(e->song.systemFlags[i]>>4)&3]=true; isPresent[(e->song.systemFlagsOld[i]>>4)&3]=true;
} }
} }
if (!isPresent[0] && !isPresent[1] && !isPresent[2] && !isPresent[3]) { if (!isPresent[0] && !isPresent[1] && !isPresent[2] && !isPresent[3]) {

View file

@ -273,7 +273,7 @@ void FurnaceGUI::drawSettings() {
settings.initialSys.push_back(e->song.system[i]); settings.initialSys.push_back(e->song.system[i]);
settings.initialSys.push_back(e->song.systemVol[i]); settings.initialSys.push_back(e->song.systemVol[i]);
settings.initialSys.push_back(e->song.systemPan[i]); settings.initialSys.push_back(e->song.systemPan[i]);
settings.initialSys.push_back(e->song.systemFlags[i]); settings.initialSys.push_back(e->song.systemFlagsOld[i]);
} }
settings.initialSysName=e->song.systemName; settings.initialSysName=e->song.systemName;
} }

View file

@ -70,7 +70,7 @@ void FurnaceGUI::drawSysManager() {
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();
if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) {
drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true); drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true);
ImGui::TreePop(); ImGui::TreePop();
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();