commodore64: properly implement mirroring in cartridge mapper 0000

This commit is contained in:
saxxonpike 2012-11-30 01:56:14 +00:00
parent 20d9e726d2
commit f23e777032
2 changed files with 39 additions and 27 deletions

View File

@ -91,6 +91,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.Cartridges
default:
throw new Exception("This cartridge file uses an unrecognized mapper: " + mapper);
}
result.HardReset();
}
}

View File

@ -8,7 +8,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Cartridges
public class Mapper0000 : Cartridge
{
private byte[] romA;
private uint romAMask;
private byte[] romB;
private uint romBMask;
// standard cartridge mapper (Commodore)
// note that this format also covers Ultimax carts
@ -18,64 +20,73 @@ namespace BizHawk.Emulation.Computers.Commodore64.Cartridges
pinGame = game;
pinExRom = exrom;
romA = new byte[0x2000];
romB = new byte[0x2000];
validCartridge = true;
for (int i = 0; i < newAddresses.Count; i++)
{
if (newAddresses[i] == 0x8000)
{
if (newData[i].Length < 0x2000)
switch (newData[i].Length)
{
Array.Copy(newData[i], 0x0000, romA, 0x0000, 0x1000);
Array.Copy(newData[i], 0x0000, romA, 0x1000, 0x1000);
}
else if (newData[i].Length < 0x4000)
{
romA = newData[i];
}
else
{
Array.Copy(newData[i], 0x0000, romA, 0x0000, 0x2000);
Array.Copy(newData[i], 0x2000, romB, 0x0000, 0x2000);
case 0x1000:
romAMask = 0x0FFF;
romA = newData[i];
break;
case 0x2000:
romAMask = 0x1FFF;
romA = newData[i];
break;
case 0x4000:
romAMask = 0x1FFF;
romBMask = 0x1FFF;
// split the rom into two banks
romA = new byte[0x2000];
romB = new byte[0x2000];
Array.Copy(newData[i], 0x0000, romA, 0x0000, 0x2000);
Array.Copy(newData[i], 0x2000, romB, 0x0000, 0x2000);
break;
default:
validCartridge = false;
return;
}
}
else if (newAddresses[i] == 0xA000 || newAddresses[i] == 0xE000)
{
if (newData[i].Length < 0x2000)
switch (newData[i].Length)
{
Array.Copy(newData[i], 0x0000, romB, 0x0000, 0x1000);
Array.Copy(newData[i], 0x0000, romB, 0x1000, 0x1000);
}
else
{
romB = newData[i];
case 0x1000:
romBMask = 0x0FFF;
break;
case 0x2000:
romBMask = 0x1FFF;
break;
default:
validCartridge = false;
return;
}
romB = newData[i];
}
}
HardReset();
}
public override byte Peek8000(int addr)
{
return romA[addr];
return romA[addr & romAMask];
}
public override byte PeekA000(int addr)
{
return romB[addr];
return romB[addr & romBMask];
}
public override byte Read8000(ushort addr)
{
return romA[addr];
return romA[addr & romAMask];
}
public override byte ReadA000(ushort addr)
{
return romB[addr];
return romB[addr & romBMask];
}
}
}