# HG changeset patch # User William Astle # Date 1652585459 21600 # Node ID a584b9ddffc4ed4bd0baaba43defaefe6fb6a6c9 # Parent 558ee362437ed400fc3e22bfb93c25f5042d754f Update raw output to work with RMB only definitions at the start It seems useful to be able to define a number of symbols at the start of the source file without generating a run of NUL output. This update adjusts the output to ignore any number of statements that generate no output as long as there is a subsequent ORG statement. If there is no ORG statement after them, the NUL sequence should still appear. diff -r 558ee362437e -r a584b9ddffc4 lwasm/instab.c --- a/lwasm/instab.c Sat May 14 13:05:43 2022 -0600 +++ b/lwasm/instab.c Sat May 14 21:30:59 2022 -0600 @@ -643,7 +643,7 @@ { "tstf", { 0x115d, -1, -1, -1 }, insn_parse_inh, insn_resolve_inh, insn_emit_inh, lwasm_insn_is6309}, { "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}, + { "org", { -1, -1, -1, -1 }, pseudo_parse_org, pseudo_resolve_org, pseudo_emit_org, lwasm_insn_org}, { "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 558ee362437e -r a584b9ddffc4 lwasm/instab.h --- a/lwasm/instab.h Sat May 14 13:05:43 2022 -0600 +++ b/lwasm/instab.h Sat May 14 21:30:59 2022 -0600 @@ -49,6 +49,7 @@ lwasm_insn_is6809conv = 1 << 8, /* insn is 6809 convenience only */ lwasm_insn_is6309conv = 1 << 9, /* insn is 6309 convenience only */ lwasm_insn_isemuext = 1 << 10, /* insn is an emulator extension */ + lwasm_insn_org = 1 << 11, /* insn sets assembly address */ lwasm_insn_normal = 0 }; diff -r 558ee362437e -r a584b9ddffc4 lwasm/output.c --- a/lwasm/output.c Sat May 14 13:05:43 2022 -0600 +++ b/lwasm/output.c Sat May 14 21:30:59 2022 -0600 @@ -32,6 +32,7 @@ #include #include "lwasm.h" +#include "instab.h" void write_code_raw(asmstate_t *as, FILE *of); void write_code_decb(asmstate_t *as, FILE *of); @@ -245,12 +246,24 @@ raw merely writes all the bytes directly to the file as is. ORG is just a reference for the assembler to handle absolute references. Multiple ORG statements will produce mostly useless results + +However, if a run of RMBs exists at the start that is ended by an ORG +statement, that run of RMBs will not be output as a zero fill. */ void write_code_raw(asmstate_t *as, FILE *of) { line_t *cl; + line_t *sl; - for (cl = as -> line_head; cl; cl = cl -> next) + sl = as -> line_head; + for (cl = sl; cl; cl = cl -> next) + { + if (cl -> outputl > 0) + break; + if (instab[cl -> insn].flags & lwasm_insn_org) + sl = cl; + } + for (cl = sl; cl; cl = cl -> next) { if (cl -> len > 0 && cl -> outputl < 0) {