2012-11-28 03:30:59 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace BizHawk.Emulation.Computers.Commodore64.Cartridges
|
|
|
|
|
{
|
|
|
|
|
public class Mapper0000 : Cartridge
|
|
|
|
|
{
|
|
|
|
|
private byte[] romA;
|
2012-11-30 01:56:14 +00:00
|
|
|
|
private uint romAMask;
|
2012-11-28 03:30:59 +00:00
|
|
|
|
private byte[] romB;
|
2012-11-30 01:56:14 +00:00
|
|
|
|
private uint romBMask;
|
2012-11-28 03:30:59 +00:00
|
|
|
|
|
2012-11-29 16:33:04 +00:00
|
|
|
|
// standard cartridge mapper (Commodore)
|
2012-11-29 17:58:35 +00:00
|
|
|
|
// note that this format also covers Ultimax carts
|
2012-11-29 16:33:04 +00:00
|
|
|
|
|
2012-11-29 17:58:35 +00:00
|
|
|
|
public Mapper0000(List<uint> newAddresses, List<uint> newBanks, List<byte[]> newData, bool game, bool exrom)
|
2012-11-28 03:30:59 +00:00
|
|
|
|
{
|
|
|
|
|
pinGame = game;
|
|
|
|
|
pinExRom = exrom;
|
|
|
|
|
|
2012-11-29 16:33:04 +00:00
|
|
|
|
validCartridge = true;
|
2012-11-30 21:12:23 +00:00
|
|
|
|
|
|
|
|
|
// default to empty banks
|
|
|
|
|
romA = new byte[1];
|
|
|
|
|
romB = new byte[1];
|
|
|
|
|
romA[0] = 0xFF;
|
|
|
|
|
romB[0] = 0xFF;
|
2012-11-28 03:30:59 +00:00
|
|
|
|
|
2012-11-29 17:58:35 +00:00
|
|
|
|
for (int i = 0; i < newAddresses.Count; i++)
|
2012-11-29 16:33:04 +00:00
|
|
|
|
{
|
2012-11-29 17:58:35 +00:00
|
|
|
|
if (newAddresses[i] == 0x8000)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
switch (newData[i].Length)
|
2012-11-29 17:58:35 +00:00
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
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;
|
2012-11-29 17:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (newAddresses[i] == 0xA000 || newAddresses[i] == 0xE000)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
switch (newData[i].Length)
|
2012-11-29 17:58:35 +00:00
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
case 0x1000:
|
|
|
|
|
romBMask = 0x0FFF;
|
|
|
|
|
break;
|
|
|
|
|
case 0x2000:
|
|
|
|
|
romBMask = 0x1FFF;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
validCartridge = false;
|
|
|
|
|
return;
|
2012-11-29 17:58:35 +00:00
|
|
|
|
}
|
2012-11-30 01:56:14 +00:00
|
|
|
|
romB = newData[i];
|
2012-11-29 17:58:35 +00:00
|
|
|
|
}
|
2012-11-29 16:33:04 +00:00
|
|
|
|
}
|
2012-11-28 03:30:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override byte Peek8000(int addr)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
return romA[addr & romAMask];
|
2012-11-28 03:30:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override byte PeekA000(int addr)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
return romB[addr & romBMask];
|
2012-11-28 03:30:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override byte Read8000(ushort addr)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
return romA[addr & romAMask];
|
2012-11-28 03:30:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override byte ReadA000(ushort addr)
|
|
|
|
|
{
|
2012-11-30 01:56:14 +00:00
|
|
|
|
return romB[addr & romBMask];
|
2012-11-28 03:30:59 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|