#include "pixelGameEngine.h" #include "Polygon.h" #include using namespace olc; #define WIDTH 640 #define HEIGHT 480 class Chip8Emulator : public olc::PixelGameEngine { public: Chip8Emulator() { sAppName = "CHIP-8!"; } public: std::arraymemory={ 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, //Font starts at 0x50 0xF0,0x90,0x90,0x90,0xF0, // 0 0x20,0x60,0x20,0x20,0x70, // 1 0xF0,0x10,0xF0,0x80,0xF0, // 2 0xF0,0x10,0xF0,0x10,0xF0, // 3 0x90,0x90,0xF0,0x10,0x10, // 4 0xF0,0x80,0xF0,0x10,0xF0, // 5 0xF0,0x80,0xF0,0x90,0xF0, // 6 0xF0,0x10,0x20,0x40,0x40, // 7 0xF0,0x90,0xF0,0x90,0xF0, // 8 0xF0,0x90,0xF0,0x10,0xF0, // 9 0xF0,0x90,0xF0,0x90,0x90, // A 0xE0,0x90,0xE0,0x90,0xE0, // B 0xF0,0x80,0x80,0x80,0xF0, // C 0xE0,0x90,0x90,0x90,0xE0, // D 0xF0,0x80,0xF0,0x80,0xF0, // E 0xF0,0x80,0xF0,0x80,0x80 // F }; std::arraydisplay; std::stackstack; float pulse=0; uint8_t delay_timer,sound_timer; uint16_t pc=0x200; uint16_t index; //One 16-bit index register called ā€œIā€ which is used to point at locations in memory std::arrayreg; bool OnUserCreate() override { //memory[0x200]=0x00; //memory[0x201]=0xE0; //0x200 program start return true; } bool OnUserUpdate(float fElapsedTime) override { pulse+=fElapsedTime; if (pulse>=1/60.f){ if (delay_timer>0){ delay_timer--; } if (sound_timer>0){ sound_timer--; } pulse-=1/60.f; for (int i=0;i<10;i++){ //FETCH uint16_t opcode = memory[pc]<<8|memory[pc+1]; pc+=2; //DECODE uint8_t nibble1 = opcode>>12; uint8_t X = reg[opcode>>8&0xF]; uint8_t Y = reg[opcode>>4&0xF]; uint8_t N = opcode&0xF; uint8_t NN = opcode&0x00FF; uint16_t NNN = opcode&0x0FFF; switch(nibble1){ case 0x0:{ switch (NNN){ case 0x0E0:{ //Clear screen. std::cout<<"Screen has been cleared."<