# HG changeset patch # User William Astle # Date 1436843882 21600 # Node ID 80d615a6642c9dbe6755b24665d3e1147a6577f7 # Parent e3f4aaa2a4e842253d0f4991acc3a52442f31f8d Add REORG pseudo op For Macro-80C compatibility, add REORG pseudo op. It has some utility so this one is not protected by a pragma. Thanks to Erik G for the patch. diff -r e3f4aaa2a4e8 -r 80d615a6642c lwasm/instab.c --- a/lwasm/instab.c Mon Jul 13 21:11:12 2015 -0600 +++ b/lwasm/instab.c Mon Jul 13 21:18:02 2015 -0600 @@ -188,6 +188,10 @@ #define pseudo_resolve_org NULL #define pseudo_emit_org NULL +PARSEFUNC(pseudo_parse_reorg); +#define pseudo_resolve_reorg NULL +#define pseudo_emit_reorg NULL + PARSEFUNC(pseudo_parse_equ); #define pseudo_resolve_equ NULL #define pseudo_emit_equ NULL @@ -594,6 +598,7 @@ { "tstw", { 0x105d, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, { "org", { -1, -1, -1, -1 }, pseudo_parse_org, pseudo_resolve_org, pseudo_emit_org, lwasm_insn_normal}, + { "reorg", { -1, -1, -1, -1 }, pseudo_parse_reorg, pseudo_resolve_reorg, pseudo_emit_reorg, lwasm_insn_normal}, { "equ", { -1, -1, -1, -1 }, pseudo_parse_equ, pseudo_resolve_equ, pseudo_emit_equ, lwasm_insn_setsym}, { "=", { -1, -1, -1, -1 }, pseudo_parse_equ, pseudo_resolve_equ, pseudo_emit_equ, lwasm_insn_setsym}, diff -r e3f4aaa2a4e8 -r 80d615a6642c lwasm/lwasm.c --- a/lwasm/lwasm.c Mon Jul 13 21:11:12 2015 -0600 +++ b/lwasm/lwasm.c Mon Jul 13 21:18:02 2015 -0600 @@ -261,6 +261,7 @@ case E_STRUCT_RECURSE: return "Attempt to define a structure inside a structure"; case E_SYMBOL_DUPE: return "Multiply defined symbol"; case E_UNKNOWN_OPERATION: return "Unknown operation"; + case E_ORG_NOT_FOUND: return "Previous ORG not found"; case W_ENDSTRUCT_WITHOUT: return "ENDSTRUCT without STRUCT"; case W_DUPLICATE_SECTION: return "Section flags can only be specified the first time; ignoring duplicate definition"; diff -r e3f4aaa2a4e8 -r 80d615a6642c lwasm/lwasm.h --- a/lwasm/lwasm.h Mon Jul 13 21:11:12 2015 -0600 +++ b/lwasm/lwasm.h Mon Jul 13 21:18:02 2015 -0600 @@ -195,6 +195,7 @@ E_SYMBOL_UNDEFINED_EXPORT = 54, E_UNKNOWN_OPERATION = 55, E_USER_SPECIFIED = 56, + E_ORG_NOT_FOUND = 57, /* warnings must be 1000 or greater */ diff -r e3f4aaa2a4e8 -r 80d615a6642c lwasm/pass1.c --- a/lwasm/pass1.c Mon Jul 13 21:11:12 2015 -0600 +++ b/lwasm/pass1.c Mon Jul 13 21:18:02 2015 -0600 @@ -352,6 +352,7 @@ // call parse function debug_message(as, 100, "len = %d, dlen = %d", cl -> len, cl -> dlen); (instab[opnum].parse)(as, cl, &p1); + // if we're forcing address modes on pass 1, force a resolution if (CURPRAGMA(cl, PRAGMA_FORWARDREFMAX) && instab[opnum].resolve) { @@ -364,7 +365,6 @@ else cl -> dlen = cl -> len; } - if (*p1 && !isspace(*p1) && !(cl -> err)) { // flag bad operand error diff -r e3f4aaa2a4e8 -r 80d615a6642c lwasm/pseudo.c --- a/lwasm/pseudo.c Mon Jul 13 21:11:12 2015 -0600 +++ b/lwasm/pseudo.c Mon Jul 13 21:18:02 2015 -0600 @@ -965,6 +965,44 @@ l -> len = 0; } +PARSEFUNC(pseudo_parse_reorg) +{ + lw_expr_t e = NULL; + + l -> len = 0; + + line_t *cl = l; + for (cl = cl -> prev; cl; cl = cl -> prev) + { + if (cl -> insn == -1) continue; + + if (!strcmp("org", instab[cl -> insn].opcode)) + { + if (cl -> prev) + { + e = lw_expr_copy(cl -> prev -> daddr); + break; + } + } + } + + if (!e) + { + lwasm_register_error(as, l, E_ORG_NOT_FOUND); + return; + } + + lw_expr_destroy(l -> daddr); + l -> daddr = e; + + if (l -> inmod == 0) + { + lw_expr_destroy(l -> addr); + l -> addr = e; + } + l -> len = 0; +} + PARSEFUNC(pseudo_parse_equ) { lw_expr_t e;