From 284eca0545fd6b58b7e18378fc0df74eb05f039a Mon Sep 17 00:00:00 2001 From: goyuken Date: Fri, 31 Jan 2014 22:30:25 +0000 Subject: [PATCH] GB: MBC3: correct behavior when bank value of 0 is written. thanks to sanqui for pointing this out --- libgambatte/libgambatte.vcxproj | 6 ++++++ libgambatte/src/mem/cartridge.cpp | 8 ++++++-- output/dll/libgambatte.dll | Bin 176640 -> 176640 bytes 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libgambatte/libgambatte.vcxproj b/libgambatte/libgambatte.vcxproj index d0f76416fd..d544f1fdfe 100644 --- a/libgambatte/libgambatte.vcxproj +++ b/libgambatte/libgambatte.vcxproj @@ -57,6 +57,9 @@ Windows true + + copy /y $(TargetDir)$(TargetFileName) $(ProjectDir)..\output\dll\$(TargetFileName) + @@ -76,6 +79,9 @@ true true + + copy /y $(TargetDir)$(TargetFileName) $(ProjectDir)..\output\dll\$(TargetFileName) + diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index fd4e440721..68e905f734 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -254,6 +254,7 @@ class Mbc3 : public DefaultMbc { unsigned char rambank; bool enableRam; + static unsigned adjustedRombank(unsigned bank) { return bank & 0x7F ? bank : bank | 1; } void setRambank() const { unsigned flags = enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0; @@ -266,6 +267,9 @@ class Mbc3 : public DefaultMbc { memptrs.setRambank(flags, rambank & (rambanks(memptrs) - 1)); } + // we adjust the rombank before masking with size? this seems correct, as how would the mbc + // know that high rom address outputs were not connected + void setRombank() const { memptrs.setRombank(adjustedRombank(rombank) & (rombanks(memptrs) - 1)); } public: Mbc3(MemPtrs &memptrs, Rtc *const rtc) @@ -285,7 +289,7 @@ public: break; case 1: rombank = data & 0x7F; - memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); + setRombank(); break; case 2: rambank = data; @@ -310,7 +314,7 @@ public: rambank = ss.rambank; enableRam = ss.enableRam; setRambank(); - memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); + setRombank(); } }; diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index cedb273763d00f2c19615aac91358fcb09963027..058c1e64dde6f87536efa35b6211cbab5249c4d6 100644 GIT binary patch delta 15863 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

H6k;KO$& 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 ItN7sm2TM%6egFUf