Atari 2600 - implement TIA, PIA, and System Bus domains (note that there is no poke ability on the system bus domain at this time)

This commit is contained in:
adelikat 2013-03-11 01:46:12 +00:00
parent 47149d8f4e
commit 3e639d65ab
19 changed files with 260 additions and 40 deletions

View File

@ -21,6 +21,9 @@ namespace BizHawk
CoreComm = comm;
var domains = new List<MemoryDomain>(1);
domains.Add(new MemoryDomain("Main RAM", 128, Endian.Little, addr => ram[addr & 127], (addr, value) => ram[addr & 127] = value));
domains.Add(new MemoryDomain("TIA", 16, Endian.Little, addr => tia.ReadMemory((ushort)addr, true), (addr, value) => tia.WriteMemory((ushort)addr, value)));
domains.Add(new MemoryDomain("PIA", 1024, Endian.Little, addr => m6532.ReadMemory((ushort)addr, true), (addr, value) => m6532.WriteMemory((ushort)addr, value)));
domains.Add(new MemoryDomain("System Bus", 8192, Endian.Little, addr => mapper.PeekMemory((ushort)addr), (addr, value) => {}));
memoryDomains = domains.AsReadOnly();
CoreComm.CpuTraceAvailable = true;
this.rom = rom;

View File

@ -15,6 +15,11 @@ namespace BizHawk
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[addr & 0x7FF];
}
public override byte PeekMemory(ushort addr)
{
return ReadMemory(addr);
}
}
}
}

View File

@ -78,6 +78,39 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
return base.ReadMemory(addr);
}
public override byte PeekMemory(ushort addr)
{
if (addr < 0x1000)
{
return base.ReadMemory(addr);
}
else if (addr < 0x17FF) //Low 2k Bank
{
if (hasRam)
{
if (addr < 0x13FF)
{
return ram[(addr & 0x03FF) + (rambank_1k << 10)];
}
else
{
return ram[(addr & 0x03FF) + (rambank_1k << 10)]; //Reading from the write port triggers an unwanted write
}
}
else
{
int a = addr & 0x07FF; //2K
int bank = lowbank_2k << 11;
return core.rom[bank + a];
}
}
else if (addr < 0x2000) //High bank fixed to last 2k of ROM
{
return core.rom[(core.rom.Length - 2048) + (addr & 0x07FF)];
}
return base.ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
{
if (addr < 0x1000)

View File

@ -53,6 +53,11 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
return base.ReadMemory(addr);
}
public override byte PeekMemory(ushort addr)
{
return ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
{
if (addr < 0x0040)

View File

@ -45,6 +45,11 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
private ByteBuffer myRAM = new ByteBuffer(32768);
public override byte PeekMemory(ushort addr)
{
return base.PeekMemory(addr); //TODO
}
public override byte ReadMemory(ushort addr)
{
byte val = 0;

View File

@ -15,6 +15,11 @@ namespace BizHawk
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[addr & 0xFFF];
}
public override byte PeekMemory(ushort addr)
{
return ReadMemory(addr);
}
}
}
}

View File

