.syntax unified .code 16 .section .text nvic_table: .word 0x20001000 /* Top of stack */ .word startup + 1 /* No space for interrupt vectors. */ startup: ldr r0, rcc_base movs r1, #61 orrs r1, #16384 str r1, [r0, #0] movs r0, #2048 movt r0, #16385 movs r1, #2192 str r1, [r0, #4] movs r0, #14336 movt r0, #16385 movw r1, #8204 str r1, [r0, #12] movs r1, #69 /* 115200 baud */ str r1, [r0, #8] main: movs r6, #32 /* Inlined */ movs r5, #0 adr r3, message_str bl string_out main_handle_input: bl byte_in cmp r1, #106 beq.n main_input_j cmp r1, #107 beq.n main_input_k cmp r1, #32 beq.n main_input_space cmp r1, #13 beq.n main_input_enter b.n main_handle_input main_input_j: cmp r6, #32 bge.n main_handle_input lsls r6, #1 adr r3, cur_down_str bl string_out b.n main_handle_input main_input_k: cmp r6, #1 ble.n main_handle_input lsrs r6, #1 adr r3, cur_up_str bl string_out b.n main_handle_input main_input_space: eors r5, r6 tst r5, r6 adr r3, asterisk_cur_left_str /* Flags not modified */ bne.n main_skip adr r3, space_cur_left_str main_skip: bl string_out b.n main_handle_input main_input_enter: adr r3, clear_screen_str bl string_out convert: adr r3, flo_str /* Inlined */ bl string_out /* Mask to convert in r5 */ subs r7, r7 convert_next_digit_in: cmp r5, #10 blt.n convert_next_digit_out movs r1, #10 udiv r4, r5, r1 mul r6, r4, r1 subs r6, r5, r6 push {r6} adds r7, r7, #2 mov r5, r4 b.n convert_next_digit_in convert_next_digit_out: adr r6, starts /* Digit in r5, decimal place * 2 in r7 */ ldrb r6, [r6, r5] adr r3, ends ldrb r3, [r3, r5] convert_next_numeral: cmp r6, r3 bge.n convert_numerals_done adr r1, nums ldrb r1, [r1, r6] adds r1, r7 adr r4, digits ldrb r1, [r4, r1] bl byte_out adds r6, #1 b.n convert_next_numeral convert_numerals_done: subs r7, #2 bmi.n convert_all_done pop {r5} b.n convert_next_digit_out convert_all_done: adr r3, ok_button_str bl string_out bl byte_in b.n main string_out: mov r4, lr /* Takes argument in r3. Clobbers r1, r2, r4 */ string_out_loop: ldrb r1, [r3], #1 cbz r1, string_out_done bl byte_out b.n string_out_loop string_out_done: bx r4 byte_out: ldr r2, [r0, #0] /* Takes argument in r1. Clobbers r2. */ tst r2, #128 beq.n byte_out strb r1, [r0, #4] bx lr byte_in: ldr r1, [r0, #0] /* Return value in r1. */ tst r1, #32 beq.n byte_in ldrb r1, [r0, #4] bx lr rcc_base: .word 0x40021018 ok_button_str: .asciz "\r\n[OK]" message_str: .asciz "\033[2J\033[H dividuum\r\n syb\r\n fiji\r\n flowhase\r\n florolf\r\n piratenflo\r" flo_str: .asciz "FLO" digits: .ascii "IVXLCDM" starts: .byte 0, 2, 2, 2, 0, 1, 1, 1, 1, 4 ends: .byte 0, 3, 4, 5, 2, 2, 3, 4, 5, 6 space_cur_left_str: .asciz " \033[D" asterisk_cur_left_str: .asciz "*\033[D" clear_screen_str: .asciz "\033[2J\033[H" nums: .byte 0, 1, 0, 0, 0, 2, 0 /* Padding */ cur_down_str: .asciz "\033[B" cur_up_str: .asciz "\033[A"