diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
index 670299057f..33a762a693 100644
--- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
+++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
@@ -414,6 +414,7 @@
+
@@ -452,6 +453,8 @@
+
+
diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs
new file mode 100644
index 0000000000..fb6d77dc39
--- /dev/null
+++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs
@@ -0,0 +1,155 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BizHawk.Emulation.Cores.Components.H6280
+{
+ public partial class HuC6280
+ {
+ public struct MemMapping
+ {
+ public string Name;
+ public int Offs;
+ }
+ public MemMapping[] Mappings; // = new MemMapping[256];
+
+ public Dictionary CodeDataLog = new Dictionary();
+
+ ///
+ /// create a new empty CodeDataLog to match the Mappings
+ ///
+ public void InitCDL()
+ {
+ Dictionary sizes = new Dictionary();
+ foreach (var m in Mappings)
+ {
+ if (!sizes.ContainsKey(m.Name) || m.Offs >= sizes[m.Name])
+ sizes[m.Name] = m.Offs;
+ }
+
+ CodeDataLog.Clear();
+ foreach (var kvp in sizes)
+ {
+ // becase we were looking at offsets, and each bank is 8192 big, we need to add that size
+ CodeDataLog[kvp.Key] = new byte[kvp.Value + 8192];
+ }
+ }
+
+
+
+ [Flags]
+ enum CDLUsage : byte
+ {
+ // was fetched as an opcode
+ Code = 0x01,
+ // was read or written as data
+ Data = 0x02,
+ // was read and used as a pointer to data via indirect addressing
+ DataPtr = 0x04,
+ // was read or written as stack
+ Stack = 0x08,
+ // was read or written as data via indirect addressing
+ IndirectData = 0x10,
+ // was read and used as function pointer
+ // NB: there is no "IndirectCode"; all code is marked simply as code regardless of how it is reached
+ FcnPtr = 0x20,
+ // was used as a source (either initial or during the loop) of a block xfer
+ BlockFrom = 0x40,
+ // was used as a destination (either initial or during the loop) of a block xfer
+ BlockTo = 0x80
+ }
+
+ void Mark(ushort addr, CDLUsage flag)
+ {
+ var m = Mappings[MPR[addr >> 13]];
+ CodeDataLog[m.Name][addr & 0x1fff | m.Offs] |= (byte)flag;
+ }
+
+ // mark addr as having been fetched for execute
+ void MarkCode(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ Mark(addr, CDLUsage.Code);
+ }
+
+ // mark addr as having been seen as data
+ void MarkAddr(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ Mark(addr, CDLUsage.Data);
+ }
+
+ // convert address to zero-page, then mark as data
+ void MarkZP(int addr_)
+ {
+ ushort addr = (ushort)(addr_ & 0xff | 0x2000);
+ Mark(addr, CDLUsage.Data);
+ }
+
+ // convert address to zero-page, then return the pointer stored there
+ ushort GetIndirect(int addr_)
+ {
+ ushort addr = (ushort)(addr_ & 0xff | 0x2000);
+ return ReadWordPageWrap(addr);
+ }
+
+ // convert address to zero-page, then mark as pointer (two bytes)
+ void MarkZPPtr(int addr_)
+ {
+ ushort addr = (ushort)(addr_ & 0xff | 0x2000);
+ ushort addr2 = (ushort)(addr & 0xff00 | (addr + 1) & 0x00ff);
+ Mark(addr, CDLUsage.DataPtr);
+ Mark(addr2, CDLUsage.DataPtr);
+ }
+
+ // mark address as destination data of an indirect pointer
+ void MarkIndirect(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ Mark(addr, CDLUsage.IndirectData);
+ }
+
+ // mark stack space
+ void MarkPush(int n)
+ {
+ for (int i = 0; i < n; i++)
+ {
+ ushort addr = (ushort)(S - i);
+ Mark(addr, CDLUsage.Stack);
+ }
+ }
+
+ void MarkPop(int n)
+ {
+ for (int i = 0; i < n; i++)
+ {
+ ushort addr = (ushort)(S + i + 1);
+ Mark(addr, CDLUsage.Stack);
+ }
+ }
+
+ // mark addr as function pointer (2 bytes)
+ void MarkFptr(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ ushort addr2 = (ushort)(addr & 0xff00 | (addr + 1) & 0x00ff);
+ Mark(addr, CDLUsage.FcnPtr);
+ Mark(addr2, CDLUsage.FcnPtr);
+ }
+
+ // block transfer "from"
+ void MarkBTFrom(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ Mark(addr, CDLUsage.BlockFrom);
+ }
+
+ // block transfer "to"
+ void MarkBTTo(int addr_)
+ {
+ ushort addr = (ushort)addr_;
+ Mark(addr, CDLUsage.BlockTo);
+ }
+ }
+}
diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs
new file mode 100644
index 0000000000..24c51007f8
--- /dev/null
+++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs
@@ -0,0 +1,1287 @@
+using System;
+
+// Do not modify this file directly! This is GENERATED code.
+// Please open the CpuCoreGenerator solution and make your modifications there.
+
+namespace BizHawk.Emulation.Cores.Components.H6280
+{
+ public partial class HuC6280
+ {
+ void CDLOpcode()
+ {
+ byte tmp8;
+ byte opcode = ReadMemory(PC);
+ switch (opcode)
+ {
+ case 0x00: // BRK
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x01: // ORA (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x02: // SXY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x03: // ST0 #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x04: // TSB zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x05: // ORA zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x06: // ASL zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x07: // RMB0 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x08: // PHP
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPush(1);
+ break;
+ case 0x09: // ORA #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x0A: // ASL A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x0B: // ??
+ MarkCode(PC);
+ break;
+ case 0x0C: // TSB addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x0D: // ORA addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x0E: // ASL addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x0F: // BBR0
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x10: // BPL +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x11: // ORA (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0x12: // ORA (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x13: // ST1 #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x14: // TRB zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x15: // ORA zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x16: // ASL zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x17: // RMB1 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x18: // CLC
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x19: // ORA addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0x1A: // INC A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x1B: // ??
+ MarkCode(PC);
+ break;
+ case 0x1C: // TRB addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x1D: // ORA addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x1E: // ASL addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x1F: // BBR1
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x20: // JSR addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x21: // AND (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x22: // SAX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x23: // ST2 #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x24: // BIT zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x25: // AND zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x26: // ROL zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x27: // RMB2 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x28: // PLP
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(1);
+ break;
+ case 0x29: // AND #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x2A: // ROL A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x2B: // ??
+ MarkCode(PC);
+ break;
+ case 0x2C: // BIT addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x2D: // AND addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x2E: // ROL addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x2F: // BBR2
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x30: // BMI +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x31: // AND (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0x32: // AND (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x33: // ??
+ MarkCode(PC);
+ break;
+ case 0x34: // BIT zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x35: // AND zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x36: // ROL zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x37: // RMB3 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x38: // SEC
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x39: // AND addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0x3A: // DEC A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x3B: // ??
+ MarkCode(PC);
+ break;
+ case 0x3C: // BIT addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x3D: // AND addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x3E: // ROL addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x3F: // BBR3
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x40: // RTI
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(3);
+ break;
+ case 0x41: // EOR (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x42: // SAY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x43: // TMA #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x44: // BSR +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x45: // EOR zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x46: // LSR zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x47: // RMB4 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x48: // PHA
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPush(1);
+ break;
+ case 0x49: // EOR #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x4A: // LSR A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x4B: // ??
+ MarkCode(PC);
+ break;
+ case 0x4C: // JMP addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x4D: // EOR addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x4E: // LSR addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x4F: // BBR4
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x50: // BVC +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x51: // EOR (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0x52: // EOR (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x53: // TAM #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x54: // CSL
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x55: // EOR zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x56: // LSR zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x57: // RMB5 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x58: // CLI
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x59: // EOR addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0x5A: // PHY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPush(1);
+ break;
+ case 0x5B: // ??
+ MarkCode(PC);
+ break;
+ case 0x5C: // ??
+ MarkCode(PC);
+ break;
+ case 0x5D: // EOR addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x5E: // LSR addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x5F: // BBR5
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x60: // RTS
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(2);
+ break;
+ case 0x61: // ADC (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x62: // CLA
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x63: // ??
+ MarkCode(PC);
+ break;
+ case 0x64: // STZ zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x65: // ADC zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x66: // ROR zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x67: // RMB6 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x68: // PLA
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(1);
+ break;
+ case 0x69: // ADC #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x6A: // ROR A
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x6B: // ??
+ MarkCode(PC);
+ break;
+ case 0x6C: // JMP
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkFptr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x6D: // ADC addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x6E: // ROR addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x6F: // BBR6
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x70: // BVS +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x71: // ADC (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0x72: // ADC (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x73: // TII src, dest, len
+ for (int i = 0; i < 7; i++)
+ MarkCode(PC + i);
+ if (!InBlockTransfer)
+ {
+ MarkBTFrom(ReadWord((ushort)(PC + 1)));
+ MarkBTTo(ReadWord((ushort)(PC + 3)));
+ }
+ else
+ {
+ MarkBTFrom(btFrom);
+ MarkBTTo(btTo);
+ }
+ break;
+ case 0x74: // STZ zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x75: // ADC zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x76: // ROR zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x77: // RMB7 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x78: // SEI
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x79: // ADC addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0x7A: // PLY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(1);
+ break;
+ case 0x7B: // ??
+ MarkCode(PC);
+ break;
+ case 0x7C: // JMP
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkFptr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x7D: // ADC addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x7E: // ROR addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x7F: // BBR7
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x80: // BRA +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x81: // STA (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x82: // CLX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x83: // TST
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 2)));
+ break;
+ case 0x84: // STY zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x85: // STA zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x86: // STX zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x87: // SMB0 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x88: // DEY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x89: // BIT #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x8A: // TXA
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x8B: // ??
+ MarkCode(PC);
+ break;
+ case 0x8C: // STY addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x8D: // STA addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x8E: // STX addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x8F: // BBS0
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x90: // BCC +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x91: // STA (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0x92: // STA (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0x93: // TST
+ for (int i = 0; i < 4; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 2)));
+ break;
+ case 0x94: // STY zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x95: // STA zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0x96: // STX zp,Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + Y);
+ break;
+ case 0x97: // SMB1 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0x98: // TYA
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x99: // STA addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0x9A: // TXS
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0x9B: // ??
+ MarkCode(PC);
+ break;
+ case 0x9C: // STZ addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0x9D: // STA addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x9E: // STZ addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0x9F: // BBS1
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xA0: // LDY #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xA1: // LDA (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xA2: // LDX #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xA3: // TST
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 2)) + X);
+ break;
+ case 0xA4: // LDY zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xA5: // LDA zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xA6: // LDX zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xA7: // SMB2 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xA8: // TAY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xA9: // LDA #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xAA: // TAX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xAB: // ??
+ MarkCode(PC);
+ break;
+ case 0xAC: // LDY addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xAD: // LDA addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xAE: // LDX addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xAF: // BBS2
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xB0: // BCS +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xB1: // LDA (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0xB2: // LDA (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xB3: // TST
+ for (int i = 0; i < 4; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 2)) + X);
+ break;
+ case 0xB4: // LDY zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xB5: // LDA zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xB6: // LDX zp,Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + Y);
+ break;
+ case 0xB7: // SMB3 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xB8: // CLV
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xB9: // LDA addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0xBA: // TSX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xBB: // ??
+ MarkCode(PC);
+ break;
+ case 0xBC: // LDY addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xBD: // LDA addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xBE: // LDX addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0xBF: // BBS3
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xC0: // CPY #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xC1: // CMP (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xC2: // CLY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xC3: // TDD src, dest, len
+ for (int i = 0; i < 7; i++)
+ MarkCode(PC + i);
+ if (!InBlockTransfer)
+ {
+ MarkBTFrom(ReadWord((ushort)(PC + 1)));
+ MarkBTTo(ReadWord((ushort)(PC + 3)));
+ }
+ else
+ {
+ MarkBTFrom(btFrom);
+ MarkBTTo(btTo);
+ }
+ break;
+ case 0xC4: // CPY zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xC5: // CMP zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xC6: // DEC zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xC7: // SMB4 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xC8: // INY
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xC9: // CMP #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xCA: // DEX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xCB: // ??
+ MarkCode(PC);
+ break;
+ case 0xCC: // CPY addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xCD: // CMP addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xCE: // DEC addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xCF: // BBS4
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xD0: // BNE +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xD1: // CMP (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0xD2: // CMP (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xD3: // TIN src, dest, len
+ for (int i = 0; i < 7; i++)
+ MarkCode(PC + i);
+ if (!InBlockTransfer)
+ {
+ MarkBTFrom(ReadWord((ushort)(PC + 1)));
+ MarkBTTo(ReadWord((ushort)(PC + 3)));
+ }
+ else
+ {
+ MarkBTFrom(btFrom);
+ MarkBTTo(btTo);
+ }
+ break;
+ case 0xD4: // CSH
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xD5: // CMP zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xD6: // DEC zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xD7: // SMB5 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xD8: // CLD
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xD9: // CMP addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0xDA: // PHX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPush(1);
+ break;
+ case 0xDB: // ??
+ MarkCode(PC);
+ break;
+ case 0xDC: // ??
+ MarkCode(PC);
+ break;
+ case 0xDD: // CMP addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xDE: // DEC addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xDF: // BBS5
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xE0: // CPX #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xE1: // SBC (addr,X)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xE2: // ??
+ MarkCode(PC);
+ break;
+ case 0xE3: // TIA src, dest, len
+ for (int i = 0; i < 7; i++)
+ MarkCode(PC + i);
+ if (!InBlockTransfer)
+ {
+ MarkBTFrom(ReadWord((ushort)(PC + 1)));
+ MarkBTTo(ReadWord((ushort)(PC + 3)));
+ }
+ else
+ {
+ MarkBTFrom(btFrom);
+ MarkBTTo(btTo+btAlternator);
+ }
+ break;
+ case 0xE4: // CPX zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xE5: // SBC zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xE6: // INC zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xE7: // SMB6 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xE8: // INX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xE9: // SBC #nn
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xEA: // NOP
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xEB: // ??
+ MarkCode(PC);
+ break;
+ case 0xEC: // CPX addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xED: // SBC addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xEE: // INC addr
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)));
+ break;
+ case 0xEF: // BBS6
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xF0: // BEQ +/-rel
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xF1: // SBC (addr),Y
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8) + Y);
+ break;
+ case 0xF2: // SBC (addr)
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ tmp8 = ReadMemory((ushort)(PC + 1));
+ MarkZPPtr(tmp8);
+ MarkIndirect(GetIndirect(tmp8));
+ break;
+ case 0xF3: // TAI src, dest, len
+ for (int i = 0; i < 7; i++)
+ MarkCode(PC + i);
+ if (!InBlockTransfer)
+ {
+ MarkBTFrom(ReadWord((ushort)(PC + 1)));
+ MarkBTTo(ReadWord((ushort)(PC + 3)));
+ }
+ else
+ {
+ MarkBTFrom(btFrom+btAlternator);
+ MarkBTTo(btTo);
+ }
+ break;
+ case 0xF4: // SET
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xF5: // SBC zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xF6: // INC zp,X
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)) + X);
+ break;
+ case 0xF7: // SMB7 zp
+ for (int i = 0; i < 2; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ case 0xF8: // SED
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ break;
+ case 0xF9: // SBC addr,Y
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + Y);
+ break;
+ case 0xFA: // PLX
+ for (int i = 0; i < 1; i++)
+ MarkCode(PC + i);
+ MarkPop(1);
+ break;
+ case 0xFB: // ??
+ MarkCode(PC);
+ break;
+ case 0xFC: // ??
+ MarkCode(PC);
+ break;
+ case 0xFD: // SBC addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xFE: // INC addr,X
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkAddr(ReadWord((ushort)(PC + 1)) + X);
+ break;
+ case 0xFF: // BBS7
+ for (int i = 0; i < 3; i++)
+ MarkCode(PC + i);
+ MarkZP(ReadMemory((ushort)(PC + 1)));
+ break;
+ }
+ }
+ }
+}
diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs
new file mode 100644
index 0000000000..889553e0ce
--- /dev/null
+++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using BizHawk.Emulation.Cores.Components.H6280;
+
+namespace BizHawk.Emulation.Cores.PCEngine
+{
+ partial class PCEngine
+ {
+ static void CDLMappingApplyRange(HuC6280.MemMapping[] mm, string name, int block, int len)
+ {
+ for (int i = block, offs = 0; i < 256 && len > offs; i++, offs += 8192)
+ {
+ mm[i].Name = name;
+ mm[i].Offs = offs;
+ }
+ }
+
+ ///
+ /// informs the CPU of the general memory layout, so it can do CDL
+ ///
+ void InitCDLMappings()
+ {
+ // todo: arcade card
+
+ var mm = new HuC6280.MemMapping[256];
+
+ CDLMappingApplyRange(mm, "ROM", 0x00, RomLength);
+ if (PopulousRAM != null)
+ CDLMappingApplyRange(mm, "Populous RAM", 0x40, PopulousRAM.Length);
+
+ if (SuperRam != null)
+ CDLMappingApplyRange(mm, "Super RAM", 0x68, SuperRam.Length);
+
+ if (CDRam != null)
+ CDLMappingApplyRange(mm, "CD RAM", 0x80, CDRam.Length);
+
+ if (BRAM != null)
+ CDLMappingApplyRange(mm, "BRAM", 0xf7, BRAM.Length);
+
+ {
+ var rammirrors = new HuC6280.MemMapping { Name = "RAM", Offs = 0 };
+ mm[0xf9] = mm[0xfa] = mm[0xfb] = rammirrors;
+ }
+ CDLMappingApplyRange(mm, "RAM", 0xf8, Ram.Length);
+
+ mm[0xff] = new HuC6280.MemMapping { Name = "MMIO", Offs = 0 };
+
+ for (int i = 0; i < 256; i++)
+ {
+ if (mm[i].Name == null)
+ mm[i].Name = "UNKNOWN";
+ }
+
+ Cpu.Mappings = mm;
+ }
+ }
+}
diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs
index 70b6fd0c4c..2e671a2235 100644
--- a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs
+++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs
@@ -61,4 +61,4 @@ namespace BizHawk.Emulation.Cores.PCEngine
Log.Error("MEM", "UNHANDLED WRITE: {0:X6}:{1:X2}", addr, value);
}
}
-}
\ No newline at end of file
+}
diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs
index 1174f6bd98..757dc7dcd2 100644
--- a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs
+++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs
@@ -66,4 +66,4 @@ namespace BizHawk.Emulation.Cores.PCEngine
Log.Error("MEM", "UNHANDLED WRITE: {0:X6}:{1:X2}", addr, value);
}
}
-}
\ No newline at end of file
+}
diff --git a/CpuCoreGenerator/CpuCoreGenerator.csproj b/CpuCoreGenerator/CpuCoreGenerator.csproj
index 4bcd4b222d..6c5159d7c8 100644
--- a/CpuCoreGenerator/CpuCoreGenerator.csproj
+++ b/CpuCoreGenerator/CpuCoreGenerator.csproj
@@ -61,6 +61,7 @@
+
diff --git a/CpuCoreGenerator/HuC6280/CDL.cs b/CpuCoreGenerator/HuC6280/CDL.cs
new file mode 100644
index 0000000000..26dea836aa
--- /dev/null
+++ b/CpuCoreGenerator/HuC6280/CDL.cs
@@ -0,0 +1,178 @@
+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);");
+ 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\tfor (int i = 0; i < {0}; i++)", op.Size);
+ w.WriteLine("\t\t\t\t\t\tMarkCode(PC + i);");
+
+ 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;");
+ }
+ }
+}
diff --git a/CpuCoreGenerator/Program.cs b/CpuCoreGenerator/Program.cs
index 5f064b2400..b4bd57ee93 100644
--- a/CpuCoreGenerator/Program.cs
+++ b/CpuCoreGenerator/Program.cs
@@ -12,5 +12,6 @@
y.InitOpcodeTable();
y.GenerateDisassembler("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs");
y.GenerateExecutor("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/Execute.cs");
+ y.GenerateCDL("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs");
}
}