From a401064c986f99b6a0749415709ab02d10147aee Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 9 Sep 2026 19:27:47 -0500 Subject: [PATCH] Match GameBoy MBC --- src/gb_mbc.c | 84 +++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/src/gb_mbc.c b/src/gb_mbc.c index 2a2d9c7..4ae0588 100644 --- a/src/gb_mbc.c +++ b/src/gb_mbc.c @@ -63,51 +63,47 @@ s32 osGbmbcSelectRamBank(OSPfs* pfs, u8 bank) { return ret; } -#ifdef NON_MATCHING -s32 osGbmbcReadWrite(OSPfs* pfs, u16 flag, u32 address, u8* buffer, u32 size) { - s32 ret; - s32 var_s0; - u8 status; - u8 var_s2; +s32 osGbmbcReadWrite(OSPfs* pfs, u16 flag, u32 address, u8* buffer, u32 size) { + s32 ret; + s32 var_s0; + u8 status; + u8 var_s2; - ERRCK(osGbpakGetStatus(pfs, &status)); + ERRCK(osGbpakGetStatus(pfs, &status)); - var_s2 = (address >> 0xD); - if (var_s2 != D_800AA670[pfs->channel]) { - ERRCK(osGbmbcSelectRamBank(pfs, var_s2)); - } - address &= 0x1FFF; - var_s0 = address + size; - - while (var_s0 > MBC_ROM_BANK_ADDRESS) { - var_s0 -= MBC_ROM_BANK_ADDRESS; - ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, MBC_ROM_BANK_ADDRESS - address); - if (ret != 0) { - goto end; - } - buffer = (buffer - address) + MBC_ROM_BANK_ADDRESS; - var_s2++; - ret = osGbmbcSelectRamBank(pfs, var_s2); - if (ret != 0) { - goto end; - } - size = var_s0; - address = 0; - if (0) { } - } - - ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, size); + var_s2 = address >> 0xD; + if (var_s2 != D_800AA670[pfs->channel]) { + ERRCK(osGbmbcSelectRamBank(pfs, var_s2)); + } + address &= 0x1FFF; + var_s0 = address + size; -end: - if (ret == 0) { - ret = osGbpakGetStatus(pfs, &status); - } - - if ((ret == 0) && !(status & 1)) { - ret = PFS_ERR_CONTRFAIL; - } - return ret; + while (1) { + if (var_s0 > MBC_ROM_BANK_ADDRESS) { + var_s0 -= MBC_ROM_BANK_ADDRESS; + ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, MBC_ROM_BANK_ADDRESS - address); + if (ret != 0) { + break; + } + buffer = (buffer - address) + MBC_ROM_BANK_ADDRESS; + var_s2++; + ret = osGbmbcSelectRamBank(pfs, var_s2); + if (ret != 0) { + break; + } + size = var_s0; + address = 0; + } else { + ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, size); + break; + } + } + + if (ret == 0) { + ret = osGbpakGetStatus(pfs, &status); + } + if ((ret == 0) && !(status & 1)) { + ret = PFS_ERR_CONTRFAIL; + } + return ret; } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/gb_mbc/osGbmbcReadWrite.s") -#endif