Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 79 additions & 30 deletions loader/nsmbw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ int loadIntoNSMBW();
kmCondWritePointer(0x80328478, 0x8015BC60, loadIntoNSMBW); // EU
kmCondWritePointer(0x80328130, 0x8015BB20, loadIntoNSMBW); // US
kmCondWritePointer(0x80327E98, 0x8015B930, loadIntoNSMBW); // JP
kmCondWritePointer(0x80334E60, 0x8015C060, loadIntoNSMBW); // KOR
kmCondWritePointer(0x80333218, 0x8015C060, loadIntoNSMBW); // TWN
kmCondWritePointer(0x8032D348, 0x8015CF30, loadIntoNSMBW); // CHN


typedef void *(*EGG_Heap_Alloc_t) (u32 size, s32 align, void *heap);
typedef void (*EGG_Heap_Free_t) (void *buffer, void *heap);
Expand All @@ -28,7 +32,7 @@ void freeAdapter(void *buffer, bool isForCode, const loaderFunctions *funcs) {
}


const loaderFunctionsEx functions_eu = {
const loaderFunctionsEx functions_p = {
{(OSReport_t) 0x8015F870,
(OSFatal_t) 0x801AF710,
(DVDConvertPathToEntrynum_t) 0x801CA7C0,
Expand All @@ -43,7 +47,7 @@ const loaderFunctionsEx functions_eu = {
(void **) 0x80377F48,
(void **) 0x8042A72C
};
const loaderFunctionsEx functions_us = {
const loaderFunctionsEx functions_e = {
{(OSReport_t) 0x8015F730,
(OSFatal_t) 0x801AF5D0,
(DVDConvertPathToEntrynum_t) 0x801CA680,
Expand All @@ -58,7 +62,7 @@ const loaderFunctionsEx functions_us = {
(void **) 0x80377C48,
(void **) 0x8042A44C
};
const loaderFunctionsEx functions_jp = {
const loaderFunctionsEx functions_j = {
{(OSReport_t) 0x8015F540,
(OSFatal_t) 0x801AF3E0,
(DVDConvertPathToEntrynum_t) 0x801CA490,
Expand All @@ -73,6 +77,51 @@ const loaderFunctionsEx functions_jp = {
(void **) 0x803779C8,
(void **) 0x8042A16C
};
const loaderFunctionsEx functions_k = {
{(OSReport_t) 0x8015FC70,
(OSFatal_t) 0x801AFB10,
(DVDConvertPathToEntrynum_t) 0x801CABC0,
(DVDFastOpen_t) 0x801CAED0,
(DVDReadPrio_t) 0x801CB060,
(DVDClose_t) 0x801CAF40,
(sprintf_t) 0x802E1D1C,
allocAdapter,
freeAdapter},
(EGG_Heap_Alloc_t) 0x802B9200,
(EGG_Heap_Free_t) 0x802B94B0,
(void **) 0x80384948,
(void **) 0x804370EC
};
const loaderFunctionsEx functions_w = {
{(OSReport_t) 0x8015FC70,
(OSFatal_t) 0x801AFB10,
(DVDConvertPathToEntrynum_t) 0x801CABC0,
(DVDFastOpen_t) 0x801CAED0,
(DVDReadPrio_t) 0x801CB060,
(DVDClose_t) 0x801CAF40,
(sprintf_t) 0x802E1D1C,
allocAdapter,
freeAdapter},
(EGG_Heap_Alloc_t) 0x802B9200,
(EGG_Heap_Free_t) 0x802B94B0,
(void **) 0x80382D48,
(void **) 0x804354EC
};
const loaderFunctionsEx functions_c = {
{(OSReport_t) 0x80161A90,
(OSFatal_t) 0x801B1930,
(DVDConvertPathToEntrynum_t) 0x801CC9E0,
(DVDFastOpen_t) 0x801CCCF0,
(DVDReadPrio_t) 0x801CCE80,
(DVDClose_t) 0x801CCD60,
(sprintf_t) 0x802E4DF8,
allocAdapter,
freeAdapter},
(EGG_Heap_Alloc_t) 0x802BB360,
(EGG_Heap_Free_t) 0x802BB610,
(void **) 0x8037D4C8,
(void **) 0x8042FCCC
};

void unknownVersion()
{
Expand All @@ -85,30 +134,23 @@ int loadIntoNSMBW()
{
int version = 0, region = 0;

u16 ident1 = *((u16*)0x80768D52);
u16 ident2 = *((u16*)0x80768D92);

if (ident1 == 0x14)
{
version = 2;
switch (ident2)
{
case 0x6DA1: region = 'P'; break;
case 0x6C61: region = 'E'; break;
case 0x6A71: region = 'J'; break;
default: unknownVersion();
}
}
else
switch (*((u32*)0x800CF6CC))
{
version = 1;
switch (ident1)
{
case 0x6DE1: region = 'P'; break;
case 0x6CA1: region = 'E'; break;
case 0x6AB1: region = 'J'; break;
default: unknownVersion();
}
case 0x40820030: region = 'P'; version = 1; break;
case 0x40820038: region = 'P'; version = 2; break;
case 0x48000465: region = 'E'; version = 1; break;
case 0x2C030000: region = 'E'; version = 2; break;
case 0x480000B4: region = 'J'; version = 1; break;
case 0x4082000C: region = 'J'; version = 2; break;
case 0x38A00001:
switch (*((u8*)0x8000423A)) {
case 0xC8: region = 'K'; break;
case 0xAC: region = 'W'; break;
default: unknownVersion();
}
break;
case 0x4182000C: region = 'C'; break;
default: unknownVersion();
}


Expand All @@ -117,13 +159,20 @@ int loadIntoNSMBW()
const loaderFunctions *funcs = NULL;
switch (region)
{
case 'P': funcs = &functions_eu.base; break;
case 'E': funcs = &functions_us.base; break;
case 'J': funcs = &functions_jp.base; break;
case 'P': funcs = &functions_p.base; break;
case 'E': funcs = &functions_e.base; break;
case 'J': funcs = &functions_j.base; break;
case 'K': funcs = &functions_k.base; break;
case 'W': funcs = &functions_w.base; break;
case 'C': funcs = &functions_c.base; break;
}

char path[64];
funcs->sprintf(path, "/engine.%c%d.bin", region, version);
if (version == 0)
funcs->sprintf(path, "/engine.%c.bin", region);
else
funcs->sprintf(path, "/engine.%c%d.bin", region, version);

loadKamekBinaryFromDisc(funcs, path);

return 1;
Expand Down