aboutsummaryrefslogtreecommitdiffstats
path: root/asm
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2023-11-11 23:13:43 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2023-11-12 00:40:00 +0200
commit6f68c0febdbfd6138fa95f77bc09785bde8a8371 (patch)
tree8f622e64ddbfa132e9fa991bb3e5961b72f826bb /asm
parentf7dd9705d44b9cee5103b267797c0449d42319df (diff)
Add function defs & calls
Diffstat (limited to 'asm')
-rw-r--r--asm/atk16.py4
-rw-r--r--asm/test_py_src.atk16266
-rw-r--r--asm/test_py_src.atk16_optimized161
-rw-r--r--asm/test_py_src.py20
4 files changed, 405 insertions, 46 deletions
diff --git a/asm/atk16.py b/asm/atk16.py
index 6d9bc10..9a5921c 100644
--- a/asm/atk16.py
+++ b/asm/atk16.py
@@ -20,3 +20,7 @@ def call_inline(expr: T) -> T:
def asm(asm: str):
"""Inject ATK16 assembly `asm` into the compiled output."""
return NotImplemented
+
+def ord(char: Char) -> int:
+ """Convert char to int"""
+ return NotImplemented
diff --git a/asm/test_py_src.atk16 b/asm/test_py_src.atk16
index ca44267..02752ec 100644
--- a/asm/test_py_src.atk16
+++ b/asm/test_py_src.atk16
@@ -73,50 +73,256 @@
;; END BOOTSTRAP
+@label text_mode
+ 1
+@label graphics_mode_addr_p
+ 23
+@label text_mem_addr_p
+ 25
+@label int_1
+ 104
+@label int_2
+ 105
-
-; <ast.FunctionDef object at 0x100c7b310>
+; <ast.FunctionDef object at 0x1032fef50>
@label func
-; stack frame: ['arg1', 'arg2', 'a']
+; stack frame names: ['return_address_0', 'arg1', 'arg2', 'a']
addi SP 1 SP
-; <ast.Name object at 0x100c7aef0> (arg1)
- ldi ${SP - 3} RA
+; <ast.Assign object at 0x1032fee30>
+; assigning a to stack segment + offset 7
+; <ast.Name object at 0x1032fedd0> (arg1)
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 5 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 7 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Return object at 0x1032feda0>
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 4 RB
+ add RA RB RA
+; <ast.Add object at 0x10301ab60>
+; BinOp lhs <ast.BinOp object at 0x1032fed70>
+; <ast.Name object at 0x1032fed40> (a)
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 7 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+; BinOp rhs <ast.BinOp object at 0x1032fed70>
+; <ast.Name object at 0x1032fed10> (a)
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 7 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+ spo RD
+ spo RC
+ add RC RD RC
+ spu RC
+ spo RB
+ mov RA SP
+ ldr RA RA
+ spu RB
+; return from function
+ jpr RA
+
+@label main
+; stack frame names: ['i', 'graphics_mode_addr', 'text_mem_addr', 'b']
+ addi SP 4 SP
+; <ast.Assign object at 0x103067b80>
+; assigning graphics_mode_addr to stack segment + offset 1
+; <ast.Call object at 0x1030677f0>
+; Builtin call load [<ast.Name object at 0x103067fa0>]
+; <ast.Name object at 0x103067fa0> (GRAPHICS_MODE_ADDR_P)
+ ldi graphics_mode_addr_p RC
+ ldr RC RC
+ spu RC
+ spo RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 1 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Assign object at 0x103067790>
+; assigning text_mem_addr to stack segment + offset 2
+; <ast.Call object at 0x103067220>
+; Builtin call load [<ast.Name object at 0x103067f40>]
+; <ast.Name object at 0x103067f40> (TEXT_MEM_ADDR_P)
+ ldi text_mem_addr_p RC
+ ldr RC RC
+ spu RC
+ spo RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Call object at 0x1030673d0>
+; Builtin call store [<ast.Name object at 0x1032fefb0>, <ast.Name object at 0x1032fef80>]
+; <ast.Name object at 0x1032fefb0> (graphics_mode_addr)
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 1 RB
+ add RA RB RA
ldr RA RA
spu RA
+; <ast.Name object at 0x1032fef80> (TEXT_MODE)
+ ldi text_mode RA
+ ldr RA RA
+ spu RA
+ spo RB
spo RA
- ldi ${SP - 1} RB
- str RA RB
-; <ast.Return object at 0x100c7b0a0>
-; <ast.BinOp object at 0x100c7b370>
-; BinOp lhs <ast.BinOp object at 0x100c7b370>
-; <ast.Name object at 0x100c7b3a0> (a)
- ldi ${SP - 1} RA
+ str RB RA
+; <ast.Assign object at 0x1032fecb0>
+; assigning b to stack segment + offset 3
+; <ast.Call object at 0x1032fec50>
+; Call function func
+ ldi 0 RC
+ spu RC
+; <ast.Constant object at 0x1032febf0>
+ ldi 1 RC
+ spu RC
+; <ast.Constant object at 0x1032febc0>
+ ldi 3 RC
+ spu RC
+; set up return address and jump to subroutine
+ subi SP 3 RC
+ lpc RD
+ addi RD 3 RD
+ str RD RC
+ jpi func
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 3 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Assign object at 0x1032feb90>
+; assigning i to stack segment + offset 0
+; <ast.Constant object at 0x1032feb30>
+ ldi 0 RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Call object at 0x1032fead0>
+; Builtin call store [<ast.BinOp object at 0x1032fea40>, <ast.Call object at 0x1032fe9b0>]
+; <ast.Add object at 0x10301ab60>
+; BinOp lhs <ast.BinOp object at 0x1032fea40>
+; <ast.Name object at 0x1032fea10> (text_mem_addr)
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
ldr RA RA
spu RA
-; BinOp rhs <ast.BinOp object at 0x100c7b370>
-; <ast.Name object at 0x100c7b3d0> (a)
- ldi ${SP - 1} RA
+; BinOp rhs <ast.BinOp object at 0x1032fea40>
+; <ast.Name object at 0x1032fe9e0> (i)
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
ldr RA RA
spu RA
spo RB
spo RA
add RA RB RA
spu RA
- subi SP 1 SP
- rsr
-
-@label main
-; stack frame: ['b']
- addi SP 1 SP
-; <ast.Call object at 0x100c7b520>
-; <ast.Constant object at 0x100c7b580>
- ldi 1 RA
+; <ast.Call object at 0x1032fe9b0>
+; Builtin call ord [<ast.Constant object at 0x1032fe920>]
+; <ast.Constant object at 0x1032fe920>
+ ldi int_1 RA
+ ldr RA RA
+ spu RA
+ spo RB
+ spo RA
+ str RB RA
+; <ast.Assign object at 0x1032fe8f0>
+; assigning i to stack segment + offset 0
+; <ast.Add object at 0x10301ab60>
+; BinOp lhs <ast.BinOp object at 0x1032fe890>
+; <ast.Name object at 0x1032fe860> (i)
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 0 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+; BinOp rhs <ast.BinOp object at 0x1032fe890>
+; <ast.Constant object at 0x1032fe830>
+ ldi 1 RC
+ spu RC
+ spo RD
+ spo RC
+ add RC RD RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+; <ast.Call object at 0x1032fe7d0>
+; Builtin call store [<ast.BinOp object at 0x1032fe740>, <ast.Call object at 0x1032fe6b0>]
+; <ast.Add object at 0x10301ab60>
+; BinOp lhs <ast.BinOp object at 0x1032fe740>
+; <ast.Name object at 0x1032fe710> (text_mem_addr)
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
+ ldr RA RA
+ spu RA
+; BinOp rhs <ast.BinOp object at 0x1032fe740>
+; <ast.Name object at 0x1032fe6e0> (i)
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ ldr RA RA
spu RA
-; <ast.Constant object at 0x100c7b5b0>
- ldi 3 RA
+ spo RB
+ spo RA
+ add RA RB RA
+ spu RA
+; <ast.Call object at 0x1032fe6b0>
+; Builtin call ord [<ast.Constant object at 0x1032fe620>]
+; <ast.Constant object at 0x1032fe620>
+ ldi int_2 RA
+ ldr RA RA
spu RA
- csi func
+ spo RB
spo RA
- ldi ${SP - 1} RB
- str RA RB
- subi SP 1 SP
+ str RB RA
+; <ast.While object at 0x1032fe5f0>
+@label while_test_3
+; <ast.Constant object at 0x1032fe5c0>
+ ldi 1 RB
+ spu RB
+ spo RA
+ addi RA 0 RA
+ bri zero While_else_4
+; <ast.Pass object at 0x1032fe590>
+ jpi While_test_3
+@label while_else_4
+@label while_end_5
+ subi SP 4 SP
diff --git a/asm/test_py_src.atk16_optimized b/asm/test_py_src.atk16_optimized
index 4a65ec4..601dfad 100644
--- a/asm/test_py_src.atk16_optimized
+++ b/asm/test_py_src.atk16_optimized
@@ -58,28 +58,157 @@
ldi gr_disabled_mode RB
str RB RA
jpi main
+@label text_mode
+ 1
+@label graphics_mode_addr_p
+ 23
+@label text_mem_addr_p
+ 25
+@label int_1
+ 104
+@label int_2
+ 105
@label func
addi SP 1 SP
- ldi ${SP - 3} RA
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 5 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
ldr RA RA
- ldi ${SP - 1} RB
- str RA RB
- ldi ${SP - 1} RA
+ ldi 7 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi vt_stack_addr RA
ldr RA RA
- ldi ${SP - 1} RB
- ldr RB RB
+ ldi 4 RB
add RA RB RA
- spu RA
- subi SP 1 SP
- rsr
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 7 RD
+ add RC RD RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 7 RD
+ add RC RD RC
+ ldr RC RD
+ spo RC
+ add RC RD RB
+ mov RA SP
+ ldr RA RA
+ spu RB
+ jpr RA
@label main
- addi SP 1 SP
- ldi 1 RA
+ addi SP 4 SP
+ ldi graphics_mode_addr_p RC
+ ldr RC RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 1 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi text_mem_addr_p RC
+ ldr RC RC
+ ldr RC RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 1 RB
+ add RA RB RA
+ ldr RA RA
+ ldi text_mode RB
+ ldr RB RB
+ str RB RA
+ ldi 0 RC
+ spu RC
+ ldi 1 RC
+ spu RC
+ ldi 3 RC
+ spu RC
+ subi SP 3 RC
+ lpc RD
+ addi RD 3 RD
+ str RD RC
+ jpi func
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 3 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi 0 RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
+ ldr RA RA
spu RA
- ldi 3 RA
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ ldr RA RB
+ spo RA
+ add RA RB RA
+ ldi int_1 RB
+ ldr RB RB
+ str RB RA
+ ldi vt_stack_addr RC
+ ldr RC RC
+ ldi 0 RD
+ add RC RD RC
+ ldr RC RC
+ ldi 1 RD
+ add RC RD RC
+ spu RC
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ spo RB
+ str RB RA
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 2 RB
+ add RA RB RA
+ ldr RA RA
spu RA
- csi func
+ ldi vt_stack_addr RA
+ ldr RA RA
+ ldi 0 RB
+ add RA RB RA
+ ldr RA RB
spo RA
- ldi ${SP - 1} RB
- str RA RB
- subi SP 1 SP \ No newline at end of file
+ add RA RB RA
+ ldi int_2 RB
+ ldr RB RB
+ str RB RA
+@label while_test_3
+ ldi 1 RA
+ addi RA 0 RA
+ bri zero While_else_4
+ jpi While_test_3
+@label while_else_4
+@label while_end_5
+ subi SP 4 SP \ No newline at end of file
diff --git a/asm/test_py_src.py b/asm/test_py_src.py
index 9af944e..ca816de 100644
--- a/asm/test_py_src.py
+++ b/asm/test_py_src.py
@@ -1,11 +1,31 @@
import atk16
+TEXT_MODE: atk16.ConstInt = 1
+GRAPHICS_MODE_ADDR_P: atk16.ConstInt = 0x17
+graphics_mode_addr = atk16.load(GRAPHICS_MODE_ADDR_P)
+
+TEXT_MEM_ADDR_P: atk16.ConstInt = 0x19
+text_mem_addr = atk16.load(TEXT_MEM_ADDR_P)
+
+atk16.store(graphics_mode_addr, TEXT_MODE)
+
def func(arg1: int, arg2: int) -> int:
a = arg1
return a + a
b = func(1, 3)
+i = 0
+atk16.store(text_mem_addr + i, atk16.ord("h"))
+i = i + 1
+atk16.store(text_mem_addr + i, atk16.ord("i"))
+
+while True:
+ pass
+
+# atk16.asm("@label keepalive")
+# atk16.asm(" jpi keepalive")
+
# TEXT_MODE: atk16.ConstInt = 1
# GRAPHICS_MODE_ADDR: atk16.ConstInt = 0x17