# file : uart.s # project : Löwe OS # authors : Elias Löwe # address of UART for virt device in qemu # ----------------------------------------------------------------------------- .global _uart_putc # print single character uart .global _uart_putx # print integer in HEX format to uart .global _uart_puts # print null-terminated string to uart # ----------------------------------------------------------------------------- .text # helper to avoid extra data moving # @x1 character print uart_putc: STP x2, lr, [sp, -16]! MOV x2, 0x09000000 # set UART address STRB w1, [x2] # put character out LDP x2, lr, [sp], 16 RET # ----------------------------------------------------------------------------- # print character to uart # @x0 character print _uart_putc: STR lr, [sp, -16]! MOV x1, x0 # set arguments BL uart_putc # put character out LDR lr, [sp], 16 RET # ----------------------------------------------------------------------------- # @x0 integer to print _uart_putx: STP lr, x3, [sp, -32]! STP x0, x1, [sp, 16] LDR x3, =60 # init bits counter 64-4 1: LSR x1, x0, x3 # shift to digit AND x1, x1, 0xF # keep only digit CMP x1, 9 # compare it to 9 BLS 2f # less or equal ADD x1, x1, 0x37 # turn into ASCII HEX char B 3f # continue to output 2: ADD x1, x1, 0x30 # turn into ASCII num char 3: BL uart_putc # output carachter CBZ x3, 0f # if counter == 0 return SUB x3, x3, 4 # otherwise subtract counter by 4 B 1b # repeat 0: LDP lr, x3, [sp], 16 LDP x0, x1, [sp], 16 RET # ----------------------------------------------------------------------------- # @x0 pointer to string _uart_puts: STR lr, [sp, -16]! STP x0, x1, [sp, -16]! 1: LDRB w1, [x0], 1 # load byte of string from address in x0 CBZ w1, 0f # return if zero BL uart_putc # put charcter out B 1b # loop 0: LDP x0, x1, [sp], 16 LDR lr, [sp], 16 RET # -----------------------------------------------------------------------------