From e2b7385b03a6dc9c8c39dde5c049cd74b0768bd1 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sun, 12 Nov 2023 16:15:40 +0200 Subject: Remove options, improve functions --- asm/ast_compiler_bootstrap.atk16 | 4 +- asm/ext_std.py | 20 +-- asm/test_py_src.atk16 | 286 ++++++++++++++++++--------------------- asm/test_py_src.atk16_optimized | 146 +++++++++----------- asm/test_py_src.py | 41 ++---- 5 files changed, 225 insertions(+), 272 deletions(-) (limited to 'asm') diff --git a/asm/ast_compiler_bootstrap.atk16 b/asm/ast_compiler_bootstrap.atk16 index 7297c90..7036291 100644 --- a/asm/ast_compiler_bootstrap.atk16 +++ b/asm/ast_compiler_bootstrap.atk16 @@ -1,10 +1,8 @@ ;; BEGIN BOOTSTRAP -@opt stack_pointer RG -@opt csr_scratch RH - @use ext_std:* +@let sp RH @let vector_table 0x10 @let vt_ISR0 0x10 ; ISR0 @let vt_ISR1 0x11 ; ISR1 diff --git a/asm/ext_std.py b/asm/ext_std.py index f4751a3..247e605 100644 --- a/asm/ext_std.py +++ b/asm/ext_std.py @@ -78,24 +78,24 @@ def expand_sinc(imm: str) -> ExpandResult: def expand_sdec(imm: str) -> ExpandResult: return expand_subi("SP", imm, "SP") -def expand_csr(addr_reg: str): +def expand_csr(addr_reg: str, stratch_reg: str): return [ - ["lpc", "CSR_SCRATCH"], - *expand_addi("CSR_SCRATCH", "4", "CSR_SCRATCH"), - *expand_spu("CSR_SCRATCH"), + ["lpc", stratch_reg], + *expand_addi(stratch_reg, "4", stratch_reg), + *expand_spu(stratch_reg), ["jpr", addr_reg] ] -def expand_csi(addr_imm: str): +def expand_csi(addr_imm: str, stratch_reg: str): return [ - ["lpc", "CSR_SCRATCH"], - *expand_addi("CSR_SCRATCH", "4", "CSR_SCRATCH"), - *expand_spu("CSR_SCRATCH"), + ["lpc", stratch_reg], + *expand_addi(stratch_reg, "4", stratch_reg), + *expand_spu(stratch_reg), ["jpi", addr_imm] ] -def expand_rsr(): - return expand_spo("CSR_SCRATCH") + [["jpr", "CSR_SCRATCH"]] +def expand_rsr(stratch_reg: str): + return expand_spo(stratch_reg) + [["jpr", stratch_reg]] def stack_stash(*rs: str): diff --git a/asm/test_py_src.atk16 b/asm/test_py_src.atk16 index 02752ec..2d8e311 100644 --- a/asm/test_py_src.atk16 +++ b/asm/test_py_src.atk16 @@ -1,10 +1,8 @@ ;; BEGIN BOOTSTRAP -@opt stack_pointer RG -@opt csr_scratch RH - @use ext_std:* +@let sp RH @let vector_table 0x10 @let vt_ISR0 0x10 ; ISR0 @let vt_ISR1 0x11 ; ISR1 @@ -80,56 +78,41 @@ @label text_mem_addr_p 25 @label int_1 - 104 -@label int_2 - 105 + 65 +@label int_5 + 26 -; -@label func -; stack frame names: ['return_address_0', 'arg1', 'arg2', 'a'] - addi SP 1 SP -; -; assigning a to stack segment + offset 7 -; (arg1) - ldi vt_stack_addr RC - ldr RC RC - ldi 5 RD - add RC RD RC - ldr RC RC - spu RC +; +@label nth_letter +; stack frame with offsets +; return_address_0 3 +; n 4 +; +; +; BinOp lhs +; (n) ldi vt_stack_addr RA ldr RA RA - ldi 7 RB + ldi 4 RB add RA RB RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi int_1 RA + ldr RA RA + spu RA spo RB - str RB RA -; + spo RA + add RA RB RA + spu RA ldi vt_stack_addr RA ldr RA RA - ldi 4 RB + ldi 3 RB add RA RB RA -; -; BinOp lhs -; (a) - ldi vt_stack_addr RC - ldr RC RC - ldi 7 RD - add RC RD RC - ldr RC RC - spu RC -; BinOp rhs -; (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 +; 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 @@ -137,109 +120,124 @@ jpr RA @label main -; stack frame names: ['i', 'graphics_mode_addr', 'text_mem_addr', 'b'] - addi SP 4 SP -; -; assigning graphics_mode_addr to stack segment + offset 1 -; -; Builtin call load [] -; (GRAPHICS_MODE_ADDR_P) +; stack frame with offsets +; graphics_mode_addr 0 +; text_mem_addr 1 +; i 2 + addi SP 3 SP +; +; assigning graphics_mode_addr at stack segment + 0 +; evaluating value to be assigned +; +; Builtin call load [] +; (GRAPHICS_MODE_ADDR_P) ldi graphics_mode_addr_p RC ldr RC RC spu RC spo RC ldr RC RC spu RC +; assigning value to stack segment + 0 ldi vt_stack_addr RA ldr RA RA - ldi 1 RB + ldi 0 RB add RA RB RA spo RB str RB RA -; -; assigning text_mem_addr to stack segment + offset 2 -; -; Builtin call load [] -; (TEXT_MEM_ADDR_P) +; +; assigning text_mem_addr at stack segment + 1 +; evaluating value to be assigned +; +; Builtin call load [] +; (TEXT_MEM_ADDR_P) ldi text_mem_addr_p RC ldr RC RC spu RC spo RC ldr RC RC spu RC +; assigning value to stack segment + 1 ldi vt_stack_addr RA ldr RA RA - ldi 2 RB + ldi 1 RB add RA RB RA spo RB str RB RA -; -; Builtin call store [, ] -; (graphics_mode_addr) +; +; Builtin call store [, ] +; (graphics_mode_addr) ldi vt_stack_addr RA ldr RA RA - ldi 1 RB + ldi 0 RB add RA RB RA ldr RA RA spu RA -; (TEXT_MODE) +; (TEXT_MODE) ldi text_mode RA ldr RA RA spu RA spo RB spo RA str RB RA -; -; assigning b to stack segment + offset 3 -; -; Call function func +; +; assigning i at stack segment + 2 +; evaluating value to be assigned +; ldi 0 RC spu RC -; - ldi 1 RC - spu RC -; - 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 +; assigning value to stack segment + 2 ldi vt_stack_addr RA ldr RA RA - ldi 3 RB + ldi 2 RB add RA RB RA spo RB str RB RA -; -; assigning i to stack segment + offset 0 -; - ldi 0 RC - spu RC - ldi vt_stack_addr RA - ldr RA RA - ldi 0 RB - add RA RB RA +; +; Builtin call asm [] + ldi 0b111111111 RG +; +@label while_test_2 +; (i) + ldi vt_stack_addr RB + ldr RB RB + ldi 2 RC + add RB RC RB + ldr RB RB + spu RB +; + ldi int_5 RB + ldr RB RB + spu RB + spo RC spo RB - str RB RA -; -; Builtin call store [, ] -; -; BinOp lhs -; (text_mem_addr) + 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 +; +; Builtin call store [, ] +; +; BinOp lhs +; (text_mem_addr) ldi vt_stack_addr RA ldr RA RA - ldi 2 RB + ldi 1 RB add RA RB RA ldr RA RA spu RA -; BinOp rhs -; (i) +; BinOp rhs +; (i) ldi vt_stack_addr RA ldr RA RA - ldi 0 RB + ldi 2 RB add RA RB RA ldr RA RA spu RA @@ -247,82 +245,66 @@ spo RA add RA RB RA spu RA -; -; Builtin call ord [] -; - ldi int_1 RA +; +; Call function nth_letter + ldi 0 RA + spu RA +; (i) + ldi vt_stack_addr RA + ldr RA RA + ldi 2 RB + add RA RB RA ldr RA RA spu RA +; set up return address and jump to subroutine + subi SP 2 RA + lpc RB + addi RB 3 RB + str RB RA + jpi nth_letter spo RB spo RA str RB RA -; -; assigning i to stack segment + offset 0 -; -; BinOp lhs -; (i) +; +; assigning i at stack segment + 2 +; evaluating value to be assigned +; +; BinOp lhs +; (i) ldi vt_stack_addr RC ldr RC RC - ldi 0 RD + ldi 2 RD add RC RD RC ldr RC RC spu RC -; BinOp rhs -; +; BinOp rhs +; 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 -; -; Builtin call store [, ] -; -; BinOp lhs -; (text_mem_addr) +; assigning value to stack segment + 2 ldi vt_stack_addr RA ldr RA RA ldi 2 RB add RA RB RA - ldr RA RA - spu RA -; BinOp rhs -; (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 -; -; Builtin call ord [] -; - ldi int_2 RA - ldr RA RA - spu RA spo RB - spo RA str RB RA -; -@label while_test_3 -; + jpi While_test_2 +@label while_else_3 +@label while_end_4 +; +@label while_test_8 +; ldi 1 RB spu RB spo 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 + bri zero While_else_9 +; + jpi While_test_8 +@label while_else_9 +@label while_end_10 + subi SP 3 SP diff --git a/asm/test_py_src.atk16_optimized b/asm/test_py_src.atk16_optimized index 601dfad..f526853 100644 --- a/asm/test_py_src.atk16_optimized +++ b/asm/test_py_src.atk16_optimized @@ -1,6 +1,5 @@ -@opt stack_pointer RG -@opt csr_scratch RH @use ext_std:* +@let sp RH @let vector_table 0x10 @let vt_ISR0 0x10 @let vt_ISR1 0x11 @@ -65,53 +64,37 @@ @label text_mem_addr_p 25 @label int_1 - 104 -@label int_2 - 105 -@label func - addi SP 1 SP - ldi vt_stack_addr RC - ldr RC RC - ldi 5 RD - add RC RD RC - ldr RC RC - spu RC + 65 +@label int_5 + 26 +@label nth_letter ldi vt_stack_addr RA ldr RA RA - ldi 7 RB + ldi 4 RB add RA RB RA - spo RB - str 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 4 RB + ldi 3 RB add RA RB RA - 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 + spo RB mov RA SP ldr RA RA spu RB jpr RA @label main - addi SP 4 SP + 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 1 RB + ldi 0 RB add RA RB RA spo RB str RB RA @@ -121,13 +104,13 @@ spu RC ldi vt_stack_addr RA ldr RA RA - ldi 2 RB + ldi 1 RB add RA RB RA spo RB str RB RA ldi vt_stack_addr RA ldr RA RA - ldi 1 RB + ldi 0 RB add RA RB RA ldr RA RA ldi text_mode RB @@ -135,48 +118,66 @@ 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 + ldi 2 RB add RA RB RA spo RB str RB RA - ldi 0 RC - spu RC - ldi vt_stack_addr RA - ldr RA 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 - add RA RB RA - spo RB - str RB RA + 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 2 RB + ldi 1 RB add RA RB RA ldr RA RA spu RA ldi vt_stack_addr RA ldr RA RA - ldi 0 RB + ldi 2 RB add RA RB RA ldr RA RB spo RA add RA RB RA - ldi int_1 RB - ldr RB RB + 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 0 RD + ldi 2 RD add RC RD RC ldr RC RC ldi 1 RD @@ -184,31 +185,18 @@ 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 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_2 RB - ldr RB RB + spo RB str RB RA -@label while_test_3 + 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_4 - jpi While_test_3 -@label while_else_4 -@label while_end_5 - subi SP 4 SP \ No newline at end of file + 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 ca816de..74ea60d 100644 --- a/asm/test_py_src.py +++ b/asm/test_py_src.py @@ -1,43 +1,28 @@ 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 + +graphics_mode_addr = atk16.load(GRAPHICS_MODE_ADDR_P) 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) +def nth_letter(n: int) -> int: + return n + 65 i = 0 -atk16.store(text_mem_addr + i, atk16.ord("h")) -i = i + 1 -atk16.store(text_mem_addr + i, atk16.ord("i")) +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: pass - -# atk16.asm("@label keepalive") -# atk16.asm(" jpi keepalive") - -# TEXT_MODE: atk16.ConstInt = 1 -# GRAPHICS_MODE_ADDR: atk16.ConstInt = 0x17 - -# atk16.store(GRAPHICS_MODE_ADDR, TEXT_MODE) -# atk16.store(0xF800, 'H') -# atk16.store(0xF801, 'E') -# atk16.store(0xF802, 'L') -# atk16.store(0xF803, 'L') -# atk16.store(0xF804, 'O') - -# a = atk16.call_inline( -# atk16.load(0xF000) -# ) - -# atk16.asm("ldi 1 RA") -- cgit v1.3