#include "pixelGameEngine.h" #include "Polygon.h" #include #include #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, //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; std::string Display8(int number){ std::bitset<8>numb(number); return numb.to_string(); } std::string Display16(int number){ std::bitset<16>numb(number); return numb.to_string(); } bool OnUserCreate() override { /*std::ifstream file("IBM Logo.ch8",std::ios_base::binary); uint16_t counter=0x200; while (file.good()){ int val = file.get(); if (val!=-1){ memory[counter++]=val; } }*/ memory[0x200]=0x00; memory[0x201]=0xE0; memory[0x202]=0xA0; memory[0x203]=0x50; memory[0x204]=0x60; memory[0x205]=0x04; memory[0x206]=0xD0; memory[0x207]=0x05; memory[0x208]=0x12; memory[0x209]=0x08; //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 = opcode>>8&0xF; uint8_t Y = opcode>>4&0xF; uint8_t N = opcode&0xF; uint8_t NN = opcode&0x00FF; uint16_t NNN = opcode&0x0FFF; //std::cout<<"Opcode 0x"<>(8-x-1)&0x1; if (display[(start_Y+y)*ScreenWidth()+(start_X+x)]&&pixel){ reg[0xF]=0; } display[(start_Y+y)*ScreenWidth()+(start_X+x)]^=pixel; if (pixel){ std::cout<<"X"; } else { std::cout<<" "; } } } std::cout<