예제 #1
0
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);
}