From 51f8b2b340baf7f92e23e998335bd7cede3fd313 Mon Sep 17 00:00:00 2001 From: Marco Maccaferri Date: Wed, 1 May 2019 09:53:37 +0200 Subject: [PATCH] More accurate emulator timing --- src/com/maccasoft/tools/Machine.java | 15 ++++++++------- src/z80core/MemIoOps.java | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/com/maccasoft/tools/Machine.java b/src/com/maccasoft/tools/Machine.java index 20c90e9..30ff364 100644 --- a/src/com/maccasoft/tools/Machine.java +++ b/src/com/maccasoft/tools/Machine.java @@ -55,7 +55,6 @@ public class Machine extends MemIoOps { Z80 proc; Thread thread; double clockNs; - long tstates; public Machine() { rom = new byte[16384]; @@ -108,16 +107,18 @@ public class Machine extends MemIoOps { while (!Thread.interrupted()) { synchronized (proc) { - long current = System.nanoTime(); - long tstates = getTstates() + (long) ((current - ns) / clockNs); - while (getTstates() < tstates) { - proc.execute(); + int runTstates = (int) ((System.nanoTime() - ns) / clockNs); + if (runTstates >= 4) { + long prevTstates = tstates; + while (tstates < (prevTstates + runTstates)) { + proc.execute(); + } + ns += (tstates - prevTstates) * clockNs; } - ns = current; } try { - Thread.sleep(1); + Thread.sleep(1L); } catch (InterruptedException e) { break; } diff --git a/src/z80core/MemIoOps.java b/src/z80core/MemIoOps.java index 6697536..3caa434 100644 --- a/src/z80core/MemIoOps.java +++ b/src/z80core/MemIoOps.java @@ -13,7 +13,8 @@ public class MemIoOps { private byte[] z80Ram; private byte[] z80Ports; - private long tstates = 0; + + protected long tstates = 0; public MemIoOps() {