diff --git a/Makefile.common b/Makefile.common new file mode 100644 index 000000000..e98b59140 --- /dev/null +++ b/Makefile.common @@ -0,0 +1,49 @@ +INCFLAGS := -I$(CORE_DIR) -I$(CORE_DIR)/arm + +SOURCES_C := $(CORE_DIR)/arm/arm.c \ + $(CORE_DIR)/arm/isa-thumb.c \ + $(CORE_DIR)/arm/isa-arm.c \ + $(CORE_DIR)/arm/decoder-arm.c \ + $(CORE_DIR)/arm/decoder-thumb.c \ + $(CORE_DIR)/arm/decoder.c \ + $(CORE_DIR)/debugger/debugger.c \ + $(CORE_DIR)/debugger/memory-debugger.c \ + $(CORE_DIR)/gba/savedata.c \ + $(CORE_DIR)/gba/io.c \ + $(CORE_DIR)/gba/rr/vbm.c \ + $(CORE_DIR)/gba/rr/mgm.c \ + $(CORE_DIR)/gba/bios.c \ + $(CORE_DIR)/gba/hle-bios.c \ + $(CORE_DIR)/gba/input.c \ + $(CORE_DIR)/gba/audio.c \ + $(CORE_DIR)/gba/memory.c \ + $(CORE_DIR)/gba/cheats.c \ + $(CORE_DIR)/gba/gba.c \ + $(CORE_DIR)/gba/hardware.c \ + $(CORE_DIR)/gba/sio.c \ + $(CORE_DIR)/gba/sio/lockstep.c \ + $(CORE_DIR)/gba/video.c \ + $(CORE_DIR)/gba/serialize.c \ + $(CORE_DIR)/gba/supervisor/config.c \ + $(CORE_DIR)/gba/supervisor/rr.c \ + $(CORE_DIR)/gba/supervisor/cli.c \ + $(CORE_DIR)/gba/supervisor/overrides.c \ + $(CORE_DIR)/gba/supervisor/thread.c \ + $(CORE_DIR)/gba/renderers/video-software.c \ + $(CORE_DIR)/platform/commandline.c \ + $(CORE_DIR)/platform/libretro/libretro.c \ + $(CORE_DIR)/third-party/inih/ini.c \ + $(CORE_DIR)/util/formatting.c \ + $(CORE_DIR)/util/vfs.c \ + $(CORE_DIR)/util/table.c \ + $(CORE_DIR)/util/vfs/vfs-mem.c \ + $(CORE_DIR)/util/string.c \ + $(CORE_DIR)/util/hash.c \ + $(CORE_DIR)/util/configuration.c \ + $(CORE_DIR)/util/crc32.c + +SOURCES_C += $(CORE_DIR)/util/circle-buffer.c +#SOURCES_C += $(CORE_DIR)/debugger/gdb-stub.c +SOURCES_C += $(CORE_DIR)/third-party/blip_buf/blip_buf.c + +SOURCES_C += $(CORE_DIR)/platform/posix/memory.c diff --git a/Makefile.libretro b/Makefile.libretro new file mode 100644 index 000000000..d74f5bf53 --- /dev/null +++ b/Makefile.libretro @@ -0,0 +1,265 @@ +DEBUG = 0 + +ifneq ($(EMSCRIPTEN),) + platform = emscripten +endif + +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 +else ifneq ($(findstring MINGW,$(shell uname -a)),) + system_platform = win +endif + +TARGET_NAME := mgba + +DEFINES := + +# Unix +ifeq ($(platform), unix) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,-version-script=link.T + DEFINES += -std=c99 +# OS X +else ifeq ($(platform), osx) + TARGET := $(TARGET_NAME)_libretro.dylib + fpic := -fPIC + SHARED := -dynamiclib + OSXVER = `sw_vers -productVersion | cut -d. -f 2` + OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"` + ifeq ($(OSX_LT_MAVERICKS),"YES") + fpic += -mmacosx-version-min=10.5 + endif + ifndef ($(NOUNIVERSAL)) + CFLAGS += $(ARCHFLAGS) + CXXFLAGS += $(ARCHFLAGS) + LDFLAGS += $(ARCHFLAGS) + endif + DEFINES += -DHAVE_LOCALE + DEFINES += -std=c99 +# iOS +else ifeq ($(platform), ios) + TARGET := $(TARGET_NAME)_libretro_ios.dylib + fpic := -fPIC + SHARED := -dynamiclib + ifeq ($(IOSSDK),) + IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) + endif + CC = clang -arch armv7 -isysroot $(IOSSDK) + CXX = clang++ -arch armv7 -isysroot $(IOSSDK) + OSXVER = `sw_vers -productVersion | cut -d. -f 2` + OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"` + ifeq ($(OSX_LT_MAVERICKS),"YES") + CC += -miphoneos-version-min=5.0 + CXX += -miphoneos-version-min=5.0 + PLATFORM_DEFINES := -miphoneos-version-min=5.0 + endif + DEFINES += -DHAVE_LOCALE + DEFINES += -std=c99 +# Theos +else ifeq ($(platform), theos_ios) + DEPLOYMENT_IOSVERSION = 5.0 + TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION) + ARCHS = armv7 armv7s + TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION) + THEOS_BUILD_DIR := objs + include $(THEOS)/makefiles/common.mk + LIBRARY_NAME = $(TARGET_NAME)_libretro_ios + DEFINES += -DHAVE_LOCALE + DEFINES += -std=c99 +# QNX +else ifeq ($(platform), qnx) + TARGET := $(TARGET_NAME)_libretro_qnx.so + fpic := -fPIC + SHARED := -lcpp -lm -shared -Wl,-version-script=link.T + CC = qcc -Vgcc_ntoarmv7le + CXX = QCC -Vgcc_ntoarmv7le_cpp + AR = QCC -Vgcc_ntoarmv7le + PLATFORM_DEFINES := -D__BLACKBERRY_QNX__ -fexceptions -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp + DEFINES += -Wc,-std=c99 + +# PS3 +else ifeq ($(platform), ps3) + TARGET := $(TARGET_NAME)_libretro_ps3.a + CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe + CXX = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-g++.exe + AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe + PLATFORM_DEFINES := -D__CELLOS_LV2__ + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# sncps3 +else ifeq ($(platform), sncps3) + TARGET := $(TARGET_NAME)_libretro_ps3.a + CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + CXX = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe + PLATFORM_DEFINES := -D__CELLOS_LV2__ + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# Lightweight PS3 Homebrew SDK +else ifeq ($(platform), psl1ght) + TARGET := $(TARGET_NAME)_libretro_psl1ght.a + CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT) + CXX = $(PS3DEV)/ppu/bin/ppu-g++$(EXE_EXT) + AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT) + PLATFORM_DEFINES := -D__CELLOS_LV2__ + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# PSP +else ifeq ($(platform), psp1) + TARGET := $(TARGET_NAME)_libretro_psp1.a + CC = psp-gcc$(EXE_EXT) + CXX = psp-g++$(EXE_EXT) + AR = psp-ar$(EXE_EXT) + PLATFORM_DEFINES := -DPSP -DCC_RESAMPLER + CFLAGS += -G0 + CXXFLAGS += -G0 + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# Xbox 360 +else ifeq ($(platform), xenon) + TARGET := $(TARGET_NAME)_libretro_xenon360.a + CC = xenon-gcc$(EXE_EXT) + CXX = xenon-g++$(EXE_EXT) + AR = xenon-ar$(EXE_EXT) + PLATFORM_DEFINES := -D__LIBXENON__ + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# Nintendo Game Cube +else ifeq ($(platform), ngc) + TARGET := $(TARGET_NAME)_libretro_ngc.a + CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) + CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT) + AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) + PLATFORM_DEFINES += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# Nintendo Wii +else ifeq ($(platform), wii) + TARGET := $(TARGET_NAME)_libretro_wii.a + CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) + CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT) + AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) + PLATFORM_DEFINES += -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float + STATIC_LINKING = 1 + DEFINES += -std=c99 + +# ARM +else ifneq (,$(findstring armv,$(platform))) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,-version-script=link.T + ifneq (,$(findstring cortexa5,$(platform))) + PLATFORM_DEFINES += -marm -mcpu=cortex-a5 + else ifneq (,$(findstring cortexa8,$(platform))) + PLATFORM_DEFINES += -marm -mcpu=cortex-a8 + else ifneq (,$(findstring cortexa9,$(platform))) + PLATFORM_DEFINES += -marm -mcpu=cortex-a9 + else ifneq (,$(findstring cortexa15a7,$(platform))) + PLATFORM_DEFINES += -marm -mcpu=cortex-a15.cortex-a7 + else + PLATFORM_DEFINES += -marm + endif + ifneq (,$(findstring softfloat,$(platform))) + PLATFORM_DEFINES += -mfloat-abi=softfp + else ifneq (,$(findstring hardfloat,$(platform))) + PLATFORM_DEFINES += -mfloat-abi=hard + endif + PLATFORM_DEFINES += -DARM + DEFINES += -std=c99 + +# emscripten +else ifeq ($(platform), emscripten) + TARGET := $(TARGET_NAME)_libretro_emscripten.bc + DEFINES += -std=c99 + +# Windows +else + TARGET := $(TARGET_NAME)_libretro.dll + CC = gcc + CXX = g++ + SHARED := -shared -static-libgcc -static-libstdc++ -Wl,-no-undefined -Wl,-version-script=link.T + DEFINES += -std=c99 + +endif + +ifeq ($(DEBUG), 1) + CFLAGS += -O0 -g + CXXFLAGS += -O0 -g +else ifeq ($(platform), emscripten) + CFLAGS += -O2 + CXXFLAGS += -O2 -fno-exceptions -fno-rtti -DHAVE_STDINT_H +else + CFLAGS += -O3 + CXXFLAGS += -O3 -fno-exceptions -fno-rtti -DHAVE_STDINT_H +endif + +CORE_DIR := src + +include Makefile.common + +OBJS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) + +DEFINES += -D__LIBRETRO__ $(PLATFORM_DEFINES) -DHAVE_STDINT_H -DHAVE_INTTYPES_H -DINLINE=inline -DCOLOR_16_BIT -DCOLOR_5_6_5 -DRESAMPLE_LIBRARY=2 -DM_PI=3.14159265358979323846 -DPATH_MAX=4096 -DBINARY_NAME=\"mgba\" -DPROJECT_VERSION=\"0.2.0\" -DPROJECT_NAME=\"mGBA\" -DSSIZE_MAX=32767 + +CFLAGS += $(CODE_DEFINES) $(fpic) $(DEFINES) +CXXFLAGS += $(fpic) $(DEFINES) + +LIBS := + +%.o: %.cpp + $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCFLAGS) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) $(INCFLAGS) + +ifeq ($(platform), theos_ios) +COMMON_FLAGS := -DIOS $(COMMON_DEFINES) $(INCFLAGS) -I$(THEOS_INCLUDE_PATH) -Wno-error +$(LIBRARY_NAME)_CFLAGS += $(CFLAGS) $(COMMON_FLAGS) +$(LIBRARY_NAME)_CXXFLAGS += $(CXXFLAGS) $(COMMON_FLAGS) +${LIBRARY_NAME}_FILES = $(SOURCES_CXX) $(SOURCES_C) +include $(THEOS_MAKE_PATH)/library.mk +else +all: $(TARGET) + +$(TARGET): $(OBJS) +ifeq ($(STATIC_LINKING), 1) + $(AR) rcs $@ $(OBJS) +else + $(CXX) -o $@ $(SHARED) $(OBJS) $(LDFLAGS) $(LIBS) +endif + + +clean-objs: + rm -f $(OBJS) + +clean: + rm -f $(OBJS) + rm -f $(TARGET) + +.PHONY: clean clean-objs +endif diff --git a/link.T b/link.T new file mode 100644 index 000000000..9e82b5dd3 --- /dev/null +++ b/link.T @@ -0,0 +1,4 @@ +{ + global: retro_*; + local: *; +}; diff --git a/src/gba/audio.h b/src/gba/audio.h index 2aa5953e5..87888feca 100644 --- a/src/gba/audio.h +++ b/src/gba/audio.h @@ -11,6 +11,10 @@ #include "util/circle-buffer.h" +#ifndef RESAMPLE_BLIP_BUF +#define RESAMPLE_BLIP_BUF 2 +#endif + #if RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF #include "third-party/blip_buf/blip_buf.h" #endif diff --git a/src/platform/posix/memory.c b/src/platform/posix/memory.c index 47760275e..e16b6eb3c 100644 --- a/src/platform/posix/memory.c +++ b/src/platform/posix/memory.c @@ -7,6 +7,14 @@ #include +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS 0x20 +#endif + +#ifndef MAP_ANON +#define MAP_ANON MAP_ANONYMOUS +#endif + void* anonymousMemoryMap(size_t size) { return mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); }