aboutsummaryrefslogtreecommitdiffstats
path: root/test/e2e/fibo
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2024-02-22 08:52:20 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2024-02-22 08:52:20 +0200
commit416e896956d3b05793337da6609fe1544797c0a9 (patch)
tree9fa0cf3b622d4c9c086e4c08c5011ab12fdd4a77 /test/e2e/fibo
parentaefe0cf3874c542669051b2b3cc21c9590aa970b (diff)
Add stuff, refactor
Diffstat (limited to 'test/e2e/fibo')
-rw-r--r--test/e2e/fibo/bootstrap.atk1678
-rw-r--r--test/e2e/fibo/fibo.atk1653
-rw-r--r--test/e2e/fibo/test_fibo.py19
3 files changed, 150 insertions, 0 deletions
diff --git a/test/e2e/fibo/bootstrap.atk16 b/test/e2e/fibo/bootstrap.atk16
new file mode 100644
index 0000000..0fe2a9d
--- /dev/null
+++ b/test/e2e/fibo/bootstrap.atk16
@@ -0,0 +1,78 @@
+@let sp RH
+
+; vector table fields
+@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
+
+; memory segments
+@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 ; to 0xFFFF
+; note: sprite memory & text memory can use the same space
+; since they are never used at the same time
+
+; graphics mode settings
+@let gr_disabled_mode 0b00
+@let gr_text_mode 0b01
+@let gr_sprite_mode 0b10
+
+@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
+ ldi 0x55 RE
+ hlt
+
+@label keyboard_isr
+ spu RA
+ spu RB
+ ldi vt_kb_pp_addr RA ; RA := Keyboard peripheral address pointer
+ ldr RA RA ; RA := Keyboard peripheral address deref
+ ldr RA RA ; RA := <16-bit keyboard character code> from MMIO register
+ ldi vt_term_pp_addr RB ; RB := Terminal peripheral address pointer
+ ldr RB RB ; RB := Terminal peripheral address deref
+ str RA RB ; terminal <- character code (ASCII?)
+ mov RA RE ; RE := character code (for debugging)
+ spo RB
+ spo RA
+ rti
+@label program_segment
+
+; define short prelude that sets up vital instructions
+; NOTE: must be shorter than the vector table offset
+@address 0x0
+; set up stack pointer to point to beginning of stack segment
+ ldi vt_stack_addr RA
+ ldr RA SP
+ jpi program_segment
+
+@address program_segment
+; set graphics mode to disabled
+ ldi vt_gr_mode_addr RA
+ ldr RA RA
+ ldi gr_disabled_mode RB
+ str RB RA
+; jump to main (user defined)
+ jpi main
diff --git a/test/e2e/fibo/fibo.atk16 b/test/e2e/fibo/fibo.atk16
new file mode 100644
index 0000000..608b4d1
--- /dev/null
+++ b/test/e2e/fibo/fibo.atk16
@@ -0,0 +1,53 @@
+; bootstrap code (must be called to setup mandatory data)
+; will jump to label main
+@include bootstrap
+
+@label main
+; call fibo subroutine with parameter 10
+ ldi 10 RA
+ spush RA
+ call fibo
+ spop RA
+ hlt
+
+@label fibo
+; % n -> % result
+
+; store RB, RC on stack
+ spush RB
+ spush RC
+; if n < 2, return n
+ subi RA 2 RA
+ bri sign fibo_early
+; store also RD on stack
+ spush RD
+; a = 0
+ ldi 0 RB
+; b = 1
+ ldi 1 RC
+@label fibo_loop
+; v = a + b
+ add RB RC RD
+; a = b
+ mov RC RB
+; b = v
+ mov RD RC
+; n -= 1
+ dec RA
+; loop while n > 0
+ bri zero fibo_done
+ jpi fibo_loop
+@label fibo_early
+; restore used registers
+ spop RC
+ spop RB
+; return from subroutine
+ return
+@label fibo_done
+ mov RD RA
+; restore used registers
+ spop RD
+ spop RC
+ spop RB
+; return from subroutine
+ return
diff --git a/test/e2e/fibo/test_fibo.py b/test/e2e/fibo/test_fibo.py
new file mode 100644
index 0000000..426435a
--- /dev/null
+++ b/test/e2e/fibo/test_fibo.py
@@ -0,0 +1,19 @@
+from atk16_asm import assemble
+from atk16_emu import Machine
+from test.utils import pad_bytearray
+
+def test_fibo():
+ filename = "test/e2e/fibo/fibo.atk16"
+ with open(filename, "r") as f:
+ source = f.read()
+
+ obj = assemble(source, filename)
+ rom_image = pad_bytearray(obj)
+
+ machine = Machine()
+ machine.load_rom_image(rom_image)
+ machine.reset()
+ machine.run_until_halted()
+ machine.print_state_summary()
+
+ assert machine.ra.value == 34