private static void OptimizeParse_cmdB7(ROM rom, DisplayListRegion region, RegionOptimizeState state) { // Very failsafe approach state.lastB6Cmd = 0; Int64 cmd = rom.Read64(); // Basically NOP if ((UInt64)cmd == 0xB700000000000000) { rom.Write64(0); return; } // initial state if (state.lastB7Cmd == 0) { state.lastB7Cmd = cmd; return; } // if current cmd loads the same, remove current cmd if (cmd == state.lastB7Cmd) { rom.Write64(0); return; } }
private static void OptimizeParse_cmd04(ROM rom, DisplayListRegion region, RegionOptimizeState state) { // initial state if (state.last04Cmd == 0) { state.last04Cmd = rom.Read64(); return; } Int64 cmd = rom.Read64(); // if current 04 loads the same vertices, remove current cmd if (cmd == state.last04Cmd) { rom.Write64(0); return; } // new vertices are being loaded, update the thing state.last04Cmd = cmd; // if previous cmd is 0x04, it will be overriden by current 04 anyways if (rom.Read8(-8) == 0x04) { rom.Write64(0, -8); } }
public static void PerformRegionOptimize(ROM realRom, Region region, FixConfig config) { // This is fake rom but it works anyways, just more convenient // Want to be safe with overwriting the whole display list ROM fakeRom = new ROM(region.data); RegionOptimizeState state = new RegionOptimizeState(config); DisplayListRegion dlRegion = (DisplayListRegion)region; byte curCmdIndex; do { curCmdIndex = fakeRom.Read8(); OptimizeParserCmd func = optimizeParser[curCmdIndex]; func(fakeRom, dlRegion, state); fakeRom.AddOffset(8); }while (fakeRom.offset < region.length); // Now write data to real rom + trimming // bzero fakeRom.offset = 0; realRom.PushOffset(region.romStart); { do { realRom.Write64(0x0101010101010101); realRom.AddOffset(8); fakeRom.AddOffset(8); } while (fakeRom.offset < region.length); } realRom.PopOffset(); fakeRom.offset = 0; realRom.PushOffset(region.romStart); { int start = region.romStart; do { Int64 cmd = fakeRom.Read64(); fakeRom.AddOffset(8); if (config.trimNOPs && cmd == 0 && dlRegion.isUnusedTrimmingAllowed) { continue; } realRom.Write64((ulong)cmd); realRom.AddOffset(8); } while (fakeRom.offset < region.length); region.length = realRom.offset - start; region.data = new byte[region.length]; realRom.ReadData(region.romStart, region.length, region.data); } realRom.PopOffset(); }
private static void OptimizeParse_cmdFD(ROM rom, DisplayListRegion region, RegionOptimizeState state) { if (state.prevFDcmdAddr != 0) { rom.PushOffset(state.prevFDcmdAddr); rom.Write64(0); rom.PopOffset(); } state.prevFDcmdAddr = rom.offset; }
private static void OptimizeParse_cmdFB(ROM rom, DisplayListRegion region, RegionOptimizeState state) { /* * Int64 cmd = rom.Read64(); * if (state.lastFBCmd == 0) * { * state.lastFBCmd = cmd; * return; * } * * if (cmd == state.lastFBCmd) * { * rom.Write64(0); * return; * } */ }
private static void OptimizeParse_cmdBC(ROM rom, DisplayListRegion region, RegionOptimizeState state) { Int64 cmd = rom.Read64(); // initial state if (state.lastBCCmd == 0) { state.lastBCCmd = cmd; return; } // if current cmd loads the same, remove current cmd if (cmd == state.lastBCCmd) { rom.Write64(0); return; } }
private static void OptimizeParse_common(ROM rom, DisplayListRegion region, RegionOptimizeState state) { }
private static void OptimizeParse_cmdBF(ROM rom, DisplayListRegion region, RegionOptimizeState state) { state.prevF2cmdAddr = 0; state.prevFDcmdAddr = 0; }