;; BEGIN BOOTSTRAP @use ext_std:* @let sp RH @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 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 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 ;; END BOOTSTRAP @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 ; 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 ; return from function jpr RA @label main ; 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 0 RB add RA RB RA spo RB str RB RA ; ; 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 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 ldr RA RA spu RA ; (TEXT_MODE) ldi text_mode RA ldr RA RA spu RA spo RB spo RA str RB RA ; ; assigning i at stack segment + 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 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 ldr RB RB spu RB ; ldi int_5 RB ldr RB RB spu RB spo RC spo RB 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 1 RB add RA RB RA ldr RA RA spu RA ; BinOp rhs ; (i) ldi vt_stack_addr RA ldr RA RA ldi 2 RB add RA RB RA ldr RA RA spu RA spo RB spo RA add RA RB RA spu 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 at stack segment + 2 ; evaluating value to be assigned ; ; BinOp lhs ; (i) ldi vt_stack_addr RC ldr RC RC ldi 2 RD add RC RD RC ldr RC RC spu RC ; 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 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 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