BizHawk/CpuCoreGenerator/HuC6280/CDL.cs

178 lines
5.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace HuC6280
{
public partial class CoreGenerator
{
public void GenerateCDL(string file)
{
using (TextWriter w = new StreamWriter(file))
{
w.WriteLine("using System;");
w.WriteLine();
w.WriteLine("// Do not modify this file directly! This is GENERATED code.");
w.WriteLine("// Please open the CpuCoreGenerator solution and make your modifications there.");
w.WriteLine();
w.WriteLine("namespace BizHawk.Emulation.Cores.Components.H6280");
w.WriteLine("{");
w.WriteLine("\tpublic partial class HuC6280");
w.WriteLine("\t{");
w.WriteLine("\t\tvoid CDLOpcode()");
w.WriteLine("\t\t{");
w.WriteLine("\t\t\tbyte tmp8;");
w.WriteLine("\t\t\tbyte opcode = ReadMemory(PC);");
w.WriteLine("\t\t\tswitch (opcode)");
w.WriteLine("\t\t\t{");
for (int i = 0; i < 256; i++)
CDLOpcode(w, i);
w.WriteLine("\t\t\t}");
w.WriteLine("\t\t}");
w.WriteLine("\t}");
w.WriteLine("}");
}
}
void CDLOpcode(TextWriter w, int opcode)
{
// todo: T Flag
var op = Opcodes[opcode];
if (op == null)
{
// nop
w.WriteLine("\t\t\t\tcase 0x{0:X2}: // {1}", opcode, "??");
w.WriteLine("\t\t\t\t\tMarkCode(PC, 1);");
w.WriteLine("\t\t\t\t\tbreak;");
return;
}
w.WriteLine("\t\t\t\tcase 0x{0:X2}: // {1}", opcode, op);
w.WriteLine("\t\t\t\t\tMarkCode(PC, {0});", op.Size);
switch (op.AddressMode)
{
case AddrMode.Implicit:
switch (op.Instruction)
{
case "PHA": // push
case "PHP":
case "PHX":
case "PHY":
w.WriteLine("\t\t\t\t\tMarkPush(1);");
break;
case "PLA": // pop
case "PLP":
case "PLX":
case "PLY":
w.WriteLine("\t\t\t\t\tMarkPop(1);");
break;
case "RTI":
w.WriteLine("\t\t\t\t\tMarkPop(3);");
break;
case "RTS":
w.WriteLine("\t\t\t\t\tMarkPop(2);");
break;
}
break;
case AddrMode.Accumulator:
break;
case AddrMode.Immediate:
break;
case AddrMode.ZeroPage:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)));");
break;
case AddrMode.ZeroPageX:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)) + X);");
break;
case AddrMode.ZeroPageY:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)) + Y);");
break;
case AddrMode.ZeroPageR:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)));");
break;
case AddrMode.Absolute:
w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)));");
break;
case AddrMode.AbsoluteX:
w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)) + X);");
break;
case AddrMode.AbsoluteY:
w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)) + Y);");
break;
case AddrMode.Indirect:
w.WriteLine("\t\t\t\t\ttmp8 = ReadMemory((ushort)(PC + 1));");
w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);");
w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8));");
break;
case AddrMode.IndirectX:
w.WriteLine("\t\t\t\t\ttmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);");
w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);");
w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8));");
break;
case AddrMode.IndirectY:
w.WriteLine("\t\t\t\t\ttmp8 = ReadMemory((ushort)(PC + 1));");
w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);");
w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8) + Y);");
break;
case AddrMode.Relative:
break;
case AddrMode.BlockMove:
w.WriteLine("\t\t\t\t\tif (!InBlockTransfer)");
w.WriteLine("\t\t\t\t\t{");
w.WriteLine("\t\t\t\t\t\tMarkBTFrom(ReadWord((ushort)(PC + 1)));");
w.WriteLine("\t\t\t\t\t\tMarkBTTo(ReadWord((ushort)(PC + 3)));");
w.WriteLine("\t\t\t\t\t}");
w.WriteLine("\t\t\t\t\telse");
w.WriteLine("\t\t\t\t\t{");
switch (op.Instruction)
{
case "TII":
case "TDD":
case "TIN":
w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom);");
w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo);");
break;
case "TIA":
w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom);");
w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo+btAlternator);");
break;
case "TAI":
w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom+btAlternator);");
w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo);");
break;
}
w.WriteLine("\t\t\t\t\t\t}");
break;
case AddrMode.ImmZeroPage:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 2)));");
break;
case AddrMode.ImmZeroPageX:
w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 2)) + X);");
break;
case AddrMode.ImmAbsolute:
w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 2)));");
break;
case AddrMode.ImmAbsoluteX:
w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 2)) + X);");
break;
case AddrMode.AbsoluteIndirect:
w.WriteLine("\t\t\t\t\tMarkFptr(ReadWord((ushort)(PC + 1)));");
break;
case AddrMode.AbsoluteIndirectX:
w.WriteLine("\t\t\t\t\tMarkFptr(ReadWord((ushort)(PC + 1)) + X);");
break;
}
w.WriteLine("\t\t\t\t\tbreak;");
}
}
}