diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj
index 49d4a8cb64..8acaf4e95b 100644
--- a/BizHawk.Emulation/BizHawk.Emulation.csproj
+++ b/BizHawk.Emulation/BizHawk.Emulation.csproj
@@ -107,6 +107,7 @@
+
diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.cs b/BizHawk.Emulation/Computers/Commodore64/C64.cs
index 4a9e2469b0..de92cbe5dd 100644
--- a/BizHawk.Emulation/Computers/Commodore64/C64.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/C64.cs
@@ -7,7 +7,7 @@ namespace BizHawk.Emulation.Computers.Commodore64
{
public partial class C64 : IEmulator
{
- private uint cyclesPerFrame;
+ private int cyclesPerFrame;
private string extension;
private byte[] inputFile;
@@ -17,7 +17,7 @@ namespace BizHawk.Emulation.Computers.Commodore64
inputFile = rom;
extension = romextension;
Init(Region.PAL);
- cyclesPerFrame = (uint)board.vic.CyclesPerFrame;
+ cyclesPerFrame = board.vic.CyclesPerFrame;
CoreComm.UsesDriveLed = true;
SetupMemoryDomains();
}
@@ -110,7 +110,7 @@ namespace BizHawk.Emulation.Computers.Commodore64
board.inputRead = false;
board.PollInput();
- for (uint count = cyclesPerFrame; count > 0; count--)
+ for (int count = cyclesPerFrame; count > 0; count--)
{
//disk.Execute();
board.Execute();
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs
index e33f40a4e1..9bfb7a408e 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs
@@ -16,7 +16,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
characterRom.InputData = ReadData;
cia1.InputAddress = ReadAddress;
- cia1.InputClock = vic.OutputPHI0;
cia1.InputCNT = user.OutputCNT1;
cia1.InputData = ReadData;
cia1.InputFlag = ReadCia1Flag;
@@ -27,7 +26,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
cia1.InputSP = user.OutputSP1;
cia2.InputAddress = ReadAddress;
- cia2.InputClock = vic.OutputPHI0;
cia2.InputCNT = user.OutputCNT2;
cia2.InputData = ReadData;
cia2.InputFlag = user.OutputFLAG2;
@@ -43,7 +41,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
cpu.InputAddress = ReadAddress;
cpu.InputAEC = vic.OutputAEC;
- cpu.InputClock = vic.OutputPHI0;
cpu.InputData = ReadData;
cpu.InputIRQ = ReadIRQ;
cpu.InputNMI = ReadNMI;
@@ -54,7 +51,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
expansion.InputAddress = ReadAddress;
expansion.InputBA = vic.OutputBA;
expansion.InputData = ReadData;
- expansion.InputDotClock = vic.OutputPixelClock;
expansion.InputHiExpansion = ReadHiExpansion;
expansion.InputHiRom = pla.OutputRomHi;
expansion.InputIRQ = ReadIRQ;
@@ -160,27 +156,68 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
int ReadData()
{
+ int addr = ReadAddress();
int data = 0xFF;
+
data &= expansion.Data;
if (pla.Basic)
+ {
+ basicRom.Precache();
data &= basicRom.Data;
+ }
if (pla.CharRom)
+ {
+ characterRom.Precache();
data &= characterRom.Data;
+ }
if (pla.GraphicsRead)
+ {
+ colorRam.Precache();
data &= colorRam.Data;
+ }
if (pla.IO)
{
- data &= cia1.Data;
- data &= cia2.Data;
- data &= sid.Data;
- data &= vic.Data;
+ if ((addr & 0x0F00) == 0x0C00)
+ {
+ cia1.Precache();
+ data &= cia1.Data;
+ }
+ if ((addr & 0x0F00) == 0x0D00)
+ {
+ cia2.Precache();
+ data &= cia2.Data;
+ }
+ if ((addr & 0x0C00) == 0x0800)
+ {
+ colorRam.Precache();
+ data &= colorRam.Data;
+ }
+ if ((addr & 0x0C00) == 0x0400)
+ {
+ sid.Precache();
+ data &= sid.Data;
+ }
+ if ((addr & 0x0C00) == 0x0000)
+ {
+ vic.Precache();
+ data &= vic.Data;
+ }
}
if (vic.BA)
+ {
+ cpu.Precache();
data &= cpu.Data;
+ }
if (pla.Kernal)
+ {
+ kernalRom.Precache();
data &= kernalRom.Data;
+ }
if (pla.CASRam)
+ {
+ memory.Precache();
data &= memory.Data;
+ }
return data;
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs
index 125f87eac1..510a62eac0 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs
@@ -8,24 +8,24 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
{
public abstract partial class C64 : IMotherboard
{
- Rom basicRom;
- Cassette cassette;
- Rom characterRom;
- Cia cia1;
- Cia cia2;
- Ram colorRam;
- Cpu cpu;
- Expansion expansion;
- Joystick joystickA;
- Joystick joystickB;
- Rom kernalRom;
- Keyboard keyboard;
- Ram memory;
- Pla pla;
- Serial serial;
- Sid sid;
- Userport user;
- Vic vic;
+ protected Rom basicRom;
+ protected Cassette cassette;
+ protected Rom characterRom;
+ protected Cia cia1;
+ protected Cia cia2;
+ protected Ram colorRam;
+ protected Cpu cpu;
+ protected Expansion expansion;
+ protected Joystick joystickA;
+ protected Joystick joystickB;
+ protected Rom kernalRom;
+ protected Keyboard keyboard;
+ protected Ram memory;
+ protected Pla pla;
+ protected Serial serial;
+ protected Sid sid;
+ protected Userport user;
+ protected Vic vic;
public C64(C64Timing timing)
{
@@ -33,6 +33,13 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
public void ExecuteFrame()
{
+ vic.Clock();
+ vic.Clock();
+ vic.Clock();
+ vic.Clock();
+ vic.Precache();
+ cpu.Clock();
+ cpu.Precache();
}
public byte PeekBasicRom(int addr)
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64NTSC.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64NTSC.cs
index 403fba09cb..fc8aaa0b03 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64NTSC.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64NTSC.cs
@@ -1,4 +1,6 @@
-using System;
+using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips;
+using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -9,7 +11,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
{
static private C64Timing timing;
- public C64NTSC() : base(timing)
+ public C64NTSC(byte[] basicRom, byte[] charRom, byte[] kernalRom) : base(timing)
{
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64PAL.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64PAL.cs
index be7beebadc..9dd0eabec7 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64PAL.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64PAL.cs
@@ -1,4 +1,6 @@
-using System;
+using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips;
+using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -11,6 +13,25 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental
public C64PAL() : base(timing)
{
+ this.basicRom = new Rom2364();
+ this.cassette = new Cassette();
+ this.characterRom = new Rom2332();
+ this.cia1 = new Cia();
+ this.cia2 = new Cia();
+ this.colorRam = new Ram2114();
+ this.cpu = new Cpu();
+ this.expansion = new Expansion();
+ this.joystickA = new Joystick();
+ this.joystickB = new Joystick();
+ this.kernalRom = new Rom2364();
+ this.keyboard = new Keyboard();
+ this.memory = new Ram4864();
+ this.pla = new Pla();
+ this.serial = new Serial();
+ this.sid = new MOS6581();
+ this.user = new Userport();
+ this.vic = new MOS6569();
+ InitializeConnections();
}
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cia.Interface.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cia.Interface.cs
index 12d1df9ec9..f9807f3312 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cia.Interface.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cia.Interface.cs
@@ -8,7 +8,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public partial class Cia
{
public Func InputAddress;
- public Func InputClock;
public Func InputCNT;
public Func InputData;
public Func InputFlag;
@@ -18,9 +17,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public Func InputReset;
public Func InputSP;
- virtual public bool CNT { get { return true; } }
- virtual public int Data { get { return 0xFF; } }
- virtual public bool IRQ { get { return true; } }
+ public bool CNT { get { return true; } }
+ public int Data { get { return 0xFF; } }
+ public bool IRQ { get { return true; } }
public bool OutputCNT() { return CNT; }
public int OutputData() { return Data; }
public bool OutputIRQ() { return IRQ; }
@@ -28,9 +27,12 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public int OutputPortA() { return PortA; }
public int OutputPortB() { return PortB; }
public bool OutputSP() { return SP; }
- virtual public bool PC { get { return true; } }
- virtual public int PortA { get { return 0xFF; } }
- virtual public int PortB { get { return 0xFF; } }
- virtual public bool SP { get { return true; } }
+ public bool PC { get { return true; } }
+ public int PortA { get { return 0xFF; } }
+ public int PortB { get { return 0xFF; } }
+ public bool SP { get { return true; } }
+
+ public void Clock() { }
+ public void Precache() { }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs
index b19fa3efd6..77cac7d028 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs
@@ -5,11 +5,10 @@ using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
{
- public partial class Cpu
+ sealed public partial class Cpu
{
public Func InputAddress;
public Func InputAEC;
- public Func InputClock;
public Func InputData;
public Func InputIRQ;
public Func InputNMI;
@@ -17,15 +16,15 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public Func InputRDY;
public Func InputReset;
- virtual public int Address { get { return 0xFFFF; } }
- virtual public int Data { get { return 0xFF; } }
+ public int Address { get { return cachedAddress; } }
+ public int Data { get { return cachedData; } }
public int OutputAddress() { return Address; }
public int OutputData() { return Data; }
public int OutputPort() { return Port; }
public bool OutputRead() { return Read; }
- virtual public int Port { get { return 0xFF; } }
- virtual public bool Read { get { return true; } }
- virtual public void Precache() { }
- virtual public void SyncState(Serializer ser) { }
+ public int Port { get { return cachedPort; } }
+ public bool Read { get { return cachedRead; } }
+ public void Precache() { }
+ public void SyncState(Serializer ser) { }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Internal.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Internal.cs
index e8cfbc0ce3..d016cf90ec 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Internal.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Internal.cs
@@ -1,11 +1,125 @@
-using System;
+using BizHawk.Emulation.CPUs.M6502;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
{
- public partial class Cpu
+ sealed public partial class Cpu
{
+ int cachedAddress;
+ int cachedData;
+ int cachedPort;
+ bool cachedRead;
+ int delayCycles;
+ int portDirection;
+ int portLatch;
+ MOS6502X processor;
+ bool resetBuffer;
+ bool resetEdge;
+ int resetPC;
+
+ public Cpu()
+ {
+ processor = new MOS6502X();
+ processor.DummyReadMemory = CoreReadMemory;
+ processor.ReadMemory = CoreReadMemory;
+ processor.WriteMemory = CoreWriteMemory;
+ resetBuffer = false;
+ resetEdge = false;
+ cachedAddress = 0xFFFF;
+ cachedData = 0xFF;
+ cachedPort = 0xFF;
+ cachedRead = true;
+ }
+
+ public void Clock()
+ {
+ bool reset = InputReset();
+ if (reset)
+ {
+ if (delayCycles > 0)
+ {
+ delayCycles--;
+ if (delayCycles == 1)
+ {
+ cachedAddress = 0xFFFC;
+ resetPC = InputData();
+ }
+ else if (delayCycles == 0)
+ {
+ cachedAddress = 0xFFFD;
+ resetPC |= InputData() << 8;
+ processor.PC = (ushort)resetPC;
+ }
+ }
+ else
+ {
+ if (!resetBuffer)
+ {
+ // perform these actions on positive edge of /reset
+ processor.Reset();
+ processor.BCD_Enabled = true;
+ processor.PC = (ushort)((CoreReadMemory(0xFFFD) << 8) | CoreReadMemory(0xFFFC));
+ }
+ else if (InputAEC())
+ {
+ processor.IRQ = !InputIRQ(); //6502 core expects inverted input
+ processor.NMI = !InputNMI(); //6502 core expects inverted input
+ processor.RDY = InputRDY();
+ processor.ExecuteOne();
+ }
+ }
+ }
+ else
+ {
+ cachedAddress = 0xFFFF;
+ cachedData = 0xFF;
+ delayCycles = 8;
+ portDirection = 0xFF;
+ portLatch = 0xFF;
+ }
+ resetBuffer = reset;
+ }
+
+ byte CoreReadMemory(ushort addr)
+ {
+ cachedAddress = addr;
+ cachedRead = true;
+ if (addr == 0x0000)
+ {
+ cachedData = portDirection;
+ }
+ else if (addr == 0x0001)
+ {
+ cachedData = InputPort() | (portDirection ^ 0xFF);
+ }
+ else
+ {
+ cachedData = InputData();
+ }
+ return (byte)(cachedData & 0xFF);
+ }
+
+ void CoreWriteMemory(ushort addr, byte val)
+ {
+ cachedAddress = addr;
+ cachedData = val;
+ if (addr == 0x0000)
+ {
+ cachedRead = true;
+ portDirection = val;
+ }
+ else if (addr == 0x0001)
+ {
+ cachedRead = true;
+ portLatch = val;
+ }
+ else
+ {
+ cachedRead = false;
+ }
+ }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Pla.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Pla.cs
index 60644dbd98..33162892db 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Pla.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Pla.cs
@@ -8,13 +8,15 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
sealed public class Pla
{
#region CACHE
- bool a12;
- bool a13;
- bool a14;
- bool a15;
- int addr;
- bool aec;
- bool ba;
+ bool[] basicStates;
+ bool[] casStates;
+ bool[] charStates;
+ bool[] grStates;
+ bool[] ioStates;
+ bool[] kernalStates;
+ bool[] romHiStates;
+ bool[] romLoStates;
+
bool cachedBasic;
bool cachedCASRam;
bool cachedCharRom;
@@ -23,48 +25,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
bool cachedKernal;
bool cachedRomHi;
bool cachedRomLo;
- bool cas;
- bool charen;
- bool exrom;
- bool game;
- bool hiram;
- bool loram;
- bool p0;
- bool p1;
- bool p2;
- bool p3;
- bool p4;
- bool p5;
- bool p6;
- bool p7;
- bool p9;
- bool p10;
- bool p11;
- bool p12;
- bool p13;
- bool p14;
- bool p15;
- bool p16;
- bool p17;
- bool p18;
- bool p19;
- bool p20;
- bool p21;
- bool p22;
- bool p23;
- bool p24;
- bool p25;
- bool p26;
- bool p27;
- bool p28;
- bool p30;
- bool p31;
- bool read;
- int vaddr;
- bool va12;
- bool va13;
- bool va14;
- bool va15;
#endregion
#region INPUTS
@@ -101,74 +61,163 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public void SyncState(Serializer ser) { }
#endregion
+ #region LOOKUP_TABLE_GENERATOR
+
+ // PLA line information is from the PDF titled "The C64 PLA Dissected"
+ // Written by Thomas 'skoe' Giesel.
+
+ void GenerateLookup()
+ {
+ bool a12;
+ bool a13;
+ bool a14;
+ bool a15;
+ bool aec;
+ bool ba;
+ bool cas;
+ bool charen;
+ bool exrom;
+ bool game;
+ bool hiram;
+ bool loram;
+ bool p0;
+ bool p1;
+ bool p2;
+ bool p3;
+ bool p4;
+ bool p5;
+ bool p6;
+ bool p7;
+ bool p9;
+ bool p10;
+ bool p11;
+ bool p12;
+ bool p13;
+ bool p14;
+ bool p15;
+ bool p16;
+ bool p17;
+ bool p18;
+ bool p19;
+ bool p20;
+ bool p21;
+ bool p22;
+ bool p23;
+ bool p24;
+ bool p25;
+ bool p26;
+ bool p27;
+ bool p28;
+ bool p30;
+ bool p31;
+ bool read;
+ bool va12;
+ bool va13;
+ bool va14;
+
+ basicStates = new bool[65536];
+ casStates = new bool[65536];
+ charStates = new bool[65536];
+ grStates = new bool[65536];
+ ioStates = new bool[65536];
+ kernalStates = new bool[65536];
+ romHiStates = new bool[65536];
+ romLoStates = new bool[65536];
+
+ for (int i = 0; i < 65536; i++)
+ {
+ aec = (i & 0x0001) != 0;
+ ba = (i & 0x0002) != 0;
+ cas = (i & 0x0004) != 0;
+ charen = (i & 0x0008) != 0;
+ exrom = (i & 0x0010) != 0;
+ game = (i & 0x0020) != 0;
+ loram = (i & 0x0040) != 0;
+ hiram = (i & 0x0080) != 0;
+ read = (i & 0x0100) != 0;
+ va12 = (i & 0x0200) != 0;
+ va13 = (i & 0x0400) != 0;
+ va14 = (i & 0x0800) != 0;
+ a12 = (i & 0x1000) != 0;
+ a13 = (i & 0x2000) != 0;
+ a14 = (i & 0x4000) != 0;
+ a15 = (i & 0x8000) != 0;
+
+ p0 = loram && hiram && a15 && !a14 && a13 && !aec && read && game;
+ p1 = hiram && a15 && a14 && a13 && !aec && read && game;
+ p2 = hiram && a15 && a14 && a13 && !aec && read && !exrom && !game;
+ p3 = hiram && !charen && a15 && a14 && !a13 && a12 && !aec && read && game;
+ p4 = loram && !charen && a15 && a14 && !a13 && a12 && !aec && read && game;
+ p5 = hiram && !charen && a15 && a14 && !a13 && a12 && !aec && read && !exrom && !game;
+ p6 = va14 && !va13 && va12 && aec && game;
+ p7 = va14 && !va13 && va12 && aec && !exrom && !game;
+ //p8 = cas && a15 && a14 && !a13 && a12 && !aec && !rd;
+ p9 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && game;
+ p10 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && !read && game;
+ p11 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && game;
+ p12 = loram && charen && a15 && a14 && !a13 && a12 && !aec && !read && game;
+ p13 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
+ p14 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && !read && !exrom && !game;
+ p15 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
+ p15 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
+ p16 = loram && charen && a15 && a14 && !a13 && a12 && !aec && !read && !exrom && !game;
+ p17 = a15 && a14 && !a13 && a12 && !aec && ba && read && exrom && !game;
+ p18 = a15 && a14 && !a13 && a12 && !aec && !read && exrom && !game;
+ p19 = loram && hiram && a15 && !a14 && !a13 && !aec && read && !exrom;
+ p20 = a15 && !a14 && !a13 && !aec && exrom && !game;
+ p21 = hiram && a15 && !a14 && a13 && !aec && read && !exrom && !game;
+ p22 = a15 && a14 && a13 && !aec && exrom && !game;
+ p23 = va13 && va12 && aec && exrom && !game;
+ p24 = !a15 && !a14 && a12 && exrom && !game;
+ p25 = !a15 && !a14 && a13 && exrom && !game;
+ p26 = !a15 && a14 && exrom && !game;
+ p27 = a15 && !a14 && a13 && exrom && !game;
+ p28 = a15 && a14 && !a13 && !a12 && exrom && !game;
+ //p29 = !cas;
+ p30 = cas;
+ p31 = !cas && a15 && a14 && !a13 && a12 && !aec && !read;
+
+ casStates[i] = (p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p9 || p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p23 || p24 || p25 || p26 || p27 || p28 || p30);
+ basicStates[i] = (!p0);
+ kernalStates[i] = (!(p1 || p2));
+ charStates[i] = (!(p3 || p4 || p5 || p6 || p7));
+ grStates[i] = (!p31);
+ ioStates[i] = (!(p9 || p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18));
+ romLoStates[i] = (!(p19 || p20));
+ romHiStates[i] = (!(p21 || p22 || p23));
+ }
+ }
+ #endregion
+
+ public Pla()
+ {
+ GenerateLookup();
+ }
+
public void Precache()
{
- // PLA line information is from the PDF titled "The C64 PLA Dissected"
- // Written by Thomas 'skoe' Giesel.
+ int stateIndex = (
+ (InputAEC() ? 0x1 : 0) |
+ (InputBA() ? 0x2 : 0) |
+ (InputCAS() ? 0x4 : 0) |
+ (InputCharen() ? 0x8 : 0) |
+ (InputExRom() ? 0x10 : 0) |
+ (InputGame() ? 0x20 : 0) |
+ (InputLoRam() ? 0x40 : 0) |
+ (InputHiRam() ? 0x80 : 0) |
+ (InputRead() ? 0x100 : 0) |
+ ((InputVA() & 0x7000) >> 3) |
+ (InputAddress() & 0xF000)
+ );
- addr = InputAddress();
- aec = InputAEC();
- ba = InputBA();
- cas = InputCAS();
- charen = InputCharen();
- exrom = InputExRom();
- game = InputGame();
- loram = InputLoRam();
- hiram = InputHiRam();
- read = InputRead();
- vaddr = InputVA();
-
- a15 = (addr & 0x08000) != 0;
- a14 = (addr & 0x04000) != 0;
- a13 = (addr & 0x02000) != 0;
- a12 = (addr & 0x01000) != 0;
- va15 = (vaddr & 0x08000) != 0;
- va14 = (vaddr & 0x04000) != 0;
- va13 = (vaddr & 0x02000) != 0;
- va12 = (vaddr & 0x01000) != 0;
-
- p0 = loram && hiram && a15 && !a14 && a13 && !aec && read && game;
- p1 = hiram && a15 && a14 && a13 && !aec && read && game;
- p2 = hiram && a15 && a14 && a13 && !aec && read && !exrom && !game;
- p3 = hiram && !charen && a15 && a14 && !a13 && a12 && !aec && read && game;
- p4 = loram && !charen && a15 && a14 && !a13 && a12 && !aec && read && game;
- p5 = hiram && !charen && a15 && a14 && !a13 && a12 && !aec && read && !exrom && !game;
- p6 = va14 && !va13 && va12 && aec && game;
- p7 = va14 && !va13 && va12 && aec && !exrom && !game;
- //p8 = cas && a15 && a14 && !a13 && a12 && !aec && !rd;
- p9 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && game;
- p10 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && !read && game;
- p11 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && game;
- p12 = loram && charen && a15 && a14 && !a13 && a12 && !aec && !read && game;
- p13 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
- p14 = hiram && charen && a15 && a14 && !a13 && a12 && !aec && !read && !exrom && !game;
- p15 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
- p15 = loram && charen && a15 && a14 && !a13 && a12 && !aec && ba && read && !exrom && !game;
- p16 = loram && charen && a15 && a14 && !a13 && a12 && !aec && !read && !exrom && !game;
- p17 = a15 && a14 && !a13 && a12 && !aec && ba && read && exrom && !game;
- p18 = a15 && a14 && !a13 && a12 && !aec && !read && exrom && !game;
- p19 = loram && hiram && a15 && !a14 && !a13 && !aec && read && !exrom;
- p20 = a15 && !a14 && !a13 && !aec && exrom && !game;
- p21 = hiram && a15 && !a14 && a13 && !aec && read && !exrom && !game;
- p22 = a15 && a14 && a13 && !aec && exrom && !game;
- p23 = va13 && va12 && aec && exrom && !game;
- p24 = !a15 && !a14 && a12 && exrom && !game;
- p25 = !a15 && !a14 && a13 && exrom && !game;
- p26 = !a15 && a14 && exrom && !game;
- p27 = a15 && !a14 && a13 && exrom && !game;
- p28 = a15 && a14 && !a13 && !a12 && exrom && !game;
- //p29 = !cas;
- p30 = cas;
- p31 = !cas && a15 && a14 && !a13 && a12 && !aec && !read;
-
- cachedCASRam = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p9 || p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p23 || p24 || p25 || p26 || p27 || p28 || p30;
- cachedBasic = !p0;
- cachedKernal = !(p1 || p2);
- cachedCharRom = !(p3 || p4 || p5 || p6 || p7);
- cachedGraphicsRead = !p31;
- cachedIO = !(p9 || p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18);
- cachedRomLo = !(p19 || p20);
- cachedRomHi = !(p21 || p22 || p23);
+ cachedBasic = basicStates[stateIndex];
+ cachedCASRam = casStates[stateIndex];
+ cachedCharRom = charStates[stateIndex];
+ cachedGraphicsRead = grStates[stateIndex];
+ cachedIO = ioStates[stateIndex];
+ cachedKernal = kernalStates[stateIndex];
+ cachedRomHi = romHiStates[stateIndex];
+ cachedRomLo = romLoStates[stateIndex];
}
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.Internal.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.Internal.cs
index 52ee01bfa4..435b322156 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.Internal.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.Internal.cs
@@ -7,5 +7,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
{
public partial class Sid
{
+ public void Clock()
+ {
+ }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs
index df383f5164..ed0807e4fb 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs
@@ -7,6 +7,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
{
public partial class Sid
{
-
+ public ISoundProvider GetSoundProvider()
+ {
+ return new NullSound();
+ }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs
index 5b5eabd53a..bd7e5a9780 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs
@@ -20,51 +20,51 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
sprites[i] = new Sprite();
}
- virtual public int Address
+ public int Address
{
get
{
- return bufferADDR;
+ return cachedADDR;
}
}
- virtual public bool AEC
+ public bool AEC
{
get
{
- return bufferAEC;
+ return cachedAEC;
}
}
- virtual public bool BA
+ public bool BA
{
get
{
- return bufferBA;
+ return cachedBA;
}
}
- virtual public bool CAS
+ public bool CAS
{
get
{
- return bufferCAS;
+ return cachedCAS;
}
}
- virtual public int Data
+ public int Data
{
get
{
- return bufferDATA;
+ return cachedDATA;
}
}
- virtual public bool IRQ
+ public bool IRQ
{
get
{
- return bufferIRQ;
+ return cachedIRQ;
}
}
@@ -98,46 +98,29 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
return IRQ;
}
- public bool OutputPHI0()
- {
- return PHI0;
- }
-
- public bool OutputPixelClock()
- {
- return PixelClock;
- }
-
public bool OutputRAS()
{
return RAS;
}
- virtual public bool PHI0
+ public bool RAS
{
get
{
- return bufferPHI0;
+ return cachedRAS;
}
}
- virtual public bool PixelClock
+ public void Precache()
{
- get
- {
- return true;
- }
+ cachedAEC = (pixelTimer >= 4);
+ cachedBA = ba;
+ cachedCAS = cas;
+ cachedDATA = data;
+ cachedIRQ = irq;
+
}
- virtual public bool RAS
- {
- get
- {
- return bufferRAS;
- }
- }
-
- virtual public void Precache() { }
- virtual public void SyncState(Serializer ser) { }
+ public void SyncState(Serializer ser) { }
}
}
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Internal.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Internal.cs
index bc8a117824..ef09b1ac14 100644
--- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Internal.cs
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Internal.cs
@@ -7,14 +7,13 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
{
public partial class Vic
{
- int bufferADDR;
- bool bufferAEC;
- bool bufferBA;
- bool bufferCAS;
- int bufferDATA;
- bool bufferIRQ;
- bool bufferPHI0;
- bool bufferRAS;
+ int cachedADDR;
+ bool cachedAEC;
+ bool cachedBA;
+ bool cachedCAS;
+ int cachedDATA;
+ bool cachedIRQ;
+ bool cachedRAS;
class Sprite
{
@@ -30,15 +29,19 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
public int Y;
}
+ bool ba;
int[] backgroundColor;
bool bitmapMode;
int borderColor;
+ bool cas;
int characterBitmap;
bool columnSelect;
+ int data;
bool dataCollisionInterrupt;
bool displayEnable;
bool extraColorMode;
byte interruptEnableRegister;
+ bool irq;
bool lightPenInterrupt;
int lightPenX;
int lightPenY;
@@ -64,25 +67,20 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
int videoCounterBase;
int videoMatrixLineIndex;
- public void Execute()
+ public void Clock()
{
if (pixelTimer == 0)
{
- bufferPHI0 = !bufferPHI0;
pixelTimer = 8;
-
badLineEnable |= (rasterY == 0x30 && displayEnable);
- if (!bufferPHI0)
- {
- badLineCondition = (
- badLineEnable &&
- rasterY >= 0x030 &&
- rasterY <= 0x0F7 &&
- (rasterY & 0x007) == yScroll
- );
- if (!idleState && badLineCondition)
- idleState = true;
- }
+ badLineCondition = (
+ badLineEnable &&
+ rasterY >= 0x030 &&
+ rasterY <= 0x0F7 &&
+ (rasterY & 0x007) == yScroll
+ );
+ if (!idleState && badLineCondition)
+ idleState = true;
}
pixelTimer--;
diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/MOS6581.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/MOS6581.cs
new file mode 100644
index 0000000000..c00548b112
--- /dev/null
+++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/MOS6581.cs
@@ -0,0 +1,12 @@
+using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips
+{
+ sealed public class MOS6581 : Sid
+ {
+ }
+}