mirror of https://github.com/red-prig/fpPS4.git
143 lines
2.3 KiB
Plaintext
143 lines
2.3 KiB
Plaintext
unit game_run;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes,
|
|
SysUtils,
|
|
game_info;
|
|
|
|
var
|
|
FLogUpdate:Integer=0;
|
|
|
|
t_wr_handle:THandle;
|
|
|
|
procedure run_item(Item:TGameItem);
|
|
|
|
implementation
|
|
|
|
uses
|
|
sys_sysinit,
|
|
kern_param,
|
|
kern_thr,
|
|
kern_thread,
|
|
kern_exec,
|
|
vfs_mountroot,
|
|
sys_crt, //<- init writeln redirect
|
|
sys_tty,
|
|
md_exception, //<- install custom
|
|
|
|
//internal libs
|
|
ps4_libSceSystemService,
|
|
ps4_libSceUserService,
|
|
ps4_libSceIpmi,
|
|
ps4_libSceDialogs,
|
|
ps4_libSceAvSetting
|
|
//internal libs
|
|
|
|
;
|
|
|
|
var
|
|
runing:Boolean=False;
|
|
|
|
procedure WakeMainThread;
|
|
begin
|
|
System.InterlockedIncrement(FLogUpdate);
|
|
|
|
if Assigned(Classes.WakeMainThread) then
|
|
begin
|
|
Classes.WakeMainThread(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure re_init_tty; register;
|
|
var
|
|
i:Integer;
|
|
begin
|
|
For i:=0 to High(std_tty) do
|
|
begin
|
|
//std_tty[i].t_rd_handle:=GetStdHandle(STD_INPUT_HANDLE);
|
|
std_tty[i].t_wr_handle:=t_wr_handle;
|
|
std_tty[i].t_update :=@WakeMainThread;
|
|
end;
|
|
|
|
For i:=0 to High(deci_tty) do
|
|
begin
|
|
//deci_tty[i].t_rd_handle:=GetStdHandle(STD_INPUT_HANDLE);
|
|
deci_tty[i].t_wr_handle:=t_wr_handle;
|
|
deci_tty[i].t_update :=@WakeMainThread;
|
|
end;
|
|
|
|
debug_tty.t_wr_handle:=t_wr_handle;
|
|
debug_tty.t_update :=@WakeMainThread;
|
|
end;
|
|
|
|
procedure prepare(Item:TGameItem); SysV_ABI_CDecl;
|
|
var
|
|
td:p_kthread;
|
|
err:Integer;
|
|
len:Integer;
|
|
exec:array[0..PATH_MAX] of Char;
|
|
argv:array[0..1] of PChar;
|
|
begin
|
|
re_init_tty;
|
|
init_tty:=@re_init_tty;
|
|
|
|
//init all
|
|
sys_init;
|
|
//fs guest host
|
|
err:=vfs_mount_mkdir('ufs','/app0' ,pchar(Item.FMountList.app0 ),nil,0);
|
|
Assert(err=0);
|
|
|
|
err:=vfs_mount_mkdir('ufs','/system',pchar(Item.FMountList.system),nil,0);
|
|
Assert(err=0);
|
|
|
|
err:=vfs_mount_mkdir('ufs','/data' ,pchar(Item.FMountList.data ),nil,0);
|
|
Assert(err=0);
|
|
|
|
///argv
|
|
FillChar(exec,SizeOf(exec),0);
|
|
|
|
len:=Length(Item.FGameInfo.Exec);
|
|
if (len>PATH_MAX) then len:=PATH_MAX;
|
|
|
|
Move(pchar(Item.FGameInfo.Exec)^,exec,len);
|
|
|
|
argv[0]:=@exec;
|
|
argv[1]:=nil;
|
|
///argv
|
|
|
|
//unset sys mark
|
|
td:=curkthread;
|
|
td^.td_pflags:=td^.td_pflags and (not TDP_KTHREAD);
|
|
|
|
err:=main_execve(argv[0],@argv[0],nil);
|
|
Assert(err=0);
|
|
//
|
|
|
|
end;
|
|
|
|
procedure run_item(Item:TGameItem);
|
|
var
|
|
r:Integer;
|
|
td:p_kthread;
|
|
begin
|
|
if Item.FLock then Exit;
|
|
|
|
if runing then Exit;
|
|
|
|
r:=kthread_add(@prepare,Item,@td,'[main]');
|
|
Assert(r=0);
|
|
|
|
runing:=True;
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|
|
|
|
|