diff --git a/src/DSi.cpp b/src/DSi.cpp index 9267f148..0f8fd943 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -47,8 +47,6 @@ namespace DSi { -u32 BootAddr[2]; - u16 SCFG_BIOS; u16 SCFG_Clock9; u16 SCFG_Clock7; @@ -79,14 +77,9 @@ DSi_NDMA* NDMAs[8]; DSi_SDHost* SDMMC; DSi_SDHost* SDIO; -FILE* SDMMCFile = nullptr; - u64 ConsoleID; u8 eMMC_CID[16]; -u8 ITCMInit[0x8000]; -u8 ARM7Init[0x3C00]; - void Set_SCFG_Clock9(u16 val); @@ -134,8 +127,6 @@ void DeInit() delete SDMMC; delete SDIO; - - CloseDSiNAND(); } void Reset() @@ -144,21 +135,24 @@ void Reset() //NDS::ARM9->CP15Write(0x911, 0x00000020); //NDS::ARM9->CP15Write(0x100, NDS::ARM9->CP15Read(0x100) | 0x00050000); - NDS::ARM9->JumpTo(BootAddr[0]); - NDS::ARM7->JumpTo(BootAddr[1]); + NDS::MapSharedWRAM(3); NDMACnt[0] = 0; NDMACnt[1] = 0; for (int i = 0; i < 8; i++) NDMAs[i]->Reset(); - memcpy(NDS::ARM9->ITCM, ITCMInit, 0x8000); - DSi_I2C::Reset(); - DSi_AES::Reset(); DSi_DSP::Reset(); + SDMMC->CloseHandles(); + SDIO->CloseHandles(); + + LoadNAND(); + SDMMC->Reset(); SDIO->Reset(); + DSi_AES::Reset(); + SCFG_BIOS = 0x0101; // TODO: should be zero when booting from BIOS SCFG_Clock9 = 0x0187; // CHECKME SCFG_Clock7 = 0x0187; @@ -172,22 +166,6 @@ void Reset() // LCD init flag GPU::DispStat[0] |= (1<<6); GPU::DispStat[1] |= (1<<6); - - NDS::MapSharedWRAM(3); - - for (u32 i = 0; i < 0x3C00; i+=4) - ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); - - u32 eaddr = 0x03FFE6E4; - ARM7Write32(eaddr+0x00, *(u32*)&eMMC_CID[0]); - ARM7Write32(eaddr+0x04, *(u32*)&eMMC_CID[4]); - ARM7Write32(eaddr+0x08, *(u32*)&eMMC_CID[8]); - ARM7Write32(eaddr+0x0C, *(u32*)&eMMC_CID[12]); - ARM7Write16(eaddr+0x2C, 0x0001); - ARM7Write16(eaddr+0x2E, 0x0001); - ARM7Write16(eaddr+0x3C, 0x0100); - ARM7Write16(eaddr+0x3E, 0x40E0); - ARM7Write16(eaddr+0x42, 0x0001); } void DecryptModcryptArea(u32 offset, u32 size, u8* iv) @@ -445,24 +423,30 @@ void SetupDirectBoot() ARM9Write32(0x02FFE000+i, tmp); } - if (DSi_NAND::Init(SDMMCFile, &DSi::ARM7iBIOS[0x8308])) + FILE* nand = Platform::OpenLocalFile(Platform::GetConfigString(Platform::DSi_NANDPath), "r+b"); + if (nand) { - u8 userdata[0x1B0]; - DSi_NAND::ReadUserData(userdata); - for (u32 i = 0; i < 0x128; i+=4) - ARM9Write32(0x02000400+i, *(u32*)&userdata[0x88+i]); + if (DSi_NAND::Init(nand, &DSi::ARM7iBIOS[0x8308])) + { + u8 userdata[0x1B0]; + DSi_NAND::ReadUserData(userdata); + for (u32 i = 0; i < 0x128; i+=4) + ARM9Write32(0x02000400+i, *(u32*)&userdata[0x88+i]); - u8 hwinfoS[0xA4]; - u8 hwinfoN[0x9C]; - DSi_NAND::ReadHardwareInfo(hwinfoS, hwinfoN); + u8 hwinfoS[0xA4]; + u8 hwinfoN[0x9C]; + DSi_NAND::ReadHardwareInfo(hwinfoS, hwinfoN); - for (u32 i = 0; i < 0x14; i+=4) - ARM9Write32(0x02000600+i, *(u32*)&hwinfoN[0x88+i]); + for (u32 i = 0; i < 0x14; i+=4) + ARM9Write32(0x02000600+i, *(u32*)&hwinfoN[0x88+i]); - for (u32 i = 0; i < 0x18; i+=4) - ARM9Write32(0x02FFFD68+i, *(u32*)&hwinfoS[0x88+i]); + for (u32 i = 0; i < 0x18; i+=4) + ARM9Write32(0x02FFFD68+i, *(u32*)&hwinfoS[0x88+i]); - DSi_NAND::DeInit(); + DSi_NAND::DeInit(); + } + + fclose(nand); } u8 nwifiver = SPI_Firmware::GetNWifiVersion(); @@ -544,21 +528,28 @@ void SoftReset() NDS::ARM9->CP15Reset(); - memcpy(NDS::ARM9->ITCM, ITCMInit, 0x8000); + NDS::MapSharedWRAM(3); + + // FIXME!!!!! + //memcpy(NDS::ARM9->ITCM, ITCMInit, 0x8000); - DSi_AES::Reset(); // TODO: does the DSP get reset? NWRAM doesn't, so I'm assuming no // *HOWEVER*, the bootrom (which does get rerun) does remap NWRAM, and thus // the DSP most likely gets reset DSi_DSP::Reset(); + SDMMC->CloseHandles(); + SDIO->CloseHandles(); + LoadNAND(); SDMMC->Reset(); SDIO->Reset(); - NDS::ARM9->JumpTo(BootAddr[0]); - NDS::ARM7->JumpTo(BootAddr[1]); + DSi_AES::Reset(); + + //NDS::ARM9->JumpTo(BootAddr[0]); + //NDS::ARM7->JumpTo(BootAddr[1]); SCFG_BIOS = 0x0101; // TODO: should be zero when booting from BIOS SCFG_Clock9 = 0x0187; // CHECKME @@ -575,10 +566,8 @@ void SoftReset() GPU::DispStat[0] |= (1<<6); GPU::DispStat[1] |= (1<<6); - NDS::MapSharedWRAM(3); - - for (u32 i = 0; i < 0x3C00; i+=4) - ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); + //for (u32 i = 0; i < 0x3C00; i+=4) + // ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); u32 eaddr = 0x03FFE6E4; ARM7Write32(eaddr+0x00, *(u32*)&eMMC_CID[0]); @@ -650,7 +639,14 @@ bool LoadNAND() { printf("Loading DSi NAND\n"); - if (!DSi_NAND::Init(SDMMCFile, &DSi::ARM7iBIOS[0x8308])) + FILE* nand = Platform::OpenLocalFile(Platform::GetConfigString(Platform::DSi_NANDPath), "r+b"); + if (!nand) + { + printf("Failed to open DSi NAND\n"); + return false; + } + + if (!DSi_NAND::Init(nand, &DSi::ARM7iBIOS[0x8308])) { printf("Failed to load DSi NAND\n"); return false; @@ -676,8 +672,8 @@ bool LoadNAND() memset(NWRAMMask, 0, sizeof(NWRAMMask)); u32 bootparams[8]; - fseek(SDMMCFile, 0x220, SEEK_SET); - fread(bootparams, 4, 8, SDMMCFile); + fseek(nand, 0x220, SEEK_SET); + fread(bootparams, 4, 8, nand); printf("ARM9: offset=%08X size=%08X RAM=%08X size_aligned=%08X\n", bootparams[0], bootparams[1], bootparams[2], bootparams[3]); @@ -690,8 +686,8 @@ bool LoadNAND() MBK[1][8] = 0; u32 mbk[12]; - fseek(SDMMCFile, 0x380, SEEK_SET); - fread(mbk, 4, 12, SDMMCFile); + fseek(nand, 0x380, SEEK_SET); + fread(mbk, 4, 12, nand); MapNWRAM_A(0, mbk[0] & 0xFF); MapNWRAM_A(1, (mbk[0] >> 8) & 0xFF); @@ -745,12 +741,12 @@ bool LoadNAND() AES_init_ctx_iv(&ctx, boot2key, boot2iv); - fseek(SDMMCFile, bootparams[0], SEEK_SET); + fseek(nand, bootparams[0], SEEK_SET); dstaddr = bootparams[2]; for (u32 i = 0; i < bootparams[3]; i += 16) { u8 data[16]; - fread(data, 16, 1, SDMMCFile); + fread(data, 16, 1, nand); for (int j = 0; j < 16; j++) tmp[j] = data[15-j]; AES_CTR_xcrypt_buffer(&ctx, tmp, 16); @@ -770,12 +766,12 @@ bool LoadNAND() AES_init_ctx_iv(&ctx, boot2key, boot2iv); - fseek(SDMMCFile, bootparams[4], SEEK_SET); + fseek(nand, bootparams[4], SEEK_SET); dstaddr = bootparams[6]; for (u32 i = 0; i < bootparams[7]; i += 16) { u8 data[16]; - fread(data, 16, 1, SDMMCFile); + fread(data, 16, 1, nand); for (int j = 0; j < 16; j++) tmp[j] = data[15-j]; AES_CTR_xcrypt_buffer(&ctx, tmp, 16); @@ -787,11 +783,6 @@ bool LoadNAND() ARM7Write32(dstaddr, *(u32*)&data[12]); dstaddr += 4; } - // repoint the CPUs to the boot2 binaries - - BootAddr[0] = bootparams[2]; - BootAddr[1] = bootparams[6]; - #define printhex(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[z]); printf("\n"); } #define printhex_rev(str, size) { for (int z = (size)-1; z >= 0; z--) printf("%02X", (str)[z]); printf("\n"); } @@ -800,18 +791,36 @@ bool LoadNAND() printf("eMMC CID: "); printhex(eMMC_CID, 16); printf("Console ID: %" PRIx64 "\n", ConsoleID); - memset(ITCMInit, 0, 0x8000); - memcpy(&ITCMInit[0x4400], &ARM9iBIOS[0x87F4], 0x400); - memcpy(&ITCMInit[0x4800], &ARM9iBIOS[0x9920], 0x80); - memcpy(&ITCMInit[0x4894], &ARM9iBIOS[0x99A0], 0x1048); - memcpy(&ITCMInit[0x58DC], &ARM9iBIOS[0xA9E8], 0x1048); + u32 eaddr = 0x03FFE6E4; + ARM7Write32(eaddr+0x00, *(u32*)&eMMC_CID[0]); + ARM7Write32(eaddr+0x04, *(u32*)&eMMC_CID[4]); + ARM7Write32(eaddr+0x08, *(u32*)&eMMC_CID[8]); + ARM7Write32(eaddr+0x0C, *(u32*)&eMMC_CID[12]); + ARM7Write16(eaddr+0x2C, 0x0001); + ARM7Write16(eaddr+0x2E, 0x0001); + ARM7Write16(eaddr+0x3C, 0x0100); + ARM7Write16(eaddr+0x3E, 0x40E0); + ARM7Write16(eaddr+0x42, 0x0001); + memcpy(&NDS::ARM9->ITCM[0x4400], &ARM9iBIOS[0x87F4], 0x400); + memcpy(&NDS::ARM9->ITCM[0x4800], &ARM9iBIOS[0x9920], 0x80); + memcpy(&NDS::ARM9->ITCM[0x4894], &ARM9iBIOS[0x99A0], 0x1048); + memcpy(&NDS::ARM9->ITCM[0x58DC], &ARM9iBIOS[0xA9E8], 0x1048); + + u8 ARM7Init[0x3C00]; memset(ARM7Init, 0, 0x3C00); memcpy(&ARM7Init[0x0000], &ARM7iBIOS[0x8188], 0x200); memcpy(&ARM7Init[0x0200], &ARM7iBIOS[0xB5D8], 0x40); memcpy(&ARM7Init[0x0254], &ARM7iBIOS[0xC6D0], 0x1048); memcpy(&ARM7Init[0x129C], &ARM7iBIOS[0xD718], 0x1048); + for (u32 i = 0; i < 0x3C00; i+=4) + ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); + + // repoint the CPUs to the boot2 binaries + NDS::ARM9->JumpTo(bootparams[2]); + NDS::ARM7->JumpTo(bootparams[6]); + DSi_NAND::PatchUserData(); DSi_NAND::DeInit(); @@ -819,12 +828,6 @@ bool LoadNAND() return true; } -void CloseDSiNAND() -{ - if (DSi::SDMMCFile) - fclose(DSi::SDMMCFile); - DSi::SDMMCFile = nullptr; -} void RunNDMAs(u32 cpu) { diff --git a/src/DSi.h b/src/DSi.h index 12365277..2e6fda97 100644 --- a/src/DSi.h +++ b/src/DSi.h @@ -39,8 +39,6 @@ extern u64 ConsoleID; extern DSi_SDHost* SDMMC; extern DSi_SDHost* SDIO; -extern FILE* SDMMCFile; - const u32 NWRAMSize = 0x40000; extern u8* NWRAM_A; @@ -65,8 +63,6 @@ void SoftReset(); bool LoadBIOS(); bool LoadNAND(); -void CloseDSiNAND(); - void RunNDMAs(u32 cpu); void StallNDMAs(); bool NDMAsInMode(u32 cpu, u32 mode); diff --git a/src/DSi_SD.cpp b/src/DSi_SD.cpp index 4c2b0855..2b9ac77f 100644 --- a/src/DSi_SD.cpp +++ b/src/DSi_SD.cpp @@ -61,6 +61,14 @@ DSi_SDHost::~DSi_SDHost() if (Ports[1]) delete Ports[1]; } +void DSi_SDHost::CloseHandles() +{ + if (Ports[0]) delete Ports[0]; + if (Ports[1]) delete Ports[1]; + Ports[0] = nullptr; + Ports[1] = nullptr; +} + void DSi_SDHost::Reset() { if (Num == 0) @@ -101,10 +109,7 @@ void DSi_SDHost::Reset() TXReq = false; - if (Ports[0]) delete Ports[0]; - if (Ports[1]) delete Ports[1]; - Ports[0] = nullptr; - Ports[1] = nullptr; + CloseHandles(); if (Num == 0) { @@ -131,7 +136,7 @@ void DSi_SDHost::Reset() else sd = nullptr; - mmc = new DSi_MMCStorage(this, true, DSi::SDMMCFile); + mmc = new DSi_MMCStorage(this, true, Platform::GetConfigString(Platform::DSi_NANDPath)); mmc->SetCID(DSi::eMMC_CID); Ports[0] = sd; @@ -727,12 +732,15 @@ void DSi_SDHost::CheckSwapFIFO() #define MMC_DESC (Internal?"NAND":"SDcard") -DSi_MMCStorage::DSi_MMCStorage(DSi_SDHost* host, bool internal, FILE* file) +DSi_MMCStorage::DSi_MMCStorage(DSi_SDHost* host, bool internal, std::string filename) : DSi_SDDevice(host) { Internal = internal; - File = file; + File = Platform::OpenLocalFile(filename, "r+b"); + printf("BLAGFARTED: %s -> %p\n", filename.c_str(), File); SD = nullptr; + + ReadOnly = false; } DSi_MMCStorage::DSi_MMCStorage(DSi_SDHost* host, bool internal, std::string filename, u64 size, bool readonly, std::string sourcedir) @@ -754,6 +762,10 @@ DSi_MMCStorage::~DSi_MMCStorage() SD->Close(); delete SD; } + if (File) + { + fclose(File); + } } void DSi_MMCStorage::Reset() diff --git a/src/DSi_SD.h b/src/DSi_SD.h index 1c0f7ce1..1927e695 100644 --- a/src/DSi_SD.h +++ b/src/DSi_SD.h @@ -33,6 +33,7 @@ public: DSi_SDHost(u32 num); ~DSi_SDHost(); + void CloseHandles(); void Reset(); void DoSavestate(Savestate* file); @@ -122,7 +123,7 @@ protected: class DSi_MMCStorage : public DSi_SDDevice { public: - DSi_MMCStorage(DSi_SDHost* host, bool internal, FILE* file); + DSi_MMCStorage(DSi_SDHost* host, bool internal, std::string filename); DSi_MMCStorage(DSi_SDHost* host, bool internal, std::string filename, u64 size, bool readonly, std::string sourcedir); ~DSi_MMCStorage(); diff --git a/src/NDS.cpp b/src/NDS.cpp index ea538c3a..2957cadb 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -565,7 +565,6 @@ void Reset() if (ConsoleType == 1) { DSi::LoadBIOS(); - DSi::LoadNAND(); ARM9ClockShift = 2; MainRAMMask = 0xFFFFFF; @@ -932,6 +931,11 @@ void EjectCart() NDSCart::EjectCart(); } +bool CartInserted() +{ + return NDSCart::CartInserted; +} + bool LoadGBACart(const u8* romdata, u32 romlen, const u8* savedata, u32 savelen) { if (!GBACart::LoadROM(romdata, romlen)) diff --git a/src/NDS.h b/src/NDS.h index d3bee637..5906172a 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -240,6 +240,7 @@ void LoadBIOS(); bool LoadCart(const u8* romdata, u32 romlen, const u8* savedata, u32 savelen); void EjectCart(); +bool CartInserted(); bool NeedsDirectBoot(); void SetupDirectBoot(std::string romname); diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 8f0f3909..1fe355bf 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -1489,6 +1489,7 @@ void CartHomebrew::ReadROM_B7(u32 addr, u32 len, u8* data, u32 offset) bool Init() { + CartInserted = false; CartROM = nullptr; Cart = nullptr; @@ -1503,14 +1504,14 @@ void DeInit() void Reset() { - if (Cart) delete Cart; + /*if (Cart) delete Cart; Cart = nullptr; CartInserted = false; if (CartROM) delete[] CartROM; CartROM = nullptr; CartROMSize = 0; - CartID = 0; + CartID = 0;*/ ResetCart(); } @@ -1716,7 +1717,7 @@ bool LoadROM(const u8* romdata, u32 romlen) Key1_Encrypt((u32*)&CartROM[arm9base]); } } -printf("FAZIL"); + CartInserted = true; u32 irversion = 0; @@ -1738,7 +1739,7 @@ printf("FAZIL"); Cart = new CartRetailBT(CartROM, CartROMSize, CartID); else Cart = new CartRetail(CartROM, CartROMSize, CartID); -printf("PFART\n"); + if (Cart) Cart->Reset(); /*{ @@ -1759,14 +1760,14 @@ printf("PFART\n"); //if (Cart) Cart->LoadSave(sram, romparams.SaveMemType); if (Cart && romparams.SaveMemType > 0) Cart->SetupSave(romparams.SaveMemType); -printf("PROEUPRAOUTTE\n"); + return true; } void LoadSave(const u8* savedata, u32 savelen) -{printf("CARTSAVE\n"); +{ if (Cart) - Cart->LoadSave(savedata, savelen);printf("SAVE FARTED\n"); + Cart->LoadSave(savedata, savelen); } /*bool LoadROM(const char* path, const char* sram, bool direct) diff --git a/src/NDSCart.h b/src/NDSCart.h index 642a9792..a059b2db 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -196,6 +196,7 @@ extern u32 ROMCnt; extern u8 ROMCommand[8]; +extern bool CartInserted; extern u8* CartROM; extern u32 CartROMSize; diff --git a/src/frontend/Util_ROM.cpp b/src/frontend/Util_ROM.cpp index a40d981a..26e513d2 100644 --- a/src/frontend/Util_ROM.cpp +++ b/src/frontend/Util_ROM.cpp @@ -220,7 +220,7 @@ int SetupDSiNAND() // TODO: some basic checks // check that it has the nocash footer, and all - DSi::SDMMCFile = f; + //DSi::SDMMCFile = f; return Load_OK; } @@ -253,7 +253,7 @@ void LoadCheats() int LoadBIOS() { - DSi::CloseDSiNAND(); + //DSi::CloseDSiNAND(); int res; @@ -373,7 +373,7 @@ int LoadROM(const u8 *romdata, u32 romlength, const char *archivefilename, const int LoadROM(const char* file, int slot) { - DSi::CloseDSiNAND(); + //DSi::CloseDSiNAND(); int res; bool directboot = Config::DirectBoot != 0; @@ -530,12 +530,12 @@ void UnloadROM(int slot) ROMPath[slot] = ""; - DSi::CloseDSiNAND(); +// DSi::CloseDSiNAND(); } int Reset() { - DSi::CloseDSiNAND(); +// DSi::CloseDSiNAND(); int res; bool directboot = Config::DirectBoot != 0; diff --git a/src/frontend/qt_sdl/ROMLoader.cpp b/src/frontend/qt_sdl/ROMLoader.cpp index f063aeb9..789e713d 100644 --- a/src/frontend/qt_sdl/ROMLoader.cpp +++ b/src/frontend/qt_sdl/ROMLoader.cpp @@ -42,6 +42,7 @@ namespace ROMLoader std::string FullROMPath; std::string BaseROMDir; std::string BaseROMName; +std::string BaseAssetName; int LastSep(std::string path) @@ -75,7 +76,7 @@ std::string GetAssetPath(std::string configpath, std::string ext) if (!configpath.empty()) configpath += "/"; - return configpath + BaseROMName + ext; + return configpath + BaseAssetName + ext; } @@ -257,12 +258,15 @@ QString VerifySetup() bool LoadBIOS() { + NDS::SetConsoleType(Config::ConsoleType); + if (NDS::NeedsDirectBoot()) return false; FullROMPath = ""; BaseROMDir = ""; BaseROMName = ""; + BaseAssetName = ""; NDS::Reset(); return true; @@ -343,10 +347,12 @@ bool LoadROM(QStringList filepath, bool reset) FullROMPath = fullpath; BaseROMDir = basepath; - BaseROMName = romname.substr(0, romname.rfind('.')); + BaseROMName = romname; + BaseAssetName = romname.substr(0, romname.rfind('.')); if (reset) { + NDS::SetConsoleType(Config::ConsoleType); NDS::Reset(); } @@ -367,7 +373,7 @@ bool LoadROM(QStringList filepath, bool reset) } bool res = NDS::LoadCart(filedata, filelen, savedata, savelen); - if (res) + if (res && reset) { if (Config::DirectBoot || NDS::NeedsDirectBoot()) { @@ -387,6 +393,30 @@ void EjectCart() FullROMPath = ""; BaseROMDir = ""; BaseROMName = ""; + BaseAssetName = ""; +} + +QString CartLabel() +{ + if (BaseROMName.empty()) + return "(none)"; + + QString ret = QString::fromStdString(BaseROMName); + + int maxlen = 32; + if (ret.length() > maxlen) + ret = ret.left(maxlen-6) + "..." + ret.right(3); + + return ret; +} + + + + +// PLACEHOLDER +QString GBACartLabel() +{ + return "(none)"; } diff --git a/src/frontend/qt_sdl/ROMLoader.h b/src/frontend/qt_sdl/ROMLoader.h index 4265b09d..b6c5b58e 100644 --- a/src/frontend/qt_sdl/ROMLoader.h +++ b/src/frontend/qt_sdl/ROMLoader.h @@ -31,6 +31,11 @@ QString VerifySetup(); bool LoadBIOS(); bool LoadROM(QStringList filepath, bool reset); void EjectCart(); +QString CartLabel(); + +bool LoadGBAROM(QStringList filepath, bool reset); +void EjectGBACart(); +QString GBACartLabel(); enum { diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 1aec415f..46702282 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -1308,7 +1308,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) menu->addSeparator(); - actCurrentCart = menu->addAction("Slot 1: princessbourf.nds"); + actCurrentCart = menu->addAction("DS slot: " + ROMLoader::CartLabel()); actCurrentCart->setEnabled(false); actInsertCart = menu->addAction("Insert cart..."); @@ -1319,7 +1319,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) menu->addSeparator(); - actCurrentGBACart = menu->addAction("Slot 2: Fartslapper Mk. II"); + actCurrentGBACart = menu->addAction("GBA slot: " + ROMLoader::GBACartLabel()); actCurrentGBACart->setEnabled(false); actInsertGBACart = menu->addAction("Insert ROM cart..."); @@ -1614,6 +1614,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) createScreenPanel(); + actEjectCart->setEnabled(false); + actEjectGBACart->setEnabled(false); + for (int i = 0; i < 9; i++) { actSaveState[i]->setEnabled(false); @@ -2149,6 +2152,9 @@ void MainWindow::onOpenFile() NDS::Start(); emuThread->emuRun(); + + actCurrentCart->setText("DS slot: " + ROMLoader::CartLabel()); + actEjectCart->setEnabled(true); } /*QString MainWindow::pickAndExtractFileFromArchive(QString archiveFileName, QByteArray *romBuffer) @@ -2333,6 +2339,9 @@ void MainWindow::onInsertCart() } emuThread->emuUnpause(); + + actCurrentCart->setText("DS slot: " + ROMLoader::CartLabel()); + actEjectCart->setEnabled(true); } void MainWindow::onEjectCart() @@ -2342,6 +2351,9 @@ void MainWindow::onEjectCart() ROMLoader::EjectCart(); emuThread->emuUnpause(); + + actCurrentCart->setText("DS slot: " + ROMLoader::CartLabel()); + actEjectCart->setEnabled(false); } void MainWindow::onSaveState()