178 lines
5.4 KiB
C#
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;");
|
|
}
|
|
}
|
|
}
|