Skip to content
Snippets Groups Projects
manager.cpp 1.71 KiB
Newer Older
#include <common/manager.hpp>
Geo Ster's avatar
Geo Ster committed
#include <common/memmap.hpp>
#include <fstream>
#include <iostream>
#include <memory>

Geo Ster's avatar
Geo Ster committed
ComponentManager::ComponentManager() :
    memory(MEMORY_RANGE, 0)
{
    ee = std::make_unique<EmotionEngine>(this);

    /* Load the BIOS in our memory */
    /* NOTE: Must make a GUI for this someday */
    this->read_bios();
}

void ComponentManager::read_bios()
{  
    /* Yes it's hardcoded for now, don't bite me, I'll change it eventually */
    std::ifstream reader;
    reader.open("/home/emufan/Desktop/gcnemu/build/bin/bios.bin", std::ios::in | std::ios::binary);

    if (!reader.is_open())
        exit(1);
    
    reader.seekg(0);
    reader.read((char*)memory.data() + BIOS.start, BIOS.length);
    reader.close();
}

Geo Ster's avatar
Geo Ster committed
void ComponentManager::tick_components()
{
    ee->tick();
}

/* Instanciate the templates here so we can limit their types below */
template <typename T>
T ComponentManager::read_memory(uint32_t addr)
{
    uint32_t vaddr = addr & KUSEG_MASKS[addr >> 29];
    auto ptr = (T*)(memory.data() + vaddr);

    return ptr[0];
}

/* Instanciate the templates here so we can limit their types below */
template <typename T>
void ComponentManager::write_memory(uint32_t addr, T data)
{
Geo Ster's avatar
Geo Ster committed
    std::cout << "Written: " << std::hex << data << " to address: " << addr << '\n';
    uint32_t vaddr = addr & KUSEG_MASKS[addr >> 29];
    auto ptr = (T*)(memory.data() + vaddr);

    ptr[0] = data;
}

/* Template definitions. */
template uint32_t ComponentManager::read_memory<uint32_t>(uint32_t);
Geo Ster's avatar
Geo Ster committed
template uint128_t ComponentManager::read_memory<uint128_t>(uint32_t);
template void ComponentManager::write_memory<uint32_t>(uint32_t, uint32_t);
template void ComponentManager::write_memory<uint64_t>(uint32_t, uint64_t);