mirror of
https://github.com/olofk/serv.git
synced 2025-04-20 11:57:07 -04:00
58 lines
1,006 B
ArmAsm
58 lines
1,006 B
ArmAsm
#define GPIO_ADDR 0x40000000
|
|
#define HALT_ADDR 0x90000000
|
|
|
|
/*
|
|
a0 = GPIO address
|
|
a1 = String address
|
|
t0 = Character to write
|
|
*/
|
|
|
|
.globl _start
|
|
_start:
|
|
/* Load gpio address to a0 */
|
|
li a0, GPIO_ADDR
|
|
|
|
/* Set GPIO high initially */
|
|
addi t0, zero, 1
|
|
sb t0, 0(a0)
|
|
|
|
/* Load string address to a1 */
|
|
la a1, str
|
|
|
|
next_char:
|
|
/* Read char from string */
|
|
lbu t0, 0(a1)
|
|
|
|
/* If zero, we reached end of string and will exit the simulation */
|
|
beqz t0, halt
|
|
|
|
/* Bitbanged UART loop */
|
|
ori t0, t0, 0x100
|
|
slli t0, t0, 1
|
|
1: sb t0, 0(a0)
|
|
srli t0, t0, 1
|
|
|
|
/*
|
|
* Adding delay nops to achieve an approximate
|
|
* baud rate of 57600 at 16MHz
|
|
*/
|
|
nop
|
|
nop
|
|
bnez t0, 1b
|
|
|
|
/* Increase address to next char in string */
|
|
addi a1, a1, 1
|
|
|
|
j next_char
|
|
|
|
/* Writing anything to HALT_ADDR will exit simulation */
|
|
halt: li t0, HALT_ADDR
|
|
sw zero, 0(t0)
|
|
/*
|
|
* Loop to prevent PC from keep reading memory in case
|
|
* we run on real HW and not in simulation
|
|
*/
|
|
j halt
|
|
str:
|
|
.section .data
|
|
.string "Hi, I'm Servant!\n"
|