//衝突したデータの長さ uint find_length_conflict_diffdebug(uint start, uint length, DiffDebugMethod method) { uint last = start; uint miss = 0; for (uint i = start + 1; i < length; i++) { byte a = U.at(this.AData, i); //ok byte b = U.at(this.BData, i); //ng if (a != b) { miss = 0; last = i; continue; } byte c = U.at(this.CData, i); //current if (a != c) { miss = 0; last = i; continue; } if (method == DiffDebugMethod.Method1) { if (b != c) {//現状がNG ROMと同じではないので無視する. miss = 0; last = i; continue; } } miss++; if (miss >= 4) { break; } } return(last - start + 1); }
public void InitDiffDebug(InputFormRef.AutoPleaseWait wait, byte[] okData, byte[] ngData, DiffDebugMethod method) { this.ALabel = "OK ROM "; this.BLabel = "NG ROM "; this.CLabel = "CURRENT"; this.CData = (byte[])Program.ROM.Data.Clone(); this.BData = ngData; this.AData = okData; this.ChangeDataList = new List <ChangeDataSt>(); uint length = (uint)this.CData.Length; if (length < this.BData.Length) { length = (uint)this.BData.Length; } if (length < this.AData.Length) { length = (uint)this.AData.Length; } uint nextDoEvents = 0; for (uint i = 0; i < length;) { if (i > nextDoEvents) {//毎回更新するのは無駄なのである程度の間隔で更新して以降 wait.DoEvents(R._("データ確認中 {0}/{1}", i, length)); nextDoEvents = i + 0xfff; } byte a = U.at(this.AData, i); byte b = U.at(this.BData, i); if (a == b) {//NG ROMとOK ROMが同一なので無視 i++; continue; } byte c = U.at(this.CData, i); if (a == c) {//現状がOK ROMと同じなので無視 i++; continue; } if (method == DiffDebugMethod.Method1) { if (b != c) {//現状がNG ROMと同じではないので無視する. i++; continue; } } //変更点 { uint size = find_length_conflict_diffdebug(i, length, method); this.ChangeDataList.Add(new ChangeDataSt(i, size, MargeMethod.NONE)); i += size; } } wait.DoEvents(R._("ヒント用にマップファイルを構築しています")); MakeWhatIs(); wait.DoEvents(R._("相違点をリストにまとめています")); this.AddressList.DummyAlloc(this.ChangeDataList.Count, 0); MakeListboxContextMenuN(AddressList, AddressList_KeyDown); UpdateTitle(); }