aboutsummaryrefslogtreecommitdiffstats
path: root/test/e2e/emulation_speed/test_emulation_speed.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/e2e/emulation_speed/test_emulation_speed.py')
-rw-r--r--test/e2e/emulation_speed/test_emulation_speed.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/test/e2e/emulation_speed/test_emulation_speed.py b/test/e2e/emulation_speed/test_emulation_speed.py
new file mode 100644
index 0000000..f2bcd22
--- /dev/null
+++ b/test/e2e/emulation_speed/test_emulation_speed.py
@@ -0,0 +1,43 @@
+import time
+from atk16_asm import assemble
+from atk16_emu import Machine
+from test.utils import pad_bytearray
+
+def test_emulation_speed():
+ filename = "test/e2e/emulation_speed/long_loop.atk16"
+ with open(filename, "r") as f:
+ source = f.read()
+
+ obj = assemble(source, filename)
+ rom_image = pad_bytearray(obj.program)
+
+ machine = Machine()
+ machine.load_rom_image(rom_image)
+ machine.reset()
+ start = time.perf_counter_ns()
+ machine.run_until_halted()
+ end = time.perf_counter_ns()
+ machine.print_state_summary()
+
+ elapsed = end - start
+ print("Elapsed time:", elapsed, "ns")
+ steps_taken = machine.steps_taken
+ mean_ns_per_instr = elapsed / steps_taken
+ print("Instructions / second:", steps_taken / (elapsed / 1e9))
+ print("ns / instruction:", mean_ns_per_instr)
+
+ # VGA frequency is 25.175 MHz
+ # Divided by 16, that's 1.5734375 MHz (main clock)
+ # Instructions take 3–5 cycles, the average instruction takes around 4 cycles
+ # 1.5734375 MHz / 4 = 393359.375 Hz
+ # That is the goal instruction frequency
+ # TODO limit emulation speed to 393359.375 Hz ~= 2542 ns per instruction
+ # this is in order to have similar speed as the actual machine
+
+ expected = 2542
+ allowed_range = 0.05 # 0..1
+ expected_min = expected * (1 - allowed_range)
+ expected_max = expected * (1 + allowed_range)
+ percentage = 100 * mean_ns_per_instr / expected
+ assert expected_min < mean_ns_per_instr, f"Emulator seems to run too fast ({percentage:.2f}% of expected ns per instruction)"
+ assert mean_ns_per_instr < expected_max, f"Emulator seems to run too slow ({percentage:.2f}% of expected ns per instruction)"