This commit is contained in:
M4xw 2022-06-09 15:07:36 +02:00 committed by libretroadmin
parent 26c583e1c5
commit d308fe5507
4 changed files with 111 additions and 78 deletions

View File

@ -30,6 +30,7 @@ SOURCES_C += $(CORE_DIR)/libco/libco.c \
$(GB_DIR)/Core/timing.c \ $(GB_DIR)/Core/timing.c \
SOURCES_CXX += \ SOURCES_CXX += \
$(BSNES_DIR)/target-libretro/program.cpp \
$(BSNES_DIR)/target-libretro/libretro.cpp \ $(BSNES_DIR)/target-libretro/libretro.cpp \
$(BSNES_DIR)/emulator/emulator.cpp \ $(BSNES_DIR)/emulator/emulator.cpp \
$(BSNES_DIR)/filter/filter.cpp \ $(BSNES_DIR)/filter/filter.cpp \

View File

@ -1,14 +1,22 @@
#include <cassert> #include <cassert>
#include "libretro.h" #include "libretro.h"
#include "libretro_core_options.h" #include "libretro_core_options.h"
#include <emulator/emulator.hpp>
#include <sfc/interface/interface.hpp>
#include "program.h"
static retro_environment_t environ_cb; retro_environment_t environ_cb;
static retro_video_refresh_t video_cb; retro_video_refresh_t video_cb;
static retro_audio_sample_t audio_cb; retro_audio_sample_t audio_cb;
static retro_audio_sample_batch_t audio_batch_cb; retro_audio_sample_batch_t audio_batch_cb;
static retro_input_poll_t input_poll; retro_input_poll_t input_poll;
static retro_input_state_t input_state; retro_input_state_t input_state;
static retro_log_printf_t libretro_print; retro_log_printf_t libretro_print;
struct Program *program = nullptr;
bool sgb_border_disabled = false;
bool retro_pointer_enabled = false;
bool retro_pointer_superscope_reverse_buttons = false;
#define SAMPLERATE 48000 #define SAMPLERATE 48000
#define AUDIOBUFSIZE (SAMPLERATE/50) * 2 #define AUDIOBUFSIZE (SAMPLERATE/50) * 2
@ -18,7 +26,7 @@ static uint16_t audio_buffer_max = AUDIOBUFSIZE;
static int run_ahead_frames = 0; static int run_ahead_frames = 0;
static void audio_queue(int16_t left, int16_t right) void audio_queue(int16_t left, int16_t right)
{ {
audio_buffer[audio_buffer_index++] = left; audio_buffer[audio_buffer_index++] = left;
audio_buffer[audio_buffer_index++] = right; audio_buffer[audio_buffer_index++] = right;
@ -30,7 +38,7 @@ static void audio_queue(int16_t left, int16_t right)
} }
} }
#include "program.cpp" static unique_pointer<Emulator::Interface> emulator;
static string sgb_bios; static string sgb_bios;
static vector<string> cheatList; static vector<string> cheatList;
@ -597,12 +605,13 @@ void retro_set_input_state(retro_input_state_t cb)
void retro_init() void retro_init()
{ {
emulator = new SuperFamicom::Interface; emulator = new SuperFamicom::Interface;
program = new Program; program = new Program(emulator.data());
} }
void retro_deinit() void retro_deinit()
{ {
delete program; delete program;
emulator.reset();
} }
unsigned retro_api_version() unsigned retro_api_version()

View File

