BizHawk/BizHawk.Emulation/Computers/Commodore64/C64.core.cs

145 lines
4.1 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2012-11-03 06:03:58 +00:00
using System.IO;
using System.Linq;
using System.Text;
using BizHawk.Emulation.CPUs.M6502;
namespace BizHawk.Emulation.Computers.Commodore64
{
public enum Region
{
NTSC,
PAL
}
public partial class C64 : IEmulator
{
// input
public Input input;
// source
public Cartridge cart;
2012-11-14 01:50:17 +00:00
public Drive1541 diskDrive;
2012-11-06 05:49:42 +00:00
public string extension;
2012-11-03 06:03:58 +00:00
public byte[] inputFile;
public List<IMedia> mediaAttached = new List<IMedia>();
2012-11-03 06:03:58 +00:00
// chipset
public Cia cia0;
public Cia cia1;
public MOS6502X cpu;
public Memory mem;
public Sid sid;
public VicII vic;
2012-11-05 14:24:01 +00:00
public ChipSignals signal;
public void HardReset()
{
// initalize cpu
cpu = new MOS6502X();
cpu.ReadMemory = ReadMemory;
cpu.WriteMemory = WriteMemory;
2012-11-03 06:03:58 +00:00
cpu.DummyReadMemory = PeekMemory;
// initialize cia timers
cia0 = new Cia(signal, Region.NTSC);
cia0.ports[0] = new DirectionalDataPort(0x00, 0x00, 0xFF);
cia0.ports[1] = new DirectionalDataPort(0x00, 0x00, 0xFF);
cia1 = new Cia(signal, Region.NTSC);
cia1.ports[0] = new DirectionalDataPort(0x00, 0x00, 0xFF);
cia1.ports[1] = new DirectionalDataPort(0x00, 0x00, 0xFF);
2012-11-03 06:03:58 +00:00
// initialize vic
2012-11-05 14:24:01 +00:00
signal = new ChipSignals();
vic = new VicII(signal, Region.NTSC);
2012-11-03 06:03:58 +00:00
// assume NTSC for now
CoreOutputComm.VsyncDen = vic.cyclesPerFrame;
CoreOutputComm.VsyncNum = (14318181 / 14);
// initialize sid
sid = new Sid(Region.NTSC, 44100); // we'll assume 44.1k for now until there's a better way
2012-11-03 06:03:58 +00:00
// initialize memory (this must be done AFTER all other chips are initialized)
string romPath = CoreInputComm.C64_FirmwaresPath;
mem = new Memory(romPath, vic, sid, cia0, cia1);
vic.mem = mem;
2012-11-03 06:03:58 +00:00
// initialize cpu hard reset vector
2012-11-06 05:49:42 +00:00
cpu.PC = (ushort)(ReadMemory(0xFFFC) + (ReadMemory(0xFFFD) << 8));
// initailize input
input = new Input(cia0.ports);
// initialize media
2012-11-06 05:49:42 +00:00
switch (extension.ToUpper())
{
2012-11-14 01:50:17 +00:00
case @".G64":
diskDrive = new Drive1541(File.ReadAllBytes(Path.Combine(romPath, @"dos1541")), Region.NTSC);
2012-11-14 01:50:17 +00:00
diskDrive.Insert(G64.Read(inputFile));
break;
case @".D64":
diskDrive = new Drive1541(File.ReadAllBytes(Path.Combine(romPath, @"dos1541")), Region.NTSC);
diskDrive.Insert(D64.Read(inputFile));
2012-11-14 01:50:17 +00:00
break;
2012-11-06 05:49:42 +00:00
case @".PRG":
if (inputFile.Length > 2)
mediaAttached.Add(new PRGFile(inputFile, mem, cpu));
2012-11-06 05:49:42 +00:00
break;
case @".CRT":
Cartridge newCart = new Cartridge(inputFile, mem);
if (newCart.valid)
{
cart = newCart;
mediaAttached.Add(cart);
}
else
{
cart = null;
}
2012-11-06 05:49:42 +00:00
break;
}
}
public void PollInput()
{
input.Poll();
signal.KeyboardNMI = input.restorePressed;
}
public byte ReadMemory(ushort addr)
{
2012-11-03 06:03:58 +00:00
return mem.Read(addr);
}
public void WriteMemory(ushort addr, byte value)
{
mem.Write(addr, value);
}
}
2012-11-05 14:24:01 +00:00
public class ChipSignals
{
private bool[] _CiaSerialInput = new bool[2];
2012-11-05 14:24:01 +00:00
private bool[] _CiaIRQOutput = new bool[2];
private bool _KeyboardNMIOutput;
2012-11-05 14:24:01 +00:00
private bool _VicAECOutput;
private bool _VicIRQOutput;
private bool _VicLPInput;
public bool CiaIRQ0 { get { return _CiaIRQOutput[0]; } set { _CiaIRQOutput[0] = value; } }
public bool CiaIRQ1 { get { return _CiaIRQOutput[1]; } set { _CiaIRQOutput[1] = value; } }
public bool CiaSerial0 { get { return _CiaSerialInput[0]; } }
public bool CiaSerial1 { get { return _CiaSerialInput[1]; } }
2012-11-05 14:24:01 +00:00
public bool CpuAEC { get { return _VicAECOutput; } }
public bool CpuIRQ { get { return _VicIRQOutput | _CiaIRQOutput[0]; } }
public bool CpuNMI { get { return _CiaIRQOutput[1] | _KeyboardNMIOutput; } }
public bool KeyboardNMI { get { return _KeyboardNMIOutput; } set { _KeyboardNMIOutput = value; } }
public bool LPOutput { get { return _VicLPInput; } set { _VicLPInput = value; } }
2012-11-05 14:24:01 +00:00
public bool VicAEC { get { return _VicAECOutput; } set { _VicAECOutput = value; } }
public bool VicIRQ { get { return _VicIRQOutput; } set { _VicIRQOutput = value; } }
public bool VicLP { get { return _VicLPInput; } }
}
}