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
|