X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=debug.c;h=e3ef93fd458b31cb956dcf888ea27cbc1f3869b6;hp=8c2a8d96201c3eac08f0cf733313d3d034180690;hb=c59f7a33730dacf753e066a4002e2f749051a137;hpb=d28f432296e812643e236d1bfc9b556a7b11c461 diff --git a/debug.c b/debug.c index 8c2a8d9..e3ef93f 100644 --- a/debug.c +++ b/debug.c @@ -1,305 +1,443 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////// -// 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 - printf("CONST=%ld", *tk++); - break; - case STRING: // STRING
- printf("STRING='%s'", *tk++); - break; - case SYMBOL: // SYMBOL
- 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 + tp.u32 = tk; + printf("CONST=%lu", *tp.u64++); + tk = tp.u32; + break; + case STRING: // STRING
+ printf("STRING='%s'", string[*tk++]); + break; + case SYMBOL: // SYMBOL
+ 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