mirror of
https://github.com/pleonex/NitroDebugger.git
synced 2025-06-19 05:35:32 -04:00
Implements Write Registers command for #12
This commit is contained in:
parent
145c75a0b3
commit
8830ed37a7
@ -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<RegistersReply>(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<RegistersReply>(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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -79,6 +79,7 @@
|
||||
<Compile Include="RSP\Packets\ReadRegisters.cs" />
|
||||
<Compile Include="RSP\Packets\RegistersReply.cs" />
|
||||
<Compile Include="Register.cs" />
|
||||
<Compile Include="RSP\Packets\WriteRegisters.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<ItemGroup>
|
||||
|
74
NitroDebugger/RSP/Packets/WriteRegisters.cs
Normal file
74
NitroDebugger/RSP/Packets/WriteRegisters.cs
Normal file
@ -0,0 +1,74 @@
|
||||
//
|
||||
// WriteRegisters.cs
|
||||
//
|
||||
// Author:
|
||||
// Benito Palacios Sánchez <benito356@gmail.com>
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
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("-", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user