diff options
Diffstat (limited to 'src/devices/cpu/g65816/g65816ds.cpp')
-rw-r--r-- | src/devices/cpu/g65816/g65816ds.cpp | 78 |
1 files changed, 55 insertions, 23 deletions
diff --git a/src/devices/cpu/g65816/g65816ds.cpp b/src/devices/cpu/g65816/g65816ds.cpp index 355be140f99..a3d350b9730 100644 --- a/src/devices/cpu/g65816/g65816ds.cpp +++ b/src/devices/cpu/g65816/g65816ds.cpp @@ -8,14 +8,39 @@ G65C816 CPU Emulator V0.90 Copyright Karl Stenerud -All rights reserved. */ #include "emu.h" #include "g65816ds.h" -g65816_disassembler::g65816_disassembler(config *conf) : m_config(conf) +enum class g65816_disassembler::op : unsigned +{ + ADC, AND, ASL, BCC, BCS, BEQ, BIT, BMI, BNE, BPL, BRA, + BRK, BRL, BVC, BVS, CLC, CLD, CLI, CLV, CMP, COP, CPX, + CPY, DEA, DEC, DEX, DEY, EOR, INA, INC, INX, INY, JML, + JMP, JSL, JSR, LDA, LDX, LDY, LSR, MVN, MVP, NOP, ORA, + PEA, PEI, PER, PHA, PHB, PHD, PHK, PHP, PHX, PHY, PLA, + PLB, PLD, PLP, PLX, PLY, REP, ROL, ROR, RTI, RTL, RTS, + SBC, SEC, SED, SEI, SEP, STA, STP, STX, STY, STZ, TAX, + TAY, TCS, TCD, TDC, TRB, TSB, TSC, TSX, TXA, TXS, TXY, + TYA, TYX, WAI, WDM, XBA, XCE +}; + +class g65816_disassembler::opcode_struct { + public: + op m_name; + u8 flag; + u8 ea; + + opcode_struct(op n, u8 f, u8 e); + const char *name() const; + bool is_call() const; + bool is_return() const; + bool is_cond() const; + }; + +g65816_disassembler::g65816_disassembler(const config *conf) : m_config(conf) { } @@ -64,6 +89,11 @@ bool g65816_disassembler::opcode_struct::is_return() const } } +bool g65816_disassembler::opcode_struct::is_cond() const +{ + return ea == RELB && m_name != op::BRA; +} + g65816_disassembler::opcode_struct::opcode_struct(op n, u8 f, u8 e) : m_name(n), flag(f), ea(e) { } @@ -72,15 +102,15 @@ g65816_disassembler::opcode_struct::opcode_struct(op n, u8 f, u8 e) : m_name(n), const char *const g65816_disassembler::s_opnames[] = { - "ADC", "AND", "ASL", "BCC", "BCS", "BEQ", "BIT", "BMI", "BNE", "BPL", "BRA", - "BRK", "BRL", "BVC", "BVS", "CLC", "CLD", "CLI", "CLV", "CMP", "COP", "CPX", - "CPY", "DEA", "DEC", "DEX", "DEY", "EOR", "INA", "INC", "INX", "INY", "JML", - "JMP", "JSL", "JSR", "LDA", "LDX", "LDY", "LSR", "MVN", "MVP", "NOP", "ORA", - "PEA", "PEI", "PER", "PHA", "PHB", "PHD", "PHK", "PHP", "PHX", "PHY", "PLA", - "PLB", "PLD", "PLP", "PLX", "PLY", "REP", "ROL", "ROR", "RTI", "RTL", "RTS", - "SBC", "SEC", "SED", "SEI", "SEP", "STA", "STP", "STX", "STY", "STZ", "TAX", - "TAY", "TCS", "TCD", "TDC", "TRB", "TSB", "TSC", "TSX", "TXA", "TXS", "TXY", - "TYA", "TYX", "WAI", "WDM", "XBA", "XCE" + "adc", "and", "asl", "bcc", "bcs", "beq", "bit", "bmi", "bne", "bpl", "bra", + "brk", "brl", "bvc", "bvs", "clc", "cld", "cli", "clv", "cmp", "cop", "cpx", + "cpy", "dea", "dec", "dex", "dey", "eor", "ina", "inc", "inx", "iny", "jml", + "jmp", "jsl", "jsr", "lda", "ldx", "ldy", "lsr", "mvn", "mvp", "nop", "ora", + "pea", "pei", "per", "pha", "phb", "phd", "phk", "php", "phx", "phy", "pla", + "plb", "pld", "plp", "plx", "ply", "rep", "rol", "ror", "rti", "rtl", "rts", + "sbc", "sec", "sed", "sei", "sep", "sta", "stp", "stx", "sty", "stz", "tax", + "tay", "tcs", "tcd", "tdc", "trb", "tsb", "tsc", "tsx", "txa", "txs", "txy", + "tya", "tyx", "wai", "wdm", "xba", "xce" }; const g65816_disassembler::opcode_struct g65816_disassembler::s_opcodes[256] = @@ -183,6 +213,8 @@ offs_t g65816_disassembler::disassemble(std::ostream &stream, offs_t pc, const d dasm_flags = STEP_OVER; else if (opcode->is_return()) dasm_flags = STEP_OUT; + else if (opcode->is_cond()) + dasm_flags = STEP_COND; else dasm_flags = 0; @@ -191,7 +223,7 @@ offs_t g65816_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case IMP : break; case ACC : - util::stream_format(stream, "A"); + util::stream_format(stream, "a"); break; case RELB: var = (int8_t) opcodes.r8((pc+1) & 0xffffff); @@ -230,19 +262,19 @@ offs_t g65816_disassembler::disassemble(std::ostream &stream, offs_t pc, const d length += 3; break; case ALX : - util::stream_format(stream, " $%06x,X", opcodes.r32((pc+1) & 0xffffff) & 0xffffff); + util::stream_format(stream, " $%06x,x", opcodes.r32((pc+1) & 0xffffff) & 0xffffff); length += 3; break; case AX : - util::stream_format(stream, " $%04x,X", opcodes.r16((pc+1) & 0xffffff)); + util::stream_format(stream, " $%04x,x", opcodes.r16((pc+1) & 0xffffff)); length += 2; break; case AXI : - util::stream_format(stream, " ($%04x,X)", opcodes.r16((pc+1) & 0xffffff)); + util::stream_format(stream, " ($%04x,x)", opcodes.r16((pc+1) & 0xffffff)); length += 2; break; case AY : - util::stream_format(stream, " $%04x,Y", opcodes.r16((pc+1) & 0xffffff)); + util::stream_format(stream, " $%04x,y", opcodes.r16((pc+1) & 0xffffff)); length += 2; break; case D : @@ -255,7 +287,7 @@ offs_t g65816_disassembler::disassemble(std::ostream &stream, offs_t pc, const d length++; break; case DIY : - util::stream_format(stream, " ($%02x),Y", opcodes.r8((pc+1) & 0xffffff)); + util::stream_format(stream, " ($%02x),y", opcodes.r8((pc+1) & 0xffffff)); length++; break; case DLI : @@ -263,27 +295,27 @@ offs_t g65816_disassembler::disassemble(std::ostream &stream, offs_t pc, const d length++; break; case DLIY: - util::stream_format(stream, " [$%02x],Y", opcodes.r8((pc+1) & 0xffffff)); + util::stream_format(stream, " [$%02x],y", opcodes.r8((pc+1) & 0xffffff)); length++; break; case DX : - util::stream_format(stream, " $%02x,X", opcodes.r8((pc+1) & 0xffffff)); + util::stream_format(stream, " $%02x,x", opcodes.r8((pc+1) & 0xffffff)); length++; break; case DXI : - util::stream_format(stream, " ($%02x,X)", opcodes.r8((pc+1) & 0xffffff)); + util::stream_format(stream, " ($%02x,x)", opcodes.r8((pc+1) & 0xffffff)); length++; break; case DY : - util::stream_format(stream, " $%02x,Y", opcodes.r8((pc+1) & 0xffffff)); + util::stream_format(stream, " $%02x,y", opcodes.r8((pc+1) & 0xffffff)); length++; break; case S : - util::stream_format(stream, " %s,S", int_8_str(opcodes.r8((pc+1) & 0xffffff))); + util::stream_format(stream, " %s,s", int_8_str(opcodes.r8((pc+1) & 0xffffff))); length++; break; case SIY : - util::stream_format(stream, " (%s,S),Y", int_8_str(opcodes.r8((pc+1) & 0xffffff))); + util::stream_format(stream, " (%s,s),y", int_8_str(opcodes.r8((pc+1) & 0xffffff))); length++; break; case SIG : |