@ -17,14 +17,27 @@ using namespace nall;
#include <heuristics/game-boy.cpp> #include <heuristics/game-boy.cpp>
#include <heuristics/bs-memory.cpp> #include <heuristics/bs-memory.cpp>
#include "resources.hpp" #include "program.h"
#include "libretro.h" #include "libretro.h"
extern retro_environment_t environ_cb;
extern retro_video_refresh_t video_cb;
extern retro_audio_sample_t audio_cb;
extern retro_audio_sample_batch_t audio_batch_cb;
extern retro_input_poll_t input_poll;
extern retro_input_state_t input_state;
extern retro_log_printf_t libretro_print;
extern void audio_queue(int16_t left, int16_t right);
#define RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 0) #define RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 0)
static Emulator::Interface *emulator; static Emulator::Interface *emulator;
struct Program;
static Program *program = nullptr;
static bool sgb_border_disabled = false; extern bool sgb_border_disabled;
extern bool retro_pointer_enabled;
extern bool retro_pointer_superscope_reverse_buttons;
// Touchscreen Lightgun Support // Touchscreen Lightgun Support
static const int POINTER_PRESSED_CYCLES = 4; // For touchscreen sensitivity static const int POINTER_PRESSED_CYCLES = 4; // For touchscreen sensitivity
@ -44,8 +57,6 @@ struct retro_pointer_state
}; };
static retro_pointer_state retro_pointer = { 0, 0, false, false, false, false }; static retro_pointer_state retro_pointer = { 0, 0, false, false, false, false };
static bool retro_pointer_enabled = false;
static bool retro_pointer_superscope_reverse_buttons = false;
static void input_update_pointer_lightgun( unsigned port, unsigned gun_device) static void input_update_pointer_lightgun( unsigned port, unsigned gun_device)
{ {
int x, y; int x, y;
@ -166,76 +177,16 @@ static int input_handle_touchscreen_lightgun( unsigned port, unsigned gun_device
} }
} }
struct Program : Emulator::Platform
{ Program::Program(Emulator::Interface * emu)
Program();
~Program();
auto open(uint id, string name, vfs::file::mode mode, bool required) -> shared_pointer<vfs::file> override;
auto load(uint id, string name, string type, vector<string> options = {}) -> Emulator::Platform::Load override;
auto videoFrame(const uint16* data, uint pitch, uint width, uint height, uint scale) -> void override;
auto audioFrame(const double* samples, uint channels) -> void override;
auto inputPoll(uint port, uint device, uint input) -> int16 override;
auto inputRumble(uint port, uint device, uint input, bool enable) -> void override;
auto load() -> void;
auto loadFile(string location) -> vector<uint8_t>;
auto loadSuperFamicom(string location) -> bool;
auto loadGameBoy(string location) -> bool;
auto loadBSMemory(string location) -> bool;
auto save() -> void;
auto openRomSuperFamicom(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto openRomGameBoy(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto openRomBSMemory(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto hackPatchMemory(vector<uint8_t>& data) -> void;
string base_name;
bool overscan = false;
public:
struct Game {
explicit operator bool() const { return (bool)location; }
string option;
string location;
string manifest;
Markup::Node document;
boolean patched;
boolean verified;
};
struct SuperFamicom : Game {
string title;
string region;
vector<uint8_t> program;
vector<uint8_t> data;
vector<uint8_t> expansion;
vector<uint8_t> firmware;
} superFamicom;
struct GameBoy : Game {
vector<uint8_t> program;
} gameBoy;
struct BSMemory : Game {
vector<uint8_t> program;
} bsMemory;
};
static Program *program = nullptr;
Program::Program()
{ {
program = this;
emulator = emu;
Emulator::platform = this; Emulator::platform = this;
} }
Program::~Program() Program::~Program()
{ {
delete emulator;
} }
auto Program::save() -> void auto Program::save() -> void

View File

@ -0,0 +1,72 @@
#pragma once
#include <emulator/emulator.hpp>
#include <filter/filter.hpp>
#include <lzma/lzma.hpp>
#include <nall/directory.hpp>
#include <nall/instance.hpp>
#include <nall/decode/rle.hpp>
#include <nall/decode/zip.hpp>
#include <nall/encode/rle.hpp>
#include <nall/encode/zip.hpp>
#include <nall/hash/crc16.hpp>
#include "resources.hpp"
struct Program : Emulator::Platform
{
Program(Emulator::Interface * emu);
~Program();
auto open(uint id, string name, vfs::file::mode mode, bool required) -> shared_pointer<vfs::file> override;
auto load(uint id, string name, string type, vector<string> options = {}) -> Emulator::Platform::Load override;
auto videoFrame(const uint16* data, uint pitch, uint width, uint height, uint scale) -> void override;
auto audioFrame(const double* samples, uint channels) -> void override;
auto inputPoll(uint port, uint device, uint input) -> int16 override;
auto inputRumble(uint port, uint device, uint input, bool enable) -> void override;
auto load() -> void;
auto loadFile(string location) -> vector<uint8_t>;
auto loadSuperFamicom(string location) -> bool;
auto loadGameBoy(string location) -> bool;
auto loadBSMemory(string location) -> bool;
auto save() -> void;
auto openRomSuperFamicom(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto openRomGameBoy(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto openRomBSMemory(string name, vfs::file::mode mode) -> shared_pointer<vfs::file>;
auto hackPatchMemory(vector<uint8_t>& data) -> void;
string base_name;
bool overscan = false;
public:
struct Game {
explicit operator bool() const { return (bool)location; }
string option;
string location;
string manifest;
Markup::Node document;
boolean patched;
boolean verified;
};
struct SuperFamicom : Game {
string title;
string region;
vector<uint8_t> program;
vector<uint8_t> data;
vector<uint8_t> expansion;
vector<uint8_t> firmware;
} superFamicom;
struct GameBoy : Game {
vector<uint8_t> program;
} gameBoy;
struct BSMemory : Game {
vector<uint8_t> program;
} bsMemory;
};