65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <array>
|
|
#include <bitset>
|
|
#include <memory>
|
|
|
|
namespace chocochip8 {
|
|
|
|
constexpr size_t gcWidth = 128;
|
|
constexpr size_t gcHeight = 64;
|
|
using Scanline = std::bitset<gcWidth>;
|
|
using Framebuffer = std::array<Scanline, gcHeight>;
|
|
|
|
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<Framebuffer>()},
|
|
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<Framebuffer> 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
|