diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs
index e28ba268ffb69256430caedb8f0e2a7e7b02c86d..11a266fc9d3ce9a1866da3e39de1ab81d87d86cd 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
 }