Cleanup namespaces in C64

This commit is contained in:
adelikat 2013-11-12 19:22:09 +00:00
parent aaf5f17df8
commit 6f2bd4eca3
89 changed files with 3466 additions and 3486 deletions

View File

@ -12,7 +12,7 @@ using BizHawk.Common;
using BizHawk.Client.Common;
using BizHawk.Emulation;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Computers.Commodore64;
using BizHawk.Emulation.Cores.Computers.Commodore64;
using BizHawk.Emulation.Cores.Calculator;
using BizHawk.Emulation.Consoles.Coleco;
using BizHawk.Emulation.Consoles.GB;

View File

@ -2,12 +2,8 @@
using System.Collections.Generic;
using System.IO;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Computers.Commodore64.Cartridge;
using BizHawk.Emulation.Computers.Commodore64.Disk;
using BizHawk.Emulation.Computers.Commodore64.MOS;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public enum Region
{

View File

@ -1,6 +1,4 @@
using BizHawk.Emulation.Computers.Commodore64.MOS;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Motherboard
{
@ -28,48 +26,48 @@ namespace BizHawk.Emulation.Computers.Commodore64
static private byte[] inputBitMask = new byte[] { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F };
static private byte[] inputBitSelect = new byte[] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
byte cia0InputLatchA;
byte cia0InputLatchB;
int pollIndex;
byte cia0InputLatchA;
byte cia0InputLatchB;
int pollIndex;
public void PollInput()
{
// scan joysticks
pollIndex = 0;
for (int j = 0; j < 5; j++)
pollIndex = 0;
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 2; i++)
{
joystickPressed[pollIndex++] = controller[joystickMatrix[i, j]] ? -1 : 0;
for (int i = 0; i < 2; i++)
{
joystickPressed[pollIndex++] = controller[joystickMatrix[i, j]] ? -1 : 0;
}
}
// scan keyboard
pollIndex = 0;
for (int i = 0; i < 8; i++)
pollIndex = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
for (int j = 0; j < 8; j++)
{
keyboardPressed[pollIndex++] = controller[keyboardMatrix[i, j]] ? -1 : 0;
keyboardPressed[pollIndex++] = controller[keyboardMatrix[i, j]] ? -1 : 0;
}
}
}
private void WriteInputPort()
{
byte portA = cia0.PortAData;
byte portB = cia0.PortBData;
byte portA = cia0.PortAData;
byte portB = cia0.PortBData;
byte resultA = 0xFF;
byte resultB = 0xFF;
byte joyA = 0xFF;
byte joyB = 0xFF;
pollIndex = 0;
pollIndex = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (keyboardPressed[pollIndex++] != 0)
if (keyboardPressed[pollIndex++] != 0)
{
if (((portA & inputBitSelect[i]) == 0) || ((portB & inputBitSelect[j]) == 0))
{
@ -80,23 +78,23 @@ namespace BizHawk.Emulation.Computers.Commodore64
}
}
pollIndex = 0;
pollIndex = 0;
for (int i = 0; i < 5; i++)
{
if (joystickPressed[pollIndex++] != 0)
joyB &= inputBitMask[i];
if (joystickPressed[pollIndex++] != 0)
if (joystickPressed[pollIndex++] != 0)
joyB &= inputBitMask[i];
if (joystickPressed[pollIndex++] != 0)
joyA &= inputBitMask[i];
}
resultA &= joyA;
resultB &= joyB;
cia0InputLatchA = resultA;
cia0InputLatchA = resultA;
cia0InputLatchB = resultB;
// this joystick has special rules.
cia0.PortAMask = joyA;
// this joystick has special rules.
cia0.PortAMask = joyA;
}
}
}

View File

@ -1,10 +1,9 @@
using BizHawk.Emulation.Computers.Commodore64.MOS;
using System.Reflection;
using System.Reflection;
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
/// <summary>
/// Contains the onboard chipset and glue.

View File

@ -1,141 +1,139 @@
using BizHawk.Emulation.Computers.Commodore64.MOS;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Motherboard
{
bool CassPort_ReadDataOutput()
{
return (cpu.PortData & 0x08) != 0;
}
sealed public partial class Motherboard
{
bool CassPort_ReadDataOutput()
{
return (cpu.PortData & 0x08) != 0;
}
bool CassPort_ReadMotor()
{
return (cpu.PortData & 0x20) != 0;
}
bool CassPort_ReadMotor()
{
return (cpu.PortData & 0x20) != 0;
}
bool Cia0_ReadCnt()
{
return (userPort.ReadCounter1Buffer() && cia0.ReadCNTBuffer());
}
bool Cia0_ReadCnt()
{
return (userPort.ReadCounter1Buffer() && cia0.ReadCNTBuffer());
}
byte Cia0_ReadPortA()
{
return cia0InputLatchA;
}
byte Cia0_ReadPortA()
{
return cia0InputLatchA;
}
byte Cia0_ReadPortB()
{
return cia0InputLatchB;
}
byte Cia0_ReadPortB()
{
return cia0InputLatchB;
}
bool Cia0_ReadSP()
{
return (userPort.ReadSerial1Buffer() && cia0.ReadSPBuffer());
}
bool Cia0_ReadSP()
{
return (userPort.ReadSerial1Buffer() && cia0.ReadSPBuffer());
}
bool Cia1_ReadCnt()
{
return (userPort.ReadCounter2Buffer() && cia1.ReadCNTBuffer());
}
bool Cia1_ReadCnt()
{
return (userPort.ReadCounter2Buffer() && cia1.ReadCNTBuffer());
}
byte Cia1_ReadPortA()
{
// the low bits are actually the VIC memory address.
byte result = 0xFF;
if (serPort.WriteDataIn())
result &= 0x7F;
if (serPort.WriteClockIn())
result &= 0xBF;
return result;
}
byte Cia1_ReadPortA()
{
// the low bits are actually the VIC memory address.
byte result = 0xFF;
if (serPort.WriteDataIn())
result &= 0x7F;
if (serPort.WriteClockIn())
result &= 0xBF;
return result;
}
bool Cia1_ReadSP()
{
return (userPort.ReadSerial2Buffer() && cia1.ReadSPBuffer());
}
bool Cia1_ReadSP()
{
return (userPort.ReadSerial2Buffer() && cia1.ReadSPBuffer());
}
byte Cpu_ReadPort()
{
byte data = 0x1F;
if (!cassPort.ReadSenseBuffer())
data &= 0xEF;
return data;
}
byte Cpu_ReadPort()
{
byte data = 0x1F;
if (!cassPort.ReadSenseBuffer())
data &= 0xEF;
return data;
}
bool Glue_ReadIRQ()
{
return cia0.ReadIRQBuffer() & vic.ReadIRQBuffer() & cartPort.ReadIRQBuffer();
}
bool Glue_ReadIRQ()
{
return cia0.ReadIRQBuffer() & vic.ReadIRQBuffer() & cartPort.ReadIRQBuffer();
}
bool Pla_ReadCharen()
{
return (cpu.PortData & 0x04) != 0;
}
bool Pla_ReadCharen()
{
return (cpu.PortData & 0x04) != 0;
}
byte Pla_ReadCia0(int addr)
{
if (addr == 0xDC00 || addr == 0xDC01)
{
WriteInputPort();
inputRead = true;
}
return cia0.Read(addr);
}
byte Pla_ReadCia0(int addr)
{
if (addr == 0xDC00 || addr == 0xDC01)
{
WriteInputPort();
inputRead = true;
}
return cia0.Read(addr);
}
byte Pla_ReadColorRam(int addr)
{
byte result = bus;
result &= 0xF0;
result |= colorRam.Read(addr);
return result;
}
byte Pla_ReadColorRam(int addr)
{
byte result = bus;
result &= 0xF0;
result |= colorRam.Read(addr);
return result;
}
bool Pla_ReadHiRam()
{
return (cpu.PortData & 0x02) != 0;
}
bool Pla_ReadHiRam()
{
return (cpu.PortData & 0x02) != 0;
}
bool Pla_ReadLoRam()
{
return (cpu.PortData & 0x01) != 0;
}
bool Pla_ReadLoRam()
{
return (cpu.PortData & 0x01) != 0;
}
bool SerPort_ReadAtnOut()
{
return (cia1.PortBData & 0x08) == 0;
}
bool SerPort_ReadAtnOut()
{
return (cia1.PortBData & 0x08) == 0;
}
bool SerPort_ReadClockOut()
{
return (cia1.PortAData & 0x10) == 0;
}
bool SerPort_ReadClockOut()
{
return (cia1.PortAData & 0x10) == 0;
}
bool SerPort_ReadDataOut()
{
return (cia1.PortAData & 0x20) == 0;
}
bool SerPort_ReadDataOut()
{
return (cia1.PortAData & 0x20) == 0;
}
byte Sid_ReadPotX()
{
return 0;
}
byte Sid_ReadPotX()
{
return 0;
}
byte Sid_ReadPotY()
{
return 0;
}
byte Sid_ReadPotY()
{
return 0;
}
byte Vic_ReadMemory(int addr)
{
// the system sees (cia1.PortAData & 0x3) but we use a shortcut
addr |= (0x3 - (((cia1.PortALatch & cia1.PortADirection) | (~cia1.PortADirection)) & 0x3)) << 14;
return pla.VicRead(addr);
}
}
byte Vic_ReadMemory(int addr)
{
// the system sees (cia1.PortAData & 0x3) but we use a shortcut
addr |= (0x3 - (((cia1.PortALatch & cia1.PortADirection) | (~cia1.PortADirection)) & 0x3)) << 14;
return pla.VicRead(addr);
}
}
}

View File

@ -3,7 +3,7 @@
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class C64 : IEmulator
{

View File

@ -4,7 +4,7 @@ using System.IO;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class C64 : IEmulator
{
@ -118,7 +118,7 @@ namespace BizHawk.Emulation.Computers.Commodore64
// board.ram.Poke(0x0039, inputFileInfo.Data[4]);
// board.ram.Poke(0x003A, inputFileInfo.Data[5]);
//}
Media.PRG.Load(board.pla, inputFileInfo.Data);
PRG.Load(board.pla, inputFileInfo.Data);
loadPrg = false;
}
}

View File

