From 81d9823bd1f1ee4b7c2f7016e555d92e887311ec Mon Sep 17 00:00:00 2001 From: Mog <11507070+enimog@users.noreply.github.com> Date: Mon, 4 Aug 2025 12:09:00 -0400 Subject: [PATCH] libretro: add RetroAchievements support (WRAM and SRAM) --- bsnes/sfc/cartridge/cartridge.cpp | 8 ++++++++ bsnes/sfc/cartridge/cartridge.hpp | 2 ++ bsnes/sfc/interface/interface.hpp | 2 ++ bsnes/target-libretro/libretro.cpp | 21 +++++++++++++++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/bsnes/sfc/cartridge/cartridge.cpp b/bsnes/sfc/cartridge/cartridge.cpp index b39ceb66b..5cd9d6e18 100644 --- a/bsnes/sfc/cartridge/cartridge.cpp +++ b/bsnes/sfc/cartridge/cartridge.cpp @@ -158,4 +158,12 @@ auto Cartridge::unload() -> void { ram.reset(); } +auto Cartridge::getSaveRAM() -> uint8_t* { + return ram.data(); +} + +auto Cartridge::getSaveRAMSize() -> size_t { + return ram.size(); +} + } diff --git a/bsnes/sfc/cartridge/cartridge.hpp b/bsnes/sfc/cartridge/cartridge.hpp index b975c19be..e5d04b5c9 100644 --- a/bsnes/sfc/cartridge/cartridge.hpp +++ b/bsnes/sfc/cartridge/cartridge.hpp @@ -11,6 +11,8 @@ struct Cartridge { auto load() -> bool; auto save() -> void; auto unload() -> void; + auto getSaveRAM() -> uint8_t*; + auto getSaveRAMSize() -> size_t; auto serialize(serializer&) -> void; diff --git a/bsnes/sfc/interface/interface.hpp b/bsnes/sfc/interface/interface.hpp index d9437487a..145544925 100644 --- a/bsnes/sfc/interface/interface.hpp +++ b/bsnes/sfc/interface/interface.hpp @@ -1,3 +1,5 @@ +#pragma once + namespace SuperFamicom { struct ID { diff --git a/bsnes/target-libretro/libretro.cpp b/bsnes/target-libretro/libretro.cpp index 8a50f5313..90eab466a 100644 --- a/bsnes/target-libretro/libretro.cpp +++ b/bsnes/target-libretro/libretro.cpp @@ -32,6 +32,7 @@ static void audio_queue(int16_t left, int16_t right) } #include "program.cpp" +#include static string sgb_bios; static vector cheatList; @@ -1129,10 +1130,26 @@ unsigned retro_get_region() // Rely on higan to load and save SRAM until there is really compelling reason not to. void *retro_get_memory_data(unsigned id) { - return nullptr; + switch(id) + { + case RETRO_MEMORY_SAVE_RAM: + return SuperFamicom::cartridge.getSaveRAM(); + case RETRO_MEMORY_SYSTEM_RAM: + return SuperFamicom::cpu.wram; + } + + return nullptr; } size_t retro_get_memory_size(unsigned id) { - return 0; + switch(id) + { + case RETRO_MEMORY_SAVE_RAM: + return SuperFamicom::cartridge.getSaveRAMSize(); + case RETRO_MEMORY_SYSTEM_RAM: + return 128 * 1024; + } + + return 0; }