CEXIMemoryCard::CEXIMemoryCard(const int index, bool gciFolder) : card_index(index) { _assert_msg_(EXPANSIONINTERFACE, static_cast<std::size_t>(index) < s_et_cmd_done.size(), "Trying to create invalid memory card index %d.", index); // NOTE: When loading a save state, DMA completion callbacks (s_et_transfer_complete) and such // may have been restored, we need to anticipate those arriving. interruptSwitch = 0; m_bInterruptSet = 0; command = 0; status = MC_STATUS_BUSY | MC_STATUS_UNLOCKED | MC_STATUS_READY; m_uPosition = 0; memset(programming_buffer, 0, sizeof(programming_buffer)); // Nintendo Memory Card EXI IDs // 0x00000004 Memory Card 59 4Mbit // 0x00000008 Memory Card 123 8Mb // 0x00000010 Memory Card 251 16Mb // 0x00000020 Memory Card 507 32Mb // 0x00000040 Memory Card 1019 64Mb // 0x00000080 Memory Card 2043 128Mb // 0x00000510 16Mb "bigben" card // card_id = 0xc243; card_id = 0xc221; // It's a Nintendo brand memcard // The following games have issues with memory cards bigger than 16Mb // Darkened Skye GDQE6S GDQP6S // WTA Tour Tennis GWTEA4 GWTJA4 GWTPA4 // Disney Sports : Skate Boarding GDXEA4 GDXPA4 GDXJA4 // Disney Sports : Soccer GDKEA4 // Use a 16Mb (251 block) memory card for these games bool useMC251; IniFile gameIni = SConfig::GetInstance().LoadGameIni(); gameIni.GetOrCreateSection("Core")->Get("MemoryCard251", &useMC251, false); u16 sizeMb = useMC251 ? MemCard251Mb : MemCard2043Mb; if (gciFolder) { SetupGciFolder(sizeMb); } else { SetupRawMemcard(sizeMb); } memory_card_size = memorycard->GetCardId() * SIZE_TO_Mb; u8 header[20] = {0}; memorycard->Read(0, static_cast<s32>(ArraySize(header)), header); SetCardFlashID(header, card_index); }
CEXIMemoryCard::CEXIMemoryCard(const int index, bool gciFolder) : card_index(index) { struct { const char *done; const char *transfer_complete; } const event_names[] = { { "memcardDoneA", "memcardTransferCompleteA" }, { "memcardDoneB", "memcardTransferCompleteB" }, }; if ((size_t)index >= ArraySize(event_names)) { PanicAlertT("Trying to create invalid memory card index."); } // we're potentially leaking events here, since there's no RemoveEvent // until emu shutdown, but I guess it's inconsequential et_cmd_done = CoreTiming::RegisterEvent(event_names[index].done, CmdDoneCallback); et_transfer_complete = CoreTiming::RegisterEvent( event_names[index].transfer_complete, TransferCompleteCallback); interruptSwitch = 0; m_bInterruptSet = 0; command = 0; status = MC_STATUS_BUSY | MC_STATUS_UNLOCKED | MC_STATUS_READY; m_uPosition = 0; memset(programming_buffer, 0, sizeof(programming_buffer)); //Nintendo Memory Card EXI IDs //0x00000004 Memory Card 59 4Mbit //0x00000008 Memory Card 123 8Mb //0x00000010 Memory Card 251 16Mb //0x00000020 Memory Card 507 32Mb //0x00000040 Memory Card 1019 64Mb //0x00000080 Memory Card 2043 128Mb //0x00000510 16Mb "bigben" card //card_id = 0xc243; card_id = 0xc221; // It's a Nintendo brand memcard // The following games have issues with memory cards bigger than 16Mb // Darkened Skye GDQE6S GDQP6S // WTA Tour Tennis GWTEA4 GWTJA4 GWTPA4 // Disney Sports : Skate Boarding GDXEA4 GDXPA4 GDXJA4 // Disney Sports : Soccer GDKEA4 // Use a 16Mb (251 block) memory card for these games bool useMC251; IniFile gameIni = SConfig::GetInstance().LoadGameIni(); gameIni.GetOrCreateSection("Core")->Get("MemoryCard251", &useMC251, false); u16 sizeMb = useMC251 ? MemCard251Mb : MemCard2043Mb; if (gciFolder) { SetupGciFolder(sizeMb); } else { SetupRawMemcard(sizeMb); } memory_card_size = memorycard->GetCardId() * SIZE_TO_Mb; u8 header[20] = {0}; memorycard->Read(0, ArraySize(header), header); SetCardFlashID(header, card_index); }