49 lines
1.2 KiB
C++
49 lines
1.2 KiB
C++
#include "cpu.hpp"
|
|
#include "bus.hpp"
|
|
#include "memory.hpp"
|
|
|
|
// i'm sorry but there's no way i'm typing this every time i want to access memory
|
|
// (which is a lot of times in this file)
|
|
#define MEMORY this->bus->memory->mem
|
|
|
|
CPU::CPU(Bus* bus): bus(bus)
|
|
{
|
|
this->Reset();
|
|
}
|
|
|
|
CPU::~CPU()
|
|
{
|
|
this->bus = nullptr;
|
|
}
|
|
|
|
void CPU::Step()
|
|
{
|
|
uint32_t destination = (uint32_t)this->pc[3] << 16 | (uint32_t)this->pc[4] << 8 | this->pc[5];
|
|
uint32_t source = (uint32_t)this->pc[0] << 16 | (uint32_t)this->pc[1] << 8 | this->pc[2];
|
|
uint32_t jump = (uint32_t)this->pc[6] << 16 | (uint32_t)this->pc[7] << 8 | this->pc[8];
|
|
|
|
MEMORY[destination] = MEMORY[source];
|
|
this->pc = MEMORY + jump;
|
|
}
|
|
|
|
void CPU::Reset()
|
|
{
|
|
this->pc = MEMORY + ((uint32_t)MEMORY[2]<<16 | (uint32_t)MEMORY[3]<<8 | MEMORY[4]);
|
|
}
|
|
|
|
void CPU::setKeyBit(uint8_t index)
|
|
{
|
|
uint32_t* keyboard = (uint32_t*)MEMORY;
|
|
if (index < 8) *keyboard |= 1 << (index + 8);
|
|
else *keyboard |= 1 << (index - 8);
|
|
}
|
|
|
|
void CPU::clearKeyBit(uint8_t index)
|
|
{
|
|
uint32_t* keyboard = (uint32_t*)MEMORY;
|
|
if (index < 8) *keyboard &= ~(1 << (index + 8));
|
|
else *keyboard &= ~(1 << (index - 8));
|
|
}
|
|
|
|
#undef MEMORY
|
|
// goodbye
|