@ -4,7 +4,7 @@ using System.IO;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// this is the base cartridge class

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class Mapper0000 : Cart
{

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class Mapper0005 : Cart
{

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// Westermann Learning mapper.
// Starts up with both banks enabled, any read to DFxx

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// This is a mapper used commonly by System 3. It is
// also utilized by the short-lived C64 Game System.

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// This mapper comes from Dinamic. It is in fact identical
// to the System 3 mapper (000F) except that bank switching is

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class Mapper0012 : Cart
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// Mapper for a few Domark and HES Australia games.
// It seems a lot of people dumping these have remapped

View File

@ -1,7 +1,7 @@
using System.Collections.Generic;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Cartridge
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// EasyFlash cartridge
// No official games came on one of these but there

View File

@ -1,6 +1,6 @@
using System;
namespace BizHawk.Emulation.Computers.Commodore64.Disk
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class VIC1541PLA
{

View File

@ -1,10 +1,9 @@
using BizHawk.Emulation.CPUs.M6502;
using BizHawk.Emulation.Computers.Commodore64.MOS;
using System;
using System;
using BizHawk.Emulation.CPUs.M6502;
#if false
namespace BizHawk.Emulation.Computers.Commodore64.Disk
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class VIC1541
{

View File

@ -3,159 +3,159 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public sealed partial class C64
{
public void InitializeConnections()
{
cia1.InputCNT = user.OutputCNT1;
cia1.InputFlag = ReadCia1Flag;
cia1.InputPortA = ReadCia1PortA;
cia1.InputPortB = ReadCia1PortB;
cia1.InputSP = user.OutputSP1;
public sealed partial class C64
{
public void InitializeConnections()
{
cia1.InputCNT = user.OutputCNT1;
cia1.InputFlag = ReadCia1Flag;
cia1.InputPortA = ReadCia1PortA;
cia1.InputPortB = ReadCia1PortB;
cia1.InputSP = user.OutputSP1;
cia2.InputCNT = user.OutputCNT2;
cia2.InputFlag = user.OutputFLAG2;
cia2.InputPortA = ReadCia2PortA;
cia2.InputPortB = user.OutputData;
cia2.InputSP = user.OutputSP2;
cia2.InputCNT = user.OutputCNT2;
cia2.InputFlag = user.OutputFLAG2;
cia2.InputPortA = ReadCia2PortA;
cia2.InputPortB = user.OutputData;
cia2.InputSP = user.OutputSP2;
cpu.InputAEC = vic.OutputAEC;
cpu.InputIRQ = ReadIRQ;
cpu.InputNMI = ReadNMI;
cpu.InputPort = ReadCPUPort;
cpu.InputRDY = vic.OutputBA;
cpu.ReadMemory = pla.ReadMemory;
cpu.WriteMemory = pla.WriteMemory;
cpu.InputAEC = vic.OutputAEC;
cpu.InputIRQ = ReadIRQ;
cpu.InputNMI = ReadNMI;
cpu.InputPort = ReadCPUPort;
cpu.InputRDY = vic.OutputBA;
cpu.ReadMemory = pla.ReadMemory;
cpu.WriteMemory = pla.WriteMemory;
//expansion.InputBA = vic.OutputBA;
//expansion.InputData = ReadData;
//expansion.InputHiExpansion = ReadHiExpansion;
//expansion.InputHiRom = pla.OutputRomHi;
//expansion.InputIRQ = ReadIRQ;
//expansion.InputLoExpansion = ReadLoExpansion;
//expansion.InputLoRom = pla.OutputRomLo;
//expansion.InputNMI = ReadNMI;
//expansion.InputBA = vic.OutputBA;
//expansion.InputData = ReadData;
//expansion.InputHiExpansion = ReadHiExpansion;
//expansion.InputHiRom = pla.OutputRomHi;
//expansion.InputIRQ = ReadIRQ;
//expansion.InputLoExpansion = ReadLoExpansion;
//expansion.InputLoRom = pla.OutputRomLo;
//expansion.InputNMI = ReadNMI;
//pla.InputAEC = vic.OutputAEC;
//pla.InputBA = vic.OutputBA;
//pla.InputCharen = ReadCharen;
//pla.InputExRom = expansion.OutputExRom;
//pla.InputGame = expansion.OutputGame;
//pla.InputHiRam = ReadHiRam;
//pla.InputLoRam = ReadLoRam;
//pla.InputVA = ReadVicAddress;
//pla.InputAEC = vic.OutputAEC;
//pla.InputBA = vic.OutputBA;
//pla.InputCharen = ReadCharen;
//pla.InputExRom = expansion.OutputExRom;
//pla.InputGame = expansion.OutputGame;
//pla.InputHiRam = ReadHiRam;
//pla.InputLoRam = ReadLoRam;
//pla.InputVA = ReadVicAddress;
//serial.InputATN = ReadSerialATN;
//serial.InputClock = ReadSerialCLK;
//serial.InputData = ReadSerialDTA;
//serial.InputATN = ReadSerialATN;
//serial.InputClock = ReadSerialCLK;
//serial.InputData = ReadSerialDTA;
//user.InputCNT1 = cia1.OutputCNT;
//user.InputCNT2 = cia2.OutputCNT;
//user.InputData = cia2.OutputPortB;
//user.InputPA2 = ReadUserPA2;
//user.InputPC2 = cia2.OutputPC;
//user.InputSP1 = cia1.OutputSP;
//user.InputSP2 = cia2.OutputSP;
}
//user.InputCNT1 = cia1.OutputCNT;
//user.InputCNT2 = cia2.OutputCNT;
//user.InputData = cia2.OutputPortB;
//user.InputPA2 = ReadUserPA2;
//user.InputPC2 = cia2.OutputPC;
//user.InputSP1 = cia1.OutputSP;
//user.InputSP2 = cia2.OutputSP;
}
bool ReadCia1Cnt()
{
// this pin is not connected
return true;
}
bool ReadCia1Cnt()
{
// this pin is not connected
return true;
}
bool ReadCia1Flag()
{
return serial.SRQ && cassette.Data;
}
bool ReadCia1Flag()
{
return serial.SRQ && cassette.Data;
}
int ReadCia1PortA()
{
return joystickB.Data & keyboard.Column;
}
int ReadCia1PortA()
{
return joystickB.Data & keyboard.Column;
}
int ReadCia1PortB()
{
return joystickA.Data & keyboard.Row;
}
int ReadCia1PortB()
{
return joystickA.Data & 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 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 ReadCPUPort()
{
return 0xFF;
}
bool ReadHiExpansion()
{
int addr = 0xFFFF;
return (addr >= 0xDF00 && addr < 0xE000);
}
bool ReadHiExpansion()
{
int addr = 0xFFFF;
return (addr >= 0xDF00 && addr < 0xE000);
}
bool ReadIRQ()
{
return (
cia1.IRQ &&
vic.IRQ &&
expansion.IRQ
);
}
bool ReadIRQ()
{
return (
cia1.IRQ &&
vic.IRQ &&
expansion.IRQ
);
}
bool ReadLoExpansion()
{
int addr = 0xFFFF;
return (addr >= 0xDE00 && addr < 0xDF00);
}
bool ReadLoExpansion()
{
int addr = 0xFFFF;
return (addr >= 0xDE00 && addr < 0xDF00);
}
bool ReadLoRam()
{
return (cpu.Port & 0x1) != 0;
}
bool ReadLoRam()
{
return (cpu.Port & 0x1) != 0;
}
bool ReadNMI()
{
return (
cia2.IRQ &&
expansion.NMI
);
}
bool ReadNMI()
{
return (
cia2.IRQ &&
expansion.NMI
);
}
bool ReadSerialATN()
{
return (cia2.PortA & 0x08) != 0;
}
bool ReadSerialATN()
{
return (cia2.PortA & 0x08) != 0;
}
bool ReadSerialCLK()
{
return (cia2.PortA & 0x10) != 0;
}
bool ReadSerialCLK()
{
return (cia2.PortA & 0x10) != 0;
}
bool ReadSerialDTA()
{
return (cia2.PortA & 0x20) != 0;
}
bool ReadSerialDTA()
{
return (cia2.PortA & 0x20) != 0;
}
bool ReadUserPA2()
{
return (cia2.PortA & 0x04) != 0;
}
bool ReadUserPA2()
{
return (cia2.PortA & 0x04) != 0;
}
int ReadVicAddress()
{
//return (vic.Address | ((cia2.PortA & 0x3) << 14));
return 0xFFFF;
}
}
int ReadVicAddress()
{
//return (vic.Address | ((cia2.PortA & 0x3) << 14));
return 0xFFFF;
}
}
}

View File

@ -1,132 +1,131 @@
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public sealed partial class C64 : IMotherboard
{
public Rom basicRom;
public Cassette cassette;
public Rom characterRom;
public Cia cia1;
public Cia cia2;
public Ram colorRam;
public Cpu cpu;
public Expansion expansion;
public Joystick joystickA;
public Joystick joystickB;
public Rom kernalRom;
public Keyboard keyboard;
public Ram memory;
public Pla pla;
public Serial serial;
public Sid sid;
public Userport user;
public Vic vic;
public sealed partial class C64 : IMotherboard
{
public Rom basicRom;
public Cassette cassette;
public Rom characterRom;
public Cia cia1;
public Cia cia2;
public Ram colorRam;
public Cpu cpu;
public Expansion expansion;
public Joystick joystickA;
public Joystick joystickB;
public Rom kernalRom;
public Keyboard keyboard;
public Ram memory;
public Pla pla;
public Serial serial;
public Sid sid;
public Userport user;
public Vic vic;
public C64(C64Timing timing)
{
}
public C64(C64Timing timing)
{
}
public void ExecuteFrame()
{
}
public void ExecuteFrame()
{
}
public byte PeekBasicRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekBasicRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekCartridge(int addr)
{
throw new NotImplementedException();
}
public byte PeekCartridge(int addr)
{
throw new NotImplementedException();
}
public byte PeekCharRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekCharRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekCpu(int addr)
{
throw new NotImplementedException();
}
public byte PeekCpu(int addr)
{
throw new NotImplementedException();
}
public byte PeekKernalRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekKernalRom(int addr)
{
throw new NotImplementedException();
}
public byte PeekRam(int addr)
{
throw new NotImplementedException();
}
public byte PeekRam(int addr)
{
throw new NotImplementedException();
}
public byte PeekSerial(int addr)
{
throw new NotImplementedException();
}
public byte PeekSerial(int addr)
{
throw new NotImplementedException();
}
public byte PeekSid(int addr)
{
throw new NotImplementedException();
}
public byte PeekSid(int addr)
{
throw new NotImplementedException();
}
public byte PeekVic(int addr)
{
throw new NotImplementedException();
}
public byte PeekVic(int addr)
{
throw new NotImplementedException();
}
public void PokeBasicRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeBasicRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCartridge(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCartridge(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCharRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCharRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCpu(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeCpu(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeKernalRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeKernalRom(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeRam(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeRam(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeSerial(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeSerial(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeSid(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeSid(int addr, byte val)
{
throw new NotImplementedException();
}
public void PokeVic(int addr, byte val)
{
throw new NotImplementedException();
}
}
public void PokeVic(int addr, byte val)
{
throw new NotImplementedException();
}
}
public class C64Timing
{
}
public class C64Timing
{
}
}

View File

@ -1,42 +1,40 @@
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips;
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
static public partial class C64ChipPresets
{
static public C64 NTSC(byte[] basic, byte[] kernal, byte[] character)
{
C64 result = new C64(NTSCTiming());
result.basicRom = ChipPresets.Rom2364(basic);
result.cassette = new Cassette();
result.characterRom = ChipPresets.Rom2332(character);
result.cia1 = ChipPresets.Cia6526(true);
result.cia2 = ChipPresets.Cia6526(true);
result.colorRam = ChipPresets.Ram2114();
result.cpu = new Cpu();
result.expansion = new Expansion();
result.joystickA = new Joystick();
result.joystickB = new Joystick();
result.kernalRom = ChipPresets.Rom2364(kernal);
result.keyboard = new Keyboard();
result.memory = ChipPresets.Ram4864();
result.pla = new Pla();
result.serial = new Serial();
result.sid = ChipPresets.Sid6581();
result.user = new Userport();
result.vic = ChipPresets.Vic6567();
result.InitializeConnections();
return result;
}
static public partial class C64ChipPresets
{
static public C64 NTSC(byte[] basic, byte[] kernal, byte[] character)
{
C64 result = new C64(NTSCTiming());
result.basicRom = ChipPresets.Rom2364(basic);
result.cassette = new Cassette();
result.characterRom = ChipPresets.Rom2332(character);
result.cia1 = ChipPresets.Cia6526(true);
result.cia2 = ChipPresets.Cia6526(true);
result.colorRam = ChipPresets.Ram2114();
result.cpu = new Cpu();
result.expansion = new Expansion();
result.joystickA = new Joystick();
result.joystickB = new Joystick();
result.kernalRom = ChipPresets.Rom2364(kernal);
result.keyboard = new Keyboard();
result.memory = ChipPresets.Ram4864();
result.pla = new Pla();
result.serial = new Serial();
result.sid = ChipPresets.Sid6581();
result.user = new Userport();
result.vic = ChipPresets.Vic6567();
result.InitializeConnections();
return result;
}
static public C64Timing NTSCTiming()
{
return new C64Timing();
}
}
static public C64Timing NTSCTiming()
{
return new C64Timing();
}
}
}

View File

@ -1,42 +1,40 @@
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips;
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
static public partial class C64ChipPresets
{
static public C64 PAL(byte[] basic, byte[] kernal, byte[] character)
{
C64 result = new C64(PALTiming());
result.basicRom = ChipPresets.Rom2364(basic);
result.cassette = new Cassette();
result.characterRom = ChipPresets.Rom2332(character);
result.cia1 = ChipPresets.Cia6526(true);
result.cia2 = ChipPresets.Cia6526(true);
result.colorRam = ChipPresets.Ram2114();
result.cpu = new Cpu();
result.expansion = new Expansion();
result.joystickA = new Joystick();
result.joystickB = new Joystick();
result.kernalRom = ChipPresets.Rom2364(kernal);
result.keyboard = new Keyboard();
result.memory = ChipPresets.Ram4864();
result.pla = new Pla();
result.serial = new Serial();
result.sid = ChipPresets.Sid6581();
result.user = new Userport();
result.vic = ChipPresets.Vic6569();
result.InitializeConnections();
return result;
}
static public partial class C64ChipPresets
{
static public C64 PAL(byte[] basic, byte[] kernal, byte[] character)
{
C64 result = new C64(PALTiming());
result.basicRom = ChipPresets.Rom2364(basic);
result.cassette = new Cassette();
result.characterRom = ChipPresets.Rom2332(character);
result.cia1 = ChipPresets.Cia6526(true);
result.cia2 = ChipPresets.Cia6526(true);
result.colorRam = ChipPresets.Ram2114();
result.cpu = new Cpu();
result.expansion = new Expansion();
result.joystickA = new Joystick();
result.joystickB = new Joystick();
result.kernalRom = ChipPresets.Rom2364(kernal);
result.keyboard = new Keyboard();
result.memory = ChipPresets.Ram4864();
result.pla = new Pla();
result.serial = new Serial();
result.sid = ChipPresets.Sid6581();
result.user = new Userport();
result.vic = ChipPresets.Vic6569();
result.InitializeConnections();
return result;
}
static public C64Timing PALTiming()
{
return new C64Timing();
}
}
static public C64Timing PALTiming()
{
return new C64Timing();
}
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Cassette
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cia
{

View File

@ -3,17 +3,17 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cia
{
public Cia(CiaSettings settings)
{
Reset();
}
sealed public partial class Cia
{
public Cia(CiaSettings settings)
{
Reset();
}
public void Reset()
{
}
}
public void Reset()
{
}
}
}

View File

@ -3,27 +3,27 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cia
{
public int Peek(int addr)
{
return 0xFF;
}
sealed public partial class Cia
{
public int Peek(int addr)
{
return 0xFF;
}
public void Poke(int addr, int val)
{
}
public void Poke(int addr, int val)
{
}
public int Read(int addr)
{
return Peek(addr);
}
public int Read(int addr)
{
return Peek(addr);
}
public void Write(int addr, int val)
{
Poke(addr, val);
}
}
public void Write(int addr, int val)
{
Poke(addr, val);
}
}
}

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class CiaSettings
{
}
public class CiaSettings
{
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cpu
{

View File

@ -4,87 +4,87 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cpu
{
int cachedAddress;
int cachedData;
bool cachedNMI;
int delayCycles;
bool nmiBuffer;
int portDirection;
int portLatch;
MOS6502X processor;
int resetPC;
sealed public partial class Cpu
{
int cachedAddress;
int cachedData;
bool cachedNMI;
int delayCycles;
bool nmiBuffer;
int portDirection;
int portLatch;
MOS6502X processor;
int resetPC;
public Cpu()
{
processor = new MOS6502X();
processor.DummyReadMemory = CoreReadMemory;
processor.ReadMemory = CoreReadMemory;
processor.WriteMemory = CoreWriteMemory;
Reset();
}
public Cpu()
{
processor = new MOS6502X();
processor.DummyReadMemory = CoreReadMemory;
processor.ReadMemory = CoreReadMemory;
processor.WriteMemory = CoreWriteMemory;
Reset();
}
public void Clock()
{
if (delayCycles > 0)
{
delayCycles--;
if (delayCycles == 1)
{
resetPC = ReadMemory(0xFFFC);
}
else if (delayCycles == 0)
{
resetPC |= ReadMemory(0xFFFD) << 8;
processor.PC = (ushort)resetPC;
}
}
else
{
if (InputAEC())
{
processor.IRQ = !InputIRQ(); //6502 core expects inverted input
nmiBuffer = InputNMI();
if (!nmiBuffer && cachedNMI)
processor.NMI = true; //6502 core expects inverted input
cachedNMI = nmiBuffer;
processor.RDY = InputRDY();
processor.ExecuteOne();
}
}
}
public void Clock()
{
if (delayCycles > 0)
{
delayCycles--;
if (delayCycles == 1)
{
resetPC = ReadMemory(0xFFFC);
}
else if (delayCycles == 0)
{
resetPC |= ReadMemory(0xFFFD) << 8;
processor.PC = (ushort)resetPC;
}
}
else
{
if (InputAEC())
{
processor.IRQ = !InputIRQ(); //6502 core expects inverted input
nmiBuffer = InputNMI();
if (!nmiBuffer && cachedNMI)
processor.NMI = true; //6502 core expects inverted input
cachedNMI = nmiBuffer;
processor.RDY = InputRDY();
processor.ExecuteOne();
}
}
}
byte CoreReadMemory(ushort addr)
{
if (addr == 0x0000)
return (byte)(portDirection & 0xFF);
else if (addr == 0x0001)
return (byte)((InputPort() | (portDirection ^ 0xFF)) & 0xFF);
else
return (byte)(ReadMemory(addr) & 0xFF);
}
byte CoreReadMemory(ushort addr)
{
if (addr == 0x0000)
return (byte)(portDirection & 0xFF);
else if (addr == 0x0001)
return (byte)((InputPort() | (portDirection ^ 0xFF)) & 0xFF);
else
return (byte)(ReadMemory(addr) & 0xFF);
}
void CoreWriteMemory(ushort addr, byte val)
{
cachedAddress = addr;
cachedData = val;
if (addr == 0x0000)
portDirection = val;
else if (addr == 0x0001)
portLatch = val;
else
WriteMemory(addr, val);
}
void CoreWriteMemory(ushort addr, byte val)
{
cachedAddress = addr;
cachedData = val;
if (addr == 0x0000)
portDirection = val;
else if (addr == 0x0001)
portLatch = val;
else
WriteMemory(addr, val);
}
public void Reset()
{
delayCycles = 6;
processor.Reset();
processor.BCD_Enabled = true;
processor.PC = (ushort)((CoreReadMemory(0xFFFD) << 8) | CoreReadMemory(0xFFFC));
}
}
public void Reset()
{
delayCycles = 6;
processor.Reset();
processor.BCD_Enabled = true;
processor.PC = (ushort)((CoreReadMemory(0xFFFD) << 8) | CoreReadMemory(0xFFFC));
}
}
}

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Cpu
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Expansion
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Joystick
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Keyboard
{

View File

@ -3,322 +3,322 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public class Pla
{
public Func<bool> InputCharen;
public Func<bool> InputExRom;
public Func<bool> InputGame;
public Func<bool> InputHiRam;
public Func<bool> InputLoRam;
sealed public class Pla
{
public Func<bool> InputCharen;
public Func<bool> InputExRom;
public Func<bool> InputGame;
public Func<bool> InputHiRam;
public Func<bool> InputLoRam;
public Func<int, int> PeekBasicRom;
public Func<int, int> PeekCartridgeLo;
public Func<int, int> PeekCartridgeHi;
public Func<int, int> PeekCharRom;
public Func<int, int> PeekCia1;
public Func<int, int> PeekCia2;
public Func<int, int> PeekColorRam;
public Func<int, int> PeekExpansionLo;
public Func<int, int> PeekExpansionHi;
public Func<int, int> PeekKernalRom;
public Func<int, int> PeekMemory;
public Func<int, int> PeekSid;
public Func<int, int> PeekVic;
public Action<int, int> PokeCartridgeLo;
public Action<int, int> PokeCartridgeHi;
public Action<int, int> PokeCia1;
public Action<int, int> PokeCia2;
public Action<int, int> PokeColorRam;
public Action<int, int> PokeExpansionLo;
public Action<int, int> PokeExpansionHi;
public Action<int, int> PokeMemory;
public Action<int, int> PokeSid;
public Action<int, int> PokeVic;
public Func<int, int> ReadBasicRom;
public Func<int, int> ReadCartridgeLo;
public Func<int, int> ReadCartridgeHi;
public Func<int, int> ReadCharRom;
public Func<int, int> ReadCia1;
public Func<int, int> ReadCia2;
public Func<int, int> ReadColorRam;
public Func<int, int> ReadExpansionLo;
public Func<int, int> ReadExpansionHi;
public Func<int, int> ReadKernalRom;
public Func<int, int> ReadMemory;
public Func<int, int> ReadSid;
public Func<int, int> ReadVic;
public Action<int, int> WriteCartridgeLo;
public Action<int, int> WriteCartridgeHi;
public Action<int, int> WriteCia1;
public Action<int, int> WriteCia2;
public Action<int, int> WriteColorRam;
public Action<int, int> WriteExpansionLo;
public Action<int, int> WriteExpansionHi;
public Action<int, int> WriteMemory;
public Action<int, int> WriteSid;
public Action<int, int> WriteVic;
public Func<int, int> PeekBasicRom;
public Func<int, int> PeekCartridgeLo;
public Func<int, int> PeekCartridgeHi;
public Func<int, int> PeekCharRom;
public Func<int, int> PeekCia1;
public Func<int, int> PeekCia2;
public Func<int, int> PeekColorRam;
public Func<int, int> PeekExpansionLo;
public Func<int, int> PeekExpansionHi;
public Func<int, int> PeekKernalRom;
public Func<int, int> PeekMemory;
public Func<int, int> PeekSid;
public Func<int, int> PeekVic;
public Action<int, int> PokeCartridgeLo;
public Action<int, int> PokeCartridgeHi;
public Action<int, int> PokeCia1;
public Action<int, int> PokeCia2;
public Action<int, int> PokeColorRam;
public Action<int, int> PokeExpansionLo;
public Action<int, int> PokeExpansionHi;
public Action<int, int> PokeMemory;
public Action<int, int> PokeSid;
public Action<int, int> PokeVic;
public Func<int, int> ReadBasicRom;
public Func<int, int> ReadCartridgeLo;
public Func<int, int> ReadCartridgeHi;
public Func<int, int> ReadCharRom;
public Func<int, int> ReadCia1;
public Func<int, int> ReadCia2;
public Func<int, int> ReadColorRam;
public Func<int, int> ReadExpansionLo;
public Func<int, int> ReadExpansionHi;
public Func<int, int> ReadKernalRom;
public Func<int, int> ReadMemory;
public Func<int, int> ReadSid;
public Func<int, int> ReadVic;
public Action<int, int> WriteCartridgeLo;
public Action<int, int> WriteCartridgeHi;
public Action<int, int> WriteCia1;
public Action<int, int> WriteCia2;
public Action<int, int> WriteColorRam;
public Action<int, int> WriteExpansionLo;
public Action<int, int> WriteExpansionHi;
public Action<int, int> WriteMemory;
public Action<int, int> WriteSid;
public Action<int, int> WriteVic;
enum PLABank
{
None,
RAM,
BasicROM,
KernalROM,
CharROM,
IO,
CartridgeLo,
CartridgeHi,
Vic,
Sid,
ColorRam,
Cia1,
Cia2,
ExpansionLo,
ExpansionHi
}
enum PLABank
{
None,
RAM,
BasicROM,
KernalROM,
CharROM,
IO,
CartridgeLo,
CartridgeHi,
Vic,
Sid,
ColorRam,
Cia1,
Cia2,
ExpansionLo,
ExpansionHi
}
bool loram;
bool hiram;
bool game;
bool exrom;
bool charen;
bool a15;
bool a14;
bool a13;
bool a12;
bool loram;
bool hiram;
bool game;
bool exrom;
bool charen;
bool a15;
bool a14;
bool a13;
bool a12;
public int Peek(int addr)
{
switch (Resolve(addr, true))
{
case PLABank.BasicROM:
return PeekBasicRom(addr);
case PLABank.CartridgeHi:
return PeekCartridgeHi(addr);
case PLABank.CartridgeLo:
return PeekCartridgeLo(addr);
case PLABank.CharROM:
return PeekCharRom(addr);
case PLABank.Cia1:
return PeekCia1(addr);
case PLABank.Cia2:
return PeekCia2(addr);
case PLABank.ColorRam:
return PeekColorRam(addr);
case PLABank.ExpansionLo:
return PeekExpansionLo(addr);
case PLABank.ExpansionHi:
return PeekExpansionHi(addr);
case PLABank.KernalROM:
return PeekKernalRom(addr);
case PLABank.RAM:
return PeekMemory(addr);
case PLABank.Sid:
return PeekSid(addr);
case PLABank.Vic:
return PeekVic(addr);
}
return 0xFF;
}
public int Peek(int addr)
{
switch (Resolve(addr, true))
{
case PLABank.BasicROM:
return PeekBasicRom(addr);
case PLABank.CartridgeHi:
return PeekCartridgeHi(addr);
case PLABank.CartridgeLo:
return PeekCartridgeLo(addr);
case PLABank.CharROM:
return PeekCharRom(addr);
case PLABank.Cia1:
return PeekCia1(addr);
case PLABank.Cia2:
return PeekCia2(addr);
case PLABank.ColorRam:
return PeekColorRam(addr);
case PLABank.ExpansionLo:
return PeekExpansionLo(addr);
case PLABank.ExpansionHi:
return PeekExpansionHi(addr);
case PLABank.KernalROM:
return PeekKernalRom(addr);
case PLABank.RAM:
return PeekMemory(addr);
case PLABank.Sid:
return PeekSid(addr);
case PLABank.Vic:
return PeekVic(addr);
}
return 0xFF;
}
public void Poke(int addr, int val)
{
switch (Resolve(addr, false))
{
case PLABank.CartridgeHi:
PokeCartridgeHi(addr, val);
break;
case PLABank.CartridgeLo:
PokeCartridgeLo(addr, val);
break;
case PLABank.Cia1:
PokeCia1(addr, val);
break;
case PLABank.Cia2:
PokeCia2(addr, val);
break;
case PLABank.ColorRam:
PokeColorRam(addr, val);
break;
case PLABank.ExpansionLo:
PokeExpansionLo(addr, val);
break;
case PLABank.ExpansionHi:
PokeExpansionHi(addr, val);
break;
case PLABank.RAM:
PokeMemory(addr, val);
break;
case PLABank.Sid:
PokeSid(addr, val);
break;
case PLABank.Vic:
PokeVic(addr, val);
break;
}
}
public void Poke(int addr, int val)
{
switch (Resolve(addr, false))
{
case PLABank.CartridgeHi:
PokeCartridgeHi(addr, val);
break;
case PLABank.CartridgeLo:
PokeCartridgeLo(addr, val);
break;
case PLABank.Cia1:
PokeCia1(addr, val);
break;
case PLABank.Cia2:
PokeCia2(addr, val);
break;
case PLABank.ColorRam:
PokeColorRam(addr, val);
break;
case PLABank.ExpansionLo:
PokeExpansionLo(addr, val);
break;
case PLABank.ExpansionHi:
PokeExpansionHi(addr, val);
break;
case PLABank.RAM:
PokeMemory(addr, val);
break;
case PLABank.Sid:
PokeSid(addr, val);
break;
case PLABank.Vic:
PokeVic(addr, val);
break;
}
}
public int Read(int addr)
{
switch (Resolve(addr, true))
{
case PLABank.BasicROM:
return ReadBasicRom(addr);
case PLABank.CartridgeHi:
return ReadCartridgeHi(addr);
case PLABank.CartridgeLo:
return ReadCartridgeLo(addr);
case PLABank.CharROM:
return ReadCharRom(addr);
case PLABank.Cia1:
return ReadCia1(addr);
case PLABank.Cia2:
return ReadCia2(addr);
case PLABank.ColorRam:
return ReadColorRam(addr);
case PLABank.ExpansionLo:
return ReadExpansionLo(addr);
case PLABank.ExpansionHi:
return ReadExpansionHi(addr);
case PLABank.KernalROM:
return ReadKernalRom(addr);
case PLABank.RAM:
return ReadMemory(addr);
case PLABank.Sid:
return ReadSid(addr);
case PLABank.Vic:
return ReadVic(addr);
}
return 0xFF;
}
public int Read(int addr)
{
switch (Resolve(addr, true))
{
case PLABank.BasicROM:
return ReadBasicRom(addr);
case PLABank.CartridgeHi:
return ReadCartridgeHi(addr);
case PLABank.CartridgeLo:
return ReadCartridgeLo(addr);
case PLABank.CharROM:
return ReadCharRom(addr);
case PLABank.Cia1:
return ReadCia1(addr);
case PLABank.Cia2:
return ReadCia2(addr);
case PLABank.ColorRam:
return ReadColorRam(addr);
case PLABank.ExpansionLo:
return ReadExpansionLo(addr);
case PLABank.ExpansionHi:
return ReadExpansionHi(addr);
case PLABank.KernalROM:
return ReadKernalRom(addr);
case PLABank.RAM:
return ReadMemory(addr);
case PLABank.Sid:
return ReadSid(addr);
case PLABank.Vic:
return ReadVic(addr);
}
return 0xFF;
}
PLABank Resolve(int addr, bool read)
{
loram = InputLoRam();
hiram = InputHiRam();
game = InputGame();
exrom = InputExRom();
PLABank Resolve(int addr, bool read)
{
loram = InputLoRam();
hiram = InputHiRam();
game = InputGame();
exrom = InputExRom();
a15 = (addr & 0x08000) != 0;
a14 = (addr & 0x04000) != 0;
a13 = (addr & 0x02000) != 0;
a12 = (addr & 0x01000) != 0;
a15 = (addr & 0x08000) != 0;
a14 = (addr & 0x04000) != 0;
a13 = (addr & 0x02000) != 0;
a12 = (addr & 0x01000) != 0;
// upper memory regions 8000-FFFF
if (a15)
{
// io/character access
if (a14 && !a13 && a12)
{
// character rom, banked in at D000-DFFF
charen = InputCharen();
if (read && !charen && (((hiram || loram) && game) || (hiram && !exrom && !game)))
return PLABank.CharROM;
// upper memory regions 8000-FFFF
if (a15)
{
// io/character access
if (a14 && !a13 && a12)
{
// character rom, banked in at D000-DFFF
charen = InputCharen();
if (read && !charen && (((hiram || loram) && game) || (hiram && !exrom && !game)))
return PLABank.CharROM;
// io block, banked in at D000-DFFF
if ((charen && (hiram || loram)) || (exrom && !game))
{
if (addr < 0xD400)
return PLABank.Vic;
if (addr < 0xD800)
return PLABank.Sid;
if (addr < 0xDC00)
return PLABank.ColorRam;
if (addr < 0xDD00)
return PLABank.Cia1;
if (addr < 0xDE00)
return PLABank.Cia2;
if (addr < 0xDF00)
return PLABank.ExpansionLo;
return PLABank.ExpansionHi;
}
}
// io block, banked in at D000-DFFF
if ((charen && (hiram || loram)) || (exrom && !game))
{
if (addr < 0xD400)
return PLABank.Vic;
if (addr < 0xD800)
return PLABank.Sid;
if (addr < 0xDC00)
return PLABank.ColorRam;
if (addr < 0xDD00)
return PLABank.Cia1;
if (addr < 0xDE00)
return PLABank.Cia2;
if (addr < 0xDF00)
return PLABank.ExpansionLo;
return PLABank.ExpansionHi;
}
}
if (read)
{
// cartridge high, banked either at A000-BFFF or E000-FFFF depending
if (a13 && !game && ((hiram && !a14 && !exrom) || (a14 && exrom)))
return PLABank.CartridgeHi;
if (read)
{
// cartridge high, banked either at A000-BFFF or E000-FFFF depending
if (a13 && !game && ((hiram && !a14 && !exrom) || (a14 && exrom)))
return PLABank.CartridgeHi;
// cartridge low, banked at 8000-9FFF
if (!a14 && !a13 && ((loram && hiram && !exrom) || (exrom && !game)))
return PLABank.CartridgeLo;
// cartridge low, banked at 8000-9FFF
if (!a14 && !a13 && ((loram && hiram && !exrom) || (exrom && !game)))
return PLABank.CartridgeLo;
// kernal rom, banked at E000-FFFF
if (hiram && a14 && a13 && (game || (!exrom && !game)))
return PLABank.KernalROM;
// kernal rom, banked at E000-FFFF
if (hiram && a14 && a13 && (game || (!exrom && !game)))
return PLABank.KernalROM;
// basic rom, banked at A000-BFFF
if (loram && hiram && !a14 && a13 && game)
return PLABank.BasicROM;
}
}
// basic rom, banked at A000-BFFF
if (loram && hiram && !a14 && a13 && game)
return PLABank.BasicROM;
}
}
// ultimax mode ram exclusion
if (exrom && !game && ((a15 && ((!a14 && a13) || (a14 && !a13 && !a12))) || (!a15 && (a14 || (!a14 && (a12 || a13))))))
return PLABank.None;
// ultimax mode ram exclusion
if (exrom && !game && ((a15 && ((!a14 && a13) || (a14 && !a13 && !a12))) || (!a15 && (a14 || (!a14 && (a12 || a13))))))
return PLABank.None;
return PLABank.RAM;
}
return PLABank.RAM;
}
public int VicRead(int addr)
{
game = InputGame();
exrom = InputExRom();
a14 = (addr & 0x04000) == 0;
a13 = (addr & 0x02000) != 0;
a12 = (addr & 0x01000) != 0;
public int VicRead(int addr)
{
game = InputGame();
exrom = InputExRom();
a14 = (addr & 0x04000) == 0;
a13 = (addr & 0x02000) != 0;
a12 = (addr & 0x01000) != 0;
// read char rom at 1000-1FFF and 9000-9FFF
if (a14 && !a13 && a12 && (game || !exrom))
return ReadCharRom(addr);
// read char rom at 1000-1FFF and 9000-9FFF
if (a14 && !a13 && a12 && (game || !exrom))
return ReadCharRom(addr);
// read cartridge rom in ultimax mode
if (a13 && a12 && exrom && !game)
return ReadCartridgeHi(addr);
// read cartridge rom in ultimax mode
if (a13 && a12 && exrom && !game)
return ReadCartridgeHi(addr);
return ReadMemory(addr);
}
return ReadMemory(addr);
}
public void Write(int addr, int val)
{
switch (Resolve(addr, false))
{
case PLABank.CartridgeHi:
WriteCartridgeHi(addr, val);
WriteMemory(addr, val);
break;
case PLABank.CartridgeLo:
WriteCartridgeLo(addr, val);
WriteMemory(addr, val);
break;
case PLABank.Cia1:
WriteCia1(addr, val);
break;
case PLABank.Cia2:
WriteCia2(addr, val);
break;
case PLABank.ColorRam:
WriteColorRam(addr, val);
break;
case PLABank.ExpansionLo:
WriteExpansionLo(addr, val);
return;
case PLABank.ExpansionHi:
WriteExpansionHi(addr, val);
return;
case PLABank.RAM:
WriteMemory(addr, val);
break;
case PLABank.Sid:
WriteSid(addr, val);
break;
case PLABank.Vic:
WriteVic(addr, val);
break;
}
}
}
public void Write(int addr, int val)
{
switch (Resolve(addr, false))
{
case PLABank.CartridgeHi:
WriteCartridgeHi(addr, val);
WriteMemory(addr, val);
break;
case PLABank.CartridgeLo:
WriteCartridgeLo(addr, val);
WriteMemory(addr, val);
break;
case PLABank.Cia1:
WriteCia1(addr, val);
break;
case PLABank.Cia2:
WriteCia2(addr, val);
break;
case PLABank.ColorRam:
WriteColorRam(addr, val);
break;
case PLABank.ExpansionLo:
WriteExpansionLo(addr, val);
return;
case PLABank.ExpansionHi:
WriteExpansionHi(addr, val);
return;
case PLABank.RAM:
WriteMemory(addr, val);
break;
case PLABank.Sid:
WriteSid(addr, val);
break;
case PLABank.Vic:
WriteVic(addr, val);
break;
}
}
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public class Ram
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Rom
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Serial
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Sid
{

View File

@ -3,23 +3,23 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Sid
{
public Sid(SidSettings settings)
{
Reset();
}
sealed public partial class Sid
{
public Sid(SidSettings settings)
{
Reset();
}
public void Clock()
{
}
public void Clock()
{
}
public void Reset()
{
for (int i = 0; i < 0x20; i++)
Poke(i, 0);
}
}
public void Reset()
{
for (int i = 0; i < 0x20; i++)
Poke(i, 0);
}
}
}

View File

@ -3,27 +3,27 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Sid
{
public int Peek(int addr)
{
return 0xFF;
}
sealed public partial class Sid
{
public int Peek(int addr)
{
return 0xFF;
}
public void Poke(int addr, int val)
{
}
public void Poke(int addr, int val)
{
}
public int Read(int addr)
{
return Peek(addr);
}
public int Read(int addr)
{
return Peek(addr);
}
public void Write(int addr, int val)
{
Poke(addr, val);
}
}
public void Write(int addr, int val)
{
Poke(addr, val);
}
}
}

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class SidSettings
{
}
public class SidSettings
{
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Sid
{

View File

@ -3,36 +3,36 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public class Userport
{
public Func<bool> InputCNT1;
public Func<bool> InputCNT2;
public Func<int> InputData;
public Func<bool> InputPA2;
public Func<bool> InputPC2;
public Func<bool> InputReset;
public Func<bool> InputSP1;
public Func<bool> InputSP2;
public class Userport
{
public Func<bool> InputCNT1;
public Func<bool> InputCNT2;
public Func<int> InputData;
public Func<bool> InputPA2;
public Func<bool> InputPC2;
public Func<bool> InputReset;
public Func<bool> InputSP1;
public Func<bool> 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; } }
}
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; } }
}
}

View File

@ -6,150 +6,150 @@ using System.Text;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
#pragma warning disable 169 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
const int GRAPHICS_DATA_00 = 0;
const int GRAPHICS_DATA_01 = 0x4000;
const int GRAPHICS_DATA_10 = GRAPHICS_DATA_01 << 1;
const int GRAPHICS_DATA_11 = GRAPHICS_DATA_01 | GRAPHICS_DATA_10;
const int GRAPHICS_DATA_OUTPUT_MASK = GRAPHICS_DATA_11;
sealed public partial class Vic
{
const int GRAPHICS_DATA_00 = 0;
const int GRAPHICS_DATA_01 = 0x4000;
const int GRAPHICS_DATA_10 = GRAPHICS_DATA_01 << 1;
const int GRAPHICS_DATA_11 = GRAPHICS_DATA_01 | GRAPHICS_DATA_10;
const int GRAPHICS_DATA_OUTPUT_MASK = GRAPHICS_DATA_11;
enum GraphicsMode
{
Mode000,
Mode001,
Mode010,
Mode011,
Mode100,
Mode101,
Mode110,
Mode111
}
enum GraphicsMode
{
Mode000,
Mode001,
Mode010,
Mode011,
Mode100,
Mode101,
Mode110,
Mode111
}
int g_BufferC;
int g_BufferG;
int g_DataC;
int g_DataG;
bool g_Idle;
int g_FillRasterX;
GraphicsMode g_Mode;
int g_OutData;
int g_OutPixel;
int g_ShiftRegister;
int g_BufferC;
int g_BufferG;
int g_DataC;
int g_DataG;
bool g_Idle;
int g_FillRasterX;
GraphicsMode g_Mode;
int g_OutData;
int g_OutPixel;
int g_ShiftRegister;
void RenderGraphics()
{
if ((rasterX & 0x7) == g_FillRasterX)
{
if (g_Idle)
g_DataC = 0;
else
g_DataC = g_BufferC;
void RenderGraphics()
{
if ((rasterX & 0x7) == g_FillRasterX)
{
if (g_Idle)
g_DataC = 0;
else
g_DataC = g_BufferC;
if (multiColorMode && (bitmapMode || (g_DataC & 0x8) != 0))
{
// load multicolor bits
// xx00xx11xx22xx33
g_ShiftRegister =
((g_DataG & 0x03) << 0) |
((g_DataG & 0x0C) << 2) |
((g_DataG & 0x30) << 4) |
((g_DataG & 0xC0) << 6)
;
if (multiColorMode && (bitmapMode || (g_DataC & 0x8) != 0))
{
// load multicolor bits
// xx00xx11xx22xx33
g_ShiftRegister =
((g_DataG & 0x03) << 0) |
((g_DataG & 0x0C) << 2) |
((g_DataG & 0x30) << 4) |
((g_DataG & 0xC0) << 6)
;
// duplicate bits
// 0000111122223333
g_ShiftRegister |= g_ShiftRegister << 2;
}
else
{
// load single color bits
// 0x1x2x3x4x5x6x7x
g_ShiftRegister =
((g_DataG & 0x01) << 1) |
((g_DataG & 0x02) << 2) |
((g_DataG & 0x04) << 3) |
((g_DataG & 0x08) << 4) |
((g_DataG & 0x10) << 5) |
((g_DataG & 0x20) << 6) |
((g_DataG & 0x40) << 7) |
((g_DataG & 0x80) << 8)
;
// duplicate bits
// 0000111122223333
g_ShiftRegister |= g_ShiftRegister << 2;
}
else
{
// load single color bits
// 0x1x2x3x4x5x6x7x
g_ShiftRegister =
((g_DataG & 0x01) << 1) |
((g_DataG & 0x02) << 2) |
((g_DataG & 0x04) << 3) |
((g_DataG & 0x08) << 4) |
((g_DataG & 0x10) << 5) |
((g_DataG & 0x20) << 6) |
((g_DataG & 0x40) << 7) |
((g_DataG & 0x80) << 8)
;
if (!bitmapMode)
{
// duplicate bits
// 0011223344556677
g_ShiftRegister |= g_ShiftRegister << 1;
}
else
{
// convert to bitmap format
g_ShiftRegister = (g_ShiftRegister | 0x5555) ^ (g_ShiftRegister >> 1);
}
}
}
if (!bitmapMode)
{
// duplicate bits
// 0011223344556677
g_ShiftRegister |= g_ShiftRegister << 1;
}
else
{
// convert to bitmap format
g_ShiftRegister = (g_ShiftRegister | 0x5555) ^ (g_ShiftRegister >> 1);
}
}
}
g_OutData = g_ShiftRegister & GRAPHICS_DATA_OUTPUT_MASK;
g_OutData = g_ShiftRegister & GRAPHICS_DATA_OUTPUT_MASK;
switch (g_Mode)
{
case GraphicsMode.Mode000:
case GraphicsMode.Mode001:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[0];
else if (g_OutData == GRAPHICS_DATA_11)
g_OutPixel = ((g_DataC >> 8) & 0x7);
else if (g_OutData == GRAPHICS_DATA_01)
g_OutPixel = backgroundColor[1];
else
g_OutPixel = backgroundColor[2];
break;
case GraphicsMode.Mode010:
case GraphicsMode.Mode011:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[0];
else if (g_OutData == GRAPHICS_DATA_01)
g_OutPixel = ((g_DataC >> 4) & 0xF);
else if (g_OutData == GRAPHICS_DATA_10)
g_OutPixel = (g_DataC & 0xF);
else
g_OutPixel = (g_DataC >> 8);
break;
case GraphicsMode.Mode100:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[(g_DataC >> 6) & 0x3];
else
g_OutPixel = (g_DataC >> 8);
break;
default:
g_OutPixel = 0;
break;
}
switch (g_Mode)
{
case GraphicsMode.Mode000:
case GraphicsMode.Mode001:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[0];
else if (g_OutData == GRAPHICS_DATA_11)
g_OutPixel = ((g_DataC >> 8) & 0x7);
else if (g_OutData == GRAPHICS_DATA_01)
g_OutPixel = backgroundColor[1];
else
g_OutPixel = backgroundColor[2];
break;
case GraphicsMode.Mode010:
case GraphicsMode.Mode011:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[0];
else if (g_OutData == GRAPHICS_DATA_01)
g_OutPixel = ((g_DataC >> 4) & 0xF);
else if (g_OutData == GRAPHICS_DATA_10)
g_OutPixel = (g_DataC & 0xF);
else
g_OutPixel = (g_DataC >> 8);
break;
case GraphicsMode.Mode100:
if (g_OutData == GRAPHICS_DATA_00)
g_OutPixel = backgroundColor[(g_DataC >> 6) & 0x3];
else
g_OutPixel = (g_DataC >> 8);
break;
default:
g_OutPixel = 0;
break;
}
g_ShiftRegister <<= 2;
}
g_ShiftRegister <<= 2;
}
void UpdateGraphicsMode()
{
if (!extraColorMode && !bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode000;
else if (!extraColorMode && !bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode001;
else if (!extraColorMode && bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode010;
else if (!extraColorMode && bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode011;
else if (extraColorMode && !bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode100;
else if (extraColorMode && !bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode101;
else if (extraColorMode && bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode110;
else if (extraColorMode && bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode111;
}
}
void UpdateGraphicsMode()
{
if (!extraColorMode && !bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode000;
else if (!extraColorMode && !bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode001;
else if (!extraColorMode && bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode010;
else if (!extraColorMode && bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode011;
else if (extraColorMode && !bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode100;
else if (extraColorMode && !bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode101;
else if (extraColorMode && bitmapMode && !multiColorMode)
g_Mode = GraphicsMode.Mode110;
else if (extraColorMode && bitmapMode && multiColorMode)
g_Mode = GraphicsMode.Mode111;
}
}
}

View File

@ -3,28 +3,28 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
// inputs
public Action ClockPhi0;
public Func<int, int> ReadColorRam;
public Func<int, int> ReadRam;
sealed public partial class Vic
{
// inputs
public Action ClockPhi0;
public Func<int, int> ReadColorRam;
public Func<int, int> ReadRam;
// outputs
public bool AEC { get { return true; } }
public bool BA { get { return true; } }
public bool IRQ { get { return true; } }
public bool OutputAEC() { return true; }
public bool OutputBA() { return true; }
public bool OutputIRQ() { return true; }
// outputs
public bool AEC { get { return true; } }
public bool BA { get { return true; } }
public bool IRQ { get { return true; } }
public bool OutputAEC() { return true; }
public bool OutputBA() { return true; }
public bool OutputIRQ() { return true; }
// exposed internal data
public int Address { get { return address; } }
public int CyclesPerFrame { get { return rasterCount * rasterWidth / 8; } }
public int CyclesPerSecond { get { return frequency; } }
public int Data { get { return data; } }
public int DataPhi1 { get { return phi1Data; } }
}
// exposed internal data
public int Address { get { return address; } }
public int CyclesPerFrame { get { return rasterCount * rasterWidth / 8; } }
public int CyclesPerSecond { get { return frequency; } }
public int Data { get { return data; } }
public int DataPhi1 { get { return phi1Data; } }
}
}

View File

@ -6,28 +6,28 @@ using System.Text;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
#pragma warning disable 169 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
int address;
bool aec;
bool ba;
int data;
int phi1Data;
int rasterX;
sealed public partial class Vic
{
int address;
bool aec;
bool ba;
int data;
int phi1Data;
int rasterX;
public Vic(VicSettings settings)
{
}
public Vic(VicSettings settings)
{
}
public void Clock()
{
Render();
}
public void Clock()
{
Render();
}
public void Reset()
{
}
}
public void Reset()
{
}
}
}

View File

@ -5,424 +5,424 @@ using System.Text;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
int[] backgroundColor;
bool bitmapMode;
int borderColor;
int characterBitmap;
bool columnSelect;
bool dataCollisionInterrupt;
bool dataCollisionInterruptEnable;
bool displayEnable;
bool extraColorMode;
bool irq;
bool lightPenInterrupt;
bool lightPenInterruptEnable;
int lightPenX;
int lightPenY;
bool multiColorMode;
bool rasterInterrupt;
bool rasterInterruptEnable;
int rasterY;
int rasterYCompare;
bool reset;
bool rowSelect;
bool spriteCollisionInterrupt;
bool spriteCollisionInterruptEnable;
int[] spriteMultiColor;
int videoMemory;
int xScroll;
int yScroll;
sealed public partial class Vic
{
int[] backgroundColor;
bool bitmapMode;
int borderColor;
int characterBitmap;
bool columnSelect;
bool dataCollisionInterrupt;
bool dataCollisionInterruptEnable;
bool displayEnable;
bool extraColorMode;
bool irq;
bool lightPenInterrupt;
bool lightPenInterruptEnable;
int lightPenX;
int lightPenY;
bool multiColorMode;
bool rasterInterrupt;
bool rasterInterruptEnable;
int rasterY;
int rasterYCompare;
bool reset;
bool rowSelect;
bool spriteCollisionInterrupt;
bool spriteCollisionInterruptEnable;
int[] spriteMultiColor;
int videoMemory;
int xScroll;
int yScroll;
public int Peek(int addr)
{
switch (addr)
{
case 0x00: return sprites[0].X & 0xFF;
case 0x01: return sprites[1].X & 0xFF;
case 0x02: return sprites[2].X & 0xFF;
case 0x03: return sprites[3].X & 0xFF;
case 0x04: return sprites[4].X & 0xFF;
case 0x05: return sprites[5].X & 0xFF;
case 0x06: return sprites[6].X & 0xFF;
case 0x07: return sprites[7].X & 0xFF;
case 0x08: return sprites[0].Y;
case 0x09: return sprites[1].Y;
case 0x0A: return sprites[2].Y;
case 0x0B: return sprites[3].Y;
case 0x0C: return sprites[4].Y;
case 0x0D: return sprites[5].Y;
case 0x0E: return sprites[6].Y;
case 0x0F: return sprites[7].Y;
case 0x10: return (
((sprites[0].X & 0x80) >> 7) |
((sprites[1].X & 0x80) >> 6) |
((sprites[2].X & 0x80) >> 5) |
((sprites[3].X & 0x80) >> 4) |
((sprites[4].X & 0x80) >> 3) |
((sprites[5].X & 0x80) >> 2) |
((sprites[6].X & 0x80) >> 1) |
(sprites[7].X & 0x80)
);
case 0x11: return (
yScroll |
(rowSelect ? 0x08 : 0x00) |
(displayEnable ? 0x10 : 0x00) |
(bitmapMode ? 0x20 : 0x00) |
(extraColorMode ? 0x40 : 0x00) |
((rasterY & 0x100) >> 1)
);
case 0x12: return (rasterY & 0xFF);
case 0x13: return lightPenX;
case 0x14: return lightPenY;
case 0x15: return (
(sprites[0].Enabled ? 0x01 : 0x00) |
(sprites[1].Enabled ? 0x02 : 0x00) |
(sprites[2].Enabled ? 0x04 : 0x00) |
(sprites[3].Enabled ? 0x08 : 0x00) |
(sprites[4].Enabled ? 0x10 : 0x00) |
(sprites[5].Enabled ? 0x20 : 0x00) |
(sprites[6].Enabled ? 0x40 : 0x00) |
(sprites[7].Enabled ? 0x80 : 0x00)
);
case 0x16: return (
xScroll |
(columnSelect ? 0x08 : 0x00) |
(multiColorMode ? 0x10 : 0x00) |
(reset ? 0x20 : 0x00) |
0xC0
);
case 0x17: return (
(sprites[0].ExpandY ? 0x01 : 0x00) |
(sprites[1].ExpandY ? 0x02 : 0x00) |
(sprites[2].ExpandY ? 0x04 : 0x00) |
(sprites[3].ExpandY ? 0x08 : 0x00) |
(sprites[4].ExpandY ? 0x10 : 0x00) |
(sprites[5].ExpandY ? 0x20 : 0x00) |
(sprites[6].ExpandY ? 0x40 : 0x00) |
(sprites[7].ExpandY ? 0x80 : 0x00)
);
case 0x18: return (
(videoMemory >> 6) |
(characterBitmap >> 10)
);
case 0x19: return (
(rasterInterrupt ? 0x01 : 0x00) |
(dataCollisionInterrupt ? 0x02 : 0x00) |
(spriteCollisionInterrupt ? 0x04 : 0x00) |
(lightPenInterrupt ? 0x08 : 0x00) |
0x70 |
(irq ? 0x80 : 0x00)
);
case 0x1A: return (
(rasterInterruptEnable ? 0x01 : 0x00) |
(dataCollisionInterruptEnable ? 0x02 : 0x00) |
(spriteCollisionInterruptEnable ? 0x04 : 0x00) |
(lightPenInterruptEnable ? 0x08 : 0x00) |
0xF0
);
case 0x1B: return (
(sprites[0].Priority ? 0x01 : 0x00) |
(sprites[1].Priority ? 0x02 : 0x00) |
(sprites[2].Priority ? 0x04 : 0x00) |
(sprites[3].Priority ? 0x08 : 0x00) |
(sprites[4].Priority ? 0x10 : 0x00) |
(sprites[5].Priority ? 0x20 : 0x00) |
(sprites[6].Priority ? 0x40 : 0x00) |
(sprites[7].Priority ? 0x80 : 0x00)
);
case 0x1C: return (
(sprites[0].Multicolor ? 0x01 : 0x00) |
(sprites[1].Multicolor ? 0x02 : 0x00) |
(sprites[2].Multicolor ? 0x04 : 0x00) |
(sprites[3].Multicolor ? 0x08 : 0x00) |
(sprites[4].Multicolor ? 0x10 : 0x00) |
(sprites[5].Multicolor ? 0x20 : 0x00) |
(sprites[6].Multicolor ? 0x40 : 0x00) |
(sprites[7].Multicolor ? 0x80 : 0x00)
);
case 0x1D: return (
(sprites[0].ExpandX ? 0x01 : 0x00) |
(sprites[1].ExpandX ? 0x02 : 0x00) |
(sprites[2].ExpandX ? 0x04 : 0x00) |
(sprites[3].ExpandX ? 0x08 : 0x00) |
(sprites[4].ExpandX ? 0x10 : 0x00) |
(sprites[5].ExpandX ? 0x20 : 0x00) |
(sprites[6].ExpandX ? 0x40 : 0x00) |
(sprites[7].ExpandX ? 0x80 : 0x00)
);
case 0x1E: return (
(sprites[0].SpriteCollision ? 0x01 : 0x00) |
(sprites[1].SpriteCollision ? 0x02 : 0x00) |
(sprites[2].SpriteCollision ? 0x04 : 0x00) |
(sprites[3].SpriteCollision ? 0x08 : 0x00) |
(sprites[4].SpriteCollision ? 0x10 : 0x00) |
(sprites[5].SpriteCollision ? 0x20 : 0x00) |
(sprites[6].SpriteCollision ? 0x40 : 0x00) |
(sprites[7].SpriteCollision ? 0x80 : 0x00)
);
case 0x1F: return (
(sprites[0].DataCollision ? 0x01 : 0x00) |
(sprites[1].DataCollision ? 0x02 : 0x00) |
(sprites[2].DataCollision ? 0x04 : 0x00) |
(sprites[3].DataCollision ? 0x08 : 0x00) |
(sprites[4].DataCollision ? 0x10 : 0x00) |
(sprites[5].DataCollision ? 0x20 : 0x00) |
(sprites[6].DataCollision ? 0x40 : 0x00) |
(sprites[7].DataCollision ? 0x80 : 0x00)
);
case 0x20: return borderColor | 0xF0;
case 0x21: return backgroundColor[0] | 0xF0;
case 0x22: return backgroundColor[1] | 0xF0;
case 0x23: return backgroundColor[2] | 0xF0;
case 0x24: return backgroundColor[3] | 0xF0;
case 0x25: return spriteMultiColor[0] | 0xF0;
case 0x26: return spriteMultiColor[1] | 0xF0;
case 0x27: return sprites[0].Color | 0xF0;
case 0x28: return sprites[1].Color | 0xF0;
case 0x29: return sprites[2].Color | 0xF0;
case 0x2A: return sprites[3].Color | 0xF0;
case 0x2B: return sprites[4].Color | 0xF0;
case 0x2C: return sprites[5].Color | 0xF0;
case 0x2D: return sprites[6].Color | 0xF0;
case 0x2E: return sprites[7].Color | 0xF0;
default: return 0xFF;
}
}
public int Peek(int addr)
{
switch (addr)
{
case 0x00: return sprites[0].X & 0xFF;
case 0x01: return sprites[1].X & 0xFF;
case 0x02: return sprites[2].X & 0xFF;
case 0x03: return sprites[3].X & 0xFF;
case 0x04: return sprites[4].X & 0xFF;
case 0x05: return sprites[5].X & 0xFF;
case 0x06: return sprites[6].X & 0xFF;
case 0x07: return sprites[7].X & 0xFF;
case 0x08: return sprites[0].Y;
case 0x09: return sprites[1].Y;
case 0x0A: return sprites[2].Y;
case 0x0B: return sprites[3].Y;
case 0x0C: return sprites[4].Y;
case 0x0D: return sprites[5].Y;
case 0x0E: return sprites[6].Y;
case 0x0F: return sprites[7].Y;
case 0x10: return (
((sprites[0].X & 0x80) >> 7) |
((sprites[1].X & 0x80) >> 6) |
((sprites[2].X & 0x80) >> 5) |
((sprites[3].X & 0x80) >> 4) |
((sprites[4].X & 0x80) >> 3) |
((sprites[5].X & 0x80) >> 2) |
((sprites[6].X & 0x80) >> 1) |
(sprites[7].X & 0x80)
);
case 0x11: return (
yScroll |
(rowSelect ? 0x08 : 0x00) |
(displayEnable ? 0x10 : 0x00) |
(bitmapMode ? 0x20 : 0x00) |
(extraColorMode ? 0x40 : 0x00) |
((rasterY & 0x100) >> 1)
);
case 0x12: return (rasterY & 0xFF);
case 0x13: return lightPenX;
case 0x14: return lightPenY;
case 0x15: return (
(sprites[0].Enabled ? 0x01 : 0x00) |
(sprites[1].Enabled ? 0x02 : 0x00) |
(sprites[2].Enabled ? 0x04 : 0x00) |
(sprites[3].Enabled ? 0x08 : 0x00) |
(sprites[4].Enabled ? 0x10 : 0x00) |
(sprites[5].Enabled ? 0x20 : 0x00) |
(sprites[6].Enabled ? 0x40 : 0x00) |
(sprites[7].Enabled ? 0x80 : 0x00)
);
case 0x16: return (
xScroll |
(columnSelect ? 0x08 : 0x00) |
(multiColorMode ? 0x10 : 0x00) |
(reset ? 0x20 : 0x00) |
0xC0
);
case 0x17: return (
(sprites[0].ExpandY ? 0x01 : 0x00) |
(sprites[1].ExpandY ? 0x02 : 0x00) |
(sprites[2].ExpandY ? 0x04 : 0x00) |
(sprites[3].ExpandY ? 0x08 : 0x00) |
(sprites[4].ExpandY ? 0x10 : 0x00) |
(sprites[5].ExpandY ? 0x20 : 0x00) |
(sprites[6].ExpandY ? 0x40 : 0x00) |
(sprites[7].ExpandY ? 0x80 : 0x00)
);
case 0x18: return (
(videoMemory >> 6) |
(characterBitmap >> 10)
);
case 0x19: return (
(rasterInterrupt ? 0x01 : 0x00) |
(dataCollisionInterrupt ? 0x02 : 0x00) |
(spriteCollisionInterrupt ? 0x04 : 0x00) |
(lightPenInterrupt ? 0x08 : 0x00) |
0x70 |
(irq ? 0x80 : 0x00)
);
case 0x1A: return (
(rasterInterruptEnable ? 0x01 : 0x00) |
(dataCollisionInterruptEnable ? 0x02 : 0x00) |
(spriteCollisionInterruptEnable ? 0x04 : 0x00) |
(lightPenInterruptEnable ? 0x08 : 0x00) |
0xF0
);
case 0x1B: return (
(sprites[0].Priority ? 0x01 : 0x00) |
(sprites[1].Priority ? 0x02 : 0x00) |
(sprites[2].Priority ? 0x04 : 0x00) |
(sprites[3].Priority ? 0x08 : 0x00) |
(sprites[4].Priority ? 0x10 : 0x00) |
(sprites[5].Priority ? 0x20 : 0x00) |
(sprites[6].Priority ? 0x40 : 0x00) |
(sprites[7].Priority ? 0x80 : 0x00)
);
case 0x1C: return (
(sprites[0].Multicolor ? 0x01 : 0x00) |
(sprites[1].Multicolor ? 0x02 : 0x00) |
(sprites[2].Multicolor ? 0x04 : 0x00) |
(sprites[3].Multicolor ? 0x08 : 0x00) |
(sprites[4].Multicolor ? 0x10 : 0x00) |
(sprites[5].Multicolor ? 0x20 : 0x00) |
(sprites[6].Multicolor ? 0x40 : 0x00) |
(sprites[7].Multicolor ? 0x80 : 0x00)
);
case 0x1D: return (
(sprites[0].ExpandX ? 0x01 : 0x00) |
(sprites[1].ExpandX ? 0x02 : 0x00) |
(sprites[2].ExpandX ? 0x04 : 0x00) |
(sprites[3].ExpandX ? 0x08 : 0x00) |
(sprites[4].ExpandX ? 0x10 : 0x00) |
(sprites[5].ExpandX ? 0x20 : 0x00) |
(sprites[6].ExpandX ? 0x40 : 0x00) |
(sprites[7].ExpandX ? 0x80 : 0x00)
);
case 0x1E: return (
(sprites[0].SpriteCollision ? 0x01 : 0x00) |
(sprites[1].SpriteCollision ? 0x02 : 0x00) |
(sprites[2].SpriteCollision ? 0x04 : 0x00) |
(sprites[3].SpriteCollision ? 0x08 : 0x00) |
(sprites[4].SpriteCollision ? 0x10 : 0x00) |
(sprites[5].SpriteCollision ? 0x20 : 0x00) |
(sprites[6].SpriteCollision ? 0x40 : 0x00) |
(sprites[7].SpriteCollision ? 0x80 : 0x00)
);
case 0x1F: return (
(sprites[0].DataCollision ? 0x01 : 0x00) |
(sprites[1].DataCollision ? 0x02 : 0x00) |
(sprites[2].DataCollision ? 0x04 : 0x00) |
(sprites[3].DataCollision ? 0x08 : 0x00) |
(sprites[4].DataCollision ? 0x10 : 0x00) |
(sprites[5].DataCollision ? 0x20 : 0x00) |
(sprites[6].DataCollision ? 0x40 : 0x00) |
(sprites[7].DataCollision ? 0x80 : 0x00)
);
case 0x20: return borderColor | 0xF0;
case 0x21: return backgroundColor[0] | 0xF0;
case 0x22: return backgroundColor[1] | 0xF0;
case 0x23: return backgroundColor[2] | 0xF0;
case 0x24: return backgroundColor[3] | 0xF0;
case 0x25: return spriteMultiColor[0] | 0xF0;
case 0x26: return spriteMultiColor[1] | 0xF0;
case 0x27: return sprites[0].Color | 0xF0;
case 0x28: return sprites[1].Color | 0xF0;
case 0x29: return sprites[2].Color | 0xF0;
case 0x2A: return sprites[3].Color | 0xF0;
case 0x2B: return sprites[4].Color | 0xF0;
case 0x2C: return sprites[5].Color | 0xF0;
case 0x2D: return sprites[6].Color | 0xF0;
case 0x2E: return sprites[7].Color | 0xF0;
default: return 0xFF;
}
}
public byte PeekByte(int addr)
{
return (byte)(Peek(addr) & 0xFF);
}
public byte PeekByte(int addr)
{
return (byte)(Peek(addr) & 0xFF);
}
public void Poke(int addr, int val)
{
switch (addr)
{
case 0x00: sprites[0].X = (sprites[0].X & 0x100 | val); return;
case 0x01: sprites[1].X = (sprites[1].X & 0x100 | val); return;
case 0x02: sprites[2].X = (sprites[2].X & 0x100 | val); return;
case 0x03: sprites[3].X = (sprites[3].X & 0x100 | val); return;
case 0x04: sprites[4].X = (sprites[4].X & 0x100 | val); return;
case 0x05: sprites[5].X = (sprites[5].X & 0x100 | val); return;
case 0x06: sprites[6].X = (sprites[6].X & 0x100 | val); return;
case 0x07: sprites[7].X = (sprites[7].X & 0x100 | val); return;
case 0x08: sprites[0].Y = val; return;
case 0x09: sprites[1].Y = val; return;
case 0x0A: sprites[2].Y = val; return;
case 0x0B: sprites[3].Y = val; return;
case 0x0C: sprites[4].Y = val; return;
case 0x0D: sprites[5].Y = val; return;
case 0x0E: sprites[6].Y = val; return;
case 0x0F: sprites[7].Y = val; return;
case 0x10:
sprites[0].X = (sprites[0].X & 0xFF) | ((val & 0x01) << 8);
sprites[1].X = (sprites[1].X & 0xFF) | ((val & 0x02) << 7);
sprites[2].X = (sprites[2].X & 0xFF) | ((val & 0x04) << 6);
sprites[3].X = (sprites[3].X & 0xFF) | ((val & 0x08) << 5);
sprites[4].X = (sprites[4].X & 0xFF) | ((val & 0x10) << 4);
sprites[5].X = (sprites[5].X & 0xFF) | ((val & 0x20) << 3);
sprites[6].X = (sprites[6].X & 0xFF) | ((val & 0x40) << 2);
sprites[7].X = (sprites[7].X & 0xFF) | ((val & 0x80) << 1);
return;
case 0x11:
yScroll = (val & 0x07);
rowSelect = ((val & 0x08) != 0);
displayEnable = ((val & 0x10) != 0);
bitmapMode = ((val & 0x20) != 0);
extraColorMode = ((val & 0x40) != 0);
rasterYCompare = (rasterYCompare & 0xFF) | ((val & 0x80) << 1);
return;
case 0x12: rasterYCompare = (rasterYCompare & 0x100) | val; return;
case 0x13: lightPenX = val; return;
case 0x14: lightPenY = val; return;
case 0x15:
sprites[0].Enabled = ((val & 0x01) != 0);
sprites[1].Enabled = ((val & 0x02) != 0);
sprites[2].Enabled = ((val & 0x04) != 0);
sprites[3].Enabled = ((val & 0x08) != 0);
sprites[4].Enabled = ((val & 0x10) != 0);
sprites[5].Enabled = ((val & 0x20) != 0);
sprites[6].Enabled = ((val & 0x40) != 0);
sprites[7].Enabled = ((val & 0x80) != 0);
return;
case 0x16:
xScroll = (val & 0x07);
columnSelect = ((val & 0x08) != 0);
multiColorMode = ((val & 0x10) != 0);
reset = ((val & 0x20) != 0);
return;
case 0x17:
sprites[0].ExpandY = ((val & 0x01) != 0);
sprites[1].ExpandY = ((val & 0x02) != 0);
sprites[2].ExpandY = ((val & 0x04) != 0);
sprites[3].ExpandY = ((val & 0x08) != 0);
sprites[4].ExpandY = ((val & 0x10) != 0);
sprites[5].ExpandY = ((val & 0x20) != 0);
sprites[6].ExpandY = ((val & 0x40) != 0);
sprites[7].ExpandY = ((val & 0x80) != 0);
return;
case 0x18:
videoMemory = (val & 0xF0) << 6;
characterBitmap = (val & 0x0E) << 10;
return;
case 0x19:
rasterInterrupt = ((val & 0x01) != 0);
dataCollisionInterrupt = ((val & 0x02) != 0);
spriteCollisionInterrupt = ((val & 0x04) != 0);
lightPenInterrupt = ((val & 0x08) != 0);
irq = ((val & 0x80) != 0);
return;
case 0x1A:
rasterInterruptEnable = ((val & 0x01) != 0);
dataCollisionInterruptEnable = ((val & 0x02) != 0);
spriteCollisionInterruptEnable = ((val & 0x04) != 0);
lightPenInterruptEnable = ((val & 0x08) != 0);
return;
case 0x1B:
sprites[0].Priority = ((val & 0x01) != 0);
sprites[1].Priority = ((val & 0x02) != 0);
sprites[2].Priority = ((val & 0x04) != 0);
sprites[3].Priority = ((val & 0x08) != 0);
sprites[4].Priority = ((val & 0x10) != 0);
sprites[5].Priority = ((val & 0x20) != 0);
sprites[6].Priority = ((val & 0x40) != 0);
sprites[7].Priority = ((val & 0x80) != 0);
return;
case 0x1C:
sprites[0].Multicolor = ((val & 0x01) != 0);
sprites[1].Multicolor = ((val & 0x02) != 0);
sprites[2].Multicolor = ((val & 0x04) != 0);
sprites[3].Multicolor = ((val & 0x08) != 0);
sprites[4].Multicolor = ((val & 0x10) != 0);
sprites[5].Multicolor = ((val & 0x20) != 0);
sprites[6].Multicolor = ((val & 0x40) != 0);
sprites[7].Multicolor = ((val & 0x80) != 0);
return;
case 0x1D:
sprites[0].ExpandX = ((val & 0x01) != 0);
sprites[1].ExpandX = ((val & 0x02) != 0);
sprites[2].ExpandX = ((val & 0x04) != 0);
sprites[3].ExpandX = ((val & 0x08) != 0);
sprites[4].ExpandX = ((val & 0x10) != 0);
sprites[5].ExpandX = ((val & 0x20) != 0);
sprites[6].ExpandX = ((val & 0x40) != 0);
sprites[7].ExpandX = ((val & 0x80) != 0);
return;
case 0x1E:
sprites[0].SpriteCollision = ((val & 0x01) != 0);
sprites[1].SpriteCollision = ((val & 0x02) != 0);
sprites[2].SpriteCollision = ((val & 0x04) != 0);
sprites[3].SpriteCollision = ((val & 0x08) != 0);
sprites[4].SpriteCollision = ((val & 0x10) != 0);
sprites[5].SpriteCollision = ((val & 0x20) != 0);
sprites[6].SpriteCollision = ((val & 0x40) != 0);
sprites[7].SpriteCollision = ((val & 0x80) != 0);
return;
case 0x1F:
sprites[0].DataCollision = ((val & 0x01) != 0);
sprites[1].DataCollision = ((val & 0x02) != 0);
sprites[2].DataCollision = ((val & 0x04) != 0);
sprites[3].DataCollision = ((val & 0x08) != 0);
sprites[4].DataCollision = ((val & 0x10) != 0);
sprites[5].DataCollision = ((val & 0x20) != 0);
sprites[6].DataCollision = ((val & 0x40) != 0);
sprites[7].DataCollision = ((val & 0x80) != 0);
return;
case 0x20: borderColor = val & 0x0F; return;
case 0x21: backgroundColor[0] = val & 0x0F; return;
case 0x22: backgroundColor[1] = val & 0x0F; return;
case 0x23: backgroundColor[2] = val & 0x0F; return;
case 0x24: backgroundColor[3] = val & 0x0F; return;
case 0x25: spriteMultiColor[0] = val & 0x0F; return;
case 0x26: spriteMultiColor[1] = val & 0x0F; return;
case 0x27: sprites[0].Color = val & 0x0F; return;
case 0x28: sprites[1].Color = val & 0x0F; return;
case 0x29: sprites[2].Color = val & 0x0F; return;
case 0x2A: sprites[3].Color = val & 0x0F; return;
case 0x2B: sprites[4].Color = val & 0x0F; return;
case 0x2C: sprites[5].Color = val & 0x0F; return;
case 0x2D: sprites[6].Color = val & 0x0F; return;
case 0x2E: sprites[7].Color = val & 0x0F; return;
default: return;
}
}
public void Poke(int addr, int val)
{
switch (addr)
{
case 0x00: sprites[0].X = (sprites[0].X & 0x100 | val); return;
case 0x01: sprites[1].X = (sprites[1].X & 0x100 | val); return;
case 0x02: sprites[2].X = (sprites[2].X & 0x100 | val); return;
case 0x03: sprites[3].X = (sprites[3].X & 0x100 | val); return;
case 0x04: sprites[4].X = (sprites[4].X & 0x100 | val); return;
case 0x05: sprites[5].X = (sprites[5].X & 0x100 | val); return;
case 0x06: sprites[6].X = (sprites[6].X & 0x100 | val); return;
case 0x07: sprites[7].X = (sprites[7].X & 0x100 | val); return;
case 0x08: sprites[0].Y = val; return;
case 0x09: sprites[1].Y = val; return;
case 0x0A: sprites[2].Y = val; return;
case 0x0B: sprites[3].Y = val; return;
case 0x0C: sprites[4].Y = val; return;
case 0x0D: sprites[5].Y = val; return;
case 0x0E: sprites[6].Y = val; return;
case 0x0F: sprites[7].Y = val; return;
case 0x10:
sprites[0].X = (sprites[0].X & 0xFF) | ((val & 0x01) << 8);
sprites[1].X = (sprites[1].X & 0xFF) | ((val & 0x02) << 7);
sprites[2].X = (sprites[2].X & 0xFF) | ((val & 0x04) << 6);
sprites[3].X = (sprites[3].X & 0xFF) | ((val & 0x08) << 5);
sprites[4].X = (sprites[4].X & 0xFF) | ((val & 0x10) << 4);
sprites[5].X = (sprites[5].X & 0xFF) | ((val & 0x20) << 3);
sprites[6].X = (sprites[6].X & 0xFF) | ((val & 0x40) << 2);
sprites[7].X = (sprites[7].X & 0xFF) | ((val & 0x80) << 1);
return;
case 0x11:
yScroll = (val & 0x07);
rowSelect = ((val & 0x08) != 0);
displayEnable = ((val & 0x10) != 0);
bitmapMode = ((val & 0x20) != 0);
extraColorMode = ((val & 0x40) != 0);
rasterYCompare = (rasterYCompare & 0xFF) | ((val & 0x80) << 1);
return;
case 0x12: rasterYCompare = (rasterYCompare & 0x100) | val; return;
case 0x13: lightPenX = val; return;
case 0x14: lightPenY = val; return;
case 0x15:
sprites[0].Enabled = ((val & 0x01) != 0);
sprites[1].Enabled = ((val & 0x02) != 0);
sprites[2].Enabled = ((val & 0x04) != 0);
sprites[3].Enabled = ((val & 0x08) != 0);
sprites[4].Enabled = ((val & 0x10) != 0);
sprites[5].Enabled = ((val & 0x20) != 0);
sprites[6].Enabled = ((val & 0x40) != 0);
sprites[7].Enabled = ((val & 0x80) != 0);
return;
case 0x16:
xScroll = (val & 0x07);
columnSelect = ((val & 0x08) != 0);
multiColorMode = ((val & 0x10) != 0);
reset = ((val & 0x20) != 0);
return;
case 0x17:
sprites[0].ExpandY = ((val & 0x01) != 0);
sprites[1].ExpandY = ((val & 0x02) != 0);
sprites[2].ExpandY = ((val & 0x04) != 0);
sprites[3].ExpandY = ((val & 0x08) != 0);
sprites[4].ExpandY = ((val & 0x10) != 0);
sprites[5].ExpandY = ((val & 0x20) != 0);
sprites[6].ExpandY = ((val & 0x40) != 0);
sprites[7].ExpandY = ((val & 0x80) != 0);
return;
case 0x18:
videoMemory = (val & 0xF0) << 6;
characterBitmap = (val & 0x0E) << 10;
return;
case 0x19:
rasterInterrupt = ((val & 0x01) != 0);
dataCollisionInterrupt = ((val & 0x02) != 0);
spriteCollisionInterrupt = ((val & 0x04) != 0);
lightPenInterrupt = ((val & 0x08) != 0);
irq = ((val & 0x80) != 0);
return;
case 0x1A:
rasterInterruptEnable = ((val & 0x01) != 0);
dataCollisionInterruptEnable = ((val & 0x02) != 0);
spriteCollisionInterruptEnable = ((val & 0x04) != 0);
lightPenInterruptEnable = ((val & 0x08) != 0);
return;
case 0x1B:
sprites[0].Priority = ((val & 0x01) != 0);
sprites[1].Priority = ((val & 0x02) != 0);
sprites[2].Priority = ((val & 0x04) != 0);
sprites[3].Priority = ((val & 0x08) != 0);
sprites[4].Priority = ((val & 0x10) != 0);
sprites[5].Priority = ((val & 0x20) != 0);
sprites[6].Priority = ((val & 0x40) != 0);
sprites[7].Priority = ((val & 0x80) != 0);
return;
case 0x1C:
sprites[0].Multicolor = ((val & 0x01) != 0);
sprites[1].Multicolor = ((val & 0x02) != 0);
sprites[2].Multicolor = ((val & 0x04) != 0);
sprites[3].Multicolor = ((val & 0x08) != 0);
sprites[4].Multicolor = ((val & 0x10) != 0);
sprites[5].Multicolor = ((val & 0x20) != 0);
sprites[6].Multicolor = ((val & 0x40) != 0);
sprites[7].Multicolor = ((val & 0x80) != 0);
return;
case 0x1D:
sprites[0].ExpandX = ((val & 0x01) != 0);
sprites[1].ExpandX = ((val & 0x02) != 0);
sprites[2].ExpandX = ((val & 0x04) != 0);
sprites[3].ExpandX = ((val & 0x08) != 0);
sprites[4].ExpandX = ((val & 0x10) != 0);
sprites[5].ExpandX = ((val & 0x20) != 0);
sprites[6].ExpandX = ((val & 0x40) != 0);
sprites[7].ExpandX = ((val & 0x80) != 0);
return;
case 0x1E:
sprites[0].SpriteCollision = ((val & 0x01) != 0);
sprites[1].SpriteCollision = ((val & 0x02) != 0);
sprites[2].SpriteCollision = ((val & 0x04) != 0);
sprites[3].SpriteCollision = ((val & 0x08) != 0);
sprites[4].SpriteCollision = ((val & 0x10) != 0);
sprites[5].SpriteCollision = ((val & 0x20) != 0);
sprites[6].SpriteCollision = ((val & 0x40) != 0);
sprites[7].SpriteCollision = ((val & 0x80) != 0);
return;
case 0x1F:
sprites[0].DataCollision = ((val & 0x01) != 0);
sprites[1].DataCollision = ((val & 0x02) != 0);
sprites[2].DataCollision = ((val & 0x04) != 0);
sprites[3].DataCollision = ((val & 0x08) != 0);
sprites[4].DataCollision = ((val & 0x10) != 0);
sprites[5].DataCollision = ((val & 0x20) != 0);
sprites[6].DataCollision = ((val & 0x40) != 0);
sprites[7].DataCollision = ((val & 0x80) != 0);
return;
case 0x20: borderColor = val & 0x0F; return;
case 0x21: backgroundColor[0] = val & 0x0F; return;
case 0x22: backgroundColor[1] = val & 0x0F; return;
case 0x23: backgroundColor[2] = val & 0x0F; return;
case 0x24: backgroundColor[3] = val & 0x0F; return;
case 0x25: spriteMultiColor[0] = val & 0x0F; return;
case 0x26: spriteMultiColor[1] = val & 0x0F; return;
case 0x27: sprites[0].Color = val & 0x0F; return;
case 0x28: sprites[1].Color = val & 0x0F; return;
case 0x29: sprites[2].Color = val & 0x0F; return;
case 0x2A: sprites[3].Color = val & 0x0F; return;
case 0x2B: sprites[4].Color = val & 0x0F; return;
case 0x2C: sprites[5].Color = val & 0x0F; return;
case 0x2D: sprites[6].Color = val & 0x0F; return;
case 0x2E: sprites[7].Color = val & 0x0F; return;
default: return;
}
}
public void PokeByte(int addr, byte val)
{
Poke(addr, val);
}
public void PokeByte(int addr, byte val)
{
Poke(addr, val);
}
public int Read(int addr)
{
int result;
addr &= 0x3F;
public int Read(int addr)
{
int result;
addr &= 0x3F;
switch (addr)
{
case 0x1E:
case 0x1F:
result = Peek(addr);
Poke(addr, 0);
return result;
default:
return Peek(addr & 0x3F);
}
}
switch (addr)
{
case 0x1E:
case 0x1F:
result = Peek(addr);
Poke(addr, 0);
return result;
default:
return Peek(addr & 0x3F);
}
}
public byte ReadByte(int addr)
{
return (byte)(Read(addr) & 0xFF);
}
public byte ReadByte(int addr)
{
return (byte)(Read(addr) & 0xFF);
}
public void Write(int addr, int val)
{
addr &= 0x3F;
val &= 0xFF;
switch (addr)
{
case 0x19:
if ((val & 0x01) != 0)
rasterInterrupt = false;
if ((val & 0x02) != 0)
dataCollisionInterrupt = false;
if ((val & 0x04) != 0)
spriteCollisionInterrupt = false;
if ((val & 0x08) != 0)
lightPenInterrupt = false;
return;
case 0x1E:
case 0x1F:
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3A:
case 0x3B:
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
return;
default:
Poke(addr, val);
return;
}
}
public void Write(int addr, int val)
{
addr &= 0x3F;
val &= 0xFF;
switch (addr)
{
case 0x19:
if ((val & 0x01) != 0)
rasterInterrupt = false;
if ((val & 0x02) != 0)
dataCollisionInterrupt = false;
if ((val & 0x04) != 0)
spriteCollisionInterrupt = false;
if ((val & 0x08) != 0)
lightPenInterrupt = false;
return;
case 0x1E:
case 0x1F:
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3A:
case 0x3B:
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
return;
default:
Poke(addr, val);
return;
}
}
public void WriteByte(int addr, byte val)
{
Write(addr, val);
}
}
public void WriteByte(int addr, byte val)
{
Write(addr, val);
}
}
}

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public class VicSettings
{
}
sealed public class VicSettings
{
}
}

View File

@ -5,123 +5,123 @@ using System.Text;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
const int SPRITE_DATA_00 = 0;
const int SPRITE_DATA_01 = 0x400000;
const int SPRITE_DATA_10 = SPRITE_DATA_01 << 1;
const int SPRITE_DATA_11 = SPRITE_DATA_01 | SPRITE_DATA_10;
const int SPRITE_DATA_OUTPUT_MASK = SPRITE_DATA_11;
sealed class Sprite
{
public bool CrunchMC;
public bool CrunchX;
public bool CrunchY;
public bool Display;
public int ShiftRegister;
public bool ShiftRegisterEnable;
sealed public partial class Vic
{
const int SPRITE_DATA_00 = 0;
const int SPRITE_DATA_01 = 0x400000;
const int SPRITE_DATA_10 = SPRITE_DATA_01 << 1;
const int SPRITE_DATA_11 = SPRITE_DATA_01 | SPRITE_DATA_10;
const int SPRITE_DATA_OUTPUT_MASK = SPRITE_DATA_11;
public int Color;
public bool DataCollision;
public bool Enabled;
public bool ExpandX;
public bool ExpandY;
public bool Multicolor;
public bool Priority;
public bool SpriteCollision;
public int X;
public int Y;
sealed class Sprite
{
public bool CrunchMC;
public bool CrunchX;
public bool CrunchY;
public bool Display;
public int ShiftRegister;
public bool ShiftRegisterEnable;
public Sprite()
{
}
public int Color;
public bool DataCollision;
public bool Enabled;
public bool ExpandX;
public bool ExpandY;
public bool Multicolor;
public bool Priority;
public bool SpriteCollision;
public int X;
public int Y;
public void Clock()
{
}
public Sprite()
{
}
public void LoadP(int value)
{
}
public void Clock()
{
}
public void LoadS(int value)
{
}
}
public void LoadP(int value)
{
}
Sprite s_CollideSprite;
int s_Data;
bool s_OutData;
int s_OutPixel;
bool s_Priority;
Sprite[] sprites;
public void LoadS(int value)
{
}
}
void RenderSprites()
{
s_OutData = false;
s_CollideSprite = null;
Sprite s_CollideSprite;
int s_Data;
bool s_OutData;
int s_OutPixel;
bool s_Priority;
Sprite[] sprites;
foreach (Sprite sprite in sprites)
{
if (sprite.Display && rasterX == sprite.X)
sprite.ShiftRegisterEnable = true;
void RenderSprites()
{
s_OutData = false;
s_CollideSprite = null;
if (sprite.ShiftRegisterEnable)
{
if (sprite.ShiftRegister == 0)
{
sprite.ShiftRegisterEnable = false;
sprite.CrunchMC = true;
sprite.CrunchX = true;
}
else
{
sprite.CrunchX = !sprite.CrunchX || !sprite.ExpandX;
if (sprite.CrunchX)
sprite.CrunchMC = !sprite.CrunchMC || !sprite.Multicolor;
foreach (Sprite sprite in sprites)
{
if (sprite.Display && rasterX == sprite.X)
sprite.ShiftRegisterEnable = true;
if (sprite.Multicolor)
s_Data = sprite.ShiftRegister & SPRITE_DATA_11;
else
s_Data = (sprite.ShiftRegister << 1) & SPRITE_DATA_10;
if (sprite.ShiftRegisterEnable)
{
if (sprite.ShiftRegister == 0)
{
sprite.ShiftRegisterEnable = false;
sprite.CrunchMC = true;
sprite.CrunchX = true;
}
else
{
sprite.CrunchX = !sprite.CrunchX || !sprite.ExpandX;
if (sprite.CrunchX)
sprite.CrunchMC = !sprite.CrunchMC || !sprite.Multicolor;
if (s_CollideSprite == null)
{
if (s_Data == SPRITE_DATA_10)
s_OutPixel = sprite.Color;
else if (s_Data == SPRITE_DATA_01)
s_OutPixel = spriteMultiColor[0];
else if (s_Data == SPRITE_DATA_11)
s_OutPixel = spriteMultiColor[1];
if (sprite.Multicolor)
s_Data = sprite.ShiftRegister & SPRITE_DATA_11;
else
s_Data = (sprite.ShiftRegister << 1) & SPRITE_DATA_10;
if (s_Data != SPRITE_DATA_00)
{
s_CollideSprite = sprite;
s_OutData = true;
s_Priority = sprite.Priority;
}
}
else if (s_Data != SPRITE_DATA_00)
{
s_CollideSprite.SpriteCollision = true;
sprite.SpriteCollision = true;
spriteCollisionInterrupt = true;
}
if (s_CollideSprite == null)
{
if (s_Data == SPRITE_DATA_10)
s_OutPixel = sprite.Color;
else if (s_Data == SPRITE_DATA_01)
s_OutPixel = spriteMultiColor[0];
else if (s_Data == SPRITE_DATA_11)
s_OutPixel = spriteMultiColor[1];
if (s_Data != SPRITE_DATA_00 && g_OutData >= GRAPHICS_DATA_10)
{
sprite.DataCollision = true;
dataCollisionInterrupt = true;
}
if (s_Data != SPRITE_DATA_00)
{
s_CollideSprite = sprite;
s_OutData = true;
s_Priority = sprite.Priority;
}
}
else if (s_Data != SPRITE_DATA_00)
{
s_CollideSprite.SpriteCollision = true;
sprite.SpriteCollision = true;
spriteCollisionInterrupt = true;
}
if (sprite.CrunchMC && sprite.CrunchX)
sprite.ShiftRegister <<= sprite.Multicolor ? 2 : 1;
}
}
}
}
}
if (s_Data != SPRITE_DATA_00 && g_OutData >= GRAPHICS_DATA_10)
{
sprite.DataCollision = true;
dataCollisionInterrupt = true;
}
if (sprite.CrunchMC && sprite.CrunchX)
sprite.ShiftRegister <<= sprite.Multicolor ? 2 : 1;
}
}
}
}
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{

View File

@ -3,28 +3,28 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic
{
int v_Pixel;
sealed public partial class Vic
{
int v_Pixel;
public void Render()
{
RenderGraphics();
RenderSprites();
public void Render()
{
RenderGraphics();
RenderSprites();
if (s_OutData && (!s_Priority || g_OutData < GRAPHICS_DATA_10))
{
if (s_Priority && g_OutData < GRAPHICS_DATA_10)
v_Pixel = s_OutPixel;
else
v_Pixel = g_OutPixel;
}
else
{
v_Pixel = g_OutPixel;
}
}
}
if (s_OutData && (!s_Priority || g_OutData < GRAPHICS_DATA_10))
{
if (s_Priority && g_OutData < GRAPHICS_DATA_10)
v_Pixel = s_OutPixel;
else
v_Pixel = g_OutPixel;
}
else
{
v_Pixel = g_OutPixel;
}
}
}
}

View File

@ -6,81 +6,81 @@ using System.Text;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
#pragma warning disable 169 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public class VicColumnState
{
public VicBAType BA;
public VicFetchType Fetch;
public bool HBlank;
public int RasterX;
}
sealed public class VicColumnState
{
public VicBAType BA;
public VicFetchType Fetch;
public bool HBlank;
public int RasterX;
}
public enum VicActType
{
None,
SpriteDMA,
SpriteExpandY,
RCAdvance,
RasterAdvance,
RasterAdvanceBottom,
VCReset,
}
public enum VicActType
{
None,
SpriteDMA,
SpriteExpandY,
RCAdvance,
RasterAdvance,
RasterAdvanceBottom,
VCReset,
}
public enum VicBAType
{
None,
Badline,
Sprite0,
Sprite01,
Sprite012,
Sprite12,
Sprite123,
Sprite23,
Sprite234,
Sprite34,
Sprite345,
Sprite45,
Sprite456,
Sprite56,
Sprite567,
Sprite67,
Sprite7
}
public enum VicBAType
{
None,
Badline,
Sprite0,
Sprite01,
Sprite012,
Sprite12,
Sprite123,
Sprite23,
Sprite234,
Sprite34,
Sprite345,
Sprite45,
Sprite456,
Sprite56,
Sprite567,
Sprite67,
Sprite7
}
public enum VicFetchType
{
None,
Graphics,
Color,
Idle,
Refresh,
Sprite,
Pointer
}
public enum VicFetchType
{
None,
Graphics,
Color,
Idle,
Refresh,
Sprite,
Pointer
}
public enum VicRowType
{
None,
ScreenVisible,
ScreenBlank,
ResetVCBase
}
public enum VicRowType
{
None,
ScreenVisible,
ScreenBlank,
ResetVCBase
}
sealed public class VicTiming
{
public int ColumnCount;
public int DelayColumn;
public int RasterAdvanceColumn;
public int RasterCount;
public int RasterWidth;
}
sealed public partial class Vic
{
int frequency;
VicColumnState[] pipelineColumns;
VicRowType[] pipelineRows;
int rasterCount;
int rasterWidth;
}
sealed public class VicTiming
{
public int ColumnCount;
public int DelayColumn;
public int RasterAdvanceColumn;
public int RasterCount;
public int RasterWidth;
}
sealed public partial class Vic
{
int frequency;
VicColumnState[] pipelineColumns;
VicRowType[] pipelineRows;
int rasterCount;
int rasterWidth;
}
}

View File

@ -8,7 +8,7 @@ using BizHawk.Emulation.Common;
#pragma warning disable 649 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
sealed public partial class Vic : IVideoProvider
{

View File

@ -1,59 +1,58 @@
using BizHawk.Emulation.Computers.Commodore64.Experimental.Chips.Internals;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental.Chips
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
static public class ChipPresets
{
static public Cia Cia6526(bool todJumper) { return new Cia(Settings6526(todJumper)); }
static public Cia Cia6526A(bool todJumper) { return new Cia(Settings6526A(todJumper)); }
static public Cpu Cpu6510() { return new Cpu(); }
static public Ram Ram2114() { return new Ram(0x1000, 0x0FFF, 0x0F); }
static public Ram Ram4864() { return new Ram(0x10000, 0xFFFF, 0xFF); }
static public Rom Rom2332(byte[] data) { return new Rom(0x1000, 0xFFF, data); }
static public Rom Rom2364(byte[] data) { return new Rom(0x2000, 0x1FFF, data); }
static public Sid Sid6581() { return new Sid(Settings6581()); }
static public Sid Sid8580() { return new Sid(Settings8580()); }
static public Vic Vic6567() { return new Vic(Settings6567()); }
static public Vic Vic6569() { return new Vic(Settings6569()); }
static public class ChipPresets
{
static public Cia Cia6526(bool todJumper) { return new Cia(Settings6526(todJumper)); }
static public Cia Cia6526A(bool todJumper) { return new Cia(Settings6526A(todJumper)); }
static public Cpu Cpu6510() { return new Cpu(); }
static public Ram Ram2114() { return new Ram(0x1000, 0x0FFF, 0x0F); }
static public Ram Ram4864() { return new Ram(0x10000, 0xFFFF, 0xFF); }
static public Rom Rom2332(byte[] data) { return new Rom(0x1000, 0xFFF, data); }
static public Rom Rom2364(byte[] data) { return new Rom(0x2000, 0x1FFF, data); }
static public Sid Sid6581() { return new Sid(Settings6581()); }
static public Sid Sid8580() { return new Sid(Settings8580()); }
static public Vic Vic6567() { return new Vic(Settings6567()); }
static public Vic Vic6569() { return new Vic(Settings6569()); }
static private CiaSettings Settings6526(bool todJumper)
{
CiaSettings result = new CiaSettings();
return result;
}
static private CiaSettings Settings6526(bool todJumper)
{
CiaSettings result = new CiaSettings();
return result;
}
static private CiaSettings Settings6526A(bool todJumper)
{
CiaSettings result = new CiaSettings();
return result;
}
static private CiaSettings Settings6526A(bool todJumper)
{
CiaSettings result = new CiaSettings();
return result;
}
static private VicSettings Settings6567()
{
VicSettings result = new VicSettings();
return result;
}
static private VicSettings Settings6567()
{
VicSettings result = new VicSettings();
return result;
}
static private VicSettings Settings6569()
{
VicSettings result = new VicSettings();
return result;
}
static private VicSettings Settings6569()
{
VicSettings result = new VicSettings();
return result;
}
static private SidSettings Settings6581()
{
SidSettings result = new SidSettings();
return result;
}
static private SidSettings Settings6581()
{
SidSettings result = new SidSettings();
return result;
}
static private SidSettings Settings8580()
{
SidSettings result = new SidSettings();
return result;
}
}
static private SidSettings Settings8580()
{
SidSettings result = new SidSettings();
return result;
}
}
}

View File

@ -3,30 +3,30 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.Experimental
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Experimental
{
public interface IMotherboard
{
void ExecuteFrame();
public interface IMotherboard
{
void ExecuteFrame();
byte PeekBasicRom(int addr);
byte PeekCartridge(int addr);
byte PeekCharRom(int addr);
byte PeekCpu(int addr);
byte PeekKernalRom(int addr);
byte PeekRam(int addr);
byte PeekSerial(int addr);
byte PeekSid(int addr);
byte PeekVic(int addr);
byte PeekBasicRom(int addr);
byte PeekCartridge(int addr);
byte PeekCharRom(int addr);
byte PeekCpu(int addr);
byte PeekKernalRom(int addr);
byte PeekRam(int addr);
byte PeekSerial(int addr);
byte PeekSid(int addr);
byte PeekVic(int addr);
void PokeBasicRom(int addr, byte val);
void PokeCartridge(int addr, byte val);
void PokeCharRom(int addr, byte val);
void PokeCpu(int addr, byte val);
void PokeKernalRom(int addr, byte val);
void PokeRam(int addr, byte val);
void PokeSerial(int addr, byte val);
void PokeSid(int addr, byte val);
void PokeVic(int addr, byte val);
}
void PokeBasicRom(int addr, byte val);
void PokeCartridge(int addr, byte val);
void PokeCharRom(int addr, byte val);
void PokeCpu(int addr, byte val);
void PokeKernalRom(int addr, byte val);
void PokeRam(int addr, byte val);
void PokeSerial(int addr, byte val);
void PokeSid(int addr, byte val);
void PokeVic(int addr, byte val);
}
}

View File

@ -3,11 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public struct InputFileInfo
{
public byte[] Data;
public string Extension;
}
public struct InputFileInfo
{
public byte[] Data;
public string Extension;
}
}

View File

@ -1,9 +1,7 @@
using System;
using BizHawk.Common;
using BizHawk.Emulation.Computers.Commodore64.Cartridge;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public class CartridgePort
{

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class CassettePort
{

View File

@ -1,6 +1,6 @@
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// used as Color RAM in C64

View File

@ -1,24 +1,24 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// ROM chips
// 2332: 32 kbit (4kbyte)
// 2364: 64 kbit (8kbyte)
// 23128: 128 kbit (16kbyte)
public enum Chip23XXmodel
public enum Chip23XXmodel
{
Chip2332,
Chip2364,
Chip23128
}
sealed public class Chip23XX
sealed public class Chip23XX
{
int addrMask;
byte[] rom;
int addrMask;
byte[] rom;
public Chip23XX(Chip23XXmodel model, byte[] data)
{
@ -55,6 +55,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
public void SyncState(Serializer ser)
{
SaveState.SyncObject(ser, this);
}
}
}
}

View File

@ -1,6 +1,6 @@
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// DRAM for the c64
// 4164 = 64 kbit

View File

@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// an extension of the 6502 processor

View File

@ -1,7 +1,7 @@
using System;
#if false
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// via
public class MOS6522 : Timer

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// MOS technology 6526 "CIA"
//
@ -9,11 +9,11 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
// * CS, R/W and RS# pins are not emulated. (not needed)
// * A low RES pin is emulated via HardReset().
sealed public class MOS6526
sealed public class MOS6526
{
// ------------------------------------
enum InMode
enum InMode
{
Phase2,
CNT,
@ -21,36 +21,36 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
TimerAUnderflowCNT
}
enum OutMode
enum OutMode
{
Pulse,
Toggle
}
enum RunMode
enum RunMode
{
Continuous,
Oneshot
}
enum SPMode
enum SPMode
{
Input,
Output
}
static byte[] PBOnBit = new byte[] { 0x40, 0x80 };
static byte[] PBOnMask = new byte[] { 0xBF, 0x7F };
static byte[] PBOnBit = new byte[] { 0x40, 0x80 };
static byte[] PBOnMask = new byte[] { 0xBF, 0x7F };
// ------------------------------------
public Func<bool> ReadCNT;
public Func<bool> ReadFlag;
public Func<bool> ReadSP;
public Func<bool> ReadCNT;
public Func<bool> ReadFlag;
public Func<bool> ReadSP;
// ------------------------------------
// ------------------------------------
bool alarmSelect;
bool alarmSelect;
Region chipRegion;
bool cntPos;
bool enableIntAlarm;
@ -62,9 +62,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
bool intSP;
bool[] intTimer;
bool pinCnt;
bool pinCntLast;
bool pinPC;
bool pinSP;
bool pinCntLast;
bool pinPC;
bool pinSP;
byte sr;
int[] timerDelay;
InMode[] timerInMode;
@ -98,47 +98,47 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
todAlarm = new byte[4];
SetTodIn(chipRegion);
portA = new LatchedPort();
portB = new LatchedPort();
timer = new int[2];
timerLatch = new int[2];
timerOn = new bool[2];
underflow = new bool[2];
portA = new LatchedPort();
portB = new LatchedPort();
timer = new int[2];
timerLatch = new int[2];
timerOn = new bool[2];
underflow = new bool[2];
pinSP = true;
}
pinSP = true;
}
// ------------------------------------
public void ExecutePhase1()
{
// unsure if the timer actually operates in ph1
pinIRQ = !(
(intTimer[0] && enableIntTimer[0]) ||
(intTimer[1] && enableIntTimer[1]) ||
(intAlarm && enableIntAlarm) ||
(intSP && enableIntSP) ||
(intFlag && enableIntFlag)
);
}
pinIRQ = !(
(intTimer[0] && enableIntTimer[0]) ||
(intTimer[1] && enableIntTimer[1]) ||
(intAlarm && enableIntAlarm) ||
(intSP && enableIntSP) ||
(intFlag && enableIntFlag)
);
}
public void ExecutePhase2()
{
{
bool sumCnt = ReadCNT();
cntPos |= (!pinCntLast && sumCnt);
pinCntLast = sumCnt;
bool sumCnt = ReadCNT();
cntPos |= (!pinCntLast && sumCnt);
pinCntLast = sumCnt;
pinPC = true;
TODRun();
pinPC = true;
TODRun();
if (timerPulse[0])
{
portA.Latch &= PBOnMask[0];
portA.Latch &= PBOnMask[0];
}
if (timerPulse[1])
{
portB.Latch &= PBOnMask[1];
portB.Latch &= PBOnMask[1];
}
if (timerDelay[0] == 0)
@ -209,7 +209,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
pinCnt = false;
pinPC = true;
}
}
private void SetTodIn(Region region)
{
@ -230,7 +230,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
private byte BCDAdd(byte i, byte j, out bool overflow)
{
{
int lo;
int hi;
@ -255,13 +255,13 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
private void TimerRun(int index)
{
{
if (timerOn[index])
{
int t = timer[index];
bool u = false;
{
switch (timerInMode[index])
{
@ -270,8 +270,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
if (cntPos)
{
t--;
u = (t == 0);
intTimer[index] |= (t == 0);
u = (t == 0);
intTimer[index] |= (t == 0);
}
break;
case InMode.Phase2:
@ -285,8 +285,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
if (underflow[0])
{
t--;
u = (t == 0);
intTimer[index] |= (t == 0);
u = (t == 0);
intTimer[index] |= (t == 0);
}
break;
case InMode.TimerAUnderflowCNT:
@ -294,8 +294,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
if (underflow[0] && pinCnt)
{
t--;
u = (t == 0);
intTimer[index] |= (t == 0);
u = (t == 0);
intTimer[index] |= (t == 0);
}
break;
}
@ -303,23 +303,23 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
// underflow?
if (u)
{
timerDelay[index] = 1;
t = timerLatch[index];
timerDelay[index] = 1;
t = timerLatch[index];
if (timerRunMode[index] == RunMode.Oneshot)
timerOn[index] = false;
if (timerPortEnable[index])
{
// force port B bit to output
portB.Direction |= PBOnBit[index];
portB.Direction |= PBOnBit[index];
switch (timerOutMode[index])
{
case OutMode.Pulse:
timerPulse[index] = true;
portB.Latch |= PBOnBit[index];
portB.Latch |= PBOnBit[index];
break;
case OutMode.Toggle:
portB.Latch ^= PBOnBit[index];
portB.Latch ^= PBOnBit[index];
break;
}
}
@ -334,7 +334,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
private void TODRun()
{
{
bool todV;
@ -416,15 +416,15 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
return val;
}
public bool ReadCNTBuffer()
{
return pinCnt;
}
public bool ReadCNTBuffer()
{
return pinCnt;
}
public bool ReadPCBuffer()
{
return pinPC;
}
public bool ReadPCBuffer()
{
return pinPC;
}
private byte ReadRegister(int addr)
{
@ -440,10 +440,10 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
val = (byte)(portB.ReadInput(ReadPortB()) & PortBMask);
break;
case 0x2:
val = portA.Direction;
val = portA.Direction;
break;
case 0x3:
val = portB.Direction;
val = portB.Direction;
break;
case 0x4:
timerVal = ReadTimerValue(0);
@ -527,10 +527,10 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
return val;
}
public bool ReadSPBuffer()
{
return pinSP;
}
public bool ReadSPBuffer()
{
return pinSP;
}
private int ReadTimerValue(int index)
{
@ -549,7 +549,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
public void SyncState(Serializer ser)
{
SaveState.SyncObject(ser, this);
SaveState.SyncObject(ser, this);
}
public void Write(int addr, byte val)
@ -602,16 +602,16 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
switch (addr)
{
case 0x0:
portA.Latch = val;
portA.Latch = val;
break;
case 0x1:
portB.Latch = val;
portB.Latch = val;
break;
case 0x2:
portA.Direction = val;
portA.Direction = val;
break;
case 0x3:
portB.Direction = val;
portB.Direction = val;
break;
case 0x4:
timerLatch[0] &= 0xFF00;
@ -707,13 +707,13 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
// ------------------------------------
public byte PortAMask = 0xFF;
public byte PortBMask = 0xFF;
public byte PortAMask = 0xFF;
public byte PortBMask = 0xFF;
bool pinIRQ;
LatchedPort portA;
LatchedPort portB;
int[] timer;
LatchedPort portA;
LatchedPort portB;
int[] timer;
int[] timerLatch;
bool[] timerOn;
bool[] underflow;
@ -730,54 +730,54 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
pinIRQ = true;
}
public byte PortAData
{
get
{
return portA.ReadOutput();
}
}
public byte PortAData
{
get
{
return portA.ReadOutput();
}
}
public byte PortADirection
{
get
{
return portA.Direction;
}
}
public byte PortADirection
{
get
{
return portA.Direction;
}
}
public byte PortALatch
{
get
{
return portA.Latch;
}
}
public byte PortALatch
{
get
{
return portA.Latch;
}
}
public byte PortBData
{
get
{
return portB.ReadOutput();
}
}
public byte PortBData
{
get
{
return portB.ReadOutput();
}
}
public byte PortBDirection
{
get
{
return portB.Direction;
}
}
public byte PortBDirection
{
get
{
return portB.Direction;
}
}
public byte PortBLatch
{
get
{
return portB.Latch;
}
}
public byte PortBLatch
{
get
{
return portB.Latch;
}
}
public bool ReadIRQBuffer() { return pinIRQ; }
}
public bool ReadIRQBuffer() { return pinIRQ; }
}
}

View File

@ -1,25 +1,25 @@
using System.Drawing;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// vic ntsc
static public class MOS6567
{
static int cycles = 65;
static int scanwidth = cycles * 8;
static int lines = 263;
static int vblankstart = 0x00D % lines;
static int vblankend = 0x018 % lines;
static int hblankoffset = 20;
static int hblankstart = (0x18C + hblankoffset) % scanwidth;
static int hblankend = (0x1F0 + hblankoffset) % scanwidth;
static int cycles = 65;
static int scanwidth = cycles * 8;
static int lines = 263;
static int vblankstart = 0x00D % lines;
static int vblankend = 0x018 % lines;
static int hblankoffset = 20;
static int hblankstart = (0x18C + hblankoffset) % scanwidth;
static int hblankend = (0x1F0 + hblankoffset) % scanwidth;
static int[] timing = Vic.TimingBuilder_XRaster(0x19C, 0x200, scanwidth, 0x18C, 8);
static int[] fetch = Vic.TimingBuilder_Fetch(timing, 0x174);
static int[] ba = Vic.TimingBuilder_BA(fetch);
static int[] act = Vic.TimingBuilder_Act(timing, 0x004, 0x14C, hblankstart, hblankend);
static int[] timing = Vic.TimingBuilder_XRaster(0x19C, 0x200, scanwidth, 0x18C, 8);
static int[] fetch = Vic.TimingBuilder_Fetch(timing, 0x174);
static int[] ba = Vic.TimingBuilder_BA(fetch);
static int[] act = Vic.TimingBuilder_Act(timing, 0x004, 0x14C, hblankstart, hblankend);
static int[][] pipeline = new int[][]
static int[][] pipeline = new int[][]
{
timing,
fetch,
@ -27,15 +27,15 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
act
};
static public Vic Create()
{
return new Vic(
cycles, lines,
pipeline,
14318181 / 14,
hblankstart, hblankend,
vblankstart, vblankend
);
}
static public Vic Create()
{
return new Vic(
cycles, lines,
pipeline,
14318181 / 14,
hblankstart, hblankend,
vblankstart, vblankend
);
}
}
}

View File

@ -1,41 +1,41 @@
using System.Drawing;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// vic pal
static public class MOS6569
{
static int cycles = 63;
static int scanwidth = cycles * 8;
static int lines = 312;
static int vblankstart = 0x12C % lines;
static int vblankend = 0x00F % lines;
static int hblankoffset = 20;
static int hblankstart = (0x17C + hblankoffset) % scanwidth;
static int hblankend = (0x1E0 + hblankoffset) % scanwidth;
static int cycles = 63;
static int scanwidth = cycles * 8;
static int lines = 312;
static int vblankstart = 0x12C % lines;
static int vblankend = 0x00F % lines;
static int hblankoffset = 20;
static int hblankstart = (0x17C + hblankoffset) % scanwidth;
static int hblankend = (0x1E0 + hblankoffset) % scanwidth;
static int[] timing = Vic.TimingBuilder_XRaster(0x194, 0x1F8, scanwidth, -1, -1);
static int[] fetch = Vic.TimingBuilder_Fetch(timing, 0x164);
static int[] ba = Vic.TimingBuilder_BA(fetch);
static int[] act = Vic.TimingBuilder_Act(timing, 0x004, 0x14C, hblankstart, hblankend);
static int[] timing = Vic.TimingBuilder_XRaster(0x194, 0x1F8, scanwidth, -1, -1);
static int[] fetch = Vic.TimingBuilder_Fetch(timing, 0x164);
static int[] ba = Vic.TimingBuilder_BA(fetch);
static int[] act = Vic.TimingBuilder_Act(timing, 0x004, 0x14C, hblankstart, hblankend);
static int[][] pipeline = new int[][]
static int[][] pipeline = new int[][]
{
timing,
fetch,
ba,
act
act
};
static public Vic Create()
{
return new Vic(
cycles, lines,
pipeline,
17734472 / 18,
hblankstart, hblankend,
vblankstart, vblankend
);
}
static public Vic Create()
{
return new Vic(
cycles, lines,
pipeline,
17734472 / 18,
hblankstart, hblankend,
vblankstart, vblankend
);
}
}
}

View File

@ -1,9 +1,9 @@
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// sid
static public class MOS6581
{
static int[][] waveTable = new int[][]
static int[][] waveTable = new int[][]
{
new int[] {
0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF,

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// emulates the PLA
// which handles all bank switching

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public class LatchedPort
{

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// the functions on this port are at the point of
// view of an external device.

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Sid
{

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Sid
{

View File

@ -5,7 +5,7 @@ using BizHawk.Common;
#pragma warning disable 169 //adelikat: Disable dumb warnings until this file is complete
#pragma warning disable 219 //adelikat: Disable dumb warnings until this file is complete
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Sid
{

View File

@ -1,7 +1,7 @@
using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class UserPort
{

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
}
sealed public partial class Vic
{
}
}

View File

@ -3,256 +3,256 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
const int baResetCounter = 7;
const int pipelineUpdateVc = 1;
const int pipelineChkSprChunch = 2;
const int pipelineUpdateMcBase = 4;
const int pipelineChkBrdL1 = 8;
const int pipelineChkBrdL0 = 16;
const int pipelineChkSprDma = 32;
const int pipelineChkBrdR0 = 64;
const int pipelineChkSprExp = 128;
const int pipelineChkBrdR1 = 256;
const int pipelineChkSprDisp = 512;
const int pipelineUpdateRc = 1024;
const int pipelineHBlankL = 0x10000000;
const int pipelineHBlankR = 0x20000000;
const int pipelineHoldX = 0x40000000;
const int rasterIrqLine0Cycle = 1;
const int rasterIrqLineXCycle = 0;
sealed public partial class Vic
{
const int baResetCounter = 7;
const int pipelineUpdateVc = 1;
const int pipelineChkSprChunch = 2;
const int pipelineUpdateMcBase = 4;
const int pipelineChkBrdL1 = 8;
const int pipelineChkBrdL0 = 16;
const int pipelineChkSprDma = 32;
const int pipelineChkBrdR0 = 64;
const int pipelineChkSprExp = 128;
const int pipelineChkBrdR1 = 256;
const int pipelineChkSprDisp = 512;
const int pipelineUpdateRc = 1024;
const int pipelineHBlankL = 0x10000000;
const int pipelineHBlankR = 0x20000000;
const int pipelineHoldX = 0x40000000;
const int rasterIrqLine0Cycle = 1;
const int rasterIrqLineXCycle = 0;
int parseaddr;
int parsecycleBAsprite0;
int parsecycleBAsprite1;
int parsecycleBAsprite2;
int parsecycleFetchSpriteIndex;
int parsefetch;
int parsefetchType;
int parseba;
int parseact;
int parseaddr;
int parsecycleBAsprite0;
int parsecycleBAsprite1;
int parsecycleBAsprite2;
int parsecycleFetchSpriteIndex;
int parsefetch;
int parsefetchType;
int parseba;
int parseact;
private void ParseCycle()
{
{
parseaddr = 0x3FFF;
parsefetch = pipeline[1][cycleIndex];
parseba = pipeline[2][cycleIndex];
parseact = pipeline[3][cycleIndex];
private void ParseCycle()
{
{
parseaddr = 0x3FFF;
parsefetch = pipeline[1][cycleIndex];
parseba = pipeline[2][cycleIndex];
parseact = pipeline[3][cycleIndex];
// apply X location
rasterX = pipeline[0][cycleIndex];
rasterXHold = ((parseact & pipelineHoldX) != 0);
// apply X location
rasterX = pipeline[0][cycleIndex];
rasterXHold = ((parseact & pipelineHoldX) != 0);
// perform fetch
parsefetchType = parsefetch & 0xFF00;
if (parsefetchType == 0x100)
{
// fetch R
refreshCounter = (refreshCounter - 1) & 0xFF;
parseaddr = (0x3F00 | refreshCounter);
ReadMemory(parseaddr);
}
else if (parsefetchType == 0x200)
{
delayC = xScroll;
if (!idle)
{
if (badline)
{
parseaddr = (pointerVM | vc);
dataC = ReadMemory(parseaddr);
dataC |= ((int)ReadColorRam(parseaddr) & 0xF) << 8;
bufferC[vmli] = dataC;
}
else
{
dataC = bufferC[vmli];
}
}
else
{
dataC = 0;
bufferC[vmli] = dataC;
}
srC <<= 12;
srC |= dataC;
}
else if (parsefetchType == 0x300)
{
// fetch G
if (idle)
parseaddr = 0x3FFF;
else
{
if (bitmapMode)
parseaddr = (rc | (vc << 3) | ((pointerCB & 0x4) << 11));
else
parseaddr = (rc | ((dataC & 0xFF) << 3) | (pointerCB << 11));
}
if (extraColorMode)
parseaddr &= 0x39FF;
dataG = ReadMemory(parseaddr);
sr |= dataG << (7 - xScroll);
srSync |= 0xAA << (7 - xScroll);
if (!idle)
{
bufferG[vmli] = dataG;
vmli = (vmli + 1) & 0x3F;
vc = (vc + 1) & 0x3FF;
}
}
else if (parsefetchType == 0x400)
{
// fetch I
parseaddr = (extraColorMode ? 0x39FF : 0x3FFF);
dataG = ReadMemory(parseaddr);
}
else if (parsefetchType == 0x500)
{
// fetch none
}
else
{
parsecycleFetchSpriteIndex = (parsefetch & 0x7);
if ((parsefetch & 0xF0) == 0)
{
// fetch P
parseaddr = (0x3F8 | pointerVM | parsecycleFetchSpriteIndex);
sprites[parsecycleFetchSpriteIndex].pointer = ReadMemory(parseaddr);
sprites[parsecycleFetchSpriteIndex].shiftEnable = false;
}
else
{
// fetch S
if (sprites[parsecycleFetchSpriteIndex].dma)
{
SpriteGenerator spr = sprites[parsecycleFetchSpriteIndex];
parseaddr = (spr.mc | (spr.pointer << 6));
spr.sr <<= 8;
spr.sr |= ReadMemory(parseaddr);
spr.mc++;
}
}
}
// perform fetch
parsefetchType = parsefetch & 0xFF00;
if (parsefetchType == 0x100)
{
// fetch R
refreshCounter = (refreshCounter - 1) & 0xFF;
parseaddr = (0x3F00 | refreshCounter);
ReadMemory(parseaddr);
}
else if (parsefetchType == 0x200)
{
delayC = xScroll;
if (!idle)
{
if (badline)
{
parseaddr = (pointerVM | vc);
dataC = ReadMemory(parseaddr);
dataC |= ((int)ReadColorRam(parseaddr) & 0xF) << 8;
bufferC[vmli] = dataC;
}
else
{
dataC = bufferC[vmli];
}
}
else
{
dataC = 0;
bufferC[vmli] = dataC;
}
srC <<= 12;
srC |= dataC;
}
else if (parsefetchType == 0x300)
{
// fetch G
if (idle)
parseaddr = 0x3FFF;
else
{
if (bitmapMode)
parseaddr = (rc | (vc << 3) | ((pointerCB & 0x4) << 11));
else
parseaddr = (rc | ((dataC & 0xFF) << 3) | (pointerCB << 11));
}
if (extraColorMode)
parseaddr &= 0x39FF;
dataG = ReadMemory(parseaddr);
sr |= dataG << (7 - xScroll);
srSync |= 0xAA << (7 - xScroll);
if (!idle)
{
bufferG[vmli] = dataG;
vmli = (vmli + 1) & 0x3F;
vc = (vc + 1) & 0x3FF;
}
}
else if (parsefetchType == 0x400)
{
// fetch I
parseaddr = (extraColorMode ? 0x39FF : 0x3FFF);
dataG = ReadMemory(parseaddr);
}
else if (parsefetchType == 0x500)
{
// fetch none
}
else
{
parsecycleFetchSpriteIndex = (parsefetch & 0x7);
if ((parsefetch & 0xF0) == 0)
{
// fetch P
parseaddr = (0x3F8 | pointerVM | parsecycleFetchSpriteIndex);
sprites[parsecycleFetchSpriteIndex].pointer = ReadMemory(parseaddr);
sprites[parsecycleFetchSpriteIndex].shiftEnable = false;
}
else
{
// fetch S
if (sprites[parsecycleFetchSpriteIndex].dma)
{
SpriteGenerator spr = sprites[parsecycleFetchSpriteIndex];
parseaddr = (spr.mc | (spr.pointer << 6));
spr.sr <<= 8;
spr.sr |= ReadMemory(parseaddr);
spr.mc++;
}
}
}
// perform BA flag manipulation
if (parseba == 0x0000)
{
pinBA = true;
}
else if (parseba == 0x1000)
{
pinBA = !badline;
}
else
{
parsecycleBAsprite0 = (parseba & 0x000F);
parsecycleBAsprite1 = (parseba & 0x00F0) >> 4;
parsecycleBAsprite2 = (parseba & 0x0F00) >> 8;
if ((parsecycleBAsprite0 < 8 && sprites[parsecycleBAsprite0].dma) ||
(parsecycleBAsprite1 < 8 && sprites[parsecycleBAsprite1].dma) ||
(parsecycleBAsprite2 < 8 && sprites[parsecycleBAsprite2].dma))
pinBA = false;
else
pinBA = true;
}
// perform BA flag manipulation
if (parseba == 0x0000)
{
pinBA = true;
}
else if (parseba == 0x1000)
{
pinBA = !badline;
}
else
{
parsecycleBAsprite0 = (parseba & 0x000F);
parsecycleBAsprite1 = (parseba & 0x00F0) >> 4;
parsecycleBAsprite2 = (parseba & 0x0F00) >> 8;
if ((parsecycleBAsprite0 < 8 && sprites[parsecycleBAsprite0].dma) ||
(parsecycleBAsprite1 < 8 && sprites[parsecycleBAsprite1].dma) ||
(parsecycleBAsprite2 < 8 && sprites[parsecycleBAsprite2].dma))
pinBA = false;
else
pinBA = true;
}
// perform actions
borderCheckLEnable = ((parseact & (pipelineChkBrdL0 | pipelineChkBrdL1)) != 0);
borderCheckREnable = ((parseact & (pipelineChkBrdR0 | pipelineChkBrdR1)) != 0);
hblankCheckEnableL = ((parseact & pipelineHBlankL) != 0);
hblankCheckEnableR = ((parseact & pipelineHBlankR) != 0);
// perform actions
borderCheckLEnable = ((parseact & (pipelineChkBrdL0 | pipelineChkBrdL1)) != 0);
borderCheckREnable = ((parseact & (pipelineChkBrdR0 | pipelineChkBrdR1)) != 0);
hblankCheckEnableL = ((parseact & pipelineHBlankL) != 0);
hblankCheckEnableR = ((parseact & pipelineHBlankR) != 0);
if (parseact != 0)
{
if ((parseact & pipelineChkSprChunch) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yCrunch)
spr.mcbase += 2;
spr.shiftEnable = false;
spr.xCrunch = !spr.xExpand;
spr.multicolorCrunch = !spr.multicolor;
}
}
if (parseact != 0)
{
if ((parseact & pipelineChkSprChunch) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yCrunch)
spr.mcbase += 2;
spr.shiftEnable = false;
spr.xCrunch = !spr.xExpand;
spr.multicolorCrunch = !spr.multicolor;
}
}
else if ((parseact & pipelineChkSprDisp) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
spr.mc = spr.mcbase;
if (spr.dma && spr.y == (rasterLine & 0xFF))
{
spr.display = true;
}
}
}
else if ((parseact & pipelineChkSprDisp) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
spr.mc = spr.mcbase;
if (spr.dma && spr.y == (rasterLine & 0xFF))
{
spr.display = true;
}
}
}
else if ((parseact & pipelineChkSprDma) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.enable && spr.y == (rasterLine & 0xFF) && !spr.dma)
{
spr.dma = true;
spr.mcbase = 0;
spr.yCrunch = !spr.yExpand;
}
}
}
else if ((parseact & pipelineChkSprDma) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.enable && spr.y == (rasterLine & 0xFF) && !spr.dma)
{
spr.dma = true;
spr.mcbase = 0;
spr.yCrunch = !spr.yExpand;
}
}
}
else if ((parseact & pipelineChkSprExp) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yExpand)
spr.yCrunch ^= true;
}
}
else if ((parseact & pipelineChkSprExp) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yExpand)
spr.yCrunch ^= true;
}
}
else if ((parseact & pipelineUpdateMcBase) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yCrunch)
{
spr.mcbase++;
if (spr.mcbase == 63)
{
spr.dma = false;
spr.display = false;
}
}
}
}
else if ((parseact & pipelineUpdateMcBase) != 0)
{
foreach (SpriteGenerator spr in sprites)
{
if (spr.yCrunch)
{
spr.mcbase++;
if (spr.mcbase == 63)
{
spr.dma = false;
spr.display = false;
}
}
}
}
else if ((parseact & pipelineUpdateRc) != 0)
{
if (rc == 7)
{
idle = true;
vcbase = vc;
}
if (!idle)
rc = (rc + 1) & 0x7;
}
else if ((parseact & pipelineUpdateRc) != 0)
{
if (rc == 7)
{
idle = true;
vcbase = vc;
}
if (!idle)
rc = (rc + 1) & 0x7;
}
else if ((parseact & pipelineUpdateVc) != 0)
{
vc = vcbase;
vmli = 0;
if (badline)
rc = 0;
}
}
else if ((parseact & pipelineUpdateVc) != 0)
{
vc = vcbase;
vmli = 0;
if (badline)
rc = 0;
}
}
cycleIndex++;
}
}
}
cycleIndex++;
}
}
}
}

View File

@ -3,496 +3,496 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
public byte Peek(int addr)
{
return ReadRegister((addr & 0x3F));
}
sealed public partial class Vic
{
public byte Peek(int addr)
{
return ReadRegister((addr & 0x3F));
}
public void Poke(int addr, byte val)
{
WriteRegister((addr & 0x3F), val);
}
public void Poke(int addr, byte val)
{
WriteRegister((addr & 0x3F), val);
}
public byte Read(int addr)
{
byte result;
addr &= 0x3F;
public byte Read(int addr)
{
byte result;
addr &= 0x3F;
switch (addr)
{
case 0x1E:
case 0x1F:
// reading clears these
result = ReadRegister(addr);
WriteRegister(addr, 0);
break;
default:
result = ReadRegister((addr & 0x3F));
break;
}
return result;
}
switch (addr)
{
case 0x1E:
case 0x1F:
// reading clears these
result = ReadRegister(addr);
WriteRegister(addr, 0);
break;
default:
result = ReadRegister((addr & 0x3F));
break;
}
return result;
}
private byte ReadRegister(int addr)
{
byte result = 0xFF; //unused bit value
private byte ReadRegister(int addr)
{
byte result = 0xFF; //unused bit value
switch (addr)
{
case 0x00:
case 0x02:
case 0x04:
case 0x06:
case 0x08:
case 0x0A:
case 0x0C:
case 0x0E:
result = (byte)(sprites[addr >> 1].x & 0xFF);
break;
case 0x01:
case 0x03:
case 0x05:
case 0x07:
case 0x09:
case 0x0B:
case 0x0D:
case 0x0F:
result = (byte)(sprites[addr >> 1].y & 0xFF);
break;
case 0x10:
result = (byte)(
((sprites[0].x >> 8) & 0x01) |
((sprites[1].x >> 7) & 0x02) |
((sprites[2].x >> 6) & 0x04) |
((sprites[3].x >> 5) & 0x08) |
((sprites[4].x >> 4) & 0x10) |
((sprites[5].x >> 3) & 0x20) |
((sprites[6].x >> 2) & 0x40) |
((sprites[7].x >> 1) & 0x80)
);
break;
case 0x11:
result = (byte)(
(yScroll & 0x7) |
(rowSelect ? 0x08 : 0x00) |
(displayEnable ? 0x10 : 0x00) |
(bitmapMode ? 0x20 : 0x00) |
(extraColorMode ? 0x40 : 0x00) |
((rasterLine & 0x100) >> 1)
);
break;
case 0x12:
result = (byte)(rasterLine & 0xFF);
break;
case 0x13:
result = (byte)(lightPenX & 0xFF);
break;
case 0x14:
result = (byte)(lightPenY & 0xFF);
break;
case 0x15:
result = (byte)(
(sprites[0].enable ? 0x01 : 0x00) |
(sprites[1].enable ? 0x02 : 0x00) |
(sprites[2].enable ? 0x04 : 0x00) |
(sprites[3].enable ? 0x08 : 0x00) |
(sprites[4].enable ? 0x10 : 0x00) |
(sprites[5].enable ? 0x20 : 0x00) |
(sprites[6].enable ? 0x40 : 0x00) |
(sprites[7].enable ? 0x80 : 0x00)
);
break;
case 0x16:
result &= 0xC0;
result |= (byte)(
(xScroll & 0x7) |
(columnSelect ? 0x08 : 0x00) |
(multicolorMode ? 0x10 : 0x00)
);
break;
case 0x17:
result = (byte)(
(sprites[0].yExpand ? 0x01 : 0x00) |
(sprites[1].yExpand ? 0x02 : 0x00) |
(sprites[2].yExpand ? 0x04 : 0x00) |
(sprites[3].yExpand ? 0x08 : 0x00) |
(sprites[4].yExpand ? 0x10 : 0x00) |
(sprites[5].yExpand ? 0x20 : 0x00) |
(sprites[6].yExpand ? 0x40 : 0x00) |
(sprites[7].yExpand ? 0x80 : 0x00)
);
break;
case 0x18:
result &= 0x01;
result |= (byte)(
((pointerVM & 0x3C00) >> 6) |
((pointerCB & 0x7) << 1)
);
break;
case 0x19:
result &= 0x70;
result |= (byte)(
(intRaster ? 0x01 : 0x00) |
(intSpriteDataCollision ? 0x02 : 0x00) |
(intSpriteCollision ? 0x04 : 0x00) |
(intLightPen ? 0x08 : 0x00) |
(pinIRQ ? 0x00 : 0x80)
);
break;
case 0x1A:
result &= 0xF0;
result |= (byte)(
(enableIntRaster ? 0x01 : 0x00) |
(enableIntSpriteDataCollision ? 0x02 : 0x00) |
(enableIntSpriteCollision ? 0x04 : 0x00) |
(enableIntLightPen ? 0x08 : 0x00)
);
break;
case 0x1B:
result = (byte)(
(sprites[0].priority ? 0x01 : 0x00) |
(sprites[1].priority ? 0x02 : 0x00) |
(sprites[2].priority ? 0x04 : 0x00) |
(sprites[3].priority ? 0x08 : 0x00) |
(sprites[4].priority ? 0x10 : 0x00) |
(sprites[5].priority ? 0x20 : 0x00) |
(sprites[6].priority ? 0x40 : 0x00) |
(sprites[7].priority ? 0x80 : 0x00)
);
break;
case 0x1C:
result = (byte)(
(sprites[0].multicolor ? 0x01 : 0x00) |
(sprites[1].multicolor ? 0x02 : 0x00) |
(sprites[2].multicolor ? 0x04 : 0x00) |
(sprites[3].multicolor ? 0x08 : 0x00) |
(sprites[4].multicolor ? 0x10 : 0x00) |
(sprites[5].multicolor ? 0x20 : 0x00) |
(sprites[6].multicolor ? 0x40 : 0x00) |
(sprites[7].multicolor ? 0x80 : 0x00)
);
break;
case 0x1D:
result = (byte)(
(sprites[0].xExpand ? 0x01 : 0x00) |
(sprites[1].xExpand ? 0x02 : 0x00) |
(sprites[2].xExpand ? 0x04 : 0x00) |
(sprites[3].xExpand ? 0x08 : 0x00) |
(sprites[4].xExpand ? 0x10 : 0x00) |
(sprites[5].xExpand ? 0x20 : 0x00) |
(sprites[6].xExpand ? 0x40 : 0x00) |
(sprites[7].xExpand ? 0x80 : 0x00)
);
break;
case 0x1E:
result = (byte)(
(sprites[0].collideSprite ? 0x01 : 0x00) |
(sprites[1].collideSprite ? 0x02 : 0x00) |
(sprites[2].collideSprite ? 0x04 : 0x00) |
(sprites[3].collideSprite ? 0x08 : 0x00) |
(sprites[4].collideSprite ? 0x10 : 0x00) |
(sprites[5].collideSprite ? 0x20 : 0x00) |
(sprites[6].collideSprite ? 0x40 : 0x00) |
(sprites[7].collideSprite ? 0x80 : 0x00)
);
break;
case 0x1F:
result = (byte)(
(sprites[0].collideData ? 0x01 : 0x00) |
(sprites[1].collideData ? 0x02 : 0x00) |
(sprites[2].collideData ? 0x04 : 0x00) |
(sprites[3].collideData ? 0x08 : 0x00) |
(sprites[4].collideData ? 0x10 : 0x00) |
(sprites[5].collideData ? 0x20 : 0x00) |
(sprites[6].collideData ? 0x40 : 0x00) |
(sprites[7].collideData ? 0x80 : 0x00)
);
break;
case 0x20:
result &= 0xF0;
result |= (byte)(borderColor & 0x0F);
break;
case 0x21:
result &= 0xF0;
result |= (byte)(backgroundColor0 & 0x0F);
break;
case 0x22:
result &= 0xF0;
result |= (byte)(backgroundColor1 & 0x0F);
break;
case 0x23:
result &= 0xF0;
result |= (byte)(backgroundColor2 & 0x0F);
break;
case 0x24:
result &= 0xF0;
result |= (byte)(backgroundColor3 & 0x0F);
break;
case 0x25:
result &= 0xF0;
result |= (byte)(spriteMulticolor0 & 0x0F);
break;
case 0x26:
result &= 0xF0;
result |= (byte)(spriteMulticolor1 & 0x0F);
break;
case 0x27:
case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2D:
case 0x2E:
result &= 0xF0;
result |= (byte)(sprites[addr - 0x27].color & 0xF);
break;
default:
// not connected
break;
}
switch (addr)
{
case 0x00:
case 0x02:
case 0x04:
case 0x06:
case 0x08:
case 0x0A:
case 0x0C:
case 0x0E:
result = (byte)(sprites[addr >> 1].x & 0xFF);
break;
case 0x01:
case 0x03:
case 0x05:
case 0x07:
case 0x09:
case 0x0B:
case 0x0D:
case 0x0F:
result = (byte)(sprites[addr >> 1].y & 0xFF);
break;
case 0x10:
result = (byte)(
((sprites[0].x >> 8) & 0x01) |
((sprites[1].x >> 7) & 0x02) |
((sprites[2].x >> 6) & 0x04) |
((sprites[3].x >> 5) & 0x08) |
((sprites[4].x >> 4) & 0x10) |
((sprites[5].x >> 3) & 0x20) |
((sprites[6].x >> 2) & 0x40) |
((sprites[7].x >> 1) & 0x80)
);
break;
case 0x11:
result = (byte)(
(yScroll & 0x7) |
(rowSelect ? 0x08 : 0x00) |
(displayEnable ? 0x10 : 0x00) |
(bitmapMode ? 0x20 : 0x00) |
(extraColorMode ? 0x40 : 0x00) |
((rasterLine & 0x100) >> 1)
);
break;
case 0x12:
result = (byte)(rasterLine & 0xFF);
break;
case 0x13:
result = (byte)(lightPenX & 0xFF);
break;
case 0x14:
result = (byte)(lightPenY & 0xFF);
break;
case 0x15:
result = (byte)(
(sprites[0].enable ? 0x01 : 0x00) |
(sprites[1].enable ? 0x02 : 0x00) |
(sprites[2].enable ? 0x04 : 0x00) |
(sprites[3].enable ? 0x08 : 0x00) |
(sprites[4].enable ? 0x10 : 0x00) |
(sprites[5].enable ? 0x20 : 0x00) |
(sprites[6].enable ? 0x40 : 0x00) |
(sprites[7].enable ? 0x80 : 0x00)
);
break;
case 0x16:
result &= 0xC0;
result |= (byte)(
(xScroll & 0x7) |
(columnSelect ? 0x08 : 0x00) |
(multicolorMode ? 0x10 : 0x00)
);
break;
case 0x17:
result = (byte)(
(sprites[0].yExpand ? 0x01 : 0x00) |
(sprites[1].yExpand ? 0x02 : 0x00) |
(sprites[2].yExpand ? 0x04 : 0x00) |
(sprites[3].yExpand ? 0x08 : 0x00) |
(sprites[4].yExpand ? 0x10 : 0x00) |
(sprites[5].yExpand ? 0x20 : 0x00) |
(sprites[6].yExpand ? 0x40 : 0x00) |
(sprites[7].yExpand ? 0x80 : 0x00)
);
break;
case 0x18:
result &= 0x01;
result |= (byte)(
((pointerVM & 0x3C00) >> 6) |
((pointerCB & 0x7) << 1)
);
break;
case 0x19:
result &= 0x70;
result |= (byte)(
(intRaster ? 0x01 : 0x00) |
(intSpriteDataCollision ? 0x02 : 0x00) |
(intSpriteCollision ? 0x04 : 0x00) |
(intLightPen ? 0x08 : 0x00) |
(pinIRQ ? 0x00 : 0x80)
);
break;
case 0x1A:
result &= 0xF0;
result |= (byte)(
(enableIntRaster ? 0x01 : 0x00) |
(enableIntSpriteDataCollision ? 0x02 : 0x00) |
(enableIntSpriteCollision ? 0x04 : 0x00) |
(enableIntLightPen ? 0x08 : 0x00)
);
break;
case 0x1B:
result = (byte)(
(sprites[0].priority ? 0x01 : 0x00) |
(sprites[1].priority ? 0x02 : 0x00) |
(sprites[2].priority ? 0x04 : 0x00) |
(sprites[3].priority ? 0x08 : 0x00) |
(sprites[4].priority ? 0x10 : 0x00) |
(sprites[5].priority ? 0x20 : 0x00) |
(sprites[6].priority ? 0x40 : 0x00) |
(sprites[7].priority ? 0x80 : 0x00)
);
break;
case 0x1C:
result = (byte)(
(sprites[0].multicolor ? 0x01 : 0x00) |
(sprites[1].multicolor ? 0x02 : 0x00) |
(sprites[2].multicolor ? 0x04 : 0x00) |
(sprites[3].multicolor ? 0x08 : 0x00) |
(sprites[4].multicolor ? 0x10 : 0x00) |
(sprites[5].multicolor ? 0x20 : 0x00) |
(sprites[6].multicolor ? 0x40 : 0x00) |
(sprites[7].multicolor ? 0x80 : 0x00)
);
break;
case 0x1D:
result = (byte)(
(sprites[0].xExpand ? 0x01 : 0x00) |
(sprites[1].xExpand ? 0x02 : 0x00) |
(sprites[2].xExpand ? 0x04 : 0x00) |
(sprites[3].xExpand ? 0x08 : 0x00) |
(sprites[4].xExpand ? 0x10 : 0x00) |
(sprites[5].xExpand ? 0x20 : 0x00) |
(sprites[6].xExpand ? 0x40 : 0x00) |
(sprites[7].xExpand ? 0x80 : 0x00)
);
break;
case 0x1E:
result = (byte)(
(sprites[0].collideSprite ? 0x01 : 0x00) |
(sprites[1].collideSprite ? 0x02 : 0x00) |
(sprites[2].collideSprite ? 0x04 : 0x00) |
(sprites[3].collideSprite ? 0x08 : 0x00) |
(sprites[4].collideSprite ? 0x10 : 0x00) |
(sprites[5].collideSprite ? 0x20 : 0x00) |
(sprites[6].collideSprite ? 0x40 : 0x00) |
(sprites[7].collideSprite ? 0x80 : 0x00)
);
break;
case 0x1F:
result = (byte)(
(sprites[0].collideData ? 0x01 : 0x00) |
(sprites[1].collideData ? 0x02 : 0x00) |
(sprites[2].collideData ? 0x04 : 0x00) |
(sprites[3].collideData ? 0x08 : 0x00) |
(sprites[4].collideData ? 0x10 : 0x00) |
(sprites[5].collideData ? 0x20 : 0x00) |
(sprites[6].collideData ? 0x40 : 0x00) |
(sprites[7].collideData ? 0x80 : 0x00)
);
break;
case 0x20:
result &= 0xF0;
result |= (byte)(borderColor & 0x0F);
break;
case 0x21:
result &= 0xF0;
result |= (byte)(backgroundColor0 & 0x0F);
break;
case 0x22:
result &= 0xF0;
result |= (byte)(backgroundColor1 & 0x0F);
break;
case 0x23:
result &= 0xF0;
result |= (byte)(backgroundColor2 & 0x0F);
break;
case 0x24:
result &= 0xF0;
result |= (byte)(backgroundColor3 & 0x0F);
break;
case 0x25:
result &= 0xF0;
result |= (byte)(spriteMulticolor0 & 0x0F);
break;
case 0x26:
result &= 0xF0;
result |= (byte)(spriteMulticolor1 & 0x0F);
break;
case 0x27:
case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2D:
case 0x2E:
result &= 0xF0;
result |= (byte)(sprites[addr - 0x27].color & 0xF);
break;
default:
// not connected
break;
}
return result;
}
return result;
}
public void Write(int addr, byte val)
{
addr &= 0x3F;
switch (addr)
{
case 0x19:
// interrupts are cleared by writing a 1
if ((val & 0x01) != 0)
intRaster = false;
if ((val & 0x02) != 0)
intSpriteDataCollision = false;
if ((val & 0x04) != 0)
intSpriteCollision = false;
if ((val & 0x08) != 0)
intLightPen = false;
UpdatePins();
break;
case 0x1A:
WriteRegister(addr, val);
break;
case 0x1E:
case 0x1F:
// can't write to these
break;
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3A:
case 0x3B:
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
// not connected
break;
default:
WriteRegister(addr, val);
break;
}
}
public void Write(int addr, byte val)
{
addr &= 0x3F;
switch (addr)
{
case 0x19:
// interrupts are cleared by writing a 1
if ((val & 0x01) != 0)
intRaster = false;
if ((val & 0x02) != 0)
intSpriteDataCollision = false;
if ((val & 0x04) != 0)
intSpriteCollision = false;
if ((val & 0x08) != 0)
intLightPen = false;
UpdatePins();
break;
case 0x1A:
WriteRegister(addr, val);
break;
case 0x1E:
case 0x1F:
// can't write to these
break;
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3A:
case 0x3B:
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
// not connected
break;
default:
WriteRegister(addr, val);
break;
}
}
private void WriteRegister(int addr, byte val)
{
switch (addr)
{
case 0x00:
case 0x02:
case 0x04:
case 0x06:
case 0x08:
case 0x0A:
case 0x0C:
case 0x0E:
sprites[addr >> 1].x &= 0x100;
sprites[addr >> 1].x |= val;
break;
case 0x01:
case 0x03:
case 0x05:
case 0x07:
case 0x09:
case 0x0B:
case 0x0D:
case 0x0F:
sprites[addr >> 1].y = val;
break;
case 0x10:
sprites[0].x = (sprites[0].x & 0xFF) | ((val & 0x01) << 8);
sprites[1].x = (sprites[1].x & 0xFF) | ((val & 0x02) << 7);
sprites[2].x = (sprites[2].x & 0xFF) | ((val & 0x04) << 6);
sprites[3].x = (sprites[3].x & 0xFF) | ((val & 0x08) << 5);
sprites[4].x = (sprites[4].x & 0xFF) | ((val & 0x10) << 4);
sprites[5].x = (sprites[5].x & 0xFF) | ((val & 0x20) << 3);
sprites[6].x = (sprites[6].x & 0xFF) | ((val & 0x40) << 2);
sprites[7].x = (sprites[7].x & 0xFF) | ((val & 0x80) << 1);
break;
case 0x11:
yScroll = (val & 0x07);
rowSelect = ((val & 0x08) != 0);
displayEnable = ((val & 0x10) != 0);
bitmapMode = ((val & 0x20) != 0);
extraColorMode = ((val & 0x40) != 0);
rasterInterruptLine &= 0xFF;
rasterInterruptLine |= (val & 0x80) << 1;
UpdateBorder();
UpdateVideoMode();
break;
case 0x12:
rasterInterruptLine &= 0x100;
rasterInterruptLine |= val;
break;
case 0x13:
lightPenX = val;
break;
case 0x14:
lightPenY = val;
break;
case 0x15:
sprites[0].enable = ((val & 0x01) != 0);
sprites[1].enable = ((val & 0x02) != 0);
sprites[2].enable = ((val & 0x04) != 0);
sprites[3].enable = ((val & 0x08) != 0);
sprites[4].enable = ((val & 0x10) != 0);
sprites[5].enable = ((val & 0x20) != 0);
sprites[6].enable = ((val & 0x40) != 0);
sprites[7].enable = ((val & 0x80) != 0);
break;
case 0x16:
xScroll = (val & 0x07);
columnSelect = ((val & 0x08) != 0);
multicolorMode = ((val & 0x10) != 0);
UpdateBorder();
UpdateVideoMode();
break;
case 0x17:
sprites[0].yExpand = ((val & 0x01) != 0);
sprites[1].yExpand = ((val & 0x02) != 0);
sprites[2].yExpand = ((val & 0x04) != 0);
sprites[3].yExpand = ((val & 0x08) != 0);
sprites[4].yExpand = ((val & 0x10) != 0);
sprites[5].yExpand = ((val & 0x20) != 0);
sprites[6].yExpand = ((val & 0x40) != 0);
sprites[7].yExpand = ((val & 0x80) != 0);
break;
case 0x18:
pointerVM = ((val << 6) & 0x3C00);
pointerCB = ((val >> 1) & 0x7);
break;
case 0x19:
intRaster = ((val & 0x01) != 0);
intSpriteDataCollision = ((val & 0x02) != 0);
intSpriteCollision = ((val & 0x04) != 0);
intLightPen = ((val & 0x08) != 0);
UpdatePins();
break;
case 0x1A:
enableIntRaster = ((val & 0x01) != 0);
enableIntSpriteDataCollision = ((val & 0x02) != 0);
enableIntSpriteCollision = ((val & 0x04) != 0);
enableIntLightPen = ((val & 0x08) != 0);
UpdatePins();
break;
case 0x1B:
sprites[0].priority = ((val & 0x01) != 0);
sprites[1].priority = ((val & 0x02) != 0);
sprites[2].priority = ((val & 0x04) != 0);
sprites[3].priority = ((val & 0x08) != 0);
sprites[4].priority = ((val & 0x10) != 0);
sprites[5].priority = ((val & 0x20) != 0);
sprites[6].priority = ((val & 0x40) != 0);
sprites[7].priority = ((val & 0x80) != 0);
break;
case 0x1C:
sprites[0].multicolor = ((val & 0x01) != 0);
sprites[1].multicolor = ((val & 0x02) != 0);
sprites[2].multicolor = ((val & 0x04) != 0);
sprites[3].multicolor = ((val & 0x08) != 0);
sprites[4].multicolor = ((val & 0x10) != 0);
sprites[5].multicolor = ((val & 0x20) != 0);
sprites[6].multicolor = ((val & 0x40) != 0);
sprites[7].multicolor = ((val & 0x80) != 0);
break;
case 0x1D:
sprites[0].xExpand = ((val & 0x01) != 0);
sprites[1].xExpand = ((val & 0x02) != 0);
sprites[2].xExpand = ((val & 0x04) != 0);
sprites[3].xExpand = ((val & 0x08) != 0);
sprites[4].xExpand = ((val & 0x10) != 0);
sprites[5].xExpand = ((val & 0x20) != 0);
sprites[6].xExpand = ((val & 0x40) != 0);
sprites[7].xExpand = ((val & 0x80) != 0);
break;
case 0x1E:
sprites[0].collideSprite = ((val & 0x01) != 0);
sprites[1].collideSprite = ((val & 0x02) != 0);
sprites[2].collideSprite = ((val & 0x04) != 0);
sprites[3].collideSprite = ((val & 0x08) != 0);
sprites[4].collideSprite = ((val & 0x10) != 0);
sprites[5].collideSprite = ((val & 0x20) != 0);
sprites[6].collideSprite = ((val & 0x40) != 0);
sprites[7].collideSprite = ((val & 0x80) != 0);
break;
case 0x1F:
sprites[0].collideData = ((val & 0x01) != 0);
sprites[1].collideData = ((val & 0x02) != 0);
sprites[2].collideData = ((val & 0x04) != 0);
sprites[3].collideData = ((val & 0x08) != 0);
sprites[4].collideData = ((val & 0x10) != 0);
sprites[5].collideData = ((val & 0x20) != 0);
sprites[6].collideData = ((val & 0x40) != 0);
sprites[7].collideData = ((val & 0x80) != 0);
break;
case 0x20:
borderColor = (val & 0xF);
break;
case 0x21:
backgroundColor0 = (val & 0xF);
break;
case 0x22:
backgroundColor1 = (val & 0xF);
break;
case 0x23:
backgroundColor2 = (val & 0xF);
break;
case 0x24:
backgroundColor3 = (val & 0xF);
break;
case 0x25:
spriteMulticolor0 = (val & 0xF);
break;
case 0x26:
spriteMulticolor1 = (val & 0xF);
break;
case 0x27:
case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2D:
case 0x2E:
sprites[addr - 0x27].color = (val & 0xF);
break;
default:
break;
}
}
}
private void WriteRegister(int addr, byte val)
{
switch (addr)
{
case 0x00:
case 0x02:
case 0x04:
case 0x06:
case 0x08:
case 0x0A:
case 0x0C:
case 0x0E:
sprites[addr >> 1].x &= 0x100;
sprites[addr >> 1].x |= val;
break;
case 0x01:
case 0x03:
case 0x05:
case 0x07:
case 0x09:
case 0x0B:
case 0x0D:
case 0x0F:
sprites[addr >> 1].y = val;
break;
case 0x10:
sprites[0].x = (sprites[0].x & 0xFF) | ((val & 0x01) << 8);
sprites[1].x = (sprites[1].x & 0xFF) | ((val & 0x02) << 7);
sprites[2].x = (sprites[2].x & 0xFF) | ((val & 0x04) << 6);
sprites[3].x = (sprites[3].x & 0xFF) | ((val & 0x08) << 5);
sprites[4].x = (sprites[4].x & 0xFF) | ((val & 0x10) << 4);
sprites[5].x = (sprites[5].x & 0xFF) | ((val & 0x20) << 3);
sprites[6].x = (sprites[6].x & 0xFF) | ((val & 0x40) << 2);
sprites[7].x = (sprites[7].x & 0xFF) | ((val & 0x80) << 1);
break;
case 0x11:
yScroll = (val & 0x07);
rowSelect = ((val & 0x08) != 0);
displayEnable = ((val & 0x10) != 0);
bitmapMode = ((val & 0x20) != 0);
extraColorMode = ((val & 0x40) != 0);
rasterInterruptLine &= 0xFF;
rasterInterruptLine |= (val & 0x80) << 1;
UpdateBorder();
UpdateVideoMode();
break;
case 0x12:
rasterInterruptLine &= 0x100;
rasterInterruptLine |= val;
break;
case 0x13:
lightPenX = val;
break;
case 0x14:
lightPenY = val;
break;
case 0x15:
sprites[0].enable = ((val & 0x01) != 0);
sprites[1].enable = ((val & 0x02) != 0);
sprites[2].enable = ((val & 0x04) != 0);
sprites[3].enable = ((val & 0x08) != 0);
sprites[4].enable = ((val & 0x10) != 0);
sprites[5].enable = ((val & 0x20) != 0);
sprites[6].enable = ((val & 0x40) != 0);
sprites[7].enable = ((val & 0x80) != 0);
break;
case 0x16:
xScroll = (val & 0x07);
columnSelect = ((val & 0x08) != 0);
multicolorMode = ((val & 0x10) != 0);
UpdateBorder();
UpdateVideoMode();
break;
case 0x17:
sprites[0].yExpand = ((val & 0x01) != 0);
sprites[1].yExpand = ((val & 0x02) != 0);
sprites[2].yExpand = ((val & 0x04) != 0);
sprites[3].yExpand = ((val & 0x08) != 0);
sprites[4].yExpand = ((val & 0x10) != 0);
sprites[5].yExpand = ((val & 0x20) != 0);
sprites[6].yExpand = ((val & 0x40) != 0);
sprites[7].yExpand = ((val & 0x80) != 0);
break;
case 0x18:
pointerVM = ((val << 6) & 0x3C00);
pointerCB = ((val >> 1) & 0x7);
break;
case 0x19:
intRaster = ((val & 0x01) != 0);
intSpriteDataCollision = ((val & 0x02) != 0);
intSpriteCollision = ((val & 0x04) != 0);
intLightPen = ((val & 0x08) != 0);
UpdatePins();
break;
case 0x1A:
enableIntRaster = ((val & 0x01) != 0);
enableIntSpriteDataCollision = ((val & 0x02) != 0);
enableIntSpriteCollision = ((val & 0x04) != 0);
enableIntLightPen = ((val & 0x08) != 0);
UpdatePins();
break;
case 0x1B:
sprites[0].priority = ((val & 0x01) != 0);
sprites[1].priority = ((val & 0x02) != 0);
sprites[2].priority = ((val & 0x04) != 0);
sprites[3].priority = ((val & 0x08) != 0);
sprites[4].priority = ((val & 0x10) != 0);
sprites[5].priority = ((val & 0x20) != 0);
sprites[6].priority = ((val & 0x40) != 0);
sprites[7].priority = ((val & 0x80) != 0);
break;
case 0x1C:
sprites[0].multicolor = ((val & 0x01) != 0);
sprites[1].multicolor = ((val & 0x02) != 0);
sprites[2].multicolor = ((val & 0x04) != 0);
sprites[3].multicolor = ((val & 0x08) != 0);
sprites[4].multicolor = ((val & 0x10) != 0);
sprites[5].multicolor = ((val & 0x20) != 0);
sprites[6].multicolor = ((val & 0x40) != 0);
sprites[7].multicolor = ((val & 0x80) != 0);
break;
case 0x1D:
sprites[0].xExpand = ((val & 0x01) != 0);
sprites[1].xExpand = ((val & 0x02) != 0);
sprites[2].xExpand = ((val & 0x04) != 0);
sprites[3].xExpand = ((val & 0x08) != 0);
sprites[4].xExpand = ((val & 0x10) != 0);
sprites[5].xExpand = ((val & 0x20) != 0);
sprites[6].xExpand = ((val & 0x40) != 0);
sprites[7].xExpand = ((val & 0x80) != 0);
break;
case 0x1E:
sprites[0].collideSprite = ((val & 0x01) != 0);
sprites[1].collideSprite = ((val & 0x02) != 0);
sprites[2].collideSprite = ((val & 0x04) != 0);
sprites[3].collideSprite = ((val & 0x08) != 0);
sprites[4].collideSprite = ((val & 0x10) != 0);
sprites[5].collideSprite = ((val & 0x20) != 0);
sprites[6].collideSprite = ((val & 0x40) != 0);
sprites[7].collideSprite = ((val & 0x80) != 0);
break;
case 0x1F:
sprites[0].collideData = ((val & 0x01) != 0);
sprites[1].collideData = ((val & 0x02) != 0);
sprites[2].collideData = ((val & 0x04) != 0);
sprites[3].collideData = ((val & 0x08) != 0);
sprites[4].collideData = ((val & 0x10) != 0);
sprites[5].collideData = ((val & 0x20) != 0);
sprites[6].collideData = ((val & 0x40) != 0);
sprites[7].collideData = ((val & 0x80) != 0);
break;
case 0x20:
borderColor = (val & 0xF);
break;
case 0x21:
backgroundColor0 = (val & 0xF);
break;
case 0x22:
backgroundColor1 = (val & 0xF);
break;
case 0x23:
backgroundColor2 = (val & 0xF);
break;
case 0x24:
backgroundColor3 = (val & 0xF);
break;
case 0x25:
spriteMulticolor0 = (val & 0xF);
break;
case 0x26:
spriteMulticolor1 = (val & 0xF);
break;
case 0x27:
case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2D:
case 0x2E:
sprites[addr - 0x27].color = (val & 0xF);
break;
default:
break;
}
}
}
}

View File

@ -3,226 +3,226 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
int delayC;
int ecmPixel;
int pixel;
int pixelData;
SpriteGenerator pixelOwner;
int sprData;
int sprPixel;
int srC = 0;
int srSync = 0;
VicVideoMode videoMode;
sealed public partial class Vic
{
int delayC;
int ecmPixel;
int pixel;
int pixelData;
SpriteGenerator pixelOwner;
int sprData;
int sprPixel;
int srC = 0;
int srSync = 0;
VicVideoMode videoMode;
enum VicVideoMode : int
{
Mode000,
Mode001,
Mode010,
Mode011,
Mode100,
ModeBad
}
enum VicVideoMode : int
{
Mode000,
Mode001,
Mode010,
Mode011,
Mode100,
ModeBad
}
private void Render()
{
if (hblankCheckEnableL)
{
if (rasterX == hblankEnd)
hblank = false;
}
else if (hblankCheckEnableR)
{
if (rasterX == hblankStart)
hblank = true;
}
private void Render()
{
if (hblankCheckEnableL)
{
if (rasterX == hblankEnd)
hblank = false;
}
else if (hblankCheckEnableR)
{
if (rasterX == hblankStart)
hblank = true;
}
renderEnabled = (!hblank && !vblank);
for (int i = 0; i < 4; i++)
{
renderEnabled = (!hblank && !vblank);
for (int i = 0; i < 4; i++)
{
if (delayC > 0)
delayC--;
else
displayC = (srC >> 12) & 0xFFF;
if (delayC > 0)
delayC--;
else
displayC = (srC >> 12) & 0xFFF;
if (borderCheckLEnable && (rasterX == borderL))
{
if (rasterLine == borderB)
borderOnVertical = true;
if (rasterLine == borderT && displayEnable)
borderOnVertical = false;
if (!borderOnVertical)
borderOnMain = false;
}
if (borderCheckLEnable && (rasterX == borderL))
{
if (rasterLine == borderB)
borderOnVertical = true;
if (rasterLine == borderT && displayEnable)
borderOnVertical = false;
if (!borderOnVertical)
borderOnMain = false;
}
switch (videoMode)
{
case VicVideoMode.Mode000:
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 8) : backgroundColor0;
break;
case VicVideoMode.Mode001:
if ((displayC & 0x800) != 0)
{
// multicolor 001
if ((srSync & srMask2) != 0)
pixelData = sr & srMask3;
switch (videoMode)
{
case VicVideoMode.Mode000:
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 8) : backgroundColor0;
break;
case VicVideoMode.Mode001:
if ((displayC & 0x800) != 0)
{
// multicolor 001
if ((srSync & srMask2) != 0)
pixelData = sr & srMask3;
if (pixelData == 0)
pixel = backgroundColor0;
else if (pixelData == srMask1)
pixel = backgroundColor1;
else if (pixelData == srMask2)
pixel = backgroundColor2;
else
pixel = (displayC & 0x700) >> 8;
}
else
{
// standard 001
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 8) : backgroundColor0;
}
break;
case VicVideoMode.Mode010:
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 4) : (displayC);
break;
case VicVideoMode.Mode011:
if ((srSync & srMask2) != 0)
pixelData = sr & srMask3;
if (pixelData == 0)
pixel = backgroundColor0;
else if (pixelData == srMask1)
pixel = backgroundColor1;
else if (pixelData == srMask2)
pixel = backgroundColor2;
else
pixel = (displayC & 0x700) >> 8;
}
else
{
// standard 001
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 8) : backgroundColor0;
}
break;
case VicVideoMode.Mode010:
pixelData = sr & srMask2;
pixel = (pixelData != 0) ? (displayC >> 4) : (displayC);
break;
case VicVideoMode.Mode011:
if ((srSync & srMask2) != 0)
pixelData = sr & srMask3;
if (pixelData == 0)
pixel = backgroundColor0;
else if (pixelData == srMask1)
pixel = (displayC >> 4);
else if (pixelData == srMask2)
pixel = displayC;
else
pixel = (displayC >> 8);
break;
case VicVideoMode.Mode100:
pixelData = sr & srMask2;
if (pixelData != 0)
{
pixel = displayC >> 8;
}
else
{
ecmPixel = (displayC) & 0xC0;
if (ecmPixel == 0x00)
pixel = backgroundColor0;
else if (ecmPixel == 0x40)
pixel = backgroundColor1;
else if (ecmPixel == 0x80)
pixel = backgroundColor2;
else
pixel = backgroundColor3;
}
break;
default:
pixelData = 0;
pixel = 0;
break;
}
pixel &= 0xF;
sr <<= 1;
srSync <<= 1;
// render sprite
pixelOwner = null;
foreach (SpriteGenerator spr in sprites)
{
sprData = 0;
sprPixel = pixel;
if (pixelData == 0)
pixel = backgroundColor0;
else if (pixelData == srMask1)
pixel = (displayC >> 4);
else if (pixelData == srMask2)
pixel = displayC;
else
pixel = (displayC >> 8);
break;
case VicVideoMode.Mode100:
pixelData = sr & srMask2;
if (pixelData != 0)
{
pixel = displayC >> 8;
}
else
{
ecmPixel = (displayC) & 0xC0;
if (ecmPixel == 0x00)
pixel = backgroundColor0;
else if (ecmPixel == 0x40)
pixel = backgroundColor1;
else if (ecmPixel == 0x80)
pixel = backgroundColor2;
else
pixel = backgroundColor3;
}
break;
default:
pixelData = 0;
pixel = 0;
break;
}
pixel &= 0xF;
sr <<= 1;
srSync <<= 1;
if (spr.x == rasterX)
spr.shiftEnable = true;
// render sprite
pixelOwner = null;
foreach (SpriteGenerator spr in sprites)
{
sprData = 0;
sprPixel = pixel;
if (spr.shiftEnable)
{
if (spr.multicolor)
{
sprData = (spr.sr & srSpriteMaskMC);
if (spr.multicolorCrunch && spr.xCrunch && !rasterXHold)
spr.sr <<= 2;
spr.multicolorCrunch ^= spr.xCrunch;
}
else
{
sprData = (spr.sr & srSpriteMask);
if (spr.xCrunch && !rasterXHold)
spr.sr <<= 1;
}
spr.xCrunch ^= spr.xExpand;
if (spr.x == rasterX)
spr.shiftEnable = true;
if (sprData != 0)
{
// sprite-sprite collision
if (pixelOwner == null)
{
if (!spr.priority || (pixelData == 0))
{
if (sprData == srSpriteMask1)
pixel = spriteMulticolor0;
else if (sprData == srSpriteMask2)
pixel = spr.color;
else if (sprData == srSpriteMask3)
pixel = spriteMulticolor1;
}
pixelOwner = spr;
}
else
{
if (!borderOnVertical)
{
spr.collideSprite = true;
pixelOwner.collideSprite = true;
}
}
if (spr.shiftEnable)
{
if (spr.multicolor)
{
sprData = (spr.sr & srSpriteMaskMC);
if (spr.multicolorCrunch && spr.xCrunch && !rasterXHold)
spr.sr <<= 2;
spr.multicolorCrunch ^= spr.xCrunch;
}
else
{
sprData = (spr.sr & srSpriteMask);
if (spr.xCrunch && !rasterXHold)
spr.sr <<= 1;
}
spr.xCrunch ^= spr.xExpand;
// sprite-data collision
if (!borderOnVertical && (pixelData < srMask2))
{
spr.collideData = true;
}
}
if (spr.sr == 0)
spr.shiftEnable = false; //optimization
}
}
if (sprData != 0)
{
// sprite-sprite collision
if (pixelOwner == null)
{
if (!spr.priority || (pixelData == 0))
{
if (sprData == srSpriteMask1)
pixel = spriteMulticolor0;
else if (sprData == srSpriteMask2)
pixel = spr.color;
else if (sprData == srSpriteMask3)
pixel = spriteMulticolor1;
}
pixelOwner = spr;
}
else
{
if (!borderOnVertical)
{
spr.collideSprite = true;
pixelOwner.collideSprite = true;
}
}
if (borderCheckREnable && (rasterX == borderR))
borderOnMain = true;
// sprite-data collision
if (!borderOnVertical && (pixelData < srMask2))
{
spr.collideData = true;
}
}
if (spr.sr == 0)
spr.shiftEnable = false; //optimization
}
}
// border doesn't work with the background buffer
if (borderOnMain || borderOnVertical)
pixel = borderColor;
if (borderCheckREnable && (rasterX == borderR))
borderOnMain = true;
// plot pixel if within viewing area
if (renderEnabled)
{
buf[bufOffset] = palette[pixBuffer[pixBufferIndex]];
bufOffset++;
if (bufOffset == bufLength)
bufOffset = 0;
}
pixBuffer[pixBufferIndex] = pixel;
pixBufferIndex++;
// border doesn't work with the background buffer
if (borderOnMain || borderOnVertical)
pixel = borderColor;
if (!rasterXHold)
rasterX++;
bitmapColumn++;
}
// plot pixel if within viewing area
if (renderEnabled)
{
buf[bufOffset] = palette[pixBuffer[pixBufferIndex]];
bufOffset++;
if (bufOffset == bufLength)
bufOffset = 0;
}
pixBuffer[pixBufferIndex] = pixel;
pixBufferIndex++;
if (pixBufferIndex >= pixBufferSize)
pixBufferIndex = 0;
}
}
if (!rasterXHold)
rasterX++;
bitmapColumn++;
}
if (pixBufferIndex >= pixBufferSize)
pixBufferIndex = 0;
}
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{

View File

@ -6,7 +6,7 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{

View File

@ -3,23 +3,23 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
const int BORDER_LEFT_38 = 0x01F;
const int BORDER_LEFT_40 = 0x018;
const int BORDER_RIGHT_38 = 0x14F;
const int BORDER_RIGHT_40 = 0x158;
sealed public partial class Vic
{
const int BORDER_LEFT_38 = 0x01F;
const int BORDER_LEFT_40 = 0x018;
const int BORDER_RIGHT_38 = 0x14F;
const int BORDER_RIGHT_40 = 0x158;
// The special actions taken by the Vic are in the same order and interval on all chips, just different offsets.
static int[] TimingBuilder_Cycle14Act = new int[]
// The special actions taken by the Vic are in the same order and interval on all chips, just different offsets.
static int[] TimingBuilder_Cycle14Act = new int[]
{
pipelineUpdateVc, 0,
pipelineChkSprChunch, 0,
pipelineUpdateMcBase, 0,
};
static int[] TimingBuilder_Cycle55Act = new int[]
static int[] TimingBuilder_Cycle55Act = new int[]
{
pipelineChkSprDma, 0,
pipelineChkSprDma, pipelineChkSprExp,
@ -27,251 +27,251 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
pipelineChkSprDisp, pipelineUpdateRc
};
// This builds a table of special actions to take on each half-cycle. Cycle14 is the X-raster position where
// pre-display operations happen, and Cycle55 is the X-raster position where post-display operations happen.
static public int[] TimingBuilder_Act(int[] timing, int cycle14, int cycle55, int hblankStart, int hblankEnd)
{
List<int> result = new List<int>();
// This builds a table of special actions to take on each half-cycle. Cycle14 is the X-raster position where
// pre-display operations happen, and Cycle55 is the X-raster position where post-display operations happen.
static public int[] TimingBuilder_Act(int[] timing, int cycle14, int cycle55, int hblankStart, int hblankEnd)
{
List<int> result = new List<int>();
int length = timing.Length;
for (int i = 0; i < length; i++)
{
while (i < result.Count)
i++;
if (timing[i] == cycle14)
result.AddRange(TimingBuilder_Cycle14Act);
else if (timing[i] == cycle55)
result.AddRange(TimingBuilder_Cycle55Act);
else
result.Add(0);
}
for (int i = 0; i < length; i++)
{
// pipeline raster X delay
if (timing[(i + 1) % length] == timing[i])
result[i] |= pipelineHoldX;
int length = timing.Length;
for (int i = 0; i < length; i++)
{
while (i < result.Count)
i++;
if (timing[i] == cycle14)
result.AddRange(TimingBuilder_Cycle14Act);
else if (timing[i] == cycle55)
result.AddRange(TimingBuilder_Cycle55Act);
else
result.Add(0);
}
for (int i = 0; i < length; i++)
{
// pipeline raster X delay
if (timing[(i + 1) % length] == timing[i])
result[i] |= pipelineHoldX;
// pipeline border checks
if (timing[i] == (BORDER_LEFT_40 & 0xFFC))
result[i] |= pipelineChkBrdL1;
if (timing[i] == (BORDER_LEFT_38 & 0xFFC))
result[i] |= pipelineChkBrdL0;
if (timing[i] == (BORDER_RIGHT_38 & 0xFFC))
result[i] |= pipelineChkBrdR0;
if (timing[i] == (BORDER_RIGHT_40 & 0xFFC))
result[i] |= pipelineChkBrdR1;
if (timing[i] == (hblankStart & 0xFFC))
result[i] |= pipelineHBlankR;
if (timing[i] == (hblankEnd & 0xFFC))
result[i] |= pipelineHBlankL;
}
// pipeline border checks
if (timing[i] == (BORDER_LEFT_40 & 0xFFC))
result[i] |= pipelineChkBrdL1;
if (timing[i] == (BORDER_LEFT_38 & 0xFFC))
result[i] |= pipelineChkBrdL0;
if (timing[i] == (BORDER_RIGHT_38 & 0xFFC))
result[i] |= pipelineChkBrdR0;
if (timing[i] == (BORDER_RIGHT_40 & 0xFFC))
result[i] |= pipelineChkBrdR1;
if (timing[i] == (hblankStart & 0xFFC))
result[i] |= pipelineHBlankR;
if (timing[i] == (hblankEnd & 0xFFC))
result[i] |= pipelineHBlankL;
}
return result.ToArray();
}
return result.ToArray();
}
// This builds a table of how the BA pin is supposed to act on each half-cycle.
static public int[] TimingBuilder_BA(int[] fetch)
{
int baRestart = 7;
int start = 0;
int length = fetch.Length;
int[] result = new int[length];
int[] spriteBA = new int[8];
int charBA = 0;
// This builds a table of how the BA pin is supposed to act on each half-cycle.
static public int[] TimingBuilder_BA(int[] fetch)
{
int baRestart = 7;
int start = 0;
int length = fetch.Length;
int[] result = new int[length];
int[] spriteBA = new int[8];
int charBA = 0;
while (true)
{
if (fetch[start] == 0)
break;
start++;
}
while (true)
{
if (fetch[start] == 0)
break;
start++;
}
while (true)
{
if (fetch[start] == 0x200)
break;
start--;
}
while (true)
{
if (fetch[start] == 0x200)
break;
start--;
}
if (start < 0)
start += length;
int offset = start;
if (start < 0)
start += length;
int offset = start;
while (true)
{
int ba = 0x0888;
while (true)
{
int ba = 0x0888;
if (fetch[offset] == 0x200)
charBA = baRestart;
else if ((fetch[offset] & 0xFF00) == 0x0000)
spriteBA[fetch[offset] & 0x007] = baRestart;
if (fetch[offset] == 0x200)
charBA = baRestart;
else if ((fetch[offset] & 0xFF00) == 0x0000)
spriteBA[fetch[offset] & 0x007] = baRestart;
for (int i = 0; i < 8; i++)
{
if (spriteBA[i] > 0)
{
ba <<= 4;
ba |= i;
spriteBA[i]--;
}
}
ba &= 0x0FFF;
for (int i = 0; i < 8; i++)
{
if (spriteBA[i] > 0)
{
ba <<= 4;
ba |= i;
spriteBA[i]--;
}
}
ba &= 0x0FFF;
if (charBA > 0)
{
ba = 0x1000;
charBA--;
}
if (charBA > 0)
{
ba = 0x1000;
charBA--;
}
result[offset] = ba;
result[offset] = ba;
offset--;
if (offset < 0)
offset += length;
offset--;
if (offset < 0)
offset += length;
if (offset == start)
break;
}
if (offset == start)
break;
}
for (int i = 0; i < length; i += 2)
{
result[i] = result[i + 1];
}
for (int i = 0; i < length; i += 2)
{
result[i] = result[i + 1];
}
return result;
}
return result;
}
// This builds a table of the fetch operations to take on each half-cycle.
static public int[] TimingBuilder_Fetch(int[] timing, int sprite)
{
int length = timing.Length;
int[] result = new int[length];
int offset;
int index = -1;
int refreshCounter = 0;
bool spriteActive = false;
int spriteIndex = 0;
int spritePhase = 0;
int charCounter = 0;
// This builds a table of the fetch operations to take on each half-cycle.
static public int[] TimingBuilder_Fetch(int[] timing, int sprite)
{
int length = timing.Length;
int[] result = new int[length];
int offset;
int index = -1;
int refreshCounter = 0;
bool spriteActive = false;
int spriteIndex = 0;
int spritePhase = 0;
int charCounter = 0;
for (int i = 0; i < length; i++)
{
result[i++] = 0x500;
result[i] = 0x100;
}
for (int i = 0; i < length; i++)
{
result[i++] = 0x500;
result[i] = 0x100;
}
while (true)
{
index++;
if (index >= length)
index -= length;
offset = timing[index];
while (true)
{
index++;
if (index >= length)
index -= length;
offset = timing[index];
if (charCounter > 0)
{
result[index] = (charCounter & 1) == 0 ? 0x200 : 0x300;
charCounter--;
if (charCounter == 0)
break;
}
if (charCounter > 0)
{
result[index] = (charCounter & 1) == 0 ? 0x200 : 0x300;
charCounter--;
if (charCounter == 0)
break;
}
if (refreshCounter > 0)
{
result[index] = (refreshCounter & 1) == 0 ? 0x500 : 0x100;
refreshCounter--;
if (refreshCounter == 0)
charCounter = 80;
}
if (refreshCounter > 0)
{
result[index] = (refreshCounter & 1) == 0 ? 0x500 : 0x100;
refreshCounter--;
if (refreshCounter == 0)
charCounter = 80;
}
if (offset == sprite)
{
spriteActive = true;
}
if (offset == sprite)
{
spriteActive = true;
}
if (spriteActive)
{
result[index] = (spriteIndex | (spritePhase << 4));
spritePhase++;
if (spritePhase == 4)
{
spritePhase = 0;
spriteIndex++;
if (spriteIndex == 8)
{
spriteActive = false;
refreshCounter = 9;
}
}
}
}
if (spriteActive)
{
result[index] = (spriteIndex | (spritePhase << 4));
spritePhase++;
if (spritePhase == 4)
{
spritePhase = 0;
spriteIndex++;
if (spriteIndex == 8)
{
spriteActive = false;
refreshCounter = 9;
}
}
}
}
return result.ToArray();
}
return result.ToArray();
}
// This uses the vBlank values to determine the height of the visible screen.
static public int TimingBuilder_ScreenHeight(int vblankStart, int vblankEnd, int lines)
{
int offset = vblankEnd;
int result = 0;
while (true)
{
if (offset >= lines)
offset -= lines;
if (offset == vblankStart)
return result;
offset++;
result++;
}
}
// This uses the vBlank values to determine the height of the visible screen.
static public int TimingBuilder_ScreenHeight(int vblankStart, int vblankEnd, int lines)
{
int offset = vblankEnd;
int result = 0;
while (true)
{
if (offset >= lines)
offset -= lines;
if (offset == vblankStart)
return result;
offset++;
result++;
}
}
// This uses the hBlank values to determine the width of the visible screen.
static public int TimingBuilder_ScreenWidth(int[] timing, int hblankStart, int hblankEnd)
{
int length = timing.Length;
int result = 0;
int offset = 0;
// This uses the hBlank values to determine the width of the visible screen.
static public int TimingBuilder_ScreenWidth(int[] timing, int hblankStart, int hblankEnd)
{
int length = timing.Length;
int result = 0;
int offset = 0;
while (timing[offset] != hblankEnd) { offset = (offset + 1) % length; }
while (timing[offset] != hblankStart) { offset = (offset + 1) % length; result++; }
while (timing[offset] != hblankEnd) { offset = (offset + 1) % length; }
while (timing[offset] != hblankStart) { offset = (offset + 1) % length; result++; }
return (result * 4);
}
return (result * 4);
}
// This builds the table of X-raster positions. Start marks the position where the
// Y-raster is incremented. Width is the position where the X-raster is reset to zero. Count
// is the width of a rasterline in pixels. DelayOffset is the X-raster position where lag begins
// (specifically on an NTSC 6567R8) and DelayAmount is the number of positions to lag.
static public int[] TimingBuilder_XRaster(int start, int width, int count, int delayOffset, int delayAmount)
{
List<int> result = new List<int>();
int rasterX = start;
bool delayed = false;
count >>= 2;
delayAmount >>= 2;
// This builds the table of X-raster positions. Start marks the position where the
// Y-raster is incremented. Width is the position where the X-raster is reset to zero. Count
// is the width of a rasterline in pixels. DelayOffset is the X-raster position where lag begins
// (specifically on an NTSC 6567R8) and DelayAmount is the number of positions to lag.
static public int[] TimingBuilder_XRaster(int start, int width, int count, int delayOffset, int delayAmount)
{
List<int> result = new List<int>();
int rasterX = start;
bool delayed = false;
count >>= 2;
delayAmount >>= 2;
for (int i = 0; i < count; i++)
{
result.Add(rasterX);
for (int i = 0; i < count; i++)
{
result.Add(rasterX);
if (!delayed)
{
rasterX += 4;
if (rasterX >= width)
rasterX -= width;
}
else
{
delayAmount--;
if (delayAmount <= 0)
delayed = false;
continue;
}
if (!delayed)
{
rasterX += 4;
if (rasterX >= width)
rasterX -= width;
}
else
{
delayAmount--;
if (delayAmount <= 0)
delayed = false;
continue;
}
if (rasterX == delayOffset && delayAmount > 0)
delayed = true;
}
if (rasterX == delayOffset && delayAmount > 0)
delayed = true;
}
return result.ToArray();
}
}
return result.ToArray();
}
}
}

