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