From dc2ddce99cc167c4c983dd9512ebe742459a9b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com> Date: Mon, 24 Jul 2023 21:40:47 +0100 Subject: [PATCH] chore: support for optinal GBC loading in libretro --- frontends/libretro/src/lib.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs index e28ba268..11a266fc 100644 --- a/frontends/libretro/src/lib.rs +++ b/frontends/libretro/src/lib.rs @@ -1,10 +1,15 @@ #![allow(clippy::uninlined_format_args)] -use std::os::raw::{c_char, c_float, c_uint, c_void}; +use std::{ + ffi::CStr, + os::raw::{c_char, c_float, c_uint, c_void}, + slice::from_raw_parts, +}; use boytacean::{ gb::GameBoy, ppu::{DISPLAY_HEIGHT, DISPLAY_WIDTH, RGB1555_SIZE}, + rom::Cartridge, }; const RETRO_API_VERSION: u32 = 1; @@ -76,7 +81,6 @@ pub unsafe extern "C" fn retro_init() { println!("retro_init()"); unsafe { EMULATOR = Some(GameBoy::new(None)); - EMULATOR.as_mut().unwrap().load(true); } } @@ -243,8 +247,15 @@ pub extern "C" fn retro_get_region() -> u32 { pub unsafe extern "C" fn retro_load_game(game: *const RetroGameInfo) -> bool { println!("retro_load_game()"); unsafe { - let data_buffer = std::slice::from_raw_parts((*game).data as *const u8, (*game).size); - EMULATOR.as_mut().unwrap().load_rom(data_buffer, None); + let instance = EMULATOR.as_mut().unwrap(); + let data_buffer = from_raw_parts((*game).data as *const u8, (*game).size); + let file_path_c = CStr::from_ptr((*game).path); + let file_path = file_path_c.to_str().unwrap(); + let mode = Cartridge::from_file(file_path).gb_mode(); + instance.set_mode(mode); + instance.reset(); + instance.load(true); + instance.load_rom(data_buffer, None); } true } -- GitLab