Some more small clarifications of shared processor implementation.

Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
This commit is contained in:
Adrian.Conlon
2017-07-25 18:56:43 +01:00
parent ff21263b97
commit b6dd48ca63
11 changed files with 63 additions and 59 deletions
+3 -7
View File
@@ -8,8 +8,6 @@
namespace EightBit { namespace EightBit {
class Intel8080 : public IntelProcessor { class Intel8080 : public IntelProcessor {
public: public:
typedef std::function<void()> instruction_t;
enum StatusBits { enum StatusBits {
SF = Bit7, SF = Bit7,
ZF = Bit6, ZF = Bit6,
@@ -29,6 +27,8 @@ namespace EightBit {
int step(); int step();
virtual register16_t& AF() override { virtual register16_t& AF() override {
auto& f = af.low;
f = (f | Bit1) & ~(Bit5 | Bit3);
return af; return af;
} }
@@ -117,10 +117,6 @@ namespace EightBit {
} }
} }
void adjustReservedFlags() {
F() = (F() | Bit1) & ~(Bit5 | Bit3);
}
static void adjustAuxiliaryCarryAdd(uint8_t& f, uint8_t before, uint8_t value, int calculation) { static void adjustAuxiliaryCarryAdd(uint8_t& f, uint8_t before, uint8_t value, int calculation) {
setFlag(f, AC, calculateHalfCarryAdd(before, value, calculation)); setFlag(f, AC, calculateHalfCarryAdd(before, value, calculation));
} }
@@ -131,7 +127,7 @@ namespace EightBit {
static void subtract(uint8_t& f, uint8_t& operand, uint8_t value, int carry = 0); static void subtract(uint8_t& f, uint8_t& operand, uint8_t value, int carry = 0);
int execute(uint8_t opcode); virtual int execute(uint8_t opcode);
void execute(int x, int y, int z, int p, int q); void execute(int x, int y, int z, int p, int q);
static void increment(uint8_t& f, uint8_t& operand); static void increment(uint8_t& f, uint8_t& operand);
+1 -3
View File
@@ -14,7 +14,6 @@ EightBit::Intel8080::Intel8080(Memory& memory, InputOutput& ports)
void EightBit::Intel8080::initialise() { void EightBit::Intel8080::initialise() {
IntelProcessor::initialise(); IntelProcessor::initialise();
AF().word = BC().word = DE().word = HL().word = 0; AF().word = BC().word = DE().word = HL().word = 0;
adjustReservedFlags();
} }
#pragma region Interrupt routines #pragma region Interrupt routines
@@ -345,7 +344,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
case 1: // 16-bit load immediate/add case 1: // 16-bit load immediate/add
switch (q) { switch (q) {
case 0: // LD rp,nn case 0: // LD rp,nn
fetchWord(RP(p)); Processor::fetchWord(RP(p));
cycles += 10; cycles += 10;
break; break;
case 1: // ADD HL,rp case 1: // ADD HL,rp
@@ -532,7 +531,6 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
switch (q) { switch (q) {
case 0: // POP rp2[p] case 0: // POP rp2[p]
popWord(RP2(p)); popWord(RP2(p));
adjustReservedFlags();
cycles += 10; cycles += 10;
break; break;
case 1: case 1:
+2 -1
View File
@@ -8,9 +8,10 @@ int main(int, char*[]) {
Configuration configuration; Configuration configuration;
#ifdef _DEBUG #ifdef _DEBUG
configuration.setDebugMode(true); //configuration.setDebugMode(true);
configuration.setProfileMode(true); configuration.setProfileMode(true);
#endif #endif
//configuration.setDebugMode(true);
EightBit::TestHarness<Configuration, Board> harness(configuration); EightBit::TestHarness<Configuration, Board> harness(configuration);
harness.initialise(); harness.initialise();
+33 -23
View File
@@ -31,44 +31,42 @@ namespace EightBit {
int interrupt(uint8_t value); int interrupt(uint8_t value);
int execute(uint8_t opcode); virtual int execute(uint8_t opcode);
int step(); int step();
// Mutable access to processor!!
virtual register16_t& AF() override { virtual register16_t& AF() override {
m_accumulatorFlag.low &= 0xf0; af.low &= 0xf0;
return m_accumulatorFlag; return af;
} }
virtual register16_t& BC() override { virtual register16_t& BC() override {
return m_registers[BC_IDX]; return bc;
} }
virtual register16_t& DE() override { virtual register16_t& DE() override {
return m_registers[DE_IDX]; return de;
} }
virtual register16_t& HL() override { virtual register16_t& HL() override {
return m_registers[HL_IDX]; return hl;
} }
virtual void reset(); virtual void reset();
virtual void initialise(); virtual void initialise();
protected: protected:
virtual uint8_t fetchByte() { virtual uint8_t fetchByte() override {
auto returned = IntelProcessor::fetchByte(); auto returned = IntelProcessor::fetchByte();
m_memory.fireReadBusEvent(); m_memory.fireReadBusEvent();
return returned; return returned;
} }
virtual void push(uint8_t value) { virtual void push(uint8_t value) override {
IntelProcessor::push(value); IntelProcessor::push(value);
m_memory.fireWriteBusEvent(); m_memory.fireWriteBusEvent();
} }
virtual uint8_t pop() { virtual uint8_t pop() override {
auto returned = IntelProcessor::pop(); auto returned = IntelProcessor::pop();
m_memory.fireReadBusEvent(); m_memory.fireReadBusEvent();
return returned; return returned;
@@ -91,12 +89,12 @@ namespace EightBit {
} }
private: private:
enum { BC_IDX, DE_IDX, HL_IDX };
Bus& m_bus; Bus& m_bus;
std::array<register16_t, 3> m_registers; register16_t af;
register16_t m_accumulatorFlag; register16_t bc;
register16_t de;
register16_t hl;
bool m_ime; bool m_ime;
@@ -104,10 +102,6 @@ namespace EightBit {
bool m_stopped; bool m_stopped;
int fetchExecute() {
return execute(fetchByte());
}
uint8_t& R(int r, uint8_t& a) { uint8_t& R(int r, uint8_t& a) {
switch (r) { switch (r) {
case 0: case 0:
@@ -132,20 +126,36 @@ namespace EightBit {
} }
register16_t& RP(int rp) { register16_t& RP(int rp) {
__assume(rp < 4);
__assume(rp >= 0);
switch (rp) { switch (rp) {
case 3: case 0b00:
return BC();
case 0b01:
return DE();
case 0b10:
return HL();
case 0b11:
return SP(); return SP();
default: default:
return m_registers[rp]; __assume(0);
} }
} }
register16_t& RP2(int rp) { register16_t& RP2(int rp) {
__assume(rp < 4);
__assume(rp >= 0);
switch (rp) { switch (rp) {
case 3: case 0b00:
return BC();
case 0b01:
return DE();
case 0b10:
return HL();
case 0b11:
return AF(); return AF();
default: default:
return m_registers[rp]; __assume(0);
} }
} }
+1 -1
View File
@@ -500,7 +500,7 @@ void EightBit::LR35902::executeOther(int x, int y, int z, int p, int q) {
case 1: // 16-bit load immediate/add case 1: // 16-bit load immediate/add
switch (q) { switch (q) {
case 0: // LD rp,nn case 0: // LD rp,nn
fetchWord(RP(p)); Processor::fetchWord(RP(p));
cycles += 3; cycles += 3;
break; break;
case 1: // ADD HL,rp case 1: // ADD HL,rp
+2 -3
View File
@@ -78,7 +78,7 @@ namespace EightBit {
protected: protected:
virtual void interrupt(uint16_t vector); virtual void interrupt(uint16_t vector);
virtual int execute(uint8_t cell); virtual int execute(uint8_t opcode);
private: private:
register16_t& MEMPTR() { return m_memptr; } register16_t& MEMPTR() { return m_memptr; }
@@ -96,8 +96,7 @@ namespace EightBit {
void pushWord(register16_t value); void pushWord(register16_t value);
void popWord(register16_t& output); void popWord(register16_t& output);
uint8_t fetchByte(); virtual uint8_t fetchByte() override;
void fetchWord(register16_t& output);
#pragma region 6502 addressing modes #pragma region 6502 addressing modes
-6
View File
@@ -385,12 +385,6 @@ uint8_t EightBit::MOS6502::fetchByte() {
return getByte(); return getByte();
} }
void EightBit::MOS6502::fetchWord(register16_t& output) {
m_memory.ADDRESS().word = PC().word++;
getWord(output);
PC().word++;
}
//// ////
void EightBit::MOS6502::ROR(uint8_t& output) { void EightBit::MOS6502::ROR(uint8_t& output) {
+3 -3
View File
@@ -54,7 +54,7 @@ namespace EightBit {
int interrupt(bool maskable, uint8_t value); int interrupt(bool maskable, uint8_t value);
int execute(uint8_t opcode); virtual int execute(uint8_t opcode);
int step(); int step();
virtual register16_t& AF() override { virtual register16_t& AF() override {
@@ -131,9 +131,9 @@ namespace EightBit {
int8_t m_displacement; int8_t m_displacement;
bool m_displaced; bool m_displaced;
int fetchExecute() { virtual int fetchExecute() override{
M1() = true; M1() = true;
return execute(fetchByte()); return IntelProcessor::fetchExecute();
} }
uint8_t& DISPLACED() { uint8_t& DISPLACED() {
+1 -1
View File
@@ -1152,7 +1152,7 @@ void EightBit::Z80::executeOther(int x, int y, int z, int p, int q) {
case 1: // 16-bit load immediate/add case 1: // 16-bit load immediate/add
switch (q) { switch (q) {
case 0: // LD rp,nn case 0: // LD rp,nn
fetchWord(RP(p)); Processor::fetchWord(RP(p));
cycles += 10; cycles += 10;
break; break;
case 1: // ADD HL,rp case 1: // ADD HL,rp
+1 -11
View File
@@ -119,16 +119,6 @@ namespace EightBit {
return m_halfCarryTableSub[index & Mask3]; return m_halfCarryTableSub[index & Mask3];
} }
virtual uint8_t fetchByte() {
m_memory.ADDRESS().word = PC().word++;
return m_memory.reference();
}
void fetchWord(register16_t& output) {
output.low = fetchByte();
output.high = fetchByte();
}
virtual void push(uint8_t value) { virtual void push(uint8_t value) {
m_memory.ADDRESS().word = --SP().word; m_memory.ADDRESS().word = --SP().word;
m_memory.reference() = value; m_memory.reference() = value;
@@ -150,7 +140,7 @@ namespace EightBit {
} }
void fetchWord() { void fetchWord() {
fetchWord(MEMPTR()); Processor::fetchWord(MEMPTR());
} }
// //
+16
View File
@@ -55,6 +55,8 @@ namespace EightBit {
void reset(); void reset();
virtual int execute(uint8_t opcode) = 0;
protected: protected:
static void clearFlag(uint8_t& f, int flag) { f &= ~flag; } static void clearFlag(uint8_t& f, int flag) { f &= ~flag; }
static void setFlag(uint8_t& f, int flag) { f |= flag; } static void setFlag(uint8_t& f, int flag) { f |= flag; }
@@ -72,6 +74,20 @@ namespace EightBit {
Memory& m_memory; Memory& m_memory;
int cycles; int cycles;
virtual uint8_t fetchByte() {
m_memory.ADDRESS().word = PC().word++;
return m_memory.reference();
}
virtual void fetchWord(register16_t& output) {
output.low = fetchByte();
output.high = fetchByte();
}
virtual int fetchExecute() {
return execute(fetchByte());
}
private: private:
register16_t pc; register16_t pc;
bool m_halted; bool m_halted;