bool PatchStaticWidescreen(u32 TitleID, u32 Region) { if(TRIGame == TRI_GP1) { dbgprintf("PatchWidescreen:[Mario Kart GP1] applied\r\n"); PatchWideMulti(0x28C800, 1); return true; } else if(TRIGame == TRI_GP2) { dbgprintf("PatchWidescreen:[Mario Kart GP2] applied\r\n"); PatchWideMulti(0x2C80D4, 1); return true; } else if(TRIGame == TRI_VS4) { dbgprintf("PatchWidescreen:[Virtua Striker 4] applied\r\n"); PatchWideMulti(0x5E418, 0); //clipping PatchWideMulti(0x7FA58, 0); //widescreen return true; } else if(TRIGame == TRI_AX) { //thanks CosmoCortney dbgprintf("PatchWidescreen:[F-Zero AX] applied\r\n"); write32(0x445C34, read32(0x445C30)); return true; } u32 Buffer, PatchedWide = 0; switch(TitleID) { case 0x474D34: //Mario Kart Double Dash dbgprintf("PatchWidescreen:[Mario Kart Double Dash] applied\r\n"); if(Region == REGION_ID_USA || Region == REGION_ID_JAP) { PatchWideMulti(0x1D65A4, 3); PatchWideMulti(0x1D65FC, 2); } else if(Region == REGION_ID_EUR) { PatchWideMulti(0x1D6558, 3); PatchWideMulti(0x1D65B0, 2); } return true; case 0x474145: //Doubutsu no Mori e+ case 0x474146: //Animal Crossing for(Buffer = 0x5E460; Buffer < 0x61EC0; Buffer+=4) { //Every language has its own function location making 7 different locations if(read32(Buffer) == 0xFF801090 && read32(Buffer+4) == 0x7C9F2378) { dbgprintf("PatchWidescreen:[Animal Crossing] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 28); return true; } } return false; case 0x47414C: //Super Smash Bros Melee for(Buffer = 0x368500; Buffer < 0x36A500; Buffer+=4) { if(read32(Buffer) == 0x281E0000 && read32(Buffer+4) == 0xC03F0034) { dbgprintf("PatchWidescreen:[Super Smash Bros Melee] applied (0x%08X)\r\n", Buffer+4); PatchWideMulti(Buffer+4, 1); return true; } } return false; case 0x475445: //1080 Avalanche for(Buffer = 0x64000; Buffer < 0x66000; Buffer+=4) { if(read32(Buffer) == 0xEC000828 && (read32(Buffer+4) == 0xD00302A0 || read32(Buffer+4) == 0xD01C02A0)) { dbgprintf("PatchWidescreen:[1080 Avalanche] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 0); PatchedWide = 1; //patching 2 areas } } return PatchedWide; case 0x475049: //Pikmin for(Buffer = 0x59000; Buffer < 0x5B000; Buffer+=4) { if(read32(Buffer) == 0x80BF030C) { dbgprintf("PatchWidescreen:[Pikmin] applied (0x%08X)\r\n", Buffer); write32(Buffer, 0x38A003AC); return true; } } return false; case 0x475056: //Pikmin 2 for(Buffer = 0x424000; Buffer < 0x426000; Buffer+=4) { if(read32(Buffer) == 0xEC011824 && read32(Buffer+12) == 0xC0040000) { dbgprintf("PatchWidescreen:[Pikmin 2] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 0); return true; } } return false; case 0x474D38: //Metroid Prime case 0x47324D: //Metroid Prime 2 for(Buffer = 0x2B0000; Buffer < 0x3B0000; Buffer+=4) { if(read32(Buffer) == 0xFFA01090 && read32(Buffer+8) == 0xFFC01890 && read32(Buffer+12) == 0xEC250072) { PatchWideMulti(Buffer, 29); //perspective PatchedWide++; } if(read32(Buffer) == 0xFF401090 && read32(Buffer+4) == 0xEF210032 && read32(Buffer+12) == 0xFFC01890) { PatchWideMulti(Buffer, 26); //width near plane PatchWideMulti(Buffer+12, 30); //width far plane PatchedWide++; } } dbgprintf("PatchWidescreen:[Metroid Prime] applied (%i times)\r\n", PatchedWide); return PatchedWide; case 0x443433: //Ocarina of Time Disc case 0x505A4C: //Zelda Collectors Edition for(Buffer = 0x90000; Buffer < 0x9F000; Buffer+=4) { if(read32(Buffer) == 0xC3A1005C && read32(Buffer+4) == 0x80030010 && read32(Buffer+8) == 0xFC80E890) { PatchWideMulti(Buffer, 29); //guPerspective PatchedWide++; } if(read32(Buffer) == 0xC3810014 && read32(Buffer+4) == 0x80030010 && read32(Buffer+8) == 0xFC80E090) { PatchWideMulti(Buffer, 28); //guPerspectiveF PatchedWide++; } } if(PatchedWide) dbgprintf("PatchWidescreen:[N64 Emu] applied (%i times)\r\n", PatchedWide); return PatchedWide; case 0x474832: //Need for Speed Hot Pursuit 2 dbgprintf("PatchWidescreen:[Need for Speed Hot Pursuit 2] applied\r\n"); if(Region == REGION_ID_USA) { write32(0x14382C, 0xC0429AE8); write32(0x143D58, 0xC0029AE8); } else if(Region == REGION_ID_EUR) { write32(0x1439AC, 0xC0429AE8); write32(0x143ED8, 0xC0029AE8); } return true; case 0x474C4D: //Luigis Mansion dbgprintf("PatchWidescreen:[Luigis Mansion] applied\r\n"); if(Region == REGION_ID_USA) PatchWideMulti(0x206A4, 0); else if(Region == REGION_ID_EUR) PatchWideMulti(0x2143C, 0); else if(Region == REGION_ID_JAP) PatchWideMulti(0x20300, 0); return true; case 0x474342: //Crash Bandicoot dbgprintf("PatchWidescreen:[Crash Bandicoot] clipping applied\r\n"); if(Region == REGION_ID_USA) write32(0xAC768, 0xD01E0040); else if(Region == REGION_ID_EUR) write32(0xAC9A4, 0xD01E0040); else if(Region == REGION_ID_JAP) write32(0xADF1C, 0xD01E0040); return false; //aspect ratio gets patched later default: return false; } }
bool PatchStaticWidescreen(u32 TitleID, u32 Region) { if(TRIGame == TRI_GP1) { dbgprintf("PatchWidescreen:[Mario Kart GP1] applied\r\n"); PatchWideMulti(0x28C800, 1); return true; } else if(TRIGame == TRI_GP2) { dbgprintf("PatchWidescreen:[Mario Kart GP2] applied\r\n"); PatchWideMulti(0x2C80D4, 1); return true; } else if(TRIGame == TRI_VS4 && read32(0x5E418) == 0xEC020024) { dbgprintf("PatchWidescreen:[Virtua Striker 4v06 Exp] applied\r\n"); PatchWideMulti(0x5E418, 0); //clipping PatchWideMulti(0x7FA58, 0); //widescreen return true; } else if(TRIGame == TRI_AX) { //thanks CosmoCortney dbgprintf("PatchWidescreen:[F-Zero AX] applied\r\n"); if(read32(0x445774) == FLT_ASPECT_1_333) write32(0x445774, read32(0x445770)); else if(read32(0x445C34) == FLT_ASPECT_1_333) write32(0x445C34, read32(0x445C30)); else if(read32(0x4461B4) == FLT_ASPECT_1_333) write32(0x4461B4, read32(0x4461B0)); return true; } u32 Buffer, PatchedWide = 0; if(IsN64Emu) { for(Buffer = 0x90000; Buffer < 0x9F000; Buffer+=4) { if(read32(Buffer) == 0xC3A1005C && read32(Buffer+4) == 0x80030010 && read32(Buffer+8) == 0xFC80E890) { PatchWideMulti(Buffer, 29); //guPerspective PatchedWide++; } if(read32(Buffer) == 0xC3810014 && read32(Buffer+4) == 0x80030010 && read32(Buffer+8) == 0xFC80E090) { PatchWideMulti(Buffer, 28); //guPerspectiveF PatchedWide++; } } if(PatchedWide) { dbgprintf("PatchWidescreen:[N64 Emu] applied (%i times)\r\n", PatchedWide); return true; } } switch(TitleID) { case 0x474D34: //Mario Kart Double Dash dbgprintf("PatchWidescreen:[Mario Kart Double Dash] applied\r\n"); if(Region == REGION_ID_USA || Region == REGION_ID_JAP) { PatchWideMulti(0x1D65A4, 3); PatchWideMulti(0x1D65FC, 2); } else if(Region == REGION_ID_EUR) { PatchWideMulti(0x1D6558, 3); PatchWideMulti(0x1D65B0, 2); } return true; case 0x474145: //Doubutsu no Mori e+ case 0x474146: //Animal Crossing for(Buffer = 0x5E460; Buffer < 0x61EC0; Buffer+=4) { //Every language has its own function location making 7 different locations if(read32(Buffer) == 0xFF801090 && read32(Buffer+4) == 0x7C9F2378) { dbgprintf("PatchWidescreen:[Animal Crossing] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 28); return true; } } return false; case 0x47414C: //Super Smash Bros Melee for(Buffer = 0x368500; Buffer < 0x36A500; Buffer+=4) { if(read32(Buffer) == 0x281E0000 && read32(Buffer+4) == 0xC03F0034) { dbgprintf("PatchWidescreen:[Super Smash Bros Melee] applied (0x%08X)\r\n", Buffer+4); PatchWideMulti(Buffer+4, 1); return true; } } return false; case 0x475445: //1080 Avalanche for(Buffer = 0x64000; Buffer < 0x66000; Buffer+=4) { if(read32(Buffer) == 0xEC000828 && (read32(Buffer+4) == 0xD00302A0 || read32(Buffer+4) == 0xD01C02A0)) { dbgprintf("PatchWidescreen:[1080 Avalanche] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 0); PatchedWide = 1; //patching 2 areas } } return PatchedWide; case 0x475049: //Pikmin for(Buffer = 0x59000; Buffer < 0x5B000; Buffer+=4) { if(read32(Buffer) == 0x80BF030C) { dbgprintf("PatchWidescreen:[Pikmin] applied (0x%08X)\r\n", Buffer); write32(Buffer, 0x38A003AC); return true; } } return false; case 0x475056: //Pikmin 2 for(Buffer = 0x424000; Buffer < 0x426000; Buffer+=4) { if(read32(Buffer) == 0xEC011824 && read32(Buffer+12) == 0xC0040000) { dbgprintf("PatchWidescreen:[Pikmin 2] applied (0x%08X)\r\n", Buffer); PatchWideMulti(Buffer, 0); return true; } } return false; case 0x474D38: //Metroid Prime case 0x47324D: //Metroid Prime 2 for(Buffer = 0x2B0000; Buffer < 0x3B0000; Buffer+=4) { if(read32(Buffer) == 0xFFA01090 && read32(Buffer+8) == 0xFFC01890 && read32(Buffer+12) == 0xEC250072) { PatchWideMulti(Buffer, 29); //perspective PatchedWide++; } if(read32(Buffer) == 0xFF401090 && read32(Buffer+4) == 0xEF210032 && read32(Buffer+12) == 0xFFC01890) { PatchWideMulti(Buffer, 26); //width near plane PatchWideMulti(Buffer+12, 30); //width far plane PatchedWide++; } } dbgprintf("PatchWidescreen:[Metroid Prime] applied (%i times)\r\n", PatchedWide); return PatchedWide; case 0x474832: //Need for Speed Hot Pursuit 2 dbgprintf("PatchWidescreen:[Need for Speed Hot Pursuit 2] applied\r\n"); if(Region == REGION_ID_USA) { write32(0x14382C, 0xC0429AE8); write32(0x143D58, 0xC0029AE8); } else if(Region == REGION_ID_EUR) { write32(0x1439AC, 0xC0429AE8); write32(0x143ED8, 0xC0029AE8); } return true; case 0x474C4D: //Luigis Mansion dbgprintf("PatchWidescreen:[Luigis Mansion] applied\r\n"); if(Region == REGION_ID_USA) PatchWideMulti(0x206A4, 0); else if(Region == REGION_ID_EUR) PatchWideMulti(0x2143C, 0); else if(Region == REGION_ID_JAP) PatchWideMulti(0x20300, 0); return true; case 0x474342: //Crash Bandicoot dbgprintf("PatchWidescreen:[Crash Bandicoot] clipping applied\r\n"); if(Region == REGION_ID_USA) write32(0xAC768, 0xD01E0040); else if(Region == REGION_ID_EUR) write32(0xAC9A4, 0xD01E0040); else if(Region == REGION_ID_JAP) write32(0xADF1C, 0xD01E0040); return false; //aspect ratio gets patched later case 0x473258: //Sonic Gems Collection if(Region == REGION_ID_USA) { if(read32(0x48A2A4) == FLT_ASPECT_1_200) { dbgprintf("PatchWidescreen:[Sonic R] applied\r\n"); //aspect ratio write32(0x48A2A4,FLT_ASPECT_1_600); //free space for new wide values write32(0x69124,0x7C69586E); write32(0x6912C,0x7E631A14); //general clipping left half write32(0x69134,0x3800FF96); //general clipping right half write32(0x69138,0x3A4002E9); //stage clipping multiplier PatchWideMulti(0x87CAC, 13); return true; } } else if(Region == REGION_ID_EUR) { if(read32(0x48A364) == FLT_ASPECT_1_200) { dbgprintf("PatchWidescreen:[Sonic R] applied\r\n"); //aspect ratio write32(0x48A364,FLT_ASPECT_1_600); //free space for new wide values write32(0x69128,0x7C69586E); write32(0x69130,0x7E631A14); //general clipping left half write32(0x69138,0x3800FF96); //general clipping right half write32(0x6913C,0x3A4002E9); //stage clipping multiplier PatchWideMulti(0x87CB4, 13); return true; } } else if(Region == REGION_ID_JAP) { if(read32(0x48A104) == FLT_ASPECT_1_200) { dbgprintf("PatchWidescreen:[Sonic R] applied\r\n"); //aspect ratio write32(0x48A104,FLT_ASPECT_1_600); //free space for new wide values write32(0x69124,0x7C69586E); write32(0x6912C,0x7E631A14); //general clipping left half write32(0x69134,0x3800FF96); //general clipping right half write32(0x69138,0x3A4002E9); //stage clipping multiplier PatchWideMulti(0x87BA0, 13); return true; } } return false; case 0x474E46: //NFL Blitz 2002 if(Region == REGION_ID_USA) { dbgprintf("PatchWidescreen:[NFL Blitz 2002] applied\r\n"); write32(0x199B3C,0xC0040000); PatchWideMulti(0x199B3C,0); write32(0x199B44,0xD01F0068); return true; } return false; case 0x474F33: //NFL Blitz 2003 if(Region == REGION_ID_USA) { dbgprintf("PatchWidescreen:[NFL Blitz 2003] applied\r\n"); write32(0x2037A8,0xC01D0000); PatchWideMulti(0x2037A8,0); write32(0x2037B0,0xD01F0068); return true; } return false; case 0x474656: //NFL Blitz Pro if(Region == REGION_ID_USA) { dbgprintf("PatchWidescreen:[NFL Blitz Pro] applied\r\n"); write32(0x274114,0xC0040000); PatchWideMulti(0x274114,0); write32(0x27412C,0xD0030068); return true; } return false; case 0x474541: //skies of arcadia legends dbgprintf("PatchWidescreen:[Skies of Arcadia Legends] applied\r\n"); if(Region == REGION_ID_USA) { PatchWideMulti(0x1DCE00,2); //picture effects PatchWideDiv(0x299334,6); //widescreen, clipping } else if(Region == REGION_ID_EUR) { PatchWideMulti(0x1DEADC,2); //picture effects PatchWideDiv(0x29BC5C,6); //widescreen, clipping } else if(Region == REGION_ID_JAP) { PatchWideMulti(0x1DCCDC,1); //picture effects PatchWideDiv(0x298DE4,6); //widescreen, clipping } return true; default: return false; } }