Correct 5-bit sign extension on the 6809 processor. Allows CLR 5-bit offset indexed disassembly to work correctly.

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2018-08-27 12:57:44 +01:00
parent 2f632cdaf5
commit dfc4c49454
4 changed files with 15 additions and 3 deletions

View File

@ -206,7 +206,7 @@ std::string EightBit::Disassembly::disassembleUnprefixed() {
//case 0x0f: BUS().write(Address_direct(), clr()); break; // CLR (direct) //case 0x0f: BUS().write(Address_direct(), clr()); break; // CLR (direct)
//case 0x4f: A() = clr(); break; // CLR (CLRA implied) //case 0x4f: A() = clr(); break; // CLR (CLRA implied)
//case 0x5f: B() = clr(); break; // CLR (CLRB implied) //case 0x5f: B() = clr(); break; // CLR (CLRB implied)
//case 0x6f: BUS().write(Address_indexed(), clr()); break; // CLR (indexed) case 0x6f: output << Address_indexed("CLR"); break; // CLR (indexed)
//case 0x7f: BUS().write(Address_extended(), clr()); break; // CLR (extended) //case 0x7f: BUS().write(Address_extended(), clr()); break; // CLR (extended)
//// CMP //// CMP
@ -693,7 +693,7 @@ std::string EightBit::Disassembly::Address_indexed(std::string mnemomic) {
// EA = ,R + 5-bit offset // EA = ,R + 5-bit offset
output output
<< "\t" << mnemomic << "\t" << "\t" << mnemomic << "\t"
<< dump_Byte(type & Processor::Mask5) << "," << r; << (int)Processor::signExtend(5, type & Processor::Mask5) << "," << r;
} }
return output.str(); return output.str();

View File

@ -682,7 +682,7 @@ EightBit::register16_t EightBit::mc6809::Address_indexed() {
} else { } else {
// EA = ,R + 5-bit offset // EA = ,R + 5-bit offset
addCycle(); addCycle();
address = r + (type & Mask5); address = r + signExtend(5, type & Mask5);
} }
return address; return address;
} }

View File

@ -67,6 +67,10 @@ namespace EightBit {
static int promoteNibble(const int value) { return value << 4; } static int promoteNibble(const int value) { return value << 4; }
static int demoteNibble(const int value) { return highNibble(value); } static int demoteNibble(const int value) { return highNibble(value); }
// b: number of bits representing the number in x
// x: sign extend this b-bit number to r
static int8_t signExtend(int b, uint8_t x);
Bus& BUS() { return m_bus; } Bus& BUS() { return m_bus; }
register16_t& PC() { return m_pc; } register16_t& PC() { return m_pc; }

View File

@ -31,3 +31,11 @@ int EightBit::Processor::run(const int limit) {
current += step(); current += step();
return current; return current;
} }
// http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend
int8_t EightBit::Processor::signExtend(int b, uint8_t x) {
const uint8_t m = 1 << (b - 1); // mask can be pre-computed if b is fixed
x = x & ((1 << b) - 1); // (Skip this if bits in x above position b are already zero.)
const auto result = (x ^ m) - m;
return result;
}