Initial commit

This commit is contained in:
2026-02-02 04:50:13 +01:00
commit 5b11698731
22592 changed files with 7677434 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <psp2/kernel/processmgr.h>
#include <psp2/power.h>
#include <psp2/appmgr.h>
#include "common/scummsys.h"
#include "backends/platform/sdl/psp2/psp2.h"
#include "backends/plugins/psp2/psp2-provider.h"
#include "base/main.h"
#ifdef ENABLE_PROFILING
#include <vitagprof.h>
#endif
int _newlib_heap_size_user = 192 * 1024 * 1024;
char boot_params[1024];
int main(int argc, char *argv[]) {
scePowerSetArmClockFrequency(444);
scePowerSetBusClockFrequency(222);
scePowerSetGpuClockFrequency(222);
scePowerSetGpuXbarClockFrequency(166);
// Create our OSystem instance
g_system = new OSystem_PSP2();
assert(g_system);
// Pre initialize the backend
g_system->init();
#ifdef DYNAMIC_MODULES
PluginManager::instance().addPluginProvider(new PSP2PluginProvider());
#endif
sceAppMgrGetAppParam(boot_params);
int res;
if (strstr(boot_params,"psgm:play"))
{
char *path_param = strstr(boot_params, "&path=");
char *gameid_param = strstr(boot_params, "&game_id=");
if (path_param != NULL && gameid_param != NULL)
{
char path[256];
char game_id[64];
if (gameid_param > path_param)
{
// handle case where gameid param follows path param
path_param += 6;
memcpy(path, path_param, gameid_param - path_param);
path[gameid_param-path_param] = 0;
snprintf(game_id, 64, gameid_param + 9);
}
else
{
// handle case where path param follows gameid param
gameid_param += 9;
memcpy(game_id, gameid_param, path_param - gameid_param);
game_id[path_param-gameid_param] = 0;
snprintf(path, 256, path_param + 6);
}
const char* args[4];
args[0] = "ux0:app/VSCU00001/eboot.bin";
args[1] = "-p";
args[2] = path;
args[3] = game_id;
res = scummvm_main(4, args);
goto exit;
}
}
// Invoke the actual ScummVM main entry point:
res = scummvm_main(argc, argv);
exit:
// Free OSystem
g_system->destroy();
#ifdef ENABLE_PROFILING
gprof_stop("ux0:/data/gmon.out", 1);
#endif
return res;
}

View File

