Skip to content
Snippets Groups Projects
manager.cpp 1.75 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()
{
    ee = std::make_unique<EmotionEngine>(this);
Geo Ster's avatar
Geo Ster committed
    
    /* Allocate the entire 32MB of RAM */
    memory = new uint8_t[MEMORY_RANGE];

    /* Load the BIOS in our memory */
    /* NOTE: Must make a GUI for this someday */
    this->read_bios();
Geo Ster's avatar
Geo Ster committed
ComponentManager::~ComponentManager()
{
    delete[] memory;
}

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/bios30004.bin", std::ios::in | std::ios::binary);

    if (!reader.is_open())
        exit(1);
    
    reader.seekg(0);
Geo Ster's avatar
Geo Ster committed
    reader.read((char*)memory + BIOS.start, BIOS.length);
    reader.close();
}

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

/* Instanciate the templates here so we can limit their types below */
template <typename T>
Geo Ster's avatar
Geo Ster committed
T ComponentManager::read(uint32_t addr)
{
    uint32_t vaddr = addr & KUSEG_MASKS[addr >> 29];
Geo Ster's avatar
Geo Ster committed
    T data = *(T*)&memory[vaddr];
    return data;
}

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

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