diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 6477929..bc194fc 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/IBM Logo.ch8 b/IBM Logo.ch8 new file mode 100644 index 0000000..113338e Binary files /dev/null and b/IBM Logo.ch8 differ diff --git a/main.cpp b/main.cpp index 504a40c..38a92f4 100644 --- a/main.cpp +++ b/main.cpp @@ -1,31 +1,157 @@ #include "pixelGameEngine.h" #include "Polygon.h" +#include using namespace olc; #define WIDTH 640 #define HEIGHT 480 -class Example : public olc::PixelGameEngine +class Chip8Emulator : public olc::PixelGameEngine { - - public: - Example() + Chip8Emulator() { - sAppName = "Example"; + 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 { - Polygon poly{{30,30},{20,20},{-7,6}}; + //memory[0x200]=0x00; + //memory[0x201]=0xE0; + //0x200 program start return true; } bool OnUserUpdate(float fElapsedTime) override { - Clear(BLACK); + 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."<