@@ -0,0 +1,178 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_mkdir
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h // sys/stat.h includes sys/time.h
#define FORBIDDEN_SYMBOL_EXCEPTION_printf // used by sceClibPrintf()
#include "common/scummsys.h"
#include "common/config-manager.h"
#include "common/debug-channels.h"
#include "common/translation.h"
#include "backends/platform/sdl/psp2/psp2.h"
#include "backends/saves/default/default-saves.h"
#include "backends/fs/posix-drives/posix-drives-fs-factory.h"
#include "backends/events/psp2sdl/psp2sdl-events.h"
#include "backends/keymapper/hardware-input.h"
#include <sys/stat.h>
#include <psp2/io/stat.h>
#include <psp2/kernel/clib.h>
static const Common::HardwareInputTableEntry psp2JoystickButtons[] = {
{ "JOY_A", Common::JOYSTICK_BUTTON_A, _s("Cross") },
{ "JOY_B", Common::JOYSTICK_BUTTON_B, _s("Circle") },
{ "JOY_X", Common::JOYSTICK_BUTTON_X, _s("Square") },
{ "JOY_Y", Common::JOYSTICK_BUTTON_Y, _s("Triangle") },
{ "JOY_BACK", Common::JOYSTICK_BUTTON_BACK, _s("Select") },
{ "JOY_START", Common::JOYSTICK_BUTTON_START, _s("Start") },
{ "JOY_LEFT_SHOULDER", Common::JOYSTICK_BUTTON_LEFT_SHOULDER, _s("L") },
{ "JOY_RIGHT_SHOULDER", Common::JOYSTICK_BUTTON_RIGHT_SHOULDER, _s("R") },
{ "JOY_UP", Common::JOYSTICK_BUTTON_DPAD_UP, _s("D-pad Up") },
{ "JOY_DOWN", Common::JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") },
{ "JOY_LEFT", Common::JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") },
{ "JOY_RIGHT", Common::JOYSTICK_BUTTON_DPAD_RIGHT, _s("D-pad Right") },
{ nullptr, 0, nullptr }
};
static const Common::AxisTableEntry psp2JoystickAxes[] = {
{ "JOY_LEFT_STICK_X", Common::JOYSTICK_AXIS_LEFT_STICK_X, Common::kAxisTypeFull, _s("Left Stick X") },
{ "JOY_LEFT_STICK_Y", Common::JOYSTICK_AXIS_LEFT_STICK_Y, Common::kAxisTypeFull, _s("Left Stick Y") },
{ "JOY_RIGHT_STICK_X", Common::JOYSTICK_AXIS_RIGHT_STICK_X, Common::kAxisTypeFull, _s("Right Stick X") },
{ "JOY_RIGHT_STICK_Y", Common::JOYSTICK_AXIS_RIGHT_STICK_Y, Common::kAxisTypeFull, _s("Right Stick Y") },
{ nullptr, 0, Common::kAxisTypeFull, nullptr }
};
int access(const char *pathname, int mode) {
struct stat sb;
if (stat(pathname, &sb) == -1) {
return -1;
}
return 0;
}
void OSystem_PSP2::init() {
// Initialize File System Factory
sceIoMkdir("ux0:data", 0755);
sceIoMkdir("ux0:data/scummvm", 0755);
sceIoMkdir("ux0:data/scummvm/saves", 0755);
DrivesPOSIXFilesystemFactory *fsFactory = new DrivesPOSIXFilesystemFactory();
fsFactory->addDrive("ux0:");
fsFactory->addDrive("uma0:");
_fsFactory = fsFactory;
// Invoke parent implementation of this method
OSystem_SDL::init();
}
void OSystem_PSP2::initBackend() {
ConfMan.set("joystick_num", 0);
ConfMan.registerDefault("fullscreen", true);
ConfMan.registerDefault("aspect_ratio", false);
ConfMan.registerDefault("gfx_mode", "2x");
ConfMan.registerDefault("filtering", true);
ConfMan.registerDefault("kbdmouse_speed", 3);
ConfMan.registerDefault("joystick_deadzone", 2);
ConfMan.registerDefault("touchpad_mouse_mode", false);
ConfMan.registerDefault("frontpanel_touchpad_mode", false);
ConfMan.setBool("fullscreen", true);
if (!ConfMan.hasKey("aspect_ratio")) {
ConfMan.setBool("aspect_ratio", false);
}
if (!ConfMan.hasKey("gfx_mode")) {
ConfMan.set("gfx_mode", "2x");
}
if (!ConfMan.hasKey("filtering")) {
ConfMan.setBool("filtering", true);
}
if (!ConfMan.hasKey("touchpad_mouse_mode")) {
ConfMan.setBool("touchpad_mouse_mode", false);
}
if (!ConfMan.hasKey("frontpanel_touchpad_mode")) {
ConfMan.setBool("frontpanel_touchpad_mode", false);
}
// Create the savefile manager
if (_savefileManager == 0)
_savefileManager = new DefaultSaveFileManager("ux0:data/scummvm/saves");
// Controller mappings for Vita, various names have been used in various SDL versions
SDL_GameControllerAddMapping("50535669746120436f6e74726f6c6c65,PSVita Controller,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
SDL_GameControllerAddMapping("50535669746120636f6e74726f6c6c65,PSVita controller,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
SDL_GameControllerAddMapping("50535669746120636f6e74726f6c6c65,PSVita controller 2,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
SDL_GameControllerAddMapping("50535669746120636f6e74726f6c6c65,PSVita controller 3,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
SDL_GameControllerAddMapping("50535669746120636f6e74726f6c6c65,PSVita controller 4,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
SDL_GameControllerAddMapping("505356697461206275696c74696e206a,PSVita builtin joypad,y:b0,b:b1,a:b2,x:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b6,dpleft:b7,dpup:b8,dpright:b9,back:b10,start:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,");
// Event source
if (_eventSource == 0)
_eventSource = new PSP2EventSource();
// Invoke parent implementation of this method
OSystem_SDL::initBackend();
}
bool OSystem_PSP2::hasFeature(Feature f) {
if (f == kFeatureFullscreenMode)
return false;
return (f == kFeatureKbdMouseSpeed ||
f == kFeatureJoystickDeadzone ||
f == kFeatureTouchpadMode ||
OSystem_SDL::hasFeature(f));
}
void OSystem_PSP2::logMessage(LogMessageType::Type type, const char *message) {
sceClibPrintf(message);
// Log only error messages to file
if (type == LogMessageType::kError && _logger)
_logger->print(message);
}
Common::Path OSystem_PSP2::getDefaultConfigFileName() {
return "ux0:data/scummvm/scummvm.ini";
}
Common::Path OSystem_PSP2::getDefaultLogFileName() {
return "ux0:data/scummvm/scummvm.log";
}
Common::HardwareInputSet *OSystem_PSP2::getHardwareInputSet() {
using namespace Common;
CompositeHardwareInputSet *inputSet = new CompositeHardwareInputSet();
// Users may use USB / bluetooth mice and keyboards
inputSet->addHardwareInputSet(new MouseHardwareInputSet(defaultMouseButtons));
inputSet->addHardwareInputSet(new KeyboardHardwareInputSet(defaultKeys, defaultModifiers));
inputSet->addHardwareInputSet(new JoystickHardwareInputSet(psp2JoystickButtons, psp2JoystickAxes));
return inputSet;
}

View File

@@ -0,0 +1,40 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef PLATFORM_SDL_PSP2_H
#define PLATFORM_SDL_PSP2_H
#include "backends/platform/sdl/sdl.h"
class OSystem_PSP2 : public OSystem_SDL {
public:
void init() override;
void initBackend() override;
bool hasFeature(Feature f) override;
void logMessage(LogMessageType::Type type, const char *message) override;
Common::HardwareInputSet *getHardwareInputSet() override;
protected:
Common::Path getDefaultConfigFileName() override;
Common::Path getDefaultLogFileName() override;
};
#endif

View File

@@ -0,0 +1,50 @@
PSP2_EXE_STRIPPED := scummvm_stripped$(EXEEXT)
$(PSP2_EXE_STRIPPED): $(EXECUTABLE)
$(STRIP) --strip-debug $< -o $@
psp2vpk: $(PSP2_EXE_STRIPPED) $(PLUGINS)
rm -rf psp2pkg
rm -f $(EXECUTABLE).vpk
mkdir -p psp2pkg/sce_sys/livearea/contents
mkdir -p psp2pkg/data/
mkdir -p psp2pkg/doc/
vita-elf-create $(PSP2_EXE_STRIPPED) $(EXECUTABLE).velf
# Disable ASLR with -na to support profiling, also it can slow things down
vita-make-fself -na -s -c $(EXECUTABLE).velf psp2pkg/eboot.bin
ifdef DYNAMIC_MODULES
# Use psp2rela to convert the main binary to static, this allows plugins to use functions from it without any relocation
psp2rela -src=psp2pkg/eboot.bin -dst=psp2pkg/eboot.bin -static_mode -fetch_base
endif
vita-mksfoex -s TITLE_ID=VSCU00001 -d ATTRIBUTE2=12 "$(EXECUTABLE)" psp2pkg/sce_sys/param.sfo
cp $(srcdir)/dists/psp2/icon0.png psp2pkg/sce_sys/
cp $(srcdir)/dists/psp2/template.xml psp2pkg/sce_sys/livearea/contents/
cp $(srcdir)/dists/psp2/bg.png psp2pkg/sce_sys/livearea/contents/
cp $(srcdir)/dists/psp2/startup.png psp2pkg/sce_sys/livearea/contents/
cp $(DIST_FILES_THEMES) psp2pkg/data/
ifdef DIST_FILES_ENGINEDATA
cp $(DIST_FILES_ENGINEDATA) psp2pkg/data/
endif
ifdef DIST_FILES_NETWORKING
cp $(DIST_FILES_NETWORKING) psp2pkg/data/
endif
ifdef DIST_FILES_VKEYBD
cp $(DIST_FILES_VKEYBD) psp2pkg/data/
endif
ifdef DYNAMIC_MODULES
mkdir -p psp2pkg/plugins
# Each plugin is built as ELF with .suprx extension in main directory because of PLUGIN_SUFFIX variable
# Then it's stripped and converted here to Vita ELF and SELF inside the package directory
set -e ;\
for p in $(PLUGINS); do \
p=$${p%.suprx} ;\
$(STRIP) --strip-debug $$p.suprx -o $$p.stripped.elf ;\
vita-elf-create -n -e $(srcdir)/backends/plugins/psp2/plugin.yml $$p.stripped.elf $$p.velf ;\
vita-make-fself -na -s $$p.velf psp2pkg/plugins/$$(basename "$$p").suprx ;\
done
endif
cp $(DIST_FILES_DOCS) psp2pkg/doc/
cp $(srcdir)/dists/psp2/readme-psp2.md psp2pkg/doc/
cd psp2pkg && zip -r ../$(EXECUTABLE).vpk . && cd ..
.PHONY: psp2vpk