Compare commits

...
7 Commits
10 changed files with 82 additions and 41 deletions
+2 -1
View File
@@ -7,7 +7,8 @@
#include "apu.h" #include "apu.h"
APU::APU(unsigned int frequency) : ProcessingUnit(frequency) APU::APU(unsigned int frequency)
: ProcessingUnit(frequency)
{ {
} }
+25 -2
View File
@@ -9,7 +9,8 @@
#include "emu.h" #include "emu.h"
#include <iostream> #include <iostream>
CPU::CPU(unsigned int frequency) : ProcessingUnit(frequency) CPU::CPU(unsigned int frequency)
: ProcessingUnit(frequency)
{ {
} }
@@ -17,8 +18,30 @@ CPU::~CPU()
{ {
} }
void CPU::update() { void CPU::update()
{
printf("This is an update from the CPU\n"); printf("This is an update from the CPU\n");
Emu::the().writeMemory("RAM", 123, 42); Emu::the().writeMemory("RAM", 123, 42);
printf("fff"); printf("fff");
} }
void CPU::add(uint8_t byte, uint8_t immediate)
{
switch (byte) {
case 0xc6: // ADD A,d8
// program_counter += 2;
// clock += 8;
// Flags: Z0HC
m_z = (m_af >> 8) + immediate == 0;
m_n = 0;
m_h = (m_af >> 8) + immediate > 16;
m_c = (m_af >> 8) + immediate > 255;
// A = A + r
m_af = m_af + (immediate << 8);
break;
default:
break;
}
}
+2
View File
@@ -20,6 +20,8 @@ public:
// 8-bit Arithmetic and Logic Instructions // 8-bit Arithmetic and Logic Instructions
void add(uint8_t byte, uint8_t immediate = 0);
// 16-bit Arithmetic Instructions // 16-bit Arithmetic Instructions
// Bit Operations Instructions // Bit Operations Instructions
+21 -14
View File
@@ -1,12 +1,16 @@
#include "emu.h" #include <cstdint> // uint8_t, uint32_t
#include "cpu.h"
#include <iostream>
void Emu::init(unsigned int frequency) { #include "cpu.h"
#include "emu.h"
#include "ruc/format/print.h"
void Emu::init(uint32_t frequency)
{
m_frequency = frequency; m_frequency = frequency;
} }
void Emu::update() { void Emu::update()
{
for (auto unit : m_processing_units) { for (auto unit : m_processing_units) {
if (m_cycle % (m_frequency / unit->frequency()) == 0) { if (m_cycle % (m_frequency / unit->frequency()) == 0) {
unit->update(); unit->update();
@@ -15,21 +19,24 @@ void Emu::update() {
m_cycle++; m_cycle++;
} }
void Emu::addProcessingUnit(ProcessingUnit* processing_unit) { void Emu::addProcessingUnit(ProcessingUnit* processing_unit)
{
m_processing_units.push_back(processing_unit); m_processing_units.push_back(processing_unit);
} }
void Emu::addMemorySpace(const char* name, int size) { void Emu::addMemorySpace(const char* name, uint32_t size)
std::vector<uint8_t> memory; {
memory.reserve(size); std::vector<uint8_t> memory(size);
m_memory_spaces.emplace(name, memory); m_memory_spaces.emplace(name, memory);
} }
void Emu::writeMemory(const char* memory_space, unsigned int location, uint8_t value) { void Emu::writeMemory(const char* memory_space, uint32_t location, uint8_t value)
// printf("%s %d %d", memory_space, location, value); {
// m_memory_spaces[memory_space][location] = value; print("{} {} {}\n", memory_space, location, value);
m_memory_spaces[memory_space][location] = value;
} }
uint8_t Emu::readMemory(const char* memory_space, unsigned int location){ uint8_t Emu::readMemory(const char* memory_space, uint32_t location)
// return m_memory_spaces[memory_space][location]; {
return m_memory_spaces[memory_space][location];
} }
+8 -8
View File
@@ -1,8 +1,8 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint> // uint8_t, uint32_t
#include <vector>
#include <unordered_map> #include <unordered_map>
#include <vector>
#include "processing-unit.h" #include "processing-unit.h"
#include "ruc/singleton.h" #include "ruc/singleton.h"
@@ -11,20 +11,20 @@ class Emu final : public ruc::Singleton<Emu> {
public: public:
Emu(s) {} Emu(s) {}
void init(unsigned int frequency); void init(uint32_t frequency);
void update(); void update();
void addProcessingUnit(ProcessingUnit* processing_unit); void addProcessingUnit(ProcessingUnit* processing_unit);
void addMemorySpace(const char* name, int size); void addMemorySpace(const char* name, uint32_t size);
void writeMemory(const char* memory_space, unsigned int location, uint8_t value); void writeMemory(const char* memory_space, uint32_t location, uint8_t value);
uint8_t readMemory(const char* memory_space, unsigned int location); uint8_t readMemory(const char* memory_space, uint32_t location);
private: private:
unsigned int m_frequency; uint32_t m_frequency;
unsigned int m_cycle = 0; uint32_t m_cycle = 0;
std::vector<ProcessingUnit*> m_processing_units; std::vector<ProcessingUnit*> m_processing_units;
std::unordered_map<const char*, std::vector<uint8_t>> m_memory_spaces; std::unordered_map<const char*, std::vector<uint8_t>> m_memory_spaces;
+2 -2
View File
@@ -1,7 +1,7 @@
#include <cstdio> #include <cstdio>
#include "emu.h"
#include "cpu.h" #include "cpu.h"
#include "emu.h"
#include "ppu.h" #include "ppu.h"
#include "ruc/timer.h" #include "ruc/timer.h"
@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
Emu::the().addMemorySpace("RAM", 1024); Emu::the().addMemorySpace("RAM", 1024);
for(int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
Emu::the().update(); Emu::the().update();
} }
+4 -2
View File
@@ -8,7 +8,8 @@
#include "ppu.h" #include "ppu.h"
#include <iostream> #include <iostream>
PPU ::PPU(unsigned int frequency) : ProcessingUnit(frequency) PPU ::PPU(unsigned int frequency)
: ProcessingUnit(frequency)
{ {
} }
@@ -16,6 +17,7 @@ PPU ::~PPU()
{ {
} }
void PPU::update() { void PPU::update()
{
printf("ppu update\n"); printf("ppu update\n");
} }
+1
View File
@@ -13,5 +13,6 @@ class PPU final : public ProcessingUnit {
public: public:
PPU(unsigned int frequency); PPU(unsigned int frequency);
virtual ~PPU(); virtual ~PPU();
virtual void update() override; virtual void update() override;
}; };
+7 -4
View File
@@ -5,10 +5,12 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include "processing-unit.h" #include <cstdint> // uint32_t
#include <iostream>
ProcessingUnit::ProcessingUnit(unsigned int frequency) : m_frequency(frequency) #include "processing-unit.h"
ProcessingUnit::ProcessingUnit(uint32_t frequency)
: m_frequency(frequency)
{ {
} }
@@ -16,6 +18,7 @@ ProcessingUnit::~ProcessingUnit()
{ {
} }
unsigned int ProcessingUnit::frequency() { uint32_t ProcessingUnit::frequency()
{
return m_frequency; return m_frequency;
} }
+5 -3
View File
@@ -7,15 +7,17 @@
#pragma once #pragma once
#include <cstdint> // uint32_t
class ProcessingUnit { class ProcessingUnit {
public: public:
ProcessingUnit(unsigned int frequency); ProcessingUnit(uint32_t frequency);
virtual ~ProcessingUnit(); virtual ~ProcessingUnit();
virtual void update() = 0; virtual void update() = 0;
unsigned int frequency(); uint32_t frequency();
private: private:
unsigned int m_frequency; uint32_t m_frequency { 0 };
}; };