103 lines
3.1 KiB
C#
103 lines
3.1 KiB
C#
namespace EMU7800.Core
|
|
{
|
|
/// <summary>
|
|
/// Parker Brothers 8KB bankswitched carts.
|
|
/// </summary>
|
|
public sealed class CartPB8K : Cart
|
|
{
|
|
//
|
|
// Cart Format Mapping to ROM Address Space
|
|
// Segment1: 0x0000:0x0400 Bank1:0x1000:0x0400 Select Segment: 1fe0-1fe7
|
|
// Segment2: 0x0400:0x0400 Bank2:0x1400:0x0400 Select Segment: 1fe8-1ff0
|
|
// Segment3: 0x0800:0x0400 Bank3:0x1800:0x0400 Select Segment: 1ff0-1ff8
|
|
// Segment4: 0x0c00:0x0400 Bank4:0x1c00:0x0400 Always Segment8
|
|
// Segment5: 0x1000:0x0400
|
|
// Segment6: 0x1400:0x0400
|
|
// Segment7: 0x1800:0x0400
|
|
// Segment8: 0x1c00:0x0400
|
|
//
|
|
readonly ushort[] SegmentBase;
|
|
|
|
#region IDevice Members
|
|
|
|
public override void Reset()
|
|
{
|
|
SegmentBase[0] = ComputeSegmentBase(4);
|
|
SegmentBase[1] = ComputeSegmentBase(5);
|
|
SegmentBase[2] = ComputeSegmentBase(6);
|
|
}
|
|
|
|
public override byte this[ushort addr]
|
|
{
|
|
get
|
|
{
|
|
addr &= 0x0fff;
|
|
UpdateSegmentBases(addr);
|
|
return ROM[SegmentBase[addr >> 10] + (addr & 0x03ff)];
|
|
}
|
|
set
|
|
{
|
|
addr &= 0x0fff;
|
|
UpdateSegmentBases(addr);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
private CartPB8K()
|
|
{
|
|
}
|
|
|
|
public CartPB8K(byte[] romBytes)
|
|
{
|
|
LoadRom(romBytes, 0x2000);
|
|
SegmentBase = new ushort[4];
|
|
SegmentBase[0] = ComputeSegmentBase(4);
|
|
SegmentBase[1] = ComputeSegmentBase(5);
|
|
SegmentBase[2] = ComputeSegmentBase(6);
|
|
SegmentBase[3] = ComputeSegmentBase(7);
|
|
}
|
|
|
|
static ushort ComputeSegmentBase(int slice)
|
|
{
|
|
return (ushort)(slice << 10); // multiply by 1024
|
|
}
|
|
|
|
void UpdateSegmentBases(ushort addr)
|
|
{
|
|
if (addr < 0xfe0 || addr >= 0x0ff8) { }
|
|
else if (addr >= 0x0fe0 && addr < 0x0fe8)
|
|
{
|
|
SegmentBase[0] = ComputeSegmentBase(addr & 0x07);
|
|
}
|
|
else if (addr >= 0x0fe8 && addr < 0x0ff0)
|
|
{
|
|
SegmentBase[1] = ComputeSegmentBase(addr & 0x07);
|
|
}
|
|
else if (addr >= 0x0ff0 && addr < 0x0ff8)
|
|
{
|
|
SegmentBase[2] = ComputeSegmentBase(addr & 0x07);
|
|
}
|
|
}
|
|
|
|
#region Serialization Members
|
|
|
|
public CartPB8K(DeserializationContext input, MachineBase m) : base(input)
|
|
{
|
|
input.CheckVersion(1);
|
|
LoadRom(input.ReadExpectedBytes(0x2000), 0x2000);
|
|
SegmentBase = input.ReadUnsignedShorts();
|
|
}
|
|
|
|
public override void GetObjectData(SerializationContext output)
|
|
{
|
|
base.GetObjectData(output);
|
|
|
|
output.WriteVersion(1);
|
|
output.Write(ROM);
|
|
output.Write(SegmentBase);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |