git.s-ol.nu subv / master examples / ask_name.subv
master

Tree @master (Download .tar.gz)

ask_name.subv @masterraw · history · blame

# 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