aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-04-11 17:50:10 +0100
committerJan Tuomi <jan@jantuomi.fi>2024-04-11 17:50:10 +0100
commit3963742d5cc195bbbcc8081ec261b0d3e0c1d83d (patch)
tree662907306f6a0f4b60fd8f3ee67e07acad6c347d
parent5776a07e6a3def343996c5ec83cd69242f7ea23a (diff)
Add instr/s counter
-rw-r--r--atk16_emu/emu.py3
-rw-r--r--resources/asm/aoc23_1a.atk16554
-rw-r--r--resources/asm/aoc23_1a.py48
-rw-r--r--test/e2e/fibo/fibo.atk168
-rw-r--r--test/e2e/fibo/test_fibo.py17
5 files changed, 25 insertions, 605 deletions
diff --git a/atk16_emu/emu.py b/atk16_emu/emu.py
index 1d8fd1e..4257636 100644
--- a/atk16_emu/emu.py
+++ b/atk16_emu/emu.py
@@ -177,6 +177,7 @@ class Machine:
sign = False,
)
+ self.steps_taken = 0
self.running = False
def make_copy(self):
@@ -265,6 +266,7 @@ class Machine:
def reset(self):
self.pc.reset()
self.running = False
+ self.steps_taken = 0
def run(self):
"Set running = True."
@@ -289,6 +291,7 @@ class Machine:
if not self.running:
raise RuntimeError("Machine is not running")
+ self.steps_taken += 1
pc_addr = self.pc.value
self.pc.step()
diff --git a/resources/asm/aoc23_1a.atk16 b/resources/asm/aoc23_1a.atk16
deleted file mode 100644
index 78c4622..0000000
--- a/resources/asm/aoc23_1a.atk16
+++ /dev/null
@@ -1,554 +0,0 @@
-;; BEGIN BOOTSTRAP
-
-@use ext_std:*
-
-@let sp RH ; stack pointer (points to empty slot at top of stack)
-@let fp RG ; frame pointer (points to base of currently active frame)
-
-@let vector_table 0x10
-@let vt_ISR0 0x10 ; ISR0
-@let vt_ISR1 0x11 ; ISR1
-@let vt_ISR2 0x12 ; ISR2
-@let vt_ISR3 0x13 ; ISR3
-@let vt_stack_addr 0x14 ; Stack address
-@let vt_term_pp_addr 0x15 ; Terminal peripheral address
-@let vt_kb_pp_addr 0x16 ; Keyboard peripheral address
-@let vt_gr_mode_addr 0x17 ; Graphics mode setting address
-@let vt_sprite_mem 0x18 ; Sprite memory address
-@let vt_text_mem 0x19 ; Text memory buffer address
-
-@let stack_segment 0x8000
-@let mmio_segment 0xE000
-@let terminal_addr 0xE000
-@let keyboard_addr 0xE001
-@let gr_mode_addr 0xE002
-@let sprite_mem 0xE800
-@let text_mem 0xF800
-
-@let gr_disabled_mode 0b00
-@let gr_text_mode 0b01
-@let gr_sprite_mode 0b10
-
-@address 0x0
- ldi vt_stack_addr RA
- ldr RA SP
- mov SP FP
- jpi program_segment
-
-@address vector_table
- keyboard_isr ; 0x10
- hlt_isr ; 0x11
- hlt_isr ; 0x12
- hlt_isr ; 0x13
- stack_segment ; 0x14
- terminal_addr ; 0x15
- keyboard_addr ; 0x16
- gr_mode_addr ; 0x17
- sprite_mem ; 0x18
- text_mem ; 0x19
-
-@label hlt_isr
- hlt
-
-@label keyboard_isr
- spu RA
- spu RB
- ldi vt_kb_pp_addr RA
- ldr RA RA
- ldr RA RA
- ldi vt_term_pp_addr RB
- ldr RB RB
- str RA RB
- spo RB
- spo RA
- rti
-
-@label program_segment
- ldi vt_gr_mode_addr RA
- ldr RA RA
- ldi gr_disabled_mode RB
- str RB RA
-
- jpi main
-
-;; END BOOTSTRAP
-
-@label int_0
- 8
-@label graphics_no_mode
- 0
-@label graphics_text_mode
- 1
-@label graphics_sprite_mode
- 2
-@label graphics_mode_pp
- 23
-@label text_mem_pp
- 25
-@label input_p
- 36864
-@label input_elem_size
- 256
-@label int_1
- 49
-@label int_2
- 97
-@label int_3
- 98
-@label int_4
- 99
-@label int_5
- 50
-
-
-
-@label main
-; stack frame with offsets
-; graphics_mode_p 0
-; text_mem_p 1
-; row_p 2
-; i 3
-; first 4
-; last 5
-; char_p 6
-; char 7
- ldi int_0 RA
- ldr RA RA
- add SP RA SP
-; <ast.Assign object at 0x104353640>
-; assigning graphics_mode_p at FP + 0
-; evaluating value to be assigned
-; <ast.Call object at 0x1043535e0>
-; Builtin call load [<ast.Name object at 0x104353550>]
-; <ast.Name object at 0x104353550> (GRAPHICS_MODE_PP)
- ldi graphics_mode_pp RC
- ldr RC RC
- spu RC
-; (load) dereferencing top of stack
- spo RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 0) := top of stack
- spo RA
- ldi 0 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x104353520>
-; assigning text_mem_p at FP + 1
-; evaluating value to be assigned
-; <ast.Call object at 0x1043534c0>
-; Builtin call load [<ast.Name object at 0x104353430>]
-; <ast.Name object at 0x104353430> (TEXT_MEM_PP)
- ldi text_mem_pp RC
- ldr RC RC
- spu RC
-; (load) dereferencing top of stack
- spo RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 1) := top of stack
- spo RA
- ldi 1 RB
- add RB FP RB
- str RA RB
-; <ast.Call object at 0x1043533d0>
-; Builtin call store [<ast.Name object at 0x104353340>, <ast.Name object at 0x104353310>]
-; <ast.Name object at 0x104353340> (graphics_mode_p)
- ldi 0 RA
- add FP RA RA
- ldr RA RA
- spu RA
-; <ast.Name object at 0x104353310> (GRAPHICS_TEXT_MODE)
- ldi graphics_text_mode RA
- ldr RA RA
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x1043530d0>
-; Builtin call store [<ast.BinOp object at 0x104352a40>, <ast.Constant object at 0x104352d40>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x104352a40>
-; <ast.Name object at 0x104352da0> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x104352a40>
-; <ast.Constant object at 0x104352d70>
- ldi 0 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x104352d40>
- ldi int_1 RA
- ldr RA RA ; int_1 = 49
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x104352cb0>
-; Builtin call store [<ast.BinOp object at 0x104352e60>, <ast.Constant object at 0x104352dd0>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x104352e60>
-; <ast.Name object at 0x104352e30> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x104352e60>
-; <ast.Constant object at 0x104352e00>
- ldi 1 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x104352dd0>
- ldi int_2 RA
- ldr RA RA ; int_2 = 97
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x104352770>
-; Builtin call store [<ast.BinOp object at 0x1043526b0>, <ast.Constant object at 0x104352620>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x1043526b0>
-; <ast.Name object at 0x104352950> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x1043526b0>
-; <ast.Constant object at 0x104352980>
- ldi 2 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x104352620>
- ldi int_3 RA
- ldr RA RA ; int_3 = 98
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x1043525c0>
-; Builtin call store [<ast.BinOp object at 0x104352530>, <ast.Constant object at 0x1043524a0>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x104352530>
-; <ast.Name object at 0x104352500> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x104352530>
-; <ast.Constant object at 0x1043524d0>
- ldi 3 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x1043524a0>
- ldi int_4 RA
- ldr RA RA ; int_4 = 99
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x104352440>
-; Builtin call store [<ast.BinOp object at 0x1043523b0>, <ast.Constant object at 0x1043522f0>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x1043523b0>
-; <ast.Name object at 0x104352380> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x1043523b0>
-; <ast.Constant object at 0x104352350>
- ldi 4 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x1043522f0>
- ldi int_5 RA
- ldr RA RA ; int_5 = 50
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x1043521d0>
-; Builtin call store [<ast.BinOp object at 0x104352110>, <ast.Constant object at 0x104353040>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x104352110>
-; <ast.Name object at 0x1043520e0> (INPUT_P)
- ldi input_p RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x104352110>
-; <ast.Constant object at 0x104352ec0>
- ldi 5 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Constant object at 0x104353040>
- ldi 0 RA
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Assign object at 0x104353010>
-; assigning row_p at FP + 2
-; evaluating value to be assigned
-; <ast.Name object at 0x104352fb0> (INPUT_P)
- ldi input_p RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 2) := top of stack
- spo RA
- ldi 2 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x104352f80>
-; assigning i at FP + 3
-; evaluating value to be assigned
-; <ast.Constant object at 0x104352f20>
- ldi 0 RC
- spu RC
-; assigning stack address (FP + 3) := top of stack
- spo RA
- ldi 3 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x104352ef0>
-; assigning first at FP + 4
-; evaluating value to be assigned
-; <ast.Call object at 0x104352830>
-; Builtin call load [<ast.Name object at 0x104352650>]
-; <ast.Name object at 0x104352650> (row_p)
- ldi 2 RC
- add FP RC RC
- ldr RC RC
- spu RC
-; (load) dereferencing top of stack
- spo RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 4) := top of stack
- spo RA
- ldi 4 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x104352680>
-; assigning last at FP + 5
-; evaluating value to be assigned
-; <ast.Constant object at 0x104352b60>
- ldi 0 RC
- spu RC
-; assigning stack address (FP + 5) := top of stack
- spo RA
- ldi 5 RB
- add RB FP RB
- str RA RB
-; <ast.While object at 0x104352920>
-@label while_test_6
-; <ast.Constant object at 0x1043526e0>
- ldi 1 RB
- spu RB
- spo RA
- addi RA 0 RA
- bri zero While_else_7
-; <ast.Assign object at 0x1042d85b0>
-; assigning char_p at FP + 6
-; evaluating value to be assigned
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x1042d8670>
-; <ast.Name object at 0x1042da800> (INPUT_P)
- ldi input_p RC
- ldr RC RC
- spu RC
-; BinOp rhs <ast.BinOp object at 0x1042d8670>
-; <ast.Name object at 0x1042d9570> (i)
- ldi 3 RC
- add FP RC RC
- ldr RC RC
- spu RC
- spo RD
- spo RC
- add RC RD RC
- spu RC
-; assigning stack address (FP + 6) := top of stack
- spo RA
- ldi 6 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x1042da4a0>
-; assigning char at FP + 7
-; evaluating value to be assigned
-; <ast.Call object at 0x1045e1840>
-; Builtin call load [<ast.Name object at 0x1045e17b0>]
-; <ast.Name object at 0x1045e17b0> (char_p)
- ldi 6 RC
- add FP RC RC
- ldr RC RC
- spu RC
-; (load) dereferencing top of stack
- spo RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 7) := top of stack
- spo RA
- ldi 7 RB
- add RB FP RB
- str RA RB
-; <ast.If object at 0x1045e1780>
-; <ast.Compare object at 0x1045e1750>
-; <ast.Name object at 0x1045e1720> (char)
- ldi 7 RA
- add FP RA RA
- ldr RA RA
- spu RA
-; <ast.Constant object at 0x1045e16f0>
- ldi 0 RA
- spu RA
-; Comparing <ast.Name object at 0x1045e1720> <ast.Eq object at 0x10430e890> <ast.Constant object at 0x1045e16f0>
- spo RA
- addi RA 0 RA
- bri zero If_false_branch_11
-; <ast.Break object at 0x1045e16c0>
- jpi While_end_8
- jpi If_end_branch_12
-@label if_false_branch_11
-@label if_end_branch_12
-; <ast.Assign object at 0x1045e1690>
-; assigning last at FP + 5
-; evaluating value to be assigned
-; <ast.Name object at 0x1045e1630> (char)
- ldi 7 RC
- add FP RC RC
- ldr RC RC
- spu RC
-; assigning stack address (FP + 5) := top of stack
- spo RA
- ldi 5 RB
- add RB FP RB
- str RA RB
-; <ast.Assign object at 0x104352260>
-; assigning i at FP + 3
-; evaluating value to be assigned
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x104352230>
-; <ast.Name object at 0x1045e15d0> (i)
- ldi 3 RC
- add FP RC RC
- ldr RC RC
- spu RC
-; BinOp rhs <ast.BinOp object at 0x104352230>
-; <ast.Constant object at 0x1045e15a0>
- ldi 1 RC
- spu RC
- spo RD
- spo RC
- add RC RD RC
- spu RC
-; assigning stack address (FP + 3) := top of stack
- spo RA
- ldi 3 RB
- add RB FP RB
- str RA RB
- jpi While_test_6
-@label while_else_7
-@label while_end_8
-; <ast.Call object at 0x1045e1540>
-; Builtin call store [<ast.BinOp object at 0x1045e14b0>, <ast.Name object at 0x1045e1420>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x1045e14b0>
-; <ast.Name object at 0x1045e1480> (text_mem_p)
- ldi 1 RA
- add FP RA RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x1045e14b0>
-; <ast.Constant object at 0x1045e1450>
- ldi 0 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Name object at 0x1045e1420> (first)
- ldi 4 RA
- add FP RA RA
- ldr RA RA
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
-; <ast.Call object at 0x1045e13c0>
-; Builtin call store [<ast.BinOp object at 0x1045e1330>, <ast.Name object at 0x1045e12a0>]
-; <ast.Add object at 0x10430ef80>
-; BinOp lhs <ast.BinOp object at 0x1045e1330>
-; <ast.Name object at 0x1045e1300> (text_mem_p)
- ldi 1 RA
- add FP RA RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x1045e1330>
-; <ast.Constant object at 0x1045e12d0>
- ldi 1 RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
-; <ast.Name object at 0x1045e12a0> (last)
- ldi 5 RA
- add FP RA RA
- ldr RA RA
- spu RA
- spo RB
- spo RA
- str RB RA
- ldi 0 RA
- spu RA
-; popping free-standing Expr result from stack
- spo RA
- mov FP SP
- hlt
diff --git a/resources/asm/aoc23_1a.py b/resources/asm/aoc23_1a.py
deleted file mode 100644
index 12e3953..0000000
--- a/resources/asm/aoc23_1a.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import atk16
-
-GRAPHICS_NO_MODE: atk16.ConstWord16 = 0
-GRAPHICS_TEXT_MODE: atk16.ConstWord16 = 1
-GRAPHICS_SPRITE_MODE: atk16.ConstWord16 = 2
-
-GRAPHICS_MODE_PP: atk16.ConstWord16 = 0x17
-TEXT_MEM_PP: atk16.ConstWord16 = 0x19
-
-graphics_mode_p = atk16.load(GRAPHICS_MODE_PP)
-text_mem_p = atk16.load(TEXT_MEM_PP)
-
-atk16.store(graphics_mode_p, GRAPHICS_TEXT_MODE)
-
-INPUT_P: atk16.ConstWord16 = 0x9000
-INPUT_ELEM_SIZE: atk16.ConstWord16 = 256
-
-# 1a example
-
-atk16.store(INPUT_P + 0, "1")
-atk16.store(INPUT_P + 1, "a")
-atk16.store(INPUT_P + 2, "b")
-atk16.store(INPUT_P + 3, "c")
-atk16.store(INPUT_P + 4, "2")
-atk16.store(INPUT_P + 5, "\0")
-# atk16.store_const_vec(INPUT_P + 0, "1abc2\0")
-# atk16.store_const_vec(INPUT_P + 256, "pqr3stu8vwx\0")
-# atk16.store_const_vec(INPUT_P + 512, "a1b2c3d4e5f\0")
-# atk16.store_const_vec(INPUT_P + 768, "treb7uchet\0")
-
-row_p = INPUT_P
-i = 0
-
-first = atk16.load(row_p)
-last = 0
-
-while True:
- char_p = INPUT_P + i
- char = atk16.load(char_p)
-
- if char == "\0":
- break
-
- last = char
- i += 1
-
-atk16.store(text_mem_p + 0, first)
-atk16.store(text_mem_p + 1, last) \ No newline at end of file
diff --git a/test/e2e/fibo/fibo.atk16 b/test/e2e/fibo/fibo.atk16
index fe38fe5..2cf3d20 100644
--- a/test/e2e/fibo/fibo.atk16
+++ b/test/e2e/fibo/fibo.atk16
@@ -2,9 +2,13 @@
; will jump to label main
@include bootstrap
+@label iters
+ 51
+
@label main
- ldi 10 RA
- calli fibo ; call fibo subroutine with parameter 10
+ ldi iters RA
+ ldr RA RA
+ calli fibo ; call fibo subroutine with parameter 1000
hlt
@label fibo ; fibo(n) subroutine
diff --git a/test/e2e/fibo/test_fibo.py b/test/e2e/fibo/test_fibo.py
index a7146fc..65af07a 100644
--- a/test/e2e/fibo/test_fibo.py
+++ b/test/e2e/fibo/test_fibo.py
@@ -1,3 +1,4 @@
+import time
from atk16_asm import assemble
from atk16_emu import Machine
from test.utils import pad_bytearray
@@ -13,7 +14,21 @@ def test_fibo():
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()
- assert machine.ra.value == 89
+ elapsed = end - start
+ print("Elapsed time:", elapsed, "ns")
+ steps_taken = machine.steps_taken
+
+ # 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
+ print("Instructions / second:", steps_taken / (elapsed / 1e9))
+
+ assert machine.ra.value == 41443