name: str
value: int = None
- def __new__(cls, iterable):
- dynamic_cls = cls.DynamicOperand
- static_cls = cls.StaticOperand
+ @_dataclasses.dataclass(eq=True, frozen=True)
+ class DynamicOperandTargetAddrIForm(DynamicOperand):
+ def disassemble(self, value, record):
+ return hex(int(_selectconcat(
+ value[record.fields["LI"]],
+ _SelectableInt(value=0b00, bits=2))))
+
+ class DynamicOperandTargetAddrBForm(DynamicOperand):
+ def disassemble(self, value, record):
+ return hex(int(_selectconcat(
+ value[record.fields["BD"]],
+ _SelectableInt(value=0b00, bits=2))))
+
+ def __new__(cls, insn, iterable):
+ branches = {
+ "b": {"target_addr": cls.DynamicOperandTargetAddrIForm},
+ "ba": {"target_addr": cls.DynamicOperandTargetAddrIForm},
+ "bl": {"target_addr": cls.DynamicOperandTargetAddrIForm},
+ "bla": {"target_addr": cls.DynamicOperandTargetAddrIForm},
+ "bc": {"target_addr": cls.DynamicOperandTargetAddrBForm},
+ "bca": {"target_addr": cls.DynamicOperandTargetAddrBForm},
+ "bcl": {"target_addr": cls.DynamicOperandTargetAddrBForm},
+ "bcla": {"target_addr": cls.DynamicOperandTargetAddrBForm},
+ }
operands = []
for operand in iterable:
+ dynamic_cls = cls.DynamicOperand
+ static_cls = cls.StaticOperand
+
if "=" in operand:
(name, value) = operand.split("=")
operand = static_cls(name=name, value=int(value))
else:
+ if insn in branches and operand in branches[insn]:
+ dynamic_cls = branches[insn][operand]
operand = dynamic_cls(name=operand)
+
operands.append(operand)
return super().__new__(cls, operands)
(dynamic, *static) = desc.regs
operands.extend(dynamic)
operands.extend(static)
- db[name] = Operands(iterable=operands)
+ db[name] = Operands(insn=name, iterable=operands)
self.__db = db
return super().__init__()