some upstream changes, new and updated cores

This commit is contained in:
Mauro Vietri 2024-05-18 10:55:21 -03:00
parent 5fb1cc8888
commit efe125e3e0
40 changed files with 1922 additions and 225 deletions

View file

@ -37,9 +37,11 @@ on top of MinUI.
- Add to Favorites - Add to Favorites
- Clear "Recently Played" - Clear "Recently Played"
- Battery efficiency improvements - Power saving improvements
- Performance improvements - Performance improvements
- Multi-core CPU support
- Battery reading adjustments - Battery reading adjustments
- Additional emulators (MAME)
- Base and Extras are merged into one Full release - Base and Extras are merged into one Full release
- Native macOS installation instructions - Native macOS installation instructions
- Developer experience improvements - Developer experience improvements
@ -52,14 +54,15 @@ on top of MinUI.
### Build project ### Build project
Run `./start-toolchain.sh` and then `make all` in the Docker container shell. Run `./start-toolchain.sh` and then run `make all` in the Docker container shell.
### TODO ### Debug project
- Improve battery capacity reading accuracy Create a file with the name `enableADB` on the `misc` disk to enable ADB.
- Show battery percentage number overlay
- Change boot logo ### Install release
- [...things in the old todo?...](./todo.txt)
Update `DISK_PATH` and then run `./install-release.sh`.
## Disclaimer ## Disclaimer

View file

@ -1,7 +1,7 @@
# this logic was broken out from picoarch's all-in-one makefile # this logic was broken out from picoarch's all-in-one makefile
CORES = fceumm gambatte gpsp pcsx_rearmed picodrive snes9x2005_plus CORES = fceumm gambatte gpsp pcsx_rearmed picodrive snes9x2005_plus
CORES+= beetle-pce-fast beetle-vb mednafen_supafaust mgba pokemini # extras CORES+= beetle-pce-fast beetle-vb fake-08 mednafen_supafaust mgba pokemini mame2003-plus race # extras
############################### ###############################
@ -19,13 +19,20 @@ beetle-pce-fast_CORE = mednafen_pce_fast_libretro.so
beetle-vb_REPO = https://github.com/libretro/beetle-vb-libretro beetle-vb_REPO = https://github.com/libretro/beetle-vb-libretro
beetle-vb_CORE = mednafen_vb_libretro.so beetle-vb_CORE = mednafen_vb_libretro.so
fake-08_REPO = https://github.com/jtothebell/fake-08
fake-08_CORE = fake08_libretro.so
fake-08_BUILD_PATH = fake-08/platform/libretro
fceumm_REPO = https://github.com/libretro/libretro-fceumm fceumm_REPO = https://github.com/libretro/libretro-fceumm
gambatte_REPO = https://github.com/libretro/gambatte-libretro gambatte_REPO = https://github.com/libretro/gambatte-libretro
gpsp_HASH = 1d1c719 # last known working save states
mednafen_supafaust_REPO = https://github.com/libretro/supafaust mednafen_supafaust_REPO = https://github.com/libretro/supafaust
pcsx_rearmed_MAKEFILE = Makefile.libretro pcsx_rearmed_MAKEFILE = Makefile.libretro
pcsx_rearmed_HASH = 672e715 # e2fb138 # last known working build
picodrive_REPO = https://github.com/irixxxx/picodrive picodrive_REPO = https://github.com/irixxxx/picodrive
picodrive_MAKEFILE = Makefile.libretro picodrive_MAKEFILE = Makefile.libretro
@ -36,6 +43,9 @@ pokemini_MAKEFILE = Makefile.libretro
snes9x2005_plus_REPO = https://github.com/libretro/snes9x2005 snes9x2005_plus_REPO = https://github.com/libretro/snes9x2005
snes9x2005_plus_FLAGS = USE_BLARGG_APU=1 snes9x2005_plus_FLAGS = USE_BLARGG_APU=1
mame2003-plus_REPO = https://github.com/libretro/mame2003-plus-libretro
mame2003-plus_CORE = mame2003_plus_libretro.so
############################### ###############################
PATCH = git apply PATCH = git apply

34
cores/patches/fake-08.patch Executable file
View file

@ -0,0 +1,34 @@
diff --git forkSrcPrefix/platform/libretro/Makefile forkDstPrefix/platform/libretro/Makefile
index be0f1b46bb3ab10be4a9f896f5e8841dd630b35b..cc7a7249135bb690885e7f5fda09f9eb8fdeac22 100644
--- forkSrcPrefix/platform/libretro/Makefile
+++ forkDstPrefix/platform/libretro/Makefile
@@ -123,7 +123,16 @@ else ifeq ($(platform), miyoomini)
CXXFLAGS += -marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7ve -D_NEED_FULL_PATH_
fpic := -fPIC
SHARED := -shared -Wl,--version-script=link.T
-
+else ifeq ($(platform), rg35xx)
+ TARGET := $(TARGET_NAME)_libretro.so
+ CC = $(CROSS_COMPILE)gcc
+ CXX = $(CROSS_COMPILE)g++
+ AR = $(CROSS_COMPILE)ar
+ STRIP = $(CROSS_COMPILE)strip
+ CXXFLAGS += -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a
+ CXXFLAGS += -fomit-frame-pointer -ffast-math -fno-common -ftree-vectorize -funswitch-loops
+ fpic := -fPIC
+ SHARED := -shared -Wl,--version-script=link.T
else ifeq ($(platform), gcw0)
TARGET := $(TARGET_NAME)_libretro_gcw0.so
CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc
diff --git forkSrcPrefix/platform/libretro/libretro.cpp forkDstPrefix/platform/libretro/libretro.cpp
index d95ccb6cab52abfe7620ff84dd5cbb450bafe750..24687335ad410096aa48f29e13dcb479171a06fc 100644
--- forkSrcPrefix/platform/libretro/libretro.cpp
+++ forkDstPrefix/platform/libretro/libretro.cpp
@@ -636,6 +636,7 @@ EXPORT bool retro_load_game(struct retro_game_info const *info)
else {
_vm->QueueCartChange(info->path);
}
+ _vm->UpdateAndDraw();
return true;
}

View file

