Commodore64: More progress on experimental framework plus a small speedup in the current framework.
This commit is contained in:
parent
e6c55f318d
commit
84a0179583
|
@ -107,6 +107,7 @@
|
|||
<Compile Include="Computers\Commodore64\Experimental\Chips\Internals\Sid.SoundProvider.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\Chips\Internals\Userport.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\Chips\Internals\Vic.VideoProvider.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\Chips\MOS6581.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\IMotherboard.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\Chips\Internals\Cpu.Interface.cs" />
|
||||
<Compile Include="Computers\Commodore64\Experimental\Chips\Internals\Cpu.Internal.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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
|
|||
public partial class Cia
|
||||
{
|
||||
public Func<int> InputAddress;
|
||||
public Func<bool> InputClock;
|
||||
public Func<bool> InputCNT;
|
||||
public Func<int> InputData;
|
||||
public Func<bool> InputFlag;
|
||||
|
@ -18,9 +17,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
|
|||
public Func<bool> InputReset;
|
||||
public Func<bool> 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() { }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<int> InputAddress;
|
||||
public Func<bool> InputAEC;
|
||||
public Func<bool> InputClock;
|
||||
public Func<int> InputData;
|
||||
public Func<bool> InputIRQ;
|
||||
public Func<bool> InputNMI;
|
||||
|
@ -17,15 +16,15 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
|
|||
public Func<bool> InputRDY;
|
||||
public Func<bool> 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) { }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,5 +7,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
|
|||
{
|
||||
public partial class Sid
|
||||
{
|
||||
public void Clock()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
|
|||
{
|
||||
public partial class Sid
|
||||
{
|
||||
|
||||
public ISoundProvider GetSoundProvider()
|
||||
{
|
||||
return new NullSound();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) { }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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--;
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue