#pragma once

#include <stdint.h>

namespace sm83
{
    #define INTERRUPT_VBLANK        0x01
    #define INTERRUPT_LCD           0x02
    #define INTERRUPT_TIMER         0x04
    #define INTERRUPT_SERIAL        0x08
    #define INTERRUPT_JOYPAD        0x10

    #define SM83_OPTION_STOP_ON_INVALID  0
    #define SM83_OPTION_BREAK_ON_INTERRUPT 1
    #define SM83_OPTION_BREAK_ON_RET      2
    #define SM83_NUM_OPTIONS 3

    void reset();

    void setClock(uint32_t freq);
    uint32_t getClock();

    void processInterrupts();
    void interrupt(uint8_t type);
    
    uint32_t step();

    uint8_t *getRegs();

    uint16_t getAF();
    uint16_t getBC();
    uint16_t getDE();
    uint16_t getHL();

    uint16_t getSP();
    uint16_t getPC();

    uint8_t getI();
    uint8_t getR();


    void setPC(const uint16_t addr);

    const bool getOption(const int option);
    void setOption(const int option, const bool value);
    void toggleOption(const int option);
}