94 lines
2.5 KiB
ArmAsm
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
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|