diff --git a/libdragon b/libdragon index 251c8211..35267992 160000 --- a/libdragon +++ b/libdragon @@ -1 +1 @@ -Subproject commit 251c821158cfc6099baa5577680223dc9897ef57 +Subproject commit 352679922bad5403f8ea4b9123dfe0403d030bc2 diff --git a/src/flashcart/flashcart.c b/src/flashcart/flashcart.c index 08cb8d95..0571360c 100644 --- a/src/flashcart/flashcart.c +++ b/src/flashcart/flashcart.c @@ -47,45 +47,44 @@ static flashcart_t *flashcart = &((flashcart_t) { flashcart_error_t flashcart_init (void) { - bool sd_initialized; flashcart_error_t error; + // NOTE: Explicitly support only these flashcarts in this specific initialization order. + struct { + int type; + int (* libcart_init) (void); + flashcart_t *(* get) (void); + } flashcarts[CART_MAX] = { + { CART_CI, ci_init, NULL }, // 64drive + { CART_SC, sc_init, sc64_get_flashcart }, // SC64 + { CART_EDX, edx_init, NULL }, // Series X EverDrive-64 + { CART_ED, ed_init, NULL }, // Original EverDrive-64 + }; + + for (int i = 0; i < CART_MAX; i++) { + if (flashcarts[i].libcart_init() >= 0) { + cart_type = flashcarts[i].type; + if (flashcarts[i].get) { + flashcart = flashcarts[i].get(); + } + break; + } + } + + if (cart_type == CART_NULL) { + return FLASHCART_ERROR_NOT_DETECTED; + } + #ifndef NDEBUG // NOTE: Some flashcarts doesn't have USB port, can't throw error here debug_init_usblog(); #endif - // HACK: Because libcart reads PI config from address 0x10000000 when initializing - // we need to write safe value before running any libcart function. - // Data in SDRAM can be undefined on some flashcarts at this point - // and might result in setting incorrect PI config. - extern uint32_t cart_dom1; - cart_dom1 = 0x80371240; - - sd_initialized = debug_init_sdfs("sd:/", -1); - - // NOTE: Flashcart model is extracted from libcart after debug_init_sdfs call is made - extern int cart_type; - - switch (cart_type) { - case CART_CI: // 64drive - case CART_ED: // Original EverDrive-64 - case CART_EDX: // Series X EverDrive-64 - break; - - case CART_SC: // SC64 - flashcart = sc64_get_flashcart(); - break; - - default: - return FLASHCART_ERROR_NOT_DETECTED; - } - if ((error = flashcart->init()) != FLASHCART_OK) { return error; } - if (!sd_initialized) { + if (!debug_init_sdfs("sd:/", -1)) { return FLASHCART_ERROR_SD_CARD; } @@ -106,15 +105,9 @@ flashcart_error_t flashcart_load_rom (char *rom_path, bool byte_swap, flashcart_ return FLASHCART_ERROR_ARGS; } - if (cart_card_byteswap(byte_swap)) { - return FLASHCART_ERROR_INT; - } - + cart_card_byteswap = byte_swap; error = flashcart->load_rom(rom_path, progress); - - if (cart_card_byteswap(false)) { - return FLASHCART_ERROR_INT; - } + cart_card_byteswap = false; return error; }