59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "Peripherals.hpp"
|
|
|
|
#include <cstdint>
|
|
#include <vector>
|
|
#include <stack>
|
|
|
|
namespace chocochip8 {
|
|
|
|
class Interpreter {
|
|
private:
|
|
using reg_t = uint8_t;
|
|
using sreg_t = unsigned;
|
|
|
|
public:
|
|
constexpr static sreg_t scLowRestFontAddr = 0x0000;
|
|
constexpr static sreg_t scResetVector = 0x0200;
|
|
constexpr static size_t scMemorySize = 4096;
|
|
|
|
enum {
|
|
R_V0, R_V1, R_V2, R_V3, R_V4, R_V5, R_V6, R_V7,
|
|
R_V8, R_V9, R_VA, R_VB, R_VC, R_VD, R_VE, R_VF,
|
|
R_COUNT
|
|
};
|
|
|
|
enum {
|
|
SR_PC, SR_I, /*SR_T1, SR_T2,*/
|
|
SR_COUNT
|
|
};
|
|
|
|
enum class Opcode {
|
|
SET, ADD, SUB, SUB2, AND, OR, XOR, LSH, RSH, RAND, JEQ, JNEQ, UNIMPL
|
|
};
|
|
|
|
public:
|
|
Interpreter(Display &display, Buzzer &buzzer, Keypad &keypad, CountdownTimer &delayTimer, CountdownTimer &soundTimer);
|
|
void tick();
|
|
void loadProgram(char const* data, size_t count, size_t where = scResetVector);
|
|
|
|
private:
|
|
void executeArithmetic(Opcode opcode, int iReg, reg_t operand);
|
|
void executeDraw(uint8_t x, uint8_t y, uint8_t n);
|
|
|
|
private:
|
|
std::vector<uint8_t> mvMemory;
|
|
std::stack<sreg_t> mCallStack;
|
|
Display &mrDisplay;
|
|
Buzzer &mrBuzzer;
|
|
Keypad &mrKeypad;
|
|
CountdownTimer &mrDelayTimer;
|
|
CountdownTimer &mrSoundTimer;
|
|
sreg_t mvSpecialReg[SR_COUNT];
|
|
reg_t mvReg[R_COUNT];
|
|
bool mIsHighResMode;
|
|
}; // class Interpreter
|
|
|
|
}; // namespace chocohip8
|