Cosmos/source/Cosmos.Debug.Kernel/Debugger.cs

406 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace Cosmos.Debug.Kernel
{
public class Debugger
{
public string mRing { get; set; }
public string mSection { get; set; }
public Debugger(string aRing, string aSection)
{
mRing = aRing;
mSection = aSection;
}
public void Break()
{
} // Plugged
private static unsafe void ActualSend(int aLength, char* aText)
{
} // Plugged
public void SendPtr(object aObject)
{
} // plugged
internal static void DoSendNumber(uint aNumber)
{
// plugged
}
internal static void DoSendNumber(int aNumber)
{
// plugged
}
internal static void DoSendNumber(ulong aNumber)
{
// plugged
}
internal static void DoSendNumber(long aNumber)
{
// plugged
}
internal static void DoSendNumber(float aNumber)
{
// plugged
}
internal static void DoSendNumber(double aNumber)
{
// plugged
}
public void SendNumber(uint aNumber)
{
DoSendNumber(aNumber);
}
public void SendNumber(int aNumber)
{
DoSendNumber(aNumber);
}
public void SendNumber(ulong aNumber)
{
DoSendNumber(aNumber);
}
public void SendNumber(long aNumber)
{
DoSendNumber(aNumber);
}
public void SendNumber(float aNumber)
{
DoSendNumber(aNumber);
}
public void SendNumber(double aNumber)
{
DoSendNumber(aNumber);
}
public unsafe void SendChannelCommand(byte aChannel, byte aCommand, byte[] aData)
{
fixed (byte* xPtr = &aData[0])
{
SendChannelCommand(aChannel, aCommand, aData.Length, xPtr);
}
}
public static unsafe void SendChannelCommand(byte aChannel, byte aCommand, int aByteCount, byte* aData)
{
//
}
public static unsafe void SendChannelCommand(byte aChannel, byte aCommand)
{
//
}
internal static void DoSend(string aText)
{
// plugged
}
public void Send(string aText)
{
DoSend(aText);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(string aText)
{
DoSend(aText);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(uint aNumber)
{
DoSendNumber(aNumber);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(int aNumber)
{
DoSendNumber(aNumber);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(ulong aNumber)
{
DoSendNumber(aNumber);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(long aNumber)
{
DoSendNumber(aNumber);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(float aNumber)
{
DoSendNumber(aNumber);
}
[Conditional("COSMOSDEBUG")]
public void SendInternal(double aNumber)
{
DoSendNumber(aNumber);
}
//public void OldSend(string aText) {
// // TODO: Need to fix this so it can send empty strings.
// // Sending empty strings locks it up right now
// if (aText.Length == 0)
// {
// return;
// }
// var xChars = aText.ToCharArray();
// fixed (char* xPtr = &xChars[0])
// {
// ActualSend(xChars.Length, xPtr);
// }
//}
public unsafe void SendMessageBox(int aLength, char* aText) { } // Plugged
public unsafe void SendMessageBox(string aText)
{
// TODO: Need to fix this so it can send empty strings.
// Sending empty strings locks it up right now
if (aText.Length == 0)
{
return;
}
var xChars = aText.ToCharArray();
fixed (char* xPtr = &xChars[0])
{
SendMessageBox(xChars.Length, xPtr);
}
}
// TODO: Kudzu repacement methods for Cosmos.HAL.DebugUtil
public unsafe void SendMessage(string aModule, string aData)
{
//string xSingleString;
//xSingleString = "Message Module: \"" + aModule + "\"";
//xSingleString += " Data: \"" + aData + "\"";
//Send(xSingleString);
DoSend("Message Module:");
DoSend(aModule);
DoSend("Data:");
DoSend(aData);
}
public unsafe void SendError(string aModule, string aData)
{
//string xSingleString;
//xSingleString = "Error Module: \"" + aModule + "\"";
//xSingleString += " Data: \"" + aData + "\"";
//Send(xSingleString);
}
public unsafe void SendNumber(string aModule, string aDescription, uint aNumber, byte aBits)
{
//string xSingleString;
//xSingleString = "Number Module: \"" + aModule + "\"";
//xSingleString += " Description: \"" + aDescription + "\"";
//xSingleString += " Number: \"" + CreateNumber(aNumber, aBits) + "\"";
}
public unsafe void WriteNumber(uint aNumber, byte aBits)
{
WriteNumber(aNumber, aBits, true);
}
public unsafe void WriteNumber(uint aNumber, byte aBits, bool aWritePrefix)
{
Send(CreateNumber(aNumber, aBits, aWritePrefix));
}
public unsafe string CreateNumber(uint aNumber, byte aBits)
{
return CreateNumber(aNumber, aBits, true);
}
public unsafe string CreateNumber(uint aNumber, byte aBits, bool aWritePrefix)
{
return "Cosmos.Debug.Debugger.CreateNumber(aNumber, aBits, aWritePrefix) not implemented";
//string xNumberString = null;
//uint xValue = aNumber;
//byte xCurrentBits = aBits;
//if (aWritePrefix)
//{
// xNumberString += "0x";
//}
//while (xCurrentBits >= 4)
//{
// xCurrentBits -= 4;
// byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF);
// string xDigitString = null;
// switch (xCurrentDigit)
// {
// case 0:
// xDigitString = "0";
// goto default;
// case 1:
// xDigitString = "1";
// goto default;
// case 2:
// xDigitString = "2";
// goto default;
// case 3:
// xDigitString = "3";
// goto default;
// case 4:
// xDigitString = "4";
// goto default;
// case 5:
// xDigitString = "5";
// goto default;
// case 6:
// xDigitString = "6";
// goto default;
// case 7:
// xDigitString = "7";
// goto default;
// case 8:
// xDigitString = "8";
// goto default;
// case 9:
// xDigitString = "9";
// goto default;
// case 10:
// xDigitString = "A";
// goto default;
// case 11:
// xDigitString = "B";
// goto default;
// case 12:
// xDigitString = "C";
// goto default;
// case 13:
// xDigitString = "D";
// goto default;
// case 14:
// xDigitString = "E";
// goto default;
// case 15:
// xDigitString = "F";
// goto default;
// default:
// xNumberString += xDigitString;
// break;
// }
//}
//return xNumberString;
}
public unsafe void WriteBinary(string aModule, string aMessage, byte[] aValue)
{
WriteBinary(aModule, aMessage, aValue, 0, aValue.Length);
}
public unsafe void WriteBinary(string aModule, string aMessage, byte[] aValue, int aIndex, int aLength)
{
//string xSingleString;
//xSingleString = "Binary Module = \"" + aModule + "\"";
//xSingleString += " Message = " + aMessage + "\"";
//xSingleString += " Value = \"";
//for (int i = 0; i < aLength; i++)
//{
// xSingleString += CreateNumber(aValue[aIndex + i], 8, false);
//}
//xSingleString += "\"";
//Send(xSingleString);
}
public unsafe void WriteBinary(string aModule, string aMessage, byte* aValue, int aIndex, int aLength)
{
//string xSingleString;
//xSingleString = "Binary Module = \"" + aModule + "\"";
//xSingleString += " Message = " + aMessage + "\"";
//xSingleString += " Value = \"";
//for (int i = 0; i < aLength; i++)
//{
// xSingleString += CreateNumber(aValue[aIndex + i], 8, false);
//}
//xSingleString += "\"";
//Send(xSingleString);
}
public unsafe void ViewMemory()
{
ViewMemory(0);
}
public unsafe void ViewMemory(int addr)
{
//while (true) {
// Console.Clear();
// Console.WriteLine();
// for (int j = 0; j < 20; j++) {
// int line = addr + j * 16;
// Console.Write(line.ToHex(8));
// Console.Write(": ");
// for (int i = 0; i < 16; i++) {
// if (i == 8) Console.Write(" ");
// Console.Write((*(byte*)(line + i)).ToHex(2) + " ");
// }
// Console.Write(" ");
// for (int i = 0; i < 16; i++) {
// byte b = (*(byte*)(line + i));
// if (i == 8) Console.Write(" ");
// if (b < 32 || b > 127)
// Console.Write(".");
// else
// Console.Write((char)b);
// }
// Console.WriteLine();
// }
// Console.WriteLine();
// Console.Write("Enter Hex Address (q to quit): ");
// string s = Console.ReadLine();
// if (s == "q")
// break;
// addr = FromHex(s);
//}
}
private int FromHex(string p)
{
p = p.ToLower();
string hex = "0123456789abcdef";
int ret = 0;
for (int i = 0; i < p.Length; i++)
{
ret = ret * 16 + hex.IndexOf(p[i]);
}
return ret;
}
}
}