View File

@ -3,7 +3,7 @@
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic : IVideoProvider
{
@ -18,24 +18,24 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
// palette
int[] palette =
{
Colors.ARGB(0x00, 0x00, 0x00),
Colors.ARGB(0xFF, 0xFF, 0xFF),
Colors.ARGB(0x68, 0x37, 0x2B),
Colors.ARGB(0x70, 0xA4, 0xB2),
Colors.ARGB(0x6F, 0x3D, 0x86),
Colors.ARGB(0x58, 0x8D, 0x43),
Colors.ARGB(0x35, 0x28, 0x79),
Colors.ARGB(0xB8, 0xC7, 0x6F),
Colors.ARGB(0x6F, 0x4F, 0x25),
Colors.ARGB(0x43, 0x39, 0x00),
Colors.ARGB(0x9A, 0x67, 0x59),
Colors.ARGB(0x44, 0x44, 0x44),
Colors.ARGB(0x6C, 0x6C, 0x6C),
Colors.ARGB(0x9A, 0xD2, 0x84),
Colors.ARGB(0x6C, 0x5E, 0xB5),
Colors.ARGB(0x95, 0x95, 0x95)
};
{
Colors.ARGB(0x00, 0x00, 0x00),
Colors.ARGB(0xFF, 0xFF, 0xFF),
Colors.ARGB(0x68, 0x37, 0x2B),
Colors.ARGB(0x70, 0xA4, 0xB2),
Colors.ARGB(0x6F, 0x3D, 0x86),
Colors.ARGB(0x58, 0x8D, 0x43),
Colors.ARGB(0x35, 0x28, 0x79),
Colors.ARGB(0xB8, 0xC7, 0x6F),
Colors.ARGB(0x6F, 0x4F, 0x25),
Colors.ARGB(0x43, 0x39, 0x00),
Colors.ARGB(0x9A, 0x67, 0x59),
Colors.ARGB(0x44, 0x44, 0x44),
Colors.ARGB(0x6C, 0x6C, 0x6C),
Colors.ARGB(0x9A, 0xD2, 0x84),
Colors.ARGB(0x6C, 0x5E, 0xB5),
Colors.ARGB(0x95, 0x95, 0x95)
};
public int BackgroundColor
{

View File

@ -1,157 +1,157 @@
using System;
using System.Drawing;
namespace BizHawk.Emulation.Computers.Commodore64.MOS
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
sealed public partial class Vic
{
public Func<int, byte> ReadColorRam;
public Func<int, byte> ReadMemory;
public Func<int, byte> ReadColorRam;
public Func<int, byte> ReadMemory;
public bool ReadAECBuffer() { return pinAEC; }
public bool ReadBABuffer() { return pinBA; }
public bool ReadIRQBuffer() { return pinIRQ; }
public bool ReadAECBuffer() { return pinAEC; }
public bool ReadBABuffer() { return pinBA; }
public bool ReadIRQBuffer() { return pinIRQ; }
int cyclesPerSec;
int irqShift;
int cyclesPerSec;
int irqShift;
int[][] pipeline;
int totalCycles;
int totalLines;
public Vic(int newCycles, int newLines, int[][] newPipeline, int newCyclesPerSec, int hblankStart, int hblankEnd, int vblankStart, int vblankEnd)
{
{
this.hblankStart = hblankStart;
this.hblankEnd = hblankEnd;
this.vblankStart = vblankStart;
this.vblankEnd = vblankEnd;
{
this.hblankStart = hblankStart;
this.hblankEnd = hblankEnd;
this.vblankStart = vblankStart;
this.vblankEnd = vblankEnd;
totalCycles = newCycles;
totalCycles = newCycles;
totalLines = newLines;
pipeline = newPipeline;
cyclesPerSec = newCyclesPerSec;
bufWidth = TimingBuilder_ScreenWidth(pipeline[0], hblankStart, hblankEnd);
bufHeight = TimingBuilder_ScreenHeight(vblankStart, vblankEnd, newLines);
bufWidth = TimingBuilder_ScreenWidth(pipeline[0], hblankStart, hblankEnd);
bufHeight = TimingBuilder_ScreenHeight(vblankStart, vblankEnd, newLines);
buf = new int[bufWidth * bufHeight];
buf = new int[bufWidth * bufHeight];
bufLength = buf.Length;
sprites = new SpriteGenerator[8];
sprites = new SpriteGenerator[8];
for (int i = 0; i < 8; i++)
sprites[i] = new SpriteGenerator();
sprites[i] = new SpriteGenerator();
bufferC = new int[40];
bufferG = new int[40];
}
}
public int CyclesPerFrame
{
get
{
return (totalCycles * totalLines);
}
}
public int CyclesPerFrame
{
get
{
return (totalCycles * totalLines);
}
}
public int CyclesPerSecond
{
get
{
return cyclesPerSec;
}
}
public int CyclesPerSecond
{
get
{
return cyclesPerSec;
}
}
public void ExecutePhase1()
{
//xScroll = 1;
{
// raster IRQ compare
if ((cycle == rasterIrqLineXCycle && rasterLine > 0) || (cycle == rasterIrqLine0Cycle && rasterLine == 0))
{
if (rasterLine != lastRasterLine)
if (rasterLine == rasterInterruptLine)
intRaster = true;
lastRasterLine = rasterLine;
}
public void ExecutePhase1()
{
//xScroll = 1;
{
// raster IRQ compare
if ((cycle == rasterIrqLineXCycle && rasterLine > 0) || (cycle == rasterIrqLine0Cycle && rasterLine == 0))
{
if (rasterLine != lastRasterLine)
if (rasterLine == rasterInterruptLine)
intRaster = true;
lastRasterLine = rasterLine;
}
// display enable compare
if (rasterLine == 0x030)
badlineEnable |= displayEnable;
// display enable compare
if (rasterLine == 0x030)
badlineEnable |= displayEnable;
// badline compare
if (badlineEnable && rasterLine >= 0x030 && rasterLine < 0x0F7 && ((rasterLine & 0x7) == yScroll))
{
badline = true;
}
else
{
badline = false;
}
// badline compare
if (badlineEnable && rasterLine >= 0x030 && rasterLine < 0x0F7 && ((rasterLine & 0x7) == yScroll))
{
badline = true;
}
else
{
badline = false;
}
// go into display state on a badline
if (badline)
idle = false;
// go into display state on a badline
if (badline)
idle = false;
// process some sprite crunch vars
foreach (SpriteGenerator spr in sprites)
if (!spr.yExpand) spr.yCrunch = true;
// process some sprite crunch vars
foreach (SpriteGenerator spr in sprites)
if (!spr.yExpand) spr.yCrunch = true;
ParseCycle();
ParseCycle();
//xOffset = 0;
Render();
//xOffset = 0;
Render();
// if the BA counter is nonzero, allow CPU bus access
UpdateBA();
pinAEC = false;
// if the BA counter is nonzero, allow CPU bus access
UpdateBA();
pinAEC = false;
// must always come last
//UpdatePins();
}
}
// must always come last
//UpdatePins();
}
}
public void ExecutePhase2()
{
public void ExecutePhase2()
{
{
ParseCycle();
{
ParseCycle();
// advance cycle and optionally raster line
cycle++;
if (cycle == totalCycles)
{
if (rasterLine == borderB)
borderOnVertical = true;
if (rasterLine == borderT && displayEnable)
borderOnVertical = false;
// advance cycle and optionally raster line
cycle++;
if (cycle == totalCycles)
{
if (rasterLine == borderB)
borderOnVertical = true;
if (rasterLine == borderT && displayEnable)
borderOnVertical = false;
if (rasterLine == vblankStart)
vblank = true;
if (rasterLine == vblankEnd)
vblank = false;
if (rasterLine == vblankStart)
vblank = true;
if (rasterLine == vblankEnd)
vblank = false;
cycleIndex = 0;
cycle = 0;
rasterLine++;
if (rasterLine == totalLines)
{
rasterLine = 0;
vcbase = 0;
vc = 0;
}
}
cycleIndex = 0;
cycle = 0;
rasterLine++;
if (rasterLine == totalLines)
{
rasterLine = 0;
vcbase = 0;
vc = 0;
}
}
Render();
UpdateBA();
pinAEC = (baCount > 0);
Render();
UpdateBA();
pinAEC = (baCount > 0);
// must always come last
UpdatePins();
}
}
// must always come last
UpdatePins();
}
}
private void UpdateBA()
private void UpdateBA()
{
if (pinBA)
baCount = baResetCounter;
@ -163,8 +163,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
{
borderL = columnSelect ? 0x018 : 0x01F;
borderR = columnSelect ? 0x158 : 0x14F;
//borderL = columnSelect ? 28 : 35;
//borderR = columnSelect ? 348 : 339;
//borderL = columnSelect ? 28 : 35;
//borderR = columnSelect ? 348 : 339;
borderT = rowSelect ? 0x033 : 0x037;
borderB = rowSelect ? 0x0FB : 0x0F7;
}
@ -177,39 +177,39 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
(enableIntSpriteCollision & intSpriteCollision) |
(enableIntLightPen & intLightPen));
irqShift <<= 1;
irqShift |= (irqTemp ? 0x1 : 0x0);
pinIRQ = (irqShift & 0x1) != 0;
irqShift <<= 1;
irqShift |= (irqTemp ? 0x1 : 0x0);
pinIRQ = (irqShift & 0x1) != 0;
}
private void UpdateVideoMode()
{
if (!extraColorMode && !bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode000;
return;
}
else if (!extraColorMode && !bitmapMode && multicolorMode)
{
videoMode = VicVideoMode.Mode001;
return;
}
else if (!extraColorMode && bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode010;
return;
}
else if (!extraColorMode && bitmapMode && multicolorMode)
{
videoMode = VicVideoMode.Mode011;
return;
}
else if (extraColorMode && !bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode100;
return;
}
videoMode = VicVideoMode.ModeBad;
}
private void UpdateVideoMode()
{
if (!extraColorMode && !bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode000;
return;
}
else if (!extraColorMode && !bitmapMode && multicolorMode)
{
videoMode = VicVideoMode.Mode001;
return;
}
else if (!extraColorMode && bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode010;
return;
}
else if (!extraColorMode && bitmapMode && multicolorMode)
{
videoMode = VicVideoMode.Mode011;
return;
}
else if (extraColorMode && !bitmapMode && !multicolorMode)
{
videoMode = VicVideoMode.Mode100;
return;
}
videoMode = VicVideoMode.ModeBad;
}
}
}

View File

@ -1,7 +1,7 @@
using System;
using System.IO;
namespace BizHawk.Emulation.Computers.Commodore64.Media
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public static class D64
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace BizHawk.Emulation.Computers.Commodore64.Media
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public class Track
{

View File

@ -1,6 +1,6 @@
using System.IO;
namespace BizHawk.Emulation.Computers.Commodore64.Media
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public static class G64
{

View File

@ -1,6 +1,4 @@
using BizHawk.Emulation.Computers.Commodore64.MOS;
namespace BizHawk.Emulation.Computers.Commodore64.Media
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
public static class PRG
{

View File

@ -8,158 +8,158 @@ using System.Text;
using BizHawk.Common;
namespace BizHawk.Emulation.Computers.Commodore64
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
static class SaveState
{
static public void SyncObject(Serializer ser, object obj)
{
BindingFlags defaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
MemberInfo[] members = obj.GetType().GetMembers(defaultFlags);
static class SaveState
{
static public void SyncObject(Serializer ser, object obj)
{
BindingFlags defaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
MemberInfo[] members = obj.GetType().GetMembers(defaultFlags);
Bit refBit;
Boolean refBool;
Byte refByte;
ByteBuffer refByteBuffer;
Int16 refInt16;
Int32 refInt32;
IntBuffer refIntBuffer;
Int32 refPointX;
Int32 refPointY;
SByte refSByte;
UInt16 refUInt16;
UInt32 refUInt32;
Int32 refRectHeight;
Int32 refRectWidth;
Bit refBit;
Boolean refBool;
Byte refByte;
ByteBuffer refByteBuffer;
Int16 refInt16;
Int32 refInt32;
IntBuffer refIntBuffer;
Int32 refPointX;
Int32 refPointY;
SByte refSByte;
UInt16 refUInt16;
UInt32 refUInt32;
Int32 refRectHeight;
Int32 refRectWidth;
foreach (MemberInfo member in members)
{
object currentValue = null;
bool fail = false;
FieldInfo fieldInfo = null;
PropertyInfo propInfo = null;
Type valueType = null;
foreach (MemberInfo member in members)
{
object currentValue = null;
bool fail = false;
FieldInfo fieldInfo = null;
PropertyInfo propInfo = null;
Type valueType = null;
if (member.MemberType == MemberTypes.Field)
{
fieldInfo = member.ReflectedType.GetField(member.Name, defaultFlags);
valueType = fieldInfo.FieldType;
currentValue = fieldInfo.GetValue(obj);
}
else
{
fail = true;
}
if (member.MemberType == MemberTypes.Field)
{
fieldInfo = member.ReflectedType.GetField(member.Name, defaultFlags);
valueType = fieldInfo.FieldType;
currentValue = fieldInfo.GetValue(obj);
}
else
{
fail = true;
}
if (!fail)
{
if (valueType.IsArray)
{
}
if (!fail)
{
if (valueType.IsArray)
{
}
if (currentValue != null)
{
switch (valueType.Name)
{
case "Bit":
refBit = (Bit)currentValue;
ser.Sync(member.Name, ref refBit);
currentValue = refBit;
break;
case "Boolean":
refBool = (Boolean)currentValue;
ser.Sync(member.Name, ref refBool);
currentValue = refBool;
break;
case "Byte":
refByte = (Byte)currentValue;
ser.Sync(member.Name, ref refByte);
currentValue = refByte;
break;
case "Byte[]":
refByteBuffer = new ByteBuffer((byte[])currentValue);
ser.Sync(member.Name, ref refByteBuffer);
currentValue = refByteBuffer.arr;
break;
case "ByteBuffer":
refByteBuffer = (ByteBuffer)currentValue;
ser.Sync(member.Name, ref refByteBuffer);
currentValue = refByteBuffer;
break;
case "Int16":
refInt16 = (Int16)currentValue;
ser.Sync(member.Name, ref refInt16);
currentValue = refInt16;
break;
case "Int32":
refInt32 = (Int32)currentValue;
ser.Sync(member.Name, ref refInt32);
currentValue = refInt32;
break;
case "Int32[]":
refIntBuffer = new IntBuffer((int[])currentValue);
ser.Sync(member.Name, ref refIntBuffer);
currentValue = refIntBuffer.arr;
break;
case "IntBuffer":
refIntBuffer = (IntBuffer)currentValue;
ser.Sync(member.Name, ref refIntBuffer);
currentValue = refIntBuffer;
break;
case "Point":
refPointX = ((Point)currentValue).X;
refPointY = ((Point)currentValue).Y;
ser.Sync(member.Name + "_X", ref refPointX);
ser.Sync(member.Name + "_Y", ref refPointY);
currentValue = new Point(refPointX, refPointY);
break;
case "Rectangle":
refPointX = ((Rectangle)currentValue).X;
refPointY = ((Rectangle)currentValue).Y;
refRectWidth = ((Rectangle)currentValue).Width;
refRectHeight = ((Rectangle)currentValue).Height;
ser.Sync(member.Name + "_X", ref refPointX);
ser.Sync(member.Name + "_Y", ref refPointY);
ser.Sync(member.Name + "_Height", ref refRectHeight);
ser.Sync(member.Name + "_Width", ref refRectWidth);
currentValue = new Rectangle(refPointX, refPointY, refRectWidth, refRectHeight);
break;
case "SByte":
refSByte = (SByte)currentValue;
ser.Sync(member.Name, ref refSByte);
currentValue = refSByte;
break;
case "UInt16":
refUInt16 = (UInt16)currentValue;
ser.Sync(member.Name, ref refUInt16);
currentValue = refUInt16;
break;
case "UInt32":
refUInt32 = (UInt32)currentValue;
ser.Sync(member.Name, ref refUInt32);
currentValue = refUInt32;
break;
default:
fail = true;
break;
}
}
if (currentValue != null)
{
switch (valueType.Name)
{
case "Bit":
refBit = (Bit)currentValue;
ser.Sync(member.Name, ref refBit);
currentValue = refBit;
break;
case "Boolean":
refBool = (Boolean)currentValue;
ser.Sync(member.Name, ref refBool);
currentValue = refBool;
break;
case "Byte":
refByte = (Byte)currentValue;
ser.Sync(member.Name, ref refByte);
currentValue = refByte;
break;
case "Byte[]":
refByteBuffer = new ByteBuffer((byte[])currentValue);
ser.Sync(member.Name, ref refByteBuffer);
currentValue = refByteBuffer.arr;
break;
case "ByteBuffer":
refByteBuffer = (ByteBuffer)currentValue;
ser.Sync(member.Name, ref refByteBuffer);
currentValue = refByteBuffer;
break;
case "Int16":
refInt16 = (Int16)currentValue;
ser.Sync(member.Name, ref refInt16);
currentValue = refInt16;
break;
case "Int32":
refInt32 = (Int32)currentValue;
ser.Sync(member.Name, ref refInt32);
currentValue = refInt32;
break;
case "Int32[]":
refIntBuffer = new IntBuffer((int[])currentValue);
ser.Sync(member.Name, ref refIntBuffer);
currentValue = refIntBuffer.arr;
break;
case "IntBuffer":
refIntBuffer = (IntBuffer)currentValue;
ser.Sync(member.Name, ref refIntBuffer);
currentValue = refIntBuffer;
break;
case "Point":
refPointX = ((Point)currentValue).X;
refPointY = ((Point)currentValue).Y;
ser.Sync(member.Name + "_X", ref refPointX);
ser.Sync(member.Name + "_Y", ref refPointY);
currentValue = new Point(refPointX, refPointY);
break;
case "Rectangle":
refPointX = ((Rectangle)currentValue).X;
refPointY = ((Rectangle)currentValue).Y;
refRectWidth = ((Rectangle)currentValue).Width;
refRectHeight = ((Rectangle)currentValue).Height;
ser.Sync(member.Name + "_X", ref refPointX);
ser.Sync(member.Name + "_Y", ref refPointY);
ser.Sync(member.Name + "_Height", ref refRectHeight);
ser.Sync(member.Name + "_Width", ref refRectWidth);
currentValue = new Rectangle(refPointX, refPointY, refRectWidth, refRectHeight);
break;
case "SByte":
refSByte = (SByte)currentValue;
ser.Sync(member.Name, ref refSByte);
currentValue = refSByte;
break;
case "UInt16":
refUInt16 = (UInt16)currentValue;
ser.Sync(member.Name, ref refUInt16);
currentValue = refUInt16;
break;
case "UInt32":
refUInt32 = (UInt32)currentValue;
ser.Sync(member.Name, ref refUInt32);
currentValue = refUInt32;
break;
default:
fail = true;
break;
}
}
if (member.MemberType == MemberTypes.Property)
{
if (propInfo.CanWrite && !fail)
{
MethodInfo setMethod = propInfo.GetSetMethod();
setMethod.Invoke(obj, new object[] { currentValue });
}
}
if (member.MemberType == MemberTypes.Property)
{
if (propInfo.CanWrite && !fail)
{
MethodInfo setMethod = propInfo.GetSetMethod();
setMethod.Invoke(obj, new object[] { currentValue });
}
}
if (member.MemberType == MemberTypes.Field)
{
fieldInfo.SetValue(obj, currentValue);
}
}
}
}
}
if (member.MemberType == MemberTypes.Field)
{
fieldInfo.SetValue(obj, currentValue);
}
}
}
}
}
}

View File

@ -1,4 +1,4 @@
namespace BizHawk.Emulation.Computers.Commodore64.Tape
namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
// common tape drive that works with the C64.