Esempio n. 1
0
        protected (FSRIndexedMode indMode, Expression memPtr) GetDataAbsAddress(MachineOperand opernd)
        {
            switch (opernd)
            {
            case PICOperandDataMemoryAddress absmem:
                if (absmem.DataTarget == PICDataAddress.Invalid)
                {
                    throw new InvalidOperationException($"Invalid data absolute address operand.");
                }

                if (PICRegisters.TryGetRegister(absmem.DataTarget, out var sfrReg))
                {
                    if (sfrReg != PICRegisterStorage.None)
                    {
                        var imode = PICRegisters.IndirectOpMode(sfrReg, out PICRegisterStorage fsr);
                        if (imode != FSRIndexedMode.None)
                        {
                            return(imode, binder.EnsureRegister(fsr));
                        }
                        return(imode, binder.EnsureRegister(sfrReg));
                    }
                }
                return(FSRIndexedMode.None, DataMem8(PICDataAddress.Ptr(absmem.DataTarget)));

            default:
                throw new InvalidOperationException($"Invalid data absolute address operand.");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Attempts to get a <see cref="RegisterStorage"/> from its name.
        /// </summary>
        /// <param name="regName">Name of the register.</param>
        /// <param name="reg">[out] The register.</param>
        /// <returns>
        /// True if it succeeds, false if it fails.
        /// </returns>
        public override bool TryGetRegister(string regName, out RegisterStorage reg)
        {
            var res = PICRegisters.TryGetRegister(regName, out var preg);

            reg = preg;
            return(res);
        }
Esempio n. 3
0
        protected override void DoRender(MachineInstructionRenderer renderer, MachineInstructionRendererOptions options)
        {
            renderer.WriteMnemonic(Mnemonic.ToString());
            renderer.Tab();

            switch (Operands[0])
            {
            case PICOperandDataMemoryAddress srcmem:
                if (PICRegisters.TryGetRegister(srcmem.DataTarget, out var srcreg))
                {
                    renderer.WriteString($"{srcreg.Name}");
                }
                else
                {
                    srcmem.Render(renderer, options);
                }
                break;

            case PICOperandFSRIndexation srcidx:
                if (srcidx.Mode != FSRIndexedMode.FSR2INDEXED)
                {
                    throw new InvalidOperationException($"Invalid FSR2 indexing mode: {srcidx.Mode}.");
                }
                renderer.WriteString($"[0x{srcidx.Offset.ToUInt16():X2}]");
                break;
            }

            renderer.WriteString(",");

            switch (Operands[1])
            {
            case PICOperandDataMemoryAddress dstmem:
                if (PICRegisters.TryGetRegister(dstmem.DataTarget, out var dstreg))
                {
                    renderer.WriteString($"{dstreg.Name}");
                }
                else
                {
                    dstmem.Render(renderer, options);
                }
                break;

            case PICOperandFSRIndexation dstidx:
                if (dstidx.Mode != FSRIndexedMode.FSR2INDEXED)
                {
                    throw new InvalidOperationException($"Invalid FSR2 indexing mode: {dstidx.Mode}.");
                }
                renderer.WriteString($"[0x{dstidx.Offset.ToUInt16():X2}]");
                break;
            }
        }
Esempio n. 4
0
        public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            writer.WriteOpcode(Opcode.ToString());
            writer.Tab();

            switch (op1)
            {
            case PICOperandDataMemoryAddress srcmem:
                if (PICRegisters.TryGetRegister(srcmem.DataTarget, out var srcreg))
                {
                    writer.WriteString($"{srcreg.Name}");
                }
                else
                {
                    srcmem.Write(writer, options);
                }
                break;

            case PICOperandFSRIndexation srcidx:
                if (srcidx.Mode != FSRIndexedMode.FSR2INDEXED)
                {
                    throw new InvalidOperationException($"Invalid FSR2 indexing mode: {srcidx.Mode}.");
                }
                writer.WriteString($"[{srcidx.Offset:X2}]");
                break;
            }

            writer.WriteString(",");

            switch (op2)
            {
            case PICOperandDataMemoryAddress dstmem:
                if (PICRegisters.TryGetRegister(dstmem.DataTarget, out var dstreg))
                {
                    writer.WriteString($"{dstreg.Name}");
                }
                else
                {
                    dstmem.Write(writer, options);
                }
                break;

            case PICOperandFSRIndexation dstidx:
                if (dstidx.Mode != FSRIndexedMode.FSR2INDEXED)
                {
                    throw new InvalidOperationException($"Invalid FSR2 indexing mode: {dstidx.Mode}.");
                }
                writer.WriteString($"[{dstidx.Offset:X2}]");
                break;
            }
        }
Esempio n. 5
0
        /// <summary>
        /// Loads the PIC registers, as found in the PIC definition, into the registers symbol table.
        /// </summary>
        /// <param name="registersSymTable">The registers symbol table interface.</param>
        /// <param name="pic">the PIC definition.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="registersSymTable"/> is
        ///                                         null.</exception>
        protected void LoadRegistersInTable(IPICRegisterSymTable registersSymTable, IPICDescriptor pic)
        {
            if (pic == null)
            {
                throw new ArgumentNullException(nameof(pic));
            }
            symTable  = registersSymTable ?? throw new ArgumentNullException(nameof(registersSymTable));
            regNumber = 0;

            foreach (var sfr in pic.SFRs)
            {
                var reg = AddSFRRegister(sfr, regNumber);
                regNumber++;
                symTable.AddRegister(reg);
            }
            foreach (var jsfr in pic.JoinedRegisters)
            {
                var subregs = new List <PICRegisterStorage>();
                bitRegAddr = 0;
                foreach (var sfr in jsfr.ChildSFRs)
                {
                    if (!PICRegisters.TryGetRegister(sfr.Name, out var creg))
                    {
                        creg = AddSFRRegister(sfr, regNumber++);
                    }
                    creg.BitAddress = bitRegAddr;
                    subregs.Add(creg);
                    bitRegAddr += 8;
                }
                if (subregs.Count > 0)
                {
                    var sfr = new PICRegisterStorage(jsfr, regNumber, subregs);
                    if (symTable.AddRegister(sfr))
                    {
                        regNumber++;
                    }
                }
            }
        }