In asxlat, improve .dw and multi line constructs with semicolon
authorNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 03:57:24 +0000 (13:57 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 03:57:24 +0000 (13:57 +1000)
as0.c

diff --git a/as0.c b/as0.c
index 3a48bca..a26ca21 100644 (file)
--- a/as0.c
+++ b/as0.c
@@ -684,7 +684,7 @@ void pass0() {
 
                psymbol->flags |= pdot->flags;
                psymbol->value = pdot->value;
-#if TRANSLATE
+#ifdef TRANSLATE
  // reset locals
  xlabnext = 0;
  memset(xlabb, 0xff, 10 * sizeof(int));
@@ -826,10 +826,18 @@ void pass0() {
 /* printf("ealoop token = 0x%08x\n", token); */
                if (token == TSEMICOLON)
  {
-#if TRANSLATE
-  if (xbufp >= xbuf + 0xff0)
-   abort();
-  xbufp += sprintf(xbufp, "\n");
+#ifdef TRANSLATE
+ xbufp[-1] = '\n';
+
+ // read and ignore whitespace after ;
+ xstartp = xbufp;
+ while (1) {
+  label = rch();
+  if (label != '\t' && label != ' ')
+   break;
+ }
+ ch = label;
+ xbufp = xstartp;
 #endif
                        continue;
  }
@@ -2049,6 +2057,16 @@ int rsch() {
 /* 1: */
 
 void p0xpr() {
+#ifdef TRANSLATE
+ xrestn = xbufp - xstartp;
+ memcpy(xrest, xstartp, xrestn);
+ if (xstartp + xrestn >= xbuf + 0xff0)
+  abort();
+ xbufp = xstartp + sprintf(xstartp, ".dw       ");
+ xstartp = xbufp; // for local labels
+ memcpy(xbufp, xrest, xrestn);
+ xbufp += xrestn;
+#endif
        p0expres();
        pdot->value += 2;
 }
@@ -2066,16 +2084,22 @@ void p0opline() {
 
        if (token >= 0 && token < TASCII) {
                if (token == TSTRING)
-                       p0opl17();
-               else
  {
-#if TRANSLATE
-  if (xbufp >= xbuf + 0xff0)
+#ifdef TRANSLATE
+  xrestn = xbufp - xstartp;
+  memcpy(xrest, xstartp, xrestn);
+  xrest[0] = '/';
+  xrest[xrestn - 1] = '/';
+  if (xstartp + xrestn >= xbuf + 0xff0)
    abort();
-  xbufp += sprintf(xbufp, ".dw ");
+  xbufp = xstartp + sprintf(xstartp, ".ascii   ");
+  memcpy(xbufp, xrest, xrestn);
+  xbufp += xrestn;
 #endif
-                       p0xpr();
+                       p0opl17();
  }
+               else
+                       p0xpr();
                return;
        }
 
@@ -2170,7 +2194,7 @@ void p0opline() {
 /*     opl16 */
 
        case FDOTBYTE:
-#if TRANSLATE
+#ifdef TRANSLATE
  if (xstartp >= xbuf + 0xff0)
   abort();
  xbufp = xstartp + sprintf(xstartp, ".db");
@@ -2180,7 +2204,7 @@ void p0opline() {
 
 #if 1 /* modifications for dec syntax */
        case FDOTWORD:
-#if TRANSLATE
+#ifdef TRANSLATE
  if (xstartp >= xbuf + 0xff0)
   abort();
  xbufp = xstartp + sprintf(xstartp, ".dw");