diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2c15d8b0ee..8c8dbcfe08 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -820,6 +820,23 @@ build-static-retroarch-dummy-psp: - "cp -f pkg/psp1/ICON0.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg" - "cp -f pkg/psp1/PIC1.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg" +build-static-retroarch-djgpp: + image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-djgpp-build-container:latest + stage: prepare-for-static-cores + before_script: + - export NUMPROC=$(($(nproc)/3)) + artifacts: + paths: + - retroarch-precompiled/ + expire_in: 10 min + dependencies: [] + script: + # Allow failure since we don't have a core + - "make -f Makefile.dos -j$NUMPROC ||:" + - "mkdir .retroarch-precompiled" + - "cp -r ./* .retroarch-precompiled/" + - "mv .retroarch-precompiled/ retroarch-precompiled/" + build-static-retroarch-ctr: image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-devkitpro:latest stage: prepare-for-static-cores diff --git a/Makefile.dos b/Makefile.dos new file mode 100644 index 0000000000..4b307ede2b --- /dev/null +++ b/Makefile.dos @@ -0,0 +1,217 @@ +include version.all + +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +TOPDIR ?= $(CURDIR) + + +DEBUG ?= 0 +WHOLE_ARCHIVE_LINK = 0 +GRIFFIN_BUILD = 0 + +OBJ := + +DEFINES := -DHAVE_DJGPP=1 -U__linux__ -U__linux -DRARCH_INTERNAL -DHAVE_STB_VORBIS +CC := i586-pc-msdosdjgpp-gcc +CXX := i586-pc-msdosdjgpp-g++ +TARGET := retrodos.exe + +RARCH_CONSOLE = 0 +HAVE_SHADERPIPELINE = 1 +HAVE_SPIRV_CROSS = 0 +HAVE_PATCH = 1 +HAVE_LUA = 0 +HAVE_CONFIGFILE = 1 +HAVE_GFX_WIDGETS = 1 +HAVE_LANGEXTRA = 1 +HAVE_DR_MP3 = 1 +HAVE_TRANSLATE = 0 +HAVE_SCREENSHOTS = 1 +HAVE_REWIND = 1 +HAVE_AUDIOMIXER = 1 +HAVE_CC_RESAMPLER = 1 +HAVE_MENU_COMMON = 1 +HAVE_RTGA = 1 +HAVE_RPNG = 1 +HAVE_RJPEG = 1 +HAVE_RBMP = 1 +HAVE_7ZIP = 1 +HAVE_ZLIB = 1 +HAVE_IMAGEVIEWER = 1 +HAVE_BUILTINZLIB = 1 +HAVE_LIBRETRODB = 1 +HAVE_DSP_FILTER = 1 +HAVE_VIDEO_FILTER = 1 +HAVE_STATIC_VIDEO_FILTERS = 1 +HAVE_STATIC_AUDIO_FILTERS = 1 +HAVE_FILTERS_BUILTIN = 1 +HAVE_MENU = 1 +HAVE_CONFIGFILE = 1 +HAVE_PATCH = 1 +HAVE_CHEATS = 1 +HAVE_RUNAHEAD = 1 +HAVE_NETWORKING = 0 +HAVE_NETPLAYDISCOVERY = 1 +HAVE_OVERLAY := 1 +HAVE_STB_FONT = 1 +HAVE_COMMAND := 1 +HAVE_STDIN_CMD := 1 +HAVE_CMD := 1 +HAVE_CHEEVOS = 0 +HAVE_CHD = 0 # disabled due to static libretro-common and libchdr conflicts between different cores +HAVE_STB_VORBIS = 1 +HAVE_IBXM = 1 +HAVE_CORE_INFO_CACHE = 1 + +HAVE_RGUI = 1 +HAVE_MATERIALUI = 0 +HAVE_XMB = 0 +HAVE_OZONE = 0 + + +OBJ := \ + frontend/drivers/platform_dos.o \ + gfx/drivers/vga_gfx.o gfx/drivers_font/vga_font.o \ + input/drivers/dos_input.o input/drivers_joypad/dos_joypad.o + +include Makefile.common + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +#--------------------------------------------------------------------------------- +BUILD := build +SOURCES := $(CURDIR)/source +DATA := data +INCLUDES := include +EXEFS_SRC := exefs_src + +APP_TITLE := RetroArch +APP_VERSION := $(RARCH_VERSION) +APP_AUTHOR := libretro Team +APP_ICON := pkg/libnx/retroarch.jpg + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := + +CFLAGS := -g -Wall -O3 -fcommon -ffast-math -ffunction-sections \ + $(ARCH) $(DEFINES) $(INCLUDE_DIRS) + +CFLAGS += $(INCLUDE) + +ifeq ($(HAVE_FILTERS_BUILTIN), 1) + CFLAGS += -DHAVE_FILTERS_BUILTIN +endif + +ifeq ($(strip $(HAVE_STATIC_DUMMY)),1) + CFLAGS += -DHAVE_STATIC_DUMMY=1 +endif + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = $(ARCH) -Wl,--allow-multiple-definition -Wl,-Map,$(notdir $*.map) + +# add things from Makefile.common +CFLAGS += $(DEF_FLAGS) + +LIBS := -lstdc++ -lm + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/ + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +export OFILES := $(OBJ) + +ifeq ($(strip $(HAVE_STATIC_DUMMY)),) + OFILES += libretro_libnx.a +endif + +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +DEPENDS_TMP := $(OFILES:.o=.d) +DEPENDS := $(filter-out libretro_libnx.a,$(DEPENDS_TMP)) + +.PHONY: clean all + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT) + +$(OUTPUT): $(OBJ) + $(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(PLATEXTRA) -L. -lretro_dos $(LIBS) + +%.o: %.c + $(CC) -c -o $@ $(CFLAGS) $< + +%.o: %.cpp + $(CXX) -c -o $@ $(CFLAGS) $< + +clean: + rm -f $(DEPENDS) $(OBJ) $(OUTPUT) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/Makefile.griffin b/Makefile.griffin index d51d720021..573ffc891f 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -984,48 +984,6 @@ else ifneq (,$(findstring unix,$(platform))) EXT_INTER_TARGET := $(TARGET_NAME) INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/rcheevos/include -Ideps/SPIRV-Cross -Ideps/glslang -I. LIBS += -ldl -lm -lpthread -lGL -ludev -lpulse -lX11 -lX11-xcb -lXxf86vm -else ifeq (dos,$(platform)) - HAVE_RPNG := 1 - HAVE_RJPEG := 1 - HAVE_RBMP := 1 - HAVE_RTGA := 1 - HAVE_ZLIB := 1 - HAVE_7ZIP := 1 - HAVE_NETWORKING := 0 - HAVE_NETWORK_CMD := 0 - HAVE_NETPLAYDISCOVERY := 0 - HAVE_OVERLAY := 1 - HAVE_VIDEO_LAYOUT := 0 - HAVE_MATERIALUI := 0 - HAVE_XMB := 0 - HAVE_STB_FONT := 1 - HAVE_THREADS := 0 - HAVE_LIBRETRODB := 1 - HAVE_COMMAND := 1 - HAVE_STDIN_CMD := 1 - HAVE_CMD := 1 - HAVE_DYLIB := 0 - HAVE_DYNAMIC := 0 - HAVE_GRIFFIN_CPP := 0 - WANT_GLSLANG := 0 - HAVE_CONFIGFILE := 1 - HAVE_PATCH := 0 - HAVE_CHEATS := 0 - HAVE_CORE_INFO_CACHE := 1 - CC=i586-pc-msdosdjgpp-gcc - CXX=i586-pc-msdosdjgpp-g++ - - ifeq ($(DEBUG), 1) - LDFLAGS += -g - endif - - PLATCFLAGS += -DHAVE_SHADERPIPELINE -DHAVE_CC_RESAMPLER -DRC_DISABLE_LUA -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_PATCH -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DRARCH_INTERNAL -DHAVE_XCB - TARGET_NAME := retrodos - EXT_TARGET := $(TARGET_NAME).exe - EXT_INTER_TARGET := $(TARGET_NAME).exe - INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/SPIRV-Cross -Ideps/glslang -I. - LIBS += -lm - LIBDIRS += -L. endif ifneq (,$(findstring msvc,$(platform))) diff --git a/frontend/drivers/platform_dos.c b/frontend/drivers/platform_dos.c index f347b99b39..dd195172a4 100644 --- a/frontend/drivers/platform_dos.c +++ b/frontend/drivers/platform_dos.c @@ -23,6 +23,7 @@ #include "../frontend_driver.h" #include "../../defaults.h" #include "../../paths.h" +#include "../command.h" static enum frontend_fork dos_fork_mode = FRONTEND_FORK_NONE; @@ -145,21 +146,21 @@ static void frontend_dos_exitspawn(char *s, size_t len, char *args) frontend_dos_exec(s, should_load_content); } -static bool frontend_unix_set_fork(enum frontend_fork fork_mode) +static bool frontend_dos_set_fork(enum frontend_fork fork_mode) { switch (fork_mode) { case FRONTEND_FORK_CORE: RARCH_LOG("FRONTEND_FORK_CORE\n"); - unix_fork_mode = fork_mode; + dos_fork_mode = fork_mode; break; case FRONTEND_FORK_CORE_WITH_ARGS: RARCH_LOG("FRONTEND_FORK_CORE_WITH_ARGS\n"); - unix_fork_mode = fork_mode; + dos_fork_mode = fork_mode; break; case FRONTEND_FORK_RESTART: RARCH_LOG("FRONTEND_FORK_RESTART\n"); - unix_fork_mode = FRONTEND_FORK_CORE; + dos_fork_mode = FRONTEND_FORK_CORE; { char executable_path[PATH_MAX_LENGTH] = {0}; diff --git a/gfx/drivers/vga_gfx.c b/gfx/drivers/vga_gfx.c index d776b53b52..7dbddd3ce5 100644 --- a/gfx/drivers/vga_gfx.c +++ b/gfx/drivers/vga_gfx.c @@ -199,7 +199,7 @@ static bool vga_gfx_frame(void *data, const void *frame, if (frame_to_copy == vga->vga_menu_frame) dosmemput(frame_to_copy, - MIN(VGA_WIDTH,width)*MIN(VGA_HEIGHT,height), 0xA0000); + VGA_WIDTH*VGA_HEIGHT, 0xA0000); else { if (bits == 32) diff --git a/input/drivers/dos_input.c b/input/drivers/dos_input.c index 3c2c18e0c2..473b54824f 100644 --- a/input/drivers/dos_input.c +++ b/input/drivers/dos_input.c @@ -78,7 +78,7 @@ static int16_t dos_input_state( { if (id < RARCH_BIND_LIST_END) if (dos_key_state[DOS_KEYBOARD_PORT] - [rarch_keysym_lut[binds[i].key]]) + [rarch_keysym_lut[binds[port][i].key]]) ret |= (1 << i); } } @@ -99,7 +99,7 @@ static int16_t dos_input_state( case RETRO_DEVICE_KEYBOARD: if (id < RARCH_BIND_LIST_END) return (dos_key_state[DOS_KEYBOARD_PORT] - [rarch_keysym_lut[binds[id].key]]); + [rarch_keysym_lut[binds[port][id].key]]); break; } diff --git a/input/drivers_joypad/dos_joypad.c b/input/drivers_joypad/dos_joypad.c index 54d4a4396c..ed2372318c 100644 --- a/input/drivers_joypad/dos_joypad.c +++ b/input/drivers_joypad/dos_joypad.c @@ -163,7 +163,7 @@ static void *dos_joypad_init(void *data) static int32_t dos_joypad_button_state( uint16_t *buf, uint16_t joykey) { - switch (key) + switch (joykey) { case RETRO_DEVICE_ID_JOYPAD_A: return buf[DOSKEY_x]; diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index 9bb11a29a3..63f10163c3 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -242,7 +242,7 @@ retro_time_t cpu_features_get_time_usec(void) return (svcGetSystemTick() * 10) / 192; #elif defined(_3DS) return osGetTime() * 1000; -#elif defined(_POSIX_MONOTONIC_CLOCK) || defined(__QNX__) || defined(ANDROID) || defined(__MACH__) || defined(DJGPP) +#elif defined(_POSIX_MONOTONIC_CLOCK) || defined(__QNX__) || defined(ANDROID) || defined(__MACH__) struct timespec tv = {0}; if (ra_clock_gettime(CLOCK_MONOTONIC, &tv) < 0) return 0; @@ -253,6 +253,8 @@ retro_time_t cpu_features_get_time_usec(void) return ps2_clock() / PS2_CLOCKS_PER_MSEC * 1000; #elif defined(VITA) || defined(PSP) return sceKernelGetSystemTimeWide(); +#elif defined(DJGPP) + return uclock() * 1000000LL / UCLOCKS_PER_SEC; #else #error "Your platform does not have a timer function implemented in cpu_features_get_time_usec(). Cannot continue." #endif diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 1e23f02ffd..a2c256a9c7 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -5506,7 +5506,10 @@ static bool rgui_set_aspect_ratio(rgui_t *rgui, unsigned aspect_ratio = settings->uints.menu_rgui_aspect_ratio; unsigned aspect_ratio_lock = settings->uints.menu_rgui_aspect_ratio_lock; #endif - +#ifdef DJGPP + const char *driver_ident = video_driver_get_ident(); +#endif + rgui_framebuffer_free(&rgui->frame_buf); rgui_framebuffer_free(&rgui->background_buf); rgui_thumbnail_free(&rgui->fs_thumbnail); @@ -5639,6 +5642,13 @@ static bool rgui_set_aspect_ratio(rgui_t *rgui, base_term_width = rgui->frame_buf.width; break; } + +#ifdef DJGPP + if (string_is_equal(driver_ident, "vga")) { + rgui->frame_buf.width = 320; + rgui->frame_buf.height = 200; + } +#endif /* Ensure frame buffer/terminal width is sane * - Must be less than max_frame_buf_width