You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.6 KiB
80 lines
2.6 KiB
/* Chip8Instance.h |
|
* |
|
* A CHIP-8 implementation for Plip. |
|
* |
|
* (hahaha, more like PLIP-8 amirite) |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <string> |
|
|
|
#include "../PlipCore.h" |
|
#include "../../PlipError.h" |
|
#include "../../PlipInstance.h" |
|
#include "../../Cpu/Chip8/Chip8.h" |
|
#include "../../Input/PlipInput.h" |
|
#include "../../Memory/PlipMemoryRam.h" |
|
|
|
namespace Plip::Core::Chip8 { |
|
class Chip8Instance : public PlipCore { |
|
public: |
|
Chip8Instance(PlipAudio *audio, PlipInput *input, PlipVideo *video); |
|
~Chip8Instance(); |
|
|
|
void Delta(long ns) override; |
|
PlipError Load(const std::string &path) override; |
|
|
|
static const uint32_t ClockRate = 500; |
|
static const uint32_t CharacterSet = 0x100; |
|
static const long DelayTimerTick = 16666666; |
|
static const uint32_t ProgramOffset = 0x200; |
|
static const uint32_t RamSize = 0x1000; |
|
static const int SineHz = 440; |
|
static constexpr double SineVolume = 0.25; |
|
|
|
private: |
|
double m_angle = 0.0; |
|
double m_delta; |
|
int m_channels; |
|
int m_sampleCount; |
|
int m_sampleRate; |
|
|
|
Cpu::Chip8 *m_cpu; |
|
long m_cycleRemaining = 0; |
|
long m_delayRemaining = DelayTimerTick; |
|
long m_cycleTime = 0; |
|
PlipMemoryRam *m_ram; |
|
std::unordered_map<int, PlipInputDefinition> m_inputList; |
|
Plip::PlipVideoFormatInfo m_videoFormat {}; |
|
void *m_videoOutput; |
|
|
|
void Draw(); |
|
std::vector<float> GenerateSilence(); |
|
std::vector<float> GenerateSine(); |
|
void WriteCharacterSet(uint32_t address); |
|
|
|
static const int ScreenWidth = 64; |
|
static const int ScreenHeight = 32; |
|
|
|
static constexpr uint8_t m_charset[] { |
|
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 |
|
}; |
|
static constexpr uint32_t m_charsetLength = 5 * 16; |
|
}; |
|
}
|
|
|