Beispiel #1
0
            void FindProcOne(uint pointer, uint addr, bool child6C)
            {
                uint length = CalcLengthAndCheck(addr);

                if (U.NOT_FOUND == length)
                {
                    this.AlreadyMatch[addr] = false; //ダメだったということを記録しておこう
                    return;
                }

                if (child6C == false)
                {
                    if (IsTooShort(length, addr) == false)
                    {
                        this.AlreadyMatch[addr] = false; //ダメだったということを記録しておこう
                        return;
                    }
                }

                string name = Get6CName2(addr, length, U.at(ProcsName, pointer), U.at(ProcsNameByAddr, addr));

                FEBuilderGBA.Address.AddAddress(this.List, addr, length, pointer, name, Address.DataTypeEnum.PROCS);
                this.AlreadyMatch[addr] = true;

                uint end = addr + length;

                for (; addr < end; addr += 8)
                {
                    uint code = Program.ROM.u8(addr);
                    if (ProcsScriptForm.hasChildProcs(code))
                    {
                        uint arg = Program.ROM.p32(addr + 4);

                        bool result;
                        if (this.AlreadyMatch.TryGetValue(arg, out result))
                        {//既に知っている.
                            if (result)
                            {
                                continue;
                            }
                        }
                        FindProcOne(addr + 4, arg, true);
                    }
                }
            }
Beispiel #2
0
        public static void MakeCheckError(List <FELint.ErrorSt> errors, List <DisassemblerTrumb.LDRPointer> ldrmap)
        {
            List <Address> procs = new List <Address>();
            FindProc       find  = new FindProc(procs, ldrmap);

            //Procsに付属するデータを発見する
            foreach (Address a in procs)
            {
                uint addr = a.Addr;
                uint end  = addr + a.Length;
                for (; addr < end; addr += 8)
                {
                    uint code = Program.ROM.u8(addr);

                    if (ProcsScriptForm.hasASMRoutine(code))
                    {//呼び出しているASM関数
                        uint arg = Program.ROM.u32(addr + 4);
                        if (arg != 0)
                        {
                            FELint.CheckASMPointer(arg, errors, FELint.Type.PROCS, a.Addr, addr);
                        }
                    }
                    else if (ProcsScriptForm.hasChildProcs(code))
                    {//子Procsの確認
                        uint arg = Program.ROM.u32(addr + 4);
                        if (arg != 0)
                        {
                            FELint.CheckProcsPointer(arg, errors, FELint.Type.PROCS, a.Addr, addr);
                        }
                    }
                    else if (code == 0x01)
                    {//Set name
                        uint name = Program.ROM.u32(addr + 4);
                        FELint.CheckText(name, "PROCS", errors, FELint.Type.SOUNDROOM, a.Addr, addr);
                    }
                }
            }
        }