From 5af19969ce48f0d7a06c9ac307a11413b95d3773 Mon Sep 17 00:00:00 2001 From: Jairinho Date: Wed, 23 Feb 2022 19:39:14 -0300 Subject: [PATCH] playing with libretro --- Makefile | 11 +++++---- libretro/bridge.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ libretro/libretro.go | 38 +++++++++++++++++++++--------- 3 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 libretro/bridge.c diff --git a/Makefile b/Makefile index 4b6c98b..2c761a0 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,17 @@ TARGET=chip8_libretro LIBRETRO_CORE=$(TARGET).so LIBRETRO_HEADER=$(TARGET).h +BUILD_VERSION=$(shell git rev-parse --short HEAD) # run: $(LIBRETRO_CORE) # retroarch -v -L $(LIBRETRO_CORE) roms/test_opcode.ch8 -$(LIBRETRO_CORE): - go build -buildmode=c-shared -o $@ ./libretro - -test: - go test -v -race ./chip8 +$(LIBRETRO_CORE): clean + go build -buildmode=c-shared -ldflags "-X 'main.BuildVersion=$(BUILD_VERSION)'" -o $@ ./libretro clean: rm -f $(LIBRETRO_CORE) $(LIBRETRO_HEADER) +test: + go test -v -race ./chip8 + diff --git a/libretro/bridge.c b/libretro/bridge.c new file mode 100644 index 0000000..3c19524 --- /dev/null +++ b/libretro/bridge.c @@ -0,0 +1,55 @@ +#include +#include "libretro.h" + +// RETRO_API void retro_set_environment(retro_environment_t); +// RETRO_API void retro_set_video_refresh(retro_video_refresh_t); +// RETRO_API void retro_set_audio_sample(retro_audio_sample_t); +// RETRO_API void retro_set_audio_sample_batch(retro_audio_sample_batch_t); +// RETRO_API void retro_set_input_poll(retro_input_poll_t); +// RETRO_API void retro_set_input_state(retro_input_state_t); + +RETRO_API void retro_init(void) +{ + void Initialize(void); + Initialize(); +} + +RETRO_API void retro_deinit(void) +{ + void Deinitialize(void); + Deinitialize(); +} + +RETRO_API unsigned retro_api_version(void) +{ + return 1; +} + +RETRO_API void retro_get_system_info(struct retro_system_info *info) +{ + memset(info, 0, sizeof(*info)); + void GetEmulatorInfo(struct retro_system_info * info); + GetEmulatorInfo(info); +} + +RETRO_API void retro_get_system_av_info(struct retro_system_av_info *info) +{ + memset(info, 0, sizeof(*info)); + void GetEmulatorAVInfo(struct retro_system_av_info * info); + GetEmulatorAVInfo(info); +} + +// RETRO_API void retro_set_controller_port_device(unsigned port, unsigned device); +// RETRO_API void retro_reset(void); +// RETRO_API void retro_run(void); +// RETRO_API size_t retro_serialize_size(void); +// RETRO_API bool retro_serialize(void *data, size_t size); +// RETRO_API bool retro_unserialize(const void *data, size_t size); +// RETRO_API void retro_cheat_reset(void); +// RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *code); +// RETRO_API bool retro_load_game(const struct retro_game_info *game); +// RETRO_API bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info); +// RETRO_API void retro_unload_game(void); +// RETRO_API unsigned retro_get_region(void); +// RETRO_API void *retro_get_memory_data(unsigned id); +// RETRO_API size_t retro_get_memory_size(unsigned id); \ No newline at end of file diff --git a/libretro/libretro.go b/libretro/libretro.go index bf75183..0a03dee 100644 --- a/libretro/libretro.go +++ b/libretro/libretro.go @@ -9,24 +9,40 @@ typedef struct retro_system_av_info retro_system_av_info; */ import "C" import ( - "fmt" + "github.com/tangzero/chip8-emulator/chip8" ) -const RetroAPIVersion = 1 +var BuildVersion string +var emulator *chip8.Emulator -//export retro_init -func retro_init() { - fmt.Println("loading chip8 core...") +//export Initialize +func Initialize() { + emulator = chip8.NewEmulator() } -//export retro_deinit -func retro_deinit() { - fmt.Println("unloading chip8 core...") +//export Deinitialize +func Deinitialize() { + emulator = nil } -//export retro_api_version -func retro_api_version() uint32 { - return RetroAPIVersion +//export GetEmulatorInfo +func GetEmulatorInfo(info *C.retro_system_info) { + info.library_name = C.CString("CHIP-8 Emulator by TangZero") + info.library_version = C.CString(BuildVersion) + info.valid_extensions = C.CString("ch8") + info.need_fullpath = false + info.block_extract = false +} + +//export GetEmulatorAVInfo +func GetEmulatorAVInfo(info *C.retro_system_av_info) { + info.geometry.base_width = 64 + info.geometry.base_height = 32 + info.geometry.max_width = 64 + info.geometry.max_height = 32 + info.geometry.aspect_ratio = 0.0 + info.timing.fps = 60 + info.timing.sample_rate = 44100 } func main() {}