diff --git a/NitroDebugger.UnitTests/PacketTypesTest.cs b/NitroDebugger.UnitTests/PacketTypesTest.cs index d1bd085..4053033 100644 --- a/NitroDebugger.UnitTests/PacketTypesTest.cs +++ b/NitroDebugger.UnitTests/PacketTypesTest.cs @@ -244,7 +244,20 @@ namespace UnitTests [Test] public void FactoryRegistersReply() { - Register[] expected = new Register[] { + Register[] expected = CreateRegisters(); + byte[] binRegisters = CreateNetworkRegisters(); + string regString = BitConverter.ToString(binRegisters).Replace("-", ""); + + ReadRegisters readRegisters = new ReadRegisters(); + ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters); + + Assert.IsInstanceOf(reply); + Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters()); + } + + private Register[] CreateRegisters() + { + return new Register[] { new Register(RegisterType.R0, 0), new Register(RegisterType.R1, 1), new Register(RegisterType.R2, 2), new Register(RegisterType.R3, 3), new Register(RegisterType.R4, 4), new Register(RegisterType.R5, 5), @@ -255,7 +268,11 @@ namespace UnitTests new Register(RegisterType.SP, 14), new Register(RegisterType.PC, 15), new Register(RegisterType.CPSR, 255) }; - byte[] binRegisters = new byte[] { + } + + private byte[] CreateNetworkRegisters() + { + return new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, @@ -281,13 +298,19 @@ namespace UnitTests // CPSR 0xFF, 0x0, 0x0, 0x00 }; - string regString = BitConverter.ToString(binRegisters).Replace("-", ""); + } - ReadRegisters readRegisters = new ReadRegisters(); - ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters); + [Test] + public void CreateWriteRegistersCommand() + { + Register[] registers = CreateRegisters(); + string networkRegisters = BitConverter.ToString(CreateNetworkRegisters()); + networkRegisters = networkRegisters.Replace("-", ""); - Assert.IsInstanceOf(reply); - Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters()); + WriteRegisters cmd = null; + Assert.DoesNotThrow(() => cmd = new WriteRegisters(registers)); + Assert.AreEqual("G", cmd.Command); + Assert.AreEqual("G" + networkRegisters, cmd.Pack()); } } } diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index ce7ffc4..b2347ca 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -79,6 +79,7 @@ + diff --git a/NitroDebugger/RSP/Packets/WriteRegisters.cs b/NitroDebugger/RSP/Packets/WriteRegisters.cs new file mode 100644 index 0000000..91951bd --- /dev/null +++ b/NitroDebugger/RSP/Packets/WriteRegisters.cs @@ -0,0 +1,74 @@ +// +// WriteRegisters.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Linq; +using System.Text; + +namespace NitroDebugger.RSP.Packets +{ + public class WriteRegisters : CommandPacket + { + private Register[] registers; + + public WriteRegisters(Register[] registers) + : base("G") + { + if (registers.Length != 17) + throw new ArgumentException("Invalid number of registers"); + + if (Enumerable.Range(0, 16).Any(i => registers[i].Type != (RegisterType)i) || + registers[16].Type != RegisterType.CPSR) + throw new ArgumentException("Invalid registers"); + + this.registers = registers; + } + + public Register[] GetRegisters() + { + return this.registers; + } + + protected override string PackArguments() + { + StringBuilder args = new StringBuilder(); + for (int i = 0; i < 16; i++) + args.AppendFormat("{0:08}", RegisterDataToString(registers[i])); + + // Floating point registers, not used but sent + args.Append(new String('0', 192)); + + // Floating point status registers, not used but sent + args.Append(new String('0', 8)); + + // CPRS + args.AppendFormat("{0:04}", RegisterDataToString(registers[16])); + + return args.ToString(); + } + + private string RegisterDataToString(Register reg) + { + return BitConverter.ToString(BitConverter.GetBytes(reg.Value)) + .Replace("-", ""); + } + } +} +