Atari 2600 - from now on, practice safe poking. Also poking is now possible on the system bus.

This commit is contained in:
adelikat 2014-05-23 00:29:31 +00:00
parent f49c4492f1
commit 424f312afa
29 changed files with 407 additions and 68 deletions

View File

@ -77,6 +77,23 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public void BasePokeMemory(ushort addr, byte value)
{
addr = (ushort)(addr & 0x1FFF);
if ((addr & 0x1080) == 0)
{
_tia.WriteMemory(addr, value);
}
else if ((addr & 0x1080) == 0x0080)
{
M6532.WriteMemory(addr, value);
}
else
{
Console.WriteLine("ROM write(?): " + addr.ToString("x"));
}
}
public byte ReadMemory(ushort addr)
{
if (addr != LastAddress)
@ -112,6 +129,11 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
CoreComm.MemoryCallbackSystem.CallWrite(addr);
}
public void PokeMemory(ushort addr, byte value)
{
_mapper.PokeMemory((ushort)(addr & 0x1FFF), value);
}
public void ExecFetch(ushort addr)
{
CoreComm.MemoryCallbackSystem.CallExecute(addr);

View File

@ -53,7 +53,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
8192,
MemoryDomain.Endian.Little,
addr => _mapper.PeekMemory((ushort) addr),
(addr, value) => { })
(addr, value) => _mapper.PokeMemory((ushort) addr, value))
};
CoreComm.CpuTraceAvailable = true;

View File

@ -31,6 +31,11 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
Core.BaseWriteMemory(addr, value);
}
public virtual void PokeMemory(ushort addr, byte value)
{
Core.BasePokeMemory(addr, value);
}
public virtual void SyncState(Serializer ser) { }
public virtual void Dispose() { }

View File

@ -67,15 +67,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8)

View File

@ -62,15 +62,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
switch (addr & 0x1840)

View File

@ -96,23 +96,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr == 0x003E)
if (!poke)
{
_hasRam = true;
_rambank1K = value;
}
else if (addr == 0x003F)
{
_hasRam = false;
if ((value << 11) < Core.Rom.Length)
if (addr == 0x003E)
{
_lowbank2K = value;
_hasRam = true;
_rambank1K = value;
}
else
else if (addr == 0x003F)
{
_lowbank2K = value & (Core.Rom.Length >> 11);
_hasRam = false;
if ((value << 11) < Core.Rom.Length)
{
_lowbank2K = value;
}
else
{
_lowbank2K = value & (Core.Rom.Length >> 11);
}
}
}
@ -129,5 +132,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_ram[(_rambank1K << 10) + (addr & 0x3FF)] = value;
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
}
}

View File

@ -62,21 +62,34 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr < 0x0040)
if (!poke)
{
if ((value << 11) < Core.Rom.Length)
if (addr < 0x0040)
{
_lowbank2K = value;
}
else
{
_lowbank2K = value & (Core.Rom.Length >> 11);
if ((value << 11) < Core.Rom.Length)
{
_lowbank2K = value;
}
else
{
_lowbank2K = value & (Core.Rom.Length >> 11);
}
}
}
base.WriteMemory(addr, value);
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
}
}

View File

@ -192,12 +192,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr < 0x1000) // Hotspots below 0x1000
{
base.WriteMemory(addr, value);
CheckBankSwitch(addr, value);
if (!poke)
{
CheckBankSwitch(addr, value);
}
}
else if (addr < 0x1800) // 2K region at 0x1000 - 0x17ff
{
@ -220,7 +223,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_ram[(addr & 0xff) + _sliceHigh] = value;
}
}
else if (addr < 0x2000) // 256B region at 0x1f00 - 0x1fff
else if (addr < 0x2000 && !poke) // 256B region at 0x1f00 - 0x1fff
{
if (((_lastData & 0xe0) == 0x60) &&
((_lastAddress >= 0x1000) || (_lastAddress < 0x200)))
@ -230,8 +233,21 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
_lastData = value;
_lastAddress = (ushort)(addr & 0x1fff);
if (!poke)
{
_lastData = value;
_lastAddress = (ushort)(addr & 0x1fff);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void CheckBankSwitch(ushort address, byte value)

View File

@ -38,6 +38,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
// TODO: can we set the defaults instead of do it in the constructor?
// TODO: fastscbios setting
// TODO: var names, savestates, hard reset, dispose, cart ram
// TOOD: pokeMem
public mAR(Atari2600 core)
{
// TODO: clean this stuff up

View File

@ -176,6 +176,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
*/
internal class mCM : MapperBase
{
// TODO: PokeMem
private ByteBuffer _ram = new ByteBuffer(2048);
private int _bank4K = 3; // On Start up, controller port is all 1's, so start on the last bank, flags enabled
private bool _disableRam = true;

View File

@ -73,7 +73,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMemory(addr);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr < 0x1000)
{
@ -84,5 +84,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_ram[(addr & 0x3FF)] = value;
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
}
}

View File

@ -406,7 +406,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr < 0x1000)
{
@ -414,8 +414,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return;
}
Address(addr);
ClockRandomNumberGenerator();
if (poke)
{
return;
}
if (addr >= 0x1040 && addr < 0x1080)
{
@ -463,7 +465,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (index >= 5)
{
_musicModes[index - 5] = (value & 0x10) > 0;
// NOTE: We are not handling the clock source input for
// the music mode data fetchers. We're going to assume
// they always use the OSC input.
@ -479,6 +481,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8)

View File

@ -11,6 +11,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
*/
internal class mDPCPlus : MapperBase
{
// TODO: PokeMem, and everything else
public mDPCPlus()
{
throw new NotImplementedException();

View File

@ -85,15 +85,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
switch (addr)

View File

@ -129,9 +129,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
@ -146,6 +150,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
_enableRam0 = false;

View File

@ -53,15 +53,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FE0) _toggle = 0;

View File

@ -77,9 +77,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
@ -91,6 +94,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FE0) _bank4k = 0;

View File

@ -61,19 +61,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
else if (addr == 0x1ff0)
else if (addr == 0x1ff0 && !poke)
{
Increment();
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Increment()
{
_bank++;

View File

@ -51,15 +51,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF4) _toggle = 0;

View File

@ -76,9 +76,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
@ -89,6 +93,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF4) _bank4k = 0;

View File

@ -52,15 +52,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF6) _toggle = 0;

View File

@ -76,9 +76,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
@ -90,6 +93,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF6) _bank4k = 0;

View File

@ -60,15 +60,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8)

View File

@ -63,9 +63,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
@ -77,6 +80,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);

View File

@ -74,9 +74,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
@ -87,6 +91,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8) _toggle = 0;

View File

@ -78,9 +78,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
@ -91,6 +95,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x1FF5) _bank4k = 0;

View File

@ -50,15 +50,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
var temp = addr & (0x17FF + (Core.Rom.Length >> 12));

View File

@ -53,15 +53,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if (addr == 0x0220)

View File

@ -74,15 +74,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void WriteMemory(ushort addr, byte value)
private void WriteMem(ushort addr, byte value, bool poke)
{
Address(addr);
if (!poke)
{
Address(addr);
}
if (addr < 0x1000)
{
base.WriteMemory(addr, value);
}
}
public override void WriteMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: false);
}
public override void PokeMemory(ushort addr, byte value)
{
WriteMem(addr, value, poke: true);
}
private void Address(ushort addr)
{
if ((addr & 0x180F) == 0x080D)