fix ask_name STDIO
s-ol
2 years ago
6 | 6 | # $ ./subv.sh examples/ask_.subv >examples/ask_.elf |
7 | 7 | # $ cat 2>dev/null | ./qemu.sh examples/ask_.elf |
8 | 8 | # What's your name? |
9 | # > Sol | |
9 | # > Sol | |
10 | 10 | # Hello Sol, nice to meet you! |
11 | 11 | |
12 | 12 | == code 0x80400000 |
15 | 15 | # 63/branch 1/subop/!= 5/rs/t0 0/rs/x0 0/off13 |
16 | 16 | |
17 | 17 | main: |
18 | 6f/jal 1/rd/ra init/off21 | |
19 | ||
20 | 18 | # print HELLO_WHATSURNAME |
21 | 19 | 37/lui a/rd/a0 HELLO_WHATSURNAME/imm20hi |
22 | 20 | 13/opi a/rd/a0 0/subop/add a/rs/a0 HELLO_WHATSURNAME/imm12lo |
21 | 6f/jal 1/rd/ra print/off21 | |
22 | ||
23 | # read in Name | |
24 | 37/lui a/rd/a0 PROMPT/imm20hi | |
25 | 13/opi a/rd/a0 0/subop/add a/rs/a0 PROMPT/imm12lo | |
23 | 26 | 6f/jal 1/rd/ra print/off21 |
24 | 27 | |
25 | 28 | 37/lui a/rd/a0 Name/imm20hi |
52 | 55 | # ECALL |
53 | 56 | 73/system 0/subop/priv 0/funct12/ecall |
54 | 57 | |
55 | init: | |
56 | # initialize UART0 | |
57 | # load 0x10000000 (UART0) into t0 | |
58 | 37/lui 5/rd/t0 10000/imm20 | |
59 | ||
60 | # disable interrupts | |
61 | 23/store 0/width/b 5/rs/t0 1/off12 0/rs/x0 | |
62 | ||
63 | # enable DLAB | |
64 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 80/imm12 | |
65 | 23/store 0/width/b 5/rs/t0 3/off12 6/rs/t1 | |
66 | ||
67 | # max speed = 38400bps | |
68 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 3/imm12 | |
69 | 23/store 0/width/b 5/rs/t0 0/off12 6/rs/t1 | |
70 | 23/store 0/width/b 5/rs/t0 1/off12 0/rs/x0 | |
71 | ||
72 | # disable DLAB | |
73 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 3/imm12 | |
74 | 23/store 0/width/b 5/rs/t0 3/off12 6/rs/t1 | |
75 | ||
76 | # enable fifo, clear, watermark=14b | |
77 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 c7/imm12 | |
78 | 23/store 0/width/b 5/rs/t0 2/off12 6/rs/t1 | |
79 | ||
80 | # set dtr, srs, aux2 | |
81 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 b/imm12 | |
82 | 23/store 0/width/b 5/rs/t0 4/off12 6/rs/t1 | |
83 | ||
84 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 1/imm12 | |
85 | 23/store 0/width/b 5/rs/t0 1/off12 6/rs/t1 | |
86 | ||
87 | # return | |
88 | 67/jalr 0/subop 0/rd/x0 1/rs/ra 0/off12 | |
89 | ||
90 | old: | |
91 | # set "data terminal ready" and "request to send" bits in MCR | |
92 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 3/imm12 | |
93 | 23/store 0/width/b 5/rs/t0 4/off12 6/rs/t1 | |
94 | # return | |
95 | 67/jalr 0/subop 0/rd/x0 1/rs/ra 0/off12 | |
96 | ||
97 | 58 | print: |
98 | 59 | # print a C-string from a0 |
99 | 60 | # load 0x10000000 (UART0) into t0 |
122 | 83 | # read a C-string into a0 |
123 | 84 | # load 0x10000000 (UART0) into t0 |
124 | 85 | 37/lui 5/rd/t0 10000/imm20 |
125 | # load 0x0a (\n) into t1 | |
126 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 0a/imm12 | |
86 | # load 0x0d (\r) into t1 | |
87 | 13/opi 6/rd/t1 0/subop/add 0/rs/x0 0d/imm12 | |
127 | 88 | |
128 | 89 | read:loop: |
129 | 90 | # spin if FIFO is empty (data_ready = UART+5 & 1) |
134 | 95 | 03/load 7/rd/t2 4/width/bu 5/rs/t0 0/imm12 |
135 | 96 | # break loop if newline (t2 == t1) |
136 | 97 | 63/branch 0/subop/== 7/rs/t2 6/rs/t1 read:break/off13 |
137 | # store char from t1 at [a0] | |
138 | 23/store 0/width/b a/rs/a0 7/rs/t2 0/off12 | |
98 | # echo and store char from t2 | |
99 | 23/store 0/width/b 5/rs/t0 0/off12 7/rs/t2 | |
100 | 23/store 0/width/b a/rs/a0 0/off12 7/rs/t2 | |
139 | 101 | # increment a0 |
140 | 102 | 13/opi a/rd/a0 0/subop/add a/rs/a0 1/imm12 |
141 | 103 | # jump back up |
142 | 104 | 6f/jal 0/rd/x0 read:loop/off21 |
143 | 105 | read:break: |
106 | # echo \n | |
107 | 13/opi 7/rd/t2 0/subop/add 0/rs/x0 0a/imm12 | |
108 | 23/store 0/width/b 5/rs/t0 0/off12 7/rs/t2 | |
144 | 109 | # return |
145 | 110 | 67/jalr 0/rd/x0 0/subop 1/rs/ra 0/off12 |
146 | 111 | |
155 | 120 | NICETOMEETU: |
156 | 121 | # ", nice to meet you!\n\0" |
157 | 122 | 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 |
123 | PROMPT: | |
124 | # "> " | |
125 | 3e/8 20/8 00/8 | |
158 | 126 | Name: |
159 | 00/8 | |
127 | 0/256 |