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 + { + } +}