aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/libc/start.c
diff options
context:
space:
mode:
authorJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-09-19 20:43:05 +0800
committerJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-09-19 20:43:05 +0800
commit9f4891f95070c66ea9f1aba99d72724d4ab24e5a (patch)
tree723e3ef2118a3d1a9e6dafa811ed1b8b1bc9196e /libpsn00b/libc/start.c
parent6762c39551ded059450d17d8bb0cb80642c8aaab (diff)
downloadpsn00bsdk-9f4891f95070c66ea9f1aba99d72724d4ab24e5a.tar.gz
Revised makefiles, added strtok(), command line arguments, SetHeapSize(), moved ISR and callback system to psxetc, moved debug font to psxgpu, fixed CD-ROM library crashing on PSIO, fixed interrupt callback setup to fix crashing on ResetGraph()
Diffstat (limited to 'libpsn00b/libc/start.c')
-rw-r--r--libpsn00b/libc/start.c59
1 files changed, 56 insertions, 3 deletions
diff --git a/libpsn00b/libc/start.c b/libpsn00b/libc/start.c
index c234e03..354ebb9 100644
--- a/libpsn00b/libc/start.c
+++ b/libpsn00b/libc/start.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include <string.h>
#include <malloc.h>
#define load_gp() __asm__ volatile ( \
@@ -9,6 +10,11 @@ extern int main(int argc, const char* argv[]);
void _mem_init(void);
+int __argc;
+const char **__argv;
+
+static const char *_arg_ptrs_int[8];
+static char _arg_buff[132];
static void _call_global_ctors(void)
{
@@ -36,8 +42,50 @@ static void _call_global_dtors(void)
}
}
-void _start(void) {
+void _parse_args( int argc, const char *args[] )
+{
+ int i;
+ char *c,*s;
+
+ memset( _arg_buff, 0, 132 );
+
+ if( !args )
+ {
+ // Use arguments from kernel if args is NULL
+ strncpy( _arg_buff, (char*)0x180, 128 );
+
+ // Clean-up args froom stray line-ends
+ while( ( c = strrchr( _arg_buff, '\r' ) ) ||
+ ( c = strrchr( _arg_buff, '\n' ) ) )
+ *c = 0;
+ }
+ else
+ {
+ __argc = argc;
+ __argv = args;
+ return;
+ }
+
+ __argc = 0;
+ for( i=0; i<8; i++ )
+ _arg_ptrs_int[i] = 0;
+ s = _arg_buff;
+ while( c = strtok( s, " " ) )
+ {
+ _arg_ptrs_int[__argc] = c;
+ __argc++;
+ s = NULL;
+ if( __argc >= 8 )
+ break;
+ }
+
+ __argv = _arg_ptrs_int;
+
+} /* parse_args */
+
+void _start( int argc, const char *args[] )
+{
// Load GP address
load_gp();
@@ -48,10 +96,15 @@ void _start(void) {
// stupid gp relative addressing
_mem_init();
+ // process command line arguments
+ _parse_args( argc, args );
+
_call_global_ctors();
- main(0, NULL);
+ *((int*)0x8000DFFC) = main( __argc, __argv );
_call_global_dtors();
-} \ No newline at end of file
+ // Set return value to kernel return value area
+
+} /* _start */ \ No newline at end of file