mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2025-01-02 18:29:41 +00:00
Share instruction decoding mechanism between Intel derived processors.
Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
This commit is contained in:
parent
7c3fc469a8
commit
beca76d733
@ -383,12 +383,14 @@ int EightBit::LR35902::step() {
|
|||||||
|
|
||||||
int EightBit::LR35902::execute(uint8_t opcode) {
|
int EightBit::LR35902::execute(uint8_t opcode) {
|
||||||
|
|
||||||
auto x = (opcode & 0b11000000) >> 6;
|
const auto& decoded = getDecodedOpcode(opcode);
|
||||||
auto y = (opcode & 0b111000) >> 3;
|
|
||||||
auto z = (opcode & 0b111);
|
|
||||||
|
|
||||||
auto p = (y & 0b110) >> 1;
|
auto x = decoded.x;
|
||||||
auto q = (y & 1);
|
auto y = decoded.y;
|
||||||
|
auto z = decoded.z;
|
||||||
|
|
||||||
|
auto p = decoded.p;
|
||||||
|
auto q = decoded.q;
|
||||||
|
|
||||||
if (m_prefixCB)
|
if (m_prefixCB)
|
||||||
executeCB(x, y, z, p, q);
|
executeCB(x, y, z, p, q);
|
||||||
@ -431,6 +433,8 @@ void EightBit::LR35902::executeCB(int x, int y, int z, int p, int q) {
|
|||||||
case 7:
|
case 7:
|
||||||
adjustZero<LR35902>(f, srl(f, R(z, a)));
|
adjustZero<LR35902>(f, srl(f, R(z, a)));
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
if (z == 6) {
|
if (z == 6) {
|
||||||
@ -462,6 +466,8 @@ void EightBit::LR35902::executeCB(int x, int y, int z, int p, int q) {
|
|||||||
cycles += 2;
|
cycles += 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,6 +503,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
cycles++;
|
cycles++;
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: // 16-bit load immediate/add
|
case 1: // 16-bit load immediate/add
|
||||||
@ -509,6 +517,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
add(f, HL(), RP(p));
|
add(f, HL(), RP(p));
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // Indirect loading
|
case 2: // Indirect loading
|
||||||
@ -531,6 +541,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
m_memory.write(HL().word--, a);
|
m_memory.write(HL().word--, a);
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@ -551,6 +563,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
a = m_memory.read(HL().word--);
|
a = m_memory.read(HL().word--);
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -563,6 +577,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
case 1: // DEC rp
|
case 1: // DEC rp
|
||||||
--RP(p).word;
|
--RP(p).word;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
@ -614,6 +630,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
case 7:
|
case 7:
|
||||||
ccf(a, f);
|
ccf(a, f);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
cycles++;
|
cycles++;
|
||||||
break;
|
break;
|
||||||
@ -660,6 +678,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
case 7: // CP r
|
case 7: // CP r
|
||||||
compare(f, a, R(z, a));
|
compare(f, a, R(z, a));
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
cycles++;
|
cycles++;
|
||||||
if (z == 6) {
|
if (z == 6) {
|
||||||
@ -709,6 +729,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
}
|
}
|
||||||
cycles += 3;
|
cycles += 3;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: // POP & various ops
|
case 1: // POP & various ops
|
||||||
@ -735,7 +757,12 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
SP() = HL();
|
SP() = HL();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // Conditional jump
|
case 2: // Conditional jump
|
||||||
@ -765,6 +792,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
a = m_bus.read(MEMPTR().word);
|
a = m_bus.read(MEMPTR().word);
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: // Assorted operations
|
case 3: // Assorted operations
|
||||||
@ -807,6 +836,9 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
cycles += 6;
|
cycles += 6;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6: // Operate on accumulator and immediate operand: alu[y] n
|
case 6: // Operate on accumulator and immediate operand: alu[y] n
|
||||||
@ -835,6 +867,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
case 7: // CP n
|
case 7: // CP n
|
||||||
compare(f, a, fetchByte());
|
compare(f, a, fetchByte());
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
@ -842,6 +876,8 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
|
|||||||
restart(y << 3);
|
restart(y << 3);
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
__assume(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -29,27 +29,6 @@ namespace EightBit {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct opcode_decoded_t {
|
|
||||||
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
int z;
|
|
||||||
int p;
|
|
||||||
int q;
|
|
||||||
|
|
||||||
opcode_decoded_t() {
|
|
||||||
x = y = z = p = q = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
opcode_decoded_t(uint8_t opcode) {
|
|
||||||
x = (opcode & 0b11000000) >> 6; // 0 - 3
|
|
||||||
y = (opcode & 0b00111000) >> 3; // 0 - 7
|
|
||||||
z = (opcode & 0b00000111); // 0 - 7
|
|
||||||
p = (y & 0b110) >> 1; // 0 - 3
|
|
||||||
q = (y & 1); // 0 - 1
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
enum StatusBits {
|
enum StatusBits {
|
||||||
SF = Bit7,
|
SF = Bit7,
|
||||||
ZF = Bit6,
|
ZF = Bit6,
|
||||||
@ -154,8 +133,6 @@ namespace EightBit {
|
|||||||
int8_t m_displacement;
|
int8_t m_displacement;
|
||||||
bool m_displaced;
|
bool m_displaced;
|
||||||
|
|
||||||
std::array<opcode_decoded_t, 0x100> m_decodedOpcodes;
|
|
||||||
|
|
||||||
int fetchExecute() {
|
int fetchExecute() {
|
||||||
M1() = true;
|
M1() = true;
|
||||||
return execute(fetchByte());
|
return execute(fetchByte());
|
||||||
|
@ -34,10 +34,6 @@ void EightBit::Z80::initialise() {
|
|||||||
|
|
||||||
IntelProcessor::initialise();
|
IntelProcessor::initialise();
|
||||||
|
|
||||||
for (int i = 0; i < 0x100; ++i) {
|
|
||||||
m_decodedOpcodes[i] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
IM() = 0;
|
IM() = 0;
|
||||||
|
|
||||||
AF().word = 0xffff;
|
AF().word = 0xffff;
|
||||||
@ -774,7 +770,7 @@ int EightBit::Z80::execute(uint8_t opcode) {
|
|||||||
M1() = false;
|
M1() = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& decoded = m_decodedOpcodes[opcode];
|
const auto& decoded = getDecodedOpcode(opcode);
|
||||||
|
|
||||||
auto x = decoded.x;
|
auto x = decoded.x;
|
||||||
auto y = decoded.y;
|
auto y = decoded.y;
|
||||||
|
@ -9,6 +9,31 @@ namespace EightBit {
|
|||||||
class IntelProcessor : public Processor
|
class IntelProcessor : public Processor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
struct opcode_decoded_t {
|
||||||
|
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int z;
|
||||||
|
int p;
|
||||||
|
int q;
|
||||||
|
|
||||||
|
opcode_decoded_t() {
|
||||||
|
x = y = z = p = q = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
opcode_decoded_t(uint8_t opcode) {
|
||||||
|
x = (opcode & 0b11000000) >> 6; // 0 - 3
|
||||||
|
y = (opcode & 0b00111000) >> 3; // 0 - 7
|
||||||
|
z = (opcode & 0b00000111); // 0 - 7
|
||||||
|
p = (y & 0b110) >> 1; // 0 - 3
|
||||||
|
q = (y & 1); // 0 - 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const opcode_decoded_t& getDecodedOpcode(const int i) const {
|
||||||
|
return m_decodedOpcodes[i];
|
||||||
|
}
|
||||||
|
|
||||||
register16_t& MEMPTR() { return m_memptr; }
|
register16_t& MEMPTR() { return m_memptr; }
|
||||||
|
|
||||||
virtual void initialise();
|
virtual void initialise();
|
||||||
@ -203,6 +228,8 @@ namespace EightBit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::array<opcode_decoded_t, 0x100> m_decodedOpcodes;
|
||||||
|
|
||||||
register16_t m_memptr;
|
register16_t m_memptr;
|
||||||
register16_t sp;
|
register16_t sp;
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,11 @@ EightBit::IntelProcessor::IntelProcessor(Memory& memory)
|
|||||||
|
|
||||||
void EightBit::IntelProcessor::initialise() {
|
void EightBit::IntelProcessor::initialise() {
|
||||||
Processor::initialise();
|
Processor::initialise();
|
||||||
|
|
||||||
|
for (int i = 0; i < 0x100; ++i) {
|
||||||
|
m_decodedOpcodes[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
MEMPTR().word = 0;
|
MEMPTR().word = 0;
|
||||||
SP().word = 0xffff;
|
SP().word = 0xffff;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user