@ -0,0 +1,35 @@
diff --git a/Makefile b/Makefile
index 21129613..eaf61b92 100644
--- a/Makefile
+++ b/Makefile
@@ -525,6 +525,30 @@ else ifeq ($(platform), miyoo)
PLATCFLAGS += -fomit-frame-pointer -march=armv5te -mtune=arm926ej-s -ffast-math
CXXFLAGS += -fno-rtti -fno-exceptions
+# RG35XX
+else ifeq ($(platform), rg35xx)
+ TARGET := $(TARGET_NAME)_libretro.so
+ CC = $(CROSS_COMPILE)gcc
+ CXX = $(CROSS_COMPILE)g++
+ AR = $(CROSS_COMPILE)ar
+ fpic := -fPIC
+ LDFLAGS += $(fpic) -shared -Wl,--version-script=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-a9 -mfpu=neon-fp16 -mfloat-abi=hard
+ CXXFLAGS += $(CFLAGS)
+ CPPFLAGS += $(CFLAGS)
+ ASFLAGS += $(CFLAGS)
+ HAVE_NEON = 1
+ ARCH = arm
+ CPU_ARCH := arm
+ ARM = 1
+
# Emscripten
else ifeq ($(platform), emscripten)
TARGET := $(TARGET_NAME)_libretro_$(platform).bc

23
cores/patches/race.patch Normal file
View file

@ -0,0 +1,23 @@
diff --git forkSrcPrefix/Makefile forkDstPrefix/Makefile
index 792a6d82915c32edd3df6ceec541499f6ca25ac5..dc02b361d7db47e011b6d3addf89cfb31503575a 100644
--- forkSrcPrefix/Makefile
+++ forkDstPrefix/Makefile
@@ -373,6 +373,18 @@ else ifeq ($(platform), miyoo)
CFLAGS += -fomit-frame-pointer -ffast-math -march=armv5te -mtune=arm926ej-s
CXXFLAGS += $(CFLAGS)
+# RG35XX
+else ifeq ($(platform), rg35xx)
+ TARGET := $(TARGET_NAME)_libretro.so
+ CC = $(CROSS_COMPILE)gcc
+ CXX = $(CROSS_COMPILE)g++
+ AR = $(CROSS_COMPILE)ar
+ fpic := -fPIC
+ SHARED := -shared -Wl,-version-script=$(LIBRETRO_DIR)/link.T
+ PLATFORM_DEFINES := -DCC_RESAMPLER -DCC_RESAMPLER_NO_HIGHPASS
+ CFLAGS += -fomit-frame-pointer -ffast-math -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a
+ CXXFLAGS += $(CFLAGS)
+
# Windows MSVC 2010 x64
else ifeq ($(platform), windows_msvc2010_x64)
CC = cl.exe

47
install-release.sh Executable file
View file

@ -0,0 +1,47 @@
#!/bin/bash
set -euo pipefail
DISK_PATH="/dev/disk2"
FIRMWARE_NAME="35XX-64GB230309EN.IMG"
RELEASE_NAME="FinUI-*-0-full.zip"
WORKING_DIRECTORY="./releases/"
echo "[*] PREPARING INSTALLATION"
cd $WORKING_DIRECTORY
echo
echo "[*] INSTALLING FIRMWARE"
diskutil unmountDisk $DISK_PATH
sleep 3
sudo dd bs=1m if=$FIRMWARE_NAME of=$DISK_PATH
sleep 3
sudo diskutil eraseVolume FAT32 ROMS ${DISK_PATH}s4
sleep 3
echo
echo "[*] INSTALLING FinUI"
unzip -o ${RELEASE_NAME[0]}
cp -R dmenu.bin /Volumes/misc/
cp -R MinUI.zip /Volumes/ROMS/
cp -R Bios/ /Volumes/ROMS/Bios
cp -R Emus/ /Volumes/ROMS/Emus
cp -R Roms/ /Volumes/ROMS/Roms
cp -R Saves/ /Volumes/ROMS/Saves
cp -R Tools/ /Volumes/ROMS/Tools
echo
echo "[*] CLEANING FILES"
dot_clean -m /Volumes/misc
rm -fr /Volumes/misc/.fseventsd /Volumes/misc/.Spotlight-V100 /Volumes/misc/.Trashes /Volumes/misc/._.Trashes
mkdir /Volumes/misc/.fseventsd
touch /Volumes/misc/.fseventsd/no_log /Volumes/misc/.metadata_never_index /Volumes/misc/.Trashes
dot_clean -m /Volumes/ROMS
rm -fr /Volumes/ROMS/.fseventsd /Volumes/ROMS/.Spotlight-V100 /Volumes/ROMS/.Trashes /Volumes/ROMS/._.Trashes
mkdir /Volumes/ROMS/.fseventsd
touch /Volumes/ROMS/.fseventsd/no_log /Volumes/ROMS/.metadata_never_index /Volumes/ROMS/.Trashes
echo

View file

