mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2025-07-26 17:24:21 +00:00
Fetching bytes/words and stack access are more processor specific than I thought.
Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
This commit is contained in:
@@ -274,9 +274,9 @@ namespace EightBit {
|
|||||||
m_memory.reference() = data;
|
m_memory.reference() = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lxi_b() { Processor::fetchWord(BC()); }
|
void lxi_b() { fetchWord(BC()); }
|
||||||
void lxi_d() { Processor::fetchWord(DE()); }
|
void lxi_d() { fetchWord(DE()); }
|
||||||
void lxi_h() { Processor::fetchWord(HL()); }
|
void lxi_h() { fetchWord(HL()); }
|
||||||
|
|
||||||
void stax_r(register16_t& destination) {
|
void stax_r(register16_t& destination) {
|
||||||
m_memory.ADDRESS() = destination;
|
m_memory.ADDRESS() = destination;
|
||||||
@@ -350,7 +350,7 @@ namespace EightBit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void lxi_sp() {
|
void lxi_sp() {
|
||||||
Processor::fetchWord(SP());
|
fetchWord(SP());
|
||||||
}
|
}
|
||||||
|
|
||||||
void inx_sp() { ++SP().word; }
|
void inx_sp() { ++SP().word; }
|
||||||
|
@@ -524,7 +524,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
|
||||||
Processor::fetchWord(RP(p));
|
fetchWord(RP(p));
|
||||||
cycles += 3;
|
cycles += 3;
|
||||||
break;
|
break;
|
||||||
case 1: // ADD HL,rp
|
case 1: // ADD HL,rp
|
||||||
|
@@ -1160,7 +1160,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
|
||||||
Processor::fetchWord(RP(p));
|
fetchWord(RP(p));
|
||||||
cycles += 10;
|
cycles += 10;
|
||||||
break;
|
break;
|
||||||
case 1: // ADD HL,rp
|
case 1: // ADD HL,rp
|
||||||
|
@@ -13,6 +13,8 @@ namespace EightBit {
|
|||||||
|
|
||||||
virtual void initialise();
|
virtual void initialise();
|
||||||
|
|
||||||
|
register16_t& SP() { return sp; }
|
||||||
|
|
||||||
virtual register16_t& AF() = 0;
|
virtual register16_t& AF() = 0;
|
||||||
uint8_t& A() { return AF().high; }
|
uint8_t& A() { return AF().high; }
|
||||||
uint8_t& F() { return AF().low; }
|
uint8_t& F() { return AF().low; }
|
||||||
@@ -105,6 +107,16 @@ namespace EightBit {
|
|||||||
return m_halfCarryTableSub[index & Mask3];
|
return m_halfCarryTableSub[index & Mask3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t fetchByte() {
|
||||||
|
m_memory.ADDRESS().word = PC().word++;
|
||||||
|
return m_memory.reference();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fetchWord(register16_t& output) {
|
||||||
|
output.low = fetchByte();
|
||||||
|
output.high = fetchByte();
|
||||||
|
}
|
||||||
|
|
||||||
void push(uint8_t value) {
|
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;
|
||||||
@@ -126,7 +138,7 @@ namespace EightBit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void fetchWord() {
|
void fetchWord() {
|
||||||
Processor::fetchWord(MEMPTR());
|
fetchWord(MEMPTR());
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -205,5 +217,6 @@ namespace EightBit {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
register16_t m_memptr;
|
register16_t m_memptr;
|
||||||
|
register16_t sp;
|
||||||
};
|
};
|
||||||
}
|
}
|
@@ -47,7 +47,6 @@ namespace EightBit {
|
|||||||
const Memory& getMemory() const { return m_memory; }
|
const Memory& getMemory() const { return m_memory; }
|
||||||
|
|
||||||
register16_t& PC() { return pc; }
|
register16_t& PC() { return pc; }
|
||||||
register16_t& SP() { return sp; }
|
|
||||||
|
|
||||||
bool isHalted() const { return m_halted; }
|
bool isHalted() const { return m_halted; }
|
||||||
void halt() { --PC().word; m_halted = true; }
|
void halt() { --PC().word; m_halted = true; }
|
||||||
@@ -62,19 +61,8 @@ namespace EightBit {
|
|||||||
Memory& m_memory;
|
Memory& m_memory;
|
||||||
int cycles;
|
int cycles;
|
||||||
|
|
||||||
uint8_t fetchByte() {
|
|
||||||
m_memory.ADDRESS().word = PC().word++;
|
|
||||||
return m_memory.reference();
|
|
||||||
}
|
|
||||||
|
|
||||||
void fetchWord(register16_t& output) {
|
|
||||||
output.low = fetchByte();
|
|
||||||
output.high = fetchByte();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
register16_t pc;
|
register16_t pc;
|
||||||
register16_t sp;
|
|
||||||
bool m_halted;
|
bool m_halted;
|
||||||
};
|
};
|
||||||
}
|
}
|
@@ -4,9 +4,11 @@
|
|||||||
EightBit::IntelProcessor::IntelProcessor(Memory& memory)
|
EightBit::IntelProcessor::IntelProcessor(Memory& memory)
|
||||||
: Processor(memory) {
|
: Processor(memory) {
|
||||||
MEMPTR().word = 0;
|
MEMPTR().word = 0;
|
||||||
|
SP().word = 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::IntelProcessor::initialise() {
|
void EightBit::IntelProcessor::initialise() {
|
||||||
Processor::initialise();
|
Processor::initialise();
|
||||||
MEMPTR().word = 0;
|
MEMPTR().word = 0;
|
||||||
|
SP().word = 0xffff;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ EightBit::Processor::Processor(Memory& memory)
|
|||||||
: m_memory(memory),
|
: m_memory(memory),
|
||||||
cycles(0),
|
cycles(0),
|
||||||
m_halted(false) {
|
m_halted(false) {
|
||||||
SP().word = 0xffff;
|
|
||||||
PC().word = 0;
|
PC().word = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,6 +13,5 @@ void EightBit::Processor::reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Processor::initialise() {
|
void EightBit::Processor::initialise() {
|
||||||
SP().word = 0xffff;
|
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user