#include "Runtime.hpp"

namespace spider {

    // Constructors & Destructors //

    Runtime::Runtime() : Runtime(0) {}

    Runtime::Runtime(u64 ramSize) : ram(ramSize), reel(nullptr) {
        cpu.hookRAM(&ram);
    }

    Runtime::~Runtime() {
        delete reel;
    }

    // Stepping/Running the Machine //

    void Runtime::step() {
        cpu.fetchInstr();
        // TODO: Call instruction
    }

    void Runtime::step(u64 n) {
        while(n >= 4) {
            step();
            step();
            step();
            step();
            n -= 4;
        }
        while (n--) step();
    }

    void Runtime::run() {}

    void Runtime::run(u64 n) {}

    // Misc //

    void Runtime::resizeRAM(u64 length) {
        ram.resize(length);
    }

    /**
     * Non-owning reel setup.
     */
    void Runtime::hookReel(InstrReel* reel, bool own) {
        cpu.hookInstrReel(reel);
        if(own) this->reel = reel;
    }

}
