summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author tomctomc <tomctomc@users.noreply.github.com>2019-03-14 15:47:26 -0400
committer R. Belmont <rb6502@users.noreply.github.com>2019-03-14 15:47:26 -0400
commitf1dacfc3377a16eb803ca32be218a6d6898e4135 (patch)
tree8c760116dc4cc581a65f7c1146613ba52710d017
parent083854a31e39bf0628256388def75727426a3e3d (diff)
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
-rw-r--r--src/devices/cpu/m6809/6x09dasm.cpp22
-rw-r--r--src/devices/cpu/m6809/6x09dasm.h6
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 &params, offs_t &p)
+void m6x09_disassembler::indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, 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 &params, offs_t &p)
+void konami_disassembler::indexed(std::ostream &stream, uint8_t mode, const data_buffer &params, 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 &params, offs_t &p) = 0;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, 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 &params, offs_t &p) override;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, 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 &params, offs_t &p) override;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) override;
virtual void register_register(std::ostream &stream, uint8_t pb) override;
private: