1 // license:BSD-3-Clause
2 // copyright-holders:Nathan Woods
3 /****************************************************************************
4
5 filtbas.c
6
7 Filter for Microsoft-style tokenized BASIC files
8
9 BASIC files typically follow the following format:
10
11 int8 $ff
12 int16 <TOTAL LENGTH>
13 ...
14 int16 <PTR_NEXT_LINE>
15 int16 <LINE_NUM>
16 int8[] <TOKENISED_DATA>
17 int8 $00 End of line delimiter
18
19 *****************************************************************************/
20
21 #include <cstring>
22 #include <cstdarg>
23 #include <cctype>
24
25 #include "imgtool.h"
26 #include "formats/imageutl.h"
27
28
29 /***************************************************************************
30 CONSTANTS
31 ***************************************************************************/
32
33 #define EOLN (CRLF == 1 ? "\r" : (CRLF == 2 ? "\n" : (CRLF == 3 ? "\r\n" : NULL)))
34
35
36
37 /***************************************************************************
38 TYPE DEFINITIONS
39 ***************************************************************************/
40
41 struct basictoken_tableent
42 {
43 uint8_t shift;
44 uint8_t base;
45 const char *const *tokens;
46 int num_tokens;
47 };
48
49
50
51 struct basictokens
52 {
53 uint16_t baseaddress;
54 uint8_t size_pos;
55 unsigned int skip_bytes : 15;
56 unsigned char bytes[20];
57 unsigned int be : 1;
58 const basictoken_tableent *entries;
59 int num_entries;
60 };
61
62
63
64 /***************************************************************************
65 IMPLEMENTATION
66 ***************************************************************************/
67
68 /*-------------------------------------------------
69 basic_readfile - reads a file and decodes
70 BASIC tokens into ASCII text
71 -------------------------------------------------*/
72
basic_readfile(const basictokens * tokens,imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & destf)73 static imgtoolerr_t basic_readfile(const basictokens *tokens,
74 imgtool::partition &partition, const char *filename,
75 const char *fork, imgtool::stream &destf)
76 {
77 imgtoolerr_t err;
78 imgtool::stream::ptr mem_stream;
79 uint8_t line_header[4];
80 uint16_t line_number; //, address;
81 uint8_t b, shift;
82 int i;
83 int in_string = false;
84 const basictoken_tableent *token_table;
85 const char *token;
86
87 /* open a memory stream */
88 mem_stream = imgtool::stream::open_mem(nullptr, 0);
89 if (!mem_stream)
90 return IMGTOOLERR_OUTOFMEMORY;
91
92 /* read actual file */
93 err = partition.read_file(filename, fork, *mem_stream, nullptr);
94 if (err)
95 return err;
96
97 /* skip first few bytes */
98 mem_stream->seek(tokens->skip_bytes, SEEK_SET);
99
100 /* keep reading line headers */
101 while(mem_stream->read(line_header, sizeof(line_header)) == sizeof(line_header))
102 {
103 /* pluck the address and line number out */
104 if (tokens->be)
105 {
106 //address = (uint16_t)
107 pick_integer_be(line_header, 0, 2);
108 line_number = (uint16_t) pick_integer_be(line_header, 2, 2);
109 }
110 else
111 {
112 //address = (uint16_t)
113 pick_integer_le(line_header, 0, 2);
114 line_number = (uint16_t) pick_integer_le(line_header, 2, 2);
115 }
116
117 /* write the line number */
118 destf.printf("%u ", (unsigned) line_number);
119 shift = 0x00;
120
121 in_string = false; // in case the last line didn't terminate a string
122
123 while((mem_stream->read(&b, 1) > 0) && (b != 0x00))
124 {
125 if (b == 0x22)
126 in_string = in_string ? false : true;
127
128 if ((b & 0x80) && (!in_string))
129 {
130 token = nullptr;
131
132 for (i = 0; i < tokens->num_entries; i++)
133 {
134 token_table = &tokens->entries[i];
135 if (token_table->shift == shift)
136 {
137 if ((b - 0x80) < token_table->num_tokens)
138 {
139 token = token_table->tokens[b - 0x80];
140 if (token)
141 shift = 0x00;
142 }
143 }
144
145 if (token_table->shift == b)
146 {
147 shift = token_table->shift;
148 break;
149 }
150 }
151
152 if (shift == 0x00)
153 destf.puts(token ? token : "!");
154 }
155 else
156 {
157 destf.putc((char) b);
158 }
159 }
160
161 destf.puts(EOLN);
162 }
163
164 return err;
165 }
166
167
168
169 /*-------------------------------------------------
170 basic_writefile - translates ASCII text to
171 BASIC tokens and writes it to a file
172 -------------------------------------------------*/
173
basic_writefile(const basictokens * tokens,imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & sourcef,util::option_resolution * opts)174 static imgtoolerr_t basic_writefile(const basictokens *tokens,
175 imgtool::partition &partition, const char *filename,
176 const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)
177 {
178 imgtool::stream::ptr mem_stream;
179 char buf[1024];
180 int eof = false;
181 uint32_t len;
182 char c;
183 int i, j, pos, in_quotes;
184 uint16_t line_number;
185 uint8_t line_header[4];
186 uint8_t file_size[2];
187 const basictoken_tableent *token_table;
188 const char *token;
189 uint8_t token_shift, token_value;
190 uint16_t address;
191
192 /* open a memory stream */
193 mem_stream = imgtool::stream::open_mem(nullptr, 0);
194 if (!mem_stream)
195 return IMGTOOLERR_OUTOFMEMORY;
196
197 /* write header */
198 mem_stream->write(tokens->bytes, tokens->skip_bytes);
199 /* loop until the file is complete */
200 while(!eof)
201 {
202 /* read a line */
203 pos = 0;
204 while((len = sourcef.read(&c, 1)) > 0)
205 {
206 /* break if at end of line */
207 if ((c == '\r') || (c == '\n'))
208 break;
209
210 if (pos <= ARRAY_LENGTH(buf) - 1)
211 {
212 buf[pos++] = c;
213 }
214 }
215 eof = (len == 0);
216 buf[pos] = '\0';
217
218 /* ignore lines that don't start with digits */
219 if (isdigit(buf[0]))
220 {
221 /* start at beginning of line */
222 pos = 0;
223
224 /* read line number */
225 line_number = 0;
226 while(isdigit(buf[pos]))
227 {
228 line_number *= 10;
229 line_number += (buf[pos++] - '0');
230 }
231
232 /* determine address */
233 if (tokens->baseaddress != 0)
234 {
235 address = tokens->baseaddress + (uint16_t)mem_stream->size() + 4;
236 }
237 else
238 {
239 address = 0x0000;
240 }
241
242 /* set up line header */
243 memset(&line_header, 0, sizeof(line_header));
244 if (tokens->be)
245 {
246 place_integer_be(line_header, 0, 2, address);
247 place_integer_be(line_header, 2, 2, line_number);
248 }
249 else
250 {
251 place_integer_le(line_header, 0, 2, address);
252 place_integer_le(line_header, 2, 2, line_number);
253 }
254
255 /* emit line header */
256 mem_stream->write(line_header, sizeof(line_header));
257
258 /* skip spaces */
259 while(isspace(buf[pos]))
260 pos++;
261
262 /* when we start out, we are not within quotation marks */
263 in_quotes = false;
264
265 /* read until end of line */
266 while(buf[pos] != '\0')
267 {
268 token = nullptr;
269 token_shift = 0;
270 token_value = 0;
271
272 if (buf[pos] == '\"')
273 {
274 /* flip quotation status */
275 in_quotes = !in_quotes;
276 }
277 else if (!in_quotes)
278 {
279 for (i = 0; (token == nullptr) && (i < tokens->num_entries); i++)
280 {
281 bool found = false;
282 token_table = &tokens->entries[i];
283 for (j = 0; (token == nullptr) && (j < token_table->num_tokens); j++)
284 {
285 if (!strncmp(&buf[pos], token_table->tokens[j], strlen(token_table->tokens[j])))
286 {
287 token = token_table->tokens[j];
288 token_shift = token_table->shift;
289 token_value = token_table->base + j;
290 pos += strlen(token);
291 found = true;
292 break;
293 }
294 }
295 if (found)
296 break;
297 }
298 }
299
300 /* did we find a token? */
301 if (token != nullptr)
302 {
303 /* emit the token */
304 if (token_shift != 0)
305 mem_stream->write(&token_shift, 1);
306 mem_stream->write(&token_value, 1);
307 }
308 else
309 {
310 /* no token; emit the byte */
311 mem_stream->write(&buf[pos++], 1);
312 }
313 }
314
315 /* emit line terminator */
316 mem_stream->fill(0x00, 1);
317 }
318 }
319
320 /* emit program terminator */
321 mem_stream->fill(0x00, 2);
322
323 /* reset stream */
324 mem_stream->seek(tokens->size_pos, SEEK_SET);
325
326 /* this is somewhat gross */
327 if (tokens->skip_bytes >= 3)
328 {
329 if (tokens->be)
330 {
331 place_integer_be(file_size, 0, 2, mem_stream->size());
332 }
333 else
334 {
335 place_integer_le(file_size, 0, 2, mem_stream->size());
336 }
337 mem_stream->write(file_size, 2);
338 mem_stream->seek(0, SEEK_SET);
339 }
340
341 /* write actual file */
342 return partition.write_file(filename, fork, *mem_stream, opts, nullptr);
343 }
344
345
346
347 /***************************************************************************
348 TOKEN DEFINITIONS
349 ***************************************************************************/
350
351 static const char *const cocobas_statements[] =
352 {
353 "FOR", /* 0x80 */
354 "GO", /* 0x81 */
355 "REM", /* 0x82 */
356 "'", /* 0x83 */
357 "ELSE", /* 0x84 */
358 "IF", /* 0x85 */
359 "DATA", /* 0x86 */
360 "PRINT", /* 0x87 */
361 "ON", /* 0x88 */
362 "INPUT", /* 0x89 */
363 "END", /* 0x8a */
364 "NEXT", /* 0x8b */
365 "DIM", /* 0x8c */
366 "READ", /* 0x8d */
367 "RUN", /* 0x8e */
368 "RESTORE", /* 0x8f */
369 "RETURN", /* 0x90 */
370 "STOP", /* 0x91 */
371 "POKE", /* 0x92 */
372 "CONT", /* 0x93 */
373 "LIST", /* 0x94 */
374 "CLEAR", /* 0x95 */
375 "NEW", /* 0x96 */
376 "CLOAD", /* 0x97 */
377 "CSAVE", /* 0x98 */
378 "OPEN", /* 0x99 */
379 "CLOSE", /* 0x9a */
380 "LLIST", /* 0x9b */
381 "SET", /* 0x9c */
382 "RESET", /* 0x9d */
383 "CLS", /* 0x9e */
384 "MOTOR", /* 0x9f */
385 "SOUND", /* 0xa0 */
386 "AUDIO", /* 0xa1 */
387 "EXEC", /* 0xa2 */
388 "SKIPF", /* 0xa3 */
389 "TAB(", /* 0xa4 */
390 "TO", /* 0xa5 */
391 "SUB", /* 0xa6 */
392 "THEN", /* 0xa7 */
393 "NOT", /* 0xa8 */
394 "STEP", /* 0xa9 */
395 "OFF", /* 0xaa */
396 "+", /* 0xab */
397 "-", /* 0xac */
398 "*", /* 0xad */
399 "/", /* 0xae */
400 "^", /* 0xaf */
401 "AND", /* 0xb0 */
402 "OR", /* 0xb1 */
403 ">", /* 0xb2 */
404 "=", /* 0xb3 */
405 "<", /* 0xb4 */
406 "DEL", /* 0xb5 */
407 "EDIT", /* 0xb6 */
408 "TRON", /* 0xb7 */
409 "TROFF", /* 0xb8 */
410 "DEF", /* 0xb9 */
411 "LET", /* 0xba */
412 "LINE", /* 0xbb */
413 "PCLS", /* 0xbc */
414 "PSET", /* 0xbd */
415 "PRESET", /* 0xbe */
416 "SCREEN", /* 0xbf */
417 "PCLEAR", /* 0xc0 */
418 "COLOR", /* 0xc1 */
419 "CIRCLE", /* 0xc2 */
420 "PAINT", /* 0xc3 */
421 "GET", /* 0xc4 */
422 "PUT", /* 0xc5 */
423 "DRAW", /* 0xc6 */
424 "PCOPY", /* 0xc7 */
425 "PMODE", /* 0xc8 */
426 "PLAY", /* 0xc9 */
427 "DLOAD", /* 0xca */
428 "RENUM", /* 0xcb */
429 "FN", /* 0xcc */
430 "USING", /* 0xcd */
431 "DIR", /* 0xce */
432 "DRIVE", /* 0xcf */
433 "FIELD", /* 0xd0 */
434 "FILES", /* 0xd1 */
435 "KILL", /* 0xd2 */
436 "LOAD", /* 0xd3 */
437 "LSET", /* 0xd4 */
438 "MERGE", /* 0xd5 */
439 "RENAME", /* 0xd6 */
440 "RSET", /* 0xd7 */
441 "SAVE", /* 0xd8 */
442 "WRITE", /* 0xd9 */
443 "VERIFY", /* 0xda */
444 "UNLOAD", /* 0xdb */
445 "DSKINI", /* 0xdc */
446 "BACKUP", /* 0xdd */
447 "COPY", /* 0xde */
448 "DSKI$", /* 0xdf */
449 "DSKO$", /* 0xe0 */
450 "DOS", /* 0xe1 */
451 "WIDTH", /* 0xe2 */
452 "PALETTE", /* 0xe3 */
453 "HSCREEN", /* 0xe4 */
454 "LPOKE", /* 0xe5 */
455 "HCLS", /* 0xe6 */
456 "HCOLOR", /* 0xe7 */
457 "HPAINT", /* 0xe8 */
458 "HCIRCLE", /* 0xe9 */
459 "HLINE", /* 0xea */
460 "HGET", /* 0xeb */
461 "HPUT", /* 0xec */
462 "HBUFF", /* 0xed */
463 "HPRINT", /* 0xee */
464 "ERR", /* 0xef */
465 "BRK", /* 0xf0 */
466 "LOCATE", /* 0xf1 */
467 "HSTAT", /* 0xf2 */
468 "HSET", /* 0xf3 */
469 "HRESET", /* 0xf4 */
470 "HDRAW", /* 0xf5 */
471 "CMP", /* 0xf6 */
472 "RGB", /* 0xf7 */
473 "ATTR" /* 0xf8 */
474 };
475
476 static const char *const cocobas_functions[] =
477 {
478 "SGN", /* 0xff80 */
479 "INT", /* 0xff81 */
480 "ABS", /* 0xff82 */
481 "USR", /* 0xff83 */
482 "RND", /* 0xff84 */
483 "SIN", /* 0xff85 */
484 "PEEK", /* 0xff86 */
485 "LEN", /* 0xff87 */
486 "STR$", /* 0xff88 */
487 "VAL", /* 0xff89 */
488 "ASC", /* 0xff8a */
489 "CHR$", /* 0xff8b */
490 "EOF", /* 0xff8c */
491 "JOYSTK", /* 0xff8d */
492 "LEFT$", /* 0xff8e */
493 "RIGHT$", /* 0xff8f */
494 "MID$", /* 0xff90 */
495 "POINT", /* 0xff91 */
496 "INKEY$", /* 0xff92 */
497 "MEM", /* 0xff93 */
498 "ATN", /* 0xff94 */
499 "COS", /* 0xff95 */
500 "TAN", /* 0xff96 */
501 "EXP", /* 0xff97 */
502 "FIX", /* 0xff98 */
503 "LOG", /* 0xff99 */
504 "POS", /* 0xff9a */
505 "SQR", /* 0xff9b */
506 "HEX$", /* 0xff9c */
507 "VARPTR", /* 0xff9d */
508 "INSTR", /* 0xff9e */
509 "TIMER", /* 0xff9f */
510 "PPOINT", /* 0xffa0 */
511 "STRING$", /* 0xffa1 */
512 "CVN", /* 0xffa2 */
513 "FREE", /* 0xffa3 */
514 "LOC", /* 0xffa4 */
515 "LOF", /* 0xffa5 */
516 "MKN$", /* 0xffa6 */
517 "AS", /* 0xffa7 */
518 "LPEEK", /* 0xffa8 */
519 "BUTTON", /* 0xffa9 */
520 "HPOINT", /* 0xffaa */
521 "ERNO", /* 0xffab */
522 "ERLIN" /* 0xffac */
523 };
524
525 static const char *const dragonbas_statements[] =
526 {
527 "FOR", /* 0x80 */
528 "GO", /* 0x81 */
529 "REM", /* 0x82 */
530 "'", /* 0x83 */
531 "ELSE", /* 0x84 */
532 "IF", /* 0x85 */
533 "DATA", /* 0x86 */
534 "PRINT", /* 0x87 */
535 "ON", /* 0x88 */
536 "INPUT", /* 0x89 */
537 "END", /* 0x8a */
538 "NEXT", /* 0x8b */
539 "DIM", /* 0x8c */
540 "READ", /* 0x8d */
541 "LET", /* 0x8e */
542 "RUN", /* 0x8f */
543 "RESTORE", /* 0x90 */
544 "RETURN", /* 0x91 */
545 "STOP", /* 0x92 */
546 "POKE", /* 0x93 */
547 "CONT", /* 0x94 */
548 "LIST", /* 0x95 */
549 "CLEAR", /* 0x96 */
550 "NEW", /* 0x97 */
551 "DEF", /* 0x98 */
552 "CLOAD", /* 0x99 */
553 "CSAVE", /* 0x9a */
554 "OPEN", /* 0x9b */
555 "CLOSE", /* 0x9c */
556 "LLIST", /* 0x9d */
557 "SET", /* 0x9e */
558 "RESET", /* 0x9f */
559 "CLS", /* 0xa0 */
560 "MOTOR", /* 0xa1 */
561 "SOUND", /* 0xa2 */
562 "AUDIO", /* 0xa3 */
563 "EXEC", /* 0xa4 */
564 "SKIPF", /* 0xa5 */
565 "DEL", /* 0xa6 */
566 "EDIT", /* 0xa7 */
567 "TRON", /* 0xa8 */
568 "TROFF", /* 0xa9 */
569 "LINE", /* 0xaa */
570 "PCLS", /* 0xab */
571 "PSET", /* 0xac */
572 "PRESET", /* 0xad */
573 "SCREEN", /* 0xae */
574 "PCLEAR", /* 0xaf */
575 "COLOR", /* 0xb0 */
576 "CIRCLE", /* 0xb1 */
577 "PAINT", /* 0xb2 */
578 "GET", /* 0xb3 */
579 "PUT", /* 0xb4 */
580 "DRAW", /* 0xb5 */
581 "PCOPY", /* 0xb6 */
582 "PMODE", /* 0xb7 */
583 "PLAY", /* 0xb8 */
584 "DLOAD", /* 0xb9 */
585 "RENUM", /* 0xba */
586 "TAB(", /* 0xbb */
587 "TO", /* 0xbc */
588 "SUB", /* 0xbd */
589 "FN", /* 0xbe */
590 "THEN", /* 0xbf */
591 "NOT", /* 0xc0 */
592 "STEP", /* 0xc1 */
593 "OFF", /* 0xc2 */
594 "+", /* 0xc3 */
595 "-", /* 0xc4 */
596 "*", /* 0xc5 */
597 "/", /* 0xc6 */
598 "^", /* 0xc7 */
599 "AND", /* 0xc8 */
600 "OR", /* 0xc9 */
601 ">", /* 0xca */
602 "=", /* 0xcb */
603 "<", /* 0xcc */
604 "USING", /* 0xcd */
605 "DIR", /* 0xce */
606 "DRIVE", /* 0xcf */
607 "FIELD", /* 0xd0 */
608 "FILES", /* 0xd1 */
609 "KILL", /* 0xd2 */
610 "LOAD", /* 0xd3 */
611 "LSET", /* 0xd4 */
612 "MERGE", /* 0xd5 */
613 "RENAME", /* 0xd6 */
614 "RSET", /* 0xd7 */
615 "SAVE", /* 0xd8 */
616 "WRITE", /* 0xd9 */
617 "VERIFY", /* 0xda */
618 "UNLOAD", /* 0xdb */
619 "DSKINI", /* 0xdc */
620 "BACKUP", /* 0xdd */
621 "COPY", /* 0xde */
622 "DSKI$", /* 0xdf */
623 "DSKO$" /* 0xe0 */
624 };
625
626 static const char *const dragonbas_functions[] =
627 {
628 "SGN", /* 0xff80 */
629 "INT", /* 0xff81 */
630 "ABS", /* 0xff82 */
631 "POS", /* 0xff83 */
632 "RND", /* 0xff84 */
633 "SQR", /* 0xff85 */
634 "LOG", /* 0xff86 */
635 "EXP", /* 0xff87 */
636 "SIN", /* 0xff88 */
637 "COS", /* 0xff89 */
638 "TAN", /* 0xff8a */
639 "ATN", /* 0xff8b */
640 "PEEK", /* 0xff8c */
641 "LEN", /* 0xff8d */
642 "STR$", /* 0xff8e */
643 "VAL", /* 0xff8f */
644 "ASC", /* 0xff90 */
645 "CHR$", /* 0xff91 */
646 "EOF", /* 0xff92 */
647 "JOYSTK", /* 0xff93 */
648 "FIX", /* 0xff94 */
649 "HEX$", /* 0xff95 */
650 "LEFT$", /* 0xff96 */
651 "RIGHT$", /* 0xff97 */
652 "MID$", /* 0xff98 */
653 "POINT", /* 0xff99 */
654 "INKEY$", /* 0xff9a */
655 "MEM", /* 0xff9b */
656 "VARPTR", /* 0xff9c */
657 "INSTR", /* 0xff9d */
658 "TIMER", /* 0xff9e */
659 "PPOINT", /* 0xff9f */
660 "STRING$", /* 0xffa0 */
661 "USR", /* 0xffa1 */
662 "CVN", /* 0xffa2 */
663 "FREE", /* 0xffa3 */
664 "LOC", /* 0xffa4 */
665 "LOF", /* 0xffa5 */
666 "MKN$" /* 0xffa6 */
667 };
668
669 static const char *const vzbas[] =
670 {
671 "END", /* 0x80 */
672 "FOR", /* 0x81 */
673 "RESET", /* 0x82 */
674 "SET", /* 0x83 */
675 "CLS", /* 0x84 */
676 nullptr, /* 0x85 */
677 "RANDOM", /* 0x86 */
678 "NEXT", /* 0x87 */
679 "DATA", /* 0x88 */
680 "INPUT", /* 0x89 */
681 "DIM", /* 0x8a */
682 "READ", /* 0x8b */
683 "LET", /* 0x8c */
684 "GOTO", /* 0x8d */
685 "RUN", /* 0x8e */
686 "IF", /* 0x8f */
687 "RESTORE", /* 0x90 */
688 "GOSUB", /* 0x91 */
689 "RETURN", /* 0x92 */
690 "'", /* 0x93 */
691 "STOP", /* 0x94 */
692 "ELSE", /* 0x95 */
693 "COPY", /* 0x96 */
694 "COLOR", /* 0x97 */
695 "VERIFY", /* 0x98 */
696 "DEFINT", /* 0x99 */
697 "DEFSNG", /* 0x9a */
698 "DEFDBL", /* 0x9b */
699 "CRUN", /* 0x9c */
700 "MODE", /* 0x9d */
701 "ERROR", /* 0x9e */
702 "RESUME", /* 0x9f */
703 "OUT", /* 0xa0 */
704 "IN", /* 0xa1 */
705 nullptr, /* 0xa2 */
706 nullptr, /* 0xa3 */
707 nullptr, /* 0xa4 */
708 nullptr, /* 0xa5 */
709 nullptr, /* 0xa6 */
710 nullptr, /* 0xa7 */
711 nullptr, /* 0xa8 */
712 nullptr, /* 0xa9 */
713 nullptr, /* 0xaa */
714 nullptr, /* 0xab */
715 nullptr, /* 0xac */
716 nullptr, /* 0xad */
717 "(RESET)", /* 0xae */
718 "LPRINT", /* 0xaf */
719 nullptr, /* 0xb0 */
720 "POKE", /* 0xb1 */
721 "PRINT", /* 0xb2 */
722 "CONT", /* 0xb3 */
723 "LIST", /* 0xb4 */
724 "LLIST", /* 0xb5 */
725 "DELETE", /* 0xb6 */
726 "AUTO", /* 0xb7 */
727 "CLEAR", /* 0xb8 */
728 "CLOAD", /* 0xb9 */
729 "CSAVE", /* 0xba */
730 "NEW", /* 0xbb */
731 "TAB(", /* 0xbc */
732 "TO", /* 0xbd */
733 nullptr, /* 0xbe */
734 "USING", /* 0xbf */
735 "VARPTR", /* 0xc0 */
736 "USR", /* 0xc1 */
737 "ERL", /* 0xc2 */
738 "ERR", /* 0xc3 */
739 "STRING$", /* 0xc4 */
740 nullptr, /* 0xc5 */
741 "POINT", /* 0xc6 */
742 nullptr, /* 0xc7 */
743 "MEM", /* 0xc8 */
744 "INKEY$", /* 0xc9 */
745 "THEN", /* 0xca */
746 "NOT", /* 0xcb */
747 "STEP", /* 0xcc */
748 "+", /* 0xcd */
749 "-", /* 0xce */
750 "*", /* 0xcf */
751 "/", /* 0xd0 */
752 "^", /* 0xd1 */
753 "AND", /* 0xd2 */
754 "OR", /* 0xd3 */
755 ">", /* 0xd4 */
756 "=", /* 0xd5 */
757 "<", /* 0xd6 */
758 "SGN", /* 0xd7 */
759 "INT", /* 0xd8 */
760 "ABS", /* 0xd9 */
761 "FRE", /* 0xda */
762 "INP", /* 0xdb */
763 "POS", /* 0xdc */
764 "SQR", /* 0xdd */
765 "AND", /* 0xde */
766 "LOG", /* 0xdf */
767 "EXP", /* 0xe0 */
768 "COS", /* 0xe1 */
769 "SIN", /* 0xe2 */
770 "TAN", /* 0xe3 */
771 "ATN", /* 0xe4 */
772 "PEEK", /* 0xe5 */
773 nullptr, /* 0xe6 */
774 nullptr, /* 0xe7 */
775 nullptr, /* 0xe8 */
776 nullptr, /* 0xe9 */
777 nullptr, /* 0xea */
778 nullptr, /* 0xeb */
779 nullptr, /* 0xec */
780 nullptr, /* 0xed */
781 nullptr, /* 0xee */
782 "CINT", /* 0xef */
783 "CSNG", /* 0xf0 */
784 "CDBL", /* 0xf1 */
785 "FIX", /* 0xf2 */
786 "LEN", /* 0xf3 */
787 "STR$", /* 0xf4 */
788 "VAL", /* 0xf5 */
789 "ASC", /* 0xf6 */
790 "CHR$", /* 0xf7 */
791 "LEFT$", /* 0xf8 */
792 "RIGHT$", /* 0xf9 */
793 "MID$", /* 0xfa */
794 nullptr, /* 0xfb */
795 nullptr, /* 0xfc */
796 nullptr, /* 0xfd */
797 nullptr, /* 0xfe */
798 nullptr /* 0xff */
799 };
800
801 static const char *const bml3bas_statements[] =
802 {
803 "END", /* 0x80 */
804 "FOR", /* 0x81 */
805 "NEXT", /* 0x82 */
806 "DATA", /* 0x83 */
807 "DIM", /* 0x84 */
808 "READ", /* 0x85 */
809 "LET", /* 0x86 */
810 "GO", /* 0x87 */
811 "RUN", /* 0x88 */
812 "IF", /* 0x89 */
813 "RESTORE", /* 0x8a */
814 "RETURN", /* 0x8b */
815 "REM", /* 0x8c */
816 "'", /* 0x8d */
817 "STOP", /* 0x8e */
818 "ELSE", /* 0x8f */
819 "TRON", /* 0x90 */
820 "TROFF", /* 0x91 */
821 "SWAP", /* 0x92 */
822 "DEFSTR", /* 0x93 */
823 "DEFINT", /* 0x94 */
824 "DEFSNG", /* 0x95 */
825 "DEFDBL", /* 0x96 */
826 "ON", /* 0x97 */
827 "WAIT", /* 0x98 */
828 "RENUM", /* 0x99 */
829 "EDIT", /* 0x9a */
830 "ERROR", /* 0x9b */
831 "RESUME", /* 0x9c */
832 "AUTO", /* 0x9d */
833 "DELETE", /* 0x9e */
834 "TERM", /* 0x9f */
835 "WIDTH", /* 0xa0 */
836 "UNLIST", /* 0xa1 */
837 "MON", /* 0xa2 */
838 "LOCATE", /* 0xa3 */
839 "CLS", /* 0xa4 */
840 "CONSOLE", /* 0xa5 */
841 "PSET", /* 0xa6 */
842 "PRESET", /* 0xa7 */
843 "MOTOR", /* 0xa8 */
844 "SKIPF", /* 0xa9 */
845 "SAVE", /* 0xaa */
846 "LOAD", /* 0xab */
847 "MERGE", /* 0xac */
848 "EXEC", /* 0xad */
849 "OPEN", /* 0xae */
850 "CLOSE", /* 0xaf */
851 "FILES", /* 0xb0 */
852 "COM", /* 0xb1 */
853 "KEY", /* 0xb2 */
854 "PAINT", /* 0xb3 */
855 "BEEP", /* 0xb4 */
856 "COLOR", /* 0xb5 */
857 "LINE", /* 0xb6 */
858 "DEF", /* 0xb7 */
859 "POKE", /* 0xb8 */
860 "PRINT", /* 0xb9 */
861 "CONT", /* 0xba */
862 "LIST", /* 0xbb */
863 "CLEAR", /* 0xbc */
864 "RANDOMIZE",/* 0xbd */
865 "WHILE", /* 0xbe */
866 "WEND", /* 0xbf */
867 "NEW", /* 0xc0 */
868 "TAB(", /* 0xc1 */
869 "TO", /* 0xc2 */
870 "SUB", /* 0xc3 */
871 "FN", /* 0xc4 */
872 "SPC(", /* 0xc5 */
873 "USING", /* 0xc6 */
874 "USR", /* 0xc7 */
875 "ERL", /* 0xc8 */
876 "ERR", /* 0xc9 */
877 "OFF", /* 0xca */
878 "THEN", /* 0xcb */
879 "NOT", /* 0xcc */
880 "STEP", /* 0xcd */
881 "+", /* 0xce */
882 "-", /* 0xcf */
883 "*", /* 0xd0 */
884 "/", /* 0xd1 */
885 "^", /* 0xd2 */
886 "AND", /* 0xd3 */
887 "OR", /* 0xd4 */
888 "XOR", /* 0xd5 */
889 "EQV", /* 0xd6 */
890 "IMP", /* 0xd7 */
891 "MOD", /* 0xd8 */
892 "\\", /* 0xd9 */
893 ">", /* 0xda */
894 "=", /* 0xdb */
895 "<" /* 0xdc */
896 };
897
898 static const char *const bml3bas_functions[] =
899 {
900 "SGN", /* 0xff80 */
901 "INT", /* 0xff81 */
902 "ABS", /* 0xff82 */
903 "FRE", /* 0xff83 */
904 "POS", /* 0xff84 */
905 "SQR", /* 0xff85 */
906 "LOG", /* 0xff86 */
907 "EXP", /* 0xff87 */
908 "COS", /* 0xff88 */
909 "SIN", /* 0xff89 */
910 "TAN", /* 0xff8a */
911 "ATN", /* 0xff8b */
912 "PEEK", /* 0xff8c */
913 "LEN", /* 0xff8d */
914 "STR$", /* 0xff8e */
915 "VAL", /* 0xff8f */
916 "ASC", /* 0xff90 */
917 "CHR$", /* 0xff91 */
918 "CINT", /* 0xff92 */
919 "CSNG", /* 0xff93 */
920 "CDBL", /* 0xff94 */
921 "FIX", /* 0xff95 */
922 "SPACE$", /* 0xff96 */
923 "HEX$", /* 0xff97 */
924 "OCT$", /* 0xff98 */
925 "LOF", /* 0xff99 */
926 "EOF", /* 0xff9a */
927 "PEN", /* 0xff9b */
928 "LEFT$", /* 0xff9c */
929 "RIGHT$", /* 0xff9d */
930 "MID$", /* 0xff9e */
931 "INSTR", /* 0xff9f */
932 "SCREEN", /* 0xffa0 */
933 "VARPTR", /* 0xffa1 */
934 "STRING$", /* 0xffa2 */
935 "RND", /* 0xffa3 */
936 "INKEY$", /* 0xffa4 */
937 "INPUT", /* 0xffa5 */
938 "CSRLIN", /* 0xffa6 */
939 "POINT", /* 0xffa7 */
940 "TIME", /* 0xffa8 */
941 "DATE" /* 0xffa9 */
942 };
943
944
945 #ifdef BASIC_
946 /* ----------------------------------------------------------------------- *
947 * CBM machines *
948 * ----------------------------------------------------------------------- */
949 static const char *const basic_10[] = /* "BASIC 1.0" - supported by pet */
950 {
951 "END", /* 0x80 */
952 "FOR", /* 0x81 */
953 "NEXT", /* 0x82 */
954 "DATA", /* 0x83 */
955 "INPUT#", /* 0x84 */
956 "INPUT", /* 0x85 */
957 "DIM", /* 0x86 */
958 "READ", /* 0x87 */
959 "LET", /* 0x88 */
960 "GOTO", /* 0x89 */
961 "RUN", /* 0x8a */
962 "IF", /* 0x8b */
963 "RESTORE", /* 0x8c */
964 "GOSUB", /* 0x8d */
965 "RETURN", /* 0x8e */
966 "REM", /* 0x8f */
967 "STOP", /* 0x90 */
968 "ON", /* 0x91 */
969 "WAIT", /* 0x92 */
970 "LOAD", /* 0x93 */
971 "SAVE", /* 0x94 */
972 "VERIFY", /* 0x95 */
973 "DEF", /* 0x96 */
974 "POKE", /* 0x97 */
975 "PRINT#", /* 0x98 */
976 "PRINT", /* 0x99 */
977 "CONT", /* 0x9a */
978 "LIST", /* 0x9b */
979 "CLR", /* 0x9c */
980 "CMD", /* 0x9d */
981 "SYS", /* 0x9e */
982 "OPEN", /* 0x9f */
983 "CLOSE", /* 0xa0 */
984 "GET", /* 0xa1 */
985 "NEW", /* 0xa2 */
986 "TAB(", /* 0xa3 */
987 "TO", /* 0xa4 */
988 "FN", /* 0xa5 */
989 "SPC(", /* 0xa6 */
990 "THEN", /* 0xa7 */
991 "NOT", /* 0xa8 */
992 "STEP", /* 0xa9 */
993 "+", /* 0xaa */
994 "-", /* 0xab */
995 "*", /* 0xac */
996 "/", /* 0xad */
997 "^", /* 0xae */
998 "AND", /* 0xaf */
999 "OR", /* 0xb0 */
1000 ">", /* 0xb1 */
1001 "=", /* 0xb2 */
1002 "<", /* 0xb3 */
1003 "SGN", /* 0xb4 */
1004 "INT", /* 0xb5 */
1005 "ABS", /* 0xb6 */
1006 "USR", /* 0xb7 */
1007 "FRE", /* 0xb8 */
1008 "POS", /* 0xb9 */
1009 "SQR", /* 0xba */
1010 "RND", /* 0xbb */
1011 "LOG", /* 0xbc */
1012 "EXP", /* 0xbd */
1013 "COS", /* 0xbe */
1014 "SIN", /* 0xbf */
1015 "TAN", /* 0xc0 */
1016 "ATN", /* 0xc1 */
1017 "PEEK", /* 0xc2 */
1018 "LEN", /* 0xc3 */
1019 "STR$", /* 0xc4 */
1020 "VAL", /* 0xc5 */
1021 "ASC", /* 0xc6 */
1022 "CHR$", /* 0xc7 */
1023 "LEFT$", /* 0xc8 */
1024 "RIGHT$", /* 0xc9 */
1025 "MID$", /* 0xca */
1026 NULL, /* 0xcb */
1027 NULL, /* 0xcc */
1028 NULL, /* 0xcd */
1029 NULL, /* 0xce */
1030 NULL, /* 0xcf */
1031 NULL, /* 0xd0 */
1032 NULL, /* 0xd1 */
1033 NULL, /* 0xd2 */
1034 NULL, /* 0xd3 */
1035 NULL, /* 0xd4 */
1036 NULL, /* 0xd5 */
1037 NULL, /* 0xd6 */
1038 NULL, /* 0xd7 */
1039 NULL, /* 0xd8 */
1040 NULL, /* 0xd9 */
1041 NULL, /* 0xda */
1042 NULL, /* 0xdb */
1043 NULL, /* 0xdc */
1044 NULL, /* 0xdd */
1045 NULL, /* 0xde */
1046 NULL, /* 0xdf */
1047 NULL, /* 0xe0 */
1048 NULL, /* 0xe1 */
1049 NULL, /* 0xe2 */
1050 NULL, /* 0xe3 */
1051 NULL, /* 0xe4 */
1052 NULL, /* 0xe5 */
1053 NULL, /* 0xe6 */
1054 NULL, /* 0xe7 */
1055 NULL, /* 0xe8 */
1056 NULL, /* 0xe9 */
1057 NULL, /* 0xea */
1058 NULL, /* 0xeb */
1059 NULL, /* 0xec */
1060 NULL, /* 0xed */
1061 NULL, /* 0xee */
1062 NULL, /* 0xef */
1063 NULL, /* 0xf0 */
1064 NULL, /* 0xf1 */
1065 NULL, /* 0xf2 */
1066 NULL, /* 0xf3 */
1067 NULL, /* 0xf4 */
1068 NULL, /* 0xf5 */
1069 NULL, /* 0xf6 */
1070 NULL, /* 0xf7 */
1071 NULL, /* 0xf8 */
1072 NULL, /* 0xf9 */
1073 NULL, /* 0xfa */
1074 NULL, /* 0xfb */
1075 NULL, /* 0xfc */
1076 NULL, /* 0xfd */
1077 NULL, /* 0xfe */
1078 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1079 };
1080
1081 static const char *const basic_20[] = /* "BASIC 2.0" - supported by vic20 & clones, c64 & clones, cbm30xx series */
1082 {
1083 "END", /* 0x80 */
1084 "FOR", /* 0x81 */
1085 "NEXT", /* 0x82 */
1086 "DATA", /* 0x83 */
1087 "INPUT#", /* 0x84 */
1088 "INPUT", /* 0x85 */
1089 "DIM", /* 0x86 */
1090 "READ", /* 0x87 */
1091 "LET", /* 0x88 */
1092 "GOTO", /* 0x89 */
1093 "RUN", /* 0x8a */
1094 "IF", /* 0x8b */
1095 "RESTORE", /* 0x8c */
1096 "GOSUB", /* 0x8d */
1097 "RETURN", /* 0x8e */
1098 "REM", /* 0x8f */
1099 "STOP", /* 0x90 */
1100 "ON", /* 0x91 */
1101 "WAIT", /* 0x92 */
1102 "LOAD", /* 0x93 */
1103 "SAVE", /* 0x94 */
1104 "VERIFY", /* 0x95 */
1105 "DEF", /* 0x96 */
1106 "POKE", /* 0x97 */
1107 "PRINT#", /* 0x98 */
1108 "PRINT", /* 0x99 */
1109 "CONT", /* 0x9a */
1110 "LIST", /* 0x9b */
1111 "CLR", /* 0x9c */
1112 "CMD", /* 0x9d */
1113 "SYS", /* 0x9e */
1114 "OPEN", /* 0x9f */
1115 "CLOSE", /* 0xa0 */
1116 "GET", /* 0xa1 */
1117 "NEW", /* 0xa2 */
1118 "TAB(", /* 0xa3 */
1119 "TO", /* 0xa4 */
1120 "FN", /* 0xa5 */
1121 "SPC(", /* 0xa6 */
1122 "THEN", /* 0xa7 */
1123 "NOT", /* 0xa8 */
1124 "STEP", /* 0xa9 */
1125 "+", /* 0xaa */
1126 "-", /* 0xab */
1127 "*", /* 0xac */
1128 "/", /* 0xad */
1129 "^", /* 0xae */
1130 "AND", /* 0xaf */
1131 "OR", /* 0xb0 */
1132 ">", /* 0xb1 */
1133 "=", /* 0xb2 */
1134 "<", /* 0xb3 */
1135 "SGN", /* 0xb4 */
1136 "INT", /* 0xb5 */
1137 "ABS", /* 0xb6 */
1138 "USR", /* 0xb7 */
1139 "FRE", /* 0xb8 */
1140 "POS", /* 0xb9 */
1141 "SQR", /* 0xba */
1142 "RND", /* 0xbb */
1143 "LOG", /* 0xbc */
1144 "EXP", /* 0xbd */
1145 "COS", /* 0xbe */
1146 "SIN", /* 0xbf */
1147 "TAN", /* 0xc0 */
1148 "ATN", /* 0xc1 */
1149 "PEEK", /* 0xc2 */
1150 "LEN", /* 0xc3 */
1151 "STR$", /* 0xc4 */
1152 "VAL", /* 0xc5 */
1153 "ASC", /* 0xc6 */
1154 "CHR$", /* 0xc7 */
1155 "LEFT$", /* 0xc8 */
1156 "RIGHT$", /* 0xc9 */
1157 "MID$", /* 0xca */
1158 "GO", /* 0xcb */
1159 NULL, /* 0xcc */
1160 NULL, /* 0xcd */
1161 NULL, /* 0xce */
1162 NULL, /* 0xcf */
1163 NULL, /* 0xd0 */
1164 NULL, /* 0xd1 */
1165 NULL, /* 0xd2 */
1166 NULL, /* 0xd3 */
1167 NULL, /* 0xd4 */
1168 NULL, /* 0xd5 */
1169 NULL, /* 0xd6 */
1170 NULL, /* 0xd7 */
1171 NULL, /* 0xd8 */
1172 NULL, /* 0xd9 */
1173 NULL, /* 0xda */
1174 NULL, /* 0xdb */
1175 NULL, /* 0xdc */
1176 NULL, /* 0xdd */
1177 NULL, /* 0xde */
1178 NULL, /* 0xdf */
1179 NULL, /* 0xe0 */
1180 NULL, /* 0xe1 */
1181 NULL, /* 0xe2 */
1182 NULL, /* 0xe3 */
1183 NULL, /* 0xe4 */
1184 NULL, /* 0xe5 */
1185 NULL, /* 0xe6 */
1186 NULL, /* 0xe7 */
1187 NULL, /* 0xe8 */
1188 NULL, /* 0xe9 */
1189 NULL, /* 0xea */
1190 NULL, /* 0xeb */
1191 NULL, /* 0xec */
1192 NULL, /* 0xed */
1193 NULL, /* 0xee */
1194 NULL, /* 0xef */
1195 NULL, /* 0xf0 */
1196 NULL, /* 0xf1 */
1197 NULL, /* 0xf2 */
1198 NULL, /* 0xf3 */
1199 NULL, /* 0xf4 */
1200 NULL, /* 0xf5 */
1201 NULL, /* 0xf6 */
1202 NULL, /* 0xf7 */
1203 NULL, /* 0xf8 */
1204 NULL, /* 0xf9 */
1205 NULL, /* 0xfa */
1206 NULL, /* 0xfb */
1207 NULL, /* 0xfc */
1208 NULL, /* 0xfd */
1209 NULL, /* 0xfe */
1210 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1211 };
1212
1213 static const char *const basic_20_super_expander_vic[] = /* "BASIC 2.0 with Super Expander" - supported by vic20 & clones */
1214 {
1215 "END", /* 0x80 */
1216 "FOR", /* 0x81 */
1217 "NEXT", /* 0x82 */
1218 "DATA", /* 0x83 */
1219 "INPUT#", /* 0x84 */
1220 "INPUT", /* 0x85 */
1221 "DIM", /* 0x86 */
1222 "READ", /* 0x87 */
1223 "LET", /* 0x88 */
1224 "GOTO", /* 0x89 */
1225 "RUN", /* 0x8a */
1226 "IF", /* 0x8b */
1227 "RESTORE", /* 0x8c */
1228 "GOSUB", /* 0x8d */
1229 "RETURN", /* 0x8e */
1230 "REM", /* 0x8f */
1231 "STOP", /* 0x90 */
1232 "ON", /* 0x91 */
1233 "WAIT", /* 0x92 */
1234 "LOAD", /* 0x93 */
1235 "SAVE", /* 0x94 */
1236 "VERIFY", /* 0x95 */
1237 "DEF", /* 0x96 */
1238 "POKE", /* 0x97 */
1239 "PRINT#", /* 0x98 */
1240 "PRINT", /* 0x99 */
1241 "CONT", /* 0x9a */
1242 "LIST", /* 0x9b */
1243 "CLR", /* 0x9c */
1244 "CMD", /* 0x9d */
1245 "SYS", /* 0x9e */
1246 "OPEN", /* 0x9f */
1247 "CLOSE", /* 0xa0 */
1248 "GET", /* 0xa1 */
1249 "NEW", /* 0xa2 */
1250 "TAB(", /* 0xa3 */
1251 "TO", /* 0xa4 */
1252 "FN", /* 0xa5 */
1253 "SPC(", /* 0xa6 */
1254 "THEN", /* 0xa7 */
1255 "NOT", /* 0xa8 */
1256 "STEP", /* 0xa9 */
1257 "+", /* 0xaa */
1258 "-", /* 0xab */
1259 "*", /* 0xac */
1260 "/", /* 0xad */
1261 "^", /* 0xae */
1262 "AND", /* 0xaf */
1263 "OR", /* 0xb0 */
1264 ">", /* 0xb1 */
1265 "=", /* 0xb2 */
1266 "<", /* 0xb3 */
1267 "SGN", /* 0xb4 */
1268 "INT", /* 0xb5 */
1269 "ABS", /* 0xb6 */
1270 "USR", /* 0xb7 */
1271 "FRE", /* 0xb8 */
1272 "POS", /* 0xb9 */
1273 "SQR", /* 0xba */
1274 "RND", /* 0xbb */
1275 "LOG", /* 0xbc */
1276 "EXP", /* 0xbd */
1277 "COS", /* 0xbe */
1278 "SIN", /* 0xbf */
1279 "TAN", /* 0xc0 */
1280 "ATN", /* 0xc1 */
1281 "PEEK", /* 0xc2 */
1282 "LEN", /* 0xc3 */
1283 "STR$", /* 0xc4 */
1284 "VAL", /* 0xc5 */
1285 "ASC", /* 0xc6 */
1286 "CHR$", /* 0xc7 */
1287 "LEFT$", /* 0xc8 */
1288 "RIGHT$", /* 0xc9 */
1289 "MID$", /* 0xca */
1290 "GO", /* 0xcb */
1291 "KEY", /* 0xcc */
1292 "GRAPHIC", /* 0xcd */
1293 "SCNCLR", /* 0xce */
1294 "CIRCLE", /* 0xcf */
1295 "DRAW", /* 0xd0 */
1296 "REGION", /* 0xd1 */
1297 "COLOR", /* 0xd2 */
1298 "POINT", /* 0xd3 */
1299 "SOUND", /* 0xd4 */
1300 "CHAR", /* 0xd5 */
1301 "PAINT", /* 0xd6 */
1302 "RPOT", /* 0xd7 */
1303 "RPEN", /* 0xd8 */
1304 "RSND", /* 0xd9 */
1305 "RCOLR", /* 0xda */
1306 "RGR", /* 0xdb */
1307 "RJOY", /* 0xdc */
1308 "RDOT", /* 0xdd */
1309 NULL, /* 0xde */
1310 NULL, /* 0xdf */
1311 NULL, /* 0xe0 */
1312 NULL, /* 0xe1 */
1313 NULL, /* 0xe2 */
1314 NULL, /* 0xe3 */
1315 NULL, /* 0xe4 */
1316 NULL, /* 0xe5 */
1317 NULL, /* 0xe6 */
1318 NULL, /* 0xe7 */
1319 NULL, /* 0xe8 */
1320 NULL, /* 0xe9 */
1321 NULL, /* 0xea */
1322 NULL, /* 0xeb */
1323 NULL, /* 0xec */
1324 NULL, /* 0xed */
1325 NULL, /* 0xee */
1326 NULL, /* 0xef */
1327 NULL, /* 0xf0 */
1328 NULL, /* 0xf1 */
1329 NULL, /* 0xf2 */
1330 NULL, /* 0xf3 */
1331 NULL, /* 0xf4 */
1332 NULL, /* 0xf5 */
1333 NULL, /* 0xf6 */
1334 NULL, /* 0xf7 */
1335 NULL, /* 0xf8 */
1336 NULL, /* 0xf9 */
1337 NULL, /* 0xfa */
1338 NULL, /* 0xfb */
1339 NULL, /* 0xfc */
1340 NULL, /* 0xfd */
1341 NULL, /* 0xfe */
1342 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1343 };
1344
1345 static const char *const basic_20_turtle_basic_10[] = /* "BASIC 2.0 with Turtle BASIC 1.0" - supported by vic20 & clones */
1346 {
1347 "END", /* 0x80 */
1348 "FOR", /* 0x81 */
1349 "NEXT", /* 0x82 */
1350 "DATA", /* 0x83 */
1351 "INPUT#", /* 0x84 */
1352 "INPUT", /* 0x85 */
1353 "DIM", /* 0x86 */
1354 "READ", /* 0x87 */
1355 "LET", /* 0x88 */
1356 "GOTO", /* 0x89 */
1357 "RUN", /* 0x8a */
1358 "IF", /* 0x8b */
1359 "RESTORE", /* 0x8c */
1360 "GOSUB", /* 0x8d */
1361 "RETURN", /* 0x8e */
1362 "REM", /* 0x8f */
1363 "STOP", /* 0x90 */
1364 "ON", /* 0x91 */
1365 "WAIT", /* 0x92 */
1366 "LOAD", /* 0x93 */
1367 "SAVE", /* 0x94 */
1368 "VERIFY", /* 0x95 */
1369 "DEF", /* 0x96 */
1370 "POKE", /* 0x97 */
1371 "PRINT#", /* 0x98 */
1372 "PRINT", /* 0x99 */
1373 "CONT", /* 0x9a */
1374 "LIST", /* 0x9b */
1375 "CLR", /* 0x9c */
1376 "CMD", /* 0x9d */
1377 "SYS", /* 0x9e */
1378 "OPEN", /* 0x9f */
1379 "CLOSE", /* 0xa0 */
1380 "GET", /* 0xa1 */
1381 "NEW", /* 0xa2 */
1382 "TAB(", /* 0xa3 */
1383 "TO", /* 0xa4 */
1384 "FN", /* 0xa5 */
1385 "SPC(", /* 0xa6 */
1386 "THEN", /* 0xa7 */
1387 "NOT", /* 0xa8 */
1388 "STEP", /* 0xa9 */
1389 "+", /* 0xaa */
1390 "-", /* 0xab */
1391 "*", /* 0xac */
1392 "/", /* 0xad */
1393 "^", /* 0xae */
1394 "AND", /* 0xaf */
1395 "OR", /* 0xb0 */
1396 ">", /* 0xb1 */
1397 "=", /* 0xb2 */
1398 "<", /* 0xb3 */
1399 "SGN", /* 0xb4 */
1400 "INT", /* 0xb5 */
1401 "ABS", /* 0xb6 */
1402 "USR", /* 0xb7 */
1403 "FRE", /* 0xb8 */
1404 "POS", /* 0xb9 */
1405 "SQR", /* 0xba */
1406 "RND", /* 0xbb */
1407 "LOG", /* 0xbc */
1408 "EXP", /* 0xbd */
1409 "COS", /* 0xbe */
1410 "SIN", /* 0xbf */
1411 "TAN", /* 0xc0 */
1412 "ATN", /* 0xc1 */
1413 "PEEK", /* 0xc2 */
1414 "LEN", /* 0xc3 */
1415 "STR$", /* 0xc4 */
1416 "VAL", /* 0xc5 */
1417 "ASC", /* 0xc6 */
1418 "CHR$", /* 0xc7 */
1419 "LEFT$", /* 0xc8 */
1420 "RIGHT$", /* 0xc9 */
1421 "MID$", /* 0xca */
1422 "GO", /* 0xcb */
1423 "GRAPHIC", /* 0xcc */
1424 "OLD", /* 0xcd */
1425 "TURN", /* 0xce */
1426 "PEN", /* 0xcf */
1427 "DRAW", /* 0xd0 */
1428 "MOVE", /* 0xd1 */
1429 "POINT", /* 0xd2 */
1430 "KILL", /* 0xd3 */
1431 "WRITE", /* 0xd4 */
1432 "REPEAT", /* 0xd5 */
1433 "SCREEN", /* 0xd6 */
1434 "DOKE", /* 0xd7 */
1435 "RELOC", /* 0xd8 */
1436 "FILL", /* 0xd9 */
1437 "RTIME", /* 0xda */
1438 "BASE", /* 0xdb */
1439 "PAUSE", /* 0xdc */
1440 "POP", /* 0xdd */
1441 "COLOR", /* 0xde */
1442 "MERGE", /* 0xdf */
1443 "CHAR", /* 0xe0 */
1444 "TAKE", /* 0xe1 */
1445 "SOUND", /* 0xe2 */
1446 "VOL", /* 0xe3 */
1447 "PUT", /* 0xe4 */
1448 "PLACE", /* 0xe5 */
1449 "CLS", /* 0xe6 */
1450 "ACCEPT", /* 0xe7 */
1451 "RESET", /* 0xe8 */
1452 "GRAB", /* 0xe9 */
1453 "RDOT", /* 0xea */
1454 "PLR$", /* 0xeb */
1455 "DEEK", /* 0xec */
1456 "JOY", /* 0xed */
1457 NULL, /* 0xee */
1458 NULL, /* 0xef */
1459 NULL, /* 0xf0 */
1460 NULL, /* 0xf1 */
1461 NULL, /* 0xf2 */
1462 NULL, /* 0xf3 */
1463 NULL, /* 0xf4 */
1464 NULL, /* 0xf5 */
1465 NULL, /* 0xf6 */
1466 NULL, /* 0xf7 */
1467 NULL, /* 0xf8 */
1468 NULL, /* 0xf9 */
1469 NULL, /* 0xfa */
1470 NULL, /* 0xfb */
1471 NULL, /* 0xfc */
1472 NULL, /* 0xfd */
1473 NULL, /* 0xfe */
1474 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1475 };
1476
1477 static const char *const basic_20_speech_basic_27[] = /* "BASIC 2.0 with Speech BASIC 2.7" - supported by c64 & clones */
1478 {
1479 "END", /* 0x80 */
1480 "FOR", /* 0x81 */
1481 "NEXT", /* 0x82 */
1482 "DATA", /* 0x83 */
1483 "INPUT#", /* 0x84 */
1484 "INPUT", /* 0x85 */
1485 "DIM", /* 0x86 */
1486 "READ", /* 0x87 */
1487 "LET", /* 0x88 */
1488 "GOTO", /* 0x89 */
1489 "RUN", /* 0x8a */
1490 "IF", /* 0x8b */
1491 "RESTORE", /* 0x8c */
1492 "GOSUB", /* 0x8d */
1493 "RETURN", /* 0x8e */
1494 "REM", /* 0x8f */
1495 "STOP", /* 0x90 */
1496 "ON", /* 0x91 */
1497 "WAIT", /* 0x92 */
1498 "LOAD", /* 0x93 */
1499 "SAVE", /* 0x94 */
1500 "VERIFY", /* 0x95 */
1501 "DEF", /* 0x96 */
1502 "POKE", /* 0x97 */
1503 "PRINT#", /* 0x98 */
1504 "PRINT", /* 0x99 */
1505 "CONT", /* 0x9a */
1506 "LIST", /* 0x9b */
1507 "CLR", /* 0x9c */
1508 "CMD", /* 0x9d */
1509 "SYS", /* 0x9e */
1510 "OPEN", /* 0x9f */
1511 "CLOSE", /* 0xa0 */
1512 "GET", /* 0xa1 */
1513 "NEW", /* 0xa2 */
1514 "TAB(", /* 0xa3 */
1515 "TO", /* 0xa4 */
1516 "FN", /* 0xa5 */
1517 "SPC(", /* 0xa6 */
1518 "THEN", /* 0xa7 */
1519 "NOT", /* 0xa8 */
1520 "STEP", /* 0xa9 */
1521 "+", /* 0xaa */
1522 "-", /* 0xab */
1523 "*", /* 0xac */
1524 "/", /* 0xad */
1525 "^", /* 0xae */
1526 "AND", /* 0xaf */
1527 "OR", /* 0xb0 */
1528 ">", /* 0xb1 */
1529 "=", /* 0xb2 */
1530 "<", /* 0xb3 */
1531 "SGN", /* 0xb4 */
1532 "INT", /* 0xb5 */
1533 "ABS", /* 0xb6 */
1534 "USR", /* 0xb7 */
1535 "FRE", /* 0xb8 */
1536 "POS", /* 0xb9 */
1537 "SQR", /* 0xba */
1538 "RND", /* 0xbb */
1539 "LOG", /* 0xbc */
1540 "EXP", /* 0xbd */
1541 "COS", /* 0xbe */
1542 "SIN", /* 0xbf */
1543 "TAN", /* 0xc0 */
1544 "ATN", /* 0xc1 */
1545 "PEEK", /* 0xc2 */
1546 "LEN", /* 0xc3 */
1547 "STR$", /* 0xc4 */
1548 "VAL", /* 0xc5 */
1549 "ASC", /* 0xc6 */
1550 "CHR$", /* 0xc7 */
1551 "LEFT$", /* 0xc8 */
1552 "RIGHT$", /* 0xc9 */
1553 "MID$", /* 0xca */
1554 "GO", /* 0xcb */
1555 "RESET", /* 0xcc */
1556 "BASIC", /* 0xcd */
1557 "HELP", /* 0xce */
1558 "KEY", /* 0xcf */
1559 "HIMEM", /* 0xd0 */
1560 "DISK", /* 0xd1 */
1561 "DIR", /* 0xd2 */
1562 "BLOAD", /* 0xd3 */
1563 "BSAVE", /* 0xd4 */
1564 "MAP", /* 0xd5 */
1565 "MEM", /* 0xd6 */
1566 "PAUSE", /* 0xd7 */
1567 "BLOCK", /* 0xd8 */
1568 "HEAR", /* 0xd9 */
1569 "RECORD", /* 0xda */
1570 "PLAY", /* 0xdb */
1571 "VOLDEF", /* 0xdc */
1572 "COLDEF", /* 0xdd */
1573 "HEX", /* 0xde */
1574 "DEZ", /* 0xdf */
1575 "SCREEN", /* 0xe0 */
1576 "EXEC", /* 0xe1 */
1577 "MON", /* 0xe2 */
1578 "{LEFT ARROW}", /* 0xe3 - A single character shaped as a left pointing arrow */
1579 "FROM", /* 0xe4 */
1580 "SPEED", /* 0xe5 */
1581 "OFF", /* 0xe6 */
1582 NULL, /* 0xe7 */
1583 NULL, /* 0xe8 */
1584 NULL, /* 0xe9 */
1585 NULL, /* 0xea */
1586 NULL, /* 0xeb */
1587 NULL, /* 0xec */
1588 NULL, /* 0xed */
1589 NULL, /* 0xee */
1590 NULL, /* 0xef */
1591 NULL, /* 0xf0 */
1592 NULL, /* 0xf1 */
1593 NULL, /* 0xf2 */
1594 NULL, /* 0xf3 */
1595 NULL, /* 0xf4 */
1596 NULL, /* 0xf5 */
1597 NULL, /* 0xf6 */
1598 NULL, /* 0xf7 */
1599 NULL, /* 0xf8 */
1600 NULL, /* 0xf9 */
1601 NULL, /* 0xfa */
1602 NULL, /* 0xfb */
1603 NULL, /* 0xfc */
1604 NULL, /* 0xfd */
1605 NULL, /* 0xfe */
1606 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1607 };
1608
1609 static const char *const basic_20_at_basic[] = /* "BASIC 2.0 with @BASIC" - supported by c64 & clones */
1610 {
1611 "END", /* 0x80 */
1612 "FOR", /* 0x81 */
1613 "NEXT", /* 0x82 */
1614 "DATA", /* 0x83 */
1615 "INPUT#", /* 0x84 */
1616 "INPUT", /* 0x85 */
1617 "DIM", /* 0x86 */
1618 "READ", /* 0x87 */
1619 "LET", /* 0x88 */
1620 "GOTO", /* 0x89 */
1621 "RUN", /* 0x8a */
1622 "IF", /* 0x8b */
1623 "RESTORE", /* 0x8c */
1624 "GOSUB", /* 0x8d */
1625 "RETURN", /* 0x8e */
1626 "REM", /* 0x8f */
1627 "STOP", /* 0x90 */
1628 "ON", /* 0x91 */
1629 "WAIT", /* 0x92 */
1630 "LOAD", /* 0x93 */
1631 "SAVE", /* 0x94 */
1632 "VERIFY", /* 0x95 */
1633 "DEF", /* 0x96 */
1634 "POKE", /* 0x97 */
1635 "PRINT#", /* 0x98 */
1636 "PRINT", /* 0x99 */
1637 "CONT", /* 0x9a */
1638 "LIST", /* 0x9b */
1639 "CLR", /* 0x9c */
1640 "CMD", /* 0x9d */
1641 "SYS", /* 0x9e */
1642 "OPEN", /* 0x9f */
1643 "CLOSE", /* 0xa0 */
1644 "GET", /* 0xa1 */
1645 "NEW", /* 0xa2 */
1646 "TAB(", /* 0xa3 */
1647 "TO", /* 0xa4 */
1648 "FN", /* 0xa5 */
1649 "SPC(", /* 0xa6 */
1650 "THEN", /* 0xa7 */
1651 "NOT", /* 0xa8 */
1652 "STEP", /* 0xa9 */
1653 "+", /* 0xaa */
1654 "-", /* 0xab */
1655 "*", /* 0xac */
1656 "/", /* 0xad */
1657 "^", /* 0xae */
1658 "AND", /* 0xaf */
1659 "OR", /* 0xb0 */
1660 ">", /* 0xb1 */
1661 "=", /* 0xb2 */
1662 "<", /* 0xb3 */
1663 "SGN", /* 0xb4 */
1664 "INT", /* 0xb5 */
1665 "ABS", /* 0xb6 */
1666 "USR", /* 0xb7 */
1667 "FRE", /* 0xb8 */
1668 "POS", /* 0xb9 */
1669 "SQR", /* 0xba */
1670 "RND", /* 0xbb */
1671 "LOG", /* 0xbc */
1672 "EXP", /* 0xbd */
1673 "COS", /* 0xbe */
1674 "SIN", /* 0xbf */
1675 "TAN", /* 0xc0 */
1676 "ATN", /* 0xc1 */
1677 "PEEK", /* 0xc2 */
1678 "LEN", /* 0xc3 */
1679 "STR$", /* 0xc4 */
1680 "VAL", /* 0xc5 */
1681 "ASC", /* 0xc6 */
1682 "CHR$", /* 0xc7 */
1683 "LEFT$", /* 0xc8 */
1684 "RIGHT$", /* 0xc9 */
1685 "MID$", /* 0xca */
1686 "GO", /* 0xcb */
1687 "TRACE", /* 0xcc */
1688 "DELETE", /* 0xcd */
1689 "AUTO", /* 0xce */
1690 "OLD", /* 0xcf */
1691 "DUMP", /* 0xd0 */
1692 "FIND", /* 0xd1 */
1693 "RENUMBER", /* 0xd2 */
1694 "DLOAD", /* 0xd3 */
1695 "DSAVE", /* 0xd4 */
1696 "DVERIFY", /* 0xd5 */
1697 "DIRECTORY" /* 0xd6 */
1698 "CATALOG", /* 0xd7 */
1699 "SCRATCH", /* 0xd8 */
1700 "COLLECT", /* 0xd9 */
1701 "RENAME", /* 0xda */
1702 "COPY", /* 0xdb */
1703 "BACKUP", /* 0xdc */
1704 "DISK", /* 0xdd */
1705 "HEADER", /* 0xde */
1706 "APPEND", /* 0xdf */
1707 "MERGE", /* 0xe0 */
1708 "MLOAD", /* 0xe1 */
1709 "MVERIFY", /* 0xe2 */
1710 "MSAVE", /* 0xe3 */
1711 "KEY", /* 0xe4 */
1712 "BASIC", /* 0xe5 */
1713 "RESET", /* 0xe6 */
1714 "EXIT", /* 0xe7 */
1715 "ENTER", /* 0xe8 */
1716 "DOKE", /* 0xe9 */
1717 "SET", /* 0xea */
1718 "HELP", /* 0xeb */
1719 "SCREEN", /* 0xec */
1720 "LOMEM", /* 0xed */
1721 "HIMEM", /* 0xee */
1722 "COLOUR", /* 0xef */
1723 "TYPE", /* 0xf0 */
1724 "TIME", /* 0xf1 */
1725 "DEEK", /* 0xf2 */
1726 "HEX$", /* 0xf3 */
1727 "BIN$", /* 0xf4 */
1728 "OFF", /* 0xf5 */
1729 "ALARM", /* 0xf6 */
1730 NULL, /* 0xf7 */
1731 NULL, /* 0xf8 */
1732 NULL, /* 0xf9 */
1733 NULL, /* 0xfa */
1734 NULL, /* 0xfb */
1735 NULL, /* 0xfc */
1736 NULL, /* 0xfd */
1737 NULL, /* 0xfe */
1738 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
1739 };
1740
1741 static const char *const basic_20_simon_s_basic[] = /* "BASIC 2.0 with Simon's BASIC" - supported by c64 & clones */
1742 {
1743 "END", /* 0x80 */
1744 "FOR", /* 0x81 */
1745 "NEXT", /* 0x82 */
1746 "DATA", /* 0x83 */
1747 "INPUT#", /* 0x84 */
1748 "INPUT", /* 0x85 */
1749 "DIM", /* 0x86 */
1750 "READ", /* 0x87 */
1751 "LET", /* 0x88 */
1752 "GOTO", /* 0x89 */
1753 "RUN", /* 0x8a */
1754 "IF", /* 0x8b */
1755 "RESTORE", /* 0x8c */
1756 "GOSUB", /* 0x8d */
1757 "RETURN", /* 0x8e */
1758 "REM", /* 0x8f */
1759 "STOP", /* 0x90 */
1760 "ON", /* 0x91 */
1761 "WAIT", /* 0x92 */
1762 "LOAD", /* 0x93 */
1763 "SAVE", /* 0x94 */
1764 "VERIFY", /* 0x95 */
1765 "DEF", /* 0x96 */
1766 "POKE", /* 0x97 */
1767 "PRINT#", /* 0x98 */
1768 "PRINT", /* 0x99 */
1769 "CONT", /* 0x9a */
1770 "LIST", /* 0x9b */
1771 "CLR", /* 0x9c */
1772 "CMD", /* 0x9d */
1773 "SYS", /* 0x9e */
1774 "OPEN", /* 0x9f */
1775 "CLOSE", /* 0xa0 */
1776 "GET", /* 0xa1 */
1777 "NEW", /* 0xa2 */
1778 "TAB(", /* 0xa3 */
1779 "TO", /* 0xa4 */
1780 "FN", /* 0xa5 */
1781 "SPC(", /* 0xa6 */
1782 "THEN", /* 0xa7 */
1783 "NOT", /* 0xa8 */
1784 "STEP", /* 0xa9 */
1785 "+", /* 0xaa */
1786 "-", /* 0xab */
1787 "*", /* 0xac */
1788 "/", /* 0xad */
1789 "^", /* 0xae */
1790 "AND", /* 0xaf */
1791 "OR", /* 0xb0 */
1792 ">", /* 0xb1 */
1793 "=", /* 0xb2 */
1794 "<", /* 0xb3 */
1795 "SGN", /* 0xb4 */
1796 "INT", /* 0xb5 */
1797 "ABS", /* 0xb6 */
1798 "USR", /* 0xb7 */
1799 "FRE", /* 0xb8 */
1800 "POS", /* 0xb9 */
1801 "SQR", /* 0xba */
1802 "RND", /* 0xbb */
1803 "LOG", /* 0xbc */
1804 "EXP", /* 0xbd */
1805 "COS", /* 0xbe */
1806 "SIN", /* 0xbf */
1807 "TAN", /* 0xc0 */
1808 "ATN", /* 0xc1 */
1809 "PEEK", /* 0xc2 */
1810 "LEN", /* 0xc3 */
1811 "STR$", /* 0xc4 */
1812 "VAL", /* 0xc5 */
1813 "ASC", /* 0xc6 */
1814 "CHR$", /* 0xc7 */
1815 "LEFT$", /* 0xc8 */
1816 "RIGHT$", /* 0xc9 */
1817 "MID$", /* 0xca */
1818 "GO", /* 0xcb */
1819 NULL, /* 0xcc */
1820 NULL, /* 0xcd */
1821 NULL, /* 0xce */
1822 NULL, /* 0xcf */
1823 NULL, /* 0xd0 */
1824 NULL, /* 0xd1 */
1825 NULL, /* 0xd2 */
1826 NULL, /* 0xd3 */
1827 NULL, /* 0xd4 */
1828 NULL, /* 0xd5 */
1829 NULL, /* 0xd6 */
1830 NULL, /* 0xd7 */
1831 NULL, /* 0xd8 */
1832 NULL, /* 0xd9 */
1833 NULL, /* 0xda */
1834 NULL, /* 0xdb */
1835 NULL, /* 0xdc */
1836 NULL, /* 0xdd */
1837 NULL, /* 0xde */
1838 NULL, /* 0xdf */
1839 NULL, /* 0xe0 */
1840 NULL, /* 0xe1 */
1841 NULL, /* 0xe2 */
1842 NULL, /* 0xe3 */
1843 NULL, /* 0xe4 */
1844 NULL, /* 0xe5 */
1845 NULL, /* 0xe6 */
1846 NULL, /* 0xe7 */
1847 NULL, /* 0xe8 */
1848 NULL, /* 0xe9 */
1849 NULL, /* 0xea */
1850 NULL, /* 0xeb */
1851 NULL, /* 0xec */
1852 NULL, /* 0xed */
1853 NULL, /* 0xee */
1854 NULL, /* 0xef */
1855 NULL, /* 0xf0 */
1856 NULL, /* 0xf1 */
1857 NULL, /* 0xf2 */
1858 NULL, /* 0xf3 */
1859 NULL, /* 0xf4 */
1860 NULL, /* 0xf5 */
1861 NULL, /* 0xf6 */
1862 NULL, /* 0xf7 */
1863 NULL, /* 0xf8 */
1864 NULL, /* 0xf9 */
1865 NULL, /* 0xfa */
1866 NULL, /* 0xfb */
1867 NULL, /* 0xfc */
1868 NULL, /* 0xfd */
1869 NULL, /* 0xfe */
1870 "{PI}", /* 0xff - A single character shaped as greek lowercase 'PI' */
1871 NULL, /* 0x6400 */
1872 "HIRES", /* 0x6401 */
1873 "PLOT", /* 0x6402 */
1874 "LINE", /* 0x6403 */
1875 "BLOCK", /* 0x6404 */
1876 "FCHR", /* 0x6405 */
1877 "FCOL", /* 0x6406 */
1878 "FILL", /* 0x6407 */
1879 "REC", /* 0x6408 */
1880 "ROT", /* 0x6409 */
1881 "DRAW", /* 0x640a */
1882 "CHAR", /* 0x640b */
1883 "HI COL", /* 0x640c */
1884 "INV", /* 0x640d */
1885 "FRAC", /* 0x640e */
1886 "MOVE", /* 0x640f */
1887 "PLACE", /* 0x6410 */
1888 "UPB", /* 0x6411 */
1889 "UPW", /* 0x6412 */
1890 "LEFTW", /* 0x6413 */
1891 "LEFTB", /* 0x6414 */
1892 "DOWNB", /* 0x6415 */
1893 "DOWNW", /* 0x6416 */
1894 "RIGHTB", /* 0x6417 */
1895 "RIGHTW", /* 0x6418 */
1896 "MULTI", /* 0x6419 */
1897 "COLOUR", /* 0x641a */
1898 "MMOB", /* 0x641b */
1899 "BFLASH", /* 0x641c */
1900 "MOB SET", /* 0x641d */
1901 "MUSIC", /* 0x641e */
1902 "FLASH", /* 0x641f */
1903 "REPEAT", /* 0x6420 */
1904 "PLAY", /* 0x6421 */
1905 ">>", /* 0x6422 */
1906 "CENTRE", /* 0x6423 */
1907 "ENVELOPE", /* 0x6424 */
1908 "CGOTO", /* 0x6425 */
1909 "WAVE", /* 0x6426 */
1910 "FETCH", /* 0x6427 */
1911 "AT(", /* 0x6428 */
1912 "UNTIL", /* 0x6429 */
1913 ">>", /* 0x642a */
1914 ">>", /* 0x642b */
1915 "USE", /* 0x642c */
1916 ">>", /* 0x642d */
1917 "GLOBAL", /* 0x642e */
1918 ">>", /* 0x642f */
1919 "RESET", /* 0x6430 */
1920 "PROC", /* 0x6431 */
1921 "CALL", /* 0x6432 */
1922 "EXEC", /* 0x6433 */
1923 "END PROC", /* 0x6434 */
1924 "EXIT", /* 0x6435 */
1925 "END LOOP", /* 0x6436 */
1926 "ON KEY", /* 0x6437 */
1927 "DISABLE", /* 0x6438 */
1928 "RESUME", /* 0x6439 */
1929 "LOOP", /* 0x643a */
1930 "DELAY", /* 0x643b */
1931 ">>", /* 0x643c */
1932 ">>", /* 0x643d */
1933 ">>", /* 0x643e */
1934 ">>", /* 0x643f */
1935 "SECURE", /* 0x6440 */
1936 "DISAPA", /* 0x6441 */
1937 "CIRCLE", /* 0x6442 */
1938 "ON ERROR", /* 0x6443 */
1939 "NO ERROR", /* 0x6444 */
1940 "LOCAL", /* 0x6445 */
1941 "RCOMP", /* 0x6446 */
1942 "ELSE", /* 0x6447 */
1943 "RETRACE", /* 0x6448 */
1944 "TRACE", /* 0x6449 */
1945 "DIR", /* 0x644a */
1946 "PAGE", /* 0x644b */
1947 "DUMP", /* 0x644c */
1948 "FIND", /* 0x644d */
1949 "OPTION", /* 0x644e */
1950 "AUTO", /* 0x644f */
1951 "OLD", /* 0x6450 */
1952 "JOY", /* 0x6451 */
1953 "MOD", /* 0x6452 */
1954 "DIV", /* 0x6453 */
1955 ">>", /* 0x6454 */
1956 "DUP", /* 0x6455 */
1957 "INKEY", /* 0x6456 */
1958 "INST", /* 0x6457 */
1959 "TEST", /* 0x6458 */
1960 "LIN", /* 0x6459 */
1961 "EXOR", /* 0x645a */
1962 "INSERT", /* 0x645b */
1963 "POT", /* 0x645c */
1964 "PENX", /* 0x645d */
1965 ">>", /* 0x645e */
1966 "PENY", /* 0x645f */
1967 "SOUND", /* 0x6460 */
1968 "GRAPHICS", /* 0x6461 */
1969 "DESIGN", /* 0x6462 */
1970 "RLOCMOB", /* 0x6463 */
1971 "CMOB", /* 0x6464 */
1972 "BCKGNDS", /* 0x6465 */
1973 "PAUSE", /* 0x6466 */
1974 "NRM", /* 0x6467 */
1975 "MOB OFF", /* 0x6468 */
1976 "OFF", /* 0x6469 */
1977 "ANGL", /* 0x646a */
1978 "ARC", /* 0x646b */
1979 "COLD", /* 0x646c */
1980 "SCRSV", /* 0x646d */
1981 "SCRLD", /* 0x646e */
1982 "TEXT", /* 0x646f */
1983 "CSET", /* 0x6470 */
1984 "VOL", /* 0x6471 */
1985 "DISK", /* 0x6472 */
1986 "HRDCPY", /* 0x6473 */
1987 "KEY", /* 0x6474 */
1988 "PAINT", /* 0x6475 */
1989 "LOW COL", /* 0x6476 */
1990 "COPY", /* 0x6477 */
1991 "MERGE", /* 0x6478 */
1992 "RENUMBER", /* 0x6479 */
1993 "MEM", /* 0x647a */
1994 "DETECT", /* 0x647b */
1995 "CHECK", /* 0x647c */
1996 "DISPLAY", /* 0x647d */
1997 "ERR", /* 0x647e */
1998 "OUT" /* 0x647f */
1999 };
2000
2001 static const char *const basic_20_exp_40[] = /* "BASIC 2.0 with BASIC 4.0 Expansion" - supported by c64 & clones */
2002 {
2003 "END", /* 0x80 */
2004 "FOR", /* 0x81 */
2005 "NEXT", /* 0x82 */
2006 "DATA", /* 0x83 */
2007 "INPUT#", /* 0x84 */
2008 "INPUT", /* 0x85 */
2009 "DIM", /* 0x86 */
2010 "READ", /* 0x87 */
2011 "LET", /* 0x88 */
2012 "GOTO", /* 0x89 */
2013 "RUN", /* 0x8a */
2014 "IF", /* 0x8b */
2015 "RESTORE", /* 0x8c */
2016 "GOSUB", /* 0x8d */
2017 "RETURN", /* 0x8e */
2018 "REM", /* 0x8f */
2019 "STOP", /* 0x90 */
2020 "ON", /* 0x91 */
2021 "WAIT", /* 0x92 */
2022 "LOAD", /* 0x93 */
2023 "SAVE", /* 0x94 */
2024 "VERIFY", /* 0x95 */
2025 "DEF", /* 0x96 */
2026 "POKE", /* 0x97 */
2027 "PRINT#", /* 0x98 */
2028 "PRINT", /* 0x99 */
2029 "CONT", /* 0x9a */
2030 "LIST", /* 0x9b */
2031 "CLR", /* 0x9c */
2032 "CMD", /* 0x9d */
2033 "SYS", /* 0x9e */
2034 "OPEN", /* 0x9f */
2035 "CLOSE", /* 0xa0 */
2036 "GET", /* 0xa1 */
2037 "NEW", /* 0xa2 */
2038 "TAB(", /* 0xa3 */
2039 "TO", /* 0xa4 */
2040 "FN", /* 0xa5 */
2041 "SPC(", /* 0xa6 */
2042 "THEN", /* 0xa7 */
2043 "NOT", /* 0xa8 */
2044 "STEP", /* 0xa9 */
2045 "+", /* 0xaa */
2046 "-", /* 0xab */
2047 "*", /* 0xac */
2048 "/", /* 0xad */
2049 "^", /* 0xae */
2050 "AND", /* 0xaf */
2051 "OR", /* 0xb0 */
2052 ">", /* 0xb1 */
2053 "=", /* 0xb2 */
2054 "<", /* 0xb3 */
2055 "SGN", /* 0xb4 */
2056 "INT", /* 0xb5 */
2057 "ABS", /* 0xb6 */
2058 "USR", /* 0xb7 */
2059 "FRE", /* 0xb8 */
2060 "POS", /* 0xb9 */
2061 "SQR", /* 0xba */
2062 "RND", /* 0xbb */
2063 "LOG", /* 0xbc */
2064 "EXP", /* 0xbd */
2065 "COS", /* 0xbe */
2066 "SIN", /* 0xbf */
2067 "TAN", /* 0xc0 */
2068 "ATN", /* 0xc1 */
2069 "PEEK", /* 0xc2 */
2070 "LEN", /* 0xc3 */
2071 "STR$", /* 0xc4 */
2072 "VAL", /* 0xc5 */
2073 "ASC", /* 0xc6 */
2074 "CHR$", /* 0xc7 */
2075 "LEFT$", /* 0xc8 */
2076 "RIGHT$", /* 0xc9 */
2077 "MID$", /* 0xca */
2078 "GO", /* 0xcb */
2079 "CONCAT", /* 0xcc */
2080 "DOPEN", /* 0xcd */
2081 "DCLOSE", /* 0xce */
2082 "RECORD", /* 0xcf */
2083 "HEADER", /* 0xd0 */
2084 "COLLECT", /* 0xd1 */
2085 "BACKUP", /* 0xd2 */
2086 "COPY", /* 0xd3 */
2087 "APPEND", /* 0xd4 */
2088 "DSAVE", /* 0xd5 */
2089 "DLOAD", /* 0xd6 */
2090 "CATALOG", /* 0xd7 */
2091 "RENAME", /* 0xd8 */
2092 "SCRATCH", /* 0xd9 */
2093 "DIRECTORY", /* 0xda */
2094 "COLOR", /* 0xdb */
2095 "COLD", /* 0xdc */
2096 "KEY", /* 0xdd */
2097 "DVERIFY", /* 0xde */
2098 "DELETE" /* 0xdf */
2099 "AUTO", /* 0xe0 */
2100 "MERGE", /* 0xe1 */
2101 "OLD", /* 0xe2 */
2102 "MONITOR", /* 0xe3 */
2103 NULL, /* 0xe4 */
2104 NULL, /* 0xe5 */
2105 NULL, /* 0xe6 */
2106 NULL, /* 0xe7 */
2107 NULL, /* 0xe8 */
2108 NULL, /* 0xe9 */
2109 NULL, /* 0xea */
2110 NULL, /* 0xeb */
2111 NULL, /* 0xec */
2112 NULL, /* 0xed */
2113 NULL, /* 0xee */
2114 NULL, /* 0xef */
2115 NULL, /* 0xf0 */
2116 NULL, /* 0xf1 */
2117 NULL, /* 0xf2 */
2118 NULL, /* 0xf3 */
2119 NULL, /* 0xf4 */
2120 NULL, /* 0xf5 */
2121 NULL, /* 0xf6 */
2122 NULL, /* 0xf7 */
2123 NULL, /* 0xf8 */
2124 NULL, /* 0xf9 */
2125 NULL, /* 0xfa */
2126 NULL, /* 0xfb */
2127 NULL, /* 0xfc */
2128 NULL, /* 0xfd */
2129 NULL, /* 0xfe */
2130 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
2131 };
2132
2133 static const char *const basic_35[] = /* "BASIC 3.5" - supported by c16 & clones, except c364 */
2134 {
2135 "END", /* 0x80 */
2136 "FOR", /* 0x81 */
2137 "NEXT", /* 0x82 */
2138 "DATA", /* 0x83 */
2139 "INPUT#", /* 0x84 */
2140 "INPUT", /* 0x85 */
2141 "DIM", /* 0x86 */
2142 "READ", /* 0x87 */
2143 "LET", /* 0x88 */
2144 "GOTO", /* 0x89 */
2145 "RUN", /* 0x8a */
2146 "IF", /* 0x8b */
2147 "RESTORE", /* 0x8c */
2148 "GOSUB", /* 0x8d */
2149 "RETURN", /* 0x8e */
2150 "REM", /* 0x8f */
2151 "STOP", /* 0x90 */
2152 "ON", /* 0x91 */
2153 "WAIT", /* 0x92 */
2154 "LOAD", /* 0x93 */
2155 "SAVE", /* 0x94 */
2156 "VERIFY", /* 0x95 */
2157 "DEF", /* 0x96 */
2158 "POKE", /* 0x97 */
2159 "PRINT#", /* 0x98 */
2160 "PRINT", /* 0x99 */
2161 "CONT", /* 0x9a */
2162 "LIST", /* 0x9b */
2163 "CLR", /* 0x9c */
2164 "CMD", /* 0x9d */
2165 "SYS", /* 0x9e */
2166 "OPEN", /* 0x9f */
2167 "CLOSE", /* 0xa0 */
2168 "GET", /* 0xa1 */
2169 "NEW", /* 0xa2 */
2170 "TAB(", /* 0xa3 */
2171 "TO", /* 0xa4 */
2172 "FN", /* 0xa5 */
2173 "SPC(", /* 0xa6 */
2174 "THEN", /* 0xa7 */
2175 "NOT", /* 0xa8 */
2176 "STEP", /* 0xa9 */
2177 "+", /* 0xaa */
2178 "-", /* 0xab */
2179 "*", /* 0xac */
2180 "/", /* 0xad */
2181 "^", /* 0xae */
2182 "AND", /* 0xaf */
2183 "OR", /* 0xb0 */
2184 ">", /* 0xb1 */
2185 "=", /* 0xb2 */
2186 "<", /* 0xb3 */
2187 "SGN", /* 0xb4 */
2188 "INT", /* 0xb5 */
2189 "ABS", /* 0xb6 */
2190 "USR", /* 0xb7 */
2191 "FRE", /* 0xb8 */
2192 "POS", /* 0xb9 */
2193 "SQR", /* 0xba */
2194 "RND", /* 0xbb */
2195 "LOG", /* 0xbc */
2196 "EXP", /* 0xbd */
2197 "COS", /* 0xbe */
2198 "SIN", /* 0xbf */
2199 "TAN", /* 0xc0 */
2200 "ATN", /* 0xc1 */
2201 "PEEK", /* 0xc2 */
2202 "LEN", /* 0xc3 */
2203 "STR$", /* 0xc4 */
2204 "VAL", /* 0xc5 */
2205 "ASC", /* 0xc6 */
2206 "CHR$", /* 0xc7 */
2207 "LEFT$", /* 0xc8 */
2208 "RIGHT$", /* 0xc9 */
2209 "MID$", /* 0xca */
2210 "GO", /* 0xcb */
2211 "RGR", /* 0xcc */
2212 "RCLR" /* 0xcd */
2213 "RLUM" /* 0xce */
2214 "JOY", /* 0xcf */
2215 "RDOT" /* 0xd0 */
2216 "DEC", /* 0xd1 */
2217 "HEX$", /* 0xd2 */
2218 "ERR$", /* 0xd3 */
2219 "INSTR", /* 0xd4 */
2220 "ELSE", /* 0xd5 */
2221 "RESUME", /* 0xd6 */
2222 "TRAP", /* 0xd7 */
2223 "TRON", /* 0xd8 */
2224 "TROFF", /* 0xd9 */
2225 "SOUND", /* 0xda */
2226 "VOL", /* 0xdb */
2227 "AUTO", /* 0xdc */
2228 "PUDEF", /* 0xdd */
2229 "GRAPHIC", /* 0xde */
2230 "PAINT", /* 0xdf */
2231 "CHAR", /* 0xe0 */
2232 "BOX", /* 0xe1 */
2233 "CIRCLE", /* 0xe2 */
2234 "GSHAPE", /* 0xe3 */
2235 "SSHAPE", /* 0xe4 */
2236 "DRAW", /* 0xe5 */
2237 "LOCATE", /* 0xe6 */
2238 "COLOR", /* 0xe7 */
2239 "SCNCLR", /* 0xe8 */
2240 "SCALE", /* 0xe9 */
2241 "HELP", /* 0xea */
2242 "DO", /* 0xeb */
2243 "LOOP", /* 0xec */
2244 "EXIT", /* 0xed */
2245 "DIRECTORY", /* 0xee */
2246 "DSAVE", /* 0xef */
2247 "DLOAD", /* 0xf0 */
2248 "HEADER", /* 0xf1 */
2249 "SCRATCH", /* 0xf2 */
2250 "COLLECT", /* 0xf3 */
2251 "COPY", /* 0xf4 */
2252 "RENAME", /* 0xf5 */
2253 "BACKUP", /* 0xf6 */
2254 "DELETE", /* 0xf7 */
2255 "RENUMBER", /* 0xf8 */
2256 "KEY", /* 0xf9 */
2257 "MONITOR", /* 0xfa */
2258 "USING", /* 0xfb */
2259 "UNTIL", /* 0xfc */
2260 "WHILE", /* 0xfd */
2261 NULL, /* 0xfe */
2262 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
2263 };
2264
2265 static const char *const basic_35_magic_voice[] = /* "BASIC 3.5 with Magic Voice Speech Synthesizer" - supported by c364 */
2266 {
2267 "END", /* 0x80 */
2268 "FOR", /* 0x81 */
2269 "NEXT", /* 0x82 */
2270 "DATA", /* 0x83 */
2271 "INPUT#", /* 0x84 */
2272 "INPUT", /* 0x85 */
2273 "DIM", /* 0x86 */
2274 "READ", /* 0x87 */
2275 "LET", /* 0x88 */
2276 "GOTO", /* 0x89 */
2277 "RUN", /* 0x8a */
2278 "IF", /* 0x8b */
2279 "RESTORE", /* 0x8c */
2280 "GOSUB", /* 0x8d */
2281 "RETURN", /* 0x8e */
2282 "REM", /* 0x8f */
2283 "STOP", /* 0x90 */
2284 "ON", /* 0x91 */
2285 "WAIT", /* 0x92 */
2286 "LOAD", /* 0x93 */
2287 "SAVE", /* 0x94 */
2288 "VERIFY", /* 0x95 */
2289 "DEF", /* 0x96 */
2290 "POKE", /* 0x97 */
2291 "PRINT#", /* 0x98 */
2292 "PRINT", /* 0x99 */
2293 "CONT", /* 0x9a */
2294 "LIST", /* 0x9b */
2295 "CLR", /* 0x9c */
2296 "CMD", /* 0x9d */
2297 "SYS", /* 0x9e */
2298 "OPEN", /* 0x9f */
2299 "CLOSE", /* 0xa0 */
2300 "GET", /* 0xa1 */
2301 "NEW", /* 0xa2 */
2302 "TAB(", /* 0xa3 */
2303 "TO", /* 0xa4 */
2304 "FN", /* 0xa5 */
2305 "SPC(", /* 0xa6 */
2306 "THEN", /* 0xa7 */
2307 "NOT", /* 0xa8 */
2308 "STEP", /* 0xa9 */
2309 "+", /* 0xaa */
2310 "-", /* 0xab */
2311 "*", /* 0xac */
2312 "/", /* 0xad */
2313 "^", /* 0xae */
2314 "AND", /* 0xaf */
2315 "OR", /* 0xb0 */
2316 ">", /* 0xb1 */
2317 "=", /* 0xb2 */
2318 "<", /* 0xb3 */
2319 "SGN", /* 0xb4 */
2320 "INT", /* 0xb5 */
2321 "ABS", /* 0xb6 */
2322 "USR", /* 0xb7 */
2323 "FRE", /* 0xb8 */
2324 "POS", /* 0xb9 */
2325 "SQR", /* 0xba */
2326 "RND", /* 0xbb */
2327 "LOG", /* 0xbc */
2328 "EXP", /* 0xbd */
2329 "COS", /* 0xbe */
2330 "SIN", /* 0xbf */
2331 "TAN", /* 0xc0 */
2332 "ATN", /* 0xc1 */
2333 "PEEK", /* 0xc2 */
2334 "LEN", /* 0xc3 */
2335 "STR$", /* 0xc4 */
2336 "VAL", /* 0xc5 */
2337 "ASC", /* 0xc6 */
2338 "CHR$", /* 0xc7 */
2339 "LEFT$", /* 0xc8 */
2340 "RIGHT$", /* 0xc9 */
2341 "MID$", /* 0xca */
2342 "GO", /* 0xcb */
2343 "RGR", /* 0xcc */
2344 "RCLR" /* 0xcd */
2345 "RLUM" /* 0xce */
2346 "JOY", /* 0xcf */
2347 "RDOT" /* 0xd0 */
2348 "DEC", /* 0xd1 */
2349 "HEX$", /* 0xd2 */
2350 "ERR$", /* 0xd3 */
2351 "INSTR", /* 0xd4 */
2352 "ELSE", /* 0xd5 */
2353 "RESUME", /* 0xd6 */
2354 "TRAP", /* 0xd7 */
2355 "TRON", /* 0xd8 */
2356 "TROFF", /* 0xd9 */
2357 "SOUND", /* 0xda */
2358 "VOL", /* 0xdb */
2359 "AUTO", /* 0xdc */
2360 "PUDEF", /* 0xdd */
2361 "GRAPHIC", /* 0xde */
2362 "PAINT", /* 0xdf */
2363 "CHAR", /* 0xe0 */
2364 "BOX", /* 0xe1 */
2365 "CIRCLE", /* 0xe2 */
2366 "GSHAPE", /* 0xe3 */
2367 "SSHAPE", /* 0xe4 */
2368 "DRAW", /* 0xe5 */
2369 "LOCATE", /* 0xe6 */
2370 "COLOR", /* 0xe7 */
2371 "SCNCLR", /* 0xe8 */
2372 "SCALE", /* 0xe9 */
2373 "HELP", /* 0xea */
2374 "DO", /* 0xeb */
2375 "LOOP", /* 0xec */
2376 "EXIT", /* 0xed */
2377 "DIRECTORY", /* 0xee */
2378 "DSAVE", /* 0xef */
2379 "DLOAD", /* 0xf0 */
2380 "HEADER", /* 0xf1 */
2381 "SCRATCH", /* 0xf2 */
2382 "COLLECT", /* 0xf3 */
2383 "COPY", /* 0xf4 */
2384 "RENAME", /* 0xf5 */
2385 "BACKUP", /* 0xf6 */
2386 "DELETE", /* 0xf7 */
2387 "RENUMBER", /* 0xf8 */
2388 "KEY", /* 0xf9 */
2389 "MONITOR", /* 0xfa */
2390 "USING", /* 0xfb */
2391 "UNTIL", /* 0xfc */
2392 "WHILE", /* 0xfd */
2393 NULL, /* 0xfe - Prefix for additional tokens */
2394 "{PI}", /* 0xff - A single character shaped as greek lowercase 'PI' */
2395 NULL, /* 0xfe00 */
2396 "RATE", /* 0xfe01 */
2397 "VOC", /* 0xfe02 */
2398 NULL, /* 0xfe03 */
2399 "RDY", /* 0xfe04 */
2400 NULL, /* 0xfe05 */
2401 NULL, /* 0xfe06 */
2402 NULL, /* 0xfe07 */
2403 NULL, /* 0xfe08 */
2404 NULL, /* 0xfe09 */
2405 "SAY" /* 0xfe0a */
2406 };
2407
2408 static const char *const basic_40[] = /* "BASIC 4.0" - supported by cbm40xx & cbm80xx series, p500, cbm600 & clones */
2409 {
2410 "END", /* 0x80 */
2411 "FOR", /* 0x81 */
2412 "NEXT", /* 0x82 */
2413 "DATA", /* 0x83 */
2414 "INPUT#", /* 0x84 */
2415 "INPUT", /* 0x85 */
2416 "DIM", /* 0x86 */
2417 "READ", /* 0x87 */
2418 "LET", /* 0x88 */
2419 "GOTO", /* 0x89 */
2420 "RUN", /* 0x8a */
2421 "IF", /* 0x8b */
2422 "RESTORE", /* 0x8c */
2423 "GOSUB", /* 0x8d */
2424 "RETURN", /* 0x8e */
2425 "REM", /* 0x8f */
2426 "STOP", /* 0x90 */
2427 "ON", /* 0x91 */
2428 "WAIT", /* 0x92 */
2429 "LOAD", /* 0x93 */
2430 "SAVE", /* 0x94 */
2431 "VERIFY", /* 0x95 */
2432 "DEF", /* 0x96 */
2433 "POKE", /* 0x97 */
2434 "PRINT#", /* 0x98 */
2435 "PRINT", /* 0x99 */
2436 "CONT", /* 0x9a */
2437 "LIST", /* 0x9b */
2438 "CLR", /* 0x9c */
2439 "CMD", /* 0x9d */
2440 "SYS", /* 0x9e */
2441 "OPEN", /* 0x9f */
2442 "CLOSE", /* 0xa0 */
2443 "GET", /* 0xa1 */
2444 "NEW", /* 0xa2 */
2445 "TAB(", /* 0xa3 */
2446 "TO", /* 0xa4 */
2447 "FN", /* 0xa5 */
2448 "SPC(", /* 0xa6 */
2449 "THEN", /* 0xa7 */
2450 "NOT", /* 0xa8 */
2451 "STEP", /* 0xa9 */
2452 "+", /* 0xaa */
2453 "-", /* 0xab */
2454 "*", /* 0xac */
2455 "/", /* 0xad */
2456 "^", /* 0xae */
2457 "AND", /* 0xaf */
2458 "OR", /* 0xb0 */
2459 ">", /* 0xb1 */
2460 "=", /* 0xb2 */
2461 "<", /* 0xb3 */
2462 "SGN", /* 0xb4 */
2463 "INT", /* 0xb5 */
2464 "ABS", /* 0xb6 */
2465 "USR", /* 0xb7 */
2466 "FRE", /* 0xb8 */
2467 "POS", /* 0xb9 */
2468 "SQR", /* 0xba */
2469 "RND", /* 0xbb */
2470 "LOG", /* 0xbc */
2471 "EXP", /* 0xbd */
2472 "COS", /* 0xbe */
2473 "SIN", /* 0xbf */
2474 "TAN", /* 0xc0 */
2475 "ATN", /* 0xc1 */
2476 "PEEK", /* 0xc2 */
2477 "LEN", /* 0xc3 */
2478 "STR$", /* 0xc4 */
2479 "VAL", /* 0xc5 */
2480 "ASC", /* 0xc6 */
2481 "CHR$", /* 0xc7 */
2482 "LEFT$", /* 0xc8 */
2483 "RIGHT$", /* 0xc9 */
2484 "MID$", /* 0xca */
2485 "GO", /* 0xcb */
2486 "CONCAT", /* 0xcc */
2487 "DOPEN", /* 0xcd */
2488 "DCLOSE", /* 0xce */
2489 "RECORD", /* 0xcf */
2490 "HEADER", /* 0xd0 */
2491 "COLLECT", /* 0xd1 */
2492 "BACKUP", /* 0xd2 */
2493 "COPY", /* 0xd3 */
2494 "APPEND", /* 0xd4 */
2495 "DSAVE", /* 0xd5 */
2496 "DLOAD", /* 0xd6 */
2497 "CATALOG", /* 0xd7 */
2498 "RENAME", /* 0xd8 */
2499 "SCRATCH", /* 0xd9 */
2500 "DIRECTORY", /* 0xda */
2501 NULL, /* 0xdb */
2502 NULL, /* 0xdc */
2503 NULL, /* 0xdd */
2504 NULL, /* 0xde */
2505 NULL, /* 0xdf */
2506 NULL, /* 0xe0 */
2507 NULL, /* 0xe1 */
2508 NULL, /* 0xe2 */
2509 NULL, /* 0xe3 */
2510 NULL, /* 0xe4 */
2511 NULL, /* 0xe5 */
2512 NULL, /* 0xe6 */
2513 NULL, /* 0xe7 */
2514 NULL, /* 0xe8 */
2515 NULL, /* 0xe9 */
2516 NULL, /* 0xea */
2517 NULL, /* 0xeb */
2518 NULL, /* 0xec */
2519 NULL, /* 0xed */
2520 NULL, /* 0xee */
2521 NULL, /* 0xef */
2522 NULL, /* 0xf0 */
2523 NULL, /* 0xf1 */
2524 NULL, /* 0xf2 */
2525 NULL, /* 0xf3 */
2526 NULL, /* 0xf4 */
2527 NULL, /* 0xf5 */
2528 NULL, /* 0xf6 */
2529 NULL, /* 0xf7 */
2530 NULL, /* 0xf8 */
2531 NULL, /* 0xf9 */
2532 NULL, /* 0xfa */
2533 NULL, /* 0xfb */
2534 NULL, /* 0xfc */
2535 NULL, /* 0xfd */
2536 NULL, /* 0xfe */
2537 "{PI}" /* 0xff - A single character shaped as greek lowercase 'PI' */
2538 };
2539
2540 static const char *const basic_70[] = /* "BASIC 7.0" - supported by c128 & clones */
2541 {
2542 "END", /* 0x80 */
2543 "FOR", /* 0x81 */
2544 "NEXT", /* 0x82 */
2545 "DATA", /* 0x83 */
2546 "INPUT#", /* 0x84 */
2547 "INPUT", /* 0x85 */
2548 "DIM", /* 0x86 */
2549 "READ", /* 0x87 */
2550 "LET", /* 0x88 */
2551 "GOTO", /* 0x89 */
2552 "RUN", /* 0x8a */
2553 "IF", /* 0x8b */
2554 "RESTORE", /* 0x8c */
2555 "GOSUB", /* 0x8d */
2556 "RETURN", /* 0x8e */
2557 "REM", /* 0x8f */
2558 "STOP", /* 0x90 */
2559 "ON", /* 0x91 */
2560 "WAIT", /* 0x92 */
2561 "LOAD", /* 0x93 */
2562 "SAVE", /* 0x94 */
2563 "VERIFY", /* 0x95 */
2564 "DEF", /* 0x96 */
2565 "POKE", /* 0x97 */
2566 "PRINT#", /* 0x98 */
2567 "PRINT", /* 0x99 */
2568 "CONT", /* 0x9a */
2569 "LIST", /* 0x9b */
2570 "CLR", /* 0x9c */
2571 "CMD", /* 0x9d */
2572 "SYS", /* 0x9e */
2573 "OPEN", /* 0x9f */
2574 "CLOSE", /* 0xa0 */
2575 "GET", /* 0xa1 */
2576 "NEW", /* 0xa2 */
2577 "TAB(", /* 0xa3 */
2578 "TO", /* 0xa4 */
2579 "FN", /* 0xa5 */
2580 "SPC(", /* 0xa6 */
2581 "THEN", /* 0xa7 */
2582 "NOT", /* 0xa8 */
2583 "STEP", /* 0xa9 */
2584 "+", /* 0xaa */
2585 "-", /* 0xab */
2586 "*", /* 0xac */
2587 "/", /* 0xad */
2588 "^", /* 0xae */
2589 "AND", /* 0xaf */
2590 "OR", /* 0xb0 */
2591 ">", /* 0xb1 */
2592 "=", /* 0xb2 */
2593 "<", /* 0xb3 */
2594 "SGN", /* 0xb4 */
2595 "INT", /* 0xb5 */
2596 "ABS", /* 0xb6 */
2597 "USR", /* 0xb7 */
2598 "FRE", /* 0xb8 */
2599 "POS", /* 0xb9 */
2600 "SQR", /* 0xba */
2601 "RND", /* 0xbb */
2602 "LOG", /* 0xbc */
2603 "EXP", /* 0xbd */
2604 "COS", /* 0xbe */
2605 "SIN", /* 0xbf */
2606 "TAN", /* 0xc0 */
2607 "ATN", /* 0xc1 */
2608 "PEEK", /* 0xc2 */
2609 "LEN", /* 0xc3 */
2610 "STR$", /* 0xc4 */
2611 "VAL", /* 0xc5 */
2612 "ASC", /* 0xc6 */
2613 "CHR$", /* 0xc7 */
2614 "LEFT$", /* 0xc8 */
2615 "RIGHT$", /* 0xc9 */
2616 "MID$", /* 0xca */
2617 "GO", /* 0xcb */
2618 "RGR", /* 0xcc */
2619 "RCLR", /* 0xcd */
2620 NULL, /* 0xce - Prefix for additional tokens */
2621 "JOY", /* 0xcf */
2622 "RDOT" /* 0xd0 */
2623 "DEC", /* 0xd1 */
2624 "HEX$", /* 0xd2 */
2625 "ERR$", /* 0xd3 */
2626 "INSTR", /* 0xd4 */
2627 "ELSE", /* 0xd5 */
2628 "RESUME", /* 0xd6 */
2629 "TRAP", /* 0xd7 */
2630 "TRON", /* 0xd8 */
2631 "TROFF", /* 0xd9 */
2632 "SOUND", /* 0xda */
2633 "VOL", /* 0xdb */
2634 "AUTO", /* 0xdc */
2635 "PUDEF", /* 0xdd */
2636 "GRAPHIC", /* 0xde */
2637 "PAINT", /* 0xdf */
2638 "CHAR", /* 0xe0 */
2639 "BOX", /* 0xe1 */
2640 "CIRCLE", /* 0xe2 */
2641 "GSHAPE", /* 0xe3 */
2642 "SSHAPE", /* 0xe4 */
2643 "DRAW", /* 0xe5 */
2644 "LOCATE", /* 0xe6 */
2645 "COLOR", /* 0xe7 */
2646 "SCNCLR", /* 0xe8 */
2647 "SCALE", /* 0xe9 */
2648 "HELP", /* 0xea */
2649 "DO", /* 0xeb */
2650 "LOOP", /* 0xec */
2651 "EXIT", /* 0xed */
2652 "DIRECTORY", /* 0xee */
2653 "DSAVE", /* 0xef */
2654 "DLOAD", /* 0xf0 */
2655 "HEADER", /* 0xf1 */
2656 "SCRATCH", /* 0xf2 */
2657 "COLLECT", /* 0xf3 */
2658 "COPY", /* 0xf4 */
2659 "RENAME", /* 0xf5 */
2660 "BACKUP", /* 0xf6 */
2661 "DELETE", /* 0xf7 */
2662 "RENUMBER", /* 0xf8 */
2663 "KEY", /* 0xf9 */
2664 "MONITOR", /* 0xfa */
2665 "USING", /* 0xfb */
2666 "UNTIL", /* 0xfc */
2667 "WHILE", /* 0xfd */
2668 NULL, /* 0xfe - Prefix for additional tokens */
2669 "{PI}", /* 0xff - A single character shaped as greek lowercase 'PI' */
2670 NULL, /* 0xce00 */
2671 NULL, /* 0xce01 */
2672 "POT", /* 0xce02 */
2673 "BUMP", /* 0xce03 */
2674 "PEN", /* 0xce04 */
2675 "RSPPOS", /* 0xce05 */
2676 "RSPRITE", /* 0xce06 */
2677 "RSPCOLOR", /* 0xce07 */
2678 "XOR", /* 0xce08 */
2679 "RWINDOW", /* 0xce09 */
2680 "POINTER", /* 0xce0a */
2681 NULL, /* 0xfe00 */
2682 NULL, /* 0xfe01 */
2683 "BANK", /* 0xfe02 */
2684 "FILTER", /* 0xfe03 */
2685 "PLAY", /* 0xfe04 */
2686 "TEMPO", /* 0xfe05 */
2687 "MOVSPR", /* 0xfe06 */
2688 "SPRITE", /* 0xfe07 */
2689 "SPRCOLOR", /* 0xfe08 */
2690 "RREG", /* 0xfe09 */
2691 "ENVELOPE", /* 0xfe0a */
2692 "SLEEP", /* 0xfe0b */
2693 "CATALOG", /* 0xfe0c */
2694 "DOPEN", /* 0xfe0d */
2695 "APPEND", /* 0xfe0e */
2696 "DCLOSE", /* 0xfe0f */
2697 "BSAVE", /* 0xfe10 */
2698 "BLOAD", /* 0xfe11 */
2699 "RECORD", /* 0xfe12 */
2700 "CONCAT", /* 0xfe13 */
2701 "DVERIFY", /* 0xfe14 */
2702 "DCLEAR", /* 0xfe15 */
2703 "SPRSAV", /* 0xfe16 */
2704 "COLLISION", /* 0xfe17 */
2705 "BEGIN", /* 0xfe18 */
2706 "BEND", /* 0xfe19 */
2707 "WINDOW", /* 0xfe1a */
2708 "BOOT", /* 0xfe1b */
2709 "WIDTH", /* 0xfe1c */
2710 "SPRDEF", /* 0xfe1d */
2711 "QUIT", /* 0xfe1e */
2712 "STASH", /* 0xfe1f */
2713 NULL, /* 0xfe20 */
2714 "FETCH", /* 0xfe21 */
2715 NULL, /* 0xfe22 */
2716 "SWAP", /* 0xfe23 */
2717 "OFF", /* 0xfe24 */
2718 "FAST", /* 0xfe25 */
2719 "SLOW" /* 0xfe26 */
2720 };
2721
2722 static const char *const basic_100[] = /* "BASIC 10.0" - supported by c65 & clones */
2723 {
2724 "END", /* 0x80 */
2725 "FOR", /* 0x81 */
2726 "NEXT", /* 0x82 */
2727 "DATA", /* 0x83 */
2728 "INPUT#", /* 0x84 */
2729 "INPUT", /* 0x85 */
2730 "DIM", /* 0x86 */
2731 "READ", /* 0x87 */
2732 "LET", /* 0x88 */
2733 "GOTO", /* 0x89 */
2734 "RUN", /* 0x8a */
2735 "IF", /* 0x8b */
2736 "RESTORE", /* 0x8c */
2737 "GOSUB", /* 0x8d */
2738 "RETURN", /* 0x8e */
2739 "REM", /* 0x8f */
2740 "STOP", /* 0x90 */
2741 "ON", /* 0x91 */
2742 "WAIT", /* 0x92 */
2743 "LOAD", /* 0x93 */
2744 "SAVE", /* 0x94 */
2745 "VERIFY", /* 0x95 */
2746 "DEF", /* 0x96 */
2747 "POKE", /* 0x97 */
2748 "PRINT#", /* 0x98 */
2749 "PRINT", /* 0x99 */
2750 "CONT", /* 0x9a */
2751 "LIST", /* 0x9b */
2752 "CLR", /* 0x9c */
2753 "CMD", /* 0x9d */
2754 "SYS", /* 0x9e */
2755 "OPEN", /* 0x9f */
2756 "CLOSE", /* 0xa0 */
2757 "GET", /* 0xa1 */
2758 "NEW", /* 0xa2 */
2759 "TAB(", /* 0xa3 */
2760 "TO", /* 0xa4 */
2761 "FN", /* 0xa5 */
2762 "SPC(", /* 0xa6 */
2763 "THEN", /* 0xa7 */
2764 "NOT", /* 0xa8 */
2765 "STEP", /* 0xa9 */
2766 "+", /* 0xaa */
2767 "-", /* 0xab */
2768 "*", /* 0xac */
2769 "/", /* 0xad */
2770 "^", /* 0xae */
2771 "AND", /* 0xaf */
2772 "OR", /* 0xb0 */
2773 ">", /* 0xb1 */
2774 "=", /* 0xb2 */
2775 "<", /* 0xb3 */
2776 "SGN", /* 0xb4 */
2777 "INT", /* 0xb5 */
2778 "ABS", /* 0xb6 */
2779 "USR", /* 0xb7 */
2780 "FRE", /* 0xb8 */
2781 "POS", /* 0xb9 */
2782 "SQR", /* 0xba */
2783 "RND", /* 0xbb */
2784 "LOG", /* 0xbc */
2785 "EXP", /* 0xbd */
2786 "COS", /* 0xbe */
2787 "SIN", /* 0xbf */
2788 "TAN", /* 0xc0 */
2789 "ATN", /* 0xc1 */
2790 "PEEK", /* 0xc2 */
2791 "LEN", /* 0xc3 */
2792 "STR$", /* 0xc4 */
2793 "VAL", /* 0xc5 */
2794 "ASC", /* 0xc6 */
2795 "CHR$", /* 0xc7 */
2796 "LEFT$", /* 0xc8 */
2797 "RIGHT$", /* 0xc9 */
2798 "MID$", /* 0xca */
2799 "GO", /* 0xcb */
2800 "RGR", /* 0xcc */
2801 "RCLR", /* 0xcd */
2802 NULL, /* 0xce - Prefix for additional tokens */
2803 "JOY", /* 0xcf */
2804 "RDOT" /* 0xd0 */
2805 "DEC", /* 0xd1 */
2806 "HEX$", /* 0xd2 */
2807 "ERR$", /* 0xd3 */
2808 "INSTR", /* 0xd4 */
2809 "ELSE", /* 0xd5 */
2810 "RESUME", /* 0xd6 */
2811 "TRAP", /* 0xd7 */
2812 "TRON", /* 0xd8 */
2813 "TROFF", /* 0xd9 */
2814 "SOUND", /* 0xda */
2815 "VOL", /* 0xdb */
2816 "AUTO", /* 0xdc */
2817 "PUDEF", /* 0xdd */
2818 "GRAPHIC", /* 0xde */
2819 "PAINT", /* 0xdf */
2820 "CHAR", /* 0xe0 */
2821 "BOX", /* 0xe1 */
2822 "CIRCLE", /* 0xe2 */
2823 "PASTE", /* 0xe3 */
2824 "CUT", /* 0xe4 */
2825 "LINE", /* 0xe5 */
2826 "LOCATE", /* 0xe6 */
2827 "COLOR", /* 0xe7 */
2828 "SCNCLR", /* 0xe8 */
2829 "SCALE", /* 0xe9 */
2830 "HELP", /* 0xea */
2831 "DO", /* 0xeb */
2832 "LOOP", /* 0xec */
2833 "EXIT", /* 0xed */
2834 "DIR", /* 0xee */
2835 "DSAVE", /* 0xef */
2836 "DLOAD", /* 0xf0 */
2837 "HEADER", /* 0xf1 */
2838 "SCRATCH", /* 0xf2 */
2839 "COLLECT", /* 0xf3 */
2840 "COPY", /* 0xf4 */
2841 "RENAME", /* 0xf5 */
2842 "BACKUP", /* 0xf6 */
2843 "DELETE", /* 0xf7 */
2844 "RENUMBER", /* 0xf8 */
2845 "KEY", /* 0xf9 */
2846 "MONITOR", /* 0xfa */
2847 "USING", /* 0xfb */
2848 "UNTIL", /* 0xfc */
2849 "WHILE", /* 0xfd */
2850 NULL, /* 0xfe - Prefix for additional tokens */
2851 "{PI}", /* 0xff - A single character shaped as greek lowercase 'PI' */
2852 NULL, /* 0xce00 */
2853 NULL, /* 0xce01 */
2854 "POT", /* 0xce02 */
2855 "BUMP", /* 0xce03 */
2856 "PEN", /* 0xce04 */
2857 "RSPPOS", /* 0xce05 */
2858 "RSPRITE", /* 0xce06 */
2859 "RSPCOLOR", /* 0xce07 */
2860 "XOR", /* 0xce08 */
2861 "RWINDOW", /* 0xce09 */
2862 "POINTER", /* 0xce0a */
2863 NULL, /* 0xfe00 */
2864 NULL, /* 0xfe01 */
2865 "BANK", /* 0xfe02 */
2866 "FILTER", /* 0xfe03 */
2867 "PLAY", /* 0xfe04 */
2868 "TEMPO", /* 0xfe05 */
2869 "MOVSPR", /* 0xfe06 */
2870 "SPRITE", /* 0xfe07 */
2871 "SPRCOLOR", /* 0xfe08 */
2872 "RREG", /* 0xfe09 */
2873 "ENVELOPE", /* 0xfe0a */
2874 "SLEEP", /* 0xfe0b */
2875 "CATALOG", /* 0xfe0c */
2876 "DOPEN", /* 0xfe0d */
2877 "APPEND", /* 0xfe0e */
2878 "DCLOSE", /* 0xfe0f */
2879 "BSAVE", /* 0xfe10 */
2880 "BLOAD", /* 0xfe11 */
2881 "RECORD", /* 0xfe12 */
2882 "CONCAT", /* 0xfe13 */
2883 "DVERIFY", /* 0xfe14 */
2884 "DCLEAR", /* 0xfe15 */
2885 "SPRSAV", /* 0xfe16 */
2886 "COLLISION", /* 0xfe17 */
2887 "BEGIN", /* 0xfe18 */
2888 "BEND", /* 0xfe19 */
2889 "WINDOW", /* 0xfe1a */
2890 "BOOT", /* 0xfe1b */
2891 "WIDTH", /* 0xfe1c */
2892 "SPRDEF", /* 0xfe1d */
2893 "QUIT", /* 0xfe1e */
2894 "DMA", /* 0xfe1f */
2895 NULL, /* 0xfe20 */
2896 "DMA", /* 0xfe21 */
2897 NULL, /* 0xfe22 */
2898 "DMA", /* 0xfe23 */
2899 "OFF", /* 0xfe24 */
2900 "FAST", /* 0xfe25 */
2901 "SLOW", /* 0xfe26 */
2902 "TYPE", /* 0xfe27 */
2903 "BVERIFY", /* 0xfe28 */
2904 "ECTORY", /* 0xfe29 */
2905 "ERASE", /* 0xfe2a */
2906 "FIND", /* 0xfe2b */
2907 "CHANGE", /* 0xfe2c */
2908 "SET", /* 0xfe2d */
2909 "SCREEN", /* 0xfe2e */
2910 "POLYGON", /* 0xfe2f */
2911 "ELLIPSE", /* 0xfe30 */
2912 "VIEWPORT", /* 0xfe31 */
2913 "GCOPY", /* 0xfe32 */
2914 "PEN", /* 0xfe33 */
2915 "PALETTE", /* 0xfe34 */
2916 "DMODE", /* 0xfe35 */
2917 "DPAT", /* 0xfe36 */
2918 "PIC", /* 0xfe37 */
2919 "GENLOCK", /* 0xfe38 */
2920 "FOREGROUND", /* 0xfe39 */
2921 NULL, /* 0xfe3a */
2922 "BACKGROUND", /* 0xfe3b */
2923 "BORDER", /* 0xfe3c */
2924 "HIGHLIGHT" /* 0xfe3d */
2925 };
2926
2927 #endif
2928
2929
2930
2931 /***************************************************************************
2932 COCO BASIC
2933 ***************************************************************************/
2934
2935 static const basictoken_tableent cocobas_tokenents[] =
2936 {
2937 { 0x00, 0x80, cocobas_statements, ARRAY_LENGTH(cocobas_statements) },
2938 { 0xff, 0x80, cocobas_functions, ARRAY_LENGTH(cocobas_functions) }
2939 };
2940
2941 static const basictokens cocobas_tokens =
2942 {
2943 0x2600,
2944 1,
2945 3,
2946 {0xFF, 0x00, 0x00},
2947 true,
2948 cocobas_tokenents,
2949 ARRAY_LENGTH(cocobas_tokenents)
2950 };
2951
cocobas_readfile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & destf)2952 static imgtoolerr_t cocobas_readfile(imgtool::partition &partition, const char *filename,
2953 const char *fork, imgtool::stream &destf)
2954 {
2955 return basic_readfile(&cocobas_tokens, partition, filename, fork, destf);
2956 }
2957
cocobas_writefile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & sourcef,util::option_resolution * opts)2958 static imgtoolerr_t cocobas_writefile(imgtool::partition &partition, const char *filename,
2959 const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)
2960 {
2961 return basic_writefile(&cocobas_tokens, partition, filename, fork, sourcef, opts);
2962 }
2963
filter_cocobas_getinfo(uint32_t state,union filterinfo * info)2964 void filter_cocobas_getinfo(uint32_t state, union filterinfo *info)
2965 {
2966 switch(state)
2967 {
2968 case FILTINFO_STR_NAME: info->s = "cocobas"; break;
2969 case FILTINFO_STR_HUMANNAME: info->s = "CoCo Tokenized Basic Files"; break;
2970 case FILTINFO_PTR_READFILE: info->read_file = cocobas_readfile; break;
2971 case FILTINFO_PTR_WRITEFILE: info->write_file = cocobas_writefile; break;
2972 }
2973 }
2974
2975
2976
2977 /***************************************************************************
2978 DRAGON BASIC
2979 ***************************************************************************/
2980
2981 static const basictoken_tableent dragonbas_tokenents[] =
2982 {
2983 { 0x00, 0x80, dragonbas_statements, ARRAY_LENGTH(dragonbas_statements) },
2984 { 0xff, 0x80, dragonbas_functions, ARRAY_LENGTH(dragonbas_functions) }
2985 };
2986
2987 static const basictokens dragonbas_tokens =
2988 {
2989 0x2415,
2990 4,
2991 9,
2992 {0x55, 0x01, 0x24, 0x01, 0x00, 0x2A, 0x8B, 0x8D, 0xAA},
2993 true,
2994 dragonbas_tokenents,
2995 ARRAY_LENGTH(dragonbas_tokenents)
2996 };
2997
dragonbas_readfile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & destf)2998 static imgtoolerr_t dragonbas_readfile(imgtool::partition &partition, const char *filename,
2999 const char *fork, imgtool::stream &destf)
3000 {
3001 return basic_readfile(&dragonbas_tokens, partition, filename, fork, destf);
3002 }
3003
dragonbas_writefile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & sourcef,util::option_resolution * opts)3004 static imgtoolerr_t dragonbas_writefile(imgtool::partition &partition, const char *filename,
3005 const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)
3006 {
3007 return basic_writefile(&dragonbas_tokens, partition, filename, fork, sourcef, opts);
3008 }
3009
filter_dragonbas_getinfo(uint32_t state,union filterinfo * info)3010 void filter_dragonbas_getinfo(uint32_t state, union filterinfo *info)
3011 {
3012 switch(state)
3013 {
3014 case FILTINFO_STR_NAME: info->s = "dragonbas"; break;
3015 case FILTINFO_STR_HUMANNAME: info->s = "Dragon Tokenized Basic Files"; break;
3016 case FILTINFO_PTR_READFILE: info->read_file = dragonbas_readfile; break;
3017 case FILTINFO_PTR_WRITEFILE: info->write_file = dragonbas_writefile; break;
3018 }
3019 }
3020
3021
3022
3023 /***************************************************************************
3024 VZBASIC
3025 ***************************************************************************/
3026
3027 static const basictoken_tableent vzbas_tokenents[] =
3028 {
3029 { 0x00, 0x80, vzbas, ARRAY_LENGTH(vzbas) }
3030 };
3031
3032
3033
3034 static const basictokens vzbas_tokens =
3035 {
3036 0x7ae9,
3037 0,
3038 0,
3039 {0x00},
3040 false,
3041 vzbas_tokenents,
3042 ARRAY_LENGTH(vzbas_tokenents)
3043 };
3044
vzbas_readfile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & destf)3045 static imgtoolerr_t vzbas_readfile(imgtool::partition &partition, const char *filename,
3046 const char *fork, imgtool::stream &destf)
3047 {
3048 return basic_readfile(&vzbas_tokens, partition, filename, fork, destf);
3049 }
3050
vzbas_writefile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & sourcef,util::option_resolution * opts)3051 static imgtoolerr_t vzbas_writefile(imgtool::partition &partition, const char *filename,
3052 const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)
3053 {
3054 return basic_writefile(&vzbas_tokens, partition, filename, fork, sourcef, opts);
3055 }
3056
filter_vzbas_getinfo(uint32_t state,union filterinfo * info)3057 void filter_vzbas_getinfo(uint32_t state, union filterinfo *info)
3058 {
3059 switch(state)
3060 {
3061 case FILTINFO_STR_NAME: info->s = "vzbas"; break;
3062 case FILTINFO_STR_HUMANNAME: info->s = "Laser/VZ Tokenized Basic Files"; break;
3063 case FILTINFO_PTR_READFILE: info->read_file = vzbas_readfile; break;
3064 case FILTINFO_PTR_WRITEFILE: info->write_file = vzbas_writefile; break;
3065 }
3066 }
3067
3068
3069
3070 /***************************************************************************
3071 BML3 BASIC
3072 ***************************************************************************/
3073
3074 static const basictoken_tableent bml3bas_tokenents[] =
3075 {
3076 { 0x00, 0x80, bml3bas_statements, ARRAY_LENGTH(bml3bas_statements) },
3077 { 0xff, 0x80, bml3bas_functions, ARRAY_LENGTH(bml3bas_functions) }
3078 };
3079
3080 static const basictokens bml3bas_tokens =
3081 {
3082 0x2600,
3083 1,
3084 3,
3085 {0xFF, 0x00, 0x00},
3086 true,
3087 bml3bas_tokenents,
3088 ARRAY_LENGTH(bml3bas_tokenents)
3089 };
3090
bml3bas_readfile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & destf)3091 static imgtoolerr_t bml3bas_readfile(imgtool::partition &partition, const char *filename,
3092 const char *fork, imgtool::stream &destf)
3093 {
3094 return basic_readfile(&bml3bas_tokens, partition, filename, fork, destf);
3095 }
3096
bml3bas_writefile(imgtool::partition & partition,const char * filename,const char * fork,imgtool::stream & sourcef,util::option_resolution * opts)3097 static imgtoolerr_t bml3bas_writefile(imgtool::partition &partition, const char *filename,
3098 const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)
3099 {
3100 return basic_writefile(&bml3bas_tokens, partition, filename, fork, sourcef, opts);
3101 }
3102
filter_bml3bas_getinfo(uint32_t state,union filterinfo * info)3103 void filter_bml3bas_getinfo(uint32_t state, union filterinfo *info)
3104 {
3105 switch(state)
3106 {
3107 case FILTINFO_STR_NAME: info->s = "bml3bas"; break;
3108 case FILTINFO_STR_HUMANNAME: info->s = "Basic Master Level 3 Tokenized Basic Files"; break;
3109 case FILTINFO_PTR_READFILE: info->read_file = bml3bas_readfile; break;
3110 case FILTINFO_PTR_WRITEFILE: info->write_file = bml3bas_writefile; break;
3111 }
3112 }
3113