From bdbaa0c2d91c9076e3d0229b4db76fe24be9d289 Mon Sep 17 00:00:00 2001 From: goyuken Date: Thu, 20 Feb 2014 22:59:37 +0000 Subject: [PATCH] PCE CDL: add a new "disassemble" command. this makes a text dump of every opcode that has been mapped out so far, dumping memory domain, address within the domain, and huc6280 disassembly --- .../tools/PCE/PCECDL.Designer.cs | 28 +- BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs | 20 + BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs | 64 +- .../CPUs/HuC6280/CDLOpcodes.cs | 746 ++++++------------ .../CPUs/HuC6280/Disassembler.cs | 246 ++++++ .../Consoles/PC Engine/CDL File Format.txt | 8 +- CpuCoreGenerator/HuC6280/CDL.cs | 5 +- CpuCoreGenerator/HuC6280/CoreGenerator.cs | 21 +- 8 files changed, 619 insertions(+), 519 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.Designer.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.Designer.cs index 7d0dedfbd0..c8b053037b 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.Designer.cs @@ -31,12 +31,13 @@ this.checkBox1 = new System.Windows.Forms.CheckBox(); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.unionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.textBox1 = new System.Windows.Forms.TextBox(); + this.disassembleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // @@ -69,11 +70,19 @@ this.clearToolStripMenuItem, this.loadToolStripMenuItem, this.saveToolStripMenuItem, - this.unionToolStripMenuItem}); + this.unionToolStripMenuItem, + this.disassembleToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); this.fileToolStripMenuItem.Text = "&File"; // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.newToolStripMenuItem.Text = "&New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // // clearToolStripMenuItem // this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; @@ -102,13 +111,6 @@ this.unionToolStripMenuItem.Text = "&Union..."; this.unionToolStripMenuItem.Click += new System.EventHandler(this.unionToolStripMenuItem_Click); // - // newToolStripMenuItem - // - this.newToolStripMenuItem.Name = "newToolStripMenuItem"; - this.newToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.newToolStripMenuItem.Text = "&New"; - this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); - // // textBox1 // this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -121,6 +123,13 @@ this.textBox1.Size = new System.Drawing.Size(292, 211); this.textBox1.TabIndex = 3; // + // disassembleToolStripMenuItem + // + this.disassembleToolStripMenuItem.Name = "disassembleToolStripMenuItem"; + this.disassembleToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.disassembleToolStripMenuItem.Text = "&Disassemble..."; + this.disassembleToolStripMenuItem.Click += new System.EventHandler(this.disassembleToolStripMenuItem_Click); + // // PCECDL // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -151,6 +160,7 @@ private System.Windows.Forms.ToolStripMenuItem unionToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ToolStripMenuItem disassembleToolStripMenuItem; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs index dbf9e9266c..74b1b4497e 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs @@ -201,5 +201,25 @@ namespace BizHawk.Client.EmuHawk } emu.Cpu.CDLLoggingActive = checkBox1.Checked; } + + private void disassembleToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CDL == null) + { + MessageBox.Show(this, "Cannot disassemble with no CDL loaded!", "Alert"); + } + else + { + var sfd = new SaveFileDialog(); + var result = sfd.ShowDialog(this); + if (result == DialogResult.OK) + { + using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.Write)) + { + CDL.Disassemble(fs, Global.Emulator.MemoryDomains); + } + } + } + } } } diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs index 406602a8c0..4ebcd298e3 100644 --- a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs +++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; +using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Components.H6280 { @@ -51,6 +52,44 @@ namespace BizHawk.Emulation.Cores.Components.H6280 w.Flush(); } + public void Disassemble(Stream s, MemoryDomainList mem) + { + var w = new StreamWriter(s); + w.WriteLine("; Bizhawk CDL Disassembly"); + w.WriteLine(); + foreach (var kvp in this) + { + w.WriteLine(".\"{0}\" size=0x{1:x8}", kvp.Key, kvp.Value.Length); + + byte[] cd = kvp.Value; + var md = mem[kvp.Key]; + + for (int i = 0; i < kvp.Value.Length; i++) + { + if ((kvp.Value[i] & (byte)HuC6280.CDLUsage.Code) != 0) + { + int unused; + string dis = HuC6280.DisassembleExt( + 0, + out unused, + delegate(ushort addr) + { + return md.PeekByte(addr + i); + }, + delegate(ushort addr) + { + return md.PeekWord(addr + i, false); + } + ); + w.WriteLine("0x{0:x8}: {1}", i, dis); + } + } + w.WriteLine(); + } + w.WriteLine("; EOF"); + w.Flush(); + } + public static CodeDataLog Load(Stream s) { var t = new CodeDataLog(); @@ -130,9 +169,9 @@ namespace BizHawk.Emulation.Cores.Components.H6280 public bool CDLLoggingActive = false; [Flags] - enum CDLUsage : byte + public enum CDLUsage : byte { - // was fetched as an opcode + // was fetched as an opcode first byte Code = 0x01, // was read or written as data Data = 0x02, @@ -145,10 +184,10 @@ namespace BizHawk.Emulation.Cores.Components.H6280 // 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 + // was used as a source or destination (either initial or during the loop) of a block xfer + BlockXFer = 0x40, + // was fetched as an operand byte to an opcode + CodeOperand = 0x80 } void Mark(ushort addr, CDLUsage flag) @@ -158,10 +197,13 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } // mark addr as having been fetched for execute - void MarkCode(int addr_) + void MarkCode(int addr_, int n) { - ushort addr = (ushort)addr_; - Mark(addr, CDLUsage.Code); + for (int i = 0; i < n; i++) + { + ushort addr = (ushort)(addr_ + i); + Mark(addr, i == 0 ? CDLUsage.Code : CDLUsage.CodeOperand); + } } // mark addr as having been seen as data @@ -233,14 +275,14 @@ namespace BizHawk.Emulation.Cores.Components.H6280 void MarkBTFrom(int addr_) { ushort addr = (ushort)addr_; - Mark(addr, CDLUsage.BlockFrom); + Mark(addr, CDLUsage.BlockXFer); } // block transfer "to" void MarkBTTo(int addr_) { ushort addr = (ushort)addr_; - Mark(addr, CDLUsage.BlockTo); + Mark(addr, CDLUsage.BlockXFer); } } } diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs index 24c51007f8..e8c5c59cfb 100644 --- a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs +++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs @@ -14,558 +14,452 @@ namespace BizHawk.Emulation.Cores.Components.H6280 switch (opcode) { case 0x00: // BRK - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x01: // ORA (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0x03: // ST0 #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x04: // TSB zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x05: // ORA zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x06: // ASL zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x07: // RMB0 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x08: // PHP - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPush(1); break; case 0x09: // ORA #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x0A: // ASL A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x0B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x0C: // TSB addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x0D: // ORA addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x0E: // ASL addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x0F: // BBR0 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x10: // BPL +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x11: // ORA (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); break; case 0x14: // TRB zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x15: // ORA zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x16: // ASL zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x17: // RMB1 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x18: // CLC - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x19: // ORA addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0x1A: // INC A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x1B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x1C: // TRB addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x1D: // ORA addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x1E: // ASL addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x1F: // BBR1 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x20: // JSR addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x21: // AND (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0x23: // ST2 #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x24: // BIT zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x25: // AND zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x26: // ROL zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x27: // RMB2 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x28: // PLP - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(1); break; case 0x29: // AND #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x2A: // ROL A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x2B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x2C: // BIT addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x2D: // AND addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x2E: // ROL addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x2F: // BBR2 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x30: // BMI +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x31: // AND (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); tmp8 = ReadMemory((ushort)(PC + 1)); MarkZPPtr(tmp8); MarkIndirect(GetIndirect(tmp8)); break; case 0x33: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x34: // BIT zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x35: // AND zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x36: // ROL zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x37: // RMB3 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x38: // SEC - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x39: // AND addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0x3A: // DEC A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x3B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x3C: // BIT addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x3D: // AND addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x3E: // ROL addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x3F: // BBR3 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x40: // RTI - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(3); break; case 0x41: // EOR (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0x43: // TMA #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x44: // BSR +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x45: // EOR zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x46: // LSR zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x47: // RMB4 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x48: // PHA - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPush(1); break; case 0x49: // EOR #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x4A: // LSR A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x4B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x4C: // JMP addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x4D: // EOR addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x4E: // LSR addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x4F: // BBR4 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x50: // BVC +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x51: // EOR (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); break; case 0x54: // CSL - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x55: // EOR zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x56: // LSR zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x57: // RMB5 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x58: // CLI - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x59: // EOR addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0x5A: // PHY - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPush(1); break; case 0x5B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x5C: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x5D: // EOR addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x5E: // LSR addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x5F: // BBR5 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x60: // RTS - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(2); break; case 0x61: // ADC (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0x63: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x64: // STZ zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x65: // ADC zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x66: // ROR zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x67: // RMB6 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x68: // PLA - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(1); break; case 0x69: // ADC #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x6A: // ROR A - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x6B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x6C: // JMP - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkFptr(ReadWord((ushort)(PC + 1))); break; case 0x6D: // ADC addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x6E: // ROR addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x6F: // BBR6 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x70: // BVS +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x71: // ADC (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); 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); + MarkCode(PC, 7); if (!InBlockTransfer) { MarkBTFrom(ReadWord((ushort)(PC + 1))); @@ -578,388 +472,313 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } break; case 0x74: // STZ zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x75: // ADC zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x76: // ROR zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x77: // RMB7 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x78: // SEI - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x79: // ADC addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0x7A: // PLY - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(1); break; case 0x7B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x7C: // JMP - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkFptr(ReadWord((ushort)(PC + 1)) + X); break; case 0x7D: // ADC addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x7E: // ROR addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x7F: // BBR7 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x80: // BRA +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x81: // STA (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0x83: // TST - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 2))); break; case 0x84: // STY zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x85: // STA zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x86: // STX zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x87: // SMB0 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x88: // DEY - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x89: // BIT #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x8A: // TXA - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x8B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x8C: // STY addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x8D: // STA addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x8E: // STX addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x8F: // BBS0 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x90: // BCC +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0x91: // STA (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); tmp8 = ReadMemory((ushort)(PC + 1)); MarkZPPtr(tmp8); MarkIndirect(GetIndirect(tmp8)); break; case 0x93: // TST - for (int i = 0; i < 4; i++) - MarkCode(PC + i); + MarkCode(PC, 4); MarkAddr(ReadWord((ushort)(PC + 2))); break; case 0x94: // STY zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x95: // STA zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0x96: // STX zp,Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + Y); break; case 0x97: // SMB1 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0x98: // TYA - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x99: // STA addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0x9A: // TXS - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0x9B: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0x9C: // STZ addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0x9D: // STA addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x9E: // STZ addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0x9F: // BBS1 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xA0: // LDY #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xA1: // LDA (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); break; case 0xA3: // TST - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 2)) + X); break; case 0xA4: // LDY zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xA5: // LDA zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xA6: // LDX zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xA7: // SMB2 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xA8: // TAY - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xA9: // LDA #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xAA: // TAX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xAB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xAC: // LDY addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xAD: // LDA addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xAE: // LDX addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xAF: // BBS2 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xB0: // BCS +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xB1: // LDA (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); tmp8 = ReadMemory((ushort)(PC + 1)); MarkZPPtr(tmp8); MarkIndirect(GetIndirect(tmp8)); break; case 0xB3: // TST - for (int i = 0; i < 4; i++) - MarkCode(PC + i); + MarkCode(PC, 4); MarkAddr(ReadWord((ushort)(PC + 2)) + X); break; case 0xB4: // LDY zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xB5: // LDA zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xB6: // LDX zp,Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + Y); break; case 0xB7: // SMB3 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xB8: // CLV - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xB9: // LDA addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0xBA: // TSX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xBB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xBC: // LDY addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xBD: // LDA addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xBE: // LDX addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0xBF: // BBS3 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xC0: // CPY #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xC1: // CMP (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 1); break; case 0xC3: // TDD src, dest, len - for (int i = 0; i < 7; i++) - MarkCode(PC + i); + MarkCode(PC, 7); if (!InBlockTransfer) { MarkBTFrom(ReadWord((ushort)(PC + 1))); @@ -972,81 +791,66 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } break; case 0xC4: // CPY zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xC5: // CMP zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xC6: // DEC zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xC7: // SMB4 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xC8: // INY - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xC9: // CMP #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xCA: // DEX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xCB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xCC: // CPY addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xCD: // CMP addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xCE: // DEC addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xCF: // BBS4 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xD0: // BNE +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xD1: // CMP (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); 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); + MarkCode(PC, 7); if (!InBlockTransfer) { MarkBTFrom(ReadWord((ushort)(PC + 1))); @@ -1059,76 +863,63 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } break; case 0xD4: // CSH - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xD5: // CMP zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xD6: // DEC zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xD7: // SMB5 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xD8: // CLD - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xD9: // CMP addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0xDA: // PHX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPush(1); break; case 0xDB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xDC: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xDD: // CMP addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xDE: // DEC addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xDF: // BBS5 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xE0: // CPX #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xE1: // SBC (addr,X) - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); MarkZPPtr(tmp8); MarkIndirect(GetIndirect(tmp8)); break; case 0xE2: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xE3: // TIA src, dest, len - for (int i = 0; i < 7; i++) - MarkCode(PC + i); + MarkCode(PC, 7); if (!InBlockTransfer) { MarkBTFrom(ReadWord((ushort)(PC + 1))); @@ -1141,81 +932,66 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } break; case 0xE4: // CPX zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xE5: // SBC zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xE6: // INC zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xE7: // SMB6 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xE8: // INX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xE9: // SBC #nn - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xEA: // NOP - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xEB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xEC: // CPX addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xED: // SBC addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xEE: // INC addr - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1))); break; case 0xEF: // BBS6 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xF0: // BEQ +/-rel - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); break; case 0xF1: // SBC (addr),Y - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); 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); + MarkCode(PC, 2); 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); + MarkCode(PC, 7); if (!InBlockTransfer) { MarkBTFrom(ReadWord((ushort)(PC + 1))); @@ -1228,57 +1004,47 @@ namespace BizHawk.Emulation.Cores.Components.H6280 } break; case 0xF4: // SET - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xF5: // SBC zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xF6: // INC zp,X - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1)) + X); break; case 0xF7: // SMB7 zp - for (int i = 0; i < 2; i++) - MarkCode(PC + i); + MarkCode(PC, 2); MarkZP(ReadMemory((ushort)(PC + 1))); break; case 0xF8: // SED - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); break; case 0xF9: // SBC addr,Y - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + Y); break; case 0xFA: // PLX - for (int i = 0; i < 1; i++) - MarkCode(PC + i); + MarkCode(PC, 1); MarkPop(1); break; case 0xFB: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xFC: // ?? - MarkCode(PC); + MarkCode(PC, 1); break; case 0xFD: // SBC addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xFE: // INC addr,X - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkAddr(ReadWord((ushort)(PC + 1)) + X); break; case 0xFF: // BBS7 - for (int i = 0; i < 3; i++) - MarkCode(PC + i); + MarkCode(PC, 3); MarkZP(ReadMemory((ushort)(PC + 1))); break; } diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs index baf165990d..e399c63780 100644 --- a/BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs @@ -1,3 +1,4 @@ +using System; namespace BizHawk.Emulation.Cores.Components.H6280 // Do not modify this file directly! This is GENERATED code. @@ -249,5 +250,250 @@ namespace BizHawk.Emulation.Cores.Components.H6280 bytesToAdvance = 1; return "???"; } + + // avoid slowing down the other disassembler + public static string DisassembleExt(ushort pc, out int bytesToAdvance, Func ReadMemory, Func ReadWord) + { + byte op = ReadMemory(pc); + switch (op) + { + case 0x00: bytesToAdvance = 1; return "BRK"; + case 0x01: bytesToAdvance = 2; return string.Format("ORA (${0:X2},X)", ReadMemory(++pc)); + case 0x02: bytesToAdvance = 1; return "SXY"; + case 0x03: bytesToAdvance = 2; return string.Format("ST0 #${0:X2}", ReadMemory(++pc)); + case 0x04: bytesToAdvance = 2; return string.Format("TSB ${0:X2}", ReadMemory(++pc)); + case 0x05: bytesToAdvance = 2; return string.Format("ORA ${0:X2}", ReadMemory(++pc)); + case 0x06: bytesToAdvance = 2; return string.Format("ASL ${0:X2}", ReadMemory(++pc)); + case 0x07: bytesToAdvance = 2; return string.Format("RMB0 ${0:X2}", ReadMemory(++pc)); + case 0x08: bytesToAdvance = 1; return "PHP"; + case 0x09: bytesToAdvance = 2; return string.Format("ORA #${0:X2}", ReadMemory(++pc)); + case 0x0A: bytesToAdvance = 1; return "ASL A"; + case 0x0C: bytesToAdvance = 3; return string.Format("TSB ${0:X4}", ReadWord(++pc)); + case 0x0D: bytesToAdvance = 3; return string.Format("ORA ${0:X4}", ReadWord(++pc)); + case 0x0E: bytesToAdvance = 3; return string.Format("ASL ${0:X4}", ReadWord(++pc)); + case 0x0F: bytesToAdvance = 3; return string.Format("BBR0 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x10: bytesToAdvance = 2; return string.Format("BPL {0}", (sbyte)ReadMemory(++pc)); + case 0x11: bytesToAdvance = 2; return string.Format("ORA (${0:X2}),Y", ReadMemory(++pc)); + case 0x12: bytesToAdvance = 2; return string.Format("ORA (${0:X2})", ReadMemory(++pc)); + case 0x13: bytesToAdvance = 2; return string.Format("ST1 #${0:X2}", ReadMemory(++pc)); + case 0x14: bytesToAdvance = 2; return string.Format("TRB ${0:X2}", ReadMemory(++pc)); + case 0x15: bytesToAdvance = 2; return string.Format("ORA ${0:X2},X", ReadMemory(++pc)); + case 0x16: bytesToAdvance = 2; return string.Format("ASL ${0:X2},X", ReadMemory(++pc)); + case 0x17: bytesToAdvance = 2; return string.Format("RMB1 ${0:X2}", ReadMemory(++pc)); + case 0x18: bytesToAdvance = 1; return "CLC"; + case 0x19: bytesToAdvance = 3; return string.Format("ORA ${0:X4},Y", ReadWord(++pc)); + case 0x1A: bytesToAdvance = 1; return "INC A"; + case 0x1C: bytesToAdvance = 3; return string.Format("TRB ${0:X4}", ReadWord(++pc)); + case 0x1D: bytesToAdvance = 3; return string.Format("ORA ${0:X4},X", ReadWord(++pc)); + case 0x1E: bytesToAdvance = 3; return string.Format("ASL ${0:X4},X", ReadWord(++pc)); + case 0x1F: bytesToAdvance = 3; return string.Format("BBR1 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x20: bytesToAdvance = 3; return string.Format("JSR ${0:X4}", ReadWord(++pc)); + case 0x21: bytesToAdvance = 2; return string.Format("AND (${0:X2},X)", ReadMemory(++pc)); + case 0x22: bytesToAdvance = 1; return "SAX"; + case 0x23: bytesToAdvance = 2; return string.Format("ST2 #${0:X2}", ReadMemory(++pc)); + case 0x24: bytesToAdvance = 2; return string.Format("BIT ${0:X2}", ReadMemory(++pc)); + case 0x25: bytesToAdvance = 2; return string.Format("AND ${0:X2}", ReadMemory(++pc)); + case 0x26: bytesToAdvance = 2; return string.Format("ROL ${0:X2}", ReadMemory(++pc)); + case 0x27: bytesToAdvance = 2; return string.Format("RMB2 ${0:X2}", ReadMemory(++pc)); + case 0x28: bytesToAdvance = 1; return "PLP"; + case 0x29: bytesToAdvance = 2; return string.Format("AND #${0:X2}", ReadMemory(++pc)); + case 0x2A: bytesToAdvance = 1; return "ROL A"; + case 0x2C: bytesToAdvance = 3; return string.Format("BIT ${0:X4}", ReadWord(++pc)); + case 0x2D: bytesToAdvance = 3; return string.Format("AND ${0:X4}", ReadWord(++pc)); + case 0x2E: bytesToAdvance = 3; return string.Format("ROL ${0:X4}", ReadWord(++pc)); + case 0x2F: bytesToAdvance = 3; return string.Format("BBR2 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x30: bytesToAdvance = 2; return string.Format("BMI {0}", (sbyte)ReadMemory(++pc)); + case 0x31: bytesToAdvance = 2; return string.Format("AND (${0:X2}),Y", ReadMemory(++pc)); + case 0x32: bytesToAdvance = 2; return string.Format("AND (${0:X2})", ReadMemory(++pc)); + case 0x34: bytesToAdvance = 2; return string.Format("BIT ${0:X2},X", ReadMemory(++pc)); + case 0x35: bytesToAdvance = 2; return string.Format("AND ${0:X2},X", ReadMemory(++pc)); + case 0x36: bytesToAdvance = 2; return string.Format("ROL ${0:X2},X", ReadMemory(++pc)); + case 0x37: bytesToAdvance = 2; return string.Format("RMB3 ${0:X2}", ReadMemory(++pc)); + case 0x38: bytesToAdvance = 1; return "SEC"; + case 0x39: bytesToAdvance = 3; return string.Format("AND ${0:X4},Y", ReadWord(++pc)); + case 0x3A: bytesToAdvance = 1; return "DEC A"; + case 0x3C: bytesToAdvance = 3; return string.Format("BIT ${0:X4},X", ReadWord(++pc)); + case 0x3D: bytesToAdvance = 3; return string.Format("AND ${0:X4},X", ReadWord(++pc)); + case 0x3E: bytesToAdvance = 3; return string.Format("ROL ${0:X4},X", ReadWord(++pc)); + case 0x3F: bytesToAdvance = 3; return string.Format("BBR3 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x40: bytesToAdvance = 1; return "RTI"; + case 0x41: bytesToAdvance = 2; return string.Format("EOR (${0:X2},X)", ReadMemory(++pc)); + case 0x42: bytesToAdvance = 1; return "SAY"; + case 0x43: bytesToAdvance = 2; return string.Format("TMA #${0:X2}", ReadMemory(++pc)); + case 0x44: bytesToAdvance = 2; return string.Format("BSR {0}", (sbyte)ReadMemory(++pc)); + case 0x45: bytesToAdvance = 2; return string.Format("EOR ${0:X2}", ReadMemory(++pc)); + case 0x46: bytesToAdvance = 2; return string.Format("LSR ${0:X2}", ReadMemory(++pc)); + case 0x47: bytesToAdvance = 2; return string.Format("RMB4 ${0:X2}", ReadMemory(++pc)); + case 0x48: bytesToAdvance = 1; return "PHA"; + case 0x49: bytesToAdvance = 2; return string.Format("EOR #${0:X2}", ReadMemory(++pc)); + case 0x4A: bytesToAdvance = 1; return "LSR A"; + case 0x4C: bytesToAdvance = 3; return string.Format("JMP ${0:X4}", ReadWord(++pc)); + case 0x4D: bytesToAdvance = 3; return string.Format("EOR ${0:X4}", ReadWord(++pc)); + case 0x4E: bytesToAdvance = 3; return string.Format("LSR ${0:X4}", ReadWord(++pc)); + case 0x4F: bytesToAdvance = 3; return string.Format("BBR4 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x50: bytesToAdvance = 2; return string.Format("BVC {0}", (sbyte)ReadMemory(++pc)); + case 0x51: bytesToAdvance = 2; return string.Format("EOR (${0:X2}),Y", ReadMemory(++pc)); + case 0x52: bytesToAdvance = 2; return string.Format("EOR (${0:X2})", ReadMemory(++pc)); + case 0x53: bytesToAdvance = 2; return string.Format("TAM #${0:X2}", ReadMemory(++pc)); + case 0x54: bytesToAdvance = 1; return "CSL"; + case 0x55: bytesToAdvance = 2; return string.Format("EOR ${0:X2},X", ReadMemory(++pc)); + case 0x56: bytesToAdvance = 2; return string.Format("LSR ${0:X2},X", ReadMemory(++pc)); + case 0x57: bytesToAdvance = 2; return string.Format("RMB5 ${0:X2}", ReadMemory(++pc)); + case 0x58: bytesToAdvance = 1; return "CLI"; + case 0x59: bytesToAdvance = 3; return string.Format("EOR ${0:X4},Y", ReadWord(++pc)); + case 0x5A: bytesToAdvance = 1; return "PHY"; + case 0x5D: bytesToAdvance = 3; return string.Format("EOR ${0:X4},X", ReadWord(++pc)); + case 0x5E: bytesToAdvance = 3; return string.Format("LSR ${0:X4},X", ReadWord(++pc)); + case 0x5F: bytesToAdvance = 3; return string.Format("BBR5 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x60: bytesToAdvance = 1; return "RTS"; + case 0x61: bytesToAdvance = 2; return string.Format("ADC (${0:X2},X)", ReadMemory(++pc)); + case 0x62: bytesToAdvance = 1; return "CLA"; + case 0x64: bytesToAdvance = 2; return string.Format("STZ ${0:X2}", ReadMemory(++pc)); + case 0x65: bytesToAdvance = 2; return string.Format("ADC ${0:X2}", ReadMemory(++pc)); + case 0x66: bytesToAdvance = 2; return string.Format("ROR ${0:X2}", ReadMemory(++pc)); + case 0x67: bytesToAdvance = 2; return string.Format("RMB6 ${0:X2}", ReadMemory(++pc)); + case 0x68: bytesToAdvance = 1; return "PLA"; + case 0x69: bytesToAdvance = 2; return string.Format("ADC #${0:X2}", ReadMemory(++pc)); + case 0x6A: bytesToAdvance = 1; return "ROR A"; + case 0x6C: bytesToAdvance = 3; return string.Format("JMP (${0:X4})", ReadWord(++pc)); + case 0x6D: bytesToAdvance = 3; return string.Format("ADC ${0:X4}", ReadWord(++pc)); + case 0x6E: bytesToAdvance = 3; return string.Format("ROR ${0:X4}", ReadWord(++pc)); + case 0x6F: bytesToAdvance = 3; return string.Format("BBR6 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x70: bytesToAdvance = 2; return string.Format("BVS {0}", (sbyte)ReadMemory(++pc)); + case 0x71: bytesToAdvance = 2; return string.Format("ADC (${0:X2}),Y", ReadMemory(++pc)); + case 0x72: bytesToAdvance = 2; return string.Format("ADC (${0:X2})", ReadMemory(++pc)); + case 0x73: bytesToAdvance = 7; return string.Format("TII {0:X4},{1:X4},{2:X4}", ReadWord((ushort)(pc+1)),ReadWord((ushort)(pc+3)),ReadWord((ushort)(pc+5))); + case 0x74: bytesToAdvance = 2; return string.Format("STZ ${0:X2},X", ReadMemory(++pc)); + case 0x75: bytesToAdvance = 2; return string.Format("ADC ${0:X2},X", ReadMemory(++pc)); + case 0x76: bytesToAdvance = 2; return string.Format("ROR ${0:X2},X", ReadMemory(++pc)); + case 0x77: bytesToAdvance = 2; return string.Format("RMB7 ${0:X2}", ReadMemory(++pc)); + case 0x78: bytesToAdvance = 1; return "SEI"; + case 0x79: bytesToAdvance = 3; return string.Format("ADC ${0:X4},Y", ReadWord(++pc)); + case 0x7A: bytesToAdvance = 1; return "PLY"; + case 0x7C: bytesToAdvance = 3; return string.Format("JMP (${0:X4},X)", ReadWord(++pc)); + case 0x7D: bytesToAdvance = 3; return string.Format("ADC ${0:X4},X", ReadWord(++pc)); + case 0x7E: bytesToAdvance = 3; return string.Format("ROR ${0:X4},X", ReadWord(++pc)); + case 0x7F: bytesToAdvance = 3; return string.Format("BBR7 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x80: bytesToAdvance = 2; return string.Format("BRA {0}", (sbyte)ReadMemory(++pc)); + case 0x81: bytesToAdvance = 2; return string.Format("STA (${0:X2},X)", ReadMemory(++pc)); + case 0x82: bytesToAdvance = 1; return "CLX"; + case 0x83: bytesToAdvance = 3; return string.Format("TST #${0:X2}, ${1:X2}", ReadMemory(++pc), ReadMemory(++pc)); + case 0x84: bytesToAdvance = 2; return string.Format("STY ${0:X2}", ReadMemory(++pc)); + case 0x85: bytesToAdvance = 2; return string.Format("STA ${0:X2}", ReadMemory(++pc)); + case 0x86: bytesToAdvance = 2; return string.Format("STX ${0:X2}", ReadMemory(++pc)); + case 0x87: bytesToAdvance = 2; return string.Format("SMB0 ${0:X2}", ReadMemory(++pc)); + case 0x88: bytesToAdvance = 1; return "DEY"; + case 0x89: bytesToAdvance = 2; return string.Format("BIT #${0:X2}", ReadMemory(++pc)); + case 0x8A: bytesToAdvance = 1; return "TXA"; + case 0x8C: bytesToAdvance = 3; return string.Format("STY ${0:X4}", ReadWord(++pc)); + case 0x8D: bytesToAdvance = 3; return string.Format("STA ${0:X4}", ReadWord(++pc)); + case 0x8E: bytesToAdvance = 3; return string.Format("STX ${0:X4}", ReadWord(++pc)); + case 0x8F: bytesToAdvance = 3; return string.Format("BBS0 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0x90: bytesToAdvance = 2; return string.Format("BCC {0}", (sbyte)ReadMemory(++pc)); + case 0x91: bytesToAdvance = 2; return string.Format("STA (${0:X2}),Y", ReadMemory(++pc)); + case 0x92: bytesToAdvance = 2; return string.Format("STA (${0:X2})", ReadMemory(++pc)); + case 0x93: bytesToAdvance = 4; return string.Format("TST #${0:X2}, ${1:X4}", ReadMemory(++pc), ReadWord(++pc)); + case 0x94: bytesToAdvance = 2; return string.Format("STY ${0:X2},X", ReadMemory(++pc)); + case 0x95: bytesToAdvance = 2; return string.Format("STA ${0:X2},X", ReadMemory(++pc)); + case 0x96: bytesToAdvance = 2; return string.Format("STX ${0:X2},Y", ReadMemory(++pc)); + case 0x97: bytesToAdvance = 2; return string.Format("SMB1 ${0:X2}", ReadMemory(++pc)); + case 0x98: bytesToAdvance = 1; return "TYA"; + case 0x99: bytesToAdvance = 3; return string.Format("STA ${0:X4},Y", ReadWord(++pc)); + case 0x9A: bytesToAdvance = 1; return "TXS"; + case 0x9C: bytesToAdvance = 3; return string.Format("STZ ${0:X4}", ReadWord(++pc)); + case 0x9D: bytesToAdvance = 3; return string.Format("STA ${0:X4},X", ReadWord(++pc)); + case 0x9E: bytesToAdvance = 3; return string.Format("STZ ${0:X4},X", ReadWord(++pc)); + case 0x9F: bytesToAdvance = 3; return string.Format("BBS1 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xA0: bytesToAdvance = 2; return string.Format("LDY #${0:X2}", ReadMemory(++pc)); + case 0xA1: bytesToAdvance = 2; return string.Format("LDA (${0:X2},X)", ReadMemory(++pc)); + case 0xA2: bytesToAdvance = 2; return string.Format("LDX #${0:X2}", ReadMemory(++pc)); + case 0xA3: bytesToAdvance = 3; return string.Format("TST #${0:X2}, ${1:X2},X", ReadMemory(++pc), ReadMemory(++pc)); + case 0xA4: bytesToAdvance = 2; return string.Format("LDY ${0:X2}", ReadMemory(++pc)); + case 0xA5: bytesToAdvance = 2; return string.Format("LDA ${0:X2}", ReadMemory(++pc)); + case 0xA6: bytesToAdvance = 2; return string.Format("LDX ${0:X2}", ReadMemory(++pc)); + case 0xA7: bytesToAdvance = 2; return string.Format("SMB2 ${0:X2}", ReadMemory(++pc)); + case 0xA8: bytesToAdvance = 1; return "TAY"; + case 0xA9: bytesToAdvance = 2; return string.Format("LDA #${0:X2}", ReadMemory(++pc)); + case 0xAA: bytesToAdvance = 1; return "TAX"; + case 0xAC: bytesToAdvance = 3; return string.Format("LDY ${0:X4}", ReadWord(++pc)); + case 0xAD: bytesToAdvance = 3; return string.Format("LDA ${0:X4}", ReadWord(++pc)); + case 0xAE: bytesToAdvance = 3; return string.Format("LDX ${0:X4}", ReadWord(++pc)); + case 0xAF: bytesToAdvance = 3; return string.Format("BBS2 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xB0: bytesToAdvance = 2; return string.Format("BCS {0}", (sbyte)ReadMemory(++pc)); + case 0xB1: bytesToAdvance = 2; return string.Format("LDA (${0:X2}),Y", ReadMemory(++pc)); + case 0xB2: bytesToAdvance = 2; return string.Format("LDA (${0:X2})", ReadMemory(++pc)); + case 0xB3: bytesToAdvance = 4; return string.Format("TST #${0:X2}, ${1:X4},X", ReadMemory(++pc), ReadWord(++pc)); + case 0xB4: bytesToAdvance = 2; return string.Format("LDY ${0:X2},X", ReadMemory(++pc)); + case 0xB5: bytesToAdvance = 2; return string.Format("LDA ${0:X2},X", ReadMemory(++pc)); + case 0xB6: bytesToAdvance = 2; return string.Format("LDX ${0:X2},Y", ReadMemory(++pc)); + case 0xB7: bytesToAdvance = 2; return string.Format("SMB3 ${0:X2}", ReadMemory(++pc)); + case 0xB8: bytesToAdvance = 1; return "CLV"; + case 0xB9: bytesToAdvance = 3; return string.Format("LDA ${0:X4},Y", ReadWord(++pc)); + case 0xBA: bytesToAdvance = 1; return "TSX"; + case 0xBC: bytesToAdvance = 3; return string.Format("LDY ${0:X4},X", ReadWord(++pc)); + case 0xBD: bytesToAdvance = 3; return string.Format("LDA ${0:X4},X", ReadWord(++pc)); + case 0xBE: bytesToAdvance = 3; return string.Format("LDX ${0:X4},Y", ReadWord(++pc)); + case 0xBF: bytesToAdvance = 3; return string.Format("BBS3 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xC0: bytesToAdvance = 2; return string.Format("CPY #${0:X2}", ReadMemory(++pc)); + case 0xC1: bytesToAdvance = 2; return string.Format("CMP (${0:X2},X)", ReadMemory(++pc)); + case 0xC2: bytesToAdvance = 1; return "CLY"; + case 0xC3: bytesToAdvance = 7; return string.Format("TDD {0:X4},{1:X4},{2:X4}", ReadWord((ushort)(pc+1)),ReadWord((ushort)(pc+3)),ReadWord((ushort)(pc+5))); + case 0xC4: bytesToAdvance = 2; return string.Format("CPY ${0:X2}", ReadMemory(++pc)); + case 0xC5: bytesToAdvance = 2; return string.Format("CMP ${0:X2}", ReadMemory(++pc)); + case 0xC6: bytesToAdvance = 2; return string.Format("DEC ${0:X2}", ReadMemory(++pc)); + case 0xC7: bytesToAdvance = 2; return string.Format("SMB4 ${0:X2}", ReadMemory(++pc)); + case 0xC8: bytesToAdvance = 1; return "INY"; + case 0xC9: bytesToAdvance = 2; return string.Format("CMP #${0:X2}", ReadMemory(++pc)); + case 0xCA: bytesToAdvance = 1; return "DEX"; + case 0xCC: bytesToAdvance = 3; return string.Format("CPY ${0:X4}", ReadWord(++pc)); + case 0xCD: bytesToAdvance = 3; return string.Format("CMP ${0:X4}", ReadWord(++pc)); + case 0xCE: bytesToAdvance = 3; return string.Format("DEC ${0:X4}", ReadWord(++pc)); + case 0xCF: bytesToAdvance = 3; return string.Format("BBS4 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xD0: bytesToAdvance = 2; return string.Format("BNE {0}", (sbyte)ReadMemory(++pc)); + case 0xD1: bytesToAdvance = 2; return string.Format("CMP (${0:X2}),Y", ReadMemory(++pc)); + case 0xD2: bytesToAdvance = 2; return string.Format("CMP (${0:X2})", ReadMemory(++pc)); + case 0xD3: bytesToAdvance = 7; return string.Format("TIN {0:X4},{1:X4},{2:X4}", ReadWord((ushort)(pc+1)),ReadWord((ushort)(pc+3)),ReadWord((ushort)(pc+5))); + case 0xD4: bytesToAdvance = 1; return "CSH"; + case 0xD5: bytesToAdvance = 2; return string.Format("CMP ${0:X2},X", ReadMemory(++pc)); + case 0xD6: bytesToAdvance = 2; return string.Format("DEC ${0:X2},X", ReadMemory(++pc)); + case 0xD7: bytesToAdvance = 2; return string.Format("SMB5 ${0:X2}", ReadMemory(++pc)); + case 0xD8: bytesToAdvance = 1; return "CLD"; + case 0xD9: bytesToAdvance = 3; return string.Format("CMP ${0:X4},Y", ReadWord(++pc)); + case 0xDA: bytesToAdvance = 1; return "PHX"; + case 0xDD: bytesToAdvance = 3; return string.Format("CMP ${0:X4},X", ReadWord(++pc)); + case 0xDE: bytesToAdvance = 3; return string.Format("DEC ${0:X4},X", ReadWord(++pc)); + case 0xDF: bytesToAdvance = 3; return string.Format("BBS5 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xE0: bytesToAdvance = 2; return string.Format("CPX #${0:X2}", ReadMemory(++pc)); + case 0xE1: bytesToAdvance = 2; return string.Format("SBC (${0:X2},X)", ReadMemory(++pc)); + case 0xE3: bytesToAdvance = 7; return string.Format("TIA {0:X4},{1:X4},{2:X4}", ReadWord((ushort)(pc+1)),ReadWord((ushort)(pc+3)),ReadWord((ushort)(pc+5))); + case 0xE4: bytesToAdvance = 2; return string.Format("CPX ${0:X2}", ReadMemory(++pc)); + case 0xE5: bytesToAdvance = 2; return string.Format("SBC ${0:X2}", ReadMemory(++pc)); + case 0xE6: bytesToAdvance = 2; return string.Format("INC ${0:X2}", ReadMemory(++pc)); + case 0xE7: bytesToAdvance = 2; return string.Format("SMB6 ${0:X2}", ReadMemory(++pc)); + case 0xE8: bytesToAdvance = 1; return "INX"; + case 0xE9: bytesToAdvance = 2; return string.Format("SBC #${0:X2}", ReadMemory(++pc)); + case 0xEA: bytesToAdvance = 1; return "NOP"; + case 0xEC: bytesToAdvance = 3; return string.Format("CPX ${0:X4}", ReadWord(++pc)); + case 0xED: bytesToAdvance = 3; return string.Format("SBC ${0:X4}", ReadWord(++pc)); + case 0xEE: bytesToAdvance = 3; return string.Format("INC ${0:X4}", ReadWord(++pc)); + case 0xEF: bytesToAdvance = 3; return string.Format("BBS6 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + case 0xF0: bytesToAdvance = 2; return string.Format("BEQ {0}", (sbyte)ReadMemory(++pc)); + case 0xF1: bytesToAdvance = 2; return string.Format("SBC (${0:X2}),Y", ReadMemory(++pc)); + case 0xF2: bytesToAdvance = 2; return string.Format("SBC (${0:X2})", ReadMemory(++pc)); + case 0xF3: bytesToAdvance = 7; return string.Format("TAI {0:X4},{1:X4},{2:X4}", ReadWord((ushort)(pc+1)),ReadWord((ushort)(pc+3)),ReadWord((ushort)(pc+5))); + case 0xF4: bytesToAdvance = 1; return "SET"; + case 0xF5: bytesToAdvance = 2; return string.Format("SBC ${0:X2},X", ReadMemory(++pc)); + case 0xF6: bytesToAdvance = 2; return string.Format("INC ${0:X2},X", ReadMemory(++pc)); + case 0xF7: bytesToAdvance = 2; return string.Format("SMB7 ${0:X2}", ReadMemory(++pc)); + case 0xF8: bytesToAdvance = 1; return "SED"; + case 0xF9: bytesToAdvance = 3; return string.Format("SBC ${0:X4},Y", ReadWord(++pc)); + case 0xFA: bytesToAdvance = 1; return "PLX"; + case 0xFD: bytesToAdvance = 3; return string.Format("SBC ${0:X4},X", ReadWord(++pc)); + case 0xFE: bytesToAdvance = 3; return string.Format("INC ${0:X4},X", ReadWord(++pc)); + case 0xFF: bytesToAdvance = 3; return string.Format("BBS7 ${0:X2},{1}", ReadMemory(++pc), (sbyte)ReadMemory(++pc)); + } + bytesToAdvance = 1; + return "???"; + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/CDL File Format.txt b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDL File Format.txt index a861ac7621..62d781692a 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/CDL File Format.txt +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDL File Format.txt @@ -64,9 +64,9 @@ 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 +// was used as a source or destination (either initial or during the loop) of a block xfer +BlockXFer = 0x40, +// was fetched as an operand byte to an opcode +CodeOperand = 0x80 diff --git a/CpuCoreGenerator/HuC6280/CDL.cs b/CpuCoreGenerator/HuC6280/CDL.cs index 26dea836aa..2a0f635264 100644 --- a/CpuCoreGenerator/HuC6280/CDL.cs +++ b/CpuCoreGenerator/HuC6280/CDL.cs @@ -49,15 +49,14 @@ namespace HuC6280 { // 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\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\tfor (int i = 0; i < {0}; i++)", op.Size); - w.WriteLine("\t\t\t\t\t\tMarkCode(PC + i);"); + w.WriteLine("\t\t\t\t\tMarkCode(PC, {0});", op.Size); switch (op.AddressMode) { diff --git a/CpuCoreGenerator/HuC6280/CoreGenerator.cs b/CpuCoreGenerator/HuC6280/CoreGenerator.cs index 0d954ac068..f5713075cd 100644 --- a/CpuCoreGenerator/HuC6280/CoreGenerator.cs +++ b/CpuCoreGenerator/HuC6280/CoreGenerator.cs @@ -754,6 +754,7 @@ namespace HuC6280 public void GenerateDisassembler(string file) { var w = new StreamWriter(file, false); + w.WriteLine("using System;"); w.WriteLine("namespace BizHawk.Emulation.Cores.Components.H6280"); w.WriteLine(); w.WriteLine("// Do not modify this file directly! This is GENERATED code."); @@ -773,12 +774,28 @@ namespace HuC6280 if (Opcodes[i] != null) DisassembleOpcode(w, i); } - w.WriteLine(" }"); w.WriteLine(" bytesToAdvance = 1;"); w.WriteLine(" return \"???\";"); w.WriteLine(" }"); - w.WriteLine(" }"); + w.WriteLine(); + w.WriteLine(" // avoid slowing down the other disassembler"); + w.WriteLine(" public static string DisassembleExt(ushort pc, out int bytesToAdvance, Func ReadMemory, Func ReadWord)"); + w.WriteLine(" {"); + w.WriteLine(" byte op = ReadMemory(pc);"); + w.WriteLine(" switch (op)"); + w.WriteLine(" {"); + + for (int i = 0; i < 256; i++) + { + if (Opcodes[i] != null) + DisassembleOpcode(w, i); + } + w.WriteLine(" }"); + w.WriteLine(" bytesToAdvance = 1;"); + w.WriteLine(" return \"???\";"); + w.WriteLine(" }"); + w.WriteLine(" }"); w.WriteLine("}"); w.Close(); }