private void ReloadListButton_Click(object sender, EventArgs e) { uint addr = (uint)ReadStartAddress.Value; if (U.isPointer(addr)) { addr = U.toOffset(addr); U.ForceUpdate(ReadStartAddress, addr); } if (DisassemblerTrumb.ProgramAddrToPlain(addr) != addr) { addr = DisassemblerTrumb.ProgramAddrToPlain(addr); U.ForceUpdate(ReadStartAddress, addr); } if (!U.isSafetyOffset(addr)) { return; } uint addr_1 = addr; //変更通知. if (Navigation != null) { NavigationEventArgs arg = new NavigationEventArgs(); arg.Address = addr; Navigation(this, arg); } DisassemblerTrumb Disassembler = new DisassemblerTrumb(Program.AsmMapFileAsmCache.GetAsmMapFile()); uint length = (uint)Program.ROM.Data.Length; if (ReadCount.Value == 0 || this.IsLengthAutoChecked) { List <uint> ldrbuffer = new List <uint>(); U.ForceUpdate(ReadCount, DisassemblerTrumb.CalcLength(Program.ROM.Data , addr, length, ldrbuffer)); //自動的に長さを求めました this.IsLengthAutoChecked = true; } uint bytecount = (uint)ReadCount.Value; this.AddressList.Items.Clear(); this.AddressList.BeginUpdate(); uint limit = Math.Min(addr + bytecount, length); int jisage = 0; //字下げする数 string jisageSpaceData = ""; //字下げに利用するマージンデータ List <uint> jmplabel = new List <uint>(); //ジャンプラベル 字下げに使う Dictionary <uint, uint> ldrtable = new Dictionary <uint, uint>(); //LDR参照データがある位置を記録します. コードの末尾などにあります. 数が多くなるのでマップする. AsmMapFile.MakeSwitchDataList(ldrtable, addr, limit); DisassemblerTrumb.VM vm = new DisassemblerTrumb.VM(); while (addr < limit) { if (ldrtable.ContainsKey(addr)) {//LDR参照のポインタデータが入っている uint ldr = ldrtable[addr]; if (ldr == U.NOT_FOUND) {//switch case this.AddressList.Items.Add(U.toPointer(addr).ToString("X08") + " " + U.MakeOPData(addr, 4) + " //SWITCH CASE"); } else { this.AddressList.Items.Add(U.toPointer(addr).ToString("X08") + " " + U.MakeOPData(addr, 4) + " //LDRDATA"); } addr += 4; continue; } //Disassembler DisassemblerTrumb.Code code = Disassembler.Disassembler(Program.ROM.Data, addr, length, vm); if (code.Type == DisassemblerTrumb.CodeType.BXJMP) {//関数の出口なので字下げをすべて取り消す. jisage = 0; jmplabel.Clear(); jisageSpaceData = ""; } else { for (int i = 0; i < jmplabel.Count;) { if (addr >= jmplabel[i]) { jmplabel.RemoveAt(i); jisage--; jisageSpaceData = U.MakeJisageSpace(jisage); i = 0; continue; } i++; } } this.AddressList.Items.Add(jisageSpaceData + U.toPointer(addr).ToString("X08") + " " + U.MakeOPData(addr, code.GetLength()) + " " + code.ASM + code.Comment); if (code.Type == DisassemblerTrumb.CodeType.CONDJMP //条件式なので字下げ開始 ) { uint jumplabel = U.toOffset(code.Data); if (addr < jumplabel) {//とび先が自分より後ろであること. 前方はすでに過ぎてしまったので字下げできない. jisage++; jmplabel.Add(jumplabel); jisageSpaceData = U.MakeJisageSpace(jisage); } } if (code.Type == DisassemblerTrumb.CodeType.LDR) {//LDR参照位置を記録していく. ldrtable[code.Data2] = addr; } addr += code.GetLength(); } this.AddressList.EndUpdate(); U.SelectedIndexSafety(this.AddressList, 0, true); }