my first schip rom works in my schip emulator.
BUGFIX: Corrects runaway after drawing in my first schip rom scroll down, left, right all test with test rom assembler now assembles to the expected output it seems fixes incorrect loading of schip font to memory replaces schip font from new chatgpt feedback
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
mod support;
|
||||
use std::{sync::Arc, time::Instant};
|
||||
use crate::support::gemma_egui_support::GemmaEguiSupport;
|
||||
use anyhow::Context;
|
||||
use egui::TextBuffer;
|
||||
use egui_glow::glow::{HasContext, COLOR_BUFFER_BIT};
|
||||
use egui_sdl2_platform::sdl2;
|
||||
use sdl2::event::{Event, WindowEvent};
|
||||
use gemma::chip8::computer::Chip8Computer;
|
||||
use sdl2::event::{Event, WindowEvent};
|
||||
use std::{sync::Arc, time::Instant};
|
||||
use support::timestep::TimeStep;
|
||||
use crate::support::gemma_egui_support::GemmaEguiSupport;
|
||||
|
||||
const SCREEN_WIDTH: u32 = 800;
|
||||
const SCREEN_HEIGHT: u32 = 480;
|
||||
@@ -15,14 +15,19 @@ const SCREEN_HEIGHT: u32 = 480;
|
||||
async fn run() -> anyhow::Result<String> {
|
||||
// Initialize SDL2 and video subsystem
|
||||
let sdl = sdl2::init().map_err(|e| anyhow::anyhow!("Failed to create SDL context: {}", e))?;
|
||||
let mut video = sdl.video().map_err(|e| anyhow::anyhow!("Failed to initialize SDL video subsystem: {}", e))?;
|
||||
let mut video = sdl
|
||||
.video()
|
||||
.map_err(|e| anyhow::anyhow!("Failed to initialize SDL video subsystem: {}", e))?;
|
||||
|
||||
// Create SDL2 window and OpenGL context
|
||||
let window = video.window("Window", SCREEN_WIDTH, SCREEN_HEIGHT)
|
||||
let window = video
|
||||
.window("Window", SCREEN_WIDTH, SCREEN_HEIGHT)
|
||||
.opengl()
|
||||
.position_centered()
|
||||
.build()?;
|
||||
let _gl_context = window.gl_create_context().expect("Failed to create GL context");
|
||||
let _gl_context = window
|
||||
.gl_create_context()
|
||||
.expect("Failed to create GL context");
|
||||
|
||||
// Load OpenGL functions
|
||||
let gl = unsafe {
|
||||
@@ -34,7 +39,9 @@ async fn run() -> anyhow::Result<String> {
|
||||
|
||||
// Setup Egui and SDL2 platform
|
||||
let mut platform = egui_sdl2_platform::Platform::new(window.size())?;
|
||||
let mut event_pump = sdl.event_pump().map_err(|e| anyhow::anyhow!("Failed to get SDL event pump: {}", e))?;
|
||||
let mut event_pump = sdl
|
||||
.event_pump()
|
||||
.map_err(|e| anyhow::anyhow!("Failed to get SDL event pump: {}", e))?;
|
||||
|
||||
// Initial settings
|
||||
let color = [0.0, 0.0, 0.0, 1.0]; // Background color
|
||||
@@ -75,7 +82,12 @@ async fn run() -> anyhow::Result<String> {
|
||||
|
||||
// Paint Egui outputs and update textures
|
||||
let size = window.size();
|
||||
painter.paint_and_update_textures([size.0, size.1], 1.0, paint_jobs.as_slice(), &full_output.textures_delta);
|
||||
painter.paint_and_update_textures(
|
||||
[size.0, size.1],
|
||||
1.0,
|
||||
paint_jobs.as_slice(),
|
||||
&full_output.textures_delta,
|
||||
);
|
||||
window.gl_swap_window();
|
||||
|
||||
// Run the timestep logic
|
||||
@@ -85,38 +97,56 @@ async fn run() -> anyhow::Result<String> {
|
||||
for event in event_pump.poll_iter() {
|
||||
match event {
|
||||
Event::Quit { .. }
|
||||
| Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::Escape), .. } => break 'main,
|
||||
Event::Window { window_id, win_event, .. } if window_id == window.id() => {
|
||||
| Event::KeyDown {
|
||||
keycode: Some(sdl2::keyboard::Keycode::Escape),
|
||||
..
|
||||
} => break 'main,
|
||||
Event::Window {
|
||||
window_id,
|
||||
win_event,
|
||||
..
|
||||
} if window_id == window.id() => {
|
||||
if let WindowEvent::Close = win_event {
|
||||
break 'main;
|
||||
}
|
||||
}
|
||||
Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::F3), .. } => {
|
||||
Event::KeyUp {
|
||||
keycode: Some(sdl2::keyboard::Keycode::F3),
|
||||
..
|
||||
} => {
|
||||
println!("USER PRESSED F3 -> running");
|
||||
is_running = true;
|
||||
}
|
||||
Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::F4), .. } => {
|
||||
Event::KeyUp {
|
||||
keycode: Some(sdl2::keyboard::Keycode::F4),
|
||||
..
|
||||
} => {
|
||||
println!("USER PRESSED F4 -> stopping");
|
||||
is_running = false;
|
||||
}
|
||||
Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::F5), .. } => {
|
||||
Event::KeyDown {
|
||||
keycode: Some(sdl2::keyboard::Keycode::F5),
|
||||
..
|
||||
} => {
|
||||
println!("USER PRESSED F5 -> Step");
|
||||
computer.step_system();
|
||||
}
|
||||
Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::F6), .. } => {
|
||||
Event::KeyDown {
|
||||
keycode: Some(sdl2::keyboard::Keycode::F6),
|
||||
..
|
||||
} => {
|
||||
println!("USER PRESSED F6 -> RESET");
|
||||
computer.reset();
|
||||
computer.reset(computer.quirk_mode.clone());
|
||||
}
|
||||
Event::ControllerButtonDown { which, .. } => {
|
||||
println!("PLAYER {which} DOWN");
|
||||
}
|
||||
Event::ControllerButtonDown { button, .. } => {
|
||||
println!("BUTTON {:?}", button);
|
||||
}
|
||||
Event::JoyButtonDown {button_idx, .. } => {
|
||||
Event::JoyButtonDown { button_idx, .. } => {
|
||||
println!("JoyButtonDown {}", button_idx);
|
||||
}
|
||||
Event::JoyAxisMotion { which, axis_idx, .. } => {
|
||||
Event::JoyAxisMotion {
|
||||
which, axis_idx, ..
|
||||
} => {
|
||||
println!("JoyAxismotion {which} {axis_idx}");
|
||||
}
|
||||
_ => platform.handle_event(&event, &sdl, &video),
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use crate::Chip8Computer;
|
||||
use egui::Rect;
|
||||
use egui::Ui;
|
||||
use egui::Vec2;
|
||||
use egui::{Align, Color32, ComboBox, Pos2};
|
||||
use std::fs::read_dir;
|
||||
use std::path::PathBuf;
|
||||
use egui::{Align, Color32, ComboBox, Pos2, TextBuffer};
|
||||
use egui::Rect;
|
||||
use egui::Vec2;
|
||||
use egui::Ui;
|
||||
use crate::Chip8Computer;
|
||||
|
||||
const CELL_WIDTH: f32 = 5.0;
|
||||
const CELL_HEIGHT: f32 = 5.0;
|
||||
@@ -14,21 +14,26 @@ impl EGuiFileList {
|
||||
pub fn display_path(root: PathBuf, selected_filename: &mut String, ui: &mut Ui) {
|
||||
let working_filename = selected_filename.clone();
|
||||
ui.with_layout(egui::Layout::left_to_right(egui::Align::TOP), |ui| {
|
||||
// ui.label(format!("Displaying {}", root.to_str().unwrap_or("Unable to Load Path")));
|
||||
// ui.label(format!("Displaying {}", root.to_str().unwrap_or("Unable to Load Path")));
|
||||
ComboBox::from_label("Select ROM")
|
||||
.selected_text(selected_filename.clone())
|
||||
.show_ui(ui, |ui| {
|
||||
|
||||
let mut sorted_options = vec![];
|
||||
for option in read_dir(root.as_path()).unwrap() {
|
||||
let to_push = option.unwrap().file_name().into_string().unwrap_or( String::new());
|
||||
let to_push = option
|
||||
.unwrap()
|
||||
.file_name()
|
||||
.into_string()
|
||||
.unwrap_or(String::new());
|
||||
sorted_options.push(to_push);
|
||||
}
|
||||
|
||||
sorted_options.sort();
|
||||
for item in sorted_options {
|
||||
// Add each option to the ComboBox
|
||||
if ui.selectable_label(selected_filename.eq(&item.as_str()), item.clone()).clicked()
|
||||
// Add each option to the ComboBox
|
||||
if ui
|
||||
.selectable_label(selected_filename.eq(&item.as_str()), item.clone())
|
||||
.clicked()
|
||||
{
|
||||
*selected_filename = item;
|
||||
}
|
||||
@@ -43,65 +48,69 @@ pub struct GemmaEguiSupport {}
|
||||
|
||||
impl GemmaEguiSupport {
|
||||
pub fn controls_view(system: &mut Chip8Computer, ui: &mut Ui) {
|
||||
ui.with_layout(egui::Layout::left_to_right(egui::Align::TOP), |ui| {
|
||||
if ui.button("Start").clicked() {
|
||||
println!("Start");
|
||||
// state.is_running = true;
|
||||
}
|
||||
if ui.button("Step").clicked() {
|
||||
system.step_system();
|
||||
}
|
||||
|
||||
if ui.button("Stop").clicked() {
|
||||
println!("STOP");
|
||||
// state.is_running = false;
|
||||
}
|
||||
if ui.button("Reset").clicked() {
|
||||
system.reset();
|
||||
// state.is_running = false;
|
||||
}
|
||||
});
|
||||
|
||||
// if ui.button(format!("Load {}", state.selected_rom_filename)).clicked() {
|
||||
// load the bin...
|
||||
// let read_bin = std::fs::read(PathBuf::from(format!("resources/roms/{}", state.selected_rom_filename))).unwrap();
|
||||
// ...then feed the system.
|
||||
// system.load_bytes_to_memory(0x200, &read_bin);
|
||||
// println!("Loaded {}", state.selected_rom_filename);
|
||||
// }
|
||||
// EGuiFileList::display_path(PathBuf::from("resources/roms"), &mut state.selected_rom_filename, ui);
|
||||
ui.with_layout(egui::Layout::left_to_right(egui::Align::TOP), |ui| {
|
||||
if ui.button("Start").clicked() {
|
||||
println!("Start");
|
||||
// state.is_running = true;
|
||||
}
|
||||
if ui.button("Step").clicked() {
|
||||
system.step_system();
|
||||
}
|
||||
|
||||
if ui.button("Stop").clicked() {
|
||||
println!("STOP");
|
||||
// state.is_running = false;
|
||||
}
|
||||
if ui.button("Reset").clicked() {
|
||||
system.reset(system.quirk_mode.clone());
|
||||
// state.is_running = false;
|
||||
}
|
||||
});
|
||||
|
||||
// if ui.button(format!("Load {}", state.selected_rom_filename)).clicked() {
|
||||
// load the bin...
|
||||
// let read_bin = std::fs::read(PathBuf::from(format!("resources/roms/{}", state.selected_rom_filename))).unwrap();
|
||||
// ...then feed the system.
|
||||
// system.load_bytes_to_memory(0x200, &read_bin);
|
||||
// println!("Loaded {}", state.selected_rom_filename);
|
||||
// }
|
||||
// EGuiFileList::display_path(PathBuf::from("resources/roms"), &mut state.selected_rom_filename, ui);
|
||||
|
||||
ui.with_layout(egui::Layout::left_to_right(Align::TOP), |ui| {
|
||||
// ui.checkbox(&mut state.display_memory, "Display Memory");
|
||||
// ui.checkbox(&mut state.display_video, "Display Video");
|
||||
// ui.checkbox(&mut state.display_registers, "Display Registers");
|
||||
// ui.checkbox(&mut state.display_memory, "Display Memory");
|
||||
// ui.checkbox(&mut state.display_video, "Display Video");
|
||||
// ui.checkbox(&mut state.display_registers, "Display Registers");
|
||||
});
|
||||
}
|
||||
|
||||
pub fn registers_view(system: &Chip8Computer, ui: &mut Ui) {
|
||||
ui.label(format!("V0-7: {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} ",
|
||||
system.registers.peek(0x00),
|
||||
system.registers.peek(0x01),
|
||||
system.registers.peek(0x02),
|
||||
system.registers.peek(0x03),
|
||||
system.registers.peek(0x04),
|
||||
system.registers.peek(0x05),
|
||||
system.registers.peek(0x06),
|
||||
system.registers.peek(0x07)
|
||||
ui.label(format!(
|
||||
"V0-7: {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} ",
|
||||
system.registers.peek(0x00),
|
||||
system.registers.peek(0x01),
|
||||
system.registers.peek(0x02),
|
||||
system.registers.peek(0x03),
|
||||
system.registers.peek(0x04),
|
||||
system.registers.peek(0x05),
|
||||
system.registers.peek(0x06),
|
||||
system.registers.peek(0x07)
|
||||
));
|
||||
ui.label(format!("V8-F: {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} ",
|
||||
system.registers.peek(0x08),
|
||||
system.registers.peek(0x09),
|
||||
system.registers.peek(0x0A),
|
||||
system.registers.peek(0x0B),
|
||||
system.registers.peek(0x0C),
|
||||
system.registers.peek(0x0D),
|
||||
system.registers.peek(0x0E),
|
||||
system.registers.peek(0x0F)
|
||||
ui.label(format!(
|
||||
"V8-F: {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} {:02x} ",
|
||||
system.registers.peek(0x08),
|
||||
system.registers.peek(0x09),
|
||||
system.registers.peek(0x0A),
|
||||
system.registers.peek(0x0B),
|
||||
system.registers.peek(0x0C),
|
||||
system.registers.peek(0x0D),
|
||||
system.registers.peek(0x0E),
|
||||
system.registers.peek(0x0F)
|
||||
));
|
||||
ui.label(format!(
|
||||
"PC: {:04x}\tI: {:04x}",
|
||||
system.registers.peek_pc(),
|
||||
system.registers.peek_i()
|
||||
));
|
||||
ui.label(format!("PC: {:04x}\tI: {:04x}", system.registers.peek_pc(), system.registers.peek_i()));
|
||||
}
|
||||
|
||||
pub fn video_view(system: &Chip8Computer, ui: &mut Ui) {
|
||||
@@ -124,7 +133,7 @@ impl GemmaEguiSupport {
|
||||
// system.video_memory.peek(data_offset));
|
||||
}
|
||||
}
|
||||
// thread::sleep(Duration::from_secs(1));
|
||||
// thread::sleep(Duration::from_secs(1));
|
||||
}
|
||||
|
||||
pub fn memory_view(system: &Chip8Computer, ui: &mut Ui) {
|
||||
|
||||
Reference in New Issue
Block a user