Cosmos/source2/Compiler/Cosmos.Compiler.DebugStub/CmdSend.cs
kudzu_cp 48622a9f56
2012-07-10 18:35:30 +00:00

182 lines
9.8 KiB
C#

using System;
using System.Linq;
using Cosmos.Assembler;
using Cosmos.Assembler.x86;
namespace Cosmos.Debug.DebugStub {
public class CmdSend : Cosmos.Assembler.Code {
public CmdSend(Assembler.Assembler aAssembler) : base(aAssembler) {}
public override void Assemble() {
new Comment("X#: Group DebugStub");
new Comment("X#: procedure SendRegisters {");
new LiteralAssemblerCode("DebugStub_SendRegisters:");
new LiteralAssemblerCode("; Send the actual started signal");
new Comment("X#: AL = #Ds2Vs_Registers");
new LiteralAssemblerCode("Mov AL, DebugStub_Const_Ds2Vs_Registers");
new Comment("X#: ComWriteAL()");
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
new Comment("X#: ESI = .PushAllPtr");
new LiteralAssemblerCode("Mov ESI, [DebugStub_PushAllPtr]");
new Comment("X#: ECX = 32");
new LiteralAssemblerCode("Mov ECX, 32");
new Comment("X#: ComWriteX()");
new LiteralAssemblerCode("Call DebugStub_ComWriteX");
new Comment("X#: ESI = @.CallerESP");
new LiteralAssemblerCode("Mov ESI, DebugStub_CallerESP");
new Comment("X#: ComWrite32()");
new LiteralAssemblerCode("Call DebugStub_ComWrite32");
new Comment("X#: ESI = @.CallerEIP");
new LiteralAssemblerCode("Mov ESI, DebugStub_CallerEIP");
new Comment("X#: ComWrite32()");
new LiteralAssemblerCode("Call DebugStub_ComWrite32");
new Comment("X#: }");
new LiteralAssemblerCode("DebugStub_SendRegisters_Exit:");
new LiteralAssemblerCode("Ret");
new LiteralAssemblerCode("; procedure SendFrame2 {");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Frame");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; EAX = 32");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAX\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; ESI = CallerEBP.Value");
new LiteralAssemblerCode("; ESI.Add(8) // Dont transmit EIP or old EBP");
new LiteralAssemblerCode("; ECX = 32");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteX\")");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendStack2 {");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Stack");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // Send size of bytes");
new LiteralAssemblerCode("; ESI = CallerESP.Value");
new LiteralAssemblerCode("; EAX = CallerEBP.Value");
new LiteralAssemblerCode("; EAX.Sub(ESI)");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAX\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // Send actual bytes");
new LiteralAssemblerCode("; //");
new LiteralAssemblerCode("; // Need to reload ESI, WriteAXToCompPort modifies it");
new LiteralAssemblerCode("; ESI = CallerESP.Value");
new LiteralAssemblerCode("; Label = \".SendByte\"");
new LiteralAssemblerCode("; ESI.Compare(CallerEBP.Value)");
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Exit\")");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
new LiteralAssemblerCode("; Jump(\".SendByte\")");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendMethodContext2 {");
new LiteralAssemblerCode("; // sends a stack value");
new LiteralAssemblerCode("; // Serial Params:");
new LiteralAssemblerCode("; // 1: x32 - offset relative to EBP");
new LiteralAssemblerCode("; // 2: x32 - size of data to send");
new LiteralAssemblerCode("; [XSharp(PreserveStack = true)]");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.MethodContext");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // offset relative to ebp");
new LiteralAssemblerCode("; // size of data to send");
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
new LiteralAssemblerCode("; ECX = EAX");
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
new LiteralAssemblerCode("; // EAX contains relative to EBP");
new LiteralAssemblerCode("; ESI = CallerEBP.Value");
new LiteralAssemblerCode("; ESI.Add(EAX) //TODO: ESI = ESI + EAX");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Label = \".SendByte\"");
new LiteralAssemblerCode("; ECX.Compare(0)");
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".AfterSendByte\")");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
new LiteralAssemblerCode("; ECX--");
new LiteralAssemblerCode("; Jump(\".SendByte\")");
new LiteralAssemblerCode("; Label = \".AfterSendByte\"");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendMemory2 {");
new LiteralAssemblerCode("; // sends a stack value");
new LiteralAssemblerCode("; // Serial Params:");
new LiteralAssemblerCode("; // 1: x32 - offset relative to EBP");
new LiteralAssemblerCode("; // 2: x32 - size of data to send");
new LiteralAssemblerCode("; [XSharp(PreserveStack = true)]");
new LiteralAssemblerCode("; procedure");
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
new LiteralAssemblerCode("; ECX = EAX");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.MemoryData");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
new LiteralAssemblerCode("; ESI = EAX");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
new LiteralAssemblerCode("; // ESI contains address");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Label = \"DebugStub_SendMemory_SendByte\"");
new LiteralAssemblerCode("; new Compare { DestinationReg = Registers.ECX, SourceValue = 0 }");
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \"DebugStub_SendMemory_After_SendByte\")");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
new LiteralAssemblerCode("; ECX--");
new LiteralAssemblerCode("; Jump(\"DebugStub_SendMemory_SendByte\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Label = \"DebugStub_SendMemory_After_SendByte\"");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendTrace2 {");
new LiteralAssemblerCode("; // Modifies: EAX, ESI");
new LiteralAssemblerCode("; DebugStatus.Value.Compare(Status.Run)");
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Normal\")");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.BreakPoint");
new LiteralAssemblerCode("; Jump(\".Type\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Label = \".Normal\"");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.TracePoint");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; Label = \".Type\"");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // Send Calling EIP.");
new LiteralAssemblerCode("; ESI = CallerEIP.Address");
new LiteralAssemblerCode("; DebugStub_ComWrite32()");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendText2 {");
new LiteralAssemblerCode("; // Input: Stack");
new LiteralAssemblerCode("; // Output: None");
new LiteralAssemblerCode("; // Modifies: EAX, ECX, EDX, ESI");
new LiteralAssemblerCode("; // Write the type");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Message");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // Write Length");
new LiteralAssemblerCode("; ESI = EBP");
new LiteralAssemblerCode("; ESI = ESI + 12");
new LiteralAssemblerCode("; ECX = ESI[0]");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite16\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // Address of string");
new LiteralAssemblerCode("; ESI = EBP[8]");
new LiteralAssemblerCode("; Label = \".WriteChar\"");
new LiteralAssemblerCode("; ECX.Compare(0)");
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Exit\")");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
new LiteralAssemblerCode("; ECX--");
new LiteralAssemblerCode("; // We are storing as 16 bits, but for now I will transmit 8 bits");
new LiteralAssemblerCode("; // So we inc again to skip the 0");
new LiteralAssemblerCode("; ESI++");
new LiteralAssemblerCode("; Jump(\".WriteChar\")");
new LiteralAssemblerCode("; }");
new LiteralAssemblerCode("; procedure SendPtr2 {");
new LiteralAssemblerCode("; // Input: Stack");
new LiteralAssemblerCode("; // Output: None");
new LiteralAssemblerCode("; // Modifies: EAX, ECX, EDX, ESI");
new LiteralAssemblerCode("; // Write the type");
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Pointer");
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
new LiteralAssemblerCode("; ");
new LiteralAssemblerCode("; // pointer value");
new LiteralAssemblerCode("; ESI = EBP[8]");
new LiteralAssemblerCode("; DebugStub_ComWrite32()");
new LiteralAssemblerCode("; }");
}
}
}