diff --git a/.idea/nesrust.iml b/.idea/nesrust.iml
index 8632646..72d97fe 100644
--- a/.idea/nesrust.iml
+++ b/.idea/nesrust.iml
@@ -6,6 +6,7 @@
+
diff --git a/Cargo.lock b/Cargo.lock
index 3665943..abc75e7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,17 +2,29 @@
# It is not intended for manual editing.
version = 4
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
[[package]]
name = "bitflags"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
+[[package]]
+name = "cfg-if"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
+
[[package]]
name = "core"
version = "0.1.0"
dependencies = [
- "bitflags",
+ "bitflags 2.8.0",
"simplelog",
"strum",
]
@@ -108,22 +120,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]]
-name = "sdl3"
-version = "0.14.14"
+name = "sdl2"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e55f9adf2ac7e868746564d885f677fa797106f7c5deffa348dad3ef6e659300"
+checksum = "3b498da7d14d1ad6c839729bd4ad6fc11d90a57583605f3b4df2cd709a9cd380"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"lazy_static",
"libc",
- "sdl3-sys",
+ "sdl2-sys",
]
[[package]]
-name = "sdl3-sys"
-version = "0.4.3+SDL3-3.2.2"
+name = "sdl2-sys"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb7ecf5e5f416b2e6408ebe1825ded6bdcac3b8c79e429aada3c79efc675e80d"
+checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "version-compare",
+]
[[package]]
name = "serde"
@@ -237,6 +254,7 @@ name = "ui"
version = "0.1.0"
dependencies = [
"core",
+ "sdl2",
"simplelog",
"uitlk",
]
@@ -245,7 +263,7 @@ dependencies = [
name = "uitlk"
version = "0.1.0"
dependencies = [
- "sdl3",
+ "sdl2",
]
[[package]]
@@ -254,6 +272,12 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
+[[package]]
+name = "version-compare"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
+
[[package]]
name = "winapi-util"
version = "0.1.9"
diff --git a/ui/Cargo.toml b/ui/Cargo.toml
index 41f6e02..0511452 100644
--- a/ui/Cargo.toml
+++ b/ui/Cargo.toml
@@ -8,4 +8,5 @@ edition = "2021"
[dependencies]
core = { path = "../core" }
uitlk = { path = "../uitlk" }
-simplelog = { version = "^0.12.0", features = ["paris"] }
\ No newline at end of file
+sdl2 = "0.37.0"
+simplelog = { version = "^0.12.0", features = ["paris"] }
diff --git a/ui/src/main.rs b/ui/src/main.rs
index 6a32f14..c42f5dd 100644
--- a/ui/src/main.rs
+++ b/ui/src/main.rs
@@ -1,14 +1,22 @@
-use core::system::System;
-use core::Clock;
+extern crate sdl2;
+mod renderer;
+
+use crate::renderer::Renderer;
+use sdl2::event::Event;
+use sdl2::rect::Point;
use simplelog::*;
use std::fs::File;
-use std::thread::sleep;
use std::time::Duration;
-use uitlk::UIWindow;
const ROM_PATH: &'static str = "./roms/dk.nes";
-fn main() {
+const NES_WIDTH: u32 = 256;
+const NES_HEIGHT: u32 = 240;
+const WINDOW_SCALE: u32 = 3;
+const WINDOW_WIDTH: u32 = NES_WIDTH * WINDOW_SCALE;
+const WINDOW_HEIGHT: u32 = NES_HEIGHT * WINDOW_SCALE;
+
+fn main() -> Result<(), String> {
CombinedLogger::init(vec![
TermLogger::new(
LevelFilter::Info,
@@ -24,19 +32,48 @@ fn main() {
])
.unwrap();
- let mut window = UIWindow::new("NesRust", 800, 600, 60);
+ let sdl_context = sdl2::init()?;
+ let video_subsystem = sdl_context.video()?;
- // let mut system = System::new();
- // system.insert_rom(ROM_PATH).expect("Failed to insert ROM");
- loop {
- // system.cycle();
- if window.poll_events() {
- break;
+ let window = video_subsystem
+ .window("NesRust", WINDOW_WIDTH, WINDOW_HEIGHT)
+ .position_centered()
+ .opengl()
+ .build()
+ .map_err(|e| e.to_string())?;
+
+ let mut renderer = Renderer::new(window, WINDOW_SCALE)?;
+
+ let mut event_pump = sdl_context.event_pump()?;
+ 'running: loop {
+ for event in event_pump.poll_iter() {
+ match event {
+ Event::Quit { .. } => break 'running,
+ _ => {}
+ }
}
- // TODO: System loop
+ renderer.draw(&Point::new(1, 1))?;
+ ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
- window.render();
- window.wait();
+ // Main loop
}
+
+ Ok(())
+
+ // let mut window = UIWindow::new("NesRust", 800, 600, 60);
+ //
+ // // let mut system = System::new();
+ // // system.insert_rom(ROM_PATH).expect("Failed to insert ROM");
+ // loop {
+ // // system.cycle();
+ // if window.poll_events() {
+ // break;
+ // }
+ //
+ // // TODO: System loop
+ //
+ // window.render();
+ // window.wait();
+ // }
}
diff --git a/ui/src/renderer.rs b/ui/src/renderer.rs
new file mode 100644
index 0000000..6ea876e
--- /dev/null
+++ b/ui/src/renderer.rs
@@ -0,0 +1,33 @@
+use sdl2::pixels::Color;
+use sdl2::rect::{Point, Rect};
+use sdl2::render::WindowCanvas;
+use sdl2::video::Window;
+
+pub struct Renderer {
+ canvas: WindowCanvas,
+ scale: u32,
+}
+
+impl Renderer {
+ pub fn new(window: Window, scale: u32) -> Result {
+ let canvas = window.into_canvas().build().map_err(|e| e.to_string())?;
+ Ok(Renderer { canvas, scale })
+ }
+
+ pub fn draw(&mut self, point: &Point) -> Result<(), String> {
+ self.canvas.set_draw_color(Color::BLACK);
+ self.canvas.clear();
+
+ self.canvas.set_draw_color(Color::GREEN);
+ self.canvas.fill_rect(Rect::new(
+ point.x() * self.scale as i32,
+ point.y() * self.scale as i32,
+ self.scale,
+ self.scale,
+ ))?;
+
+ self.canvas.present();
+
+ Ok(())
+ }
+}
diff --git a/uitlk/Cargo.toml b/uitlk/Cargo.toml
index 95f697d..5840641 100644
--- a/uitlk/Cargo.toml
+++ b/uitlk/Cargo.toml
@@ -6,4 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-sdl3 = "0.14.14"
\ No newline at end of file
+sdl2 = "0.37.0"
\ No newline at end of file
diff --git a/uitlk/src/lib.rs b/uitlk/src/lib.rs
index 67d3108..6f13338 100644
--- a/uitlk/src/lib.rs
+++ b/uitlk/src/lib.rs
@@ -1,93 +1,3 @@
mod menu;
-use sdl3::event::Event;
-use sdl3::keyboard::Keycode;
-use sdl3::pixels::{Color, PixelFormat, PixelMasks};
-use sdl3::rect::Rect;
-use sdl3::render::{FRect, WindowCanvas};
-use sdl3::surface::Surface;
-use sdl3::sys::pixels::{SDL_PixelFormat, SDL_PIXELFORMAT_ARGB8888};
-use sdl3::EventPump;
-use std::time::Duration;
-
-pub struct UIWindow {
- title: &'static str,
- width: u32,
- height: u32,
- refresh_rate: u32,
- canvas: WindowCanvas,
- event_pump: EventPump,
-}
-
-impl UIWindow {
- pub fn new(title: &'static str, width: u32, height: u32, refresh_rate: u32) -> Self {
- let sdl_context = sdl3::init().unwrap();
- let video_subsystem = sdl_context.video().unwrap();
-
- let window = video_subsystem
- .window(title, width, height)
- .position_centered()
- .build()
- .unwrap();
-
- let canvas = window.into_canvas();
- let event_pump = sdl_context.event_pump().unwrap();
-
- Self {
- title,
- width,
- height,
- refresh_rate,
- canvas,
- event_pump,
- }
- }
-
- pub fn render(&mut self) {
- self.canvas.set_draw_color(Color::RGB(0, 0, 0));
- self.canvas.clear();
-
- // let test = unsafe { PixelFormat::from_ll(SDL_PIXELFORMAT_ARGB8888) };
- let test = PixelFormat::try_from(SDL_PIXELFORMAT_ARGB8888).unwrap();
-
- let texture_creator = self.canvas.texture_creator();
- let mut texture = texture_creator
- .create_texture_static(
- test,
- 2,
- 1,
- )
- .unwrap();
- let color_buffer = vec![0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff];
- texture.update(None, &color_buffer, 4).unwrap();
-
- self.canvas.copy(&texture, None, Rect::new(10, 10, 50, 50)).unwrap();
-
- self.canvas.present();
- }
-
- /// Poll and processes events.
- ///
- /// # Returns
- /// `true` if there was a "Quit" event (meaning the user want to close the window)
- pub fn poll_events(&mut self) -> bool {
- for event in self.event_pump.poll_iter() {
- match event {
- Event::Quit { .. }
- | Event::KeyDown {
- keycode: Some(Keycode::Escape),
- ..
- } => return true,
- _ => {}
- }
- }
-
- false
- }
-
- pub fn wait(&self) {
- ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / self.refresh_rate));
- }
-}
-
pub trait UIComponent {}
diff --git a/uitlk/src/menu.rs b/uitlk/src/menu.rs
index b22cb20..aef3c46 100644
--- a/uitlk/src/menu.rs
+++ b/uitlk/src/menu.rs
@@ -1,11 +1,3 @@
-use sdl3::rect::Rect;
-
struct UIMenu {
}
-
-impl UIMenu {
- fn test() {
- let rect = Rect::new(50, 50, 100, 100);
- }
-}
\ No newline at end of file