/* * 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; namespace PluginCommon { /// /// Script "plugins" must implement this interface. /// public interface IPlugin { /// /// Identification string. Contents are arbitrary, but should briefly identify the /// purpose of the plugin, e.g. "Apple II ProDOS 8 MLI call handler". It may /// contain version information, but should not be expected to be machine-readable. /// string Identifier { get; } /// /// Returns true if this plugin checks JSR/JSL for inline data. /// //bool HasInlineDataAnalyzer { get; } /// /// Initializes the plugin with an application reference and a buffer with file /// data. Called before each analysis pass. /// /// In the current implementation, the file data will be the same every time, /// because plugins are discarded when a project is closed. However, this may /// change if we add a descramble feature. /// /// Reference to application interface. /// 65xx code and data. /// Platform symbols, in no particular order. void Prepare(IApplication appRef, byte[] fileData, List platSyms); /// /// Checks to see if code/data near a JSR instruction should be formatted. /// /// The file data is guaranteed to hold the JSR (offset + 2). /// /// Offset of the JSR instruction. /// Set to true if the JSR doesn't actually return. void CheckJsr(int offset, out bool noContinue); /// /// Checks to see if code/data near a JSL instruction should be formatted. /// /// The file data is guaranteed to hold the JSL (offset + 3). /// /// Offset of the JSL instruction. /// Set to true if the JSL doesn't actually return. void CheckJsl(int offset, out bool noContinue); } /// /// Interfaces provided by the application for use by plugins. /// public interface IApplication { /// /// Sends a debug message to the application. This can be useful when debugging scripts. /// (Use DEBUG > Show Analyzer Output to view it.) /// /// Message to send. void DebugLog(string msg); /// /// Specifies operand formatting. /// /// File offset of opcode. /// Sub-type. Must be appropriate for NumericLE. /// Optional symbolic label. /// True if the change was made, false if it was rejected. bool SetOperandFormat(int offset, DataSubType subType, string label); /// /// Formats file data as inline data. /// /// File offset. /// Length of item. /// Type of item. Must be NumericLE, NumericBE, or Dense. /// Sub-type. Must be appropriate for type. /// Optional symbolic label. /// True if the change was made, false if it was rejected. bool SetInlineDataFormat(int offset, int length, DataType type, DataSubType subType, string label); // Might want to add: // int AddressToOffset(int address) // returns 24-bit offset, or -1 if outside file // int OffsetToAddress(int offset) // returns 24-bit address // (although we could also just pass the address map in at Prepare() -- more efficient // if this gets called frequently) } /// /// Data format type. /// public enum DataType { Unknown = 0, NumericLE, NumericBE, String, Dense, Fill } /// /// Data format sub-type. /// public enum DataSubType { // No sub-type specified. None = 0, // For NumericLE/BE Hex, Decimal, Binary, Ascii, Address, Symbol } }