diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index 8cf168d1e6..49d4a8cb64 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -104,6 +104,9 @@ + + + diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs index 9957ebd2d9..e33f40a4e1 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.Glue.cs @@ -9,10 +9,104 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental { public void InitializeConnections() { - + basicRom.InputAddress = ReadAddress; + basicRom.InputData = ReadData; + + characterRom.InputAddress = ReadAddress; + characterRom.InputData = ReadData; + + cia1.InputAddress = ReadAddress; + cia1.InputClock = vic.OutputPHI0; + cia1.InputCNT = user.OutputCNT1; + cia1.InputData = ReadData; + cia1.InputFlag = ReadCia1Flag; + cia1.InputPortA = ReadCia1PortA; + cia1.InputPortB = ReadCia1PortB; + cia1.InputRead = cpu.OutputRead; + cia1.InputReset = ReadReset; + cia1.InputSP = user.OutputSP1; + + cia2.InputAddress = ReadAddress; + cia2.InputClock = vic.OutputPHI0; + cia2.InputCNT = user.OutputCNT2; + cia2.InputData = ReadData; + cia2.InputFlag = user.OutputFLAG2; + cia2.InputPortA = ReadCia2PortA; + cia2.InputPortB = user.OutputData; + cia2.InputRead = cpu.OutputRead; + cia2.InputReset = ReadReset; + cia2.InputSP = user.OutputSP2; + + colorRam.InputAddress = ReadAddress; + colorRam.InputData = ReadData; + colorRam.InputRead = cpu.OutputRead; + + cpu.InputAddress = ReadAddress; + cpu.InputAEC = vic.OutputAEC; + cpu.InputClock = vic.OutputPHI0; + cpu.InputData = ReadData; + cpu.InputIRQ = ReadIRQ; + cpu.InputNMI = ReadNMI; + cpu.InputPort = ReadCPUPort; + cpu.InputRDY = vic.OutputBA; + cpu.InputReset = ReadReset; + + expansion.InputAddress = ReadAddress; + expansion.InputBA = vic.OutputBA; + expansion.InputData = ReadData; + expansion.InputDotClock = vic.OutputPixelClock; + expansion.InputHiExpansion = ReadHiExpansion; + expansion.InputHiRom = pla.OutputRomHi; + expansion.InputIRQ = ReadIRQ; + expansion.InputLoExpansion = ReadLoExpansion; + expansion.InputLoRom = pla.OutputRomLo; + expansion.InputNMI = ReadNMI; + expansion.InputRead = cpu.OutputRead; + expansion.InputReset = ReadReset; + + kernalRom.InputAddress = ReadAddress; + kernalRom.InputData = ReadData; + + memory.InputAddress = ReadAddress; + memory.InputData = ReadData; + memory.InputRead = cpu.OutputRead; + + pla.InputAddress = ReadAddress; + pla.InputAEC = vic.OutputAEC; + pla.InputBA = vic.OutputBA; + pla.InputCAS = vic.OutputCAS; + pla.InputCharen = ReadCharen; + pla.InputExRom = expansion.OutputExRom; + pla.InputGame = expansion.OutputGame; + pla.InputHiRam = ReadHiRam; + pla.InputLoRam = ReadLoRam; + pla.InputRead = cpu.OutputRead; + pla.InputVA = ReadVicAddress; + + serial.InputATN = ReadSerialATN; + serial.InputClock = ReadSerialCLK; + serial.InputData = ReadSerialDTA; + serial.InputReset = ReadReset; + + sid.InputAddress = ReadAddress; + sid.InputData = ReadData; + sid.InputRead = cpu.OutputRead; + + user.InputCNT1 = cia1.OutputCNT; + user.InputCNT2 = cia2.OutputCNT; + user.InputData = cia2.OutputPortB; + user.InputPA2 = ReadUserPA2; + user.InputPC2 = cia2.OutputPC; + user.InputReset = ReadReset; + user.InputSP1 = cia1.OutputSP; + user.InputSP2 = cia2.OutputSP; + + vic.InputAddress = ReadAddress; + vic.InputData = ReadData; + vic.InputRead = cpu.OutputRead; } - public int ReadAddress() + int ReadAddress() { int addr = 0xFFFF; addr &= cpu.Address; @@ -21,7 +115,50 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental return addr; } - public int ReadData() + bool ReadCharen() + { + return (cpu.Port & 0x4) != 0; + } + + bool ReadCia1Cnt() + { + // this pin is not connected + return true; + } + + bool ReadCia1Flag() + { + return serial.SRQ && cassette.Data; + } + + int ReadCia1PortA() + { + return (joystickB.Data | 0xE0) & keyboard.Column; + } + + int ReadCia1PortB() + { + return (joystickA.Data | 0xE0) & keyboard.Row; + } + + int ReadCia2PortA() + { + int result = 0xFF; + if (!user.PA2) + result &= 0xFB; + if (!serial.Clock) + result &= 0xBF; + if (!serial.Data) + result &= 0x7F; + return result; + } + + int ReadCPUPort() + { + return 0xFF; + } + + int ReadData() { int data = 0xFF; data &= expansion.Data; @@ -33,13 +170,89 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental data &= colorRam.Data; if (pla.IO) { + data &= cia1.Data; + data &= cia2.Data; data &= sid.Data; data &= vic.Data; } - data &= cpu.Data; - data &= kernalRom.Data; - data &= memory.Data; + if (vic.BA) + data &= cpu.Data; + if (pla.Kernal) + data &= kernalRom.Data; + if (pla.CASRam) + data &= memory.Data; return data; } + + bool ReadHiExpansion() + { + int addr = ReadAddress(); + return (addr >= 0xDF00 && addr < 0xE000); + } + + bool ReadHiRam() + { + return (cpu.Port & 0x2) != 0; + } + + bool ReadIRQ() + { + return ( + cia1.IRQ && + vic.IRQ && + expansion.IRQ + ); + } + + bool ReadLoExpansion() + { + int addr = ReadAddress(); + return (addr >= 0xDE00 && addr < 0xDF00); + } + + bool ReadLoRam() + { + return (cpu.Port & 0x1) != 0; + } + + bool ReadNMI() + { + return ( + cia2.IRQ && + expansion.NMI + ); + } + + bool ReadReset() + { + return ( + expansion.Reset + ); + } + + bool ReadSerialATN() + { + return (cia2.PortA & 0x08) != 0; + } + + bool ReadSerialCLK() + { + return (cia2.PortA & 0x10) != 0; + } + + bool ReadSerialDTA() + { + return (cia2.PortA & 0x20) != 0; + } + + bool ReadUserPA2() + { + return (cia2.PortA & 0x04) != 0; + } + + int ReadVicAddress() + { + return (vic.Address | ((cia2.PortA & 0x3) << 14)); + } } } diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs index 5a7bb4f3fb..125f87eac1 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/C64.cs @@ -11,6 +11,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental Rom basicRom; Cassette cassette; Rom characterRom; + Cia cia1; + Cia cia2; Ram colorRam; Cpu cpu; Expansion expansion; @@ -22,6 +24,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental Pla pla; Serial serial; Sid sid; + Userport user; Vic vic; public C64(C64Timing timing) 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 036ac6cd85..b19fa3efd6 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Cpu.Interface.cs @@ -22,7 +22,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals 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) { } } diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Ram.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Ram.cs index 8e5fbcb4ae..d8183caf1b 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Ram.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Ram.cs @@ -7,7 +7,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals { public class Ram : Rom { - public Func InputWrite; + public Func InputRead; public Ram(int size, int addressMask, int dataMask) : base(size, addressMask, dataMask) @@ -16,7 +16,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals virtual public void Execute() { - if (InputWrite()) + if (!InputRead()) memory[InputAddress() & addressMask] = InputData() & dataMask; } } diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs new file mode 100644 index 0000000000..df383f5164 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Sid.SoundProvider.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals +{ + public partial class Sid + { + + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Userport.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Userport.cs new file mode 100644 index 0000000000..e13b9f079c --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Userport.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals +{ + public class Userport + { + public Func InputCNT1; + public Func InputCNT2; + public Func InputData; + public Func InputPA2; + public Func InputPC2; + public Func InputReset; + public Func InputSP1; + public Func InputSP2; + + virtual public bool ATN { get { return true; } } + virtual public bool CNT1 { get { return true; } } + virtual public bool CNT2 { get { return true; } } + virtual public int Data { get { return 0xFF; } } + virtual public bool FLAG2 { get { return true; } } + public bool OutputATN() { return ATN; } + public bool OutputCNT1() { return CNT1; } + public bool OutputCNT2() { return CNT2; } + public int OutputData() { return Data; } + public bool OutputFLAG2() { return FLAG2; } + public bool OutputPA2() { return PA2; } + public bool OutputReset() { return Reset; } + public bool OutputSP1() { return SP1; } + public bool OutputSP2() { return SP2; } + virtual public bool PA2 { get { return true; } } + virtual public bool Reset { get { return true; } } + virtual public bool SP1 { get { return true; } } + virtual public bool SP2 { get { return true; } } + } +} 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 7d33f80fe9..5b5eabd53a 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.Interface.cs @@ -103,6 +103,11 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals return PHI0; } + public bool OutputPixelClock() + { + return PixelClock; + } + public bool OutputRAS() { return RAS; @@ -116,6 +121,14 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals } } + virtual public bool PixelClock + { + get + { + return true; + } + } + virtual public bool RAS { get diff --git a/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.VideoProvider.cs b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.VideoProvider.cs new file mode 100644 index 0000000000..58e4da909b --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/Experimental/Chips/Internals/Vic.VideoProvider.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals +{ + public abstract partial class Vic : IVideoProvider + { + protected int[] videoBuffer; + + public int[] GetVideoBuffer() + { + throw new NotImplementedException(); + } + + public int VirtualWidth + { + get { throw new NotImplementedException(); } + } + + public int BufferWidth + { + get { throw new NotImplementedException(); } + } + + public int BufferHeight + { + get { throw new NotImplementedException(); } + } + + public int BackgroundColor + { + get { throw new NotImplementedException(); } + } + } +}