aboutsummaryrefslogtreecommitdiffstats
path: root/examples/ask_name.subv
blob: 63501884cf81969decd629e353bd687154416ef8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 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/imm12/mhartid
  # 63/branch 1/subop/!= 5/rs/t0 0/rs/x0 0/off13

main:
  6f/jal 1/rd/ra init/off21

  # print HELLO_WHATSURNAME
  37/lui a/rd/a0 HELLO_WHATSURNAME/imm20hi
  13/opi 0/subop/add a/rd/a0 a/rs/a0 HELLO_WHATSURNAME/imm12lo
  6f/jal 1/rd/ra print/off21

  37/lui a/rd/a0 Name/imm20hi
  13/opi 0/subop/add a/rd/a0 a/rs/a0 Name/imm12lo
  6f/jal 1/rd/ra read/off21

  # print HELLO_
  37/lui a/rd/a0 HELLO_/imm20hi
  13/opi 0/subop/add a/rd/a0 a/rs/a0 HELLO_/imm12lo
  6f/jal 1/rd/ra print/off21

  # print Name
  37/lui a/rd/a0 Name/imm20hi
  13/opi 0/subop/add a/rd/a0 a/rs/a0 Name/imm12lo
  6f/jal 1/rd/ra print/off21

  # print NICETOMEETU
  37/lui a/rd/a0 NICETOMEETU/imm20hi
  13/opi 0/subop/add a/rd/a0 a/rs/a0 NICETOMEETU/imm12lo
  6f/jal 1/rd/ra print/off21

  # infinite loop
  6f/jal 0/rd/x0 0/off21

init:
# initialize UART0
  # load 0x10010000 (UART0) into t0
  37/lui 5/rd/t0 0x10000/imm20

  # disable interrupts
  23/store 0/width/byte 5/rs/t0 0/rs/x0 1/off12

  # enable DLAB
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 80/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 3/off12

  # max speed = 38400bps
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 3/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 0/off12
  23/store 0/width/byte 5/rs/t0 0/rs/x0 1/off12

  # disable DLAB
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 3/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 3/off12

  # enable fifo, clear, watermark=14b
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 c7/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 2/off12

  # set dtr, srs, aux2
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 b/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 4/off12

  13/opi 0/subop/add 6/rd/t1 0/rs/x0 1/imm12
  23/store 0/width/byte 5/rs/t0 6/rs/t1 1/off12

  # return
  67/jalr 0/subop 0/rd/x0 1/rs/ra 0/off12

old:
  # load 3 into t1
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 3/imm12
  # set "data terminal ready" and "request to send" bits in MCR
  23/store 0/width/byte 5/rs/t0 6/rs/t1 4/off12
  # return
  67/jalr 0/subop 0/rd/x0 1/rs/ra 0/off12

print:
# print a C-string from a0
  # load 0x10010000 (UART0) into t0
  37/lui 5/rd/t0 0x10000/imm20
print:loop:
  # load unsigned byte at a0
  03/load 4/subop/byte 6/rd/t1 a/rs/a0 0/imm12
  # 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 4/subop/byte 7/rd/t2 5/rs/t0 5/imm12
  13/opi 7/subop/and 7/rd/t2 7/rs/t2 20/imm12
  63/branch 0/subop/== 7/rs/t2 0/rs/x0 print:spin/off13
  # print char
  23/store 0/width/byte 5/rs/t0 6/rs/t1 0/off12
  # increment a0
  13/opi 0/subop/add a/rd/a0 a/rs/a0 1/imm12
  # jump back up
  6f/jal 0/rd/x0 print:loop/off21
print:break:
  # return
  67/jalr 0/subop 0/rd/x0 1/rs/ra 0/off12

read:
# read a C-string into a0
  # load 0x10000000 (UART0) into t0
  37/lui 5/rd/t0 0x10000/imm20
  # load 0x0a (\n) into t1
  13/opi 0/subop/add 6/rd/t1 0/rs/x0 0a/imm12

read:loop:
  # spin if FIFO is empty (data_ready = UART+5 & 1)
  03/load 4/subop/byte 7/rd/t2 5/rs/t0 5/imm12
  13/opi 7/subop/and 7/rd/t2 7/rs/t2 1/imm12 
  63/branch 0/subop/== 7/rs/t2 0/rs/x0 read:loop/off13
  # load unsigned byte into t2
  03/load 4/subop/byte 7/rd/t2 5/rs/t0 0/imm12
  # break loop if newline (t2 == t1)
  63/branch 0/subop/== 7/rs/t2 6/rs/t1 read:break/off13
  # store char at a0
  23/store 0/width/byte a/rs/a0 7/rs/t2 0/off12
  # increment a0
  13/opi 0/subop/add a/rd/a0 a/rs/a0 1/imm12
  # jump back up
  6f/jal 0/rd/x0 read:loop/off21
read:break:
  # return
  67/jalr 0/subop 0/rd/x0 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
Name:
  00/8