# HG changeset patch # User William Astle # Date 1434424918 21600 # Node ID c6d2a1f54e0c182f94e6472d455d5160b0207eff # Parent 433dbc18fb41451f9ef70b3502a7f492dc1fbe90 Change processor target variations to pragmas. Add "pragma 6809" and "pragma 6309" which select the processor target rather than a global flag. The command line switches set or reset the pragma appropriately. Thanks to Erik G for the patch. diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/insn_indexed.c --- a/lwasm/insn_indexed.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/insn_indexed.c Mon Jun 15 21:21:58 2015 -0600 @@ -99,7 +99,7 @@ const char *reglist; lw_expr_t e; - if (as -> target == TARGET_6809) + if (CURPRAGMA(l, PRAGMA_6809)) { simples = simpleindex9; reglist = regs9; diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/insn_rtor.c --- a/lwasm/insn_rtor.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/insn_rtor.c Mon Jun 15 21:21:58 2015 -0600 @@ -34,7 +34,7 @@ // D,X,Y,U,S,PC,W,V // A,B,CC,DP,0,0,E,F - r0 = lwasm_lookupreg2((as -> target == TARGET_6309) ? regs : regs9, p); + r0 = lwasm_lookupreg2(!CURPRAGMA(l, PRAGMA_6809) ? regs : regs9, p); if (r0 < 0 || *(*p)++ != ',') { lwasm_register_error(as, l, "Bad operand"); @@ -42,7 +42,7 @@ } else { - r1 = lwasm_lookupreg2((as -> target == TARGET_6309) ? regs : regs9, p); + r1 = lwasm_lookupreg2(!CURPRAGMA(l, PRAGMA_6809) ? regs : regs9, p); if (r1 < 0) { lwasm_register_error(as, l, "Bad operand"); diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/instab.c --- a/lwasm/instab.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/instab.c Mon Jun 15 21:21:58 2015 -0600 @@ -521,7 +521,7 @@ { "pulu", { 0x37, -1, -1, -1 }, insn_parse_rlist, insn_resolve_rlist, insn_emit_rlist, lwasm_insn_normal}, { "puluw", { 0x103b, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, - { "reset", { 0x3e, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, + { "reset", { 0x3e, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6809}, { "rol", { 0x09, 0x69, 0x79, -1 }, insn_parse_gen0, insn_resolve_gen0, insn_emit_gen0, lwasm_insn_normal}, { "rola", { 0x49, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, { "rolb", { 0x59, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_normal}, diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/instab.h --- a/lwasm/instab.h Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/instab.h Mon Jun 15 21:21:58 2015 -0600 @@ -45,6 +45,7 @@ lwasm_insn_struct = 16, /* insn allowed in a struct */ lwasm_insn_setdata = 32, /* insn uses the data address for symbols */ lwasm_insn_is6800 = 64, /* insn is a 6800 compatibility operation */ + lwasm_insn_is6809 = 128, /* insn is 6809 only */ lwasm_insn_normal = 0 }; diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/lwasm.h --- a/lwasm/lwasm.h Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/lwasm.h Mon Jun 15 21:21:58 2015 -0600 @@ -63,12 +63,6 @@ OUTPUT_HEX // generic hexadecimal format }; -enum lwasm_target_e -{ - TARGET_6309 = 0, // target 6309 CPU - TARGET_6809 // target 6809 CPU (no 6309 ops) -}; - enum lwasm_flags_e { FLAG_LIST = 0x0001, @@ -97,7 +91,8 @@ PRAGMA_SYMBOLNOCASE = 0x400, // symbols defined under this pragma are matched case insensitively PRAGMA_CONDUNDEFZERO = 0x800, // treat undefined symbols as zero in conditionals during pass 1 PRAGMA_6800COMPAT = 0x1000, // enable 6800 compatibility opcodes - PRAGMA_FORWARDREFMAX = 0x2000 // force incomplete references on pass 1 to maximum mode + PRAGMA_FORWARDREFMAX = 0x2000, // force incomplete references on pass 1 to maximum mode + PRAGMA_6809 = 0x4000 // 6809/6309 assembly mode }; @@ -272,7 +267,6 @@ struct asmstate_s { int output_format; // output format - int target; // assembly target int debug_level; // level of debugging requested FILE *debug_file; // FILE * to output debug messages to int flags; // assembly flags diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/main.c --- a/lwasm/main.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/main.c Mon Jun 15 21:21:58 2015 -0600 @@ -202,11 +202,11 @@ break; case '9': - as -> target = TARGET_6809; + as -> pragmas |= PRAGMA_6809; break; case '3': - as -> target = TARGET_6309; + as -> pragmas &= ~PRAGMA_6809; break; case 'P': @@ -292,7 +292,6 @@ asmstate.include_list = lw_stringlist_create(); asmstate.input_files = lw_stringlist_create(); asmstate.nextcontext = 1; - asmstate.target = TARGET_6309; asmstate.exprwidth = 16; /* parse command line arguments */ diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/pass1.c --- a/lwasm/pass1.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/pass1.c Mon Jun 15 21:21:58 2015 -0600 @@ -299,7 +299,7 @@ if (as -> skipcond && !(instab[opnum].flags & lwasm_insn_cond)) goto linedone; - if (!nomacro && ((as -> pragmas & PRAGMA_SHADOW) || ((as -> target != TARGET_6309) && (instab[opnum].flags & lwasm_insn_is6309)))) + if (!nomacro && ((as->pragmas & PRAGMA_SHADOW) || (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6309)))) { // check for macros even if they shadow real operations // NOTE: "ENDM" cannot be shadowed @@ -333,9 +333,11 @@ // no parse func means operand doesn't matter if (instab[opnum].parse) { - if ((as -> target != TARGET_6309) && (instab[opnum].flags & lwasm_insn_is6309)) + if (CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6309)) lwasm_register_error(as, cl, "Illegal use of 6309 instruction in 6809 mode (%s)", sym); - + if (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6809)) + lwasm_register_error(as, cl, "Illegal use of 6809 instruction in 6309 mode (%s)", sym); + if (as -> instruct == 0 || instab[opnum].flags & lwasm_insn_struct) { cl -> len = -1; diff -r 433dbc18fb41 -r c6d2a1f54e0c lwasm/pragma.c --- a/lwasm/pragma.c Tue Jun 02 20:58:14 2015 -0600 +++ b/lwasm/pragma.c Mon Jun 15 21:21:58 2015 -0600 @@ -60,6 +60,7 @@ { "symbolnocase", "nosymbolnocase", PRAGMA_SYMBOLNOCASE }, { "nosymbolcase", "symbolcase", PRAGMA_SYMBOLNOCASE }, { "condundefzero", "nocondundefzero", PRAGMA_CONDUNDEFZERO }, + { "6809", "6309", PRAGMA_6809 }, { "6800compat", "no6800compat", PRAGMA_6800COMPAT }, { "forwardrefmax", "noforwardrefmax", PRAGMA_FORWARDREFMAX }, { 0, 0, 0}