From 52636936e9f2b658671986e1809f82063bfc9b71 Mon Sep 17 00:00:00 2001 From: SarahW Date: Tue, 3 May 2016 21:31:05 +0100 Subject: [PATCH] Limited how long REP instructions are uninterruptable for, improves sound on games/demos that use high-frequency timer interrupts for sound output (eg Crystal Dream, Cronologia) --- src/386_dynarec.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/386_dynarec.c b/src/386_dynarec.c index 2db6899..1c03ecb 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -293,6 +293,10 @@ int rep386(int fv) uint32_t templ,templ2; int tempz; int tempi; + /*Limit the amount of time the instruction is uninterruptable for, so + that high frequency timers still work okay. This amount is different + for interpreter and recompiler*/ + int cycles_end = cycles - ((is386 && cpu_use_dynarec) ? 1000 : 100); cpu_reps++; @@ -543,7 +547,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -561,7 +565,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -579,7 +583,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -598,7 +602,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -617,7 +621,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -637,7 +641,7 @@ int rep386(int fv) c--; cycles-=(is486)?3:4; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -767,7 +771,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -785,7 +789,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -803,7 +807,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -821,7 +825,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -839,7 +843,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -857,7 +861,7 @@ int rep386(int fv) c--; cycles-=(is486)?4:5; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -970,7 +974,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -994,7 +998,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -1016,7 +1020,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -1038,7 +1042,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -1060,7 +1064,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--; @@ -1082,7 +1086,7 @@ int rep386(int fv) c--; cycles-=(is486)?5:8; ins++; - if (cycles < 0) + if (cycles < cycles_end) break; } ins--;