public static int FixMisalignedFlags() { int count = 0, size = Data.GetROMSize(); for (int i = 0; i < size; i++) { Data.FlagType flag = Data.GetFlag(i); if (flag == Data.FlagType.Opcode) { int len = GetInstructionLength(i); for (int j = 1; j < len && i + j < size; j++) { if (Data.GetFlag(i + j) != Data.FlagType.Operand) { Data.SetFlag(i + j, Data.FlagType.Operand); count++; } } i += len - 1; } else if (flag == Data.FlagType.Operand) { Data.SetFlag(i, Data.FlagType.Opcode); count++; i--; } else if (Util.TypeStepSize(flag) > 1) { int step = Util.TypeStepSize(flag); for (int j = 1; j < step; j++) { if (Data.GetFlag(i + j) != flag) { Data.SetFlag(i + j, flag); count++; } } i += step - 1; } } if (count > 0) { Project.unsavedChanges = true; } return(count); }
private void Mark(int offset) { SelectOffset(Manager.Mark(offset, markFlag, Util.TypeStepSize(markFlag))); UpdatePercent(); UpdateWindowTitle(); }
private static string GetLine(int offset, string special) { string line = ""; for (int i = 0; i < list.Count; i++) { if (list[i].Item2 == int.MaxValue) // string literal { line += list[i].Item1; } else if (special != null) // special parameter (replaces code & everything else = empty) { line += GetParameter(offset, "%" + (list[i].Item1 == "code" ? special : "empty"), list[i].Item2); } else // normal parameter { line += GetParameter(offset, list[i].Item1, list[i].Item2); } } if (special == null) { // throw out some errors if stuff looks fishy Data.FlagType flag = Data.GetFlag(offset), check = flag == Data.FlagType.Opcode ? Data.FlagType.Operand : flag; int step = flag == Data.FlagType.Opcode ? GetLineByteLength(offset) : Util.TypeStepSize(flag), size = Data.GetROMSize(); if (flag == Data.FlagType.Operand) { err.WriteLine("({0}) Offset 0x{1:X}: Bytes marked as operands formatted as data.", ++errorCount, offset); } else if (step > 1) { for (int i = 1; i < step; i++) { if (offset + i >= size) { err.WriteLine("({0}) Offset 0x{1:X}: {2} extends past the end of the ROM.", ++errorCount, offset, Util.TypeToString(check)); break; } else if (Data.GetFlag(offset + i) != check) { err.WriteLine("({0}) Offset 0x{1:X}: Expected {2}, but got {3} instead.", ++errorCount, offset + i, Util.TypeToString(check), Util.TypeToString(Data.GetFlag(offset + i))); break; } } } int ia = Util.GetIntermediateAddress(offset, true); if (ia >= 0 && flag == Data.FlagType.Opcode && Data.GetInOutPoint(offset) == Data.InOutPoint.OutPoint && Data.GetFlag(Util.ConvertSNEStoPC(ia)) != Data.FlagType.Opcode) { err.WriteLine("({0}) Offset 0x{1:X}: Branch or jump instruction to a non-instruction.", ++errorCount, offset); } } return(line); }
private void buttonScan_Click(object sender, EventArgs e) { textLog.Text = ""; int found = 0, offset = 0; while (found < 500 && offset < Data.GetROMSize()) { Data.FlagType flag = Data.GetFlag(offset), check = flag == Data.FlagType.Opcode ? Data.FlagType.Operand : flag; int step = flag == Data.FlagType.Opcode ? Manager.GetInstructionLength(offset) : Util.TypeStepSize(flag); if (flag == Data.FlagType.Operand) { found++; textLog.Text += string.Format("{0} (0x{1}): Operand without Opcode\r\n", Util.NumberToBaseString(Util.ConvertPCtoSNES(offset), Util.NumberBase.Hexadecimal, 6, true), Util.NumberToBaseString(offset, Util.NumberBase.Hexadecimal, 0)); } else if (step > 1) { for (int i = 1; i < step; i++) { if (Data.GetFlag(offset + i) != check) { found++; textLog.Text += string.Format("{0} (0x{1}): {2} is not {3}\r\n", Util.NumberToBaseString(Util.ConvertPCtoSNES(offset + i), Util.NumberBase.Hexadecimal, 6, true), Util.NumberToBaseString(offset + i, Util.NumberBase.Hexadecimal, 0), Util.TypeToString(Data.GetFlag(offset + i)), Util.TypeToString(check)); } } } offset += step; } if (found == 0) { textLog.Text = "No misaligned flags found!"; } }