]> Shamusworld >> Repos - rmac/blobdiff - debug.c
Long forgotten helper script which is used to create tables for VS builds
[rmac] / debug.c
diff --git a/debug.c b/debug.c
index 8c2a8d96201c3eac08f0cf733313d3d034180690..e3ef93fd458b31cb956dcf888ea27cbc1f3869b6 100644 (file)
--- a/debug.c
+++ b/debug.c
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+//
+// RMAC - Reboot's Macro Assembler for all Atari computers
 // DEBUG.C - Debugging Messages
-// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2019 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
+//
 
 #include "debug.h"
-#include "sect.h"
+#include "6502.h"
 #include "amode.h"
+#include "direct.h"
+#include "expr.h"
 #include "mark.h"
+#include "sect.h"
+#include "token.h"
 
-static int siztab[4] = {3, 5, 9, 9};
 
-//
-// --- Print 'c' Visibly ---------------------------------------------------------------------------
-//
+static int siztab[4] = { 3, 5, 9, 9 };
+static PTR tp;
 
-int visprt(char c) {
-   if(c < 0x20 || c >= 0x7f)
-      putchar('.');
-   else
-      putchar(c);
-
-   return(0);
-}
 
 //
-// --- Print expression, return ptr to just past the ENDEXPR ---------------------------------------
+// Print 'c' visibly
 //
