comparison lwasm/instab.c @ 385:4fd16faa4d93

Add various "convenience" ops These are things like "NEGD" in 6809 mode or NEGQ in 6309 mode. These require either 6809conv or 6309conv pragmas. Also fix a problem with "CPX" in the 6800 mode. Thanks to Erik G <erik@6809.org> for the patch.
author William Astle <lost@l-w.ca>
date Mon, 13 Jul 2015 21:26:34 -0600
parents 6ee9c67a0f8d
children e97f9a302c6a
comparison
equal deleted inserted replaced
384:6ee9c67a0f8d 385:4fd16faa4d93
338 338
339 PARSEFUNC(pseudo_parse_endstruct); 339 PARSEFUNC(pseudo_parse_endstruct);
340 #define pseudo_resolve_endstruct NULL 340 #define pseudo_resolve_endstruct NULL
341 #define pseudo_emit_endstruct NULL 341 #define pseudo_emit_endstruct NULL
342 342
343 // convenience ops
344 PARSEFUNC(insn_parse_conv);
345 #define insn_resolve_conv NULL
346 EMITFUNC(insn_emit_conv);
347
343 instab_t instab[] = 348 instab_t instab[] =
344 { 349 {
350 // 6809 convenience instructions
351 { "asrd", { 0x4756, -1, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
352 { "clrd", { 0x4f5f, -1, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
353 { "comd", { 0x4353, -1, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
354 { "lsld", { 0x5849, -1, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
355 { "lsrd", { 0x4456, -1, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
356 { "negd", { 0x4353, 0x83ff, 0xff, 8 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
357 { "tstd", { 0xed7e, -1, -1, 6 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6809conv },
358
359 // 6309 convenience instructions
360 { "asrq", { 0x1047, 0x1056, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
361 { "clrq", { 0x4f5f, 0x1F06, -1, 6 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
362 { "comq", { 0x1043, 0x1053, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
363 { "lsle", { 0x1030, 0xee, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
364 { "lslf", { 0x1030, 0xff, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
365 { "lslq", { 0x1030, 0x6610, 0x49, 6 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
366 { "lsrq", { 0x1044, 0x1056, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
367 { "nege", { 0x1032, 0xce, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
368 { "negf", { 0x1032, 0xcf, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
369 { "negw", { 0x1032, 0xc6, -1, 4 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
370 { "negq", { -1, -1, -1, 12 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
371 { "tstq", { 0x10ed, 0x7c, -1, 9 }, insn_parse_conv, insn_resolve_conv, insn_emit_conv, lwasm_insn_is6309conv },
345 372
346 { "abx", { 0x3a, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, 373 { "abx", { 0x3a, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal},
347 { "adca", { 0x99, 0xa9, 0xb9, 0x89}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal}, 374 { "adca", { 0x99, 0xa9, 0xb9, 0x89}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal},
348 { "adcb", { 0xd9, 0xe9, 0xf9, 0xc9}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal}, 375 { "adcb", { 0xd9, 0xe9, 0xf9, 0xc9}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal},
349 { "adcd", { 0x1099, 0x10a9, 0x10b9, 0x1089},insn_parse_gen16, insn_resolve_gen16, insn_emit_gen16, lwasm_insn_is6309}, 376 { "adcd", { 0x1099, 0x10a9, 0x10b9, 0x1089},insn_parse_gen16, insn_resolve_gen16, insn_emit_gen16, lwasm_insn_is6309},
442 { "eora", { 0x98, 0xa8, 0xb8, 0x88}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal}, 469 { "eora", { 0x98, 0xa8, 0xb8, 0x88}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal},
443 { "eorb", { 0xd8, 0xe8, 0xf8, 0xc8}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal}, 470 { "eorb", { 0xd8, 0xe8, 0xf8, 0xc8}, insn_parse_gen8, insn_resolve_gen8, insn_emit_gen8, lwasm_insn_normal},
444 { "eord", { 0x1098, 0x10a8, 0x10b8, 0x1088},insn_parse_gen16, insn_resolve_gen16, insn_emit_gen16, lwasm_insn_is6309}, 471 { "eord", { 0x1098, 0x10a8, 0x10b8, 0x1088},insn_parse_gen16, insn_resolve_gen16, insn_emit_gen16, lwasm_insn_is6309},
445 { "eorr", { 0x1036, -1, -1, -1 }, insn_parse_rtor, insn_resolve_rtor, insn_emit_rtor, lwasm_insn_is6309}, 472 { "eorr", { 0x1036, -1, -1, -1 }, insn_parse_rtor, insn_resolve_rtor, insn_emit_rtor, lwasm_insn_is6309},
446 { "exg", { 0x1e, -1, -1, -1 }, insn_parse_rtor, insn_resolve_rtor, insn_emit_rtor, lwasm_insn_normal}, 473 { "exg", { 0x1e, -1, -1, -1 }, insn_parse_rtor, insn_resolve_rtor, insn_emit_rtor, lwasm_insn_normal},
474
475 { "hcf", { 0x14, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6809},
447 476
448 { "inc", { 0x0c, 0x6c, 0x7c, -1 }, insn_parse_gen0, insn_resolve_gen0, insn_emit_gen0, lwasm_insn_normal}, 477 { "inc", { 0x0c, 0x6c, 0x7c, -1 }, insn_parse_gen0, insn_resolve_gen0, insn_emit_gen0, lwasm_insn_normal},
449 { "inca", { 0x4c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, 478 { "inca", { 0x4c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal},
450 { "incb", { 0x5c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, 479 { "incb", { 0x5c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal},
451 { "incd", { 0x104c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, 480 { "incd", { 0x104c, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309},
527 { "pulsw", { 0x1039, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, 556 { "pulsw", { 0x1039, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309},
528 { "pulu", { 0x37, -1, -1, -1 }, insn_parse_rlist, insn_resolve_rlist, insn_emit_rlist, lwasm_insn_normal}, 557 { "pulu", { 0x37, -1, -1, -1 }, insn_parse_rlist, insn_resolve_rlist, insn_emit_rlist, lwasm_insn_normal},
529 { "puluw", { 0x103b, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, 558 { "puluw", { 0x103b, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309},
530 559
531 { "reset", { 0x3e, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6809}, 560 { "reset", { 0x3e, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6809},
561 { "rhf", { 0x14, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6809},
532 { "rol", { 0x09, 0x69, 0x79, -1 }, insn_parse_gen0, insn_resolve_gen0, insn_emit_gen0, lwasm_insn_normal}, 562 { "rol", { 0x09, 0x69, 0x79, -1 }, insn_parse_gen0, insn_resolve_gen0, insn_emit_gen0, lwasm_insn_normal},
533 { "rola", { 0x49, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, 563 { "rola", { 0x49, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal},
534 { "rolb", { 0x59, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, 564 { "rolb", { 0x59, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal},
535 { "rold", { 0x1049, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, 565 { "rold", { 0x1049, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309},
536 { "rolw", { 0x1059, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, 566 { "rolw", { 0x1059, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309},
741 { "spc", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal}, 771 { "spc", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal},
742 { "ttl", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal}, 772 { "ttl", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal},
743 { ".bank", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal}, 773 { ".bank", { -1, -1, -1, -1 }, pseudo_parse_noop, pseudo_resolve_noop, pseudo_emit_noop, lwasm_insn_normal},
744 774
745 // for 6800 compatibility 775 // for 6800 compatibility
746 { "aba", { 0x3404, 0xabe0, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 776 { "aba", { 0x3404, 0xabe0, -1, 12 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
747 { "cba", { 0x3404, 0xa1e0, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 777 { "cba", { 0x3404, 0xa1e0, -1, 12 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
748 { "clc", { 0x1cfe, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 778 { "clc", { 0x1cfe, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
749 { "clf", { 0x1cbf, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 779 { "clf", { 0x1cbf, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
750 { "cli", { 0x1cef, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 780 { "cli", { 0x1cef, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
751 { "clif", { 0x1caf, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 781 { "clif", { 0x1caf, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
752 { "clv", { 0x1cfd, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 782 { "clv", { 0x1cfd, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
753 { "cpx", { 0x9c, 0xac, 0xbc, 0x8c }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 783 { "cpx", { 0x9c, 0xac, 0xbc, 0x8c}, insn_parse_gen16, insn_resolve_gen16, insn_emit_gen16, lwasm_insn_is6800},
754 { "des", { 0x327f, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 784 { "des", { 0x327f, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
755 { "dex", { 0x301f, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 785 { "dex", { 0x301f, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
756 { "dey", { 0x313f, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 786 { "dey", { 0x313f, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
757 { "ins", { 0x3261, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 787 { "ins", { 0x3261, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
758 { "inx", { 0x3001, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 788 { "inx", { 0x3001, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
759 { "iny", { 0x3121, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 789 { "iny", { 0x3121, -1, -1, 5 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
760 { "sba", { 0x3404, 0xa0e0, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 790 { "sba", { 0x3404, 0xa0e0, -1, 12 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
761 { "sec", { 0x1a01, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 791 { "sec", { 0x1a01, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
762 { "sef", { 0x1a40, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 792 { "sef", { 0x1a40, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
763 { "sei", { 0x1a10, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 793 { "sei", { 0x1a10, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
764 { "seif", { 0x1a50, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 794 { "seif", { 0x1a50, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
765 { "sev", { 0x1a02, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 795 { "sev", { 0x1a02, -1, -1, 3 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
766 { "tab", { 0x1f89, 0x4d, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 796 { "tab", { 0x1f89, 0x4d, -1, 8 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
767 { "tap", { 0x1f8a, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 797 { "tap", { 0x1f8a, -1, -1, 6 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
768 { "tba", { 0x1f98, 0x4d, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 798 { "tba", { 0x1f98, 0x4d, -1, 8 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
769 { "tpa", { 0x1fa8, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 799 { "tpa", { 0x1fa8, -1, -1, 6 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
770 { "tsx", { 0x1f41, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 800 { "tsx", { 0x1f41, -1, -1, 6 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
771 { "txs", { 0x1f14, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 801 { "txs", { 0x1f14, -1, -1, 6 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
772 { "wai", { 0x3cff, -1, -1, -1 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 }, 802 { "wai", { 0x3cff, -1, -1, 22 }, insn_parse_inh6800, insn_resolve_inh6800, insn_emit_inh6800, lwasm_insn_is6800 },
773 803
774 // flag end of table 804 // flag end of table
775 { NULL, { -1, -1, -1, -1 }, NULL, NULL, NULL, lwasm_insn_normal} 805 { NULL, { -1, -1, -1, -1 }, NULL, NULL, NULL, lwasm_insn_normal}
776 }; 806 };