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("; }"); } } }