From cadd21508fc0f9639278a8fcb48ea4bbea8988fe Mon Sep 17 00:00:00 2001 From: David Korth Date: Thu, 12 Nov 2020 20:33:31 -0500 Subject: [PATCH] gamecart: Use the chip ID to determine the ROM size. Some development carts have an incorrect ROM header, but the cart ID is always correct, so prefer the chip ID. If the chip ID is invalid (unlikely), then fall back to the ROM header. --- arm9/source/gamecart/gamecart.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/arm9/source/gamecart/gamecart.c b/arm9/source/gamecart/gamecart.c index f032c19..2cad680 100644 --- a/arm9/source/gamecart/gamecart.c +++ b/arm9/source/gamecart/gamecart.c @@ -66,6 +66,23 @@ u32 InitCartRead(CartData* cdata) { Cart_Init(); cdata->cart_id = Cart_GetID(); cdata->cart_type = (cdata->cart_id & 0x10000000) ? CART_CTR : CART_NTR; + + // Use the cart ID to determine the ROM size. + // (ROM header might be incorrect on dev carts.) + switch ((cdata->cart_id >> 16) & 0xFF) { + case 0x07: cdata->cart_size = 8ULL*1024*1024; break; + case 0x0F: cdata->cart_size = 16ULL*1024*1024; break; + case 0x1F: cdata->cart_size = 32ULL*1024*1024; break; + case 0x3F: cdata->cart_size = 64ULL*1024*1024; break; + case 0x7F: cdata->cart_size = 128ULL*1024*1024; break; + case 0xFF: cdata->cart_size = 256ULL*1024*1024; break; + case 0xFE: cdata->cart_size = 512ULL*1024*1024; break; + case 0xFA: cdata->cart_size = 1024ULL*1024*1024; break; + case 0xF8: cdata->cart_size = 2048ULL*1024*1024; break; + case 0xF0: cdata->cart_size = 4096ULL*1024*1024; break; + default: cdata->cart_size = 0; break; + } + if (cdata->cart_type & CART_CTR) { // CTR cartridges memset(cdata, 0xFF, 0x4000 + PRIV_HDR_SIZE); // switch the padding to 0xFF @@ -85,7 +102,8 @@ u32 InitCartRead(CartData* cdata) { NcchHeader* ncch = (NcchHeader*) (void*) ncch_header; if ((ValidateNcsdHeader(ncsd) != 0) || (ValidateNcchHeader(ncch) != 0)) return 1; - cdata->cart_size = (u64) ncsd->size * NCSD_MEDIA_UNIT; + if (cdata->cart_size == 0) + cdata->cart_size = (u64) ncsd->size * NCSD_MEDIA_UNIT; cdata->data_size = GetNcsdTrimmedSize(ncsd); if (cdata->cart_size > 0x100000000) return 1; // carts > 4GB don't exist // else if (cdata->cart_size == 0x100000000) cdata->cart_size -= 0x200; // silent 4GB fix @@ -113,7 +131,8 @@ u32 InitCartRead(CartData* cdata) { // cartridge size, trimmed size, twl presets if (nds_header->device_capacity >= 15) return 1; // too big, not valid - cdata->cart_size = (128 * 1024) << nds_header->device_capacity; + if (cdata->cart_size == 0) + cdata->cart_size = (128 * 1024) << nds_header->device_capacity; cdata->data_size = nds_header->ntr_rom_size; cdata->arm9i_rom_offset = 0;