From 71b5f65fbc952295ebfb07bd7415a05454b9529b Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 2 Nov 2014 00:31:43 +0100 Subject: [PATCH] last fpu changes - ended basic first version --- TitanEngine/Global.Engine.Threading.h | 2 +- TitanEngine/TitanEngine.Debugger.Context.cpp | 72 +++++++++++++++++--- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/TitanEngine/Global.Engine.Threading.h b/TitanEngine/Global.Engine.Threading.h index 1882d16..2b39b6d 100644 --- a/TitanEngine/Global.Engine.Threading.h +++ b/TitanEngine/Global.Engine.Threading.h @@ -4,7 +4,7 @@ #define GetSTInTOPStackFromStatusWord(StatusWord) ((StatusWord & 0x3800) >> 11) #define Getx87r0PositionInRegisterArea(STInTopStack) ((8 - STInTopStack) % 8) #define Calculatex87registerPositionInRegisterArea(x87r0_position, index) (((x87r0_position + index) % 8)) -#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, i) ) +#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, index) ) #define GetSTValueFromIndex(x87r0_position, index) ((x87r0_position + index) % 8) enum CriticalSectionLock diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index 51f8e69..390f367 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -910,35 +910,91 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD } else if(IndexOfRegister == UE_MMX0) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX1) { - memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX2) { - memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX3) { - memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX4) { - memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX5) { - memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX6) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX7) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + } + else if(IndexOfRegister == UE_x87_r0) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 0)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r1) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 1)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r2) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 2)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r3) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 3)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r4) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 4)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r5) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 5)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r6) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 6)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r7) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 7)), (char*) NewRegisterValue, 10); } else {