void CMEM2Alloc::init(unsigned int size) { m_baseAddress = (SBlock *) std::max(((u32)SYS_GetArena2Lo() + 31) & ~31, IOS_RELOAD_AREA); m_endAddress = (SBlock *) ((char *)m_baseAddress + std::min(size * 0x100000, SYS_GetArena2Size() & ~31)); if (m_endAddress > (SBlock *) 0x93300000) //rest is reserved for usb/usb2/network and other stuff... (0xE0000 bytes) m_endAddress = (SBlock *) 0x93300000; SYS_SetArena2Lo(m_endAddress); LWP_MutexInit(&m_mutex, 0); }
void CMEM2Alloc::cleanup(void) { LWP_MutexDestroy(m_mutex); m_mutex = 0; m_first = 0; // Try to release the range we took through SYS functions if (SYS_GetArena2Lo() == m_endAddress) SYS_SetArena2Lo(m_baseAddress); m_baseAddress = 0; m_endAddress = 0; }
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; }