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
This commit is contained in:
parent
73109c84bc
commit
bdbaa0c2d9
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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<ushort, byte> ReadMemory, Func<ushort, ushort> 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 "???";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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<ushort, byte> ReadMemory, Func<ushort, ushort> 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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue