diff --git a/compiler/systems.pas b/compiler/systems.pas
index 211711fb00..26dce65619 100644
--- a/compiler/systems.pas
+++ b/compiler/systems.pas
@@ -398,7 +398,8 @@ interface
                                    system_riscv32_linux,system_riscv64_linux,
                                    system_aarch64_win64,
                                    system_z80_zxspectrum,system_z80_msxdos,
-                                   system_wasm32_wasi,system_loongarch64_linux
+                                   system_wasm32_wasi,system_loongarch64_linux,
+                                   system_mipsel_ps1
                                   ]+systems_darwin+systems_amigalike;
 
        { all systems that use the PE+ header in the PE/COFF file
diff --git a/compiler/systems/t_ps1.pas b/compiler/systems/t_ps1.pas
index e6d1ae8b37..a706e43130 100644
--- a/compiler/systems/t_ps1.pas
+++ b/compiler/systems/t_ps1.pas
@@ -37,7 +37,7 @@ type
     public
 
       constructor Create; override;
-
+      procedure InitSysInitUnitName; override;
       procedure SetDefaultInfo; override;
       function  MakeExecutable: boolean; override;
 
@@ -57,6 +57,10 @@ begin
   Inherited Create;
 end;
 
+Procedure TLinkerPS1.InitSysInitUnitName;
+begin
+  sysinitunit:='si_prc';
+end;
 
 procedure TLinkerPS1.SetDefaultInfo;
 begin
@@ -72,14 +76,6 @@ Var
     megastr : ansistring;
     newname : ansistring;
     HPath    : TCmdStrListItem;
-    ObjectFilesTable : TStringList;
-
-
-procedure delLib(name: string);
-begin
-  if ObjectFilesTable.indexof(name) <> -1 then ObjectFilesTable.delete(ObjectFilesTable.indexof(name));
-end;
-
 
 begin
 
@@ -91,7 +87,7 @@ begin
     LinkRes.Add('{');
     LinkRes.Add('ram (rwx) : ORIGIN = 0x80010000, LENGTH = 2M - 64K');
     LinkRes.Add('}');
-    LinkRes.Add('ENTRY(main)');
+    LinkRes.Add('ENTRY(_start)');
 
 
     HPath:= TCmdStrListItem(LibrarySearchPath.First);
@@ -104,34 +100,9 @@ begin
     end;
 
 
-    ObjectFilesTable := TStringList.Create;
     while not ObjectFiles.Empty do begin
-        ObjectFilesTable.add(ExtractFileName(ObjectFiles.GetFirst));
+        LinkRes.Add('INPUT(' + ExtractFileName(ObjectFiles.GetFirst) + ')');
     end;
-{    
-    delLib('libcard.o');
-    delLib('libpress.o');
-    delLib('libgpu.o');
-    delLib('libgs.o');
-    delLib('libgte.o');
-    delLib('libcd.o');
-    delLib('libetc.o');
-    delLib('libsn.o');
-    delLib('libsnd.o ');
-    delLib('libspu.o');
-    delLib('libmath.o');
-    delLib('libcomb.o');
-    delLib('libtap.o');
-    delLib('libsio.o');
-    delLib('libpad.o');
-    delLib('libc2.o');
-    delLib('libapi.o');
-}
-    for i:= 0 to ObjectFilesTable.count - 1 do begin
-        LinkRes.Add('INPUT(' + ObjectFilesTable[i] + ')');
-    end;
-
-    ObjectFilesTable.Free;
     
 
     LinkRes.Add('INPUT(libcard.a libpress.a libgpu.a libgs.a libgte.a)');
@@ -145,7 +116,7 @@ begin
     LinkRes.Add('         __exe_start__ = .;');
     LinkRes.Add('');
     LinkRes.Add('         __text_start__ = .;');
-    LinkRes.Add('           KEEP(*(.text.n_main));');
+    LinkRes.Add('           KEEP(*(.text.n_start));');
     LinkRes.Add('           *(.text .text.*)');
     LinkRes.Add('         __text_end__ = .;');
     LinkRes.Add('');
diff --git a/rtl/ps1/Makefile b/rtl/ps1/Makefile
index 767fe84e63..417253fbde 100644
--- a/rtl/ps1/Makefile
+++ b/rtl/ps1/Makefile
@@ -925,7 +925,7 @@ ifdef NO_EXCEPTIONS_IN_SYSTEM
 override FPCOPT+=-dNO_EXCEPTIONS_IN_SYSTEM
 endif
 ifeq ($(CPU_OS_TARGET),mipsel-ps1)
-override TARGET_UNITS+=$(SYSTEMUNIT) $(OBJPASUNIT) $(FPINTRESUNIT) $(ISO7185UNIT) $(CTYPESUNIT) $(SYSCONSTUNIT) $(UUCHARUNIT) $(STRINGSUNIT) libstd libetc libgte libgpu libapi libcd libcomb libgs libsnd libspu libds libgun libmcrd libtap libpad libmcx libpress libsn libmcgui libhmd
+override TARGET_UNITS+=$(SYSTEMUNIT) $(OBJPASUNIT) $(FPINTRESUNIT) $(ISO7185UNIT) $(CTYPESUNIT) $(SYSCONSTUNIT) $(UUCHARUNIT) $(STRINGSUNIT) libstd libetc libgte libgpu libapi libcd libcomb libgs libsnd libspu libds libgun libmcrd libtap libpad libmcx libpress libsn libmcgui libhmd si_prc
 endif
 override INSTALL_FPCPACKAGE=y y
 ifeq ($(CPU_OS_TARGET),mipsel-ps1)
@@ -2970,3 +2970,5 @@ libmcgui$(PPUEXT) : psy-q-sdk/libmcgui.pas $(OBJPASUNIT)$(PPUEXT) $(SYSTEMUNIT)$
 	$(COMPILER) $<
 libhmd$(PPUEXT) : psy-q-sdk/libhmd.pas libgte$(PPUEXT) libgs$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $<
+si_prc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) si_prc.pp
diff --git a/rtl/ps1/Makefile.fpc b/rtl/ps1/Makefile.fpc
index 374d02aa0c..8558e24288 100644
--- a/rtl/ps1/Makefile.fpc
+++ b/rtl/ps1/Makefile.fpc
@@ -7,7 +7,8 @@ main=rtl
 loaders=
 units=$(SYSTEMUNIT) $(OBJPASUNIT) $(FPINTRESUNIT) $(ISO7185UNIT) $(CTYPESUNIT) \
   $(SYSCONSTUNIT) $(UUCHARUNIT) $(STRINGSUNIT) \
-  libstd libetc libgte libgpu libapi libcd libcomb libgs libsnd libspu libds libgun libmcrd libtap libpad libmcx libpress libsn libmcgui libhmd
+  libstd libetc libgte libgpu libapi libcd libcomb libgs libsnd libspu libds libgun libmcrd libtap libpad libmcx libpress libsn libmcgui libhmd \
+  si_prc
 
 [require]
 nortl=y
@@ -110,6 +111,10 @@ libmcgui$(PPUEXT) : psy-q-sdk/libmcgui.pas $(OBJPASUNIT)$(PPUEXT) $(SYSTEMUNIT)$
 
 libhmd$(PPUEXT) : psy-q-sdk/libhmd.pas libgte$(PPUEXT) libgs$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
         $(COMPILER) $<
+
 #
 # Loaders
-#
\ No newline at end of file
+#
+
+si_prc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) si_prc.pp
\ No newline at end of file
diff --git a/rtl/ps1/si_prc.pp b/rtl/ps1/si_prc.pp
new file mode 100644
index 0000000000..5db7f121b6
--- /dev/null
+++ b/rtl/ps1/si_prc.pp
@@ -0,0 +1,45 @@
+{$SMARTLINK OFF}
+{$GOTO ON}
+unit si_prc;
+interface
+
+implementation
+
+procedure PascalMain; external name 'PASCALMAIN';
+
+var
+  _bss_start: record end; external name '__bss_start__';
+  _bss_end: record end; external name '__bss_end__';
+
+
+function _FPC_proc_start: longint; cdecl; public name '_start';
+label _loop, _exit;
+begin
+// fill the bss section with zeros
+	asm
+
+		la $t0, _bss_end
+		la $t1, _bss_start
+		sub $t0, $t0, $t1
+
+	_loop:
+		beq $t0, 0, _exit
+		nop
+
+		la $t1, _bss_start
+		add $t1,$t1,$t0
+		sw $0, 0($t1)
+
+		addi $t0,$t0,-4
+		j _loop
+		nop
+	_exit:
+
+	end;
+
+	PascalMain;
+
+end; 
+
+begin
+end.
\ No newline at end of file