#include #include #include #include #include "wip.h" #include "gecko/gecko.hpp" #include "memory/mem2.hpp" static WIP_Code *CodeList = NULL; static u32 CodesCount = 0; u32 get_wip_count() { return CodesCount; } WIP_Code *get_wip_list() { return CodeList; } int load_wip_patches(u8 *dir, u8 *gameid) { char filepath[150]; char GameID[7]; GameID[6] = '\0'; memcpy(GameID, gameid, 6); snprintf(filepath, sizeof(filepath), "%s/%s.wip", dir, GameID); FILE *fp = fopen(filepath, "rb"); if(!fp) { memcpy(GameID, gameid, 3); GameID[3] = '\0'; snprintf(filepath, sizeof(filepath), "%s/%s.wip", dir, GameID); fp = fopen(filepath, "rb"); } if(!fp) return -1; char line[255]; gprintf("\nLoading WIP code from %s.\n", filepath); while(fgets(line, sizeof(line), fp)) { if(line[0] == '#' || strlen(line) < 26) continue; u32 offset = (u32) strtoul(line, NULL, 16); u32 srcaddress = (u32) strtoul(line+9, NULL, 16); u32 dstaddress = (u32) strtoul(line+18, NULL, 16); if(!CodeList) CodeList = MEM2_alloc(sizeof(WIP_Code)); WIP_Code *tmp = MEM2_realloc(CodeList, (CodesCount+1)*sizeof(WIP_Code)); if(!tmp) { free(CodeList); fclose(fp); return -1; } CodeList = tmp; CodeList[CodesCount].offset = offset; CodeList[CodesCount].srcaddress = srcaddress; CodeList[CodesCount].dstaddress = dstaddress; CodesCount++; } fclose(fp); return 0; }