Brad Parker
3 years ago
commit
82c197492c
5 changed files with 2551 additions and 0 deletions
@ -0,0 +1,139 @@ |
|||||
|
STATIC_LINKING := 0 |
||||
|
AR := ar |
||||
|
|
||||
|
ifeq ($(platform),) |
||||
|
platform = unix |
||||
|
ifeq ($(shell uname -a),) |
||||
|
platform = win |
||||
|
else ifneq ($(findstring MINGW,$(shell uname -a)),) |
||||
|
platform = win |
||||
|
else ifneq ($(findstring Darwin,$(shell uname -a)),) |
||||
|
platform = osx |
||||
|
else ifneq ($(findstring win,$(shell uname -a)),) |
||||
|
platform = win |
||||
|
endif |
||||
|
endif |
||||
|
|
||||
|
# system platform
|
||||
|
system_platform = unix |
||||
|
ifeq ($(shell uname -a),) |
||||
|
EXE_EXT = .exe |
||||
|
system_platform = win |
||||
|
else ifneq ($(findstring Darwin,$(shell uname -a)),) |
||||
|
system_platform = osx |
||||
|
arch = intel |
||||
|
ifeq ($(shell uname -p),powerpc) |
||||
|
arch = ppc |
||||
|
endif |
||||
|
else ifneq ($(findstring MINGW,$(shell uname -a)),) |
||||
|
system_platform = win |
||||
|
endif |
||||
|
|
||||
|
|
||||
|
CORE_DIR += . |
||||
|
TARGET_NAME := skeleton |
||||
|
LIBM = -lm |
||||
|
|
||||
|
ifeq ($(ARCHFLAGS),) |
||||
|
ifeq ($(archs),ppc) |
||||
|
ARCHFLAGS = -arch ppc -arch ppc64 |
||||
|
else |
||||
|
ARCHFLAGS = -arch i386 -arch x86_64 |
||||
|
endif |
||||
|
endif |
||||
|
|
||||
|
ifeq ($(platform), osx) |
||||
|
ifndef ($(NOUNIVERSAL)) |
||||
|
CXXFLAGS += $(ARCHFLAGS) |
||||
|
LFLAGS += $(ARCHFLAGS) |
||||
|
endif |
||||
|
endif |
||||
|
|
||||
|
ifeq ($(STATIC_LINKING), 1) |
||||
|
EXT := a |
||||
|
endif |
||||
|
|
||||
|
ifeq ($(platform), unix) |
||||
|
EXT ?= so |
||||
|
TARGET := $(TARGET_NAME)_libretro.$(EXT) |
||||
|
fpic := -fPIC |
||||
|
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/link.T -Wl,--no-undefined |
||||
|
else ifeq ($(platform), linux-portable) |
||||
|
TARGET := $(TARGET_NAME)_libretro.$(EXT) |
||||
|
fpic := -fPIC -nostdlib |
||||
|
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/link.T |
||||
|
LIBM := |
||||
|
else ifneq (,$(findstring osx,$(platform))) |
||||
|
TARGET := $(TARGET_NAME)_libretro.dylib |
||||
|
fpic := -fPIC |
||||
|
SHARED := -dynamiclib |
||||
|
else ifneq (,$(findstring ios,$(platform))) |
||||
|
TARGET := $(TARGET_NAME)_libretro_ios.dylib |
||||
|
fpic := -fPIC |
||||
|
SHARED := -dynamiclib |
||||
|
|
||||
|
ifeq ($(IOSSDK),) |
||||
|
IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) |
||||
|
endif |
||||
|
|
||||
|
DEFINES := -DIOS |
||||
|
CC = cc -arch armv7 -isysroot $(IOSSDK) |
||||
|
ifeq ($(platform),ios9) |
||||
|
CC += -miphoneos-version-min=8.0 |
||||
|
CXXFLAGS += -miphoneos-version-min=8.0 |
||||
|
else |
||||
|
CC += -miphoneos-version-min=5.0 |
||||
|
CXXFLAGS += -miphoneos-version-min=5.0 |
||||
|
endif |
||||
|
else ifneq (,$(findstring qnx,$(platform))) |
||||
|
TARGET := $(TARGET_NAME)_libretro_qnx.so |
||||
|
fpic := -fPIC |
||||
|
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/link.T -Wl,--no-undefined |
||||
|
else ifeq ($(platform), emscripten) |
||||
|
TARGET := $(TARGET_NAME)_libretro_emscripten.bc |
||||
|
fpic := -fPIC |
||||
|
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/link.T -Wl,--no-undefined |
||||
|
else ifeq ($(platform), vita) |
||||
|
TARGET := $(TARGET_NAME)_vita.a |
||||
|
CC = arm-vita-eabi-gcc |
||||
|
AR = arm-vita-eabi-ar |
||||
|
CXXFLAGS += -Wl,-q -Wall -O3 |
||||
|
STATIC_LINKING = 1 |
||||
|
else |
||||
|
CC = gcc |
||||
|
TARGET := $(TARGET_NAME)_libretro.dll |
||||
|
SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=$(CORE_DIR)/link.T -Wl,--no-undefined |
||||
|
endif |
||||
|
|
||||
|
LDFLAGS += $(LIBM) |
||||
|
|
||||
|
ifeq ($(DEBUG), 1) |
||||
|
CXXFLAGS += -O0 -g |
||||
|
else |
||||
|
CXXFLAGS += -O3 |
||||
|
endif |
||||
|
|
||||
|
include Makefile.common |
||||
|
|
||||
|
OBJECTS := $(SOURCES_C:.c=.o) $(SOURCES_CXX:.cpp=.o) |
||||
|
|
||||
|
CFLAGS += -Wall -D__LIBRETRO__ $(fpic) |
||||
|
CXXFLAGS += -Wall -D__LIBRETRO__ $(fpic) |
||||
|
|
||||
|
all: $(TARGET) |
||||
|
|
||||
|
$(TARGET): $(OBJECTS) |
||||
|
ifeq ($(STATIC_LINKING), 1) |
||||
|
$(AR) rcs $@ $(OBJECTS) |
||||
|
else |
||||
|
$(CXX) $(fpic) $(SHARED) $(INCLUDES) -o $@ $(OBJECTS) $(LDFLAGS) |
||||
|
endif |
||||
|
|
||||
|
%.o: %.c |
||||
|
$(CXX) $(CXXFLAGS) $(fpic) -c -o $@ $< |
||||
|
|
||||
|
clean: |
||||
|
rm -f $(OBJECTS) $(TARGET) |
||||
|
|
||||
|
.PHONY: clean |
||||
|
|
@ -0,0 +1,2 @@ |
|||||
|
SOURCES_C := |
||||
|
SOURCES_CXX := $(CORE_DIR)/libretro.c |
@ -0,0 +1,276 @@ |
|||||
|
#include <stdio.h> |
||||
|
#include <stdint.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdarg.h> |
||||
|
#include <string.h> |
||||
|
#include <math.h> |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#if defined(_WIN32) && !defined(_XBOX) |
||||
|
#include <windows.h> |
||||
|
#endif |
||||
|
#include "libretro.h" |
||||
|
|
||||
|
#define VIDEO_WIDTH 256 |
||||
|
#define VIDEO_HEIGHT 384 |
||||
|
#define VIDEO_PIXELS VIDEO_WIDTH * VIDEO_HEIGHT |
||||
|
|
||||
|
static uint8_t *frame_buf; |
||||
|
static struct retro_log_callback logging; |
||||
|
static retro_log_printf_t log_cb; |
||||
|
static bool use_audio_cb; |
||||
|
static float last_aspect; |
||||
|
static float last_sample_rate; |
||||
|
char retro_base_directory[4096]; |
||||
|
char retro_game_path[4096]; |
||||
|
|
||||
|
static void fallback_log(enum retro_log_level level, const char *fmt, ...) |
||||
|
{ |
||||
|
(void)level; |
||||
|
va_list va; |
||||
|
va_start(va, fmt); |
||||
|
vfprintf(stderr, fmt, va); |
||||
|
va_end(va); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static retro_environment_t environ_cb; |
||||
|
|
||||
|
void retro_init(void) |
||||
|
{ |
||||
|
frame_buf = (uint8_t*)malloc(VIDEO_PIXELS * sizeof(uint32_t)); |
||||
|
const char *dir = NULL; |
||||
|
if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) |
||||
|
{ |
||||
|
snprintf(retro_base_directory, sizeof(retro_base_directory), "%s", dir); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void retro_deinit(void) |
||||
|
{ |
||||
|
free(frame_buf); |
||||
|
frame_buf = NULL; |
||||
|
} |
||||
|
|
||||
|
unsigned retro_api_version(void) |
||||
|
{ |
||||
|
return RETRO_API_VERSION; |
||||
|
} |
||||
|
|
||||
|
void retro_set_controller_port_device(unsigned port, unsigned device) |
||||
|
{ |
||||
|
log_cb(RETRO_LOG_INFO, "Plugging device %u into port %u.\n", device, port); |
||||
|
} |
||||
|
|
||||
|
void retro_get_system_info(struct retro_system_info *info) |
||||
|
{ |
||||
|
memset(info, 0, sizeof(*info)); |
||||
|
info->library_name = "skeleton"; |
||||
|
info->library_version = "0.1"; |
||||
|
info->need_fullpath = true; |
||||
|
info->valid_extensions = ""; |
||||
|
} |
||||
|
|
||||
|
static retro_video_refresh_t video_cb; |
||||
|
static retro_audio_sample_t audio_cb; |
||||
|
static retro_audio_sample_batch_t audio_batch_cb; |
||||
|
static retro_input_poll_t input_poll_cb; |
||||
|
static retro_input_state_t input_state_cb; |
||||
|
|
||||
|
void retro_get_system_av_info(struct retro_system_av_info *info) |
||||
|
{ |
||||
|
float aspect = 0.0f; |
||||
|
float sampling_rate = 30000.0f; |
||||
|
|
||||
|
|
||||
|
info->geometry.base_width = VIDEO_WIDTH; |
||||
|
info->geometry.base_height = VIDEO_HEIGHT; |
||||
|
info->geometry.max_width = VIDEO_WIDTH; |
||||
|
info->geometry.max_height = VIDEO_HEIGHT; |
||||
|
info->geometry.aspect_ratio = aspect; |
||||
|
|
||||
|
last_aspect = aspect; |
||||
|
last_sample_rate = sampling_rate; |
||||
|
} |
||||
|
|
||||
|
static struct retro_rumble_interface rumble; |
||||
|
|
||||
|
void retro_set_environment(retro_environment_t cb) |
||||
|
{ |
||||
|
environ_cb = cb; |
||||
|
|
||||
|
if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging)) |
||||
|
log_cb = logging.log; |
||||
|
else |
||||
|
log_cb = fallback_log; |
||||
|
|
||||
|
static const struct retro_controller_description controllers[] = { |
||||
|
{ "Nintendo DS", RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0) }, |
||||
|
}; |
||||
|
|
||||
|
static const struct retro_controller_info ports[] = { |
||||
|
{ controllers, 1 }, |
||||
|
{ NULL, 0 }, |
||||
|
}; |
||||
|
|
||||
|
cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); |
||||
|
} |
||||
|
|
||||
|
void retro_set_audio_sample(retro_audio_sample_t cb) |
||||
|
{ |
||||
|
audio_cb = cb; |
||||
|
} |
||||
|
|
||||
|
void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) |
||||
|
{ |
||||
|
audio_batch_cb = cb; |
||||
|
} |
||||
|
|
||||
|
void retro_set_input_poll(retro_input_poll_t cb) |
||||
|
{ |
||||
|
input_poll_cb = cb; |
||||
|
} |
||||
|
|
||||
|
void retro_set_input_state(retro_input_state_t cb) |
||||
|
{ |
||||
|
input_state_cb = cb; |
||||
|
} |
||||
|
|
||||
|
void retro_set_video_refresh(retro_video_refresh_t cb) |
||||
|
{ |
||||
|
video_cb = cb; |
||||
|
} |
||||
|
|
||||
|
static unsigned x_coord; |
||||
|
static unsigned y_coord; |
||||
|
static unsigned phase; |
||||
|
static int mouse_rel_x; |
||||
|
static int mouse_rel_y; |
||||
|
|
||||
|
void retro_reset(void) |
||||
|
{ |
||||
|
x_coord = 0; |
||||
|
y_coord = 0; |
||||
|
} |
||||
|
|
||||
|
static void update_input(void) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void check_variables(void) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
static void audio_callback(void) |
||||
|
{ |
||||
|
for (unsigned i = 0; i < 30000 / 60; i++, phase++) |
||||
|
{ |
||||
|
int16_t val = 0x800 * sinf(2.0f * M_PI * phase * 300.0f / 30000.0f); |
||||
|
audio_cb(val, val); |
||||
|
} |
||||
|
|
||||
|
phase %= 100; |
||||
|
} |
||||
|
|
||||
|
static void audio_set_state(bool enable) |
||||
|
{ |
||||
|
(void)enable; |
||||
|
} |
||||
|
|
||||
|
void retro_run(void) |
||||
|
{ |
||||
|
unsigned i; |
||||
|
update_input(); |
||||
|
|
||||
|
|
||||
|
|
||||
|
bool updated = false; |
||||
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) |
||||
|
check_variables(); |
||||
|
} |
||||
|
|
||||
|
bool retro_load_game(const struct retro_game_info *info) |
||||
|
{ |
||||
|
struct retro_input_descriptor desc[] = { |
||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" }, |
||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Up" }, |
||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" }, |
||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" }, |
||||
|
{ 0 }, |
||||
|
}; |
||||
|
|
||||
|
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); |
||||
|
|
||||
|
enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; |
||||
|
if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) |
||||
|
{ |
||||
|
log_cb(RETRO_LOG_INFO, "XRGB8888 is not supported.\n"); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
snprintf(retro_game_path, sizeof(retro_game_path), "%s", info->path); |
||||
|
struct retro_audio_callback audio_cb = { audio_callback, audio_set_state }; |
||||
|
use_audio_cb = environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK, &audio_cb); |
||||
|
|
||||
|
check_variables(); |
||||
|
|
||||
|
(void)info; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
void retro_unload_game(void) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
unsigned retro_get_region(void) |
||||
|
{ |
||||
|
return RETRO_REGION_NTSC; |
||||
|
} |
||||
|
|
||||
|
bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
size_t retro_serialize_size(void) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
bool retro_serialize(void *data_, size_t size) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
bool retro_unserialize(const void *data_, size_t size) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
void *retro_get_memory_data(unsigned id) |
||||
|
{ |
||||
|
(void)id; |
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
|
size_t retro_get_memory_size(unsigned id) |
||||
|
{ |
||||
|
(void)id; |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
void retro_cheat_reset(void) |
||||
|
{} |
||||
|
|
||||
|
void retro_cheat_set(unsigned index, bool enabled, const char *code) |
||||
|
{ |
||||
|
(void)index; |
||||
|
(void)enabled; |
||||
|
(void)code; |
||||
|
} |
||||
|
|
File diff suppressed because it is too large
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
global: retro_*; |
||||
|
local: *; |
||||
|
}; |
||||
|
|
Loading…
Reference in new issue