commit
919a88ec23
@ -4,7 +4,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <err.h>
|
||||
|
||||
void opts(uint8_t byte, uint8_t *options)
|
||||
{
|
||||
@ -18,7 +17,8 @@ void write_all(int fd, const void *buf, size_t count) {
|
||||
while (count) {
|
||||
ssize_t written = write(fd, buf, count);
|
||||
if (written < 0) {
|
||||
err(1, "write");
|
||||
fprintf(stderr, "write");
|
||||
exit(1);
|
||||
}
|
||||
count -= written;
|
||||
buf += written;
|
||||
|
2
Makefile
2
Makefile
@ -36,7 +36,7 @@ ifeq ($(MAKECMDGOALS),)
|
||||
MAKECMDGOALS := $(DEFAULT)
|
||||
endif
|
||||
|
||||
VERSION := 0.13.6
|
||||
include version.mk
|
||||
export VERSION
|
||||
CONF ?= debug
|
||||
SDL_AUDIO_DRIVER ?= sdl
|
||||
|
@ -17,8 +17,6 @@ filter_out2 = $(call filter_out1,$(call filter_out1,$1))
|
||||
unixpath = $(subst \,/,$1)
|
||||
unixcygpath = /$(subst :,,$(call unixpath,$1))
|
||||
|
||||
CFLAGS += -DSAMEBOY_CORE_VERSION=\"$(VERSION)\"
|
||||
|
||||
ifeq ($(platform),)
|
||||
platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
@ -51,7 +49,7 @@ ifeq ($(platform), win)
|
||||
INCFLAGS += -I Windows
|
||||
endif
|
||||
|
||||
CORE_DIR += ..
|
||||
CORE_DIR = ../
|
||||
|
||||
TARGET_NAME = sameboy
|
||||
LIBM = -lm
|
||||
@ -91,17 +89,57 @@ else ifeq ($(platform), linux-portable)
|
||||
fpic := -fPIC -nostdlib
|
||||
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T
|
||||
LIBM :=
|
||||
# (armv7 a7, hard point, neon based) ###
|
||||
# NESC, SNESC, C64 mini
|
||||
else ifeq ($(platform), classic_armv7_a7)
|
||||
TARGET := $(TARGET_NAME)_libretro.so
|
||||
fpic := -fPIC
|
||||
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,--no-undefined
|
||||
CFLAGS += -Ofast \
|
||||
-flto=4 -fwhole-program -fuse-linker-plugin \
|
||||
-fdata-sections -ffunction-sections -Wl,--gc-sections \
|
||||
-fno-stack-protector -fno-ident -fomit-frame-pointer \
|
||||
-falign-functions=1 -falign-jumps=1 -falign-loops=1 \
|
||||
-fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \
|
||||
-fmerge-all-constants -fno-math-errno \
|
||||
-marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
||||
CXXFLAGS += $(CFLAGS)
|
||||
CPPFLAGS += $(CFLAGS)
|
||||
ASFLAGS += $(CFLAGS)
|
||||
HAVE_NEON = 1
|
||||
ARCH = arm
|
||||
BUILTIN_GPU = neon
|
||||
USE_DYNAREC = 1
|
||||
ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1)
|
||||
CFLAGS += -march=armv7-a
|
||||
else
|
||||
CFLAGS += -march=armv7ve
|
||||
# If gcc is 5.0 or later
|
||||
ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1)
|
||||
LDFLAGS += -static-libgcc -static-libstdc++
|
||||
endif
|
||||
endif
|
||||
#######################################
|
||||
# Nintendo Switch (libtransistor)
|
||||
else ifeq ($(platform), switch)
|
||||
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
||||
include $(LIBTRANSISTOR_HOME)/libtransistor.mk
|
||||
CFLAGS += -Wl,-q -O3 -fno-short-enums -fno-optimize-sibling-calls
|
||||
STATIC_LINKING=1
|
||||
# Nintendo Switch (libnx)
|
||||
else ifeq ($(platform), libnx)
|
||||
include $(DEVKITPRO)/libnx/switch_rules
|
||||
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
||||
DEFINES += -DSWITCH=1 -D__SWITCH__ -DARM
|
||||
CFLAGS += $(DEFINES) -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec
|
||||
CFLAGS += -march=armv8-a -mtune=cortex-a57 -mtp=soft -mcpu=cortex-a57+crc+fp+simd -ffast-math
|
||||
CXXFLAGS := $(ASFLAGS) $(CFLAGS)
|
||||
STATIC_LINKING = 1
|
||||
# Nintendo WiiU
|
||||
else ifeq ($(platform), wiiu)
|
||||
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
||||
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
|
||||
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
|
||||
CC ?= $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
|
||||
AR ?= $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
|
||||
CFLAGS += -DGEKKO -DHW_RVL -DWIIU -mwup -mcpu=750 -meabi -mhard-float -D__ppc__ -DMSB_FIRST -I$(DEVKITPRO)/libogc/include
|
||||
CFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
|
||||
STATIC_LINKING = 1
|
||||
@ -140,7 +178,7 @@ else ifeq ($(platform), emscripten)
|
||||
fpic := -fPIC
|
||||
SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,--no-undefined
|
||||
else ifeq ($(platform), vita)
|
||||
TARGET := $(TARGET_NAME)_vita.a
|
||||
TARGET := $(TARGET_NAME)_libretro_vita.a
|
||||
CC = arm-vita-eabi-gcc
|
||||
AR = arm-vita-eabi-ar
|
||||
CFLAGS += -Wl,-q -O3 -fno-short-enums -fno-optimize-sibling-calls
|
||||
@ -172,14 +210,14 @@ else ifneq (,$(findstring windows_msvc2017,$(platform)))
|
||||
|
||||
TargetArchMoniker = $(subst $(WinPartition)_,,$(PlatformSuffix))
|
||||
|
||||
CC = cl.exe
|
||||
CXX = cl.exe
|
||||
LD = link.exe
|
||||
CC ?= cl.exe
|
||||
CXX ?= cl.exe
|
||||
LD ?= link.exe
|
||||
|
||||
reg_query = $(call filter_out2,$(subst $2,,$(shell reg query "$2" -v "$1" 2>nul)))
|
||||
fix_path = $(subst $(SPACE),\ ,$(subst \,/,$1))
|
||||
|
||||
ProgramFiles86w := $(shell cmd /c "echo %PROGRAMFILES(x86)%")
|
||||
ProgramFiles86w := $(shell cmd //c "echo %PROGRAMFILES(x86)%")
|
||||
ProgramFiles86 := $(shell cygpath "$(ProgramFiles86w)")
|
||||
|
||||
WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0)
|
||||
@ -242,7 +280,7 @@ else ifneq (,$(findstring windows_msvc2017,$(platform)))
|
||||
LDFLAGS += -DLL
|
||||
|
||||
else
|
||||
CC = gcc
|
||||
CC ?= gcc
|
||||
TARGET := $(TARGET_NAME)_libretro.dll
|
||||
SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,--no-undefined
|
||||
endif
|
||||
@ -262,6 +300,8 @@ endif
|
||||
|
||||
include Makefile.common
|
||||
|
||||
CFLAGS += -DSAMEBOY_CORE_VERSION=\"$(VERSION)\"
|
||||
|
||||
OBJECTS := $(patsubst $(CORE_DIR)/%.c,$(CORE_DIR)/build/obj/%_libretro.c.o,$(SOURCES_C))
|
||||
|
||||
OBJOUT = -o
|
||||
|
@ -1,3 +1,5 @@
|
||||
include $(CORE_DIR)/version.mk
|
||||
|
||||
INCFLAGS := -I$(CORE_DIR)
|
||||
|
||||
SOURCES_C := $(CORE_DIR)/Core/gb.c \
|
||||
|
@ -8,7 +8,7 @@ include $(CORE_DIR)/libretro/Makefile.common
|
||||
|
||||
GENERATED_SOURCES := $(filter %_boot.c,$(SOURCES_C))
|
||||
|
||||
COREFLAGS := -DINLINE=inline -D__LIBRETRO__ -DGB_INTERNAL $(INCFLAGS) -DSAMEBOY_CORE_VERSION=\"$(VERSION)\" -Wno-multichar
|
||||
COREFLAGS := -DINLINE=inline -D__LIBRETRO__ -DGB_INTERNAL $(INCFLAGS) -DSAMEBOY_CORE_VERSION=\"$(VERSION)\" -Wno-multichar -DANDROID
|
||||
|
||||
GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
|
||||
ifneq ($(GIT_VERSION)," unknown")
|
||||
|
@ -85,6 +85,8 @@ static retro_audio_sample_t audio_sample_cb;
|
||||
static retro_input_poll_t input_poll_cb;
|
||||
static retro_input_state_t input_state_cb;
|
||||
|
||||
static bool libretro_supports_bitmasks = false;
|
||||
|
||||
static unsigned emulated_devices = 1;
|
||||
static bool initialized = false;
|
||||
static unsigned screen_layout = 0;
|
||||
@ -119,24 +121,39 @@ static struct retro_rumble_interface rumble;
|
||||
|
||||
static void GB_update_keys_status(GB_gameboy_t *gb, unsigned port)
|
||||
{
|
||||
uint16_t joypad_bits = 0;
|
||||
|
||||
input_poll_cb();
|
||||
|
||||
if (libretro_supports_bitmasks) {
|
||||
joypad_bits = input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK);
|
||||
}
|
||||
else {
|
||||
unsigned j;
|
||||
|
||||
for (j = 0; j < (RETRO_DEVICE_ID_JOYPAD_R3+1); j++) {
|
||||
if (input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, j)) {
|
||||
joypad_bits |= (1 << j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GB_set_key_state_for_player(gb, GB_KEY_RIGHT, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_LEFT, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_UP, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_DOWN, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_A, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_A));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_B, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_B));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_SELECT, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_SELECT));
|
||||
GB_set_key_state_for_player(gb, GB_KEY_START, emulated_devices == 1 ? port : 0,
|
||||
input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START));
|
||||
joypad_bits & (1 << RETRO_DEVICE_ID_JOYPAD_START));
|
||||
|
||||
}
|
||||
|
||||
@ -207,7 +224,7 @@ static retro_environment_t environ_cb;
|
||||
static const struct retro_variable vars_single[] = {
|
||||
{ "sameboy_color_correction_mode", "Color correction; emulate hardware|preserve brightness|reduce contrast|off|correct curves" },
|
||||
{ "sameboy_high_pass_filter_mode", "High-pass filter; accurate|remove dc offset|off" },
|
||||
{ "sameboy_model", "Emulated model; Auto|Game Boy|Game Boy Color|Game Boy Advance|Super Game Boy|Super Game Boy 2" },
|
||||
{ "sameboy_model", "Emulated model (Restart game); Auto|Game Boy|Game Boy Color|Game Boy Advance|Super Game Boy|Super Game Boy 2" },
|
||||
{ "sameboy_border", "Display border; Super Game Boy only|always|never" },
|
||||
{ "sameboy_rumble", "Enable rumble; rumble-enabled games|all games|never" },
|
||||
{ NULL }
|
||||
@ -219,8 +236,8 @@ static const struct retro_variable vars_dual[] = {
|
||||
/*{ "sameboy_ir", "Infrared Sensor Emulation; disabled|enabled" },*/
|
||||
{ "sameboy_screen_layout", "Screen layout; top-down|left-right" },
|
||||
{ "sameboy_audio_output", "Audio output; Game Boy #1|Game Boy #2" },
|
||||
{ "sameboy_model_1", "Emulated model for Game Boy #1; Auto|Game Boy|Game Boy Color|Game Boy Advance" },
|
||||
{ "sameboy_model_2", "Emulated model for Game Boy #2; Auto|Game Boy|Game Boy Color|Game Boy Advance" },
|
||||
{ "sameboy_model_1", "Emulated model for Game Boy #1 (Restart game); Auto|Game Boy|Game Boy Color|Game Boy Advance" },
|
||||
{ "sameboy_model_2", "Emulated model for Game Boy #2 (Restart game); Auto|Game Boy|Game Boy Color|Game Boy Advance" },
|
||||
{ "sameboy_color_correction_mode_1", "Color correction for Game Boy #1; emulate hardware|preserve brightness|reduce contrast|off|correct curves" },
|
||||
{ "sameboy_color_correction_mode_2", "Color correction for Game Boy #2; emulate hardware|preserve brightness|reduce contrast|off|correct curves" },
|
||||
{ "sameboy_high_pass_filter_mode_1", "High-pass filter for Game Boy #1; accurate|remove dc offset|off" },
|
||||
@ -601,11 +618,7 @@ static void check_variables()
|
||||
new_model = MODEL_AUTO;
|
||||
}
|
||||
|
||||
if (new_model != model[0]) {
|
||||
geometry_updated = true;
|
||||
model[0] = new_model;
|
||||
init_for_current_model(0);
|
||||
}
|
||||
}
|
||||
|
||||
var.key = "sameboy_border";
|
||||
@ -747,10 +760,7 @@ static void check_variables()
|
||||
new_model = MODEL_AUTO;
|
||||
}
|
||||
|
||||
if (model[0] != new_model) {
|
||||
model[0] = new_model;
|
||||
init_for_current_model(0);
|
||||
}
|
||||
}
|
||||
|
||||
var.key = "sameboy_model_2";
|
||||
@ -776,10 +786,7 @@ static void check_variables()
|
||||
new_model = MODEL_AUTO;
|
||||
}
|
||||
|
||||
if (model[1] != new_model) {
|
||||
model[1] = new_model;
|
||||
init_for_current_model(1);
|
||||
}
|
||||
}
|
||||
|
||||
var.key = "sameboy_screen_layout";
|
||||
@ -850,6 +857,10 @@ void retro_init(void)
|
||||
else {
|
||||
log_cb = fallback_log;
|
||||
}
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL)) {
|
||||
libretro_supports_bitmasks = true;
|
||||
}
|
||||
}
|
||||
|
||||
void retro_deinit(void)
|
||||
@ -858,6 +869,8 @@ void retro_deinit(void)
|
||||
free(frame_buf_copy);
|
||||
frame_buf = NULL;
|
||||
frame_buf_copy = NULL;
|
||||
|
||||
libretro_supports_bitmasks = false;
|
||||
}
|
||||
|
||||
unsigned retro_api_version(void)
|
||||
@ -947,10 +960,14 @@ void retro_set_video_refresh(retro_video_refresh_t cb)
|
||||
|
||||
void retro_reset(void)
|
||||
{
|
||||
check_variables();
|
||||
|
||||
for (int i = 0; i < emulated_devices; i++) {
|
||||
init_for_current_model(i);
|
||||
GB_reset(&gameboy[i]);
|
||||
}
|
||||
|
||||
geometry_updated = true;
|
||||
}
|
||||
|
||||
void retro_run(void)
|
||||
|
File diff suppressed because it is too large
Load Diff
1
version.mk
Normal file
1
version.mk
Normal file
@ -0,0 +1 @@
|
||||
VERSION := 0.13.6
|
Loading…
Reference in New Issue
Block a user