os-core/sys/uart.s

94 lines
2.5 KiB
ArmAsm

// file : uart.s
// project : Löwe OS
// authors : Elias Löwe <elias@lowenware.com>
// 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
// -----------------------------------------------------------------------------