private void table_CellValuePushed(object sender, DataGridViewCellValueEventArgs e) { string value = e.Value as string; int result; int row = e.RowIndex + viewOffset; if (row >= Data.GetROMSize()) { return; } switch (e.ColumnIndex) { case 0: Data.AddLabel(Util.ConvertPCtoSNES(row), value, true); break; // todo (validate for valid label characters) case 8: if (int.TryParse(value, NumberStyles.HexNumber, null, out result)) { Data.SetDataBank(row, result); } break; case 9: if (int.TryParse(value, NumberStyles.HexNumber, null, out result)) { Data.SetDirectPage(row, result); } break; case 10: Data.SetMFlag(row, (value == "8" || value == "M")); break; case 11: Data.SetXFlag(row, (value == "8" || value == "X")); break; case 12: Data.AddComment(Util.ConvertPCtoSNES(row), value, true); break; } table.InvalidateRow(e.RowIndex); }
private static void AddTemporaryLabels() { List <int> addMe = new List <int>(); int pointer = 0; while (pointer < Data.GetROMSize()) { int length = GetLineByteLength(pointer); Data.FlagType flag = Data.GetFlag(pointer); if (unlabeled == FormatUnlabeled.ShowAll) { addMe.Add(Util.ConvertPCtoSNES(pointer)); } else if (unlabeled != FormatUnlabeled.ShowNone && (flag == Data.FlagType.Opcode || flag == Data.FlagType.Pointer16Bit || flag == Data.FlagType.Pointer24Bit || flag == Data.FlagType.Pointer32Bit)) { int ia = Util.GetIntermediateAddressOrPointer(pointer); if (ia >= 0 && Util.ConvertSNEStoPC(ia) >= 0) { addMe.Add(ia); } } pointer += length; } // TODO +/- labels for (int i = 0; i < addMe.Count; i++) { Data.AddLabel(addMe[i], Util.GetDefaultLabel(addMe[i]), false); } }
private static void AddTemporaryLabels() { List <int> addMe = new List <int>(); int pointer = 0; while (pointer < Data.GetROMSize()) { int length = GetLineByteLength(pointer); if (unlabeled == FormatUnlabeled.ShowAll) { addMe.Add(pointer); } else if (unlabeled != FormatUnlabeled.ShowNone) { int ea = Util.GetEffectiveAddressOrPointer(pointer); int pc = Util.ConvertSNEStoPC(ea); if (pc >= 0) { addMe.Add(pc); } } pointer += length; } // TODO +/- labels for (int i = 0; i < addMe.Count; i++) { Data.AddLabel(addMe[i], Util.GetDefaultLabel(addMe[i]), false); } }
private static void OpenVersion1(byte[] unzipped, OpenFileDialog open) { Data.ROMMapMode mode = (Data.ROMMapMode)unzipped[HEADER_SIZE]; Data.ROMSpeed speed = (Data.ROMSpeed)unzipped[HEADER_SIZE + 1]; int size = Util.ByteArrayToInteger(unzipped, HEADER_SIZE + 2); string romName = "", romLocation = ""; byte[] rom; int pointer = HEADER_SIZE + 6; for (int i = 0; i < 0x15; i++) { romName += (char)unzipped[pointer++]; } int checksums = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; while (unzipped[pointer] != 0) { romLocation += (char)unzipped[pointer++]; } pointer++; if (ValidateROM(romLocation, romName, checksums, mode, out rom, open)) { Data.Initiate(rom, mode, speed); for (int i = 0; i < size; i++) { Data.SetDataBank(i, unzipped[pointer + i]); } for (int i = 0; i < size; i++) { Data.SetDirectPage(i, unzipped[pointer + size + i] | (unzipped[pointer + 2 * size + i] << 8)); } for (int i = 0; i < size; i++) { Data.SetXFlag(i, unzipped[pointer + 3 * size + i] != 0); } for (int i = 0; i < size; i++) { Data.SetMFlag(i, unzipped[pointer + 4 * size + i] != 0); } for (int i = 0; i < size; i++) { Data.SetFlag(i, (Data.FlagType)unzipped[pointer + 5 * size + i]); } for (int i = 0; i < size; i++) { Data.SetArchitechture(i, (Data.Architechture)unzipped[pointer + 6 * size + i]); } for (int i = 0; i < size; i++) { Data.SetInOutPoint(i, (Data.InOutPoint)unzipped[pointer + 7 * size + i]); } pointer += 8 * size; int label_count = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; AliasList.me.Reset(); for (int i = 0; i < label_count; i++) { int offset = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; string label = ""; while (unzipped[pointer] != 0) { label += (char)unzipped[pointer++]; } pointer++; Data.AddLabel(offset, label, true); } int comment_count = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; for (int i = 0; i < comment_count; i++) { int offset = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; string comment = ""; while (unzipped[pointer] != 0) { comment += (char)unzipped[pointer++]; } pointer++; Data.AddComment(offset, comment, true); } } else { throw new Exception("Couldn't open the ROM file!"); } }
// differences between version 0 and version 1: // version 0: addresses for aliases and comments were stored in PC offset format. // tables: B, D lo, D hi, X, M, flag, arch, inoutpoint // lists: alias, comment // version 1: addresses for aliases and comments are stored in SNES address format. // tables: B, D lo, D hi, X, M, flag, arch, inoutpoint, ??? // lists: alias, comment, ??? private static void OpenVersion0(byte[] unzipped, OpenFileDialog open) { MessageBox.Show( "This project file is in an older format.\n" + "You may want to back up your work or 'Save As' in case the conversion goes wrong.\n" + "The project file will be untouched until it is saved again.", "Project File Out of Date", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Data.ROMMapMode mode = (Data.ROMMapMode)unzipped[HEADER_SIZE]; Data.ROMSpeed speed = (Data.ROMSpeed)unzipped[HEADER_SIZE + 1]; int size = Util.ByteArrayToInteger(unzipped, HEADER_SIZE + 2); string romName = "", romLocation = ""; byte[] rom; int pointer = HEADER_SIZE + 6; for (int i = 0; i < 0x15; i++) { romName += (char)unzipped[pointer++]; } int checksums = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; while (unzipped[pointer] != 0) { romLocation += (char)unzipped[pointer++]; } pointer++; if (ValidateROM(romLocation, romName, checksums, mode, out rom, open)) { Data.Initiate(rom, mode, speed); for (int i = 0; i < size; i++) { Data.SetDataBank(i, unzipped[pointer + i]); } for (int i = 0; i < size; i++) { Data.SetDirectPage(i, unzipped[pointer + size + i] | (unzipped[pointer + 2 * size + i] << 8)); } for (int i = 0; i < size; i++) { Data.SetXFlag(i, unzipped[pointer + 3 * size + i] != 0); } for (int i = 0; i < size; i++) { Data.SetMFlag(i, unzipped[pointer + 4 * size + i] != 0); } for (int i = 0; i < size; i++) { Data.SetFlag(i, (Data.FlagType)unzipped[pointer + 5 * size + i]); } for (int i = 0; i < size; i++) { Data.SetArchitechture(i, (Data.Architechture)unzipped[pointer + 6 * size + i]); } for (int i = 0; i < size; i++) { Data.SetInOutPoint(i, (Data.InOutPoint)unzipped[pointer + 7 * size + i]); } pointer += 8 * size; int label_count = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; AliasList.me.Reset(); for (int i = 0; i < label_count; i++) { int offset = Util.ConvertPCtoSNES(Util.ByteArrayToInteger(unzipped, pointer)); // pc -> snes pointer += 4; string label = ""; while (unzipped[pointer] != 0) { label += (char)unzipped[pointer++]; } pointer++; Data.AddLabel(offset, label, true); } int comment_count = Util.ByteArrayToInteger(unzipped, pointer); pointer += 4; for (int i = 0; i < comment_count; i++) { int offset = Util.ConvertPCtoSNES(Util.ByteArrayToInteger(unzipped, pointer)); // pc -> snes pointer += 4; string comment = ""; while (unzipped[pointer] != 0) { comment += (char)unzipped[pointer++]; } pointer++; Data.AddComment(offset, comment, true); } } else { throw new Exception("Couldn't open the ROM file!"); } }
public static bool NewProject(string filename) { try { byte[] smc = File.ReadAllBytes(filename); byte[] rom = new byte[smc.Length & 0x7FFFFC00]; if ((smc.Length & 0x3FF) == 0x200) { for (int i = 0; i < rom.Length; i++) { rom[i] = smc[i + 0x200]; } } else if ((smc.Length & 0x3FF) != 0) { throw new Exception("This ROM has an unusual size. It can't be opened."); } else { rom = smc; } if (rom.Length < 0x8000) { throw new Exception("This ROM is too small. It can't be opened."); } currentROMFile = filename; ImportROMDialog import = new ImportROMDialog(rom); DialogResult result = import.ShowDialog(); if (result == DialogResult.OK) { Data.Initiate(rom, import.GetROMMapMode(), import.GetROMSpeed()); unsavedChanges = false; currentFile = null; AliasList.me.Reset(); Dictionary <int, string> generatedLabels = import.GetGeneratedLabels(); if (generatedLabels.Count > 0) { foreach (KeyValuePair <int, string> pair in generatedLabels) { Data.AddLabel(pair.Key, pair.Value, true); } unsavedChanges = true; } Dictionary <int, Data.FlagType> generatedFlags = import.GetHeaderFlags(); if (generatedFlags.Count > 0) { foreach (KeyValuePair <int, Data.FlagType> pair in generatedFlags) { Data.SetFlag(pair.Key, pair.Value); } unsavedChanges = true; } return(true); } } catch (Exception e) { MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return(false); }