From d516716b38abf33b24c1cd49713bad884c5be066 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 16 Jan 2020 05:48:36 +0100 Subject: [PATCH] Changed the way device timers are run, fixes DesqView/X. --- src/cpu/386.c | 8 ++++++-- src/cpu/386_dynarec.c | 8 ++++++-- src/cpu/386_dynarec_ops.c | 8 +++++--- src/cpu_new/386.c | 8 ++++++-- src/cpu_new/386_dynarec.c | 8 ++++++-- src/cpu_new/386_dynarec_ops.c | 5 ++++- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/cpu/386.c b/src/cpu/386.c index 7694a0be4..5c7273e04 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -73,8 +73,12 @@ extern int dontprint; #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) +#define CLOCK_CYCLES(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "x86_ops.h" diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index 7a26ae37d..91a9eeeeb 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -710,8 +710,12 @@ void leave_smm() } #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) +#define CLOCK_CYCLES(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "386_ops.h" diff --git a/src/cpu/386_dynarec_ops.c b/src/cpu/386_dynarec_ops.c index aa4784ba8..ade318301 100644 --- a/src/cpu/386_dynarec_ops.c +++ b/src/cpu/386_dynarec_ops.c @@ -9,6 +9,7 @@ #endif #include "../86box.h" #include "cpu.h" +#include "../timer.h" #include "x86.h" #include "x86_ops.h" #include "x87.h" @@ -63,7 +64,8 @@ static __inline void fetch_ea_16_long(uint32_t rmdat) #define PREFETCH_FLUSH() #define OP_TABLE(name) dynarec_ops_ ## name -#define CLOCK_CYCLES(c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) - +#define CLOCK_CYCLES(c) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "386_ops.h" diff --git a/src/cpu_new/386.c b/src/cpu_new/386.c index 2b2268920..f70424b10 100644 --- a/src/cpu_new/386.c +++ b/src/cpu_new/386.c @@ -175,8 +175,12 @@ fetch_ea_16_long(uint32_t rmdat) #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) +#define CLOCK_CYCLES(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "x86_ops.h" diff --git a/src/cpu_new/386_dynarec.c b/src/cpu_new/386_dynarec.c index 0081aceb8..27d706061 100644 --- a/src/cpu_new/386_dynarec.c +++ b/src/cpu_new/386_dynarec.c @@ -471,8 +471,12 @@ void leave_smm() } #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) +#define CLOCK_CYCLES(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "386_ops.h" diff --git a/src/cpu_new/386_dynarec_ops.c b/src/cpu_new/386_dynarec_ops.c index 343ab13c3..f5224c257 100644 --- a/src/cpu_new/386_dynarec_ops.c +++ b/src/cpu_new/386_dynarec_ops.c @@ -9,6 +9,7 @@ #endif #include "../86box.h" #include "cpu.h" +#include "../timer.h" #include "x86.h" #include "x86_ops.h" #include "x87.h" @@ -63,6 +64,8 @@ static inline void fetch_ea_16_long(uint32_t rmdat) #define OP_TABLE(name) dynarec_ops_ ## name /*Temporary*/ #define CLOCK_CYCLES(c) -#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) +#define CLOCK_CYCLES_ALWAYS(c) do { cycles -= (c); \ + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc)) \ + timer_process(); } while(0) #include "386_ops.h"