fix 2600 Peek support, as best I can tell how.

This commit is contained in:
zeromus 2012-11-02 19:35:13 +00:00
parent aa161d8910
commit 24d3bb76e2
4 changed files with 37 additions and 20 deletions

View File

@ -63,11 +63,28 @@ namespace BizHawk
addr = (ushort)(addr & 0x1FFF);
if ((addr & 0x1080) == 0)
{
return tia.ReadMemory(addr);
return tia.ReadMemory(addr, false);
}
else if ((addr & 0x1080) == 0x0080)
{
return m6532.ReadMemory(addr);
return m6532.ReadMemory(addr, false);
}
else
{
return rom[addr & 0x0FFF];
}
}
public byte BasePeekMemory(ushort addr)
{
addr = (ushort)(addr & 0x1FFF);
if ((addr & 0x1080) == 0)
{
return tia.ReadMemory(addr, true);
}
else if ((addr & 0x1080) == 0x0080)
{
return m6532.ReadMemory(addr, true);
}
else
{
@ -106,8 +123,6 @@ namespace BizHawk
public byte PeekMemory(ushort addr)
{
//TODO - this is dangerous, because at least, the lag flag can get set by a read
byte temp = mapper.ReadMemory((ushort)(addr & 0x1FFF));
return temp;
@ -217,7 +232,7 @@ namespace BizHawk
//if (render == false) return;
}
public byte ReadControls1()
public byte ReadControls1(bool peek)
{
if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback();
byte value = 0xFF;
@ -227,11 +242,11 @@ namespace BizHawk
if (Controller["P1 Left"]) value &= 0xBF;
if (Controller["P1 Right"]) value &= 0x7F;
if (Controller["P1 Button"]) value &= 0xF7;
_islag = false;
if(!peek) _islag = false;
return value;
}
public byte ReadControls2()
public byte ReadControls2(bool peek)
{
if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback();
byte value = 0xFF;
@ -241,7 +256,7 @@ namespace BizHawk
if (Controller["P2 Left"]) value &= 0xBF;
if (Controller["P2 Right"]) value &= 0x7F;
if (Controller["P2 Button"]) value &= 0xF7;
_islag = false;
if (!peek) _islag = false;
return value;
}
@ -253,8 +268,9 @@ namespace BizHawk
public void SetP0Diff(bool setting) { p0difficulty = setting; }
public void SetP1Diff(bool setting) { p1difficulty = setting; }
public byte ReadConsoleSwitches()
public byte ReadConsoleSwitches(bool peek)
{
//TODO - zeromus isnt sure this should clear the lag flag
byte value = 0xFF;
bool select = Controller["Select"];
@ -265,7 +281,7 @@ namespace BizHawk
if (bw) value &= 0xF7;
if (p0difficulty) value &= 0xBF;
if (p1difficulty) value &= 0x7F;
_islag = false;
if(!peek) _islag = false;
return value;
}
}
@ -274,6 +290,7 @@ namespace BizHawk
{
public Atari2600 core;
public virtual byte ReadMemory(ushort addr) { return core.BaseReadMemory(addr); }
public virtual byte PeekMemory(ushort addr) { return core.BasePeekMemory(addr); }
public virtual void WriteMemory(ushort addr, byte value) { core.BaseWriteMemory(addr, value); }
public virtual void SyncState(Serializer ser) { }
public virtual void Dispose() { }

View File

@ -65,7 +65,7 @@ namespace BizHawk.Emulation.Consoles.Atari
timer.prescalerCount = 1 << timer.prescalerShift;
}
public byte ReadMemory(ushort addr)
public byte ReadMemory(ushort addr, bool peek)
{
// Register Select (?)
bool RS = (addr & 0x0200) != 0;
@ -83,7 +83,7 @@ namespace BizHawk.Emulation.Consoles.Atari
{
// Read Output reg A
// Combine readings from player 1 and player 2
byte temp = (byte)(core.ReadControls1() & 0xF0 | ((core.ReadControls2() >> 4) & 0x0F));
byte temp = (byte)(core.ReadControls1(peek) & 0xF0 | ((core.ReadControls2(peek) >> 4) & 0x0F));
temp = (byte)(temp & ~ddra);
return temp;
}
@ -95,7 +95,7 @@ namespace BizHawk.Emulation.Consoles.Atari
else if (registerAddr == 0x02)
{
// Read Output reg B
byte temp = core.ReadConsoleSwitches();
byte temp = core.ReadConsoleSwitches(peek);
temp = (byte)(temp & ~ddrb);
return temp;

View File

@ -999,8 +999,8 @@ namespace BizHawk.Emulation.Consoles.Atari
}
}
}
public byte ReadMemory(ushort addr)
public byte ReadMemory(ushort addr, bool peek)
{
ushort maskedAddr = (ushort)(addr & 0x000F);
if (maskedAddr == 0x00) // CXM0P
@ -1050,11 +1050,11 @@ namespace BizHawk.Emulation.Consoles.Atari
}
else if (maskedAddr == 0x0C) // INPT4
{
return (byte)((core.ReadControls1() & 0x08) != 0 ? 0x80 : 0x00);
return (byte)((core.ReadControls1(peek) & 0x08) != 0 ? 0x80 : 0x00);
}
else if (maskedAddr == 0x0D) // INPT5
{
return (byte)((core.ReadControls2() & 0x08) != 0 ? 0x80 : 0x00);
return (byte)((core.ReadControls2(peek) & 0x08) != 0 ? 0x80 : 0x00);
}
return 0x00;

View File

@ -352,7 +352,7 @@ namespace BizHawk.Emulation.Consoles.Atari
}
}
public byte ReadMemory(ushort addr)
public byte ReadMemory(ushort addr, bool peek)
{
ushort maskedAddr = (ushort)(addr & 0x000F);
Console.WriteLine("TIA read: " + maskedAddr.ToString("x"));
@ -370,12 +370,12 @@ namespace BizHawk.Emulation.Consoles.Atari
{
if (inpt4 == true)
{
inpt4 = ((core.ReadControls1() & 0x08) != 0);
inpt4 = ((core.ReadControls1(peek) & 0x08) != 0);
}
}
else
{
inpt4 = ((core.ReadControls1() & 0x08) != 0);
inpt4 = ((core.ReadControls1(peek) & 0x08) != 0);
}
return (byte)(inpt4 ? 0x80 : 0x00);