static int PerModuleHelp( Tcl_Interp *interp, int argc, char *argv[]) { Tcl_Interp *help_interp; Tcl_DString cmdbuf; int i, result; char modulefile[ MOD_BUFSIZE]; char modulename[ MOD_BUFSIZE]; /** ** Initialize the command buffer **/ Tcl_DStringInit( &cmdbuf); g_flags |= M_HELP; /** ** Handle each passed module file. Create a Tcl interpreter for each ** module file to be handled **/ for(i=0; i<argc; i++) { help_interp = EM_CreateInterp(); if( TCL_OK != (result = Module_Init( help_interp))) { EM_DeleteInterp( help_interp); result = TCL_ERROR; break; } /** ** locate the filename related to the passed module **/ if( Locate_ModuleFile( help_interp, argv[i], modulename, modulefile)) { if( OK != ErrorLogger( ERR_LOCATE, LOC, argv[i], NULL)) { g_retval = 1; continue; } EM_DeleteInterp( help_interp); } /** ** Now print the module specific help ... **/ g_current_module = modulename; fprintf( stderr, "\n----------- %s '%s' %.*s-------\n\n", _("Module Specific Help for"), g_current_module, (int)(20-strlen( g_current_module)), "--------------------"); result = CallModuleProcedure( help_interp, &cmdbuf, modulefile, "ModulesHelp", 1); /** ** If there hasn't been any help ... **/ if( result == TCL_ERROR) fprintf( stderr, "\t*** %s %s ***\n", _("No Module Specific Help for"), g_current_module); /** ** Finally clear up the Tcl interpreter and handle the next module **/ EM_DeleteInterp( help_interp); } /** ** Free the used command buffer and return on success **/ g_flags &= ~M_HELP; Tcl_DStringFree(&cmdbuf); return( TCL_OK); } /** End of 'PerModuleHelp' **/
/********************************************************************* ** @fn : ** ** @brief : ** ** @param : ** ** @return : *********************************************************************/ void main(void) { Module_Init(); System_Run(); }
int main(void) { int ret; void *frame_buffer = NULL; GXRModeObj *rmode = NULL; /* The game's boot loader is statically loaded at 0x81200000, so we'd better * not start mallocing there! */ SYS_SetArena1Hi((void *)0x81200000); /* initialise all subsystems */ if (!Event_Init(&main_event_fat_loaded)) goto exit_error; if (!Apploader_Init()) goto exit_error; if (!Module_Init()) goto exit_error; if (!Search_Init()) goto exit_error; /* main thread is UI, so set thread prior to UI */ LWP_SetThreadPriority(LWP_GetSelf(), THREAD_PRIO_UI); /* configure the video */ VIDEO_Init(); rmode = VIDEO_GetPreferredMode(NULL); frame_buffer = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); if (!frame_buffer) goto exit_error; console_init( frame_buffer, 20, 20, rmode->fbWidth, rmode->xfbHeight, rmode->fbWidth * VI_DISPLAY_PIX_SZ); /* spawn lots of worker threads to do stuff */ if (!Apploader_RunBackground()) goto exit_error; if (!Module_RunBackground()) goto exit_error; if (!Search_RunBackground()) goto exit_error; VIDEO_Configure(rmode); VIDEO_SetNextFramebuffer(frame_buffer); VIDEO_SetBlack(false); VIDEO_Flush(); VIDEO_WaitVSync(); if (rmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); /* display the welcome message */ printf("\x1b[2;0H"); printf("BrainSlug Wii v%x.%02x.%04x" #ifndef NDEBUG " DEBUG build" #endif "\n", BSLUG_VERSION_MAJOR(BSLUG_LOADER_VERSION), BSLUG_VERSION_MINOR(BSLUG_LOADER_VERSION), BSLUG_VERSION_REVISION(BSLUG_LOADER_VERSION)); printf(" by Chadderz\n\n"); if (!__io_wiisd.startup() || !__io_wiisd.isInserted()) { printf("Please insert an SD card.\n\n"); do { __io_wiisd.shutdown(); } while (!__io_wiisd.startup() || !__io_wiisd.isInserted()); } __io_wiisd.shutdown(); if (!fatMountSimple("sd", &__io_wiisd)) { fprintf(stderr, "Could not mount SD card.\n"); goto exit_error; } Event_Trigger(&main_event_fat_loaded); printf("Waiting for game disk...\n"); Event_Wait(&apploader_event_disk_id); printf("Game ID: %.4s\n", os0->disc.gamename); printf("Loading modules...\n"); Event_Wait(&module_event_list_loaded); if (module_list_count == 0) { printf("No valid modules found!\n"); } else { size_t module; printf( "%u module%s found.\n", module_list_count, module_list_count > 1 ? "s" : ""); for (module = 0; module < module_list_count; module++) { printf( "\t%s %s by %s (", module_list[module]->name, module_list[module]->version, module_list[module]->author); Main_PrintSize(module_list[module]->size); puts(")."); } Main_PrintSize(module_list_size); puts(" total."); } Event_Wait(&apploader_event_complete); Event_Wait(&module_event_complete); fatUnmount("sd"); __io_wiisd.shutdown(); if (module_has_error) { printf("\nPress RESET to exit.\n"); goto exit_error; } if (apploader_game_entry_fn == NULL) { fprintf(stderr, "Error... entry point is NULL.\n"); } else { if (module_has_info || search_has_info) { printf("\nPress RESET to launch game.\n"); while (!SYS_ResetButtonDown()) VIDEO_WaitVSync(); while (SYS_ResetButtonDown()) VIDEO_WaitVSync(); } SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); apploader_game_entry_fn(); } ret = 0; goto exit; exit_error: ret = -1; exit: while (!SYS_ResetButtonDown()) VIDEO_WaitVSync(); while (SYS_ResetButtonDown()) VIDEO_WaitVSync(); VIDEO_SetBlack(true); VIDEO_Flush(); VIDEO_WaitVSync(); free(frame_buffer); exit(ret); return ret; }