DirectPage and DirectPageIndirect
This commit is contained in:
@@ -54,8 +54,10 @@ int16_t CPU::FetchSignedWord() {
|
||||
}
|
||||
|
||||
uint8_t CPU::FetchByteDirectPage(uint8_t operand) {
|
||||
uint16_t distance = D * 0x100;
|
||||
|
||||
// Calculate the effective address in the Direct Page
|
||||
uint16_t effectiveAddress = D + operand;
|
||||
uint16_t effectiveAddress = operand + distance;
|
||||
|
||||
// Fetch the byte from memory
|
||||
uint8_t fetchedByte = memory.ReadByte(effectiveAddress);
|
||||
@@ -81,8 +83,7 @@ void CPU::ExecuteInstruction(uint8_t opcode) {
|
||||
ADC(operand);
|
||||
break;
|
||||
case 0x65: // ADC Direct Page
|
||||
operand = FetchByteDirectPage(PC);
|
||||
ADC(operand);
|
||||
ADC(FetchByteDirectPage(PC));
|
||||
break;
|
||||
case 0x67: // ADC DP Indirect Long
|
||||
operand = memory.ReadByte(DirectPageIndirectLong());
|
||||
|
||||
@@ -75,7 +75,7 @@ class CPU : public Memory {
|
||||
// JMP (addr, X)
|
||||
uint16_t AbsoluteIndexedIndirect() {
|
||||
uint16_t address = FetchWord() + X;
|
||||
return memory.ReadWord(address);
|
||||
return memory.ReadWord(address & 0xFFFF); // Consider PBR if needed
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
@@ -136,7 +136,10 @@ class CPU : public Memory {
|
||||
// High/low: Direct Page Register plus operand byte
|
||||
//
|
||||
// LDA dp
|
||||
uint16_t DirectPage() { return FetchByte(); }
|
||||
uint16_t DirectPage() {
|
||||
uint8_t dp = FetchByte();
|
||||
return D + dp;
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
// Bank: Zero
|
||||
@@ -168,7 +171,9 @@ class CPU : public Memory {
|
||||
// LDA (dp, X)
|
||||
uint16_t DirectPageIndexedIndirectX() {
|
||||
uint8_t dp = FetchByte();
|
||||
return memory.ReadWord((dp + X) & 0xFF);
|
||||
uint16_t effective_address = D + dp + X;
|
||||
uint16_t indirect_address = memory.ReadWord(effective_address & 0xFFFF);
|
||||
return indirect_address;
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
@@ -180,7 +185,9 @@ class CPU : public Memory {
|
||||
// LDA (dp)
|
||||
uint16_t DirectPageIndirect() {
|
||||
uint8_t dp = FetchByte();
|
||||
return memory.ReadWord(dp);
|
||||
// Add the Direct Page register to the fetched operand
|
||||
uint16_t effective_address = D + dp;
|
||||
return memory.ReadWord(effective_address);
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
@@ -191,7 +198,8 @@ class CPU : public Memory {
|
||||
// LDA [dp]
|
||||
uint16_t DirectPageIndirectLong() {
|
||||
uint8_t dp = FetchByte();
|
||||
return memory.ReadWordLong(dp);
|
||||
uint16_t effective_address = D + dp;
|
||||
return memory.ReadWordLong(effective_address);
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
@@ -204,7 +212,8 @@ class CPU : public Memory {
|
||||
// LDA (dp), Y
|
||||
uint16_t DirectPageIndirectIndexedY() {
|
||||
uint8_t dp = FetchByte();
|
||||
return memory.ReadWord(dp) + Y;
|
||||
uint16_t effective_address = D + dp;
|
||||
return memory.ReadWord(effective_address) + Y;
|
||||
}
|
||||
|
||||
// Effective Address:
|
||||
@@ -218,7 +227,8 @@ class CPU : public Memory {
|
||||
// LDA (dp), Y
|
||||
uint16_t DirectPageIndirectLongIndexedY() {
|
||||
uint8_t dp = FetchByte();
|
||||
return memory.ReadWordLong(dp) + Y;
|
||||
uint16_t effective_address = D + dp;
|
||||
return memory.ReadWordLong(effective_address) + Y;
|
||||
}
|
||||
|
||||
// 8-bit data: Data Operand Byte
|
||||
|
||||
@@ -9,20 +9,6 @@ namespace yaze {
|
||||
namespace app {
|
||||
namespace emu {
|
||||
|
||||
class DirectPageMemory {
|
||||
public:
|
||||
explicit DirectPageMemory(size_t size = 256) : memory_(size, 0) {}
|
||||
|
||||
uint8_t ReadByte(uint8_t address) const { return memory_[address]; }
|
||||
|
||||
void WriteByte(uint8_t address, uint8_t value) { memory_[address] = value; }
|
||||
|
||||
auto size() const { return memory_.size(); }
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> memory_;
|
||||
};
|
||||
|
||||
// memory.h
|
||||
class Memory {
|
||||
public:
|
||||
@@ -55,16 +41,10 @@ class Memory {
|
||||
class MemoryImpl : public Memory {
|
||||
public:
|
||||
uint8_t ReadByte(uint16_t address) const override {
|
||||
if (address < dp_memory_.size()) {
|
||||
return dp_memory_.ReadByte(static_cast<uint8_t>(address));
|
||||
}
|
||||
uint32_t mapped_address = GetMappedAddress(address);
|
||||
return memory_.at(mapped_address);
|
||||
}
|
||||
uint16_t ReadWord(uint16_t address) const override {
|
||||
if (address < dp_memory_.size()) {
|
||||
return dp_memory_.ReadByte(static_cast<uint8_t>(address));
|
||||
}
|
||||
uint32_t mapped_address = GetMappedAddress(address);
|
||||
return static_cast<uint16_t>(memory_.at(mapped_address)) |
|
||||
(static_cast<uint16_t>(memory_.at(mapped_address + 1)) << 8);
|
||||
@@ -172,9 +152,6 @@ class MemoryImpl : public Memory {
|
||||
}
|
||||
}
|
||||
|
||||
// Direct Page Memory
|
||||
DirectPageMemory dp_memory_;
|
||||
|
||||
// Define memory regions
|
||||
std::vector<uint8_t> rom_;
|
||||
std::vector<uint8_t> ram_;
|
||||
|
||||
@@ -13,8 +13,8 @@ namespace emu {
|
||||
|
||||
class SNES {
|
||||
public:
|
||||
SNES()=default;
|
||||
~SNES()=default;
|
||||
SNES() = default;
|
||||
~SNES() = default;
|
||||
|
||||
// Initialization
|
||||
void Init(ROM& rom);
|
||||
|
||||
Reference in New Issue
Block a user