mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-12-23 15:29:24 +00:00
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:
parent
2f632cdaf5
commit
dfc4c49454
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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; }
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user