Cosmos/source2/Compiler/Cosmos.Compiler.DebugStub/CmdSend.xs
EdwardNutting_cp a952b8ff4b Stabalises the debugger so VS should crash less often.
Locals window now works! (For primitive types and pointers only.) Exceptions related to unrecognised (i.e. more complex) types should be caught and display as the local variable's value instead of causing VS to crash. 
Autos window still causes instant VS crash.
Cosmos windows works.
Call Stack works (sort of...only ever displays current line)
Threads works (but there is only ever 1 thread so not very helpful)
Watch window is only capable of doing 1 watch result per break - step to next line to be able to run another - will look into why this is.
2013-12-24 16:53:49 +00:00

165 lines
2.8 KiB
Text

namespace DebugStub
function SendRegisters {
// Send the actual started signal
AL = #Ds2Vs_Registers
ComWriteAL()
ESI = .PushAllPtr
ECX = 32
ComWriteX()
ESI = @.CallerESP
ComWrite32()
ESI = @.CallerEIP
ComWrite32()
}
function SendFrame {
AL = #Ds2Vs_Frame
ComWriteAL()
EAX = 32
ComWriteAX()
ESI = .CallerEBP
// Dont transmit EIP or old EBP
ESI + 8
ECX = 32
ComWriteX()
}
function SendStack {
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
while ESI != .CallerEBP {
ComWrite8()
}
}
// sends a stack value
// Serial Params:
// 1: x32 - offset relative to EBP
// 2: x32 - size of data to send
function SendMethodContext {
+All
AL = #Ds2Vs_MethodContext
ComWriteAL()
ESI = .CallerEBP
// offset relative to ebp
// size of data to send
ComReadEAX()
ESI + EAX
ComReadEAX()
ECX = EAX
// now ECX contains size of data (count)
// ESI contains relative to EBP
while ECX != 0 {
ComWrite8()
ECX--
}
Exit:
-All
}
// none
// saveregs
// frame
//
// sends a stack value
// Serial Params:
// 1: x32 - address
// 2: x32 - size of data to send
function SendMemory {
+All
AL = #Ds2Vs_MemoryData
ComWriteAL()
ComReadEAX()
ESI = EAX
ComReadEAX()
ECX = EAX
// now ECX contains size of data (count)
// ESI contains address
while ECX != 0 {
ComWrite8()
ECX--
}
Exit:
-All
}
// Modifies: EAX, ESI
function SendTrace {
AL = #Ds2Vs_BreakPoint
// If we are running, its a tracepoint, not a breakpoint.
// In future, maybe separate these into 2 methods
if dword .DebugStatus = #Status_Run {
AL = #Ds2Vs_TracePoint
}
ComWriteAL()
// Send Calling EIP.
ESI = @.CallerEIP
ComWrite32()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendText {
// Write the type
AL = #Ds2Vs_Message
ComWriteAL()
// Write Length
ESI = EBP
ESI + 12
ECX = ESI[0]
ComWrite16()
// Address of string
ESI = EBP[8]
WriteChar:
if ECX = 0 return
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++
goto WriteChar
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendPtr {
// Write the type
AL = #Ds2Vs_Pointer
ComWriteAL()
// pointer value
ESI = EBP[8]
ComWrite32()
}