#pragma once #include #include #include namespace chocochip8 { constexpr size_t gcWidth = 128; constexpr size_t gcHeight = 64; using Scanline = std::bitset; using Framebuffer = std::array; enum class Key { KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F }; class Display { public: Display(): mpFramebuffer{std::make_unique()}, miTopDirtyScanline{0}, miBottomDirtyScanline{gcHeight - 1} {} virtual ~Display() = default; virtual void clear() { for(auto &scanline : *mpFramebuffer) { scanline.reset(); } miTopDirtyScanline = 0; miBottomDirtyScanline = gcHeight - 1; } virtual Scanline& getModifyableScanline(size_t y) { Scanline& res = mpFramebuffer->at(y); miTopDirtyScanline = std::min(miTopDirtyScanline, y); miBottomDirtyScanline = std::max(miBottomDirtyScanline, y); return res; } protected: std::unique_ptr mpFramebuffer; mutable size_t miTopDirtyScanline; mutable size_t miBottomDirtyScanline; }; class Buzzer { public: virtual ~Buzzer() = default; virtual void on() = 0; virtual void off() = 0; }; class Keypad { public: virtual ~Keypad() = default; virtual bool isKeyPressed(Key key) = 0; }; }; // namespace chocochip8