From 14d8401c721fae8367fa24db20af4e344faafdd4 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 13 Nov 2023 23:12:05 +0200 Subject: Fix calling issues --- asm/test_py_src.atk16 | 285 ++++++++++++++++++++++++-------------------------- 1 file changed, 138 insertions(+), 147 deletions(-) (limited to 'asm/test_py_src.atk16') 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 -; +; @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 4 RB - add RA RB RA - ldr RA RA - spu RA -; BinOp rhs -; - 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 +; +; +; BinOp lhs +; +; Builtin call ord [] +; + ldi int_0 RC + ldr RC RC ; int_0 = 65 + spu RC +; BinOp rhs +; (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 -; -; assigning graphics_mode_addr at stack segment + 0 +; +; assigning graphics_mode_addr at FP + 0 ; evaluating value to be assigned -; -; Builtin call load [] -; (GRAPHICS_MODE_ADDR_P) +; +; Builtin call load [] +; (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 -; -; assigning text_mem_addr at stack segment + 1 + add RB FP RB + str RA RB +; +; assigning text_mem_addr at FP + 1 ; evaluating value to be assigned -; -; Builtin call load [] -; (TEXT_MEM_ADDR_P) +; +; Builtin call load [] +; (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 -; -; Builtin call store [, ] -; (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 +; +; Builtin call store [, ] +; (graphics_mode_addr) + ldi 0 RA + add FP RA 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 i at stack segment + 2 + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; assigning i at FP + 2 ; evaluating value to be assigned -; +; 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 -; -; 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 + add RB FP RB + str RA RB +; +@label while_test_1 +; +; (i) + ldi 2 RB + add FP RB RB ldr RB RB spu RB -; - ldi int_5 RB - ldr RB RB +; + ldi int_6 RB + ldr RB RB ; int_6 = 26 spu RB +; Comparing 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 -; -; Builtin call store [, ] -; -; BinOp lhs -; (text_mem_addr) - ldi vt_stack_addr RA - ldr RA RA - ldi 1 RB - add RA RB RA + bri zero While_else_2 +; +; Builtin call store [, ] +; +; BinOp lhs +; (text_mem_addr) + ldi 1 RA + add FP RA RA ldr RA RA spu RA -; BinOp rhs -; (i) - ldi vt_stack_addr RA - ldr RA RA - ldi 2 RB - add RA RB RA +; BinOp rhs +; (i) + ldi 2 RA + add FP RA RA ldr RA RA spu RA spo RB spo RA add RA RB RA spu RA -; +; ; Call function nth_letter + spu FP ldi 0 RA spu RA -; (i) - ldi vt_stack_addr RA - ldr RA RA - ldi 2 RB - add RA RB RA +; (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 -; -; assigning i at stack segment + 2 + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; assigning i at FP + 2 ; evaluating value to be assigned -; -; BinOp lhs -; (i) - ldi vt_stack_addr RC - ldr RC RC - ldi 2 RD - add RC RD RC +; +; BinOp lhs +; (i) + ldi 2 RC + add FP RC 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 -; 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 -; -@label while_test_8 -; + add RB FP RB + str RA RB + jpi While_test_1 +@label while_else_2 +@label while_end_3 +; +@label while_test_7 +; ldi 1 RB spu RB spo 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 + bri zero While_else_8 +; + jpi While_test_7 +@label while_else_8 +@label while_end_9 + mov FP SP + hlt -- cgit v1.3