aboutsummaryrefslogtreecommitdiffstats
path: root/asm
diff options
context:
space:
mode:
Diffstat (limited to 'asm')
-rw-r--r--asm/ast_compiler_bootstrap.atk165
-rw-r--r--asm/test_py_src.atk16285
-rw-r--r--asm/test_py_src.atk16_optimized202
-rw-r--r--asm/test_py_src.py9
4 files changed, 143 insertions, 358 deletions
diff --git a/asm/ast_compiler_bootstrap.atk16 b/asm/ast_compiler_bootstrap.atk16
index 7036291..18a345a 100644
--- a/asm/ast_compiler_bootstrap.atk16
+++ b/asm/ast_compiler_bootstrap.atk16
@@ -2,7 +2,9 @@
@use ext_std:*
-@let sp RH
+@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
@@ -30,6 +32,7 @@
@address 0x0
ldi vt_stack_addr RA
ldr RA SP
+ mov SP FP
jpi program_segment
@address vector_table
diff --git a/asm/test_py_src.atk16 b/asm/test_py_src.atk16
index 2d8e311..b605dad 100644
--- a/asm/test_py_src.atk16
+++ b/asm/test_py_src.atk16
@@ -2,7 +2,9 @@
@use ext_std:*
-@let sp RH
+@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
@@ -30,6 +32,7 @@
@address 0x0
ldi vt_stack_addr RA
ldr RA SP
+ mov SP FP
jpi program_segment
@address vector_table
@@ -77,47 +80,39 @@
23
@label text_mem_addr_p
25
-@label int_1
+@label int_0
65
-@label int_5
+@label int_6
26
-; <ast.FunctionDef object at 0x1048ce500>
+; <ast.FunctionDef object at 0x104f1f370>
@label nth_letter
; stack frame with offsets
-; return_address_0 3
-; n 4
-; <ast.Return object at 0x1048ce440>
-; <ast.Add object at 0x1045f6ad0>
-; BinOp lhs <ast.BinOp object at 0x1048ce410>
-; <ast.Name object at 0x1048ce3e0> (n)
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 4 RB
- add RA RB RA
- ldr RA RA
- spu RA
-; BinOp rhs <ast.BinOp object at 0x1048ce410>
-; <ast.Constant object at 0x1048ce3b0>
- ldi int_1 RA
- ldr RA RA
- spu RA
- spo RB
- spo RA
- add RA RB RA
- spu RA
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 3 RB
- add RA RB RA
-; stack address of return address is stored in reg RA
- spo RB
-; return value is stored in reg RB
- mov RA SP
- ldr RA RA
- spu RB
+; n 0
+; <ast.Return object at 0x104f1f430>
+; <ast.Add object at 0x104ed2c20>
+; BinOp lhs <ast.BinOp object at 0x1051b52a0>
+; <ast.Call object at 0x1051b5270>
+; Builtin call ord [<ast.Constant object at 0x1051b51e0>]
+; <ast.Constant object at 0x1051b51e0>
+ ldi int_0 RC
+ ldr RC RC ; int_0 = 65
+ spu RC
+; BinOp rhs <ast.BinOp object at 0x1051b52a0>
+; <ast.Name object at 0x1051b51b0> (n)
+ ldi 0 RC
+ add FP RC RC
+ ldr RC RC
+ spu RC
+ spo RD
+ spo RC
+ add RC RD RC
+ spu RC
+; return value is on top of stack
; return from function
- jpr RA
+ subi FP 1 FP
+ ldr FP RB
+ jpr RB
@label main
; stack frame with offsets
@@ -125,186 +120,182 @@
; text_mem_addr 1
; i 2
addi SP 3 SP
-; <ast.Assign object at 0x1048ce860>
-; assigning graphics_mode_addr at stack segment + 0
+; <ast.Assign object at 0x104f1ffd0>
+; assigning graphics_mode_addr at FP + 0
; evaluating value to be assigned
-; <ast.Call object at 0x1048ce800>
-; Builtin call load [<ast.Name object at 0x1048ce770>]
-; <ast.Name object at 0x1048ce770> (GRAPHICS_MODE_ADDR_P)
+; <ast.Call object at 0x104f1fa00>
+; Builtin call load [<ast.Name object at 0x104f1f970>]
+; <ast.Name object at 0x104f1f970> (GRAPHICS_MODE_ADDR_P)
ldi graphics_mode_addr_p RC
ldr RC RC
spu RC
+; (load) dereferencing top of stack
spo RC
ldr RC RC
spu RC
-; assigning value to stack segment + 0
- ldi vt_stack_addr RA
- ldr RA RA
+; assigning stack address (FP + 0) := top of stack
+ spo RA
ldi 0 RB
- add RA RB RA
- spo RB
- str RB RA
-; <ast.Assign object at 0x1048ce740>
-; assigning text_mem_addr at stack segment + 1
+ add RB FP RB
+ str RA RB
+; <ast.Assign object at 0x104f1f940>
+; assigning text_mem_addr at FP + 1
; evaluating value to be assigned
-; <ast.Call object at 0x1048ce6e0>
-; Builtin call load [<ast.Name object at 0x1048ce650>]
-; <ast.Name object at 0x1048ce650> (TEXT_MEM_ADDR_P)
+; <ast.Call object at 0x104f1f610>
+; Builtin call load [<ast.Name object at 0x104f1f550>]
+; <ast.Name object at 0x104f1f550> (TEXT_MEM_ADDR_P)
ldi text_mem_addr_p RC
ldr RC RC
spu RC
+; (load) dereferencing top of stack
spo RC
ldr RC RC
spu RC
-; assigning value to stack segment + 1
- ldi vt_stack_addr RA
- ldr RA RA
+; assigning stack address (FP + 1) := top of stack
+ spo RA
ldi 1 RB
- add RA RB RA
- spo RB
- str RB RA
-; <ast.Call object at 0x1048ce5f0>
-; Builtin call store [<ast.Name object at 0x1048ce560>, <ast.Name object at 0x1048ce530>]
-; <ast.Name object at 0x1048ce560> (graphics_mode_addr)
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 0 RB
- add RA RB RA
+ add RB FP RB
+ str RA RB
+; <ast.Call object at 0x104f1f4f0>
+; Builtin call store [<ast.Name object at 0x104f1f3d0>, <ast.Name object at 0x104f1f3a0>]
+; <ast.Name object at 0x104f1f3d0> (graphics_mode_addr)
+ ldi 0 RA
+ add FP RA RA
ldr RA RA
spu RA
-; <ast.Name object at 0x1048ce530> (TEXT_MODE)
+; <ast.Name object at 0x104f1f3a0> (TEXT_MODE)
ldi text_mode RA
ldr RA RA
spu RA
spo RB
spo RA
str RB RA
-; <ast.Assign object at 0x1048ce350>
-; assigning i at stack segment + 2
+ ldi 0 RA
+ spu RA
+; popping free-standing Expr result from stack
+ spo RA
+; <ast.Assign object at 0x1051b5150>
+; assigning i at FP + 2
; evaluating value to be assigned
-; <ast.Constant object at 0x1048ce2f0>
+; <ast.Constant object at 0x1051b50f0>
ldi 0 RC
spu RC
-; assigning value to stack segment + 2
- ldi vt_stack_addr RA
- ldr RA RA
+; assigning stack address (FP + 2) := top of stack
+ spo RA
ldi 2 RB
- add RA RB RA
- spo RB
- str RB RA
-; <ast.Call object at 0x1048ce290>
-; Builtin call asm [<ast.Constant object at 0x1048ce200>]
- ldi 0b111111111 RG
-; <ast.While object at 0x1048ce1d0>
-@label while_test_2
-; <ast.Name object at 0x1048ce170> (i)
- ldi vt_stack_addr RB
- ldr RB RB
- ldi 2 RC
- add RB RC RB
+ add RB FP RB
+ str RA RB
+; <ast.While object at 0x1051b50c0>
+@label while_test_1
+; <ast.Compare object at 0x1051b5090>
+; <ast.Name object at 0x1051b5060> (i)
+ ldi 2 RB
+ add FP RB RB
ldr RB RB
spu RB
-; <ast.Constant object at 0x1048ce140>
- ldi int_5 RB
- ldr RB RB
+; <ast.Constant object at 0x1051b5030>
+ ldi int_6 RB
+ ldr RB RB ; int_6 = 26
spu RB
+; Comparing <ast.Name object at 0x1051b5060> <ast.Lt object at 0x104ed2470> <ast.Constant object at 0x1051b5030>
spo RC
spo RB
sub RB RC RB
- bri carry Compare_true_6
+ bri carry Compare_true_4
ldi 0 RB
spu RB
- jpi Compare_end_7
-@label compare_true_6
+ jpi Compare_end_5
+@label compare_true_4
ldi 1 RB
spu RB
-@label compare_end_7
+@label compare_end_5
spo RA
addi RA 0 RA
- bri zero While_else_3
-; <ast.Call object at 0x1048ce0e0>
-; Builtin call store [<ast.BinOp object at 0x1048ce050>, <ast.Call object at 0x1048cdd80>]
-; <ast.Add object at 0x1045f6ad0>
-; BinOp lhs <ast.BinOp object at 0x1048ce050>
-; <ast.Name object at 0x1048ce020> (text_mem_addr)
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 1 RB
- add RA RB RA
+ bri zero While_else_2
+; <ast.Call object at 0x1051b4fd0>
+; Builtin call store [<ast.BinOp object at 0x1051b4f40>, <ast.Call object at 0x1051b4eb0>]
+; <ast.Add object at 0x104ed2c20>
+; BinOp lhs <ast.BinOp object at 0x1051b4f40>
+; <ast.Name object at 0x1051b4f10> (text_mem_addr)
+ ldi 1 RA
+ add FP RA RA
ldr RA RA
spu RA
-; BinOp rhs <ast.BinOp object at 0x1048ce050>
-; <ast.Name object at 0x1048cdff0> (i)
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 2 RB
- add RA RB RA
+; BinOp rhs <ast.BinOp object at 0x1051b4f40>
+; <ast.Name object at 0x1051b4ee0> (i)
+ ldi 2 RA
+ add FP RA RA
ldr RA RA
spu RA
spo RB
spo RA
add RA RB RA
spu RA
-; <ast.Call object at 0x1048cdd80>
+; <ast.Call object at 0x1051b4eb0>
; Call function nth_letter
+ spu FP
ldi 0 RA
spu RA
-; <ast.Name object at 0x1048cdd20> (i)
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 2 RB
- add RA RB RA
+; <ast.Name object at 0x1051b4e50> (i)
+ ldi 2 RA
+ add FP RA RA
ldr RA RA
spu RA
+ subi SP 2 FP
; set up return address and jump to subroutine
- subi SP 2 RA
- lpc RB
- addi RB 3 RB
- str RB RA
+ lpc RA
+ addi RA 4 RA
+ str RA FP
+ addi FP 1 FP
jpi nth_letter
+ spo RA
+ mov FP SP
+ spo FP
+ spu RA
spo RB
spo RA
str RB RA
-; <ast.Assign object at 0x1048ccc70>
-; assigning i at stack segment + 2
+ ldi 0 RA
+ spu RA
+; popping free-standing Expr result from stack
+ spo RA
+; <ast.Assign object at 0x1051b4e20>
+; assigning i at FP + 2
; evaluating value to be assigned
-; <ast.Add object at 0x1045f6ad0>
-; BinOp lhs <ast.BinOp object at 0x1048cda50>
-; <ast.Name object at 0x1048cd750> (i)
- ldi vt_stack_addr RC
- ldr RC RC
- ldi 2 RD
- add RC RD RC
+; <ast.Add object at 0x104ed2c20>
+; BinOp lhs <ast.BinOp object at 0x1051b4dc0>
+; <ast.Name object at 0x1051b4d90> (i)
+ ldi 2 RC
+ add FP RC RC
ldr RC RC
spu RC
-; BinOp rhs <ast.BinOp object at 0x1048cda50>
-; <ast.Constant object at 0x1048cd720>
+; BinOp rhs <ast.BinOp object at 0x1051b4dc0>
+; <ast.Constant object at 0x1051b4d60>
ldi 1 RC
spu RC
spo RD
spo RC
add RC RD RC
spu RC
-; assigning value to stack segment + 2
- ldi vt_stack_addr RA
- ldr RA RA
+; assigning stack address (FP + 2) := top of stack
+ spo RA
ldi 2 RB
- add RA RB RA
- spo RB
- str RB RA
- jpi While_test_2
-@label while_else_3
-@label while_end_4
-; <ast.While object at 0x1048cd0f0>
-@label while_test_8
-; <ast.Constant object at 0x1048cd060>
+ add RB FP RB
+ str RA RB
+ jpi While_test_1
+@label while_else_2
+@label while_end_3
+; <ast.While object at 0x1051b4d30>
+@label while_test_7
+; <ast.Constant object at 0x1051b4d00>
ldi 1 RB
spu RB
spo RA
addi RA 0 RA
- bri zero While_else_9
-; <ast.Pass object at 0x1048ccfa0>
- jpi While_test_8
-@label while_else_9
-@label while_end_10
- subi SP 3 SP
+ bri zero While_else_8
+; <ast.Pass object at 0x1051b4cd0>
+ jpi While_test_7
+@label while_else_8
+@label while_end_9
+ mov FP SP
+ hlt
diff --git a/asm/test_py_src.atk16_optimized b/asm/test_py_src.atk16_optimized
deleted file mode 100644
index f526853..0000000
--- a/asm/test_py_src.atk16_optimized
+++ /dev/null
@@ -1,202 +0,0 @@
-@use ext_std:*
-@let sp RH
-@let vector_table 0x10
-@let vt_ISR0 0x10
-@let vt_ISR1 0x11
-@let vt_ISR2 0x12
-@let vt_ISR3 0x13
-@let vt_stack_addr 0x14
-@let vt_term_pp_addr 0x15
-@let vt_kb_pp_addr 0x16
-@let vt_gr_mode_addr 0x17
-@let vt_sprite_mem 0x18
-@let vt_text_mem 0x19
-@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
- jpi program_segment
-@address vector_table
- keyboard_isr
- hlt_isr
- hlt_isr
- hlt_isr
- stack_segment
- terminal_addr
- keyboard_addr
- gr_mode_addr
- sprite_mem
- text_mem
-@label hlt_isr
- ldi 0x55 RE
- 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
-@label text_mode
- 1
-@label graphics_mode_addr_p
- 23
-@label text_mem_addr_p
- 25
-@label int_1
- 65
-@label int_5
- 26
-@label nth_letter
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 4 RB
- add RA RB RA
- ldr RA RA
- ldi int_1 RB
- ldr RB RB
- add RA RB RA
- spu RA
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 3 RB
- add RA RB RA
- spo RB
- mov RA SP
- ldr RA RA
- spu RB
- jpr RA
-@label main
- addi SP 3 SP
- ldi graphics_mode_addr_p RC
- ldr RC RC
- ldr RC RC
- spu RC
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 0 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 1 RB
- add RA RB RA
- spo RB
- str RB RA
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 0 RB
- add RA RB RA
- ldr RA RA
- ldi text_mode RB
- ldr RB RB
- str RB RA
- ldi 0 RC
- spu RC
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 2 RB
- add RA RB RA
- spo RB
- str RB RA
- ldi 0b111111111 RG
-@label while_test_2
- ldi vt_stack_addr RB
- ldr RB RB
- ldi 2 RC
- add RB RC RB
- ldr RB RB
- ldi int_5 RC
- ldr RC RC
- sub RB RC RB
- bri carry Compare_true_6
- ldi 0 RB
- spu RB
- jpi Compare_end_7
-@label compare_true_6
- ldi 1 RB
- spu RB
-@label compare_end_7
- spo RA
- addi RA 0 RA
- bri zero While_else_3
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 1 RB
- add RA RB RA
- ldr RA RA
- spu RA
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 2 RB
- add RA RB RA
- ldr RA RB
- spo RA
- add RA RB RA
- spu RA
- ldi 0 RA
- spu RA
- ldi vt_stack_addr RA
- ldr RA RA
- ldi 2 RB
- add RA RB RA
- ldr RA RA
- spu RA
- subi SP 2 RA
- lpc RB
- addi RB 3 RB
- str RB RA
- jpi nth_letter
- spo RB
- spo RA
- str RB RA
- ldi vt_stack_addr RC
- ldr RC RC
- ldi 2 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 2 RB
- add RA RB RA
- spo RB
- str RB RA
- jpi While_test_2
-@label while_else_3
-@label while_end_4
-@label while_test_8
- ldi 1 RA
- addi RA 0 RA
- bri zero While_else_9
- jpi While_test_8
-@label while_else_9
-@label while_end_10
- subi SP 3 SP \ No newline at end of file
diff --git a/asm/test_py_src.py b/asm/test_py_src.py
index 74ea60d..ec17ddc 100644
--- a/asm/test_py_src.py
+++ b/asm/test_py_src.py
@@ -1,6 +1,5 @@
import atk16
-
TEXT_MODE: atk16.ConstInt = 1
GRAPHICS_MODE_ADDR_P: atk16.ConstInt = 0x17
TEXT_MEM_ADDR_P: atk16.ConstInt = 0x19
@@ -10,18 +9,12 @@ text_mem_addr = atk16.load(TEXT_MEM_ADDR_P)
atk16.store(graphics_mode_addr, TEXT_MODE)
-
def nth_letter(n: int) -> int:
- return n + 65
+ return atk16.ord('A') + n
i = 0
-atk16.asm("ldi 0b111111111 RG")
while i < 26:
- # bug: stack frame offset for nth_letter is calculated
- # one off because text_mem_addr + i takes up one
- # stack slot
atk16.store(text_mem_addr + i, nth_letter(i))
- #atk16.store(text_mem_addr + i, i + 65)
i = i + 1
while True: