Esempio n. 1
0
        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());
        }