/* * Copyright 2018 faddenSoft * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.ComponentModel; using Asm65; namespace SourceGen.AsmGen { /// /// Common interface for generating assembler-specific source code. /// public interface IGenerator { /// /// Configure generator. Must be called before calling any other method or using /// properties. /// /// Project to generate source for. /// Directory in which to create output files. /// Name to use as base for filenames. /// Version of assembler to target. Pass in null /// to target latest known version. /// App settings object. void Configure(DisasmProject project, string workDirectory, string fileNameBase, AssemblerVersion asmVersion, AppSettings settings); /// /// Project object with file data and Anattribs. /// DisasmProject Project { get; } /// /// Source code formatter. /// Formatter SourceFormatter { get; } /// /// Application settings. /// AppSettings Settings { get; } /// /// Assembler-specific behavior. Used to handle quirky behavior for things that /// are otherwise managed by common code. /// AssemblerQuirks Quirks { get; } LabelLocalizer Localizer { get; } /// /// Generates source files on a background thread. Method must not make any UI calls. /// /// Async work object, used to report progress updates and /// check for cancellation. /// List of pathnames of generated files. List GenerateSource(BackgroundWorker worker); /// /// Provides an opportunity for the assembler to replace a mnemonic with another. This /// is primarily intended for undocumented ops, which don't have standard mnemonics, /// and hence can vary between assemblers. /// /// /// /// Replacement mnemonic, an empty string if the original is fine, or /// null if the op is not supported at all and should be emitted as hex. string ReplaceMnemonic(OpDef op); /// /// Generates an opcode/operand pair for a short sequence of bytes (1-4 bytes). /// Does not produce any source output. /// /// /// /// /// void GenerateShortSequence(int offset, int length, out string opcode, out string operand); /// /// Outputs zero or more lines of assembler configuration. This comes after the /// header comment but before any directives. Useful for configuring the CPU type /// and assembler options. /// void OutputAsmConfig(); /// /// Outputs one or more lines of data for the specified offset. /// /// void OutputDataOp(int offset); /// /// Outputs an equate directive. The numeric value is already formatted. /// /// /// /// void OutputEquDirective(string name, string valueStr, string comment); /// /// Outputs a code origin directive. /// /// void OutputOrgDirective(int address); /// /// Notify the assembler of a change in register width. /// /// Merlin32 always sets both values (e.g. "MX %00"), cc65 sets each register /// individually (".A16", ".I8"). We need to accommodate both styles. /// /// /// /// /// /// void OutputRegWidthDirective(int offset, int prevM, int prevX, int newM, int newX); /// /// Output a line of source code. All elements must be fully formatted. The /// items will be padded with spaces to fit specific column widths. /// /// /// /// /// void OutputLine(string label, string opcode, string operand, string comment); /// /// Output a line of source code. /// /// void OutputLine(string fullLine); } public class AssemblerQuirks { public bool BlockMoveArgsReversed { get; set; } public bool TracksSepRepNotEmu { get; set; } public bool NoPcRelBankWrap { get; set; } } }