From f1dacfc3377a16eb803ca32be218a6d6898e4135 Mon Sep 17 00:00:00 2001 From: tomctomc Date: Thu, 14 Mar 2019 15:47:26 -0400 Subject: Fix for 6809 disassembly (#4753) * increment PC for indexed addressing with single byte offset * indexed addressing was incorrectly labeled indirect in function name * use labels for pc relative indexed addressing * force extended addressing --- src/devices/cpu/m6809/6x09dasm.cpp | 22 ++++++++++++---------- src/devices/cpu/m6809/6x09dasm.h | 6 +++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/devices/cpu/m6809/6x09dasm.cpp b/src/devices/cpu/m6809/6x09dasm.cpp index 9b7721ab268..bc366a567fe 100644 --- a/src/devices/cpu/m6809/6x09dasm.cpp +++ b/src/devices/cpu/m6809/6x09dasm.cpp @@ -214,6 +214,10 @@ offs_t m6x09_base_disassembler::disassemble(std::ostream &stream, offs_t pc, con else if (numoperands == 2) { ea = params.r16(ppc); + if( !(ea & 0xff00) ) + { + stream << '>'; // need the '>' to force an assembler to use EXT addressing + } util::stream_format(stream, "$%04X", ea); } break; @@ -230,7 +234,7 @@ offs_t m6x09_base_disassembler::disassemble(std::ostream &stream, offs_t pc, con pb = params.r8(ppc); } - indirect(stream, pb, params, p); + indexed(stream, pb, params, p); break; case IMM: @@ -810,10 +814,10 @@ m6x09_disassembler::m6x09_disassembler(m6x09_instruction_level level, const char } //------------------------------------------------- -// indirect addressing mode for M6809/HD6309 +// indexed addressing mode for M6809/HD6309 //------------------------------------------------- -void m6x09_disassembler::indirect(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) +void m6x09_disassembler::indexed(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) { uint8_t reg = (pb >> 5) & 3; uint8_t pbm = pb & 0x8f; @@ -908,16 +912,14 @@ void m6x09_disassembler::indirect(std::ostream &stream, uint8_t pb, const data_b break; case 0x8c: // (+/- 7 bit offset),PC - offset = (int8_t)params.r8(p); - util::stream_format(stream, "%s", (offset < 0) ? "-" : ""); - util::stream_format(stream, "$%02X,PC", (offset < 0) ? -offset : offset); + offset = (int8_t)params.r8(p++); + util::stream_format(stream, "$%04X,PCR", (p+offset)); // PC Relative addressing (assembler computes offset from specified absolute address) break; case 0x8d: // (+/- 15 bit offset),PC offset = (int16_t)params.r16(p); p += 2; - util::stream_format(stream, "%s", (offset < 0) ? "-" : ""); - util::stream_format(stream, "$%04X,PC", (offset < 0) ? -offset : offset); + util::stream_format(stream, "$%04X,PCR", (p+offset)); // PC Relative addressing (assembler computes offset from specified absolute address) break; case 0x8e: // (+/- W),R @@ -1240,10 +1242,10 @@ konami_disassembler::konami_disassembler() : m6x09_base_disassembler(konami_opco } //------------------------------------------------- -// indirect addressing mode for Konami +// indexed addressing mode for Konami //------------------------------------------------- -void konami_disassembler::indirect(std::ostream &stream, uint8_t mode, const data_buffer ¶ms, offs_t &p) +void konami_disassembler::indexed(std::ostream &stream, uint8_t mode, const data_buffer ¶ms, offs_t &p) { static const char index_reg[8][3] = { diff --git a/src/devices/cpu/m6809/6x09dasm.h b/src/devices/cpu/m6809/6x09dasm.h index a14de7849c9..e6320038b54 100644 --- a/src/devices/cpu/m6809/6x09dasm.h +++ b/src/devices/cpu/m6809/6x09dasm.h @@ -101,7 +101,7 @@ protected: static const char *const hd6309_tfmregs[16]; static const char *const tfm_s[]; - virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) = 0; + virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) = 0; virtual void register_register(std::ostream &stream, uint8_t pb) = 0; private: @@ -123,7 +123,7 @@ public: m6x09_disassembler(m6x09_instruction_level level, const char teregs[16][4]); protected: - virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) override; + virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) override; virtual void register_register(std::ostream &stream, uint8_t pb) override; private: @@ -138,7 +138,7 @@ public: konami_disassembler(); protected: - virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) override; + virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer ¶ms, offs_t &p) override; virtual void register_register(std::ostream &stream, uint8_t pb) override; private: -- cgit v1.2.3