BizHawk/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs

140 lines
3.3 KiB
C#
Raw Normal View History

using System;
using System.IO;
2016-12-07 15:55:25 +00:00
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Components.CP1610
{
public sealed partial class CP1610
{
private const ushort RESET = 0x1000;
private const ushort INTERRUPT = 0x1004;
2012-09-22 05:01:04 +00:00
private bool FlagS, FlagC, FlagZ, FlagO, FlagI, FlagD, IntRM, BusRq, BusAk, Interruptible, Interrupted;
//private bool MSync;
2016-12-07 15:55:25 +00:00
private ushort[] Register = new ushort[8];
private ushort RegisterSP { get { return Register[6]; } set { Register[6] = value; } }
private ushort RegisterPC { get { return Register[7]; } set { Register[7] = value; } }
public string TraceHeader
{
get
{
2016-11-12 17:58:10 +00:00
return "CP1610: PC, machine code, mnemonic, operands, flags (SCZOID)";
}
}
public Action<TraceInfo> TraceCallback;
public int TotalExecutedCycles;
public int PendingCycles;
public Func<ushort, ushort> ReadMemory;
public Func<ushort, ushort, bool> WriteMemory;
2017-02-08 23:26:30 +00:00
private static bool Logging = false;
private static readonly StreamWriter Log;
2016-12-07 15:55:25 +00:00
public void SyncState(Serializer ser)
{
ser.BeginSection("CP1610");
ser.Sync("Register", ref Register, false);
ser.Sync("FlagS", ref FlagS);
ser.Sync("FlagC", ref FlagC);
ser.Sync("FlagZ", ref FlagZ);
ser.Sync("FlagO", ref FlagO);
ser.Sync("FlagI", ref FlagI);
ser.Sync("FlagD", ref FlagD);
ser.Sync("IntRM", ref IntRM);
ser.Sync("BusRq", ref BusRq);
ser.Sync("BusAk", ref BusAk);
ser.Sync("BusRq", ref BusRq);
ser.Sync("Interruptible", ref Interruptible);
ser.Sync("Interrupted", ref Interrupted);
ser.Sync("Toal_executed_cycles", ref TotalExecutedCycles);
2016-12-14 23:35:03 +00:00
ser.Sync("Pending_Cycles", ref PendingCycles);
2016-12-07 15:55:25 +00:00
ser.EndSection();
}
static CP1610()
{
if (Logging)
{
Log = new StreamWriter("log_CP1610.txt");
}
}
public void Reset()
{
BusAk = true;
Interruptible = false;
FlagS = FlagC = FlagZ = FlagO = FlagI = FlagD = false;
for (int register = 0; register <= 6; register++)
{
Register[register] = 0;
}
RegisterPC = RESET;
}
public bool GetBusAk()
{
return BusAk;
}
public void SetIntRM(bool value)
{
IntRM = value;
if (IntRM)
{
Interrupted = false;
}
}
public void SetBusRq(bool value)
{
BusRq = !value;
}
public int GetPendingCycles()
{
return PendingCycles;
}
public void AddPendingCycles(int cycles)
{
PendingCycles += cycles;
}
public void LogData()
{
if (!Logging)
{
return;
}
Log.WriteLine("Total Executed Cycles = {0}", TotalExecutedCycles);
for (int register = 0; register <= 5; register++)
{
Log.WriteLine("R{0:d} = {1:X4}", register, Register[register]);
}
Log.WriteLine("SP = {0:X4}", RegisterSP);
Log.WriteLine("PC = {0:X4}", RegisterPC);
Log.WriteLine("S = {0}", FlagS);
Log.WriteLine("C = {0}", FlagC);
Log.WriteLine("Z = {0}", FlagZ);
Log.WriteLine("O = {0}", FlagO);
Log.WriteLine("I = {0}", FlagI);
Log.WriteLine("D = {0}", FlagD);
Log.WriteLine("INTRM = {0}", IntRM);
Log.WriteLine("BUSRQ = {0}", BusRq);
Log.WriteLine("BUSAK = {0}", BusAk);
// Log.WriteLine("MSYNC = {0}", MSync);
Log.Flush();
}
2016-11-12 17:58:10 +00:00
}
}