YaK:: fixing toolshed/hdbdos/*.rom with lwtools-4.22 [Changes]   [Calendar]   [Search]   [Index]   [PhotoTags]   
[mega_changes]
[photos]

fixing toolshed/hdbdos/*.rom with lwtools-4.22

hdbtools has 13 bytes of RMBs in the middle of the ROM, at offset $1930 after ORG $C000, which is $D930 in the listing. They are not really to be reserved in the ROM, and they have a different ORG than the rest of the ROM.

This diff fixes the ROM output by omitting out-of-order line addresses.

DIFF -y lwasm/output.c
void write_code_raw(asmstate_t *as, FILE *of)                                           void write_code_raw(asmstate_t *as, FILE *of)
{                                                                                       {
        line_t *cl;                                                                             line_t *cl;
        line_t *sl;                                                                             line_t *sl;
                                                                                    >           int next_addr = -1;  // -1 for Unknown.

        sl = as -> line_head;                                                                   sl = as -> line_head;
        for (cl = sl; cl; cl = cl -> next)                                                      for (cl = sl; cl; cl = cl -> next)
        {                                                                                       {
                if (cl -> outputl > 0)                                                                  if (cl -> outputl > 0)
                        break;                                                                                  break;
                if (instab[cl -> insn].flags & lwasm_insn_org)                                          if (instab[cl -> insn].flags & lwasm_insn_org)
                        sl = cl;                                                                                sl = cl;
        }                                                                                       }
        for (cl = sl; cl; cl = cl -> next)                                                      for (cl = sl; cl; cl = cl -> next)
        {                                                                                       {
                                                                                    >                   // Check that lines are correct sequential address, or drop them.
                                                                                    >                   if (next_addr > -1) {
                                                                                    >                           if (cl -> addr -> value != next_addr) {
                                                                                    >                                   continue;
                                                                                    >                           }
                                                                                    >                   } else {
                                                                                    >                           next_addr = cl -> addr -> value;
                                                                                    >                   }
                                                                                    >
                if (cl -> len > 0 && cl -> outputl < 0)                                                 if (cl -> len > 0 && cl -> outputl < 0)
                {                                                                                       {
                        int i;                                                                                  int i;
                        for (i = 0; i < cl -> len; i++)                                                         for (i = 0; i < cl -> len; i++)
                                writebytes("\0", 1, 1, of);                                                             writebytes("\0", 1, 1, of);
                                                                                    >                           next_addr += cl -> len;
                        continue;                                                                               continue;
                }                                                                                       }
                else if (cl -> outputl > 0)                                         |                   else if (cl -> outputl > 0) {
                        writebytes(cl -> output, cl -> outputl, 1, of);                                         writebytes(cl -> output, cl -> outputl, 1, of);
                                                                                    >                           next_addr += cl -> outputl;
                                                                                    >                   }
                                                                                    >
        }                                                                                       }
}                                                                                       }

box)
(unless otherwise marked) Copyright 2002-2014 YakPeople. All rights reserved.
(last modified 2024-03-04)       [Login]
(No back references.)