2012-12-08 20:53:27 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ogcsys.h>
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
GXRModeObj *PAL2NTSC[] = {
|
|
|
|
&TVMpal480IntDf, &TVNtsc480IntDf,
|
|
|
|
&TVPal264Ds, &TVNtsc240Ds,
|
|
|
|
&TVPal264DsAa, &TVNtsc240DsAa,
|
|
|
|
&TVPal264Int, &TVNtsc240Int,
|
|
|
|
&TVPal264IntAa, &TVNtsc240IntAa,
|
|
|
|
&TVPal524IntAa, &TVNtsc480IntAa,
|
|
|
|
&TVPal528Int, &TVNtsc480IntAa,
|
|
|
|
&TVPal528IntDf, &TVNtsc480IntDf,
|
2012-12-08 20:58:32 +01:00
|
|
|
&TVPal576IntDfScale, &TVNtsc480IntDf,
|
2012-12-08 20:53:27 +01:00
|
|
|
&TVEurgb60Hz240Ds, &TVNtsc240Ds,
|
|
|
|
&TVEurgb60Hz240DsAa, &TVNtsc240DsAa,
|
|
|
|
&TVEurgb60Hz240Int, &TVNtsc240Int,
|
|
|
|
&TVEurgb60Hz240IntAa, &TVNtsc240IntAa,
|
|
|
|
&TVEurgb60Hz480Int, &TVNtsc480IntAa,
|
|
|
|
&TVEurgb60Hz480IntDf, &TVNtsc480IntDf,
|
|
|
|
&TVEurgb60Hz480IntAa, &TVNtsc480IntAa,
|
|
|
|
&TVEurgb60Hz480Prog, &TVNtsc480Prog,
|
|
|
|
&TVEurgb60Hz480ProgSoft,&TVNtsc480Prog,
|
|
|
|
&TVEurgb60Hz480ProgAa, &TVNtsc480Prog,
|
|
|
|
NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
GXRModeObj *NTSC2PAL[] = {
|
|
|
|
&TVNtsc240Ds, &TVPal264Ds,
|
|
|
|
&TVNtsc240DsAa, &TVPal264DsAa,
|
|
|
|
&TVNtsc240Int, &TVPal264Int,
|
|
|
|
&TVNtsc240IntAa, &TVPal264IntAa,
|
|
|
|
&TVNtsc480IntDf, &TVPal528IntDf,
|
|
|
|
&TVNtsc480IntAa, &TVPal524IntAa,
|
|
|
|
&TVNtsc480Prog, &TVPal528IntDf,
|
|
|
|
NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
GXRModeObj *NTSC2PAL60[]={
|
|
|
|
&TVNtsc240Ds, &TVEurgb60Hz240Ds,
|
|
|
|
&TVNtsc240DsAa, &TVEurgb60Hz240DsAa,
|
|
|
|
&TVNtsc240Int, &TVEurgb60Hz240Int,
|
|
|
|
&TVNtsc240IntAa, &TVEurgb60Hz240IntAa,
|
|
|
|
&TVNtsc480IntDf, &TVEurgb60Hz480IntDf,
|
|
|
|
&TVNtsc480IntAa, &TVEurgb60Hz480IntAa,
|
|
|
|
&TVNtsc480Prog, &TVEurgb60Hz480Prog,
|
|
|
|
NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void Patch_VideoMode(u8 *buffer, u32 len)
|
|
|
|
{
|
|
|
|
GXRModeObj **table = NULL;
|
|
|
|
|
|
|
|
u32 cnt, idx;
|
|
|
|
|
|
|
|
/* Select conversion table */
|
|
|
|
if (loaderCfg.forcePal50)
|
|
|
|
table = NTSC2PAL;
|
|
|
|
if (loaderCfg.forcePal60)
|
|
|
|
table = NTSC2PAL60;
|
|
|
|
if (loaderCfg.forceNtsc)
|
|
|
|
table = PAL2NTSC;
|
|
|
|
|
|
|
|
/* No table selected */
|
|
|
|
if (!table)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (cnt = 0; cnt < len; cnt += 4) {
|
|
|
|
u8 *ptr = buffer + cnt;
|
|
|
|
|
|
|
|
/* Search for video modes */
|
|
|
|
for (idx = 0; table[idx]; idx += 2) {
|
|
|
|
/* Patch video mode */
|
|
|
|
if (!memcmp(ptr, table[idx], sizeof(GXRModeObj)))
|
|
|
|
memcpy(ptr, table[idx+1], sizeof(GXRModeObj));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// void __Patch_VideoMode(u8 *buffer, u32 len)
|
|
|
|
// {
|
|
|
|
// const u8 pattern[] = { 0x54, 0x00, 0xFF, 0xFE };
|
|
|
|
//
|
|
|
|
// u64 tid;
|
|
|
|
// u32 cnt;
|
|
|
|
//
|
|
|
|
// /* Get title ID */
|
|
|
|
// ES_GetTitleID(&tid);
|
|
|
|
//
|
|
|
|
// for (cnt = 0; cnt < len; cnt += 4) {
|
|
|
|
// u32 *ptr = (u32 *)(buffer + cnt);
|
|
|
|
//
|
|
|
|
// /* Pattern found */
|
|
|
|
// if (!memcmp(ptr, pattern, sizeof(pattern))) {
|
|
|
|
// u8 region = tid & 0xFF;
|
|
|
|
//
|
|
|
|
// /* USA region */
|
|
|
|
// if (region == 'E')
|
|
|
|
// *ptr = 0x38000001;
|
|
|
|
// /* JAP region */
|
|
|
|
// if (region == 'J')
|
|
|
|
// *ptr = 0x38000000;
|
|
|
|
//
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// void Patch_VideoMode(u8 *buffer, u32 len)
|
|
|
|
// {
|
|
|
|
// const u8 pattern[] = { 0x41, 0x82, 0x00, 0x0C, 0x41, 0x80, 0x00, 0x1C, 0x48, 0x00, 0x00, 0x18 };
|
|
|
|
//
|
|
|
|
// u32 cnt;
|
|
|
|
//
|
|
|
|
// for (cnt = 0; cnt < len; cnt += 4) {
|
|
|
|
// u8 *ptr = buffer + cnt;
|
|
|
|
//
|
|
|
|
// /* Pattern found */
|
|
|
|
// if (!memcmp(ptr, pattern, sizeof(pattern)))
|
|
|
|
// __Patch_VideoMode(ptr, len - cnt);
|
|
|
|
// }
|
|
|
|
// }
|