コード例 #1
0
ファイル: PICRewriter.cs プロジェクト: smx-smx/reko
        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.");
            }
        }
コード例 #2
0
ファイル: PICRewriter.cs プロジェクト: smx-smx/reko
        protected virtual (FSRIndexedMode indMode, Expression memPtr) GetMemFileAccess(MachineOperand opernd)
        {
            switch (opernd)
            {
            case PICOperandBankedMemory bnkmem:
                var offset = bnkmem.Offset;
                if (PICRegisters.TryGetAlwaysAccessibleRegister(offset, out var regsrc))
                {
                    var srciopr = PICRegisters.IndirectOpMode(regsrc, out PICRegisterStorage indsrcreg);
                    if (srciopr != FSRIndexedMode.None)
                    {
                        return(srciopr, binder.EnsureRegister(indsrcreg));
                    }
                    return(FSRIndexedMode.None, binder.EnsureRegister(regsrc));
                }
                return(FSRIndexedMode.None, DataBankMem8(Bsr, Constant.Byte(offset)));

            case PICOperandRegister reg:
                var iopr = PICRegisters.IndirectOpMode(reg.Register, out PICRegisterStorage indreg);
                if (iopr != FSRIndexedMode.None)
                {
                    return(iopr, binder.EnsureRegister(indreg));
                }
                return(iopr, binder.EnsureRegister(reg.Register));

            default:
                throw new InvalidOperationException($"Invalid PIC instruction's memory operand: {opernd}");
            }
        }