bool Search_and_patch_Video_Modes(void *Address, u32 Size, GXRModeObj* Table[]) { u8 *Addr = (u8 *)Address; bool found = 0; u32 i; while(Size >= sizeof(GXRModeObj)) { for(i = 0; Table[i]; i+=2) { if(compare_videomodes(Table[i], (GXRModeObj*)Addr)) { found = 1; patch_videomode((GXRModeObj*)Addr, Table[i+1]); Addr += (sizeof(GXRModeObj)-4); Size -= (sizeof(GXRModeObj)-4); break; } } Addr += 4; Size -= 4; } return found; }
static bool Search_and_patch_Video_Modes(u8 * Address, u32 Size, GXRModeObj* Table[]) { u8 *Addr = (u8 *) Address; bool found = 0; u32 i, j; while (Size >= sizeof(GXRModeObj)) { for (i = 0; Table[i]; i += 2) { if (compare_videomodes(Table[i], (GXRModeObj*) Addr)) { u8 current_vmode = 0; u8 target_vmode = 0; for(j = 0; j < sizeof(vmodes)/sizeof(vmodes[0]); j++) { if(compare_videomodes(Table[i], vmodes[j])) { current_vmode = j; break; } } for(j = 0; j < sizeof(vmodes)/sizeof(vmodes[0]); j++) { if(compare_videomodes(Table[i+1], vmodes[j])) { target_vmode = j; break; } } debughelper_printf("Video mode found in dol: %s, replaced by: %s \n", vmodes_name[current_vmode], vmodes_name[target_vmode]); found = 1; patch_videomode((GXRModeObj*) Addr, Table[i + 1]); Addr += (sizeof(GXRModeObj) - 4); Size -= (sizeof(GXRModeObj) - 4); break; } } Addr += 4; Size -= 4; } return found; }
static bool Search_and_patch_Video_To(void *Address, u32 Size, GXRModeObj* Table[], GXRModeObj* rmode, bool patchAll) { u8 *Addr = (u8 *)Address; bool found = 0; u32 i; u8 target_vmode = 0; for(i = 0; i < sizeof(vmodes)/sizeof(vmodes[0]); i++) { if(compare_videomodes(Table[i], rmode)) { target_vmode = i; break; } } while(Size >= sizeof(GXRModeObj)) { // Video mode pattern found if( (((GXRModeObj*)Addr)->fbWidth == 0x0280 && ((GXRModeObj*)Addr)->viWidth == 0x02c4) || // TVEurgb60Hz480Prog (((GXRModeObj*)Addr)->fbWidth == 0x0280 && ((GXRModeObj*)Addr)->viWidth == 0x0280) ) // All other video modes { // display found video mode patterns GXRModeObj* vidmode = (GXRModeObj*)Addr; debughelper_printf("Video pattern found \t%08x %04x %04x %04x %04x %04x %04x %04x %08x %04x %04x ", vidmode->viTVMode, vidmode->fbWidth, vidmode->efbHeight, vidmode->xfbHeight, vidmode->viXOrigin, vidmode->viYOrigin, vidmode->viWidth, vidmode->viHeight, vidmode->xfbMode, vidmode->field_rendering, vidmode->aa); debughelper_printf("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x ", vidmode->sample_pattern[0][0], vidmode->sample_pattern[1][0], vidmode->sample_pattern[2][0], vidmode->sample_pattern[3][0], vidmode->sample_pattern[4][0], vidmode->sample_pattern[5][0], vidmode->sample_pattern[6][0], vidmode->sample_pattern[7][0], vidmode->sample_pattern[8][0], vidmode->sample_pattern[9][0], vidmode->sample_pattern[10][0], vidmode->sample_pattern[11][0], vidmode->sample_pattern[0][1], vidmode->sample_pattern[1][1], vidmode->sample_pattern[2][1], vidmode->sample_pattern[3][1], vidmode->sample_pattern[4][1], vidmode->sample_pattern[5][1], vidmode->sample_pattern[6][1], vidmode->sample_pattern[7][1], vidmode->sample_pattern[8][1], vidmode->sample_pattern[9][1], vidmode->sample_pattern[10][1], vidmode->sample_pattern[11][1]); debughelper_printf("%02x%02x%02x%02x%02x%02x%02x \n", vidmode->vfilter[0], vidmode->vfilter[1] , vidmode->vfilter[2], vidmode->vfilter[3] , vidmode->vfilter[4],vidmode->vfilter[5], vidmode->vfilter[6]); found = 0; for(i = 0; i < sizeof(vmodes)/sizeof(vmodes[0]); i++) { if(compare_videomodes(Table[i], (GXRModeObj*)Addr)) { found = 1; debughelper_printf("Video mode found in dol: %s, replaced by: %s \n", vmodes_name[i], vmodes_name[target_vmode]); patch_videomode((GXRModeObj*)Addr, rmode); Addr += (sizeof(GXRModeObj)-4); Size -= (sizeof(GXRModeObj)-4); break; } } if(patchAll && !found) { debughelper_printf("Video mode found in dol: Unknown, replaced by: %s \n", vmodes_name[target_vmode]); patch_videomode((GXRModeObj*)Addr, rmode); Addr += (sizeof(GXRModeObj)-4); Size -= (sizeof(GXRModeObj)-4); } } Addr += 4; Size -= 4; } return found; }