Skip to content

Commit

Permalink
Merge pull request #609 from mbbsemu/debug-fixes
Browse files Browse the repository at this point in the history
Debug & Crash Report Fixes
  • Loading branch information
paladine authored Dec 28, 2023
2 parents 808a227 + dd9643f commit 1faca83
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 26 deletions.
65 changes: 65 additions & 0 deletions MBBSEmu.Tests/Extensions/ReadOnlySpanExtensions_Tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using Xunit;
using MBBSEmu.Extensions;
using System;

namespace MBBSEmu.Tests.Extensions
{
/// <summary>
/// Unit Tests for MBBSEmu's Extension Class for ReadOnlySpan
/// </summary>
public class ReadOnlySpanExtensionsTests
{
[Fact]
public void ToCharSpanTest()
{
ReadOnlySpan<byte> input = new byte[] { 65, 66, 67 };
ReadOnlySpan<char> expected = new char[] { 'A', 'B', 'C' };
var result = input.ToCharSpan();
Assert.Equal(expected.ToArray(), result.ToArray());
}

[Fact]
public void ContainsOnlyTest()
{
ReadOnlySpan<byte> input = new byte[] { 1, 1, 1 };
var result = input.ContainsOnly(1);
Assert.True(result);
}

[Fact]
public void ContainsOnlyTest_False()
{
ReadOnlySpan<byte> input = new byte[] { 1, 2, 1 };
var result = input.ContainsOnly(1);
Assert.False(result);
}

[Fact]
public void ToHexStringTest()
{
ReadOnlySpan<byte> input = new byte[] { 1, 2, 3, 4, 5 };
var result = input.ToHexString(0, 5);

Assert.Contains("5 bytes, 0x0000 -> 0x0005", result);
Assert.Contains("0000 [ 01 02 03 04 05", result);
Assert.DoesNotContain("No Data to Display", result);
Assert.DoesNotContain("Invalid Address Range", result);
}

[Fact]
public void ToHexStringTest_ZeroLength()
{
ReadOnlySpan<byte> input = new byte[] { 1, 2, 3, 4, 5 };
var result = input.ToHexString(0, 0);
Assert.Contains("No Data to Display", result);
}

[Fact]
public void ToHexStringTest_InvalidLength()
{
ReadOnlySpan<byte> input = new byte[] { 1, 2, 3, 4, 5 };
var result = input.ToHexString(0, 6);
Assert.Contains("Invalid Address Range", result);
}
}
}
1 change: 1 addition & 0 deletions MBBSEmu/CPU/CPUCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,7 @@ public void Tick()
{
_showDebug = true; //Set to log Register values to console after execution
_logger.Debug($"{Registers.CS:X4}:{_currentInstruction.IP16:X4} {_currentInstruction}");
_logger.Debug($"{Registers}");
}
else
{
Expand Down
23 changes: 1 addition & 22 deletions MBBSEmu/CPU/CpuRegisters.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Iced.Intel;
using MBBSEmu.Memory;
using System;
using System.Text;

namespace MBBSEmu.CPU
{
Expand Down Expand Up @@ -97,27 +96,7 @@ public void SetPointer(FarPtr ptr)
/// <returns></returns>
public override string ToString()
{
var output = new StringBuilder();

output.Append($"AX={this.AX:X4} ");
output.Append($"BX={this.BX:X4} ");
output.Append($"CX={this.CX:X4} ");
output.Append($"DX={this.DX:X4} ");
output.Append($"DS={this.DS:X4} ");
output.AppendLine($"ES={this.ES:X4} ");
output.Append($"SI={this.SI:X4} ");
output.Append($"DI={this.DI:X4} ");
output.Append($"SS={this.SS:X4} ");
output.Append($"IP={this.IP:X4} ");
output.Append($"SP={this.SP:X4} ");
output.AppendLine($"BP={this.BP:X4} ");
output.Append("F=");
output.Append(this.CarryFlag ? "C" : "c");
output.Append(this.ZeroFlag ? "Z" : "z");
output.Append(this.SignFlag ? "S" : "s");
output.Append(this.OverflowFlag ? "O" : "o");

return output.ToString();
return Registers.ToString();
}
}
}
30 changes: 30 additions & 0 deletions MBBSEmu/CPU/RegistersStructs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using MBBSEmu.Memory;
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace MBBSEmu.CPU
{
Expand Down Expand Up @@ -506,5 +507,34 @@ public void FromRegs(ReadOnlySpan<byte> regs)
DI = BitConverter.ToUInt16(regs.Slice(10, 2));
SetF(BitConverter.ToUInt16(regs.Slice(14, 2)));
}

/// <summary>
/// Override of .ToString() to display all register values
/// </summary>
/// <returns></returns>
public override string ToString()
{
var output = new StringBuilder();

output.Append($"AX={this.AX:X4} ");
output.Append($"BX={this.BX:X4} ");
output.Append($"CX={this.CX:X4} ");
output.Append($"DX={this.DX:X4} ");
output.Append($"DS={this.DS:X4} ");
output.AppendLine($"ES={this.ES:X4} ");
output.Append($"SI={this.SI:X4} ");
output.Append($"DI={this.DI:X4} ");
output.Append($"SS={this.SS:X4} ");
output.Append($"IP={this.IP:X4} ");
output.Append($"SP={this.SP:X4} ");
output.AppendLine($"BP={this.BP:X4} ");
output.Append("F=");
output.Append(this.CarryFlag ? "C" : "c");
output.Append(this.ZeroFlag ? "Z" : "z");
output.Append(this.SignFlag ? "S" : "s");
output.Append(this.OverflowFlag ? "O" : "o");

return output.ToString();
}
}
}
14 changes: 12 additions & 2 deletions MBBSEmu/Extensions/ReadOnlySpanExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static bool ContainsOnly(this ReadOnlySpan<byte> readOnlySpan, byte value
}

/// <summary>
/// Creates a human readable hex string from a ReadOnlySpan of bytes
/// Creates a human-readable hex string from a ReadOnlySpan of bytes
///
/// The header contains the total number of bytes, the start and end address
/// as well as columns for each byte within an 8-bit boundary.
Expand All @@ -49,12 +49,22 @@ public static string ToHexString(this ReadOnlySpan<byte> readOnlySpan, ushort st
output.AppendLine(new string('-', 73));

//Handle Zero Length
if (length == 0)
if (length <= 0)
{
output.AppendLine("No Data to Display");
return output.ToString();
}

//Handle Invalid Length
if (start + length > readOnlySpan.Length)
{
output.AppendLine("Invalid Address Range");
output.AppendLine($"Total Length: {readOnlySpan.Length} bytes");
output.AppendLine($"Start: {start}");
output.AppendLine($"Length: {length}");
return output.ToString();
}

output.Append(" ");
for (var i = 0; i < 0x10; i++)
{
Expand Down
2 changes: 1 addition & 1 deletion MBBSEmu/HostProcess/ExportedModules/Majorbbs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6130,7 +6130,7 @@ private void tokopt()
{
tokenList.Add(Module.Memory.GetString(messagePointer).ToArray());
}
catch (Exception e)
catch
{
_logger.Warn($"Error Reading string at {messagePointer}, terminating list at {tokenList.Count} elements");
break;
Expand Down
2 changes: 1 addition & 1 deletion MBBSEmu/Module/CrashReport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public string Save(string fileName = "")

//Registers
crashReportVariables.Add(_registers.ToString());
crashReportVariables.Add(_moduleToReport.Memory.GetMemorySegment(0).Slice(_registers.BP, (_registers.BP - _registers.SP))
crashReportVariables.Add(_moduleToReport.Memory.GetMemorySegment(0)
.ToHexString(_registers.BP, (ushort)(_registers.BP - _registers.SP)));

var crashTemplate = new ResourceManager().GetString("MBBSEmu.Assets.crashReportTemplate.txt");
Expand Down

0 comments on commit 1faca83

Please sign in to comment.