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); addr = (ushort)(addr & 0x1FFF);
if ((addr & 0x1080) == 0) if ((addr & 0x1080) == 0)
{ {
return tia.ReadMemory(addr); return tia.ReadMemory(addr, false);
} }
else if ((addr & 0x1080) == 0x0080) 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 else
{ {
@ -106,8 +123,6 @@ namespace BizHawk
public byte PeekMemory(ushort addr) 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)); byte temp = mapper.ReadMemory((ushort)(addr & 0x1FFF));
return temp; return temp;
@ -217,7 +232,7 @@ namespace BizHawk
//if (render == false) return; //if (render == false) return;
} }
public byte ReadControls1() public byte ReadControls1(bool peek)
{ {
if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback(); if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback();
byte value = 0xFF; byte value = 0xFF;
@ -227,11 +242,11 @@ namespace BizHawk
if (Controller["P1 Left"]) value &= 0xBF; if (Controller["P1 Left"]) value &= 0xBF;
if (Controller["P1 Right"]) value &= 0x7F; if (Controller["P1 Right"]) value &= 0x7F;
if (Controller["P1 Button"]) value &= 0xF7; if (Controller["P1 Button"]) value &= 0xF7;
_islag = false; if(!peek) _islag = false;
return value; return value;
} }
public byte ReadControls2() public byte ReadControls2(bool peek)
{ {
if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback(); if (CoreInputComm.InputCallback != null) CoreInputComm.InputCallback();
byte value = 0xFF; byte value = 0xFF;
@ -241,7 +256,7 @@ namespace BizHawk
if (Controller["P2 Left"]) value &= 0xBF; if (Controller["P2 Left"]) value &= 0xBF;
if (Controller["P2 Right"]) value &= 0x7F; if (Controller["P2 Right"]) value &= 0x7F;
if (Controller["P2 Button"]) value &= 0xF7; if (Controller["P2 Button"]) value &= 0xF7;
_islag = false; if (!peek) _islag = false;
return value; return value;
} }
@ -253,8 +268,9 @@ namespace BizHawk
public void SetP0Diff(bool setting) { p0difficulty = setting; } public void SetP0Diff(bool setting) { p0difficulty = setting; }
public void SetP1Diff(bool setting) { p1difficulty = 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; byte value = 0xFF;
bool select = Controller["Select"]; bool select = Controller["Select"];
@ -265,7 +281,7 @@ namespace BizHawk
if (bw) value &= 0xF7; if (bw) value &= 0xF7;
if (p0difficulty) value &= 0xBF; if (p0difficulty) value &= 0xBF;
if (p1difficulty) value &= 0x7F; if (p1difficulty) value &= 0x7F;
_islag = false; if(!peek) _islag = false;
return value; return value;
} }
} }
@ -274,6 +290,7 @@ namespace BizHawk
{ {
public Atari2600 core; public Atari2600 core;
public virtual byte ReadMemory(ushort addr) { return core.BaseReadMemory(addr); } 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 WriteMemory(ushort addr, byte value) { core.BaseWriteMemory(addr, value); }
public virtual void SyncState(Serializer ser) { } public virtual void SyncState(Serializer ser) { }
public virtual void Dispose() { } public virtual void Dispose() { }

View File

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

View File

@ -1000,7 +1000,7 @@ namespace BizHawk.Emulation.Consoles.Atari
} }
} }
public byte ReadMemory(ushort addr) public byte ReadMemory(ushort addr, bool peek)
{ {
ushort maskedAddr = (ushort)(addr & 0x000F); ushort maskedAddr = (ushort)(addr & 0x000F);
if (maskedAddr == 0x00) // CXM0P if (maskedAddr == 0x00) // CXM0P
@ -1050,11 +1050,11 @@ namespace BizHawk.Emulation.Consoles.Atari
} }
else if (maskedAddr == 0x0C) // INPT4 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 else if (maskedAddr == 0x0D) // INPT5
{ {
return (byte)((core.ReadControls2() & 0x08) != 0 ? 0x80 : 0x00); return (byte)((core.ReadControls2(peek) & 0x08) != 0 ? 0x80 : 0x00);
} }
return 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); ushort maskedAddr = (ushort)(addr & 0x000F);
Console.WriteLine("TIA read: " + maskedAddr.ToString("x")); Console.WriteLine("TIA read: " + maskedAddr.ToString("x"));
@ -370,12 +370,12 @@ namespace BizHawk.Emulation.Consoles.Atari
{ {
if (inpt4 == true) if (inpt4 == true)
{ {
inpt4 = ((core.ReadControls1() & 0x08) != 0); inpt4 = ((core.ReadControls1(peek) & 0x08) != 0);
} }
} }
else else
{ {
inpt4 = ((core.ReadControls1() & 0x08) != 0); inpt4 = ((core.ReadControls1(peek) & 0x08) != 0);
} }
return (byte)(inpt4 ? 0x80 : 0x00); return (byte)(inpt4 ? 0x80 : 0x00);