mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
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:
parent
083854a31e
commit
f1dacfc337
@ -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] =
|
||||
{
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user