/// <summary> /// Creates a populated AssemblerConfig from the app settings for the specified ID. /// If the assembler hasn't been configured yet, the default configuration object /// will be returned. /// </summary> /// <param name="settings">Settings object to pull the values from.</param> /// <param name="id">Assembler ID.</param> /// <returns>The AssemblerConfig.</returns> public static AssemblerConfig GetConfig(AppSettings settings, AssemblerInfo.Id id) { string cereal = settings.GetString(GetSettingName(id), null); if (string.IsNullOrEmpty(cereal)) { IAssembler asm = AssemblerInfo.GetAssembler(id); return(asm.GetDefaultConfig()); } JavaScriptSerializer ser = new JavaScriptSerializer(); try { AssemblerConfig config = ser.Deserialize <AssemblerConfig>(cereal); if (config.ColumnWidths == null || config.ColumnWidths.Length != NUM_COLUMNS) { throw new Exception("Bad column widths"); } if (config.ExecutablePath == null) { throw new Exception("Missing exe path"); } return(config); } catch (Exception ex) { Debug.WriteLine("AssemblerConfig deserialization failed: " + ex.Message); return(null); } }
} // may be null public GenTestResults(string pathName, AssemblerInfo.Id asmId) { PathName = pathName; AsmId = asmId; FileName = Path.GetFileName(pathName); }
/// <summary> /// Queries the versions from all known assemblers, replacing any previously held data. /// </summary> public static void QueryVersions() { IEnumerator <AssemblerInfo> iter = AssemblerInfo.GetInfoEnumerator(); while (iter.MoveNext()) { AssemblerInfo.Id id = iter.Current.AssemblerId; if (id == AssemblerInfo.Id.Unknown) { continue; } AssemblerVersion vers = null; IAssembler asm = AssemblerInfo.GetAssembler(id); if (asm != null) { vers = asm.QueryVersion(); } Debug.WriteLine("Asm version query: " + id + "=" + vers); sVersions[id] = vers; } sQueried = true; }
/// <summary> /// Updates the assembler settings for the specified ID. /// </summary> /// <param name="settings">Settings object to update.</param> /// <param name="id">Assembler ID.</param> /// <param name="config">Asm configuration.</param> public static void SetConfig(AppSettings settings, AssemblerInfo.Id id, AssemblerConfig config) { JavaScriptSerializer ser = new JavaScriptSerializer(); string cereal = ser.Serialize(config); settings.SetString(GetSettingName(id), cereal); }
public static AssemblerVersion GetVersion(AssemblerInfo.Id id) { IAssembler asm = AssemblerInfo.GetAssembler(id); if (asm == null) { Debug.WriteLine("Assembler " + id + " not configured"); return(null); } return(asm.QueryVersion()); }
/// <summary> /// Gets a copy of the AppSettings with a standard set of formatting options (e.g. lower /// case for everything). /// </summary> /// <returns>New app settings object.</returns> private AppSettings CreateNormalizedSettings() { AppSettings settings = AppSettings.Global.GetCopy(); // Override all asm formatting options. We can ignore ShiftBeforeAdjust and the // pseudo-op names because those are set by the generators. settings.SetBool(AppSettings.FMT_UPPER_HEX_DIGITS, false); settings.SetBool(AppSettings.FMT_UPPER_OP_MNEMONIC, false); settings.SetBool(AppSettings.FMT_UPPER_PSEUDO_OP_MNEMONIC, false); settings.SetBool(AppSettings.FMT_UPPER_OPERAND_A, true); settings.SetBool(AppSettings.FMT_UPPER_OPERAND_S, true); settings.SetBool(AppSettings.FMT_UPPER_OPERAND_XY, false); settings.SetBool(AppSettings.FMT_ADD_SPACE_FULL_COMMENT, false); // Don't show the assembler ident line. You can make a case for this being // mandatory, since the generated code is only guaranteed to work with the // assembler for which it was targeted, but I expect we'll quickly get to a // place where we don't have to work around assembler bugs, and this will just // become a nuisance. settings.SetBool(AppSettings.SRCGEN_ADD_IDENT_COMMENT, false); // Don't break lines with long labels. That way we can redefine "long" // without breaking our tests. (This is purely cosmetic.) settings.SetBool(AppSettings.SRCGEN_LONG_LABEL_NEW_LINE, false); // This could be on or off. Off seems less distracting. settings.SetBool(AppSettings.SRCGEN_SHOW_CYCLE_COUNTS, false); // Disable label localization. We want to be able to play with this a bit // without disrupting all the other tests. Use a test-only feature to enable // it for the localization test. settings.SetBool(AppSettings.SRCGEN_DISABLE_LABEL_LOCALIZATION, true); IEnumerator <AssemblerInfo> iter = AssemblerInfo.GetInfoEnumerator(); while (iter.MoveNext()) { AssemblerInfo.Id asmId = iter.Current.AssemblerId; AssemblerConfig curConfig = AssemblerConfig.GetConfig(settings, asmId); AssemblerConfig defConfig = AssemblerInfo.GetAssembler(asmId).GetDefaultConfig(); // Merge the two together. We want the default assembler config for most // things, but the executable path from the current config. defConfig.ExecutablePath = curConfig.ExecutablePath; // Write it into the test settings. AssemblerConfig.SetConfig(settings, asmId, defConfig); } return(settings); }
private void assemblerComboBox_SelectedIndexChanged(object sender, EventArgs e) { AsmComboItem sel = (AsmComboItem)assemblerComboBox.SelectedItem; if (mSelectedAssemblerId != sel.AssemblerId) { // Selection changed, discard window contents. mSelectedAssemblerId = sel.AssemblerId; AppSettings.Global.SetString(AppSettings.SRCGEN_DEFAULT_ASM, mSelectedAssemblerId.ToString()); ResetElements(); } }
/// <summary> /// Assembler factory method. /// </summary> /// <param name="id">ID of assembler to return assembler object for.</param> /// <returns>New assembler interface object.</returns> public static IAssembler GetAssembler(AssemblerInfo.Id id) { switch (id) { case Id.Cc65: return(new AsmCc65()); case Id.Merlin32: return(new AsmMerlin32()); default: return(null); } }
/// <summary> /// Generator factory method. /// </summary> /// <param name="id">ID of assembler to return generator object for.</param> /// <returns>New source generator object.</returns> public static IGenerator GetGenerator(AssemblerInfo.Id id) { switch (id) { case Id.Cc65: return(new GenCc65()); case Id.Merlin32: return(new GenMerlin32()); default: return(null); } }
/// <summary> /// Returns the version information, or null if the query failed for this assembler. /// </summary> /// <param name="id">Assembler identifier.</param> /// <returns>Version info.</returns> public static AssemblerVersion GetVersion(AssemblerInfo.Id id) { if (!sQueried) { QueryVersions(); } if (sVersions.TryGetValue(id, out AssemblerVersion vers)) { return(vers); } else { return(null); } }
/// <summary> /// Updates the selected assembler as the combo box selection changes. This is /// expected to be called during the window load event, to initialize the field. /// </summary> private void AssemblerComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { AsmComboItem sel = (AsmComboItem)assemblerComboBox.SelectedItem; if (sel == null) { // this happens on Items.Clear() return; } if (mSelectedAssemblerId != sel.AssemblerId) { // Selection changed, discard window contents. mSelectedAssemblerId = sel.AssemblerId; AppSettings.Global.SetString(AppSettings.SRCGEN_DEFAULT_ASM, mSelectedAssemblerId.ToString()); ResetElements(); } }
private static string GetSettingName(AssemblerInfo.Id id) { return(AppSettings.ASM_CONFIG_PREFIX + id.ToString()); }