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); } } }
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); } } } }