Commit | Line | Data |
---|---|---|
3695b659 AT |
1 | #ifndef VVS_STDLIB_HEAP |
2 | #define VVS_STDLIB_HEAP | |
3 | ||
4 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a AT |
5 | @ Name: |
6 | @ memset (11000) | |
3695b659 | 7 | @ Description: |
bb21580a | 8 | @ Writes 'pattern' in memory locations 'startaddr' to 'startaddr+count'. |
3695b659 AT |
9 | @ Call Stack: |
10 | @ pattern | |
11 | @ startaddr | |
3d75b928 | 12 | @ count <-- TOS |
3695b659 AT |
13 | @ Return Stack: |
14 | @ <empty> | |
15 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
16 | NSSVTTSSSN | Mark: 11000 (memset) | |
bb21580a | 17 | SSSTTN | PUSH 3 |
ae1f85a1 | 18 | NSTTSSSSSTN | JSR > 1000001 (spewreg) |
3695b659 | 19 | |
bb21580a | 20 | @ Store 'pattern' into one memory location on each pass through this loop. |
3695b659 | 21 | NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000 |
3695b659 AT |
22 | SSSTN | PUSH 1 (ptr) |
23 | TTT | LOAD | |
3695b659 AT |
24 | SSSTSN | PUSH 2 (ptr) |
25 | TTT | LOAD | |
bb21580a AT |
26 | TSSS | ADD |
27 | SSSTTN | PUSH 3 (ptr) | |
28 | TTT | LOAD | |
3695b659 AT |
29 | TTS | STORE |
30 | ||
bb21580a AT |
31 | @ Decrement and check for loop end condition 'count == 0'. |
32 | SSSTN | PUSH 1 (ptr) | |
3695b659 AT |
33 | TTT | LOAD |
34 | SNS | DUP | |
35 | NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001 | |
36 | SSSTN | PUSH 1 | |
37 | TSST | SUBTRACT | |
bb21580a | 38 | SSSTN | PUSH 1 (ptr) |
3695b659 AT |
39 | SNT | SWAP |
40 | TTS | STORE | |
41 | NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000 | |
42 | ||
43 | @ Clean up and return | |
44 | NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001 | |
45 | SNN | DROP | |
46 | NTN | RTS | |
47 | ||
3d75b928 | 48 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
49 | @ Name: |
50 | @ memcpy (11001) | |
3d75b928 | 51 | @ Description: |
bb21580a | 52 | @ Copies 'count+1' words from 'source' to 'destination'. |
3d75b928 AT |
53 | @ Call Stack: |
54 | @ source | |
55 | @ destination | |
56 | @ count <-- TOS | |
57 | @ Return Stack: | |
58 | @ <empty> | |
59 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
60 | NSSVTTSSTN | Mark: 11001 (memcpy) | |
bb21580a | 61 | SSSTTN | PUSH 3 |
ae1f85a1 | 62 | NSTTSSSSSTN | JSR > 1000001 (spewreg) |
3d75b928 AT |
63 | |
64 | @ Copy one word on each pass through this loop. | |
65 | NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000 | |
bb21580a | 66 | SSSTSN | PUSH 2 (ptr) |
3d75b928 | 67 | TTT | LOAD |
bb21580a | 68 | SSSTN | PUSH 1 (ptr) |
3d75b928 AT |
69 | TTT | LOAD |
70 | TSSS | ADD | |
bb21580a | 71 | SSSTTN | PUSH 3 (ptr) |
3d75b928 | 72 | TTT | LOAD |
bb21580a | 73 | SSSTN | PUSH 1 (ptr) |
3d75b928 AT |
74 | TTT | LOAD |
75 | TSSS | ADD | |
76 | TTT | LOAD | |
77 | TTS | STORE | |
78 | ||
79 | @ Decrement and check for loop end conditions. | |
bb21580a | 80 | SSSTN | PUSH 1 (ptr) |
3d75b928 AT |
81 | TTT | LOAD |
82 | SNS | DUP | |
83 | NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001 | |
84 | SSSTN | PUSH 1 | |
85 | TSST | SUBTRACT | |
bb21580a | 86 | SSSTN | PUSH 1 (ptr) |
3d75b928 AT |
87 | SNT | SWAP |
88 | TTS | STORE | |
89 | NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000 | |
90 | ||
91 | @ Clean up and return | |
92 | NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001 | |
93 | SNN | DROP | |
94 | NTN | RTS | |
95 | ||
d63de3fa | 96 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
97 | @ Name: |
98 | @ memrand (11010) | |
d63de3fa | 99 | @ Description: |
bb21580a | 100 | @ Writes random words into memory locations 'startaddr' to 'startaddr+count'. |
d63de3fa AT |
101 | @ Call Stack: |
102 | @ count | |
103 | @ startaddr <-- TOS | |
104 | @ Return Stack: | |
105 | @ <empty> | |
106 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 107 | #include <math.pvvs> |
d63de3fa | 108 | NSSVTTSTSN | Mark: 11010 (memrand) |
bb21580a | 109 | SSSTN | PUSH 1 |
ae1f85a1 | 110 | NSTTSSSSSTN | JSR > 1000001 (spewreg) |
d63de3fa AT |
111 | |
112 | @ Store random word into one memory location on each pass through this loop. | |
113 | NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000 | |
114 | SNS | DUP | |
bb21580a | 115 | SSSTN | PUSH 1 (ptr) |
d63de3fa AT |
116 | TTT | LOAD |
117 | TSSS | ADD | |
118 | NSTTSSSSN | JSR > 10000 (random) | |
119 | TTS | STORE | |
120 | ||
121 | @ Decrement and check loop end conditions | |
122 | SNS | DUP | |
123 | NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001 | |
124 | SSSTN | PUSH 1 | |
125 | TSST | SUBTRACT | |
126 | NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000 | |
127 | ||
d63de3fa AT |
128 | @ Clean up and return |
129 | NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001 | |
130 | SNN | DROP | |
131 | NTN | RTS | |
132 | ||
87d27426 | 133 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
134 | @ Name: |
135 | @ memcmp (11011) | |
87d27426 | 136 | @ Description: |
bb21580a | 137 | @ Compares two blocks of memory: |
87d27426 AT |
138 | @ blk1ptr -> blk1ptr+count |
139 | @ -- versus -- | |
140 | @ blk2ptr -> blk2ptr+count | |
141 | @ The return value is zero if the blocks are identical, otherwise non-zero. | |
142 | @ Call Stack: | |
143 | @ count | |
144 | @ blk1ptr | |
145 | @ blk2ptr <-- TOS | |
146 | @ Return Stack: | |
147 | @ retvalue <-- TOS | |
148 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
149 | NSSVTTSTTN | Mark: 11011 (memcmp) | |
bb21580a | 150 | SSSTSN | PUSH 2 |
ae1f85a1 | 151 | NSTTSSSSSTN | JSR > 1000001 (spewreg) |
87d27426 AT |
152 | |
153 | @ Compare one word on each pass through this loop. | |
154 | NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000 | |
155 | SNS | DUP | |
156 | SNS | DUP | |
bb21580a | 157 | SSSTN | PUSH 1 (ptr) |
87d27426 AT |
158 | TTT | LOAD |
159 | TSSS | ADD | |
160 | TTT | LOAD | |
161 | SNT | SWAP | |
bb21580a | 162 | SSTSN | PUSH 2 (ptr) |
87d27426 AT |
163 | TTT | LOAD |
164 | TSSS | ADD | |
165 | TTT | LOAD | |
166 | TSST | SUBTRACT | |
167 | NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match) | |
168 | ||
169 | @ Return 'match? = false' | |
170 | SNN | DROP | |
171 | SSSTN | PUSH 1 | |
172 | NTN | RTS | |
173 | ||
d00258fa | 174 | @ Decrement and loop again if loop is not complete. |
87d27426 AT |
175 | NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010 |
176 | SNS | DUP | |
177 | NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete) | |
178 | SSSTN | PUSH 1 | |
179 | TSST | SUBTRACT | |
180 | NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000 | |
181 | ||
182 | @ Return 'match? = true' | |
183 | NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001 | |
184 | SNN | DROP | |
185 | SSSSN | PUSH 0 | |
186 | NTN | RTS | |
187 | ||
fd04fb41 | 188 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
189 | @ Name: |
190 | @ memsrch (11100) | |
fd04fb41 | 191 | @ Description: |
bb21580a AT |
192 | @ Searches the heap from 'address' to 'address+count'. |
193 | @ If 'pattern' is found, the return value is a pointer to the matching word. | |
fd04fb41 AT |
194 | @ If not found, the return value is a null pointer. |
195 | @ Call Stack: | |
196 | @ pattern | |
197 | @ count | |
198 | @ address <-- TOS | |
199 | @ Return Stack: | |
200 | @ pointer <-- TOS | |
201 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
202 | NSSVTTTSSN | Mark: 11100 (memsrch) | |
bb21580a | 203 | SSSTTN | PUSH 3 |
ae1f85a1 | 204 | NSTTSSSSSTN | JSR > 1000001 (spewreg) |
fd04fb41 AT |
205 | |
206 | @ Compare one word on each pass through this loop. | |
207 | NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000 | |
208 | SNS | DUP | |
bb21580a | 209 | SSSTN | PUSH 1 (ptr) |
fd04fb41 AT |
210 | TTT | LOAD |
211 | TSSS | ADD | |
212 | TTT | LOAD | |
bb21580a | 213 | SSSTTN | PUSH 3 (ptr) |
fd04fb41 AT |
214 | TTT | LOAD |
215 | TSST | SUBTRACT | |
216 | NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001 | |
217 | SNS | DUP | |
bb21580a | 218 | SSSTSN | PUSH 2 (ptr) |
fd04fb41 AT |
219 | TTT | LOAD |
220 | TSST | SUBTRACT | |
221 | NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010 | |
222 | SSSTN | PUSH 1 | |
223 | TSSS | ADD | |
224 | NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000 | |
225 | ||
226 | @ Found a match. Clean up and return. | |
227 | NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001 | |
bb21580a | 228 | SSSTN | PUSH 1 (ptr) |
fd04fb41 AT |
229 | TTT | LOAD |
230 | TSSS | ADD | |
231 | NTN | RTS | |
232 | ||
233 | @ No match found. Clean up and return. | |
234 | NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010 | |
235 | SNN | DROP | |
236 | SSSSN | PUSH 0 | |
237 | NTN | RTS | |
238 | ||
bb21580a AT |
239 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
240 | @ Name: | |
ae1f85a1 | 241 | @ slurpreg (1000000) |
bb21580a | 242 | @ Description: |
ae1f85a1 | 243 | @ Reads 'count' values from heap to stack in complementary order to 'spewreg'. |
bb21580a AT |
244 | @ Call Stack: |
245 | @ count | |
246 | @ Return Stack: | |
247 | @ heap[count] | |
248 | @ ... | |
249 | @ heap[2] | |
250 | @ heap[1] <-- TOS | |
251 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
ae1f85a1 | 252 | NSSVTSSSSSSN | Mark: 1000000 (slurpreg) |
bb21580a AT |
253 | |
254 | @ Load one word from heap on each pass. | |
ae1f85a1 | 255 | NSSVSTSSSSSSSSSSSSSSN | Mark: 01000000 00000000 |
bb21580a AT |
256 | SNS | DUP |
257 | TTT | LOAD | |
258 | SNT | SWAP | |
259 | ||
260 | @ Check for loop completion. | |
261 | @ As a side effect, prepare the next address. | |
262 | SSSTN | PUSH 1 | |
263 | TSST | SUBTRACT | |
264 | SNS | DUP | |
ae1f85a1 AT |
265 | NTSSTSSSSSSSSSSSSSTN | BRZ > 01000000 00000001 |
266 | NSNSTSSSSSSSSSSSSSSN | JMP > 01000000 00000000 | |
267 | NSSVSTSSSSSSSSSSSSSTN | Mark: 01000000 00000001 | |
bb21580a AT |
268 | SNN | DROP |
269 | NTN | RTS | |
270 | ||
271 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
272 | @ Name: | |
ae1f85a1 | 273 | @ spewreg (1000001) |
bb21580a AT |
274 | @ Description: |
275 | @ Writes 'count' values from stack to heap in this order: | |
276 | @ TOS -> heap[1] | |
277 | @ TOS+1 -> heap[2] | |
278 | @ ... | |
279 | @ TOS+n -> heap[count] | |
0425a4c6 AT |
280 | @ This function uses heap[15] for temporary storage, thus limiting the total |
281 | @ registers to 14 since heap[0] is reserved. Since this function populates | |
282 | @ the registers, encoding the value here seems a natural location to document | |
283 | @ the limit. TODO: Should this be turned into a CPP define? | |
bb21580a AT |
284 | @ Call Stack: |
285 | @ data-words | |
286 | @ ... | |
287 | @ data-words | |
288 | @ count <-- TOS | |
289 | @ Return Stack: | |
290 | @ <empty> | |
291 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
ae1f85a1 | 292 | NSSVTSSSSSTN | Mark: 1000001 (spewreg) |
bb21580a | 293 | |
23d17247 AT |
294 | @ To simplify other functions, sprewreg shall accept 0 as a valid count value. |
295 | SNS | DUP | |
296 | NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001 | |
297 | ||
0425a4c6 AT |
298 | @ Create a counter in heap[15] that doubles as a destination pointer generator. |
299 | SSSTTTTN | PUSH 15 (ptr) | |
bb21580a AT |
300 | SSSTN | PUSH 1 |
301 | TTS | STORE | |
302 | ||
303 | @ Store one word to heap on each pass. | |
ae1f85a1 | 304 | NSSVSTSSSSSTSSSSSSSSN | Mark: 01000001 00000000 |
bb21580a | 305 | SNT | SWAP |
0425a4c6 | 306 | SSSTTTTN | PUSH 15 (ptr) |
bb21580a AT |
307 | TTT | LOAD |
308 | SNT | SWAP | |
309 | TTS | STORE | |
310 | ||
311 | @ Check for loop completion. | |
312 | SNS | DUP | |
0425a4c6 | 313 | SSSTTTTN | PUSH 15 (ptr) |
bb21580a AT |
314 | TTT | LOAD |
315 | TSST | SUBTRACT | |
ae1f85a1 | 316 | NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001 |
bb21580a | 317 | |
0425a4c6 AT |
318 | @ Increment heap[15] if continuing. |
319 | SSSTTTTN | PUSH 15 (ptr) | |
bb21580a AT |
320 | SNS | DUP |
321 | TTT | LOAD | |
322 | SSSTN | PUSH 1 | |
323 | TSSS | ADD | |
324 | TTS | STORE | |
ae1f85a1 AT |
325 | NSNSTSSSSSTSSSSSSSSN | JMP > 01000001 00000000 |
326 | ||
327 | @ Clean up and return. | |
328 | NSSVSTSSSSSTSSSSSSSTN | Mark: 01000001 00000001 | |
329 | SNN | DROP | |
330 | NTN | RTS | |
331 | ||
332 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
333 | @ Name: | |
334 | @ slurp (11110) | |
335 | @ Description: | |
336 | @ Reads values from heap to stack in complementary order to 'spew'. | |
337 | @ Call Stack: | |
338 | @ address | |
339 | @ count <-- TOS | |
340 | @ Return Stack: | |
341 | @ heap[address+count] | |
342 | @ ... | |
343 | @ heap[address+1] | |
344 | @ heap[address] <-- TOS | |
345 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
346 | NSSVTTTTSN | Mark: 11110 (slurp) | |
ae1f85a1 AT |
347 | |
348 | @ Load one word from heap on each pass. | |
23d17247 AT |
349 | SNS | DUP |
350 | SSSTTN | PUSH 3 | |
351 | NSTTSTSN | JSR > 1010 (stackrotate) | |
352 | SNT | SWAP | |
353 | SNS | DUP | |
354 | SSSTTN | PUSH 3 | |
355 | NSTTSTSN | JSR > 1010 (stackrotate) | |
ae1f85a1 AT |
356 | TSSS | ADD |
357 | TTT | LOAD | |
23d17247 AT |
358 | SSSTTN | PUSH 3 |
359 | NSTTSTSN | JSR > 1010 (stackrotate) | |
360 | SNT | SWAP | |
ae1f85a1 AT |
361 | |
362 | @ Check for loop completion. | |
ae1f85a1 | 363 | SNS | DUP |
23d17247 | 364 | NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000 |
ae1f85a1 AT |
365 | SSSTN | PUSH 1 |
366 | TSST | SUBTRACT | |
23d17247 AT |
367 | NSNTTTTSN | JMP > 11110 (slurp) |
368 | ||
369 | @ Clean up and return. | |
370 | NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000 | |
ae1f85a1 AT |
371 | SNN | DROP |
372 | SNN | DROP | |
373 | NTN | RTS | |
374 | ||
375 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
376 | @ Name: | |
377 | @ spew (11111) | |
378 | @ Description: | |
379 | @ Writes values from stack to heap in this order: | |
380 | @ TOS -> heap[address] | |
381 | @ TOS+1 -> heap[address+1] | |
382 | @ ... | |
383 | @ TOS+n -> heap[address+count] | |
384 | @ Call Stack: | |
385 | @ data-words | |
386 | @ ... | |
387 | @ data-words | |
388 | @ address | |
389 | @ count <-- TOS | |
390 | @ Return Stack: | |
391 | @ <empty> | |
392 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
393 | NSSVTTTTTN | Mark: 11111 (spew) | |
394 | SSSTSN | PUSH 2 | |
395 | NSTTSSSSSTN | JSR > 1000001 (spewreg) | |
396 | ||
397 | @ Create a counter in heap[3] that doubles as a dest. pointer offset generator. | |
398 | SSSTTN | PUSH 3 (ptr) | |
399 | SSSSN | PUSH 0 | |
400 | TTS | STORE | |
401 | ||
402 | @ Store one word to heap on each pass. | |
403 | NSSVSSSTTTTTSSSSSSSSN | Mark: 00011111 00000000 | |
404 | SSSTSN | PUSH 2 (ptr) | |
405 | TTT | LOAD | |
406 | SSSTTN | PUSH 3 (ptr) | |
407 | TTT | LOAD | |
408 | TSSS | ADD | |
409 | SNT | SWAP | |
410 | TTS | STORE | |
411 | ||
412 | @ Check for loop completion. | |
413 | SSSTN | PUSH 1 (ptr) | |
414 | TTT | LOAD | |
415 | SSSTTN | PUSH 3 (ptr) | |
416 | TTT | LOAD | |
417 | TSST | SUBTRACT | |
418 | NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001 | |
419 | ||
420 | @ Increment heap[3] if continuing. | |
421 | SSSTTN | PUSH 3 (ptr) | |
422 | SNS | DUP | |
423 | TTT | LOAD | |
424 | SSSTN | PUSH 1 | |
425 | TSSS | ADD | |
426 | TTS | STORE | |
bb21580a AT |
427 | NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000 |
428 | ||
429 | @ Clean up and return. | |
430 | NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001 | |
bb21580a | 431 | NTN | RTS |
d63de3fa | 432 | |
3695b659 | 433 | #endif |