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