Files
Melefo 2ec1090a2b Adding 8-bit Data Transmission Operations and so every instructions are done
Forgot an instruction in _executeInstruction function
2020-02-27 14:58:42 +01:00

124 lines
2.5 KiB
C++

//
// Created by Melefo on 24/02/2020.
//
#include "../Models/Int24.hpp"
#include "APU.hpp"
namespace ComSquare::APU
{
uint8_t APU::_getImmediateData()
{
return this->_internalRead(this->_internalRegisters.pc++);
}
uint24_t APU::_getDirectAddr()
{
uint24_t addr = this->_getImmediateData();
if (this->_internalRegisters.p)
addr += 0x100;
return addr;
}
uint24_t APU::_getIndexXAddr()
{
uint24_t addr = this->_internalRegisters.x;
if (this->_internalRegisters.p)
addr += 0x100;
return addr;
}
uint24_t APU::_getIndexYAddr()
{
uint24_t addr = this->_internalRegisters.y;
if (this->_internalRegisters.p)
addr += 0x100;
return addr;
}
uint24_t APU::_getDirectAddrByX()
{
uint24_t addr = this->_getDirectAddr();
addr += this->_internalRegisters.x;
return addr;
}
uint24_t APU::_getDirectAddrByY()
{
uint24_t addr = this->_getDirectAddr();
addr += this->_internalRegisters.y;
return addr;
}
uint24_t APU::_getAbsoluteAddr()
{
uint24_t addr1 = this->_getImmediateData();
uint24_t addr2 = this->_getImmediateData();
return (addr2 << 8u) | addr1;
}
uint24_t APU::_getAbsoluteByXAddr()
{
uint24_t addr1 = this->_getImmediateData() + this->_internalRegisters.x;
uint24_t addr2 = this->_getImmediateData() + this->_internalRegisters.x++;
return (addr2 << 8u) | addr1;
}
uint24_t APU::_getAbsoluteAddrByX()
{
uint24_t addr = _getAbsoluteAddr();
return addr + this->_internalRegisters.x;
}
uint24_t APU::_getAbsoluteAddrByY()
{
uint24_t addr = _getAbsoluteAddr();
return addr + this->_internalRegisters.y;
}
std::pair<uint24_t, uint24_t> APU::_getAbsoluteBit()
{
uint24_t addr1 = this->_getImmediateData();
uint24_t addr2 = this->_getImmediateData();
uint24_t operandA = (addr2 << 8u) | addr1;
uint24_t operandB = operandA >> 13u;
operandA = operandA & 0x1FFFu;
return std::make_pair(operandA, operandB);
}
uint24_t APU::_getAbsoluteDirectByXAddr()
{
uint24_t DirectIndexX = this->_getDirectAddr() + this->_internalRegisters.x;
uint24_t low = this->_internalRead(DirectIndexX++);
if (this->_internalRegisters.p)
DirectIndexX += 0x100;
uint24_t high = this->_internalRead(DirectIndexX);
return (high << 8u) | low;
}
uint24_t APU::_getAbsoluteDirectAddrByY()
{
uint24_t DirectIndexX = this->_getDirectAddr();
uint24_t low = this->_internalRead(DirectIndexX);
DirectIndexX += 1;
if (this->_internalRegisters.p)
DirectIndexX += 0x100;
uint24_t high = this->_internalRead(DirectIndexX);
return ((high << 8u) | low) + this->_internalRegisters.y;
}
}