Version 0 not fully working

This commit is contained in:
2025-06-21 17:23:02 -04:00
commit 32d70aa657
21 changed files with 1307 additions and 0 deletions

95
src/Chip8.cpp Normal file
View File

@@ -0,0 +1,95 @@
#include "Chip8.h"
#include <filesystem>
#include <format>
#include <fstream>
#include <iostream>
#include "bitops.h"
Chip8::Chip8(): target_cycle_time(1.0 / 700.0), last_update_time(0), accumulator(0) {}
bool Chip8::init() {
if (!graphics.init()) {
return false;
}
last_update_time = SDL_GetTicks();
accumulator = 0;
const auto rom = read_rom("roms/1-ibm-logo.ch8");
interpreter.load_rom(rom);
interpreter.display.set();
return true;
}
void Chip8::set_keyboard_state(std::span<const bool> keyboard_state) {
this->keyboard_state = keyboard_state;
}
std::vector<uint8_t> Chip8::read_rom(const std::string& path) {
std::ifstream rom_file(path, std::ios::binary);
rom_file.seekg(0, std::ios::end);
const std::streampos file_size = rom_file.tellg();
rom_file.seekg(0, std::ios::beg);
std::cout << "ROM size: " << file_size << std::endl;
std::vector<std::uint8_t> rom(file_size);
rom.insert(
rom.begin(),
std::istreambuf_iterator<char>(rom_file),
std::istreambuf_iterator<char>()
);
return rom;
}
void Chip8::load_keyboard() {
interpreter.keyboard = keyboard_state[SDL_SCANCODE_X] ? bit_set(interpreter.keyboard, 0x0) : bit_clear(interpreter.keyboard, 0x0);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_1] ? bit_set(interpreter.keyboard, 0x1) : bit_clear(interpreter.keyboard, 0x1);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_2] ? bit_set(interpreter.keyboard, 0x2) : bit_clear(interpreter.keyboard, 0x2);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_3] ? bit_set(interpreter.keyboard, 0x3) : bit_clear(interpreter.keyboard, 0x3);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_Q] ? bit_set(interpreter.keyboard, 0x4) : bit_clear(interpreter.keyboard, 0x4);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_W] ? bit_set(interpreter.keyboard, 0x5) : bit_clear(interpreter.keyboard, 0x5);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_E] ? bit_set(interpreter.keyboard, 0x6) : bit_clear(interpreter.keyboard, 0x6);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_A] ? bit_set(interpreter.keyboard, 0x7) : bit_clear(interpreter.keyboard, 0x7);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_S] ? bit_set(interpreter.keyboard, 0x8) : bit_clear(interpreter.keyboard, 0x8);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_D] ? bit_set(interpreter.keyboard, 0x9) : bit_clear(interpreter.keyboard, 0x9);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_Z] ? bit_set(interpreter.keyboard, 0xA) : bit_clear(interpreter.keyboard, 0xA);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_C] ? bit_set(interpreter.keyboard, 0xB) : bit_clear(interpreter.keyboard, 0xB);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_4] ? bit_set(interpreter.keyboard, 0xC) : bit_clear(interpreter.keyboard, 0xC);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_R] ? bit_set(interpreter.keyboard, 0xD) : bit_clear(interpreter.keyboard, 0xD);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_F] ? bit_set(interpreter.keyboard, 0xE) : bit_clear(interpreter.keyboard, 0xE);
interpreter.keyboard = keyboard_state[SDL_SCANCODE_V] ? bit_set(interpreter.keyboard, 0xF) : bit_clear(interpreter.keyboard, 0xF);
}
void Chip8::update() {
auto current_time = SDL_GetTicks();
double delta_time = static_cast<double>(current_time - last_update_time) / 1000.0;
last_update_time = current_time;
accumulator += delta_time;
load_keyboard();
while (accumulator >= target_cycle_time) {
interpreter.run();
accumulator -= target_cycle_time;
}
std::stringstream buffer;
buffer << std::format("PC: {:03X} | SP: {:02X} | V0-VF: ", interpreter.pc, interpreter.sp);
for (int i = 0; i < 16; ++i) {
buffer << std::format("{:02X}", interpreter.v[i]);
if (i < 15) buffer << ",";
}
buffer << " |";
graphics.draw(interpreter.display, buffer.str());
}