Improve number and local label handling in asxlat
authorNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 03:00:13 +0000 (13:00 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 03:00:23 +0000 (13:00 +1000)
as0.c

diff --git a/as0.c b/as0.c
index 2938e27..dfe1d2f 100644 (file)
--- a/as0.c
+++ b/as0.c
@@ -684,6 +684,12 @@ void pass0() {
 
                psymbol->flags |= pdot->flags;
                psymbol->value = pdot->value;
+#if TRANSLATE
+ // reset locals
+ xlabnext = 0;
+ memset(xlabb, 0xff, 10 * sizeof(int));
+ memset(xlabf, 0xff, 10 * sizeof(int));
+#endif
                continue;
 
 /* 3: */
@@ -708,9 +714,9 @@ void pass0() {
   xlabf[label] = -1;
  }
  xlabb[label] = xlab;
- if (xstartp >= xbuf + 0xff0)
+ if (xstartpsave >= xbuf + 0xff0)
   abort();
- xbufp = xstartpsave + sprintf(xstartpsave, "_%d:", xlab);
+ xbufp = xstartpsave + sprintf(xstartpsave, "%d$:", xlab);
 #endif
 
 /*     cmp     fbfree,$4               / room for another fb entry? */
@@ -1291,6 +1297,9 @@ int number() {
 /*     add     r0,r1 */
 /*     br      1b */
 
+#ifdef TRANSLATE
+ xstartp = xbufp;
+#endif
        while (1) {
                c = rch();
                if (c < '0' || c > '9')
@@ -1314,18 +1323,32 @@ int number() {
        if (c == 'b' || c == 'f')
                goto label;
        if (c == '.') {
+#ifdef TRANSLATE
+ if (xstartp >= xbuf + 0xff0)
+  abort();
+ xbufp = xstartp + sprintf(xstartp, "%d", decimal);
+#endif
                octal = decimal;
                c = 0;
        }
+#ifdef TRANSLATE
+ else {
+  if (xstartp >= xbuf + 0xff0)
+   abort();
+  xbufp = xstartp + sprintf(xstartp, "%s%o", (octal & ~7) ? "0o" : "", octal);
+ }
+#endif
 
 /*     movb    r0,ch */
 /*     mov     r1,r0 */
 
        ch = c;
-#ifdef TRANSLATE
- if (xbufp <= xbuf)
-  abort();
- --xbufp;
+#if 0 //def TRANSLATE
+ if (c) {
+  if (xbufp <= xbuf)
+   abort();
+  --xbufp;
+ }
 #endif
 /* if (ch) printf("b push 0x%02x\n", ch); */
        numbervalue = octal;
@@ -2061,13 +2084,13 @@ void p0opline() {
   abort();
  switch (flags) {
  case FDOTTEXT:
-  xbufp = xstartp + sprintf(xstartp, ".area TEXT");
+  xbufp = xstartp + sprintf(xstartp, ".area    text");
   break;
  case FDOTDATA:
-  xbufp = xstartp + sprintf(xstartp, ".area DATA");
+  xbufp = xstartp + sprintf(xstartp, ".area    data");
   break;
  case FDOTBSS:
-  xbufp = xstartp + sprintf(xstartp, ".area BSS");
+  xbufp = xstartp + sprintf(xstartp, ".area    bss");
   break;
  }
 #endif
@@ -2810,7 +2833,7 @@ void p0expres() {
 #ifdef TRANSLATE
  if (xstartp >= xbuf + 0xff0)
   abort();
- xbufp = xstartp + sprintf(xstartp, "_%d", xlabb[token - TLABEL]);
+ xbufp = xstartp + sprintf(xstartp, "%d$", xlabb[token - TLABEL]);
 #endif
                                rightflags = curfbr[token - TLABEL];
  /* bug!! should be rightvalue / rightflags below: */
@@ -2826,7 +2849,7 @@ void p0expres() {
    xlabf[xlab] = xlabnext++;
   if (xstartp >= xbuf + 0xff0)
    abort();
-  xbufp = xstartp + sprintf(xstartp, "_%d", xlabf[xlab]);
+  xbufp = xstartp + sprintf(xstartp, "%d$", xlabf[xlab]);
  }
 #endif
                                leftflags = 0;