laptop work
This commit is contained in:
parent
a12b5f254c
commit
c8259157c5
42
Cargo.lock
generated
42
Cargo.lock
generated
@ -885,6 +885,7 @@ dependencies = [
|
|||||||
"imgui-glium-renderer",
|
"imgui-glium-renderer",
|
||||||
"imgui-winit-support",
|
"imgui-winit-support",
|
||||||
"pretty_env_logger",
|
"pretty_env_logger",
|
||||||
|
"rand 0.9.0-alpha.2",
|
||||||
"ratatui",
|
"ratatui",
|
||||||
"winit 0.27.5",
|
"winit 0.27.5",
|
||||||
]
|
]
|
||||||
@ -2554,8 +2555,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha",
|
"rand_chacha 0.3.1",
|
||||||
"rand_core",
|
"rand_core 0.6.4",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.9.0-alpha.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c3e256ff62cee3e03def855c4d4260106d2bb1696fdc01af03e9935b993720a5"
|
||||||
|
dependencies = [
|
||||||
|
"rand_chacha 0.9.0-alpha.2",
|
||||||
|
"rand_core 0.9.0-alpha.2",
|
||||||
|
"zerocopy",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2565,7 +2577,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core",
|
"rand_core 0.6.4",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.9.0-alpha.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d299e9db34f6623b2a9e86c015d6e173d5f46d64d4b9b8cc46ae8a982a50b04c"
|
||||||
|
dependencies = [
|
||||||
|
"ppv-lite86",
|
||||||
|
"rand_core 0.9.0-alpha.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2577,6 +2599,16 @@ dependencies = [
|
|||||||
"getrandom",
|
"getrandom",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.9.0-alpha.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f4e93f5a5e3c528cda9acb0928c31b2ba868c551cc46e67b778075e34aab9906"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
"zerocopy",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ratatui"
|
name = "ratatui"
|
||||||
version = "0.28.0"
|
version = "0.28.0"
|
||||||
@ -2624,8 +2656,8 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"paste",
|
"paste",
|
||||||
"profiling",
|
"profiling",
|
||||||
"rand",
|
"rand 0.8.5",
|
||||||
"rand_chacha",
|
"rand_chacha 0.3.1",
|
||||||
"simd_helpers",
|
"simd_helpers",
|
||||||
"system-deps",
|
"system-deps",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
|||||||
@ -14,3 +14,4 @@ imgui-winit-support = { version = "0.12.0" }
|
|||||||
winit = { version = "0.27", features = ["x11", "mint"] }
|
winit = { version = "0.27", features = ["x11", "mint"] }
|
||||||
pretty_env_logger = "0.5.0"
|
pretty_env_logger = "0.5.0"
|
||||||
copypasta = "0.8"
|
copypasta = "0.8"
|
||||||
|
rand = "0.9.0-alpha.2"
|
||||||
|
|||||||
@ -5,9 +5,12 @@ use emmaemu::{
|
|||||||
use imgui::*;
|
use imgui::*;
|
||||||
use ratatui::symbols::half_block;
|
use ratatui::symbols::half_block;
|
||||||
use sys::{ImColor, ImVec2, ImVector_ImU32};
|
use sys::{ImColor, ImVec2, ImVector_ImU32};
|
||||||
|
use rand::random;
|
||||||
|
use emmaemu::chip8::system_memory::Chip8SystemMemory;
|
||||||
use support::emmagui_support::EmmaGui;
|
use support::emmagui_support::EmmaGui;
|
||||||
mod support;
|
mod support;
|
||||||
|
|
||||||
|
|
||||||
fn hello_world_window(ui: &Ui) {
|
fn hello_world_window(ui: &Ui) {
|
||||||
|
|
||||||
let mut value = 1;
|
let mut value = 1;
|
||||||
@ -34,21 +37,20 @@ fn hello_world_window(ui: &Ui) {
|
|||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let system = Chip8Computer::default();
|
let mut system = Chip8Computer::default();
|
||||||
|
|
||||||
support::simple_init(file!(), move |_, ui| {
|
support::simple_init(file!(), move |_, ui| {
|
||||||
|
|
||||||
hello_world_window(ui);
|
// hello_world_window(ui);
|
||||||
|
|
||||||
let mut to_display = Box::new(Vec::new());
|
|
||||||
for i in 0..0xFF {
|
|
||||||
to_display.push(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
EmmaGui::hex_memory_display(to_display, 0x7F, 0x80,ui);
|
EmmaGui::system_controls(&mut system, ui);
|
||||||
|
EmmaGui::registers_view(&system, ui);
|
||||||
|
EmmaGui::hex_memory_display(system.memory.clone(), 0x100, 0x10,ui);
|
||||||
|
|
||||||
EmmaGui::system_memory_render(system.memory, ui);
|
// EmmaGui::system_memory_render(system.memory, ui);
|
||||||
|
|
||||||
system.memory.gui_render(ui);
|
// system.memory.gui_render(ui);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,21 +1,96 @@
|
|||||||
use imgui::{Condition, ImColor32, Ui};
|
use imgui::{Condition, ImColor32, Ui};
|
||||||
|
use emmaemu::chip8::computer::Chip8Computer;
|
||||||
use emmaemu::chip8::system_memory::Chip8SystemMemory;
|
use emmaemu::chip8::system_memory::Chip8SystemMemory;
|
||||||
use emmaemu::constants::{CHIP8_VIDEO_HEIGHT, CHIP8_VIDEO_WIDTH};
|
use emmaemu::constants::{CHIP8_VIDEO_HEIGHT, CHIP8_VIDEO_WIDTH};
|
||||||
|
|
||||||
pub struct EmmaGui {}
|
pub struct EmmaGui {}
|
||||||
|
|
||||||
const CELL_WIDTH: i32 = 5i32;
|
const CELL_WIDTH: i32 = 5i32;
|
||||||
const CELL_HEIGHT: i32 = 5i32;
|
const CELL_HEIGHT: i32 = 5i32;
|
||||||
|
|
||||||
impl EmmaGui {
|
impl EmmaGui {
|
||||||
pub fn hex_memory_display(bytes: Box<Vec<u8>>, rows: i32, cols: i32, ui: &Ui) {
|
pub fn system_controls(system_to_control: &mut Chip8Computer, ui: &Ui) {
|
||||||
|
ui.window("!!!! CONTROLS !!!!")
|
||||||
|
.size([200.0, 200.0], Condition::FirstUseEver)
|
||||||
|
.build(|| {
|
||||||
|
ui.text("Computer Controls");
|
||||||
|
|
||||||
|
if ui.button("Step") {
|
||||||
|
system_to_control.step_system();
|
||||||
|
};
|
||||||
|
if ui.button("Load Program") {
|
||||||
|
println!("Load a program to start at 0x200");
|
||||||
|
}
|
||||||
|
if ui.button("Clear System Memory") {
|
||||||
|
println!("Clear Memory");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn registers_view(system: &Chip8Computer, ui: &Ui) {
|
||||||
|
ui.window("Registers")
|
||||||
|
.size([400.0, 500.0], Condition::FirstUseEver)
|
||||||
|
.build(|| {
|
||||||
|
ui.text("Registers");
|
||||||
|
for i in 0..0x10 {
|
||||||
|
ui.text(format!("V{:X}: {}", i, system.registers[i as usize]));
|
||||||
|
if i != 7 {
|
||||||
|
ui.same_line();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ui.text("");
|
||||||
|
ui.text(format!("I: {:03X}", system.i_register));
|
||||||
|
ui.same_line();
|
||||||
|
ui.text(format!("ST: {:02X}", system.sound_timer));
|
||||||
|
ui.same_line();
|
||||||
|
ui.text(format!("DT: {:02X}", system.delay_timer));
|
||||||
|
ui.text(format!("PC: {:02X}", system.pc));
|
||||||
|
ui.text(format!("SP: {:02X}", system.sp));});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn hex_memory_display(bytes: Chip8SystemMemory, rows: i32, cols: i32, ui: &Ui) {
|
||||||
|
ui.window("System Memory")
|
||||||
|
.size([400.0, 300.0], Condition::FirstUseEver)
|
||||||
|
.build(|| {
|
||||||
|
let mut current_x_hover: i32 = 0;
|
||||||
|
let mut current_y_hover: i32 = 0;
|
||||||
// display a block of data
|
// display a block of data
|
||||||
for current_row in 0..rows {
|
for current_row in 0..rows {
|
||||||
|
ui.text(format!("{:02x}", current_row * cols));
|
||||||
|
ui.same_line();
|
||||||
for current_column in 0..cols {
|
for current_column in 0..cols {
|
||||||
let data_offset = current_row * cols + current_column;
|
let data_offset = current_row * cols + current_column;
|
||||||
ui.text(format!("{:02x}", bytes[data_offset as usize]));
|
let formatted_text = format!("{:02x}", bytes.peek(data_offset as u16));
|
||||||
|
let text_location = ui.cursor_screen_pos();
|
||||||
|
let text_size = ui.calc_text_size(formatted_text.clone());
|
||||||
|
let bounding_box = imgui::sys::ImVec2 {
|
||||||
|
x: text_location[0] + text_size[0],
|
||||||
|
y: text_location[1] + text_size[1],
|
||||||
|
};
|
||||||
|
|
||||||
|
if ui.is_mouse_hovering_rect(text_location, [bounding_box.x, bounding_box.y]) {
|
||||||
|
// Optionally change the text color to indicate it's interactable
|
||||||
|
ui.text_colored([1.0, 0.0, 0.0, 1.0], formatted_text);
|
||||||
|
current_x_hover = current_column;
|
||||||
|
current_y_hover = current_row;
|
||||||
|
|
||||||
|
// Check if the left mouse button is clicked while hovering over the text
|
||||||
|
if ui.is_mouse_clicked(imgui::MouseButton::Left) {
|
||||||
|
println!("Text was clicked!");
|
||||||
|
// Perform any action here, e.g., call a function, trigger an event, etc.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Default color text when not hovering
|
||||||
|
ui.text(formatted_text);
|
||||||
|
}
|
||||||
|
if current_column != (cols - 1) {
|
||||||
|
ui.same_line();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ui.text(format!("Offset 0x{:03x}", current_x_hover * cols + current_y_hover));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn system_memory_render(memory: Chip8SystemMemory, ui: &Ui) {
|
pub fn system_memory_render(memory: Chip8SystemMemory, ui: &Ui) {
|
||||||
ui.window("System Memory")
|
ui.window("System Memory")
|
||||||
@ -44,7 +119,6 @@ impl EmmaGui {
|
|||||||
idx += 1;
|
idx += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -47,11 +47,12 @@ impl Chip8Computer {
|
|||||||
let low_byte = self.memory.clone().peek(self.pc + 1) as u16;
|
let low_byte = self.memory.clone().peek(self.pc + 1) as u16;
|
||||||
working_instruction = high_byte | low_byte;
|
working_instruction = high_byte | low_byte;
|
||||||
|
|
||||||
let decided_instruction =
|
let decoded_instruction =
|
||||||
Chip8Computer::decode_instruction(self.clone(), working_instruction);
|
Chip8Computer::decode_instruction(self.clone(), working_instruction);
|
||||||
|
|
||||||
|
println!("DECODED INSTRUCTION = {:?}", decoded_instruction);
|
||||||
|
|
||||||
match (self.state, decided_instruction) {
|
match (self.state, decoded_instruction) {
|
||||||
(Chip8CpuStates::WaitingForInstruction, Chip8CpuInstructions::SysAddr(target_address)) => {
|
(Chip8CpuStates::WaitingForInstruction, Chip8CpuInstructions::SysAddr(target_address)) => {
|
||||||
self.pc = target_address as u16;
|
self.pc = target_address as u16;
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
#[derive(Debug)]
|
||||||
pub enum Chip8CpuInstructions {
|
pub enum Chip8CpuInstructions {
|
||||||
SysAddr(i16), // 0x0nnn Exit to System Call
|
SysAddr(i16), // 0x0nnn Exit to System Call
|
||||||
CLS, // * 0x00E0 Clear Screen
|
CLS, // * 0x00E0 Clear Screen
|
||||||
|
|||||||
@ -5,6 +5,7 @@ use ratatui::{style::Style, widgets::Widget};
|
|||||||
|
|
||||||
use crate::constants::{CHIP8_MEMORY_SIZE, CHIP8_VIDEO_HEIGHT, CHIP8_VIDEO_WIDTH};
|
use crate::constants::{CHIP8_MEMORY_SIZE, CHIP8_VIDEO_HEIGHT, CHIP8_VIDEO_WIDTH};
|
||||||
|
|
||||||
|
pub const CHIP8_PROGRAM_LOAD_OFFSET: i32 = 0x200;
|
||||||
pub const CHIP8FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];
|
pub const CHIP8FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];
|
||||||
pub const CHIP8FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];
|
pub const CHIP8FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];
|
||||||
pub const CHIP8FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];
|
pub const CHIP8FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];
|
||||||
@ -53,9 +54,6 @@ const cell_width: i32 = 5i32;
|
|||||||
const cell_height: i32 = 5i32;
|
const cell_height: i32 = 5i32;
|
||||||
|
|
||||||
impl Chip8SystemMemory {
|
impl Chip8SystemMemory {
|
||||||
pub fn gui_render(self, ui: &Ui) {
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn peek(self, address: u16) -> u8 {
|
pub fn peek(self, address: u16) -> u8 {
|
||||||
self.memory[address as usize]
|
self.memory[address as usize]
|
||||||
}
|
}
|
||||||
@ -65,6 +63,17 @@ impl Chip8SystemMemory {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn load_program(to_load_into: [u8; CHIP8_MEMORY_SIZE as usize], program_data: Box<Vec<u8>>) -> [u8; CHIP8_MEMORY_SIZE as usize] {
|
||||||
|
let mut load_target = to_load_into.clone();
|
||||||
|
|
||||||
|
// loop through the program data starting at 0x200
|
||||||
|
for load_index in 0..program_data.len() {
|
||||||
|
load_target[load_index + CHIP8_PROGRAM_LOAD_OFFSET as usize] = program_data[load_index];
|
||||||
|
}
|
||||||
|
|
||||||
|
load_target
|
||||||
|
}
|
||||||
|
|
||||||
pub fn load_to_memory(
|
pub fn load_to_memory(
|
||||||
to_load_into: [u8; CHIP8_MEMORY_SIZE as usize],
|
to_load_into: [u8; CHIP8_MEMORY_SIZE as usize],
|
||||||
) -> [u8; CHIP8_MEMORY_SIZE as usize] {
|
) -> [u8; CHIP8_MEMORY_SIZE as usize] {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
pub const CHIP8_REGISTER_COUNT: i32 = 16;
|
pub const CHIP8_REGISTER_COUNT: i32 = 16;
|
||||||
pub const CHIP8_MEMORY_SIZE: i32 = 2048i32;
|
pub const CHIP8_MEMORY_SIZE: i32 = 4096i32;
|
||||||
pub const CHIP8_VIDEO_WIDTH: i32 = 64i32;
|
pub const CHIP8_VIDEO_WIDTH: i32 = 64i32;
|
||||||
pub const CHIP8_VIDEO_HEIGHT: i32 = 32i32;
|
pub const CHIP8_VIDEO_HEIGHT: i32 = 32i32;
|
||||||
pub const CHIP8_VIDEO_MEMORY: usize = (CHIP8_VIDEO_HEIGHT * CHIP8_VIDEO_WIDTH) as usize;
|
pub const CHIP8_VIDEO_MEMORY: usize = (CHIP8_VIDEO_HEIGHT * CHIP8_VIDEO_WIDTH) as usize;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user