From abf0594c78087434bced59054896f7f411e18faf Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Tue, 20 Feb 2024 16:16:14 +0200 Subject: Commit uncommitted changes --- asm/aoc23_1a.atk16 | 554 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 554 insertions(+) create mode 100644 asm/aoc23_1a.atk16 (limited to 'asm/aoc23_1a.atk16') diff --git a/asm/aoc23_1a.atk16 b/asm/aoc23_1a.atk16 new file mode 100644 index 0000000..78c4622 --- /dev/null +++ b/asm/aoc23_1a.atk16 @@ -0,0 +1,554 @@ +;; BEGIN BOOTSTRAP + +@use ext_std:* + +@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 +@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 + +@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 + mov SP FP + jpi program_segment + +@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 + 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 + +;; END BOOTSTRAP + +@label int_0 + 8 +@label graphics_no_mode + 0 +@label graphics_text_mode + 1 +@label graphics_sprite_mode + 2 +@label graphics_mode_pp + 23 +@label text_mem_pp + 25 +@label input_p + 36864 +@label input_elem_size + 256 +@label int_1 + 49 +@label int_2 + 97 +@label int_3 + 98 +@label int_4 + 99 +@label int_5 + 50 + + + +@label main +; stack frame with offsets +; graphics_mode_p 0 +; text_mem_p 1 +; row_p 2 +; i 3 +; first 4 +; last 5 +; char_p 6 +; char 7 + ldi int_0 RA + ldr RA RA + add SP RA SP +; +; assigning graphics_mode_p at FP + 0 +; evaluating value to be assigned +; +; Builtin call load [] +; (GRAPHICS_MODE_PP) + ldi graphics_mode_pp RC + ldr RC RC + spu RC +; (load) dereferencing top of stack + spo RC + ldr RC RC + spu RC +; assigning stack address (FP + 0) := top of stack + spo RA + ldi 0 RB + add RB FP RB + str RA RB +; +; assigning text_mem_p at FP + 1 +; evaluating value to be assigned +; +; Builtin call load [] +; (TEXT_MEM_PP) + ldi text_mem_pp RC + ldr RC RC + spu RC +; (load) dereferencing top of stack + spo RC + ldr RC RC + spu RC +; assigning stack address (FP + 1) := top of stack + spo RA + ldi 1 RB + add RB FP RB + str RA RB +; +; Builtin call store [, ] +; (graphics_mode_p) + ldi 0 RA + add FP RA RA + ldr RA RA + spu RA +; (GRAPHICS_TEXT_MODE) + ldi graphics_text_mode RA + ldr RA RA + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 0 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi int_1 RA + ldr RA RA ; int_1 = 49 + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 1 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi int_2 RA + ldr RA RA ; int_2 = 97 + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 2 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi int_3 RA + ldr RA RA ; int_3 = 98 + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 3 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi int_4 RA + ldr RA RA ; int_4 = 99 + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 4 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi int_5 RA + ldr RA RA ; int_5 = 50 + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (INPUT_P) + ldi input_p RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 5 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; + ldi 0 RA + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; assigning row_p at FP + 2 +; evaluating value to be assigned +; (INPUT_P) + ldi input_p RC + ldr RC RC + spu RC +; assigning stack address (FP + 2) := top of stack + spo RA + ldi 2 RB + add RB FP RB + str RA RB +; +; assigning i at FP + 3 +; evaluating value to be assigned +; + ldi 0 RC + spu RC +; assigning stack address (FP + 3) := top of stack + spo RA + ldi 3 RB + add RB FP RB + str RA RB +; +; assigning first at FP + 4 +; evaluating value to be assigned +; +; Builtin call load [] +; (row_p) + ldi 2 RC + add FP RC RC + ldr RC RC + spu RC +; (load) dereferencing top of stack + spo RC + ldr RC RC + spu RC +; assigning stack address (FP + 4) := top of stack + spo RA + ldi 4 RB + add RB FP RB + str RA RB +; +; assigning last at FP + 5 +; evaluating value to be assigned +; + ldi 0 RC + spu RC +; assigning stack address (FP + 5) := top of stack + spo RA + ldi 5 RB + add RB FP RB + str RA RB +; +@label while_test_6 +; + ldi 1 RB + spu RB + spo RA + addi RA 0 RA + bri zero While_else_7 +; +; assigning char_p at FP + 6 +; evaluating value to be assigned +; +; BinOp lhs +; (INPUT_P) + ldi input_p RC + ldr RC RC + spu RC +; BinOp rhs +; (i) + ldi 3 RC + add FP RC RC + ldr RC RC + spu RC + spo RD + spo RC + add RC RD RC + spu RC +; assigning stack address (FP + 6) := top of stack + spo RA + ldi 6 RB + add RB FP RB + str RA RB +; +; assigning char at FP + 7 +; evaluating value to be assigned +; +; Builtin call load [] +; (char_p) + ldi 6 RC + add FP RC RC + ldr RC RC + spu RC +; (load) dereferencing top of stack + spo RC + ldr RC RC + spu RC +; assigning stack address (FP + 7) := top of stack + spo RA + ldi 7 RB + add RB FP RB + str RA RB +; +; +; (char) + ldi 7 RA + add FP RA RA + ldr RA RA + spu RA +; + ldi 0 RA + spu RA +; Comparing + spo RA + addi RA 0 RA + bri zero If_false_branch_11 +; + jpi While_end_8 + jpi If_end_branch_12 +@label if_false_branch_11 +@label if_end_branch_12 +; +; assigning last at FP + 5 +; evaluating value to be assigned +; (char) + ldi 7 RC + add FP RC RC + ldr RC RC + spu RC +; assigning stack address (FP + 5) := top of stack + spo RA + ldi 5 RB + add RB FP RB + str RA RB +; +; assigning i at FP + 3 +; evaluating value to be assigned +; +; BinOp lhs +; (i) + ldi 3 RC + add FP RC RC + ldr RC RC + spu RC +; BinOp rhs +; + ldi 1 RC + spu RC + spo RD + spo RC + add RC RD RC + spu RC +; assigning stack address (FP + 3) := top of stack + spo RA + ldi 3 RB + add RB FP RB + str RA RB + jpi While_test_6 +@label while_else_7 +@label while_end_8 +; +; Builtin call store [, ] +; +; BinOp lhs +; (text_mem_p) + ldi 1 RA + add FP RA RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 0 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; (first) + ldi 4 RA + add FP RA RA + ldr RA RA + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA +; +; Builtin call store [, ] +; +; BinOp lhs +; (text_mem_p) + ldi 1 RA + add FP RA RA + ldr RA RA + spu RA +; BinOp rhs +; + ldi 1 RA + spu RA + spo RB + spo RA + add RA RB RA + spu RA +; (last) + ldi 5 RA + add FP RA RA + ldr RA RA + spu RA + spo RB + spo RA + str RB RA + ldi 0 RA + spu RA +; popping free-standing Expr result from stack + spo RA + mov FP SP + hlt -- cgit v1.3