Пример #1
0
        private string FormatByteValueAsSingleNumber(AlignedIORequest rq)
        {
            StringBuilder result = new StringBuilder();

            result.Append("0x");
            for (int i = 0; i < rq.ByteCount; i++)
            {
                result.Append($"{rq.Buffer[rq.BufferOffset + rq.ByteCount - i - 1]:x2}");
            }
            return(result.ToString());
        }
Пример #2
0
        private void ProcessRequestOutput(ref AlignedIORequest request, string[] output, int firstLine, int lineCount)
        {
            if (request.Direction == LiveMemoryIODirection.Write)
            {
                string error = null;
                for (int i = 0; i < lineCount; i++)
                {
                    if (output[firstLine + 1].StartsWith("Error:"))
                    {
                        error = output[firstLine + 1];
                        break;
                    }
                }

                if (error == null)
                {
                    request.Complete(request.WordCount, null);
                }
                else
                {
                    request.Complete(0, error);
                }
            }
            else
            {
                int bytesDone = 0;

                for (int i = 0; i < lineCount; i++)
                {
                    string line = output[firstLine + i];
                    int    idx  = line.IndexOf(':');
                    if (idx == -1)
                    {
                        request.Complete(0, line);
                        return;
                    }

                    if (!ulong.TryParse(line.Substring(0, idx).Trim(), System.Globalization.NumberStyles.HexNumber, null, out var address))
                    {
                        request.Complete(0, "Invalid address output: " + line);
                        return;
                    }

                    if (address != (request.Address + (uint)bytesDone))
                    {
                        throw new Exception($"Mismatching address (expected 0x{request.Address + (uint)bytesDone:x8}: {line})");
                    }

                    while (bytesDone < request.ByteCount)
                    {
                        idx++;
                        while (idx < line.Length && line[idx] == ' ')
                        {
                            idx++;
                        }

                        if (idx >= (line.Length - 2))
                        {
                            break;
                        }

                        if (!byte.TryParse(line.Substring(idx, 2), System.Globalization.NumberStyles.HexNumber, null, out var byteValue))
                        {
                            request.Complete(0, "Invalid output: " + line);
                            return;
                        }

                        idx += 2;
                        request.Buffer[request.BufferOffset + bytesDone++] = byteValue;
                    }
                }

                if (bytesDone == request.ByteCount || ((request.Direction == LiveMemoryIODirection.PartialRead) && bytesDone > 0))
                {
                    request.Complete((uint)bytesDone / request.WordSize, null);
                }
                else
                {
                    request.Complete(0, $"Failed to read memory at 0x{request.Address:x8}");
                }
            }
        }