@ -33,6 +33,12 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
return core.rom[(addr & 0x7FF)];
else return base.ReadMemory(addr);
}
public override byte PeekMemory(ushort addr)
{
return ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
{
if (addr < 0x1000)

View File

@ -20,6 +20,11 @@ namespace BizHawk
bool[] MusicMode = new bool[3]; //TOOD: savestates
public override byte PeekMemory(ushort addr)
{
return base.PeekMemory(addr); //TODO
}
public override byte ReadMemory(ushort addr)
{
if (addr < 0x1000)

View File

@ -31,17 +31,32 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
int toggle1 = 0;
int toggle2 = 0;
int toggle3 = 0;
public override byte ReadMemory(ushort addr)
private byte ReadMem(ushort addr, bool peek)
{
Address(addr);
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
else if (addr < 0x1400) return core.rom[toggle1 * 1024 + (addr & 0x3FF)];
else if (addr < 0x1800) return core.rom[toggle2 * 1024 + (addr & 0x3FF)];
else if (addr < 0x1C00) return core.rom[toggle3 * 1024 + (addr & 0x3FF)];
else
else
return core.rom[7 * 1024 + (addr & 0x3FF)]; //7 because final bank is always set to last
}
public override byte ReadMemory(ushort addr)
{
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -38,14 +38,18 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
ByteBuffer rambank1 = new ByteBuffer(1024);
bool EnableRam0 = false;
public override byte ReadMemory(ushort addr)
private byte ReadMem(ushort addr, bool peek)
{
if (addr < 0x1000)
{
return base.ReadMemory(addr);
}
Address(addr);
if (!peek)
{
Address(addr);
}
if (addr < 0x1800)
{
if (EnableRam0)
@ -84,6 +88,17 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
return base.ReadMemory(addr);
}
}
public override byte ReadMemory(ushort addr)
{
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -19,12 +19,27 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int toggle = 0;
public override byte ReadMemory(ushort addr)
private byte ReadMem(ushort addr, bool peek)
{
Address(addr);
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4 * 1024 + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -25,14 +25,28 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int bank = 0;
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
if (addr == 0x1FF0)
Increment();
}
if (addr < 0x1000) return base.ReadMemory(addr);
else return core.rom[bank * 4096 + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
if (addr == 0x1FF0)
Increment();
if (addr < 0x1000) return base.ReadMemory(addr);
else return core.rom[bank * 4 * 1024 + (addr & 0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
if (addr < 0x1000) base.WriteMemory(addr, value);

View File

@ -17,12 +17,27 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int toggle = 0;
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4096 + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
Address(addr);
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4 * 1024 + (addr & 0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -18,12 +18,27 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int toggle = 0;
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[(toggle << 12) + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
Address(addr);
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4 * 1024 + (addr & 0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -28,14 +28,28 @@ namespace BizHawk
class mF8 : MapperBase
{
int bank_4k = 0;
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[(bank_4k << 12) + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
Address(addr);
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[(bank_4k << 12) + (addr&0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -22,19 +22,41 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
int toggle = 0;
ByteBuffer aux_ram = new ByteBuffer(256);
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
Address(addr);
}
if (addr < 0x1000)
{
return base.ReadMemory(addr);
}
else if (addr < 0x1100)
{
return 0xFF;
}
else if (addr < 0x1200)
{
return aux_ram[addr & 0xFF];
}
else
{
return core.rom[(toggle * 4096) + (addr & 0xFFF)];
}
}
public override byte ReadMemory(ushort addr)
{
Address(addr);
if (addr < 0x1000)
return base.ReadMemory(addr);
else if (addr < 0x1100)
return 0xFF;
else if (addr < 0x1200)
return aux_ram[addr & 0xFF];
else
return core.rom[(toggle * 4 * 1024) + (addr & 0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -19,12 +19,27 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int toggle = 0;
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
{
Address(addr);
}
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4096 + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
{
Address(addr);
if (addr < 0x1000) return base.ReadMemory(addr);
return core.rom[toggle * 4 * 1024 + (addr & 0xFFF)];
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -40,9 +40,13 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
{
int rombank_2k = 0;
public override byte ReadMemory(ushort addr)
private byte ReadMem(ushort addr, bool peek)
{
Address(addr);
if (!peek)
{
Address(addr);
}
if (addr < 0x1000)
{
return base.ReadMemory(addr);
@ -52,6 +56,17 @@ namespace BizHawk.Emulation.Consoles.Atari._2600
return core.rom[(rombank_2k << 12) + (addr & 0xFFF)];
}
}
public override byte ReadMemory(ushort addr)
{
return ReadMem(addr, false);
}
public override byte PeekMemory(ushort addr)
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
{
Address(addr);

View File

@ -3030,8 +3030,6 @@ namespace BizHawk.MultiClient
Global.Sound.UpdateSilence();
}
/// <summary>
/// Update all tools that are frame dependent like Ram Search before processing
/// </summary>