diff options
Diffstat (limited to 'src/chip8.hpp')
-rw-r--r-- | src/chip8.hpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/chip8.hpp b/src/chip8.hpp new file mode 100644 index 0000000..f144341 --- /dev/null +++ b/src/chip8.hpp @@ -0,0 +1,69 @@ +#ifndef CHIP8_H_ +#define CHIP8_H_ + +#include <cstdint> +#include <random> + +const uint32_t VIDEO_HEIGHT = 32; +const uint32_t VIDEO_WIDTH = 64; + +class Chip8 { + public: + Chip8(); + + public: + uint8_t registers[16] {}; + uint8_t memory[4096] {}; + + uint16_t index {}; + uint16_t pc {}; + uint16_t stack[16] {}; + uint8_t sp {}; + + uint8_t delayTimer {}; + uint8_t soundTimer {}; + + uint8_t keypad[16] {}; + uint32_t video[VIDEO_WIDTH * VIDEO_HEIGHT] {}; + + uint16_t opcode; + + private: + std::default_random_engine randGen; + std::uniform_int_distribution<uint8_t> randByte; + + public: + void LoadROM(const char* filename); + void SetupTable(); + + public: + void Cycle(); + + public: + typedef void (Chip8::*OpcodeFunction)(); + OpcodeFunction table[0x10u]; + OpcodeFunction table0[0xFu]; + OpcodeFunction table8[0xFu]; + OpcodeFunction tableE[0xFu]; + OpcodeFunction tableF[0x65u]; + + void Table0(); + void Table8(); + void TableE(); + void TableF(); + + void OP_NULL(); void OP_00E0(); void OP_00EE(); + void OP_1nnn(); void OP_2nnn(); void OP_3xkk(); + void OP_4xkk(); void OP_5xy0(); void OP_6xkk(); + void OP_7xkk(); void OP_8xy0(); void OP_8xy1(); + void OP_8xy2(); void OP_8xy3(); void OP_8xy4(); + void OP_8xy5(); void OP_8xy6(); void OP_8xy7(); + void OP_8xyE(); void OP_9xy0(); void OP_Annn(); + void OP_Bnnn(); void OP_Cxkk(); void OP_Dxyn(); + void OP_Ex9E(); void OP_ExA1(); void OP_Fx07(); + void OP_Fx0A(); void OP_Fx15(); void OP_Fx18(); + void OP_Fx1E(); void OP_Fx29(); void OP_Fx33(); + void OP_Fx55(); void OP_Fx65(); +}; + +#endif |