/* sys_psvita.c - psvita backend Copyright (C) 2021-2023 fgsfds 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. */ #include "platform/platform.h" #include #include #include #include #include #include #include #define DATA_PATH "data/xash3d" /* HACKHACK: force-export stuff required by the dynamic libs */ extern void *__aeabi_idiv; extern void *__aeabi_uidiv; extern void *__aeabi_idivmod; extern void *__aeabi_d2ulz; extern void *__aeabi_ul2d; static const vrtld_export_t aux_exports[] = { VRTLD_EXPORT_SYMBOL( __aeabi_d2ulz ), VRTLD_EXPORT_SYMBOL( __aeabi_idiv ), VRTLD_EXPORT_SYMBOL( __aeabi_idivmod ), VRTLD_EXPORT_SYMBOL( __aeabi_uidiv ), VRTLD_EXPORT_SYMBOL( __aeabi_ul2d ), VRTLD_EXPORT_SYMBOL( ctime ), VRTLD_EXPORT_SYMBOL( vasprintf ), VRTLD_EXPORT_SYMBOL( vprintf ), VRTLD_EXPORT_SYMBOL( printf ), VRTLD_EXPORT_SYMBOL( putchar ), VRTLD_EXPORT_SYMBOL( puts ), VRTLD_EXPORT_SYMBOL( tolower ), VRTLD_EXPORT_SYMBOL( toupper ), VRTLD_EXPORT_SYMBOL( strchrnul ), VRTLD_EXPORT_SYMBOL( rand ), VRTLD_EXPORT_SYMBOL( srand ), }; const vrtld_export_t *__vrtld_exports = aux_exports; const size_t __vrtld_num_exports = sizeof( aux_exports ) / sizeof( *aux_exports ); /* end of export crap */ SceUInt32 sceUserMainThreadStackSize = 1 * 1024 * 1024; unsigned int _newlib_heap_size_user = 128 * 1024 * 1024; void Platform_ShellExecute( const char *path, const char *parms ) { Con_Reportf( S_WARN "Tried to shell execute ;%s; -- not supported\n", path ); } void PSVita_Init( void ) { char xashdir[1024] = { 0 }; // cd to the base dir immediately for library loading to work if ( PSVita_GetBasePath( xashdir, sizeof( xashdir ) ) ) { chdir( xashdir ); } sceCtrlSetSamplingModeExt( SCE_CTRL_MODE_ANALOG_WIDE ); sceTouchSetSamplingState( SCE_TOUCH_PORT_FRONT, SCE_TOUCH_SAMPLING_STATE_START ); scePowerSetArmClockFrequency( 444 ); scePowerSetBusClockFrequency( 222 ); scePowerSetGpuClockFrequency( 222 ); scePowerSetGpuXbarClockFrequency( 166 ); sceSysmoduleLoadModule( SCE_SYSMODULE_NET ); if ( vrtld_init( 0 ) < 0 ) { Sys_Error( "Could not init vrtld: %s\n", vrtld_dlerror( ) ); } } void PSVita_Shutdown( void ) { vrtld_quit( ); } qboolean PSVita_GetBasePath( char *buf, const size_t buflen ) { // check if a xash3d folder exists on one of these drives // default to the last one (ux0) static const char *drives[] = { "uma0", "imc0", "ux0" }; SceUID dir; size_t i; for ( i = 0; i < sizeof( drives ) / sizeof( *drives ); ++i ) { Q_snprintf( buf, buflen, "%s:" DATA_PATH, drives[i] ); dir = sceIoDopen( buf ); if ( dir >= 0 ) { sceIoDclose( dir ); return true; } } return false; }