Compare commits

...
2 Commits
Author SHA1 Message Date
Frank 31dc57733f Merge branch 'master' of garbage 2022-08-18 00:45:24 +02:00
Frank 265bf09845 Emu: Add clock divider support for PUs 2022-08-18 00:43:41 +02:00
11 changed files with 57 additions and 20 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
#include "apu.h" #include "apu.h"
APU::APU() APU::APU(unsigned int frequency) : ProcessingUnit(frequency)
{ {
} }
+1 -1
View File
@@ -11,6 +11,6 @@
class APU : public ProcessingUnit { class APU : public ProcessingUnit {
public: public:
APU(); APU(unsigned int frequency);
virtual ~APU(); virtual ~APU();
}; };
+6 -1
View File
@@ -6,11 +6,16 @@
*/ */
#include "cpu.h" #include "cpu.h"
#include <iostream>
CPU::CPU() CPU::CPU(unsigned int frequency) : ProcessingUnit(frequency)
{ {
} }
CPU::~CPU() CPU::~CPU()
{ {
} }
void CPU::update() {
printf("This is an update from the CPU\n");
}
+3 -1
View File
@@ -13,9 +13,11 @@
class CPU final : public ProcessingUnit { class CPU final : public ProcessingUnit {
public: public:
CPU(); CPU(unsigned int frequency);
virtual ~CPU(); virtual ~CPU();
void update() override;
// 8-bit Arithmetic and Logic Instructions // 8-bit Arithmetic and Logic Instructions
// 16-bit Arithmetic Instructions // 16-bit Arithmetic Instructions
+10 -3
View File
@@ -1,14 +1,21 @@
#include "emu.h" #include "emu.h"
#include "cpu.h"
#include <iostream>
void Emu::init(unsigned int 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 % int(m_frequency / unit.frequency()) == 0) { if (m_cycle % (m_frequency / unit->frequency()) == 0) {
unit.update(); unit->update();
} }
} }
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);
} }
+6 -4
View File
@@ -11,9 +11,11 @@ class Emu final : public ruc::Singleton<Emu> {
public: public:
Emu(s) {} Emu(s) {}
void init(unsigned int 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, int size);
void writeRAM(const char* memory_space, int location); void writeRAM(const char* memory_space, int location);
@@ -25,9 +27,9 @@ public:
uint8_t readROM(const char* memory_space, int location); uint8_t readROM(const char* memory_space, int location);
private: private:
float m_frequency; unsigned int m_frequency;
int m_cycle = 0; unsigned int 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;
}; };
+15 -1
View File
@@ -1,6 +1,8 @@
#include <cstdio> #include <cstdio>
#include "emu.h" #include "emu.h"
#include "cpu.h"
#include "ppu.h"
#include "ruc/timer.h" #include "ruc/timer.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])
@@ -9,7 +11,19 @@ int main(int argc, char* argv[])
printf("%fms\n", t.elapsedNanoseconds() / 1000000.0); printf("%fms\n", t.elapsedNanoseconds() / 1000000.0);
Emu::the().ReadRAM(0, 0); Emu::the().init(4000000);
CPU cpu(1000000);
PPU ppu(2000000);
Emu::the().addProcessingUnit(&cpu);
Emu::the().addProcessingUnit(&ppu);
Emu::the().addMemorySpace("RAM", 1024);
for(int i = 0; i < 1000; i++) {
Emu::the().update();
}
return 0; return 0;
} }
+6 -1
View File
@@ -6,11 +6,16 @@
*/ */
#include "ppu.h" #include "ppu.h"
#include <iostream>
PPU ::PPU() PPU ::PPU(unsigned int frequency) : ProcessingUnit(frequency)
{ {
} }
PPU ::~PPU() PPU ::~PPU()
{ {
} }
void PPU::update() {
printf("ppu update\n");
}
+2 -1
View File
@@ -11,6 +11,7 @@
class PPU final : public ProcessingUnit { class PPU final : public ProcessingUnit {
public: public:
PPU(); PPU(unsigned int frequency);
virtual ~PPU(); virtual ~PPU();
virtual void update() override;
}; };
+3 -2
View File
@@ -6,8 +6,9 @@
*/ */
#include "processing-unit.h" #include "processing-unit.h"
#include <iostream>
ProcessingUnit::ProcessingUnit(float frequency) : m_frequency(frequency) ProcessingUnit::ProcessingUnit(unsigned int frequency) : m_frequency(frequency)
{ {
} }
@@ -15,6 +16,6 @@ ProcessingUnit::~ProcessingUnit()
{ {
} }
float ProcessingUnit::frequency() { unsigned int ProcessingUnit::frequency() {
return m_frequency; return m_frequency;
} }
+4 -4
View File
@@ -9,13 +9,13 @@
class ProcessingUnit { class ProcessingUnit {
public: public:
ProcessingUnit(float frequency); ProcessingUnit(unsigned int frequency);
virtual ~ProcessingUnit(); virtual ~ProcessingUnit();
virtual void update(); virtual void update() = 0;
float frequency(); unsigned int frequency();
private: private:
float m_frequency; unsigned int m_frequency;
}; };