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