void WriteBackMixLZ77() { for (int i = 0; i < this.LZ77StructList.Count; i++) { LZ77Struct lz77Struct = this.LZ77StructList[i]; WriteLZ77Bin(lz77Struct.Bin, lz77Struct.OrignalAddr, lz77Struct.OrignalDataSize, lz77Struct.DebugInfo); } }
//ポインタが解決された void ResolvedPointer(uint labelPointer, uint addrPointer, string debugInfo) { Debug.Assert(labelPointer >= 0x08000000); Debug.Assert(addrPointer >= 0x08000000); this.AddressMap[labelPointer] = addrPointer; WriteApplyLog(labelPointer, addrPointer, debugInfo); //不明なポインタが解決された場合、書き戻す. for (int i = 0; i < this.MissingPointerList.Count; i++) { MissingPointer m = this.MissingPointerList[i]; if (m.FindPointer == labelPointer) { uint p = addrPointer; if (m.Type == PointerType.ANTI_HUFFMAN) { p += 0x80000000; } if (m.IsLZ77) { uint lz77uniq = (uint)(m.WroteAddr >> LZ77UNIQ_SHIFT); uint pos = (uint)(m.WroteAddr & ((1 << LZ77UNIQ_SHIFT) - 1)); LZ77Struct lz77struct = this.LZ77StructList[(int)lz77uniq]; U.write_u32(lz77struct.Bin, pos, p); } else { U.write_u32(this.WriteROMData32MB, m.WroteAddr, p); } //解決されたのでリストから消す. this.MissingPointerList.RemoveAt(i); i--; } else if (m.Type == PointerType.ASM) { uint l; uint p; if (U.IsValueOdd(m.FindPointer)) { if (U.IsValueOdd(labelPointer)) { continue; } l = labelPointer + 1; if (U.IsValueOdd(labelPointer)) { p = addrPointer; } else { p = addrPointer + 1; } } else { if (!U.IsValueOdd(labelPointer)) { continue; } l = labelPointer - 1; if (U.IsValueOdd(labelPointer)) { p = addrPointer - 1; } else { p = addrPointer; } } if (m.FindPointer != l) { continue; } if (m.IsLZ77) { uint lz77uniq = (uint)(m.WroteAddr >> LZ77UNIQ_SHIFT); uint pos = (uint)(m.WroteAddr & ((1 << LZ77UNIQ_SHIFT) - 1)); LZ77Struct lz77struct = this.LZ77StructList[(int)lz77uniq]; U.write_u32(lz77struct.Bin, pos, p); } else { U.write_u32(this.WriteROMData32MB, m.WroteAddr, p); } //解決されたのでリストから消す. this.MissingPointerList.RemoveAt(i); i--; } } }