private static (ImmutableList <Operand> loadOps, ImmutableList <Operand> storeOps) ReadOperands(MemoryScanner scanner, OpcodeDescriptor opcode) { var loadOpsBuilder = ImmutableList.CreateBuilder <Operand>(); var storeOpsBuilder = ImmutableList.CreateBuilder <Operand>(); var count = opcode.OperandCount; if (count > 0) { var typesLength = count / 2; if (count % 2 != 0) { typesLength++; } var dataScanner = scanner.Memory.CreateScanner(scanner.Address + typesLength); for (int i = 0; i < count; i += 2) { var opsBuilder = opcode.OperandKinds[i] == OperandKind.Load ? loadOpsBuilder : storeOpsBuilder; var typeByte = scanner.NextByte(); var type = (byte)(typeByte & 0x0f); var operand = ReadOperand(dataScanner, type); opsBuilder.Add(operand); if (i + 1 < count) { opsBuilder = opcode.OperandKinds[i + 1] == OperandKind.Load ? loadOpsBuilder : storeOpsBuilder; type = (byte)(typeByte >> 4); operand = ReadOperand(dataScanner, type); opsBuilder.Add(operand); } } scanner.SetAddress(dataScanner.Address); } return(loadOpsBuilder.ToImmutable(), storeOpsBuilder.ToImmutable()); }