;; 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