GB: MBC3: correct behavior when bank value of 0 is written. thanks to sanqui for pointing this out

This commit is contained in:
goyuken 2014-01-31 22:30:25 +00:00
parent 33c104d418
commit 284eca0545
3 changed files with 12 additions and 2 deletions

View File

@ -57,6 +57,9 @@
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
<PostBuildEvent>
<Command>copy /y $(TargetDir)$(TargetFileName) $(ProjectDir)..\output\dll\$(TargetFileName)</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
@ -76,6 +79,9 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<PostBuildEvent>
<Command>copy /y $(TargetDir)$(TargetFileName) $(ProjectDir)..\output\dll\$(TargetFileName)</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="include\gambatte.h" /> <ClInclude Include="include\gambatte.h" />

View File

@ -254,6 +254,7 @@ class Mbc3 : public DefaultMbc {
unsigned char rambank; unsigned char rambank;
bool enableRam; bool enableRam;
static unsigned adjustedRombank(unsigned bank) { return bank & 0x7F ? bank : bank | 1; }
void setRambank() const { void setRambank() const {
unsigned flags = enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0; 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)); 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: public:
Mbc3(MemPtrs &memptrs, Rtc *const rtc) Mbc3(MemPtrs &memptrs, Rtc *const rtc)
@ -285,7 +289,7 @@ public:
break; break;
case 1: case 1:
rombank = data & 0x7F; rombank = data & 0x7F;
memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); setRombank();
break; break;
case 2: case 2:
rambank = data; rambank = data;
@ -310,7 +314,7 @@ public:
rambank = ss.rambank; rambank = ss.rambank;
enableRam = ss.enableRam; enableRam = ss.enableRam;
setRambank(); setRambank();
memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); setRombank();
} }
}; };

Binary file not shown.