@ -14,7 +14,7 @@ endif
BUILD_HASH!=git rev-parse --short HEAD BUILD_HASH!=git rev-parse --short HEAD
RELEASE_TIME!=date +%Y%m%d RELEASE_TIME!=TZ=GMT date +%Y%m%d
RELEASE_BASE=FinUI-$(RELEASE_TIME)b RELEASE_BASE=FinUI-$(RELEASE_TIME)b
RELEASE_DOT!=find ./releases/. -regex ".*/$(RELEASE_BASE)-[0-9]+-base\.zip" -printf '.' | wc -m RELEASE_DOT!=find ./releases/. -regex ".*/$(RELEASE_BASE)-[0-9]+-base\.zip" -printf '.' | wc -m
RELEASE_NAME=$(RELEASE_BASE)-$(RELEASE_DOT) RELEASE_NAME=$(RELEASE_BASE)-$(RELEASE_DOT)
@ -26,7 +26,7 @@ endif
# TODO: this needs to consider the different platforms, eg. rootfs.ext2 should only be copied in rg35xx-toolchain # TODO: this needs to consider the different platforms, eg. rootfs.ext2 should only be copied in rg35xx-toolchain
all: lib sys all-cores tools bundle readmes zip report all: lib sys all-cores tools dtb bundle readmes zip report
repack: bundle readmes zip report repack: bundle readmes zip report
@ -49,6 +49,9 @@ tools:
cd ./src/toggle_adb && make cd ./src/toggle_adb && make
cd ./other/DinguxCommander && make -j cd ./other/DinguxCommander && make -j
dtb:
cd ./src/dts/ && make
bundle: bundle:
# ready build # ready build
rm -rf ./build rm -rf ./build
@ -68,6 +71,9 @@ bundle:
# populate system # populate system
cp ~/buildroot/output/images/rootfs.ext2 ./build/SYSTEM/rg35xx cp ~/buildroot/output/images/rootfs.ext2 ./build/SYSTEM/rg35xx
cp ./src/dts/kernel.dtb ./build/SYSTEM/rg35xx/dat
cp ./src/ramdisk/patched-ramdisk.img ./build/SYSTEM/rg35xx/dat/ramdisk.img
cp ./src/ramdisk/charging.png ./build/SYSTEM/rg35xx/dat/
cp ./src/libmsettings/libmsettings.so ./build/SYSTEM/rg35xx/lib cp ./src/libmsettings/libmsettings.so ./build/SYSTEM/rg35xx/lib
cp ./src/keymon/keymon.elf ./build/SYSTEM/rg35xx/bin cp ./src/keymon/keymon.elf ./build/SYSTEM/rg35xx/bin
cp ./src/minarch/minarch.elf ./build/SYSTEM/rg35xx/bin cp ./src/minarch/minarch.elf ./build/SYSTEM/rg35xx/bin
@ -86,12 +92,16 @@ bundle:
cp ./cores/output/snes9x2005_plus_libretro.so ./build/SYSTEM/rg35xx/cores cp ./cores/output/snes9x2005_plus_libretro.so ./build/SYSTEM/rg35xx/cores
# extras # extras
cp ./cores/output/mame2003_plus_libretro.so ./build/EXTRAS/Emus/rg35xx/MAME.pak
cp ./cores/output/fake08_libretro.so ./build/EXTRAS/Emus/rg35xx/P8.pak
cp ./cores/output/mgba_libretro.so ./build/EXTRAS/Emus/rg35xx/MGBA.pak cp ./cores/output/mgba_libretro.so ./build/EXTRAS/Emus/rg35xx/MGBA.pak
cp ./cores/output/mgba_libretro.so ./build/EXTRAS/Emus/rg35xx/SGB.pak cp ./cores/output/mgba_libretro.so ./build/EXTRAS/Emus/rg35xx/SGB.pak
cp ./cores/output/mednafen_pce_fast_libretro.so ./build/EXTRAS/Emus/rg35xx/PCE.pak cp ./cores/output/mednafen_pce_fast_libretro.so ./build/EXTRAS/Emus/rg35xx/PCE.pak
cp ./cores/output/mednafen_supafaust_libretro.so ./build/EXTRAS/Emus/rg35xx/SUPA.pak cp ./cores/output/mednafen_supafaust_libretro.so ./build/EXTRAS/Emus/rg35xx/SUPA.pak
cp ./cores/output/mednafen_vb_libretro.so ./build/EXTRAS/Emus/rg35xx/VB.pak cp ./cores/output/mednafen_vb_libretro.so ./build/EXTRAS/Emus/rg35xx/VB.pak
cp ./cores/output/pokemini_libretro.so ./build/EXTRAS/Emus/rg35xx/PKM.pak cp ./cores/output/pokemini_libretro.so ./build/EXTRAS/Emus/rg35xx/PKM.pak
cp ./cores/output/race_libretro.so ./build/EXTRAS/Emus/rg35xx/NGP.pak
cp ./cores/output/race_libretro.so ./build/EXTRAS/Emus/rg35xx/NGPC.pak
cp ./other/DinguxCommander/output/DinguxCommander ./build/EXTRAS/Tools/rg35xx/Files.pak cp ./other/DinguxCommander/output/DinguxCommander ./build/EXTRAS/Tools/rg35xx/Files.pak
cp -R ./other/DinguxCommander/res ./build/EXTRAS/Tools/rg35xx/Files.pak/ cp -R ./other/DinguxCommander/res ./build/EXTRAS/Tools/rg35xx/Files.pak/

View file

@ -0,0 +1,26 @@
minarch_cpu_speed = Performance
minarch_prevent_tearing = Off
mame2003-plus_skip_disclaimer = enabled
mame2003-plus_skip_warnings = enabled
-mame2003-plus_display_setup = disabled
-mame2003-plus_input_interface = retropad
-mame2003-plus_tate_mode = disabled
-mame2003-plus_xy_device = disabled
-mame2003-plus_display_artwork = disabled
-mame2003-plus_tate_mode = disabled
bind Up = UP
bind Down = DOWN
bind Left = LEFT
bind Right = RIGHT
bind Select = SELECT
bind Start = START
bind X Button = X
bind Y Button = Y
bind B Button = B
bind A Button = A
bind L1 Button = L1
bind L2 Button = L2
bind R1 Button = R1
bind R2 Button = R2

View file

@ -0,0 +1,14 @@
#!/bin/sh
EMU_EXE=mame2003_plus
CORES_PATH=$(dirname "$0")
###############################
EMU_TAG=$(basename "$(dirname "$0")" .pak)
ROM="$1"
mkdir -p "$BIOS_PATH/$EMU_TAG"
mkdir -p "$SAVES_PATH/$EMU_TAG"
HOME="$USERDATA_PATH"
cd "$HOME"
minarch.elf "$CORES_PATH/${EMU_EXE}_libretro.so" "$ROM" DMG &> "$LOGS_PATH/$EMU_TAG.txt"

View file

@ -0,0 +1,9 @@
race_dark_filter_level = 50
bind Up = UP
bind Down = DOWN
bind Left = LEFT
bind Right = RIGHT
bind A Button = B
bind B Button = A
bind Option = START

View file

@ -0,0 +1,14 @@
#!/bin/sh
EMU_EXE=race
CORES_PATH=$(dirname "$0")
###############################
EMU_TAG=$(basename "$(dirname "$0")" .pak)
ROM="$1"
mkdir -p "$BIOS_PATH/$EMU_TAG"
mkdir -p "$SAVES_PATH/$EMU_TAG"
HOME="$USERDATA_PATH"
cd "$HOME"
minarch.elf "$CORES_PATH/${EMU_EXE}_libretro.so" "$ROM" &> "$LOGS_PATH/$EMU_TAG.txt"

View file

@ -0,0 +1,8 @@
bind Up = UP
bind Down = DOWN
bind Left = LEFT
bind Right = RIGHT
bind A Button = B
bind B Button = A
bind Option = START

View file

@ -0,0 +1,14 @@
#!/bin/sh
EMU_EXE=race
CORES_PATH=$(dirname "$0")
###############################
EMU_TAG=$(basename "$(dirname "$0")" .pak)
ROM="$1"
mkdir -p "$BIOS_PATH/$EMU_TAG"
mkdir -p "$SAVES_PATH/$EMU_TAG"
HOME="$USERDATA_PATH"
cd "$HOME"
minarch.elf "$CORES_PATH/${EMU_EXE}_libretro.so" "$ROM" &> "$LOGS_PATH/$EMU_TAG.txt"

View file

@ -0,0 +1,7 @@
bind Up = UP
bind Down = DOWN
bind Left = LEFT
bind Right = RIGHT
bind A Button = A
bind B Button = B
bind Start = START

View file

@ -0,0 +1,14 @@
#!/bin/sh
EMU_EXE=fake08
CORES_PATH=$(dirname "$0")
###############################
EMU_TAG=$(basename "$(dirname "$0")" .pak)
ROM="$1"
mkdir -p "$BIOS_PATH/$EMU_TAG"
mkdir -p "$SAVES_PATH/$EMU_TAG"
HOME="$USERDATA_PATH"
cd "$HOME"
minarch.elf "$CORES_PATH/${EMU_EXE}_libretro.so" "$ROM" &> "$LOGS_PATH/$EMU_TAG.txt"

