mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-23 06:18:54 +00:00
This commit is contained in:
parent
48622a9f56
commit
b32a756cd8
4 changed files with 180 additions and 129 deletions
|
|
@ -34,52 +34,74 @@ namespace Cosmos.Debug.DebugStub {
|
|||
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 Comment("X#: procedure SendFrame2 {");
|
||||
new LiteralAssemblerCode("DebugStub_SendFrame2:");
|
||||
new Comment("X#: AL = #Ds2Vs_Frame");
|
||||
new LiteralAssemblerCode("Mov AL, DebugStub_Const_Ds2Vs_Frame");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
|
||||
new Comment("X#: EAX = 32");
|
||||
new LiteralAssemblerCode("Mov EAX, 32");
|
||||
new Comment("X#: ComWriteAX()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAX");
|
||||
new Comment("X#: ESI = .CallerEBP");
|
||||
new LiteralAssemblerCode("Mov ESI, [DebugStub_CallerEBP]");
|
||||
new LiteralAssemblerCode("; Dont transmit EIP or old EBP");
|
||||
new Comment("X#: ESI + 8");
|
||||
new LiteralAssemblerCode("Add ESI, 8");
|
||||
new Comment("X#: ECX = 32");
|
||||
new LiteralAssemblerCode("Mov ECX, 32");
|
||||
new Comment("X#: ComWriteX()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteX");
|
||||
new Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendFrame2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendStack2 {");
|
||||
new LiteralAssemblerCode("DebugStub_SendStack2:");
|
||||
new Comment("X#: AL = #Ds2Vs_Stack");
|
||||
new LiteralAssemblerCode("Mov AL, DebugStub_Const_Ds2Vs_Stack");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
|
||||
new LiteralAssemblerCode("; Send size of bytes");
|
||||
new Comment("X#: ESI = .CallerESP");
|
||||
new LiteralAssemblerCode("Mov ESI, [DebugStub_CallerESP]");
|
||||
new Comment("X#: EAX = .CallerEBP");
|
||||
new LiteralAssemblerCode("Mov EAX, [DebugStub_CallerEBP]");
|
||||
new Comment("X#: EAX - ESI");
|
||||
new LiteralAssemblerCode("Sub EAX, ESI");
|
||||
new Comment("X#: ComWriteAX()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAX");
|
||||
new LiteralAssemblerCode("; Send actual bytes");
|
||||
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("; Need to reload ESI, WriteAXToCompPort modifies it");
|
||||
new Comment("X#: ESI = .CallerESP");
|
||||
new LiteralAssemblerCode("Mov ESI, [DebugStub_CallerESP]");
|
||||
new Comment("X#: SendByte:");
|
||||
new LiteralAssemblerCode("DebugStub_SendStack2_SendByte:");
|
||||
new LiteralAssemblerCode("; if ESI = CallerEBP exit");
|
||||
new Comment("X#: ComWrite8()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWrite8");
|
||||
new Comment("X#: goto SendByte");
|
||||
new LiteralAssemblerCode("Jp DebugStub_SendStack2_SendByte");
|
||||
new Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendStack2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendMethodContext2 {");
|
||||
new LiteralAssemblerCode("DebugStub_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("; AL = Ds2Vs_MethodContext");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
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("; Call(\"DebugStub_ComReadEAX()");
|
||||
new LiteralAssemblerCode("; ECX = EAX");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX()");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
|
||||
new LiteralAssemblerCode("; // EAX contains relative to EBP");
|
||||
|
|
@ -89,24 +111,29 @@ namespace Cosmos.Debug.DebugStub {
|
|||
new LiteralAssemblerCode("; Label = \".SendByte\"");
|
||||
new LiteralAssemblerCode("; ECX.Compare(0)");
|
||||
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".AfterSendByte\")");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
|
||||
new Comment("X#: ComWrite8()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWrite8");
|
||||
new LiteralAssemblerCode("; ECX--");
|
||||
new LiteralAssemblerCode("; Jump(\".SendByte\")");
|
||||
new LiteralAssemblerCode("; Label = \".AfterSendByte\"");
|
||||
new LiteralAssemblerCode("; }");
|
||||
new LiteralAssemblerCode("; procedure SendMemory2 {");
|
||||
new Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendMethodContext2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendMemory2 {");
|
||||
new LiteralAssemblerCode("DebugStub_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("; Call(\"DebugStub_ComReadEAX()");
|
||||
new LiteralAssemblerCode("; ECX = EAX");
|
||||
new LiteralAssemblerCode("; AL = (int)Ds2Vs.MemoryData");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
||||
new LiteralAssemblerCode("; AL = Ds2Vs_MemoryData");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX()");
|
||||
new LiteralAssemblerCode("; ESI = EAX");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
|
||||
|
|
@ -115,68 +142,85 @@ namespace Cosmos.Debug.DebugStub {
|
|||
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 Comment("X#: ComWrite8()");
|
||||
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 Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendMemory2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendTrace2 {");
|
||||
new LiteralAssemblerCode("DebugStub_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("; AL = Ds2Vs_BreakPoint");
|
||||
new LiteralAssemblerCode("; Jump(\".Type\")");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; Label = \".Normal\"");
|
||||
new LiteralAssemblerCode("; AL = (int)Ds2Vs.TracePoint");
|
||||
new LiteralAssemblerCode("; AL = Ds2Vs_TracePoint");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; Label = \".Type\"");
|
||||
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
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 Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendTrace2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendText2 {");
|
||||
new LiteralAssemblerCode("DebugStub_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("; AL = Ds2Vs_Message");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
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 Comment("X#: ComWrite16()");
|
||||
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 Comment("X#: ComWrite8()");
|
||||
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 Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendText2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
new Comment("X#: procedure SendPtr2 {");
|
||||
new LiteralAssemblerCode("DebugStub_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("; AL = Ds2Vs_Pointer");
|
||||
new Comment("X#: ComWriteAL()");
|
||||
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
|
||||
new LiteralAssemblerCode("; ");
|
||||
new LiteralAssemblerCode("; // pointer value");
|
||||
new LiteralAssemblerCode("; ESI = EBP[8]");
|
||||
new LiteralAssemblerCode("; DebugStub_ComWrite32()");
|
||||
new LiteralAssemblerCode("; }");
|
||||
new Comment("X#: }");
|
||||
new LiteralAssemblerCode("DebugStub_SendPtr2_Exit:");
|
||||
new LiteralAssemblerCode("Ret");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,54 +16,54 @@ procedure SendRegisters {
|
|||
ComWrite32()
|
||||
}
|
||||
|
||||
//procedure SendFrame2 {
|
||||
// AL = (int)Ds2Vs.Frame
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
//
|
||||
// EAX = 32
|
||||
// Call("DebugStub_ComWriteAX")
|
||||
//
|
||||
// ESI = CallerEBP.Value
|
||||
// ESI.Add(8) // Dont transmit EIP or old EBP
|
||||
// ECX = 32
|
||||
// Call("DebugStub_ComWriteX")
|
||||
//}
|
||||
procedure SendFrame2 {
|
||||
AL = #Ds2Vs_Frame
|
||||
ComWriteAL()
|
||||
|
||||
//procedure SendStack2 {
|
||||
// AL = (int)Ds2Vs.Stack
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
//
|
||||
// // Send size of bytes
|
||||
// ESI = CallerESP.Value
|
||||
// EAX = CallerEBP.Value
|
||||
// EAX.Sub(ESI)
|
||||
// Call("DebugStub_ComWriteAX")
|
||||
//
|
||||
// // Send actual bytes
|
||||
// //
|
||||
// // Need to reload ESI, WriteAXToCompPort modifies it
|
||||
// ESI = CallerESP.Value
|
||||
// Label = ".SendByte"
|
||||
// ESI.Compare(CallerEBP.Value)
|
||||
// JumpIf(Flags.Equal, ".Exit")
|
||||
// Call("DebugStub_ComWrite8")
|
||||
// Jump(".SendByte")
|
||||
//}
|
||||
EAX = 32
|
||||
ComWriteAX()
|
||||
|
||||
//procedure SendMethodContext2 {
|
||||
ESI = .CallerEBP
|
||||
// Dont transmit EIP or old EBP
|
||||
ESI + 8
|
||||
ECX = 32
|
||||
ComWriteX()
|
||||
}
|
||||
|
||||
procedure SendStack2 {
|
||||
AL = #Ds2Vs_Stack
|
||||
ComWriteAL()
|
||||
|
||||
// Send size of bytes
|
||||
ESI = .CallerESP
|
||||
EAX = .CallerEBP
|
||||
EAX - ESI
|
||||
ComWriteAX()
|
||||
|
||||
// Send actual bytes
|
||||
//
|
||||
// Need to reload ESI, WriteAXToCompPort modifies it
|
||||
ESI = .CallerESP
|
||||
SendByte:
|
||||
// if ESI = CallerEBP exit
|
||||
ComWrite8()
|
||||
goto SendByte
|
||||
}
|
||||
|
||||
procedure SendMethodContext2 {
|
||||
// // sends a stack value
|
||||
// // Serial Params:
|
||||
// // 1: x32 - offset relative to EBP
|
||||
// // 2: x32 - size of data to send
|
||||
// [XSharp(PreserveStack = true)]
|
||||
// AL = (int)Ds2Vs.MethodContext
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
// AL = Ds2Vs_MethodContext
|
||||
ComWriteAL()
|
||||
//
|
||||
// // offset relative to ebp
|
||||
// // size of data to send
|
||||
// Call("DebugStub_ComReadEAX")
|
||||
// Call("DebugStub_ComReadEAX()
|
||||
// ECX = EAX
|
||||
// Call("DebugStub_ComReadEAX")
|
||||
// Call("DebugStub_ComReadEAX()
|
||||
//
|
||||
// // now ECX contains size of data (count)
|
||||
// // EAX contains relative to EBP
|
||||
|
|
@ -73,25 +73,25 @@ procedure SendRegisters {
|
|||
// Label = ".SendByte"
|
||||
// ECX.Compare(0)
|
||||
// JumpIf(Flags.Equal, ".AfterSendByte")
|
||||
// Call("DebugStub_ComWrite8")
|
||||
ComWrite8()
|
||||
// ECX--
|
||||
// Jump(".SendByte")
|
||||
// Label = ".AfterSendByte"
|
||||
//}
|
||||
}
|
||||
|
||||
//procedure SendMemory2 {
|
||||
procedure SendMemory2 {
|
||||
// // sends a stack value
|
||||
// // Serial Params:
|
||||
// // 1: x32 - offset relative to EBP
|
||||
// // 2: x32 - size of data to send
|
||||
// [XSharp(PreserveStack = true)]
|
||||
// procedure
|
||||
// Call("DebugStub_ComReadEAX")
|
||||
// Call("DebugStub_ComReadEAX()
|
||||
// ECX = EAX
|
||||
// AL = (int)Ds2Vs.MemoryData
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
// AL = Ds2Vs_MemoryData
|
||||
ComWriteAL()
|
||||
//
|
||||
// Call("DebugStub_ComReadEAX")
|
||||
// Call("DebugStub_ComReadEAX()
|
||||
// ESI = EAX
|
||||
//
|
||||
// // now ECX contains size of data (count)
|
||||
|
|
@ -100,68 +100,68 @@ procedure SendRegisters {
|
|||
// Label = "DebugStub_SendMemory_SendByte"
|
||||
// new Compare { DestinationReg = Registers.ECX, SourceValue = 0 }
|
||||
// JumpIf(Flags.Equal, "DebugStub_SendMemory_After_SendByte")
|
||||
// Call("DebugStub_ComWrite8")
|
||||
ComWrite8()
|
||||
// ECX--
|
||||
// Jump("DebugStub_SendMemory_SendByte")
|
||||
//
|
||||
// Label = "DebugStub_SendMemory_After_SendByte"
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
//procedure SendTrace2 {
|
||||
procedure SendTrace2 {
|
||||
// // Modifies: EAX, ESI
|
||||
// DebugStatus.Value.Compare(Status.Run)
|
||||
// JumpIf(Flags.Equal, ".Normal")
|
||||
// AL = (int)Ds2Vs.BreakPoint
|
||||
// AL = Ds2Vs_BreakPoint
|
||||
// Jump(".Type")
|
||||
//
|
||||
// Label = ".Normal"
|
||||
// AL = (int)Ds2Vs.TracePoint
|
||||
// AL = Ds2Vs_TracePoint
|
||||
//
|
||||
// Label = ".Type"
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
ComWriteAL()
|
||||
//
|
||||
// // Send Calling EIP.
|
||||
// ESI = CallerEIP.Address
|
||||
// DebugStub_ComWrite32()
|
||||
//}
|
||||
}
|
||||
|
||||
//procedure SendText2 {
|
||||
procedure SendText2 {
|
||||
// // Input: Stack
|
||||
// // Output: None
|
||||
// // Modifies: EAX, ECX, EDX, ESI
|
||||
// // Write the type
|
||||
// AL = (int)Ds2Vs.Message
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
// AL = Ds2Vs_Message
|
||||
ComWriteAL()
|
||||
//
|
||||
// // Write Length
|
||||
// ESI = EBP
|
||||
// ESI = ESI + 12
|
||||
// ECX = ESI[0]
|
||||
// Call("DebugStub_ComWrite16")
|
||||
ComWrite16()
|
||||
//
|
||||
// // Address of string
|
||||
// ESI = EBP[8]
|
||||
// Label = ".WriteChar"
|
||||
// ECX.Compare(0)
|
||||
// JumpIf(Flags.Equal, ".Exit")
|
||||
// Call("DebugStub_ComWrite8")
|
||||
ComWrite8()
|
||||
// ECX--
|
||||
// // We are storing as 16 bits, but for now I will transmit 8 bits
|
||||
// // So we inc again to skip the 0
|
||||
// ESI++
|
||||
// Jump(".WriteChar")
|
||||
//}
|
||||
}
|
||||
|
||||
//procedure SendPtr2 {
|
||||
procedure SendPtr2 {
|
||||
// // Input: Stack
|
||||
// // Output: None
|
||||
// // Modifies: EAX, ECX, EDX, ESI
|
||||
// // Write the type
|
||||
// AL = (int)Ds2Vs.Pointer
|
||||
// Call("DebugStub_ComWriteAL")
|
||||
// AL = Ds2Vs_Pointer
|
||||
ComWriteAL()
|
||||
//
|
||||
// // pointer value
|
||||
// ESI = EBP[8]
|
||||
// DebugStub_ComWrite32()
|
||||
//}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -195,12 +195,12 @@ namespace Cosmos.Compiler.XSharp {
|
|||
|
||||
AddPattern(new string[] {
|
||||
//0 1 2 3 4 5
|
||||
"if _REG < 123 goto _ABC", "if _REG < 123 exit",
|
||||
"if _REG > 123 goto _ABC", "if _REG > 123 exit",
|
||||
"if _REG = 123 goto _ABC", "if _REG = 123 exit",
|
||||
"if _REG != 123 goto _ABC", "if _REG != 123 exit",
|
||||
"if _REG <= 123 goto _ABC", "if _REG <= 123 exit",
|
||||
"if _REG >= 123 goto _ABC", "if _REG >= 123 exit"
|
||||
"if _REG < 123 goto _ABC", "if _REG < 123 exit", "if _REG < _REG goto _ABC", "if _REG < _REG exit",
|
||||
"if _REG > 123 goto _ABC", "if _REG > 123 exit", "if _REG > _REG goto _ABC", "if _REG > _REG exit",
|
||||
"if _REG = 123 goto _ABC", "if _REG = 123 exit", "if _REG = _REG goto _ABC", "if _REG = _REG exit",
|
||||
"if _REG != 123 goto _ABC", "if _REG != 123 exit", "if _REG != _REG goto _ABC", "if _REG != _REG exit",
|
||||
"if _REG <= 123 goto _ABC", "if _REG <= 123 exit", "if _REG <= _REG goto _ABC", "if _REG <= _REG exit",
|
||||
"if _REG >= 123 goto _ABC", "if _REG >= 123 exit", "if _REG >= _REG goto _ABC", "if _REG >= _REG exit"
|
||||
},
|
||||
delegate(TokenList aTokens, ref List<string> rCode) {
|
||||
rCode.Add("Cmp {1}, {3}");
|
||||
|
|
@ -340,8 +340,14 @@ namespace Cosmos.Compiler.XSharp {
|
|||
});
|
||||
|
||||
// TODO: Allow asm to optimize these to Inc/Dec
|
||||
AddPattern("_REG + 1", "Add {0}, {2}");
|
||||
AddPattern("_REG - 1", "Sub {0}, {2}");
|
||||
AddPattern(new string[] {
|
||||
"_REG + 1",
|
||||
"_REG + _REG"
|
||||
}, "Add {0}, {2}");
|
||||
AddPattern(new string[] {
|
||||
"_REG - 1",
|
||||
"_REG - _REG"
|
||||
}, "Sub {0}, {2}");
|
||||
AddPattern("_REG++", "Inc {0}");
|
||||
AddPattern("_REG--", "Dec {0}");
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ namespace XSharpCompilerTester {
|
|||
Test("CmdAsmBreak.xs");
|
||||
Test("Main.xs");
|
||||
Test("CmdProcess.xs");
|
||||
Test("CmdSend.xs");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue