diff --git a/Cargo.toml b/Cargo.toml index d9f49161b3281efdd2ebf0341b6526b35ccbaf3e..20c910200d649ba370a42484a81c6f355c97a253 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ opt-level = 3 codegen-units = 1 [workspace] -members = [".", "frontends/sdl"] +members = [".", "frontends/libretro", "frontends/sdl"] [package.metadata.docs.rs] features = ["wasm", "gen-mock"] diff --git a/frontends/libretro/Cargo.toml b/frontends/libretro/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..9002437605e7359a291c47de14047d6f60718145 --- /dev/null +++ b/frontends/libretro/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "boytacean-libretro" +version = "0.9.6" +authors = ["João Magalhães <joamag@gmail.com>"] +description = "A Lib Retro frontend for Boytacen" +license = "Apache-2.0" +keywords = ["gameboy", "emulator", "rust", "libretro"] +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies.boytacean] +path = "../.." diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..9f58a135224d42e12cc5650c1e6f91c50af76d4e --- /dev/null +++ b/frontends/libretro/src/lib.rs @@ -0,0 +1,86 @@ +#![allow(clippy::uninlined_format_args)] + +use std::os::raw::{c_char, c_void}; + +const RETRO_API_VERSION: u32 = 1; + +#[repr(C)] +pub struct retro_system_info { + pub library_name: *const c_char, + pub library_version: *const c_char, + pub valid_extensions: *const c_char, + pub need_fullpath: bool, + pub block_extract: bool, +} + +#[repr(C)] +pub struct retro_game_geometry { + pub base_width: u32, + pub base_height: u32, + pub max_width: u32, + pub max_height: u32, + pub aspect_ratio: f32, +} + +#[repr(C)] +pub struct retro_system_timing { + pub fps: f64, + pub sample_rate: f64, +} + +#[repr(C)] +pub struct retro_system_api { + pub retro_api_version: u32, + pub retro_get_system_info: extern "C" fn(*mut retro_system_info), + pub retro_set_environment: extern "C" fn(extern "C" fn(u32, *const c_void), *const c_void), + pub retro_set_video_refresh: extern "C" fn(extern "C" fn()), + pub retro_set_audio_sample: extern "C" fn(extern "C" fn(i16)), + pub retro_set_audio_sample_batch: extern "C" fn(extern "C" fn(*const i16, usize)), + pub retro_set_input_poll: extern "C" fn(extern "C" fn()), + pub retro_set_input_state: extern "C" fn(extern "C" fn(u32, u32, u16, i16) -> i16), + // Add other Libretro core functions here as needed +} + +#[no_mangle] +extern "C" fn retro_get_system_info(info: *mut retro_system_info) { + unsafe { + (*info).library_name = "Boytacean\0".as_ptr() as *const c_char; + (*info).library_version = "0.9.6\0".as_ptr() as *const c_char; + (*info).valid_extensions = "gb\0gbc\0\0".as_ptr() as *const c_char; + (*info).need_fullpath = false; + (*info).block_extract = false; + } +} + +#[no_mangle] +extern "C" fn retro_set_environment( + _callback: extern "C" fn(u32, *const c_void), + _data: *const c_void, +) { + // Set any environment variables or configuration options here if needed + // For example, you might handle system RAM allocation using this function +} + +// Add other core functions here as needed + +// Call this function to initialize the libretro core +#[no_mangle] +pub extern "C" fn retro_api_version() -> u32 { + RETRO_API_VERSION +} + +// Define other core functions here as needed + +// Add your Game Boy emulator code here +// ... + +// Entry point for the libretro core +#[no_mangle] +pub extern "C" fn retro_init() {} + +// Other libretro core functions +// ... + +// Entry point to deinitialize the libretro core +#[no_mangle] +pub extern "C" fn retro_deinit() {} diff --git a/frontends/sdl/Cargo.toml b/frontends/sdl/Cargo.toml index 9d884f80b440ae4beaf6237664d9847c2382f5b8..6032c9216321a5393cec32699ee57e8a87583c39 100644 --- a/frontends/sdl/Cargo.toml +++ b/frontends/sdl/Cargo.toml @@ -6,6 +6,7 @@ description = "An SDL frontend for Boytacen" license = "Apache-2.0" keywords = ["gameboy", "emulator", "rust", "sdl"] edition = "2018" +readme = "README.md" [features] slow = []