# ask for the user's name,
# then print it back with a hello message.
#
# until I figure out how to enable STDIN properly,
# requires running qemu like so:
#
# $ ./subv.sh examples/ask_.subv >examples/ask_.elf
# $ cat 2>dev/null | ./qemu.sh examples/ask_.elf
# What's your name?
# > Sol
# Hello Sol, nice to meet you!
== code 0x80400000
# load mhartid CSR into t0, trap all but first Hart
# 73/system 5/rd/t0 2/funct3/csrrs 0/rs/x0 f14/csr/mhartid
# 63/branch 1/subop/!= 5/rs/t0 0/rs/x0 0/off13
main:
# print HELLO_WHATSURNAME
37/lui a/rd/a0 HELLO_WHATSURNAME/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 HELLO_WHATSURNAME/imm12lo
6f/jal 1/rd/ra print/off21
# read in Name
37/lui a/rd/a0 PROMPT/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 PROMPT/imm12lo
6f/jal 1/rd/ra print/off21
37/lui a/rd/a0 Name/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 Name/imm12lo
6f/jal 1/rd/ra read/off21
# print HELLO_
37/lui a/rd/a0 HELLO_/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 HELLO_/imm12lo
6f/jal 1/rd/ra print/off21
# print Name
37/lui a/rd/a0 Name/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 Name/imm12lo
6f/jal 1/rd/ra print/off21
# print NICETOMEETU
37/lui a/rd/a0 NICETOMEETU/imm20hi
13/opi a/rd/a0 0/subop/add a/rs/a0 NICETOMEETU/imm12lo
6f/jal 1/rd/ra print/off21
exit:
# system reset (via SBI extension SRST)
# a7 = ext id, a6 = fid, a0 = 0, a1 = 0
37/lui 11/rd/a7 53525/imm20
13/opi 11/rd/a7 0/subop/add 11/rs/a7 354/imm12
33/opr 0/mode/norm 10/rd/a6 0/subop/add 0/rs/x0 0/rs/x0
33/opr 0/mode/norm a/rd/a0 0/subop/add 0/rs/x0 0/rs/x0
33/opr 0/mode/norm b/rd/a1 0/subop/add 0/rs/x0 0/rs/x0
# ECALL
73/system 0/subop/priv 0/funct12/ecall
print:
# print a C-string from a0
# load 0x10000000 (UART0) into t0
37/lui 5/rd/t0 10000/imm20
print:loop:
# load unsigned byte at [a0] into t1
03/load 6/rd/t1 4/width/bu a/rs/a0 0/off12
# break loop if zero
63/branch 0/subop/== 6/rs/t1 0/rs/x0 print:break/off13
print:spin:
# spin if FIFO is full (thr_empty = UART+5 & 0x20)
03/load 7/rd/t2 4/width/bu 5/rs/t0 5/off12
13/opi 7/rd/t2 7/subop/and 7/rs/t2 20/imm12
63/branch 0/subop/== 7/rs/t2 0/rs/x0 print:spin/off13
# store char from t1 at [t0]
23/store 0/width/b 5/rs/t0 0/off12 6/rs/t1
# increment a0
13/opi a/rd/a0 0/subop/add a/rs/a0 1/imm12
# jump back up
6f/jal 0/rd/x0 print:loop/off21
print:break:
# return
67/jalr 0/rd/x0 0/subop 1/rs/ra 0/off12
read:
# read a C-string into a0
# load 0x10000000 (UART0) into t0
37/lui 5/rd/t0 10000/imm20
# load 0x0d (\r) into t1
13/opi 6/rd/t1 0/subop/add 0/rs/x0 0d/imm12
read:loop:
# spin if FIFO is empty (data_ready = UART+5 & 1)
03/load 7/rd/t2 4/width/bu 5/rs/t0 5/imm12
13/opi 7/rd/t2 7/subop/and 7/rs/t2 1/imm12
63/branch 0/subop/== 7/rs/t2 0/rs/x0 read:loop/off13
# read char at [t0] into t2
03/load 7/rd/t2 4/width/bu 5/rs/t0 0/imm12
# break loop if newline (t2 == t1)
63/branch 0/subop/== 7/rs/t2 6/rs/t1 read:break/off13
# echo and store char from t2
23/store 0/width/b 5/rs/t0 0/off12 7/rs/t2
23/store 0/width/b a/rs/a0 0/off12 7/rs/t2
# increment a0
13/opi a/rd/a0 0/subop/add a/rs/a0 1/imm12
# jump back up
6f/jal 0/rd/x0 read:loop/off21
read:break:
# echo \n
13/opi 7/rd/t2 0/subop/add 0/rs/x0 0a/imm12
23/store 0/width/b 5/rs/t0 0/off12 7/rs/t2
# return
67/jalr 0/rd/x0 0/subop 1/rs/ra 0/off12
== data 0x80500000
HELLO_WHATSURNAME:
# "What's your name?\n\0"
57/8 68/8 61/8 74/8 27/8 73/8 20/8 79/8 6f/8 75/8 72/8 20/8 6e/8 61/8 6d/8 65/8 3f/8 0a/8 00/8
HELLO_:
# "Hello \0"
48/8 65/8 6c/8 6c/8 6f/8 20/8 00/8
NICETOMEETU:
# ", nice to meet you!\n\0"
2c/8 20/8 6e/8 69/8 63/8 65/8 20/8 74/8 6f/8 20/8 6d/8 65/8 65/8 74/8 20/8 79/8 6f/8 75/8 21/8 0a/8 00/8
PROMPT:
# "> "
3e/8 20/8 00/8
Name:
0/256