BizHawk/BizHawk.Emulation.Cores/Consoles/Atari/2600/Mappers/mMC.cs

70 lines
2.4 KiB
C#

using System;
namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
/*
MC (Megacart)
-----
This is the mapper for the "Chris Wilkson's Megacart".
Only four addresses are used to bankswitch on this one.
Up to 128K of ROM and 64K of RAM can be accessed.
1000-13FF is selected by address 3C
1400-17FF is selected by address 3D
1800-1BFF is selected by address 3E
1C00-1FFF is selected by address 3F
The value written determines what will be selected:
00-7F written will select one of the 128 1K ROM banks
80-FF written will select one of the 128 512 byte RAM banks
When a RAM bank is selected, the lower 512 bytes is the write port, while
the upper 512 bytes is the read port.
On accessing address FFFC or FFFD, the last 1K bank points to the last bank in ROM,
to allow for system initialization. Jumping out of the last bank disables this.
It's debatable how easy this system would be to implement on a real system.
Detecting when to disable the last bank fixing is difficult. The documentation
says:
"
Megacart Specification, Rev1.1
(c) 1997 Chris Wilkson
cwilkson@mit.edu
Because the console's memory is randomized at powerup, there is no way to
predict the data initially contained in the "hot addresses". Therefore,
hardware will force slot 3 to always point to ROM block $FF immediately
after any read or write to the RESET vector at $FFFC-$FFFD. Block $FF
must contain code to initialize the 4 memory slots to point to the desired
physical memory blocks before any other code can be executed. After program
execution jumps out of the boot code, the hardware will release slot 3 and
it will function just like any other slot.
"
Unfortunately, there's not an easy way to detect this. Just watching the address
bus won't work easily: Writing anywhere outside the bank 1C00-1FFF (i.e. bank
registers, RAM, TIA registers) will cause the switching to revert bank 3, crashing
the system.
The only way I can see it working is to disregard any access to addresses 3C-3F.
Emulators have it easier: they can simply watch the program counter, vs. the
address bus. An actual system doesn't have that luxury, unfortunately, so it must
disregard accesses to 3C-3F instead.
*/
internal class mMC : MapperBase
{
public mMC()
{
throw new NotImplementedException();
}
}
}