diff --git a/bsnes/nall/snes/cartridge.hpp b/bsnes/nall/snes/cartridge.hpp index 4a3e153ca..1305247aa 100755 --- a/bsnes/nall/snes/cartridge.hpp +++ b/bsnes/nall/snes/cartridge.hpp @@ -408,7 +408,7 @@ SNESCartridge::SNESCartridge(const uint8_t *data, unsigned size) { } if(has_dsp1) { - xml << " \n"; + xml << " \n"; if(dsp1_mapper == DSP1LoROM1MB) { xml << " \n"; xml << " \n"; @@ -437,7 +437,7 @@ SNESCartridge::SNESCartridge(const uint8_t *data, unsigned size) { xml << " \n"; xml << " \n"; } - xml << " \n"; + xml << " \n"; } if(has_dsp2) { diff --git a/bsnes/snes/cartridge/xml.cpp b/bsnes/snes/cartridge/xml.cpp index 471a66e54..d906b3e22 100755 --- a/bsnes/snes/cartridge/xml.cpp +++ b/bsnes/snes/cartridge/xml.cpp @@ -232,9 +232,16 @@ void Cartridge::xml_parse_upd77c25(xml_element &root) { foreach(attr, root.attribute) { if(attr.name == "program") { - upd77c25.program = attr.content; - } else if(attr.name == "data") { - upd77c25.data = attr.content; + file fp; + if(fp.open(string(dir(basename()), attr.content), file::mode::read)) { + for(unsigned n = 0; n < 2048; n++) { + upd77c25.programROM[n] = fp.readm(3); + fp.read(); + } + for(unsigned n = 0; n < 1024; n++) { + upd77c25.dataROM[n] = fp.readm(2); + } + } } } diff --git a/bsnes/snes/chip/upd77c25/serialization.cpp b/bsnes/snes/chip/upd77c25/serialization.cpp new file mode 100755 index 000000000..0f55d424a --- /dev/null +++ b/bsnes/snes/chip/upd77c25/serialization.cpp @@ -0,0 +1,52 @@ +#ifdef UPD77C25_CPP + +void UPD77C25::serialize(serializer &s) { + s.array(dataRAM); + + s.integer(regs.pc); + for(unsigned n = 0; n < 4; n++) s.integer(regs.stack[n]); + s.integer(regs.rp); + s.integer(regs.dp); + s.integer(regs.k); + s.integer(regs.l); + s.integer(regs.m); + s.integer(regs.n); + s.integer(regs.a); + s.integer(regs.b); + + s.integer(regs.flaga.s1); + s.integer(regs.flaga.s0); + s.integer(regs.flaga.c); + s.integer(regs.flaga.z); + s.integer(regs.flaga.ov1); + s.integer(regs.flaga.ov0); + + s.integer(regs.flagb.s1); + s.integer(regs.flagb.s0); + s.integer(regs.flagb.c); + s.integer(regs.flagb.z); + s.integer(regs.flagb.ov1); + s.integer(regs.flagb.ov0); + + s.integer(regs.tr); + s.integer(regs.trb); + + s.integer(regs.sr.rqm); + s.integer(regs.sr.usf1); + s.integer(regs.sr.usf0); + s.integer(regs.sr.drs); + s.integer(regs.sr.dma); + s.integer(regs.sr.drc); + s.integer(regs.sr.soc); + s.integer(regs.sr.sic); + s.integer(regs.sr.ei); + s.integer(regs.sr.p1); + s.integer(regs.sr.p0); + + s.integer(regs.dr); + s.integer(regs.siack); + s.integer(regs.soack); + s.integer(regs.idb); +} + +#endif diff --git a/bsnes/snes/chip/upd77c25/upd77c25.cpp b/bsnes/snes/chip/upd77c25/upd77c25.cpp index d70321df1..abc0ae05b 100755 --- a/bsnes/snes/chip/upd77c25/upd77c25.cpp +++ b/bsnes/snes/chip/upd77c25/upd77c25.cpp @@ -7,6 +7,7 @@ #define UPD77C25_CPP namespace SNES { +#include "serialization.cpp" #include "disassembler.cpp" UPD77C25 upd77c25; @@ -17,7 +18,9 @@ void UPD77C25::Enter() { upd77c25.enter(); } void UPD77C25::enter() { while(true) { - //print(disassemble(regs.pc), "\n"); + if(scheduler.sync == Scheduler::SynchronizeMode::All) { + scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); + } uint24 opcode = programROM[regs.pc++]; switch(opcode >> 22) { @@ -27,7 +30,7 @@ void UPD77C25::enter() { case 3: exec_ld(opcode); break; } - uint31 result = regs.k * regs.l; //sign + 30-bit result + int32 result = (int32)regs.k * regs.l; //sign + 30-bit result regs.m = result >> 15; //store sign + top 15-bits regs.n = result << 1; //store low 15-bits + zero @@ -46,195 +49,6 @@ void UPD77C25::exec_op(uint24 opcode) { uint4 src = opcode >> 4; //move source uint4 dst = opcode >> 0; //move destination - unsigned p, q, r; - Flag flag; - - switch(pselect) { - case 0: p = dataRAM[regs.dp]; break; - case 1: p = regs.idb; break; - case 2: p = regs.m; break; - case 3: p = regs.n; break; - } - - switch(asl) { - case 0: q = regs.a; flag = regs.flaga; break; - case 1: q = regs.b; flag = regs.flagb; break; - } - - switch(alu) { - case 0: { //NOP - break; - } - - case 1: { //OR - r = q | p; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 2: { //AND - r = q & p; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 3: { //XOR - r = q ^ p; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 4: { //SUB - r = q - p; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 5: { //ADD - r = q + p; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 6: { //SBB - r = q - p - flag.c; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 7: { //ADC - r = q + p + flag.c; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 8: { //DEC - r = q - 1; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 9: { //INC - r = q + 1; - bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000); - bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000); - flag.s0 = r & 0x8000; - flag.s1 = pov; - flag.c = r > 0xffff; - flag.z = !r; - flag.ov0 = pov | nov; - flag.ov1 ^= flag.ov0; - break; - } - - case 10: { //CMP (complement) - r = ~q; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 11: { //SHR1 - r = q >> 1; - flag.s0 = r & 0x8000; - flag.c = q & 1; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 12: { //SHL1 - r = q << 1; - flag.s0 = r & 0x8000; - flag.c = r & 0x8000; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 13: { //SHL2 - r = q << 2; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 14: { //SHL4 - r = q << 4; - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - - case 15: { //XCHG - r = (q << 8) | (q >> 8); - flag.s0 = r & 0x8000; - flag.c = 0; - flag.z = !r; - flag.ov0 = 0; - flag.ov1 = 0; - break; - } - } - switch(src) { case 0: regs.idb = regs.trb; break; case 1: regs.idb = regs.a; break; @@ -243,7 +57,7 @@ void UPD77C25::exec_op(uint24 opcode) { case 4: regs.idb = regs.dp; break; case 5: regs.idb = regs.rp; break; case 6: regs.idb = dataROM[regs.rp]; break; - case 7: regs.idb = regs.flaga.s1 ? 0x7fff : 0x8000; break; + case 7: regs.idb = 0x8000 - regs.flaga.s1; break; case 8: regs.idb = regs.dr; regs.sr.rqm = 1; break; case 9: regs.idb = regs.dr; break; case 10: regs.idb = regs.sr; break; @@ -252,36 +66,92 @@ void UPD77C25::exec_op(uint24 opcode) { case 13: regs.idb = regs.k; break; case 14: regs.idb = regs.l; break; case 15: regs.idb = dataRAM[regs.dp]; break; - default: print("OP: unhandled src case ", strhex<2>(src), "\n"); break; } - switch(asl) { - case 0: regs.a = r; regs.flaga = flag; break; - case 1: regs.b = r; regs.flagb = flag; break; + if(alu) { + uint16 p, q, r; + Flag flag; + bool c; + + switch(pselect) { + case 0: p = dataRAM[regs.dp]; break; + case 1: p = regs.idb; break; + case 2: p = regs.m; break; + case 3: p = regs.n; break; + } + + switch(asl) { + case 0: q = regs.a; flag = regs.flaga; c = regs.flagb.c; break; + case 1: q = regs.b; flag = regs.flagb; c = regs.flaga.c; break; + } + + switch(alu) { + case 1: r = q | p; break; //OR + case 2: r = q & p; break; //AND + case 3: r = q ^ p; break; //XOR + case 4: r = q - p; break; //SUB + case 5: r = q + p; break; //ADD + case 6: r = q - p - c; break; //SBB + case 7: r = q + p + c; break; //ADC + case 8: r = q - 1; p = 1; break; //DEC + case 9: r = q + 1; p = 1; break; //INC + case 10: r = ~q; break; //CMP + case 11: r = (q >> 1) | (q & 0x8000); break; //SHR1 (ASR) + case 12: r = (q << 1) | c; break; //SHL1 (ROL) + case 13: r = (q << 2); break; //SHL2 + case 14: r = (q << 4); break; //SHL4 + case 15: r = (q << 8) | (q >> 8); break; //XCHG + } + + flag.s0 = (r & 0x8000); + flag.z = (r == 0); + + switch(alu) { + case 1: case 2: case 3: case 10: case 13: case 14: case 15: { + flag.c = 0; + flag.ov0 = 0; + flag.ov1 = 0; + break; + } + case 4: case 5: case 6: case 7: case 8: case 9: { + if(alu & 1) { + //addition + flag.ov0 = (q ^ r) & ~(q ^ p) & 0x8000; + flag.c = (r < q); + } else { + //subtraction + flag.ov0 = (q ^ r) & (q ^ p) & 0x8000; + flag.c = (r > q); + } + if(flag.ov0) { + flag.s1 = flag.ov1 ^ !(r & 0x8000); + flag.ov1 = !flag.ov1; + } + break; + } + case 11: { + flag.c = q & 1; + flag.ov0 = 0; + flag.ov1 = 0; + break; + } + case 12: { + flag.c = q >> 15; + flag.ov0 = 0; + flag.ov1 = 0; + break; + } + } + + switch(asl) { + case 0: regs.a = r; regs.flaga = flag; break; + case 1: regs.b = r; regs.flagb = flag; break; + } } - switch(dst) { - case 0: break; - case 1: regs.a = regs.idb; break; - case 2: regs.b = regs.idb; break; - case 3: regs.tr = regs.idb; break; - case 4: regs.dp = regs.idb; break; - case 5: regs.rp = regs.idb; break; - case 6: regs.dr = regs.idb; regs.sr.rqm = 1; break; - case 7: regs.sr = (regs.sr & 0x9000) | (regs.idb & ~0x9000); break; - //case 8: regs.sol = regs.idb; break; - //case 9: regs.som = regs.idb; break; - case 10: regs.k = regs.idb; break; - case 11: regs.k = regs.idb; regs.l = dataROM[regs.rp]; break; - case 12: regs.k = dataRAM[regs.dp | 0x40]; regs.l = regs.idb; break; - case 13: regs.l = regs.idb; break; - case 14: regs.trb = regs.idb; break; - case 15: dataRAM[regs.dp] = regs.idb; break; - default: print("OP: unhandled dst case ", strhex<2>(dst), "\n"); break; - } + exec_ld((regs.idb << 6) + dst); switch(dpl) { - case 0: break; //DPNOP case 1: regs.dp = (regs.dp & 0xf0) + ((regs.dp + 1) & 0x0f); break; //DPINC case 2: regs.dp = (regs.dp & 0xf0) + ((regs.dp - 1) & 0x0f); break; //DPDEC case 3: regs.dp = (regs.dp & 0xf0); break; //DPCLR @@ -289,10 +159,7 @@ void UPD77C25::exec_op(uint24 opcode) { regs.dp ^= dphm << 4; - switch(rpdcr) { - case 0: break; //RPNOP - case 1: regs.rp--; break; //RPDEC - } + if(rpdcr) regs.rp--; } void UPD77C25::exec_rt(uint24 opcode) { @@ -357,6 +224,8 @@ void UPD77C25::exec_ld(uint24 opcode) { uint16 id = opcode >> 6; //immediate data uint4 dst = opcode >> 0; //destination + regs.idb = id; + switch(dst) { case 0: break; case 1: regs.a = id; break; @@ -365,16 +234,15 @@ void UPD77C25::exec_ld(uint24 opcode) { case 4: regs.dp = id; break; case 5: regs.rp = id; break; case 6: regs.dr = id; regs.sr.rqm = 1; break; - case 7: regs.sr = (regs.sr & 0x9000) | (id & ~0x9000); break; + case 7: regs.sr = (regs.sr & 0x907c) | (id & ~0x907c); break; //case 8: regs.sol = id; break; //case 9: regs.som = id; break; case 10: regs.k = id; break; - case 11: regs.k = regs.idb; regs.l = dataROM[regs.rp]; break; - case 12: regs.k = dataRAM[regs.dp | 0x40]; regs.l = regs.idb; break; + case 11: regs.k = id; regs.l = dataROM[regs.rp]; break; + case 12: regs.l = id; regs.k = dataRAM[regs.dp | 0x40]; break; case 13: regs.l = id; break; case 14: regs.trb = id; break; case 15: dataRAM[regs.dp] = id; break; - default: print("LD: unhandled dst case ", strhex<2>(dst), "\n"); break; } } @@ -394,42 +262,44 @@ void UPD77C25::stack_pull() { } uint8 UPD77C25::read(bool mode) { - if(mode == 0) return (unsigned)regs.sr >> 8; + cpu.synchronize_coprocessor(); + if(mode == 0) return regs.sr >> 8; if(regs.sr.drc == 0) { //16-bit if(regs.sr.drs == 0) { regs.sr.drs = 1; - return regs.dr >> 8; + return regs.dr >> 0; } else { regs.sr.rqm = 0; regs.sr.drs = 0; - return regs.dr >> 0; + return regs.dr >> 8; } } else { //8-bit regs.sr.rqm = 0; - return regs.dr; + return regs.dr >> 0; } } void UPD77C25::write(bool mode, uint8 data) { + cpu.synchronize_coprocessor(); if(mode == 0) return; if(regs.sr.drc == 0) { //16-bit if(regs.sr.drs == 0) { regs.sr.drs = 1; - regs.dr = (data << 8) | (regs.dr & 0x00ff); + regs.dr = (regs.dr & 0xff00) | (data << 0); } else { regs.sr.rqm = 0; regs.sr.drs = 0; - regs.dr = (regs.dr & 0xff00) | (data << 0); + regs.dr = (data << 8) | (regs.dr & 0x00ff); } } else { //8-bit regs.sr.rqm = 0; - regs.dr = data; + regs.dr = (regs.dr & 0xff00) | (data << 0); } } @@ -440,43 +310,7 @@ void UPD77C25::enable() { } void UPD77C25::power() { - for(unsigned i = 0; i < 2048; i++) programROM[i] = 0x000000; - for(unsigned i = 0; i < 1024; i++) dataROM[i] = 0x0000; for(unsigned i = 0; i < 256; i++) dataRAM[i] = 0x0000; - - string filename; - file fp; - - filename = string(dir(cartridge.basename()), program); - if(fp.open(filename, file::mode::read)) { - for(unsigned i = 0; i < 2048; i++) { - programROM[i] |= fp.read() << 16; - programROM[i] |= fp.read() << 8; - programROM[i] |= fp.read() << 0; - fp.read(); //skip 24-bit -> 32-bit padding - } - fp.close(); - } - - filename = string(dir(cartridge.basename()), data); - if(fp.open(filename, file::mode::read)) { - for(unsigned i = 0; i < 1024; i++) { - dataROM[i] |= fp.read() << 8; - dataROM[i] |= fp.read() << 0; - } - fp.close(); - } - - #if 0 - fp.open("/home/byuu/Desktop/disassembly.txt", file::mode::write); - for(unsigned i = 0; i < 2048; i++) { - string output = disassemble(i); - fp.print(output); - fp.print("\n"); - } - fp.close(); - #endif - reset(); } diff --git a/bsnes/snes/chip/upd77c25/upd77c25.hpp b/bsnes/snes/chip/upd77c25/upd77c25.hpp index ae49cdad6..782661f4d 100755 --- a/bsnes/snes/chip/upd77c25/upd77c25.hpp +++ b/bsnes/snes/chip/upd77c25/upd77c25.hpp @@ -7,16 +7,15 @@ public: void power(); void reset(); - string disassemble(uint11 ip); + void serialize(serializer &s); - string program; - string data; - -private: uint24 programROM[2048]; uint16 dataROM[1024]; uint16 dataRAM[256]; + string disassemble(uint11 ip); + +private: struct Flag { bool s1, s0, c, z, ov1, ov0; @@ -52,16 +51,16 @@ private: uint11 stack[4]; //LIFO uint10 rp; //ROM pointer uint8 dp; //data pointer - uint16 k; - uint16 l; - uint16 m; - uint16 n; - uint16 a; //accumulator - uint16 b; //accumulator + int16 k; + int16 l; + int16 m; + int16 n; + int16 a; //accumulator + int16 b; //accumulator Flag flaga; Flag flagb; - uint16 tr; //temporary registers - uint16 trb; + uint16 tr; //temporary register + uint16 trb; //temporary register Status sr; //status register uint16 dr; //data register bool siack; @@ -73,8 +72,10 @@ private: void exec_rt(uint24 opcode); void exec_jp(uint24 opcode); void exec_ld(uint24 opcode); + void stack_push(); void stack_pull(); + uint8 read(bool mode); void write(bool mode, uint8 data); diff --git a/bsnes/snes/snes.hpp b/bsnes/snes/snes.hpp index c12d1eaf6..cf7a40b25 100755 --- a/bsnes/snes/snes.hpp +++ b/bsnes/snes/snes.hpp @@ -1,12 +1,12 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "072.10"; + static const char Version[] = "072.11"; static const unsigned SerializerVersion = 14; } } -#define DEBUGGER +//#define DEBUGGER #define CHEAT_SYSTEM #include diff --git a/bsnes/snes/system/serialization.cpp b/bsnes/snes/system/serialization.cpp index 4a673e65d..4fbce43ef 100755 --- a/bsnes/snes/system/serialization.cpp +++ b/bsnes/snes/system/serialization.cpp @@ -60,6 +60,7 @@ void System::serialize_all(serializer &s) { if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) supergameboy.serialize(s); if(cartridge.has_superfx()) superfx.serialize(s); if(cartridge.has_sa1()) sa1.serialize(s); + if(cartridge.has_upd77c25()) upd77c25.serialize(s); if(cartridge.has_srtc()) srtc.serialize(s); if(cartridge.has_sdd1()) sdd1.serialize(s); if(cartridge.has_spc7110()) spc7110.serialize(s); diff --git a/bsnes/snes/system/system.cpp b/bsnes/snes/system/system.cpp index 95b1c8fb0..234762383 100755 --- a/bsnes/snes/system/system.cpp +++ b/bsnes/snes/system/system.cpp @@ -217,6 +217,7 @@ void System::reset() { if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) cpu.coprocessors.append(&supergameboy); if(cartridge.has_superfx()) cpu.coprocessors.append(&superfx); if(cartridge.has_sa1()) cpu.coprocessors.append(&sa1); + if(cartridge.has_upd77c25()) cpu.coprocessors.append(&upd77c25); if(cartridge.has_msu1()) cpu.coprocessors.append(&msu1); if(cartridge.has_serial()) cpu.coprocessors.append(&serial); diff --git a/bsnes/ui-phoenix/cartridge/cartridge.cpp b/bsnes/ui-phoenix/cartridge/cartridge.cpp index 67ae3a262..de6a17329 100755 --- a/bsnes/ui-phoenix/cartridge/cartridge.cpp +++ b/bsnes/ui-phoenix/cartridge/cartridge.cpp @@ -4,7 +4,7 @@ Cartridge cartridge; bool Cartridge::loadNormal(const char *basename) { unload(); if(loadCartridge(SNES::memory::cartrom, baseXML, basename) == false) return false; - baseName = nall::basename(basename); + SNES::cartridge.basename = baseName = nall::basename(basename); SNES::cartridge.load(SNES::Cartridge::Mode::Normal, { baseXML }); loadMemory(SNES::memory::cartram, baseName, ".srm"); loadMemory(SNES::memory::cartrtc, baseName, ".rtc"); @@ -16,7 +16,7 @@ bool Cartridge::loadBsxSlotted(const char *basename, const char *slotname) { unload(); if(loadCartridge(SNES::memory::cartrom, baseXML, basename) == false) return false; loadCartridge(SNES::memory::bsxflash, slotAXML, slotname); - baseName = nall::basename(basename); + SNES::cartridge.basename = baseName = nall::basename(basename); slotAName = nall::basename(slotname); SNES::cartridge.load(SNES::Cartridge::Mode::BsxSlotted, { baseXML, slotAXML }); loadMemory(SNES::memory::cartram, baseName, ".srm"); @@ -29,7 +29,7 @@ bool Cartridge::loadBsx(const char *basename, const char *slotname) { unload(); if(loadCartridge(SNES::memory::cartrom, baseXML, basename) == false) return false; loadCartridge(SNES::memory::bsxflash, slotAXML, slotname); - baseName = nall::basename(basename); + SNES::cartridge.basename = baseName = nall::basename(basename); slotAName = nall::basename(slotname); SNES::cartridge.load(SNES::Cartridge::Mode::Bsx, { baseXML, slotAXML }); loadMemory(SNES::memory::bsxram, baseName, ".srm"); @@ -43,7 +43,7 @@ bool Cartridge::loadSufamiTurbo(const char *basename, const char *slotAname, con if(loadCartridge(SNES::memory::cartrom, baseXML, basename) == false) return false; loadCartridge(SNES::memory::stArom, slotAXML, slotAname); loadCartridge(SNES::memory::stBrom, slotBXML, slotBname); - baseName = nall::basename(basename); + SNES::cartridge.basename = baseName = nall::basename(basename); slotAName = nall::basename(slotAname); slotBName = nall::basename(slotBname); SNES::cartridge.load(SNES::Cartridge::Mode::SufamiTurbo, { baseXML, slotAXML, slotBXML }); @@ -57,7 +57,7 @@ bool Cartridge::loadSuperGameBoy(const char *basename, const char *slotname) { unload(); if(loadCartridge(SNES::memory::cartrom, baseXML, basename) == false) return false; loadCartridge(SNES::memory::gbrom, slotAXML, slotname); - baseName = nall::basename(basename); + SNES::cartridge.basename = baseName = nall::basename(basename); slotAName = nall::basename(slotname); SNES::cartridge.load(SNES::Cartridge::Mode::SuperGameBoy, { baseXML, slotAXML }); loadMemory(SNES::memory::gbram, slotAName, ".sav"); diff --git a/bsnes/ui-phoenix/utility/utility.cpp b/bsnes/ui-phoenix/utility/utility.cpp index 139b58fe6..03921daf4 100755 --- a/bsnes/ui-phoenix/utility/utility.cpp +++ b/bsnes/ui-phoenix/utility/utility.cpp @@ -92,7 +92,6 @@ void Utility::setShader() { } void Utility::cartridgeLoaded() { - SNES::cartridge.basename = cartridge.baseName; SNES::system.power(); cheatEditor.load(cartridge.baseName); stateManager.load();