public void findAndSetSegment02() { AssemblyReader ar = new AssemblyReader(); List <AssemblyReader.JAL_CALL> func_calls; SegBank seg = new SegBank(); uint seg02_init; uint RAMtoROM; switch (region) { default: case ROM_Region.NORTH_AMERICA: seg02_init = Globals.seg02_init_NA; RAMtoROM = Globals.RAMtoROM_NA; break; case ROM_Region.EUROPE: seg02_init = Globals.seg02_init_EU; RAMtoROM = Globals.RAMtoROM_EU; break; case ROM_Region.JAPAN: seg02_init = Globals.seg02_init_JP; RAMtoROM = Globals.RAMtoROM_JP; break; case ROM_Region.JAPAN_SHINDOU: seg02_init = Globals.seg02_init_JS; RAMtoROM = Globals.RAMtoROM_JS; break; case ROM_Region.CHINESE_IQUE: seg02_init = Globals.seg02_init_IQ; RAMtoROM = Globals.RAMtoROM_IQ; break; } func_calls = ar.findJALsInFunction(seg02_init, RAMtoROM); for (int i = 0; i < func_calls.Count; i++) { if (func_calls[i].a0 == 0x2) { Globals.seg02_location = new[] { func_calls[i].a1, func_calls[i].a2 }; if (readWordUnsigned(func_calls[i].a1) == 0x4D494F30) { seg.IsMIO0 = true; seg02_isFakeMIO0 = testIfMIO0IsFake( func_calls[i].a1, readWord(func_calls[i].a1 + 0x8), readWord(func_calls[i].a1 + 0xC) ); seg.SegStart = func_calls[i].a1; seg02_uncompressedOffset = readWordUnsigned(func_calls[i].a1 + 0xC); } } } setSegment(0x2, seg, null); }
public uint decodeSegmentAddress(byte segment, uint offset, byte?areaID) { SegBank seg = GetSegBank(segment, areaID); if (seg.IsMIO0) { throw new System.ArgumentException("Cannot decode segment address (0x" + segment.ToString("X2") + offset.ToString("X6") + ") from MIO0 data. (decodeSegmentAddress 2)"); } return(seg.SegStart + offset); }
public bool isSegmentMIO0(byte seg, byte?areaID) { SegBank segBank = GetSegBank(seg, areaID); if (segBank != null) { return(segBank.IsMIO0); } else { return(false); } }
public uint getSegmentStart(ushort seg, byte?areaID) { SegBank segBank = GetSegBank(seg, areaID); if (segBank != null) { return(segBank.SegStart); } else { return(0); } }
public byte[] cloneSegment(byte segment, byte?areaID) { SegBank seg = GetSegBank(segment, areaID); if (seg == null) { return(null); } byte[] copy = new byte[seg.Data.Length]; Array.Copy(seg.Data, copy, seg.Data.Length); return(copy); }
public uint decodeSegmentAddress_safe(byte segment, uint offset, byte?areaID) { SegBank seg = GetSegBank(segment, areaID); if (seg == null) { return(0xFFFFFFFF); } if (seg.IsMIO0) { return(0xFFFFFFFF); } return(seg.SegStart + offset); }
public byte[] getDataFromSegmentAddress_safe(uint segOffset, uint size, byte?areaID) { byte seg = (byte)(segOffset >> 24); uint off = segOffset & 0x00FFFFFF; SegBank segBank = GetSegBank(seg, areaID); if (segBank != null) { return(getSubArray_safe(segBank.Data, off, (long)size)); } else { return(new byte[size]); } }
public void setSegment(uint index, uint segmentStart, uint segmentEnd, bool isMIO0, bool fakeMIO0, uint uncompressedOffset, byte?areaID) { if (segmentStart > segmentEnd) { return; } SegBank seg = new SegBank(); seg.SegID = (byte)index; if (!isMIO0) { seg.SegStart = segmentStart; seg.IsMIO0 = false; uint size = segmentEnd - segmentStart; seg.Data = new byte[size]; for (uint i = 0; i < size; i++) { seg.Data[i] = bytes[segmentStart + i]; } } else { if (fakeMIO0) { seg.SegStart = segmentStart + uncompressedOffset; seg.IsMIO0 = false; } else { seg.IsMIO0 = true; } seg.Data = MIO0.mio0_decode(getSubArray_safe(bytes, segmentStart, segmentEnd - segmentStart)); } setSegment(index, seg, areaID); }
private void setSegment(uint index, SegBank seg, byte?areaID) { if (areaID != null) { if (!areaSegData.ContainsKey(areaID.Value)) { Dictionary <byte, SegBank> dic = new Dictionary <byte, SegBank>(); areaSegData.Add(areaID.Value, dic); } else if (areaSegData[areaID.Value].ContainsKey((byte)index)) { areaSegData[areaID.Value].Remove((byte)index); } areaSegData[areaID.Value].Add((byte)index, seg); } else { if (segData.ContainsKey((byte)index)) { segData.Remove((byte)index); } segData.Add((byte)index, seg); } }