-
-TOKEN *printexpr(TOKEN *tp) {
-   if(tp != NULL)
-      while(*tp != ENDEXPR)
-         switch((int)*tp++) {
-            case SYMBOL:
-               printf("`%s' ", ((SYM *)*tp)->sname);
-               ++tp;
-               break;
-            case CONST:
-               printf("$%lx ", *tp++);
-               break;
-            case ACONST:
-               printf("ACONST=($%lx,$%lx) ", *tp, tp[1]);
-               tp += 2;
-               break;
-            default:
-               printf("%c ", (char)tp[-1]);
-               break;
-         }
-   printf(";\n");
-   return(tp + 1);
+int visprt(char c)
+{
+       if (c < 0x20 || c >= 0x7F)
+               putchar('.');
+       else
+               putchar(c);
+
+       return 0;
 }
 
+
 //
-// --- Dump data in a chunk (and maybe others) in the appropriate format ---------------------------
+// Print expression, return ptr to just past the ENDEXPR
 //
+TOKEN * printexpr(TOKEN * tokenptr)
+{
+       if (tokenptr != NULL)
+       {
+               while (*tokenptr != ENDEXPR)
+               {
+                       switch ((int)*tokenptr++)
+                       {
+                       case SYMBOL:
+                               printf("'%s' ", symbolPtr[*tokenptr]->sname);
+                               tokenptr++;
+                               break;
+                       case CONST:
+                               tp.u32 = tokenptr;
+                               printf("$%lX ", *tp.u64++);
+                               tokenptr = tp.u32;
+                               break;
+                       case ACONST:
+                               printf("ACONST=($%X,$%X) ", *tokenptr, tokenptr[1]);
+                               tokenptr += 2;
+                               break;
+                       default:
+                               printf("%c ", (char)tokenptr[-1]);
+                               break;
+                       }
+               }
+       }
+
+       return tokenptr + 1;
+}
 
-int chdump(CHUNK *ch, int format) {
-   while(ch != NULL) {
-      printf("chloc=$%08lx, chsize=$%lx\n", ch->chloc, ch->ch_size);
-      mdump(ch->chptr, ch->ch_size, format, ch->chloc);
-      ch = ch->chnext;
-   }
 
-   return(0);
+//
+// Dump data in a chunk (and maybe others) in the appropriate format
+//
+int chdump(CHUNK * ch, int format)
+{
+       while (ch != NULL)
+       {
+               printf("chloc=$%08X, chsize=$%X\n", ch->chloc, ch->ch_size);
+               mdump(ch->chptr, ch->ch_size, format, ch->chloc);
+               ch = ch->chnext;
+       }
+
+       return 0;
 }
 
+
 //
-// --- Dump fixup records in printable format ------------------------------------------------------
+// Dump fixup records in printable format
 //
-
-int fudump(CHUNK *ch) {
-   PTR p;
-   char *ep;
-   WORD attr, esiz;
-   WORD line, file;
-   LONG loc;
-
-   for(; ch != NULL;) {
-      p.cp = ch->chptr;
-      ep = ch->chptr + ch->ch_size;
-      while(p.cp < ep) {
-         attr = *p.wp++;
-         loc = *p.lp++;
-         file = *p.wp++;
-         line = *p.wp++;
-
-         printf("$%04x $%08lx %d.%d: ", (int)attr, loc, (int)file, (int)line);
-
-         if(attr & FU_EXPR) {
-            esiz = *p.wp++;
-            printf("(%d long) ", (int)esiz);
-            p.tk = printexpr(p.tk);
-         } else {
-            printf("`%s' ;\n", (*p.sy)->sname);
-            ++p.lp;
-         }
-      }
-      ch = ch->chnext;
-   }
-
-   return(0);
+int fudump(FIXUP * fup)
+{
+       for(; fup!=NULL;)
+       {
+               uint32_t attr = fup->attr;
+               uint32_t loc = fup->loc;
+               uint16_t file = fup->fileno;
+               uint16_t line = fup->lineno;
+
+               printf("$%08X $%08X %d.%d: ", attr, loc, (int)file, (int)line);
+
+               if (attr & FU_EXPR)
+               {
+                       uint16_t esiz = ExpressionLength(fup->expr);
+                       printf("(%d long) ", (int)esiz);
+                       printexpr(fup->expr);
+               }
+               else
+                       printf("`%s' ;", fup->symbol->sname);
+
+               if ((attr & FUMASKRISC) == FU_JR)
+                       printf(" *=$%X", fup->orgaddr);
+
+               printf("\n");
+
+               fup = fup->next;
+       }
+
+       return 0;
 }
 
+
 //
-// --- Dump marks ----------------------------------------------------------------------------------
+// Dump marks
 //
+int mudump(void)
+{
+       MCHUNK * mch;
+       PTR p;
+       WORD from;
+       WORD w;
+       LONG loc;
+       SYM * symbol;
+
+       from = 0;
+
+       for(mch=firstmch; mch!=NULL; mch=mch->mcnext)
+       {
+               printf("mch=$%p mcptr=$%08X mcalloc=$%X mcused=$%X\n",
+                       mch, (mch->mcptr.lw), mch->mcalloc, (mch->mcused));
+
+               p = mch->mcptr;
+
+               for(;;)
+               {
+                       w = *p.wp++;
+
+                       if (w & MCHEND)
+                               break;
 
-int mudump(void) {
-   MCHUNK *mch;
-   PTR p;
-   WORD from;
-   WORD w;
-   LONG loc;
-   SYM *symbol;
-
-   from = 0;
-   for(mch = firstmch; mch != NULL; mch = mch->mcnext) {
-      printf("mch=$%08lx mcptr=$%08lx mcalloc=$%lx mcused=$%x\n",
-             mch,
-             mch->mcptr,
-             mch->mcalloc,
-             mch->mcused);
-
-      p = mch->mcptr;
-      for(;;) {
-         w = *p.wp++;
-         if(w & MCHEND)
-            break;
-
-         symbol = NULL;
-         loc = *p.lp++;
-
-         if(w & MCHFROM)
-            from = *p.wp++;
-
-         if(w & MSYMBOL)
-            symbol = *p.sy++;
-
-         printf("m=$%04x to=%d loc=$%lx from=%d siz=%s",
-                 w, w & 0x00ff, loc, from, (w & MLONG) ? "long" : "word");
-
-         if(symbol != NULL)
-            printf(" sym=`%s'", symbol->sname);
-         printf("\n");
-      }
-   }
-
-   return(0);
+                       symbol = NULL;
+                       loc = *p.lp++;
+
+                       if (w & MCHFROM)
+                               from = *p.wp++;
+
+                       if (w & MSYMBOL)
+                               symbol = *p.sy++;
+
+                       printf("m=$%04X to=%d loc=$%X from=%d siz=%s",
+                                       w, w & 0x00FF, loc, from, (w & MLONG) ? "long" : "word");
+
+                       if (symbol != NULL)
+                               printf(" sym=`%s'", symbol->sname);
+
+                       printf("\n");
+               }
+       }
+
+       return 0;
 }
 
+
 //
-// -------------------------------------------------------------------------------------------------
-// Dump memory from 'start' for 'count' bytes; `flg' is the following ORed together:
+// Dump memory from 'start' for 'count' bytes; `flg' is the following ORed
+// together:
 // 0 - bytes
 // 1 - words
 // 2 - longwords
-// 
-// if `base' is not -1, then print it at the start of each line, incremented accordingly.
-// -------------------------------------------------------------------------------------------------
-//
-
-int mdump(char *start, LONG count, int flg, LONG base) {
-   int i, j, k;
-
-   j = 0;
-   for(i = 0; i < (int)count;) {
-      if((i & 15) == 0) {
-         if(j < i) {
-            printf("  ");
-            while(j < i)
-               visprt(start[j++]);
-            putchar('\n');
-         }
-         j = i;
-         if(base != -1)
-            printf("%08lx  ", base);
-      }
-
-      switch(flg & 3) {
-         case 0:
-            printf("%02x ", start[i] & 0xff);
-            ++i;
-            break;
-         case 1:
-            printf("%02x%02x ", start[i] & 0xff, start[i+1] & 0xff);
-            i += 2;
-            break;
-         case 2:
-            printf("%02x%02x%02x%02x ", start[i] & 0xff, start[i+1] & 0xff,
-                   start[i+2] & 0xff, start[i+3] & 0xff);
-            i += 4;
-            break;
-         case 3:
-            break;
-      }
-
-      if(base != -1)
-         base += 1 << (flg & 3);
-   }
-
-   // Print remaining bit of ascii; the hairy expression computes the number of
-   // spaces to print to make the ascii line up nicely.
-   if(j != i) {
-      k = ((16 - (i - j)) / (1 << (flg & 3))) * siztab[flg & 3];
-      while(k--)
-         putchar(' ');
-      printf("  ");
-      while(j < i)
-         visprt(start[j++]);
-      putchar('\n');
-   }
-
-   return(0);
-}
-
 //
-// --- Dump list of tokens on stdout in printable form ---------------------------------------------
+// if `base' is not -1, then print it at the start of each line, incremented
+// accordingly.
 //
-
-int dumptok(TOKEN *tk) {
-   int flg = 0;
-
-   while(*tk != EOL) {
-      if(flg++)
-         printf(" ");
-
-      if(*tk >= 128) {
-         printf("REG=%ld", *tk++ - 128);
-         continue;
-      }
-
-      switch((int)*tk++) {
-         case CONST:                                        // CONST <value>
-            printf("CONST=%ld", *tk++);
-            break;
-         case STRING:                                       // STRING <address>
-            printf("STRING='%s'", *tk++);
-            break;
-         case SYMBOL:                                       // SYMBOL <address> 
-            printf("SYMBOL='%s'", *tk++);
-            break;
-         case EOL:                                          // End of line 
-            printf("EOL");
-            break;
-         case TKEOF:                                        // End of file (or macro)
-            printf("TKEOF");
-            break;
-         case DEQUALS:                                      // == 
-            printf("DEQUALS");
-            break;
-         case DCOLON:                                       // :: 
-            printf("DCOLON");
-            break;
-         case GE:                                           // >= 
-            printf("GE");
-            break;
-         case LE:                                           // <= 
-            printf("LE");
-            break;
-         case NE:                                           // <> or != 
-            printf("NE");
-            break;
-         case SHR:                                          // >> 
-            printf("SHR");
-            break;
-         case SHL:                                          // << 
-            printf("SHL");
-            break;
-         default:
-            printf("%c", tk[-1]);
-            break;
-      }
-   }
-   printf("\n");
-
-   return(0);
+int mdump(char * start, LONG count, int flg, LONG base)
+{
+       int i, j, k;
+       j = 0;
+
+       for(i=0; i<(int)count;)
+       {
+               if ((i & 15) == 0)
+               {
+                       if (j < i)
+                       {
+                               printf("  ");
+
+                               while (j < i)
+                               visprt(start[j++]);
+
+                               putchar('\n');
+                       }
+
+                       j = i;
+
+                       if (base != -1)
+                               printf("%08X  ", base);
+               }
+
+               switch (flg & 3)
+               {
+               case 0:
+                       printf("%02X ", start[i] & 0xFF);
+                       i++;
+                       break;
+               case 1:
+                       printf("%02X%02X ", start[i] & 0xFF, start[i+1] & 0xFF);
+                       i += 2;
+                       break;
+               case 2:
+                       printf("%02X%02X%02X%02X ", start[i] & 0xFF, start[i+1] & 0xFF,
+                               start[i+2] & 0xFF, start[i+3] & 0xFF);
+                       i += 4;
+                       break;
+               }
+
+               if (base != -1)
+                       base += 1 << (flg & 3);
+       }
+
+       // Print remaining bit of ASCII; the hairy expression computes the number
+       // of spaces to print to make the ASCII line up nicely.
+       if (j != i)
+       {
+               k = ((16 - (i - j)) / (1 << (flg & 3))) * siztab[flg & 3];
+
+               while (k--)
+                       putchar(' ');
+
+               printf("  ");
+
+               while (j < i)
+                       visprt(start[j++]);
+
+               putchar('\n');
+       }
+
+       return 0;
 }
 
+
 //
-// --- Dump Everything -----------------------------------------------------------------------------
+// Dump list of tokens on stdout in printable form
 //
+int dumptok(TOKEN * tk)
+{
+       int flg = 0;
+
+       while (*tk != EOL)
+       {
+               if (flg++)
+                       printf(" ");
+
+               if (*tk >= 128)
+               {
+                       printf("REG=%u", *tk++ - 128);
+                       continue;
+               }
+
+               switch ((int)*tk++)
+               {
+               case CONST:                                        // CONST <value>
+                       tp.u32 = tk;
+                       printf("CONST=%lu", *tp.u64++);
+                       tk = tp.u32;
+                       break;
+               case STRING:                                       // STRING <address>
+                       printf("STRING='%s'", string[*tk++]);
+                       break;
+               case SYMBOL:                                       // SYMBOL <address>
+                       printf("SYMBOL='%s'", string[*tk++]);
+                       break;
+               case EOL:                                          // End of line
+                       printf("EOL");
+                       break;
+               case TKEOF:                                        // End of file (or macro)
+                       printf("TKEOF");
+                       break;
+               case DEQUALS:                                      // ==
+                       printf("DEQUALS");
+                       break;
+               case DCOLON:                                       // ::
+                       printf("DCOLON");
+                       break;
+               case GE:                                           // >=
+                       printf("GE");
+                       break;
+               case LE:                                           // <=
+                       printf("LE");
+                       break;
+               case NE:                                           // <> or !=
+                       printf("NE");
+                       break;
+               case SHR:                                          // >>
+                       printf("SHR");
+                       break;
+               case SHL:                                          // <<
+                       printf("SHL");
+                       break;
+               default:
+                       printf("%c", (int)tk[-1]);
+                       break;
+               }
+       }
+
+       printf("\n");
+
+       return 0;
+}
 
-int dump_everything(void) {
-   int i;
-
-   for(i = 1; i < NSECTS; ++i)
-      if(sect[i].scattr & SUSED) {
-         printf("Section %d sloc=$%lx\n", i, sect[i].sloc);
-         printf("Code:\n");
-         chdump(sect[i].sfcode, 1);
-
-         printf("Fixup:\n");
-         fudump(sect[i].sffix);
 
-         printf("\n");
-      }
+void DumpTokens(TOKEN * tokenBuffer)
+{
+//     printf("Tokens [%X]: ", sloc);
+
+       for(TOKEN * t=tokenBuffer; *t!=EOL; t++)
+       {
+               if (*t == COLON)
+                       printf("[COLON]");
+               else if (*t == CONST)
+               {
+                       tp.u32 = t + 1;
+                       printf("[CONST: $%lX]", *tp.u64);
+                       t += 2;
+               }
+               else if (*t == ACONST)
+               {
+                       printf("[ACONST: $%X, $%X]", (uint32_t)t[1], (uint32_t)t[2]);
+                       t += 2;
+               }
+               else if (*t == STRING)
+               {
+                       t++;
+                       printf("[STRING:\"%s\"]", string[*t]);
+               }
+               else if (*t == SYMBOL)
+               {
+                       t++;
+                       printf("[SYMBOL:\"%s\"]", string[*t]);
+               }
+               else if (*t == EOS)
+                       printf("[EOS]");
+               else if (*t == TKEOF)
+                       printf("[TKEOF]");
+               else if (*t == DEQUALS)
+                       printf("[DEQUALS]");
+               else if (*t == SET)
+                       printf("[SET]");
+               else if (*t == REG)
+                       printf("[REG]");
+               else if (*t == DCOLON)
+                       printf("[DCOLON]");
+               else if (*t == GE)
+                       printf("[GE]");
+               else if (*t == LE)
+                       printf("[LE]");
+               else if (*t == NE)
+                       printf("[NE]");
+               else if (*t == SHR)
+                       printf("[SHR]");
+               else if (*t == SHL)
+                       printf("[SHL]");
+               else if (*t == UNMINUS)
+                       printf("[UNMINUS]");
+               else if (*t == DOTB)
+                       printf("[DOTB]");
+               else if (*t == DOTW)
+                       printf("[DOTW]");
+               else if (*t == DOTL)
+                       printf("[DOTL]");
+               else if (*t == DOTI)
+                       printf("[DOTI]");
+               else if (*t == ENDEXPR)
+                       printf("[ENDEXPR]");
+               else if (*t == CR_ABSCOUNT)
+                       printf("[CR_ABSCOUNT]");
+               else if (*t == CR_DEFINED)
+                       printf("[CR_DEFINED]");
+               else if (*t == CR_REFERENCED)
+                       printf("[CR_REFERENCED]");
+               else if (*t == CR_STREQ)
+                       printf("[CR_STREQ]");
+               else if (*t == CR_MACDEF)
+                       printf("[CR_MACDEF]");
+               else if (*t == CR_TIME)
+                       printf("[CR_TIME]");
+               else if (*t == CR_DATE)
+                       printf("[CR_DATE]");
+               else if (*t >= 0x20 && *t <= 0x2F)
+                       printf("[%c]", (char)*t);
+               else if (*t >= 0x3A && *t <= 0x3F)
+                       printf("[%c]", (char)*t);
+               else if (*t >= 0x80 && *t <= 0x87)
+                       printf("[D%u]", ((uint32_t)*t) - 0x80);
+               else if (*t >= 0x88 && *t <= 0x8F)
+                       printf("[A%u]", ((uint32_t)*t) - 0x88);
+               else
+                       printf("[%X:%c]", (uint32_t)*t, (char)*t);
+       }
+
+       printf("[EOL]\n");
+}
 
-   printf("\nMarks:\n");
-   mudump();                                                // Dump marks
-   printf("Total memory allocated=$%lx\n", amemtot);
 
-   return(0);
+//
+// Dump everything
+//
+int dump_everything(void)
+{
+       // FFS
+       if ((currentorg[1] - currentorg[0]) == 0)
+               sect[M6502].sfcode = NULL;
+
+       for(int i=1; i<NSECTS; i++)
+       {
+               if (sect[i].scattr & SUSED)
+               {
+                       printf("Section %d sloc=$%X\n", i, sect[i].sloc);
+                       printf("Code:\n");
+                       chdump(sect[i].sfcode, 1);
+
+                       printf("Fixup:\n");
+                       fudump(sect[i].sffix);
+
+                       printf("\n");
+               }
+       }
+
+       printf("\nMarks:\n");
+       mudump();                                                               // Dump marks
+
+       return 0;
 }
+