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."); } }
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}"); } }