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
This commit is contained in:
tomctomc 2019-03-14 15:47:26 -04:00 committed by R. Belmont
parent 083854a31e
commit f1dacfc337
2 changed files with 15 additions and 13 deletions

View File

@ -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] =
{

View File

@ -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: