From 46b140dda1f46841e3c745b3177d6f0adb35cd1b Mon Sep 17 00:00:00 2001 From: Adrian Conlon Date: Wed, 29 Aug 2018 13:25:19 +0100 Subject: [PATCH] Correct issues with the 6809 indirect indexed addressing mode. Signed-off-by: Adrian Conlon --- MC6809/inc/Disassembly.h | 1 + MC6809/src/Disassembly.cpp | 62 ++++++++++++++++++++++++++++++-------- MC6809/src/mc6809.cpp | 10 ++++-- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/MC6809/inc/Disassembly.h b/MC6809/inc/Disassembly.h index 4da60c8..81a0953 100644 --- a/MC6809/inc/Disassembly.h +++ b/MC6809/inc/Disassembly.h @@ -46,6 +46,7 @@ namespace EightBit { // std::string RR(int which); + std::string wrapIndirect(std::string what, bool indirect); std::string Address_direct(std::string mnemomic); std::string Address_indexed(std::string mnemomic); diff --git a/MC6809/src/Disassembly.cpp b/MC6809/src/Disassembly.cpp index 1b02b76..846e326 100644 --- a/MC6809/src/Disassembly.cpp +++ b/MC6809/src/Disassembly.cpp @@ -635,6 +635,15 @@ std::string EightBit::Disassembly::Address_direct(std::string mnemomic) { return output.str(); } +std::string EightBit::Disassembly::wrapIndirect(std::string what, bool indirect) { + std::ostringstream output; + output + << (indirect ? "[" : "") + << what + << (indirect ? "]" : ""); + return output.str(); +} + std::string EightBit::Disassembly::Address_indexed(std::string mnemomic) { std::ostringstream output; @@ -651,56 +660,83 @@ std::string EightBit::Disassembly::Address_indexed(std::string mnemomic) { const auto indirect = type & Processor::Bit4; switch (type & Processor::Mask4) { case 0b0000: // ,R+ - output << "\t" << mnemomic << "\t," << r << "+"; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("," + r + "+", indirect); break; case 0b0001: // ,R++ - output << "\t" << mnemomic << "\t," << r << "++"; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("," + r + "++", indirect); break; case 0b0010: // ,-R - output << "\t" << mnemomic << "\t,-" << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect(",-" + r, indirect); break; case 0b0011: // ,--R - output << "\t" << mnemomic << "\t,--" << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect(",--" + r, indirect); break; case 0b0100: // ,R - output << "\t" << mnemomic << "\t," << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("," + r, indirect); break; case 0b0101: // B,R - output << "\t" << mnemomic << "\tB," << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("B," + r, indirect); break; case 0b0110: // A,R - output << "\t" << mnemomic << "\tA," << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("A," + r, indirect); break; case 0b1000: // n,R (eight-bit) byte = getByte(++m_address); output << dump_ByteValue(byte) << "\t" << mnemomic << "\t" - << dump_ByteValue(byte) << "," << r; + << wrapIndirect(dump_ByteValue(byte) + "," + r, indirect); break; case 0b1001: // n,R (sixteen-bit) word = getWord(++m_address); output << dump_WordValue(word) << "\t" << mnemomic << "\t" - << dump_WordValue(word) << "," << r; + << wrapIndirect(dump_WordValue(word) + "," + r, indirect); break; case 0b1011: // D,R - output << "\t" << mnemomic << "\tD," << r; + output + << "\t" << mnemomic << "\t" + << wrapIndirect("D," + r, indirect); break; case 0b1100: // n,PCR (eight-bit) byte = getByte(++m_address); output << dump_ByteValue(byte) << "\t" << mnemomic << "\t" - << dump_RelativeValue((int8_t)byte) << ",PCR"; + << wrapIndirect(dump_RelativeValue((int8_t)byte) + ",PCR", indirect); break; case 0b1101: // n,PCR (sixteen-bit) word = getWord(++m_address); output << dump_WordValue(word) << "\t" << mnemomic << "\t" - << dump_RelativeValue((int16_t)word) << ",PCR"; + << wrapIndirect(dump_RelativeValue((int16_t)word) + ",PCR", indirect); + break; + case 0b1111: // [n] + assert(indirect); + word = getWord(++m_address); + output + << dump_WordValue(word) + << "\t" << mnemomic << "\t" + << wrapIndirect(dump_WordValue(word), indirect); + break; + default: + assert(false); break; } } else { @@ -708,7 +744,7 @@ std::string EightBit::Disassembly::Address_indexed(std::string mnemomic) { output << "\t" << mnemomic << "\t" << (int)Processor::signExtend(5, type & Processor::Mask5) << "," << r; -} + } return output.str(); } diff --git a/MC6809/src/mc6809.cpp b/MC6809/src/mc6809.cpp index 284f5ac..b7adbe8 100644 --- a/MC6809/src/mc6809.cpp +++ b/MC6809/src/mc6809.cpp @@ -668,16 +668,20 @@ EightBit::register16_t EightBit::mc6809::Address_indexed() { address = PC() + (int8_t)fetchByte(); break; case 0b1101: // n,PCR (sixteen-bit) - addCycles(1); + addCycles(2); address = PC() + (int16_t)fetchWord().word; break; + case 0b1111: // [n] + assert(indirect); + addCycles(2); + address = fetchWord(); + break; default: UNREACHABLE; } if (indirect) { addCycles(3); - BUS().ADDRESS() = address; - address = fetchWord(); + address = Processor::getWord(address); } } else { // EA = ,R + 5-bit offset