From fc94563b4112e2fd608e7ba4465f50bd8a91ed1b Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Fri, 7 Feb 2020 18:56:24 +0100
Subject: [PATCH] Starting to implement addressing modes
---
sources/CPU/CPU.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++--
sources/CPU/CPU.hpp | 19 +++++++++++---
2 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp
index c47bb26..afcf96d 100644
--- a/sources/CPU/CPU.cpp
+++ b/sources/CPU/CPU.cpp
@@ -195,18 +195,66 @@ namespace ComSquare::CPU
int CPU::executeInstruction()
{
- uint8_t opcode = this->_bus->read(this->_registers.pc++);
+ uint8_t opcode = this->_bus->read(this->_registers.pc);
switch (opcode) {
- case 0x0: return this->BRK();
+ case 0x0:
+ return this->BRK();
+ case 0x61:
+ case 0x63:
+ case 0x65:
+ case 0x67:
+ case 0x69:
+ case 0x6D:
+ case 0x6F:
+ case 0x71:
+ case 0x72:
+ case 0x73:
+ case 0x75:
+ case 0x77:
+ case 0x79:
+ case 0x7D:
+ case 0x7F:
+ return this->ADC();
default:
throw InvalidOpcode("CPU", opcode);
}
}
+ ////////////////////////////////////////////////////////////////////
+ /// Addressing modes
+ ////////////////////////////////////////////////////////////////////
+
+ uint24_t CPU::_GetImmediateAddr()
+ {
+ return this->_registers.pc++;
+ }
+
+ uint24_t CPU::_GetDirectAddr()
+ {
+ uint8_t addr = this->_bus->read(this->_registers.pc++);
+ return this->_registers.d + addr;
+ }
+
+ uint24_t CPU::_GetAbsoluteAddr()
+ {
+ uint24_t addr = this->_registers.dbr << 16u;
+ addr += this->_bus->read(this->_registers.pc++) << 8u;
+ addr += this->_bus->read(this->_registers.pc++);
+ return addr;
+ }
+
+ uint24_t CPU::_GetAbsoluteLongAddr()
+ {
+ return 0;
+ }
+
+
int CPU::BRK()
{
+ this->_registers.pc += 2;
+
this->_registers.p.i = true;
if (this->_isEmulationMode)
this->_registers.pc = this->_cartridgeHeader.emulationInterrupts.brk;
@@ -215,4 +263,14 @@ namespace ComSquare::CPU
this->_registers.p.d = false;
return 7 + !this->_isEmulationMode;
}
+
+
+ ////////////////////////////////////////////////////////////////////
+ /// Mathematical operations
+ ////////////////////////////////////////////////////////////////////
+
+ int CPU::ADC()
+ {
+// this->_registers.a +=
+ }
}
\ No newline at end of file
diff --git a/sources/CPU/CPU.hpp b/sources/CPU/CPU.hpp
index 0605852..6fd235c 100644
--- a/sources/CPU/CPU.hpp
+++ b/sources/CPU/CPU.hpp
@@ -188,9 +188,24 @@ namespace ComSquare::CPU
//! @brief The cartridge header (stored for interrupt vectors..
Cartridge::Header &_cartridgeHeader;
+ //! @brief Immediate address mode is specified with a value. (This functions returns the 24bit space address of the value).
+ uint24_t _GetImmediateAddr();
+ //! @brief The destination is formed by adding the direct page register with the 8-bit address to form an effective address. (This functions returns the 24bit space address of the value).
+ uint24_t _GetDirectAddr();
+ //! @brief The effective address is formed by DBR:<16-bit exp>. (This functions returns the 24bit space address of the value).
+ uint24_t _GetAbsoluteAddr();
+ //! @brief The effective address is the expression. (This functions returns the 24bit space address of the value).
+ uint24_t _GetAbsoluteLongAddr();
+
+
//! @brief Execute a single instruction.
//! @return The number of CPU cycles that the instruction took.
int executeInstruction();
+
+ //! @brief Break instruction (0x00) - Causes a software break. The PC is loaded from a vector table.
+ int BRK();
+ //! @brief Add with carry (0x61, 0x63, 0x65, 0x67, 0x69, 0x6D, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x77, 0x79, 0x7D, 0x7F) - Adds operand to the Accumulator; adds an additional 1 if carry is set.
+ int ADC();
public:
explicit CPU(std::shared_ptr bus, Cartridge::Header &cartridgeHeader);
//! @brief This function continue to execute the Cartridge code.
@@ -206,10 +221,6 @@ namespace ComSquare::CPU
//! @param data The new value of the register.
//! @throw InvalidAddress will be thrown if the address is more than $1F (the number of register).
void write(uint24_t addr, uint8_t data) override;
-
- private:
- //! @brief Break instruction (0x00) - Causes a software break. The PC is loaded from a vector table.
- int BRK();
};
}