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