View file

View file

View file

View file

@ -6,8 +6,8 @@ TARGET = clear_recent
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer
CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" -Ofast
LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread -lm -lz
all: all:
$(CC) $(TARGET).c ../common/utils.c ../common/api.c -o $(TARGET).elf $(CFLAGS) $(LDFLAGS) $(CC) $(TARGET).c ../common/utils.c ../common/api.c -o $(TARGET).elf $(CFLAGS) $(LDFLAGS)

View file

@ -6,8 +6,8 @@ TARGET = clock
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer
CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" -Ofast
LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread -lm -lz
all: all:
$(CC) $(TARGET).c ../common/utils.c ../common/api.c -o $(TARGET).elf $(CFLAGS) $(LDFLAGS) $(CC) $(TARGET).c ../common/utils.c ../common/api.c -o $(TARGET).elf $(CFLAGS) $(LDFLAGS)

View file

@ -90,6 +90,7 @@ static void ion_alloc(int fd_ion, ion_alloc_info_t* info) {
static void ion_free(int fd_ion, ion_alloc_info_t* info) { static void ion_free(int fd_ion, ion_alloc_info_t* info) {
struct ion_handle_data ihd; struct ion_handle_data ihd;
munmap(info->vadd, info->size); munmap(info->vadd, info->size);
close(info->fd);
ihd.handle = (uintptr_t)info->handle; ihd.handle = (uintptr_t)info->handle;
if (ioctl(fd_ion, ION_IOC_FREE, &ihd)<0) fprintf(stderr, "ION_FREE failed %s\n",strerror(errno)); if (ioctl(fd_ion, ION_IOC_FREE, &ihd)<0) fprintf(stderr, "ION_FREE failed %s\n",strerror(errno));
fflush(stdout); fflush(stdout);
@ -442,6 +443,11 @@ SDL_Surface* GFX_init(int mode) {
font.small = TTF_OpenFont(FONT_PATH, SCALE1(FONT_SMALL)); font.small = TTF_OpenFont(FONT_PATH, SCALE1(FONT_SMALL));
font.tiny = TTF_OpenFont(FONT_PATH, SCALE1(FONT_TINY)); font.tiny = TTF_OpenFont(FONT_PATH, SCALE1(FONT_TINY));
TTF_SetFontStyle(font.large, TTF_STYLE_BOLD);
TTF_SetFontStyle(font.medium, TTF_STYLE_BOLD);
TTF_SetFontStyle(font.small, TTF_STYLE_BOLD);
TTF_SetFontStyle(font.tiny, TTF_STYLE_BOLD);
return gfx.screen; return gfx.screen;
} }
@ -688,7 +694,7 @@ void GFX_blitRect(int asset, SDL_Surface* dst, SDL_Rect* dst_rect) {
SDL_FillRect(dst, &(SDL_Rect){x+r,y+h-r,w-d,r}, c); SDL_FillRect(dst, &(SDL_Rect){x+r,y+h-r,w-d,r}, c);
GFX_blitAsset(asset, &(SDL_Rect){r,r,r,r}, dst, &(SDL_Rect){x+w-r,y+h-r}); GFX_blitAsset(asset, &(SDL_Rect){r,r,r,r}, dst, &(SDL_Rect){x+w-r,y+h-r});
} }
void GFX_blitClockAndBattery(SDL_Surface* dst, SDL_Rect* dst_rect) { void GFX_blitBattery(SDL_Surface* dst, SDL_Rect* dst_rect) {
// LOG_info("dst: %p\n", dst); // LOG_info("dst: %p\n", dst);
if (!dst_rect) dst_rect = &(SDL_Rect){0,0,0,0}; if (!dst_rect) dst_rect = &(SDL_Rect){0,0,0,0};
@ -717,19 +723,6 @@ void GFX_blitClockAndBattery(SDL_Surface* dst, SDL_Rect* dst_rect) {
GFX_blitAsset(percent<=20?ASSET_BATTERY_FILL_LOW:ASSET_BATTERY_FILL, &clip, dst, &(SDL_Rect){x+SCALE1(3)+clip.x,y+SCALE1(2)}); GFX_blitAsset(percent<=20?ASSET_BATTERY_FILL_LOW:ASSET_BATTERY_FILL, &clip, dst, &(SDL_Rect){x+SCALE1(3)+clip.x,y+SCALE1(2)});
} }
// Get the current time
time_t currentTime = time(NULL);
struct tm* timeinfo = localtime(&currentTime);
int hours = timeinfo->tm_hour;
int minutes = timeinfo->tm_min;
// Convert hours and minutes to strings
char timeStr[6];
snprintf(timeStr, sizeof(timeStr), "%02d:%02d", hours, minutes);
SDL_Surface* text = TTF_RenderUTF8_Blended(font.large, timeStr, COLOR_WHITE);
SDL_BlitSurface(text, NULL, dst, &(SDL_Rect){dst_rect->x - text->w - 20, dst_rect->y + (SCALE1(PILL_SIZE) - text->h) / 2});
SDL_FreeSurface(text);
} }
int GFX_getButtonWidth(char* hint, char* button) { int GFX_getButtonWidth(char* hint, char* button) {
int button_width = 0; int button_width = 0;
@ -896,7 +889,7 @@ int GFX_blitHardwareGroup(SDL_Surface* dst, int show_setting) {
ow, ow,
SCALE1(PILL_SIZE) SCALE1(PILL_SIZE)
}); });
GFX_blitClockAndBattery(dst, &(SDL_Rect){ox,oy}); GFX_blitBattery(dst, &(SDL_Rect){ox,oy});
} }
return ow; return ow;
@ -1355,7 +1348,7 @@ static void POW_initOverlay(void) {
SDL_SetAlpha(gfx.assets, 0,0); SDL_SetAlpha(gfx.assets, 0,0);
GFX_blitAsset(ASSET_BLACK_PILL, NULL, pow.overlay, NULL); GFX_blitAsset(ASSET_BLACK_PILL, NULL, pow.overlay, NULL);
SDL_SetAlpha(gfx.assets, SDL_SRCALPHA,0); SDL_SetAlpha(gfx.assets, SDL_SRCALPHA,0);
GFX_blitClockAndBattery(pow.overlay, NULL); GFX_blitBattery(pow.overlay, NULL);
// setup overlay // setup overlay
memset(&pow.oargs, 0, sizeof(struct owlfb_overlay_args)); memset(&pow.oargs, 0, sizeof(struct owlfb_overlay_args));
@ -1401,26 +1394,12 @@ static void POW_quitOverlay(void) {
ioctl(gfx.fd_fb, OWLFB_OVERLAY_DISABLE, &pow.oargs); ioctl(gfx.fd_fb, OWLFB_OVERLAY_DISABLE, &pow.oargs);
} }
static int POW_readBatteryStatus(void) { int POW_readBatteryStatus(void) {
#define BATTERY_2100MAH 1 #define READ_VOLTAGE 1
#define BATTERY_2600MAH 2
#define BATTERY_3500MAH 3
#define UNKNOWN 9
int battery = BATTERY_2600MAH; // Default
int battery_txt = getInt(BATTERY_PATH);
if (battery_txt > 0) {
battery = battery_txt;
}
if (READ_VOLTAGE > 0) {
int voltage_now = getInt("/sys/class/power_supply/battery/voltage_now"); int voltage_now = getInt("/sys/class/power_supply/battery/voltage_now");
if (battery == BATTERY_2100MAH) {
return ((voltage_now / 10000) - 310); // 310-410 return ((voltage_now / 10000) - 310); // 310-410
} else if (battery == BATTERY_2600MAH) {
return ((voltage_now / 10000) - 308); // 308-414? Seems incorrect...
} else if (battery == BATTERY_3500MAH) {
// ???-???
} }
// Fallback // Fallback
@ -1560,8 +1539,11 @@ void POW_update(int* _dirty, int* _show_setting, POW_callback_t before_sleep, PO
void POW_disablePowerOff(void) { void POW_disablePowerOff(void) {
pow.can_poweroff = 0; pow.can_poweroff = 0;
} }
void POW_sync(char* msg) { void POW_powerOff(void) {
GFX_clear(gfx.screen); if (pow.can_poweroff) {
GFX_resize(FIXED_WIDTH,FIXED_HEIGHT,FIXED_PITCH);
char* msg = exists(AUTO_RESUME_PATH) ? "Quicksave created,\npowering off" : "Powering off";
GFX_blitMessage(font.large, msg, gfx.screen, NULL); GFX_blitMessage(font.large, msg, gfx.screen, NULL);
GFX_flip(gfx.screen); GFX_flip(gfx.screen);
@ -1571,11 +1553,6 @@ void POW_sync(char* msg) {
system("sync"); system("sync");
sleep(2); sleep(2);
}
void POW_powerOff(void) {
if (pow.can_poweroff) {
char* msg = exists(AUTO_RESUME_PATH) ? "Quicksave created,\npowering off" : "Powering off";
POW_sync(msg);
// actual shutdown // actual shutdown
system("echo o > /proc/sysrq-trigger"); system("echo o > /proc/sysrq-trigger");
@ -1583,12 +1560,11 @@ void POW_powerOff(void) {
} }
void POW_reboot(void) { void POW_reboot(void) {
char* msg = "Rebooting"; char* msg = "Rebooting";
POW_sync(msg);
// trigger reboot system("sync");
system("echo b > /proc/sysrq-trigger"); system("echo b > /proc/sysrq-trigger");
system("sync");
} }
#define BACKLIGHT_PATH "/sys/class/backlight/backlight.2/bl_power" #define BACKLIGHT_PATH "/sys/class/backlight/backlight.2/bl_power"
void POW_setCPUSpeed(int speed) { void POW_setCPUSpeed(int speed) {

View file

@ -59,7 +59,6 @@
#define FAVORITE_PATH USERDATA_PATH "/.minui/favorite.txt" #define FAVORITE_PATH USERDATA_PATH "/.minui/favorite.txt"
#define FAUX_FAVORITE_PATH SDCARD_PATH "/Favorites" #define FAUX_FAVORITE_PATH SDCARD_PATH "/Favorites"
#define COLLECTIONS_PATH SDCARD_PATH "/Collections" #define COLLECTIONS_PATH SDCARD_PATH "/Collections"
#define BATTERY_PATH SDCARD_PATH "/battery.txt"
#define ADB_FLAG_PATH SDCARD_PATH "/enableADB" #define ADB_FLAG_PATH SDCARD_PATH "/enableADB"
#define ALIASES_PATH SDCARD_PATH "/Roms/aliases.txt" #define ALIASES_PATH SDCARD_PATH "/Roms/aliases.txt"

1463
src/dts/kernel.dts Normal file

File diff suppressed because it is too large Load diff

4
src/dts/makefile Executable file
View file

@ -0,0 +1,4 @@
all:
dtc -O dtb -o kernel.dtb kernel.dts
clean:
rm -f kernel.dtb

View file

@ -14,6 +14,8 @@ if [ ! -f $FLAG_PATH ]; then
BAK_PATH=$TF1_PATH/bak BAK_PATH=$TF1_PATH/bak
mkdir -p $BAK_PATH mkdir -p $BAK_PATH
cp /misc/boot_logo.bmp.gz $BAK_PATH cp /misc/boot_logo.bmp.gz $BAK_PATH
cp /misc/kernel.dtb $BAK_PATH
cp /misc/ramdisk.img $BAK_PATH
fi fi
was_updated() { was_updated() {
@ -27,6 +29,11 @@ was_updated() {
continue continue
fi fi
if [[ "$A_NAME" == "charging.png" ]]; then
# we don't care if the user has changed their charging image
continue
fi
if [ ! -f "$B_PATH" ]; then if [ ! -f "$B_PATH" ]; then
continue continue
fi fi
@ -46,9 +53,13 @@ if [ ! -f $FLAG_PATH ] || was_updated; then
echo "updating misc partition" echo "updating misc partition"
mount -o remount,rw /dev/block/actb /misc mount -o remount,rw /dev/block/actb /misc
cp $SYSTEM_PATH/dat/dmenu.bin /misc cp $SYSTEM_PATH/dat/dmenu.bin /misc
cp $SYSTEM_PATH/dat/kernel.dtb /misc
cp $SYSTEM_PATH/dat/ramdisk.img /misc
# graphics are only installed, never updated
if [ ! -f $FLAG_PATH ]; then if [ ! -f $FLAG_PATH ]; then
# only replace boot logo on install not update!
cp $SYSTEM_PATH/dat/boot_logo.bmp.gz /misc cp $SYSTEM_PATH/dat/boot_logo.bmp.gz /misc
cp $SYSTEM_PATH/dat/charging.png /misc
fi fi
touch $FLAG_PATH touch $FLAG_PATH
sync && reboot sync && reboot

View file

@ -25,8 +25,8 @@ typedef struct Settings {
} Settings; } Settings;
static Settings DefaultSettings = { static Settings DefaultSettings = {
.version = SETTINGS_VERSION, .version = SETTINGS_VERSION,
.brightness = 2, .brightness = 4,
.headphones = 4, .headphones = 8,
.speaker = 8, .speaker = 8,
.jack = 0, .jack = 0,
}; };
@ -47,12 +47,12 @@ void InitSettings(void) {
shm_fd = shm_open(SHM_KEY, O_RDWR | O_CREAT | O_EXCL, 0644); // see if it exists shm_fd = shm_open(SHM_KEY, O_RDWR | O_CREAT | O_EXCL, 0644); // see if it exists
if (shm_fd==-1 && errno==EEXIST) { // already exists if (shm_fd==-1 && errno==EEXIST) { // already exists
puts("Settings client"); // puts("Settings client");
shm_fd = shm_open(SHM_KEY, O_RDWR, 0644); shm_fd = shm_open(SHM_KEY, O_RDWR, 0644);
settings = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); settings = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
} }
else { // host else { // host
puts("Settings host"); // keymon // puts("Settings host"); // keymon
is_host = 1; is_host = 1;
// we created it so set initial size and populate // we created it so set initial size and populate
ftruncate(shm_fd, shm_size); ftruncate(shm_fd, shm_size);
@ -72,7 +72,7 @@ void InitSettings(void) {
// these shouldn't be persisted // these shouldn't be persisted
// settings->jack = 0; // settings->jack = 0;
} }
printf("brightness: %i\nspeaker: %i \n", settings->brightness, settings->speaker); printf("brightness: %i\nspeaker: %i \nheadphones: %i \n", settings->brightness, settings->speaker, settings->headphones);
SetVolume(GetVolume()); SetVolume(GetVolume());
SetBrightness(GetBrightness()); SetBrightness(GetBrightness());

View file

@ -6,8 +6,9 @@ TARGET = minarch
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
CFLAGS = -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer CFLAGS = -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer
CFLAGS += -I. -I../common -I./libretro-common/include -DPLATFORM=\"$(UNION_PLATFORM)\" -Ofast CFLAGS += -I. -I../common -I./libretro-common/include -DPLATFORM=\"$(UNION_PLATFORM)\" -Ofast -std=gnu99
LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread -lz CFLAGS += -Os -flto
LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread -lm -lz
# CFLAGS += -Wall -Wno-unused-variable -Wno-unused-function -Wno-format-overflow # CFLAGS += -Wall -Wno-unused-variable -Wno-unused-function -Wno-format-overflow
# CFLAGS += -fsanitize=address -fno-common # CFLAGS += -fsanitize=address -fno-common
# LDFLAGS += -lasan # LDFLAGS += -lasan

View file

@ -47,7 +47,6 @@ enum {
// default frontend options // default frontend options
static int screen_scaling = SCALE_ASPECT; // aspect static int screen_scaling = SCALE_ASPECT; // aspect
static int show_scanlines = 0; static int show_scanlines = 0;
static int optimize_text = 0;
static int prevent_tearing = 1; // lenient static int prevent_tearing = 1; // lenient
static int show_debug = 0; static int show_debug = 0;
static int max_ff_speed = 3; // 4x static int max_ff_speed = 3; // 4x
@ -435,6 +434,55 @@ static void SRAM_write(void) {
/////////////////////////////////////// ///////////////////////////////////////
static void RTC_getPath(char* filename) {
sprintf(filename, "%s/%s.rtc", core.saves_dir, game.name);
}
static void RTC_read(void) {
size_t rtc_size = core.get_memory_size(RETRO_MEMORY_RTC);
if (!rtc_size) return;
char filename[MAX_PATH];
RTC_getPath(filename);
printf("rtc path (read): %s\n", filename);
FILE *rtc_file = fopen(filename, "r");
if (!rtc_file) return;
void* rtc = core.get_memory_data(RETRO_MEMORY_RTC);
if (!rtc || !fread(rtc, 1, rtc_size, rtc_file)) {
LOG_error("Error reading RTC data\n");
}
fclose(rtc_file);
}
static void RTC_write(void) {
size_t rtc_size = core.get_memory_size(RETRO_MEMORY_RTC);
if (!rtc_size) return;
char filename[MAX_PATH];
RTC_getPath(filename);
printf("rtc path (write) size(%u): %s\n", rtc_size, filename);
FILE *rtc_file = fopen(filename, "w");
if (!rtc_file) {
LOG_error("Error opening RTC file: %s\n", strerror(errno));
return;
}
void *rtc = core.get_memory_data(RETRO_MEMORY_RTC);
if (!rtc || rtc_size != fwrite(rtc, 1, rtc_size, rtc_file)) {
LOG_error("Error writing RTC data to file\n");
}
fclose(rtc_file);
sync();
}
///////////////////////////////////////
static void Downsample(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) { static void Downsample(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) {
uint32_t ox = 0; uint32_t ox = 0;
uint32_t oy = 0; uint32_t oy = 0;
@ -461,6 +509,9 @@ static void State_read(void) { // from picoarch
size_t state_size = core.serialize_size(); size_t state_size = core.serialize_size();
if (!state_size) return; if (!state_size) return;
int was_ff = fast_forward;
fast_forward = 0;
void *state = calloc(1, state_size); void *state = calloc(1, state_size);
if (!state) { if (!state) {
LOG_error("Couldn't allocate memory for state\n"); LOG_error("Couldn't allocate memory for state\n");
@ -478,7 +529,9 @@ static void State_read(void) { // from picoarch
goto error; goto error;
} }
if (state_size != fread(state, 1, state_size, state_file)) { // some cores report the wrong serialize size initially for some games, eg. mgba: Wario Land 4
// so we allow a size mismatch as long as the actual size fits in the buffer we've allocated
if (state_size < fread(state, 1, state_size, state_file)) {
LOG_error("Error reading state data from file: %s (%s)\n", filename, strerror(errno)); LOG_error("Error reading state data from file: %s (%s)\n", filename, strerror(errno));
goto error; goto error;
} }
@ -491,11 +544,16 @@ static void State_read(void) { // from picoarch
error: error:
if (state) free(state); if (state) free(state);
if (state_file) fclose(state_file); if (state_file) fclose(state_file);
fast_forward = was_ff;
} }
static void State_write(void) { // from picoarch static void State_write(void) { // from picoarch
size_t state_size = core.serialize_size(); size_t state_size = core.serialize_size();
if (!state_size) return; if (!state_size) return;
int was_ff = fast_forward;
fast_forward = 0;
void *state = calloc(1, state_size); void *state = calloc(1, state_size);
if (!state) { if (!state) {
LOG_error("Couldn't allocate memory for state\n"); LOG_error("Couldn't allocate memory for state\n");
@ -526,6 +584,8 @@ error:
if (state_file) fclose(state_file); if (state_file) fclose(state_file);
sync(); sync();
fast_forward = was_ff;
} }
static void State_autosave(void) { static void State_autosave(void) {
int last_state_slot = state_slot; int last_state_slot = state_slot;
@ -610,7 +670,6 @@ static char* max_ff_labels[] = {
enum { enum {
FE_OPT_SCALING, FE_OPT_SCALING,
FE_OPT_SCANLINES, FE_OPT_SCANLINES,
FE_OPT_TEXT,
FE_OPT_TEARING, FE_OPT_TEARING,
FE_OPT_OVERCLOCK, FE_OPT_OVERCLOCK,
FE_OPT_DEBUG, FE_OPT_DEBUG,
@ -797,16 +856,6 @@ static struct Config {
.values = onoff_labels, .values = onoff_labels,
.labels = onoff_labels, .labels = onoff_labels,
}, },
[FE_OPT_TEXT] = {
.key = "minarch_optimize_text",
.name = "Optimize Text",
.desc = "Prioritize a consistent stroke width when upscaling single\npixel lines using nearest neighbor scaler. Increases CPU load.\nOnly applies to native scaling.",
.default_value = 0,
.value = 0,
.count = 2,
.values = onoff_labels,
.labels = onoff_labels,
},
[FE_OPT_TEARING] = { [FE_OPT_TEARING] = {
.key = "minarch_prevent_tearing", .key = "minarch_prevent_tearing",
.name = "Prevent Tearing", .name = "Prevent Tearing",
@ -900,7 +949,6 @@ static void Config_syncFrontend(int i, int value) {
switch (i) { switch (i) {
case FE_OPT_SCALING: screen_scaling = value; renderer.src_w = 0; break; case FE_OPT_SCALING: screen_scaling = value; renderer.src_w = 0; break;
case FE_OPT_SCANLINES: show_scanlines = value; renderer.src_w = 0; break; case FE_OPT_SCANLINES: show_scanlines = value; renderer.src_w = 0; break;
case FE_OPT_TEXT: optimize_text = value; renderer.src_w = 0; break;
case FE_OPT_TEARING: prevent_tearing = value; break; case FE_OPT_TEARING: prevent_tearing = value; break;
case FE_OPT_OVERCLOCK: overclock = value; break; case FE_OPT_OVERCLOCK: overclock = value; break;
case FE_OPT_DEBUG: show_debug = value; break; case FE_OPT_DEBUG: show_debug = value; break;
@ -2355,125 +2403,6 @@ static void scaleNN_scanline(void* __restrict src, void* __restrict dst, uint32_
row += 1; row += 1;
} }
} }
static void scaleNN_text(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) {
int dy = -renderer.dst_h;
unsigned lines = h;
bool copy = false;
size_t cpy_w = renderer.dst_w * FIXED_BPP;
int screen_p = screen->pitch;
int safe = w - 1; // don't look behind when there's nothing to see
uint16_t l1,l2;
while (lines) {
int dx = -renderer.dst_w;
const uint16_t *psrc16 = src;
uint16_t *pdst16 = dst;
l1 = l2 = 0x0;
if (copy) {
copy = false;
memcpy(dst, dst - screen_p, cpy_w);
dst += screen_p;
dy += h;
} else if (dy < 0) {
int col = w;
while(col--) {
int d = 0;
if (col<safe && l1!=l2) {
// https://stackoverflow.com/a/71086522/145965
uint16_t r = (l1 >> 10) & 0x3E;
uint16_t g = (l1 >> 5) & 0x3F;
uint16_t b = (l1 << 1) & 0x3E;
uint16_t luma = (r * 218) + (g * 732) + (b * 74);
luma = (luma >> 10) + ((luma >> 9) & 1); // 0-63
d = luma > 24;
}
uint16_t s = *psrc16;
while (dx < 0) {
*pdst16++ = d ? l1 : s;
dx += w;
l2 = l1;
l1 = s;
d = 0;
}
dx -= renderer.dst_w;
psrc16++;
}
dst += screen_p;
dy += h;
}
if (dy >= 0) {
dy -= renderer.dst_h;
src += pitch;
lines--;
} else {
copy = true;
}
}
}
static void scaleNN_text_scanline(void* __restrict src, void* __restrict dst, uint32_t w, uint32_t h, uint32_t pitch, uint32_t dst_pitch) {
int dy = -renderer.dst_h;
unsigned lines = h;
int row = 0;
int safe = w - 1; // don't look behind when there's nothing to see
uint16_t l1,l2;
while (lines) {
int dx = -renderer.dst_w;
const uint16_t *psrc16 = src;
uint16_t *pdst16 = dst;
l1 = l2 = 0x0;
if (row%2==0) {
int col = w;
while(col--) {
int d = 0;
if (col<safe && l1!=l2) {
// https://stackoverflow.com/a/71086522/145965
uint16_t r = (l1 >> 10) & 0x3E;
uint16_t g = (l1 >> 5) & 0x3F;
uint16_t b = (l1 << 1) & 0x3E;
uint16_t luma = (r * 218) + (g * 732) + (b * 74);
luma = (luma >> 10) + ((luma >> 9) & 1); // 0-63
d = luma > 24;
}
uint16_t s = *psrc16;
while (dx < 0) {
*pdst16 = *(pdst16 + dst_pitch) = d ? l1 : s;
pdst16 += 1;
dx += w;
l2 = l1;
l1 = s;
d = 0;
}
dx -= renderer.dst_w;
psrc16 += 1;
}
}
dst += dst_pitch;
dy += h;
if (dy >= 0) {
dy -= renderer.dst_h;
src += pitch;
lines--;
}
row += 1;
}
}
static SDL_Surface* scaler_surface; static SDL_Surface* scaler_surface;
static void selectScaler_PAR(int width, int height, int pitch) { static void selectScaler_PAR(int width, int height, int pitch) {
@ -2588,8 +2517,8 @@ static void selectScaler_PAR(int width, int height, int pitch) {
renderer.dst_offset = (oy * device_pitch) + (ox * FIXED_BPP); renderer.dst_offset = (oy * device_pitch) + (ox * FIXED_BPP);
if (use_nearest) if (use_nearest)
if (show_scanlines) renderer.scaler = optimize_text ? scaleNN_text_scanline : scaleNN_scanline; if (show_scanlines) renderer.scaler = scaleNN_scanline;
else renderer.scaler = optimize_text ? scaleNN_text : scaleNN; else renderer.scaler = scaleNN;
else { else {
sprintf(scaler_name, "%iX", scale); sprintf(scaler_name, "%iX", scale);
if (show_scanlines) { if (show_scanlines) {
@ -2646,7 +2575,7 @@ static void selectScaler_AR(int width, int height, int pitch) {
// if (scale>6) scale = 6; // if (scale>6) scale = 6;
// else // else
if (scale>2) scale = 4; // TODO: pillar/letterboxing at 3x produces vertical banding (some kind of alignment issue?) if (scale>2) scale = 2; // TODO: pillar/letterboxing at 3x produces vertical banding (some kind of alignment issue?)
// reduce scale if we don't have enough memory to accomodate it // reduce scale if we don't have enough memory to accomodate it
// scaled width and height can't be greater than our fixed page width or height // scaled width and height can't be greater than our fixed page width or height
@ -2942,11 +2871,13 @@ void Core_load(void) {
core.load_game(&game_info); core.load_game(&game_info);
SRAM_read(); SRAM_read();
RTC_read();
// NOTE: must be called after core.load_game! // NOTE: must be called after core.load_game!
struct retro_system_av_info av_info = {}; struct retro_system_av_info av_info = {};
core.get_system_av_info(&av_info); core.get_system_av_info(&av_info);
// FIX: some cores need configure a default controller.
core.set_controller_port_device(0, 1);
core.fps = av_info.timing.fps; core.fps = av_info.timing.fps;
core.sample_rate = av_info.timing.sample_rate; core.sample_rate = av_info.timing.sample_rate;
double a = av_info.geometry.aspect_ratio; double a = av_info.geometry.aspect_ratio;
@ -2964,6 +2895,7 @@ void Core_unload(void) {
void Core_quit(void) { void Core_quit(void) {
if (core.initialized) { if (core.initialized) {
SRAM_write(); SRAM_write();
RTC_write();
core.unload_game(); core.unload_game();
core.deinit(); core.deinit();
core.initialized = 0; core.initialized = 0;
@ -3057,6 +2989,7 @@ void Menu_quit(void) {
} }
void Menu_beforeSleep(void) { void Menu_beforeSleep(void) {
SRAM_write(); SRAM_write();
RTC_write();
State_autosave(); State_autosave();
putFile(AUTO_RESUME_PATH, game.path + strlen(SDCARD_PATH)); putFile(AUTO_RESUME_PATH, game.path + strlen(SDCARD_PATH));
POW_setCPUSpeed(CPU_SPEED_MENU); POW_setCPUSpeed(CPU_SPEED_MENU);
@ -3856,6 +3789,7 @@ static void Menu_loop(void) {
} }
SRAM_write(); SRAM_write();
RTC_write();
POW_warn(0); POW_warn(0);
POW_setCPUSpeed(CPU_SPEED_MENU); // set Hz directly POW_setCPUSpeed(CPU_SPEED_MENU); // set Hz directly
GFX_setVsync(VSYNC_STRICT); GFX_setVsync(VSYNC_STRICT);
@ -3863,7 +3797,6 @@ static void Menu_loop(void) {
int rumble_strength = VIB_getStrength(); int rumble_strength = VIB_getStrength();
VIB_setStrength(0); VIB_setStrength(0);
fast_forward = 0;
POW_enableAutosleep(); POW_enableAutosleep();
PAD_reset(); PAD_reset();
@ -4312,19 +4245,23 @@ static void trackFPS(void) {
} }
static void limitFF(void) { static void limitFF(void) {
static uint64_t ff_frame_time = 0;
static uint64_t last_time = 0; static uint64_t last_time = 0;
const uint64_t now = getMicroseconds(); static int last_max_speed = -1;
if (last_max_speed!=max_ff_speed) {
last_max_speed = max_ff_speed;
ff_frame_time = 1000000 / (core.fps * (max_ff_speed + 1));
}
uint64_t now = getMicroseconds();
if (fast_forward && max_ff_speed) { if (fast_forward && max_ff_speed) {
if (last_time == 0) last_time = now; if (last_time == 0) last_time = now;
int elapsed = now - last_time; int elapsed = now - last_time;
if (elapsed>0 && elapsed<0x80000) { if (elapsed>0 && elapsed<0x80000) {
uint64_t ff_frame_time = 1000000 / (core.fps * (max_ff_speed + 1)); // TODO: define this only when max_ff_speed changes
if (elapsed<ff_frame_time) { if (elapsed<ff_frame_time) {
int delay = (ff_frame_time - elapsed) / 1000; int delay = (ff_frame_time - elapsed) / 1000;
if (delay>0) { if (delay>0 && delay<17) { // don't allow a delay any greater than a frame
// TODO: huh, this isn't causing the Tekken 3 hangs...
// printf("limitFF delay: %i\n", delay); fflush(stdout);
SDL_Delay(delay); SDL_Delay(delay);
} }
} }

View file

@ -6,8 +6,8 @@ TARGET = minui
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer CFLAGS = -Os -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -fomit-frame-pointer
CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" CFLAGS += -I. -I../common -DPLATFORM=\"$(UNION_PLATFORM)\" -Ofast -std=gnu99
LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread LDFLAGS = -ldl -lSDL -lSDL_image -lSDL_ttf -lmsettings -lpthread -lm -lz
# CFLAGS += -fsanitize=address -fno-common # CFLAGS += -fsanitize=address -fno-common
# LDFLAGS += -lasan # LDFLAGS += -lasan

View file

@ -283,7 +283,7 @@ static Directory* Directory_new(char* path, int selected) {
else if (exactMatch(path, FAUX_FAVORITE_PATH)) { else if (exactMatch(path, FAUX_FAVORITE_PATH)) {
self->entries = getFavorites(); self->entries = getFavorites();
} }
else if (!exactMatch(path, COLLECTIONS_PATH) && prefixMatch(COLLECTIONS_PATH, path)) { else if (!exactMatch(path, COLLECTIONS_PATH) && prefixMatch(COLLECTIONS_PATH, path) && suffixMatch(".txt", path)) {
self->entries = getCollection(path); self->entries = getCollection(path);
} }
else if (suffixMatch(".m3u", path)) { else if (suffixMatch(".m3u", path)) {

BIN
src/ramdisk/charging.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

View file

@ -0,0 +1,3 @@
patched version of ramdisk.img
from the official stock TF1 image
released on or around 2023-03-09

35
src/ramdisk/readme.txt Normal file
View file

@ -0,0 +1,35 @@
can't just hexedit a ramdisk.img because of the internal CRC checksum
make sure we have mkimage
apt update && apt install u-boot-tools
(the following steps are slow if performed in the shared workspace folder,
move ramdisk.img somewhere above that directory to do the work, eg. ~)
strip the header from ramdisk.img
dd bs=1 skip=64 if=ramdisk.img of=ramdisk-no-header.img
unpack the image
mkdir ramdisk && cd ramdisk
cpio -i --no-absolute-filenames < ../ramdisk-no-header.img
patch charger to use /misc/charging.png for _every_ charging image :sweat_smile:
sed -i 's,/res/images/%s.png,/misc/charging.png,' charger
pack it up and recreate the image
shopt -s dotglob
find . | cpio -H newc -o > ../ramdisk.cpio
mkimage -A arm -O linux -T ramdisk -n "Initial RAM Disk" -d ../ramdisk.cpio ../ramdisk.img.new
based on
https://boundarydevices.com/hacking-ram-disks/
---
if I decide to use this will need to copy charging.png and patched-ramdisk.img (as ramdisk.img) to /.system/rg35xx/dat