mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
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.
165 lines
2.8 KiB
Text
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()
|
|
}
|