-
-
Notifications
You must be signed in to change notification settings - Fork 103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add description for out of bounds MBC ram access #594
base: master
Are you sure you want to change the base?
Conversation
This is based on: - Source code of the SameBoy emulator - Dissassembling Pokemon Pinball which depends on this behavior - Mbc1 schematics - https://www.devrs.com/gb/files/mbc1.gif
Use "modulo max_ram_size" instead of "and (max_ram_size - 1)"? |
Perhaps "depends" is not the best way to phrase it, what I actually saw is that Pokemon Pinball sets the ram bank to a non zero value and since it does not have banked ram, all accesses are clipped (according to the formula). |
What point? I want to try with a 32 KiB cart. |
It depends on the way you are handling this case, originally I just ignored those out of bounds writes, (and returned 0 on reads) with this way it froze after trying to reload a save from sram (boot up -> save -> restart -> load save -> freeze). |
|
||
## MBC Out Of Bounds RAM Access | ||
|
||
On most of the MBC's in case an out of bounds address is accessed (selecting unmapped RAM bank), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any MBC on which this doesn't happen?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In MBC3, banks $08-$0C select the RTC, and in MBC7, bank $40 selects the accelerometer and EEPROM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens if you request banks $04-$07 or $0D-$0F?
I actually have everything you need to check this, I'm just lazy. 🦥
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
$04-$07 and $0D-$0F just map to "nothing", reads returning open bus and writes doing nothing. (also this is assuming MBC3, with MBC30 $04-$07 are just more RAM banks as expected)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I decided to not be lazy and tested this. $04-$07 and $0D-$0F return $FF on every address and are read-only. The high RAM bank nibble is ignored. So $4000 is effectively a 4-bit register.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The 0xFF is actually just an open bus value: 0xFF would just be a usual open bus value if you're reading from somewhere else other than the cartridge bus (e.g. WRAM within the GBC, or just HRAM in all units). It can be understood as just being the same as reading SRAM while SRAM is disabled via the 0000-1FFF register.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
$FF is a common SRAM open-bus value especially with some flashcarts, so this makes sense.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used a legitimate cartridge of Goldene Edition.
This is based on:
Since there are many types of MBC's I added that this is for most of the MBC's