u32 InitMem2Manager () { int size = (36*1024*1024); u32 level; _CPU_ISR_Disable(level); size &= ~0x1f; // round down, because otherwise we may exceed the area gprintf ("InitMem2Manager = 0x%0X %u 0x%0X\r\n", SYS_GetArena2Hi(), size, SYS_GetArena2Hi()-size); void *mem2_heap_ptr = (void *)((u32)SYS_GetArena2Hi()-size); SYS_SetArena2Hi(mem2_heap_ptr); _CPU_ISR_Restore(level); size = __lwp_heap_init(&mem2_heap, mem2_heap_ptr, size, 32); return size; }
void show_mem() { FILE *file = fopen("debug.txt", "a"); fprintf(file, "m1(%.4f) m2(%.4f)\r\n", ((float)((char*)SYS_GetArena1Hi()-(char*)SYS_GetArena1Lo()))/0x100000, ((float)((char*)SYS_GetArena2Hi()-(char*)SYS_GetArena2Lo()))/0x100000); fclose(file); }
void InitMem2Manager() { int size = (32*1024*1024)+(256*1024)+32; u32 level; _CPU_ISR_Disable(level); mem2_ptr = (u8*)((u32)SYS_GetArena2Hi()-size); SYS_SetArena2Hi(mem2_ptr); _CPU_ISR_Restore(level); mem2_size = size; Mem2ManagerReset(); #ifdef WII_NETTRACE net_print_string( NULL, 0, "InitMem2Manager: %d, %u\n", mem2_size, mem2_ptr ); #endif }
void wii_memstats(void) { static u32 min_free = UINT_MAX; static u32 temp_free; static u32 level; _CPU_ISR_Disable(level); #ifdef GAMECUBE temp_free = (u32) SYS_GetArenaHi() - (u32) SYS_GetArenaLo(); #else temp_free = (u32) SYS_GetArena1Hi() - (u32) SYS_GetArena1Lo() + (u32) SYS_GetArena2Hi() - (u32) SYS_GetArena2Lo(); #endif _CPU_ISR_Restore(level); if (temp_free < min_free) { min_free = temp_free; fprintf(stderr, "free: %8u\n", min_free); } }
s32 USBStorage_Initialize() { u32 level; if(__inited) return IPC_OK; _CPU_ISR_Disable(level); LWP_InitQueue(&__usbstorage_waitq); if(!arena_ptr) { arena_ptr = (u8*)ROUNDDOWN32(((u32)SYS_GetArena2Hi() - HEAP_SIZE)); if((u32)arena_ptr < (u32)SYS_GetArena2Lo()) { _CPU_ISR_Restore(level); return IPC_ENOMEM; } SYS_SetArena2Hi(arena_ptr); } __lwp_heap_init(&__heap, arena_ptr, HEAP_SIZE, 32); __inited = true; _CPU_ISR_Restore(level); return IPC_OK; }
static void* main_thread_function(void*) { u32 level, real_heap_size; // hope the parms are all set by now COM_InitArgv(parms_number, parms_array); _CPU_ISR_Disable(level); heap = (char *)align32(SYS_GetArena2Lo()); real_heap_size = heap_size - ((u32)heap - (u32)SYS_GetArena2Lo()); if ((u32)heap + real_heap_size > (u32)SYS_GetArena2Hi()) { _CPU_ISR_Restore(level); Sys_Error("heap + real_heap_size > (u32)SYS_GetArena2Hi()"); } else { SYS_SetArena2Lo(heap + real_heap_size); _CPU_ISR_Restore(level); } VIDEO_SetBlack(TRUE); // Initialise the Host module. quakeparms_t parms; memset(&parms, 0, sizeof(parms)); parms.argc = com_argc; parms.argv = com_argv; parms.basedir = QUAKE_WII_BASEDIR; parms.memsize = real_heap_size; parms.membase = heap; if (parms.membase == 0) { Sys_Error("Heap allocation failed"); } memset(parms.membase, 0, parms.memsize); Host_Init(&parms); #if TIME_DEMO Cbuf_AddText("map start\n"); Cbuf_AddText("wait\n"); Cbuf_AddText("timedemo demo1\n"); #endif #if TEST_CONNECTION Cbuf_AddText("connect 192.168.0.2"); #endif SYS_SetResetCallback(reset_system); SYS_SetPowerCallback(shutdown_system); VIDEO_SetBlack(FALSE); // Run the main loop. u64 last_time = gettime(); for (;;) { if (want_to_reset) Sys_Reset(); if (want_to_shutdown) Sys_Shutdown(); // Get the frame time in ticks. const u64 current_time = gettime(); const u64 time_delta = current_time - last_time; const double seconds = time_delta * (0.001f / TB_TIMER_CLOCK); last_time = current_time; // Run the frame. Host_Frame(seconds); }; // Quit (this code is never reached). Sys_Quit(); return 0; }