WiiFlow_Lite/source/loader/alt_ios.cpp
fix94.1 6ae58ae3de -added back basic hermes and wanin cIOS support, you can now load
wii games with them again and you also should be able to boot
wiiflow using another ios than d2x
2012-07-16 14:05:57 +00:00

128 lines
2.7 KiB
C++

#include <ogc/machine/processor.h>
#include "DeviceHandler.hpp"
#include "wdvd.h"
#include "disc.h"
#include "usbstorage.h"
#include "mem2.hpp"
#include "alt_ios.h"
#include "sys.h"
#include "wbfs.h"
#include "gecko.h"
#include "cios.h"
#include "types.h"
// mload from uloader by Hermes
#include "mload.h"
#include "ehcmodule_5.h"
#include "dip_plugin_249.h"
#include "odip_frag.h"
#include "mload_modules.h"
extern "C" {extern u8 currentPartition;}
extern int __Arena2Lo;
u8 use_port1 = 0;
#define HAVE_AHBPROT ((*(vu32*)0xcd800064 == 0xFFFFFFFF) ? 1 : 0)
static int load_ehc_module_ex(void)
{
ehcmodule = ehcmodule_5;
size_ehcmodule = size_ehcmodule_5;
dip_plugin = odip_frag;
size_dip_plugin = size_odip_frag;
u8 *ehc_cfg = search_for_ehcmodule_cfg((u8 *)ehcmodule, size_ehcmodule);
if (ehc_cfg)
{
ehc_cfg += 12;
ehc_cfg[0] = use_port1;
gprintf("EHC Port info = %i\n", ehc_cfg[0]);
DCFlushRange((void *) (((u32)ehc_cfg[0]) & ~31), 32);
}
if(use_port1) // release port 0 and use port 1
{
u32 dat=0;
u32 addr;
// get EHCI base registers
mload_getw((void *) 0x0D040000, &addr);
addr&=0xff;
addr+=0x0D040000;
mload_getw((void *) (addr+0x44), &dat);
if((dat & 0x2001)==1)
mload_setw((void *) (addr+0x44), 0x2000);
mload_getw((void *) (addr+0x48), &dat);
if((dat & 0x2000)==0x2000)
mload_setw((void *) (addr+0x48), 0x1001);
}
load_ehc_module();
return 0;
}
void load_dip_249()
{
gprintf("Starting mload\n");
if(mload_init() < 0)
return;
gprintf("Loading 249 dip...");
int ret = mload_module((void *) dip_plugin_249, size_dip_plugin_249);
gprintf("%d\n", ret);
mload_close();
}
bool loadIOS(int ios, bool launch_game)
{
#ifndef DOLPHIN
gprintf("Reloading into IOS %i from %i (AHBPROT: %u)...\n", ios, IOS_GetVersion(), HAVE_AHBPROT);
Close_Inputs();
DeviceHandler::Instance()->UnMountAll();
WDVD_Close();
USBStorage_Deinit();
mload_close();
bool iosOK = IOS_ReloadIOS(ios) == 0;
ISFS_Initialize();
gprintf("%s, Current IOS: %i Base: %i\n", iosOK ? "OK" : "FAILED!", IOS_GetVersion(), get_ios_base());
if(is_ios_type(IOS_TYPE_HERMES, IOS_GetVersion()))
load_ehc_module_ex();
else if(is_ios_type(IOS_TYPE_WANIN, IOS_GetVersion()))
load_dip_249();
if(launch_game)
{
DeviceHandler::Instance()->MountAll();
DeviceHandler::Instance()->Open_WBFS(currentPartition);
Disc_Init();
}
else
Open_Inputs();
return iosOK;
#else
return true;
#endif
}
u32 get_ios_base()
{
u32 revision = IOS_GetRevision();
if (is_ios_type(IOS_TYPE_WANIN, IOS_GetVersion()) && revision >= 17)
return wanin_mload_get_IOS_base();
else if (is_ios_type(IOS_TYPE_HERMES, IOS_GetVersion()) && revision >= 4)
return mload_get_IOS_base();
return 0;
}