/// <summary>
        /// Checks if the disassembler should enter into Spectrum-specific mode after
        /// the specified disassembly item.
        /// </summary>
        /// <param name="item">Item used to check the Spectrum-specific mode</param>
        /// <returns>
        /// True, to move to the Spectrum-specific mode; otherwise, false
        /// </returns>
        private bool ShouldEnterSpectrumSpecificMode(DisassemblyItem item)
        {
            // --- Check for Spectrum 48K RST #08
            if ((DisassemblyFlags & SpectrumSpecificDisassemblyFlags.Spectrum48Rst08) != 0 &&
                item?.OpCodes.Trim() == "CF")
            {
                _spectMode       = SpectrumSpecificMode.Spectrum48Rst08;
                item.HardComment = "(Report error)";
                return(true);
            }

            // --- Check for Spectrum 48K RST #28
            if ((DisassemblyFlags & SpectrumSpecificDisassemblyFlags.Spectrum48Rst28) != 0 &&
                (item?.OpCodes.Trim() == "EF" ||            // --- RST #28
                 item?.OpCodes.Trim() == "CD 5E 33" ||      // --- CALL 335E
                 item?.OpCodes.Trim() == "CD 62 33"))       // --- CALL 3362
            {
                _spectMode       = SpectrumSpecificMode.Spectrum48Rst28;
                _seriesCount     = 0;
                item.HardComment = "(Invoke Calculator)";
                return(true);
            }

            return(false);
        }
