Created
October 29, 2022 22:21
-
-
Save olofk/2827b54bc12ddc669716cced38520fb4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment