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}"); } }
protected override void DoRender(MachineInstructionRenderer renderer, MachineInstructionRendererOptions options) { var memop = Operands[0] as PICOperandBankedMemory ?? throw new InvalidOperationException($"Invalid memory operand: {Operands[0]}"); renderer.WriteMnemonic(Mnemonic.ToString()); renderer.Tab(); var bankmem = PICMemoryDescriptor.CreateBankedAddr(memop); if (PICRegisters.TryGetAlwaysAccessibleRegister(bankmem, out var reg)) { renderer.WriteString($"{reg.Name}"); } else { Operands[0].Render(renderer, options); } }
public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options) { var memop = op1 as PICOperandBankedMemory ?? throw new InvalidOperationException($"Invalid memory operand: {op1}"); writer.WriteOpcode(Opcode.ToString()); writer.Tab(); var bankmem = PICMemoryDescriptor.CreateBankedAddr(memop); if (PICRegisters.TryGetAlwaysAccessibleRegister(bankmem, out var reg)) { writer.WriteString($"{reg.Name}"); } else { op1.Write(writer, options); } }
protected override void DoRender(MachineInstructionRenderer renderer, MachineInstructionRendererOptions options) { var bankmem = Operands[0] as PICOperandBankedMemory ?? throw new InvalidOperationException($"Invalid memory operand: {Operands[0]}"); var bitno = Operands[1] as PICOperandMemBitNo ?? throw new InvalidOperationException($"Invalid bit number operand: {Operands[1]}"); renderer.WriteMnemonic(Mnemonic.ToString()); renderer.Tab(); if (PICRegisters.TryGetAlwaysAccessibleRegister(bankmem.Offset, out var reg)) { renderer.WriteString($"{reg.Name}"); renderer.WriteString(","); if (PICRegisters.TryGetBitField(reg, out var fld, bitno.BitNo, 1)) { renderer.WriteString($"{fld.Name}"); } else { bitno.Render(renderer, options); } return; }
public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options) { var bankmem = op1 as PICOperandBankedMemory ?? throw new InvalidOperationException($"Invalid memory operand: {op1}"); var bitno = op2 as PICOperandMemBitNo ?? throw new InvalidOperationException($"Invalid bit number operand: {op2}"); writer.WriteOpcode(Opcode.ToString()); writer.Tab(); if (PICRegisters.TryGetAlwaysAccessibleRegister(bankmem.Offset, out var reg)) { writer.WriteString($"{reg.Name}"); writer.WriteString(","); if (PICRegisters.TryGetBitField(reg, out var fld, bitno.BitNo, 1)) { writer.WriteString($"{fld.Name}"); } else { bitno.Write(writer, options); } return; }