Beispiel #2
0
        /// <summary>
        /// Generates bytecode output for the specified memory section
        /// </summary>
        /// <param name="section">Section information</param>
        private void GenerateRst28ByteCodeOutput(MemorySection section)
        {
            _spectMode      = SpectrumSpecificMode.Spectrum48Rst28;
            _seriesCount    = 0;
            _currentOpCodes = new StringBuilder(16);
            var addr = _offset = section.StartAddress;

            while (addr <= section.EndAddress)
            {
                _currentOpCodes.Clear();
                var opCode = Fetch();
                // ReSharper disable once UnusedVariable
                var item = DisassembleCalculatorEntry((ushort)addr, opCode, out var carryOn);
                _output.AddItem(item);
                addr = _offset;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Checks if the disassembler should enter into Spectrum-specific mode after
        /// the specified disassembly item.
        /// </summary>
        /// <param name="item">Item used to check the Spectrum-specific mode</param>
        /// <returns>
        /// True, to move to the Spectrum-specific mode; otherwise, false
        /// </returns>
        private bool ShouldEnterSpectrumSpecificMode(DisassemblyItem item)
        {
            // --- Check if we find flags for the bank of the disassembly item
            var bank = item.Address >> 14;

            if (!DisassemblyFlags.TryGetValue(bank, out var flags) ||
                flags == SpectrumSpecificDisassemblyFlags.None)
            {
                return(false);
            }

            // --- Check for Spectrum 48K RST #08
            if ((flags & SpectrumSpecificDisassemblyFlags.Spectrum48Rst08) != 0 &&
                item.OpCodes.Trim() == "CF")
            {
                _spectMode       = SpectrumSpecificMode.Spectrum48Rst08;
                item.HardComment = "(Report error)";
                return(true);
            }

            // --- Check for Spectrum 48K RST #28
            if ((flags & SpectrumSpecificDisassemblyFlags.Spectrum48Rst28) != 0 &&
                (item.OpCodes.Trim() == "EF" ||            // --- RST #28
                 item.OpCodes.Trim() == "CD 5E 33" ||      // --- CALL 335E
                 item.OpCodes.Trim() == "CD 62 33"))       // --- CALL 3362
            {
                _spectMode       = SpectrumSpecificMode.Spectrum48Rst28;
                _seriesCount     = 0;
                item.HardComment = "(Invoke Calculator)";
                return(true);
            }

            // --- Check for Spectrum 128K RST #28
            if ((flags & SpectrumSpecificDisassemblyFlags.Spectrum128Rst28) != 0 &&
                item.OpCodes.Trim() == "EF")
            {
                _spectMode       = SpectrumSpecificMode.Spectrum128Rst8;
                item.HardComment = "(Call Spectrum 48 ROM)";
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Disassembles the subsequent operation as Spectrum-specific
        /// </summary>
        /// <param name="carryOn">
        /// True, if the disassembler still remains in Spectrum-specific mode;
        /// otherwise, false
        /// </param>
        /// <returns>Disassembled operation</returns>
        private DisassemblyItem DisassembleSpectrumSpecificOperation(out bool carryOn)
        {
            if (_spectMode == SpectrumSpecificMode.None)
            {
                carryOn = false;
                return(null);
            }

            DisassemblyItem item = null;

            carryOn = false;

            // --- Handle Spectrum 48 Rst08
            if (_spectMode == SpectrumSpecificMode.Spectrum48Rst08)
            {
                // --- The next byte is the operation code
                var address   = (ushort)_offset;
                var errorCode = Fetch();
                _spectMode = SpectrumSpecificMode.None;
                item       = new DisassemblyItem(address)
                {
                    OpCodes     = $"{errorCode:X2}",
                    Instruction = $".defb #{errorCode:X2}",
                    HardComment = $"(error code: #{errorCode:X2})",
                    LastAddress = (ushort)(_offset - 1)
                };
            }

            // --- Handle Spectrum 48 Rst08
            if (_spectMode == SpectrumSpecificMode.Spectrum48Rst28)
            {
                var address  = (ushort)_offset;
                var calcCode = Fetch();
                item = DisassembleCalculatorEntry(address, calcCode, out carryOn);
            }

            if (!carryOn)
            {
                _spectMode = SpectrumSpecificMode.None;
            }
            return(item);
        }
Beispiel #5
0
        /// <summary>
        /// Disassembles the subsequent operation as Spectrum-specific
        /// </summary>
        /// <param name="carryOn">
        /// True, if the disassembler still remains in Spectrum-specific mode;
        /// otherwise, false
        /// </param>
        /// <returns>Disassembled operation</returns>
        private DisassemblyItem DisassembleSpectrumSpecificOperation(out bool carryOn)
        {
            if (_spectMode == SpectrumSpecificMode.None)
            {
                carryOn = false;
                return(null);
            }

            DisassemblyItem item = null;

            carryOn = false;

            // --- Handle Spectrum 48 RST #08
            if (_spectMode == SpectrumSpecificMode.Spectrum48Rst08)
            {
                // --- The next byte is the operation code
                var address   = (ushort)_offset;
                var errorCode = Fetch();
                _spectMode = SpectrumSpecificMode.None;
                item       = new DisassemblyItem(address)
                {
                    Instruction = $".defb #{errorCode:X2}",
                    HardComment = $"(error code: #{errorCode:X2})",
                    LastAddress = (ushort)(_offset - 1)
                };
            }

            // --- Handle Spectrum 48 RST #28
            if (_spectMode == SpectrumSpecificMode.Spectrum48Rst28)
            {
                var address  = (ushort)_offset;
                var calcCode = Fetch();
                item = DisassembleCalculatorEntry(address, calcCode, out carryOn);
            }

            // --- Handle Spectrum 128 RST #08
            if (_spectMode == SpectrumSpecificMode.Spectrum128Rst8)
            {
                // --- The next byte is the operation code
                var address     = (ushort)_offset;
                var callAddress = FetchWord();
                _spectMode = SpectrumSpecificMode.None;
                item       = new DisassemblyItem(address)
                {
                    Instruction = $".defw #{callAddress:X4}",
                    LastAddress = (ushort)(_offset - 1)
                };
                var provider = GetProvider <ISpectrum48RomLabelProvider>();
                var label    = provider?.GetSpectrum48Label(callAddress);
                if (label != null)
                {
                    item.HardComment = $"({label})";
                }
            }

            if (!carryOn)
            {
                _spectMode = SpectrumSpecificMode.None;
            }
            return(item);
        }