Initial commit
This commit is contained in:
107
backends/platform/sdl/psp2/psp2-main.cpp
Normal file
107
backends/platform/sdl/psp2/psp2-main.cpp
Normal 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;
|
||||
}
|
||||
178
backends/platform/sdl/psp2/psp2.cpp
Normal file
178
backends/platform/sdl/psp2/psp2.cpp
Normal 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;
|
||||
}
|
||||
40
backends/platform/sdl/psp2/psp2.h
Normal file
40
backends/platform/sdl/psp2/psp2.h
Normal 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
|
||||
50
backends/platform/sdl/psp2/psp2.mk
Normal file
50
backends/platform/sdl/psp2/psp2.mk
Normal 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
|
||||
Reference in New Issue
Block a user