//
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+// RMAC - Macro Assembler for all Atari computers
// DEBUG.C - Debugging Messages
-// Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2021 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 "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 };
+static PTR tp;
//
//
// Print expression, return ptr to just past the ENDEXPR
//
-TOKEN * printexpr(TOKEN * tp)
+TOKEN * printexpr(TOKEN * tokenptr)
{
- if (tp != NULL)
+ if (tokenptr != NULL)
{
- while (*tp != ENDEXPR)
+ while (*tokenptr != ENDEXPR)
{
- switch ((int)*tp++)
+ switch ((int)*tokenptr++)
{
case SYMBOL:
-// printf("`%s' ", ((SYM *)*tp)->sname);
- printf("`%s' ", symbolPtr[*tp]->sname);
- tp++;
+ printf("'%s' ", symbolPtr[*tokenptr]->sname);
+ tokenptr++;
break;
case CONST:
- printf("$%X ", *tp++);
+ tp.u32 = tokenptr;
+ printf("$%lX ", *tp.u64++);
+ tokenptr = tp.u32;
break;
case ACONST:
- printf("ACONST=($%X,$%X) ", *tp, tp[1]);
- tp += 2;
+ printf("ACONST=($%X,$%X) ", *tokenptr, tokenptr[1]);
+ tokenptr += 2;
break;
default:
- printf("%c ", (char)tp[-1]);
+ printf("%c ", (char)tokenptr[-1]);
break;
}
}
}
-// printf(";\n");
- return tp + 1;
+ return tokenptr + 1;
}
//
// Dump fixup records in printable format
//
-int fudump(CHUNK * ch)
+int fudump(FIXUP * fup)
{
- PTR p;
- char * ep;
- WORD attr, esiz;
- WORD line, file;
- LONG loc;
-
- for(; ch!=NULL;)
+ for(; fup!=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++;
+ uint32_t attr = fup->attr;
+ uint32_t loc = fup->loc;
+ uint16_t file = fup->fileno;
+ uint16_t line = fup->lineno;
- printf("$%04X $%08X %d.%d: ", (int)attr, loc, (int)file, (int)line);
+ printf("$%08X $%08X %d.%d: ", 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' ;", (*p.sy)->sname);
- p.sy++;
- }
+ 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 & 0x0F00) == FU_JR)
- {
- printf(" *=$%X", *p.lp);
- p.lp++;
- }
+ if ((attr & FUMASKRISC) == FU_JR)
+ printf(" *=$%X", fup->orgaddr);
- printf("\n");
- }
+ printf("\n");
- ch = ch->chnext;
+ fup = fup->next;
}
return 0;
mch, (mch->mcptr.lw), mch->mcalloc, (mch->mcused));
p = mch->mcptr;
-
+
for(;;)
{
w = *p.wp++;
// 0 - bytes
// 1 - words
// 2 - longwords
-//
+//
// if `base' is not -1, then print it at the start of each line, incremented
// accordingly.
//
{
printf(" ");
- while(j < i)
+ while (j < i)
visprt(start[j++]);
putchar('\n');
switch (flg & 3)
{
case 0:
- printf("%02X ", start[i] & 0xff);
- ++i;
+ printf("%02X ", start[i] & 0xFF);
+ i++;
break;
case 1:
- printf("%02X%02X ", start[i] & 0xff, start[i+1] & 0xff);
+ 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);
+ 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)
{
k = ((16 - (i - j)) / (1 << (flg & 3))) * siztab[flg & 3];
- while(k--)
+ while (k--)
putchar(' ');
printf(" ");
- while(j < i)
+ while (j < i)
visprt(start[j++]);
putchar('\n');
switch ((int)*tk++)
{
case CONST: // CONST <value>
- printf("CONST=%u", *tk++);
+ 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>
+ case SYMBOL: // SYMBOL <address>
printf("SYMBOL='%s'", string[*tk++]);
break;
- case EOL: // End of line
+ case EOL: // End of line
printf("EOL");
break;
case TKEOF: // End of file (or macro)
printf("TKEOF");
break;
- case DEQUALS: // ==
+ case DEQUALS: // ==
printf("DEQUALS");
break;
- case DCOLON: // ::
+ case DCOLON: // ::
printf("DCOLON");
break;
- case GE: // >=
+ case GE: // >=
printf("GE");
break;
- case LE: // <=
+ case LE: // <=
printf("LE");
break;
- case NE: // <> or !=
+ case NE: // <> or !=
printf("NE");
break;
- case SHR: // >>
+ case SHR: // >>
printf("SHR");
break;
- case SHL: // <<
+ case SHL: // <<
printf("SHL");
break;
default:
}
+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_FILESIZE)
+ printf("[CR_FILESIZE]");
+ 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");
+}
+
+
//
// Dump everything
//
int dump_everything(void)
{
- int i;
+ // FFS
+ if ((currentorg[1] - currentorg[0]) == 0)
+ sect[M6502].sfcode = NULL;
- for(i=1; i<NSECTS; i++)
+ for(int i=1; i<NSECTS; i++)
{
if (sect[i].scattr & SUSED)
{
printf("\nMarks:\n");
mudump(); // Dump marks
-// printf("Total memory allocated=$%X\n", amemtot);
return 0;
}
+