Skip to content

Instantly share code, notes, and snippets.

@olofk
Created October 29, 2022 22:21
Show Gist options
  • Save olofk/2827b54bc12ddc669716cced38520fb4 to your computer and use it in GitHub Desktop.
Save olofk/2827b54bc12ddc669716cced38520fb4 to your computer and use it in GitHub Desktop.
#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