Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        public bool isSegmentMIO0(byte seg, byte?areaID)
        {
            SegBank segBank = GetSegBank(seg, areaID);

            if (segBank != null)
            {
                return(segBank.IsMIO0);
            }
            else
            {
                return(false);
            }
        }
Пример #4
0
        public uint getSegmentStart(ushort seg, byte?areaID)
        {
            SegBank segBank = GetSegBank(seg, areaID);

            if (segBank != null)
            {
                return(segBank.SegStart);
            }
            else
            {
                return(0);
            }
        }
Пример #5
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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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]);
            }
        }
Пример #8
0
        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);
        }
Пример #9
0
 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);
     }
 }