diff options
| author | John Wilbert M. Villamor <lameguy64@gmail.com> | 2020-09-19 20:43:05 +0800 |
|---|---|---|
| committer | John Wilbert M. Villamor <lameguy64@gmail.com> | 2020-09-19 20:43:05 +0800 |
| commit | 9f4891f95070c66ea9f1aba99d72724d4ab24e5a (patch) | |
| tree | 723e3ef2118a3d1a9e6dafa811ed1b8b1bc9196e /libpsn00b/libc/start.c | |
| parent | 6762c39551ded059450d17d8bb0cb80642c8aaab (diff) | |
| download | psn00bsdk-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.c | 59 |
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 |
