From e6e1e0ba2b7723b8ba96b41b426b9b3dc5986be2 Mon Sep 17 00:00:00 2001 From: Eric Smith Date: Tue, 21 Nov 2000 02:34:17 +0000 Subject: [PATCH] *** empty log message *** --- dis.h | 3 +- initopts.c | 5 +- main.c | 301 ++++++++++++++++++++++++++++++----------------------- print.c | 2 + ref.c | 2 + tbl.c | 1 + 6 files changed, 182 insertions(+), 132 deletions(-) diff --git a/dis.h b/dis.h index 4a4a2ee..42960d4 100644 --- a/dis.h +++ b/dis.h @@ -1,5 +1,3 @@ -#include - #define NPREDEF 10 extern char *predef[]; @@ -88,6 +86,7 @@ char *get_name(); #define TSTART 261 #define TSTOP 262 #define TRTSTAB 263 +#define TJTAB2 264 extern FILE *yyin, *yyout; int lineno; diff --git a/initopts.c b/initopts.c index 9aa20e7..543034c 100644 --- a/initopts.c +++ b/initopts.c @@ -1,4 +1,3 @@ - /* * * dis [-p predefineds] file @@ -6,6 +5,8 @@ * The -p option may be repeated. */ +#include + #include "dis.h" char *predef[NPREDEF]; @@ -26,7 +27,7 @@ void usage (void) " -c Commodore 64\n" " options: -a assembly output\n" " -p predefs\n" - " -v
alternate vector address", + " -v
alternate vector address\n", progname); exit (1); } diff --git a/main.c b/main.c index 6b79fde..f855f6f 100644 --- a/main.c +++ b/main.c @@ -1,3 +1,6 @@ +#include +#include + #include "dis.h" #define NTSTART 500 @@ -8,12 +11,19 @@ int pre_index = 0; int tstart[NTSTART]; /* .trace directive keep locations */ int tstarti = 0; -#define RTSTAB 50 +#define RTSTAB_MAX 50 -int rtstab_addr [RTSTAB]; /* .rtstab directive */ -int rtstab_size [RTSTAB]; +int rtstab_addr [RTSTAB_MAX]; /* .rtstab directive */ +int rtstab_size [RTSTAB_MAX]; int rtstab_count = 0; +#define JTAB2_MAX 50 + +int jtab2_addr_low [JTAB2_MAX]; /* .jtab2 directive */ +int jtab2_addr_high [JTAB2_MAX]; /* .jtab2 directive */ +int jtab2_size [JTAB2_MAX]; +int jtab2_count = 0; + VALUE token; #ifdef AMIGA @@ -28,6 +38,128 @@ unsigned char f[0x10000]; /* Flags for memory usage */ #define INITLOC 0x2e2 +void crash (char *p) +{ + fprintf(stderr, "%s: %s\n", progname, p); + if (cur_file != NULL) + fprintf(stderr, "Line %d of %s\n", lineno+1, cur_file); +#ifdef AMIGA +free(d); +free(f); +#endif + exit(1); +} + +void trace (unsigned int addr) +{ + int opcode; + register struct info *ip; + int operand; + int istart; + + if (f[addr] & TDONE) + return; + else + f[addr] |= TDONE; + + istart = addr; + opcode = getbyte(addr); + ip = &optbl[opcode]; + + if (ip->flag & ILL) + return; + + f[addr] |= ISOP; + + addr++; + + /* Get the operand */ + + switch(ip->nb) { + case 1: + break; + case 2: + operand = getbyte(addr); + f[addr++] |= TDONE; + break; + case 3: + operand = getword(addr); + f[addr++] |= TDONE; + f[addr++] |= TDONE; + break; + } + + /* Mark data references */ + + switch (ip->flag & ADRMASK) { + case IMM: + case ACC: + case IMP: + case REL: + case IND: + break; + case ABS: + if (ip->flag & (JUMP | FORK)) + break; + /* Fall into */ + case ABX: + case ABY: + case INX: + case INY: + case ZPG: + case ZPX: + case ZPY: + f[operand] |= DREF; + save_ref(istart, operand); + break; + default: + crash("Optable error"); + break; + } + + /* Trace the next instruction */ + + switch (ip->flag & CTLMASK) { + case NORM: + trace(addr); + break; + case JUMP: + f[operand] |= JREF; + save_ref(istart, operand); + trace(operand); + break; + case FORK: + if (ip->flag & REL) { + if (operand > 127) + operand = (~0xff | operand); + operand = operand + addr; + f[operand] |= JREF; + } else { + f[operand] |= SREF; + } + save_ref(istart, operand); + trace(operand); + trace(addr); + break; + case STOP: + break; + default: + crash("Optable error"); + break; + } +} + +void start_trace (unsigned int loc, char *name) +{ + fprintf(stderr, "Trace: %4x %s\n", loc, name); + f[loc] |= (NAMED | SREF); + if (!get_name(loc)) + save_name(loc, name); + save_ref(0, loc); + trace(loc); +} + + void do_ptrace (void) { int i; @@ -59,6 +191,24 @@ void do_rtstab (void) } } +void do_jtab2 (void) +{ + int i, j; + int loc_l, loc_h, code; + for (i = 0; i < jtab2_count; i++) + { + loc_l = jtab2_addr_low [i]; + loc_h = jtab2_addr_high [i]; + for (j = 0; j < jtab2_size [i]; j++) + { + char *trace_sym = (char *) malloc (6); + code = d [loc_l + j] + (d [loc_h + j] << 8); + sprintf (trace_sym, "T%04x", code); + start_trace (code, trace_sym); + } + } +} + main(argc, argv) @@ -102,6 +252,7 @@ f = calloc(0x10000,1); do_ptrace (); do_rtstab (); + do_jtab2 (); dumpitout(); @@ -118,19 +269,6 @@ free(f); -crash(p) -char *p; -{ - fprintf(stderr, "%s: %s\n", progname, p); - if (cur_file != NULL) - fprintf(stderr, "Line %d of %s\n", lineno+1, cur_file); -#ifdef AMIGA -free(d); -free(f); -#endif - exit(1); -} - get_predef() { int loc; @@ -159,6 +297,25 @@ get_predef() rtstab_addr [rtstab_count] = loc; rtstab_size [rtstab_count++] = size; break; + case TJTAB2: + if (yylex() != NUMBER) + crash(".jtab2 needs a number operand"); + if (token.ival > 0x10000 || token.ival < 0) + crash("Number out of range"); + jtab2_addr_low [jtab2_count] = token.ival; + if (yylex() != ',') + crash(".jtab2 needs a comma"); + if (yylex() != NUMBER) + crash(".jtab2 needs a number operand"); + if (token.ival > 0x10000 || token.ival < 0) + crash("Number out of range"); + jtab2_addr_high [jtab2_count] = token.ival; + if (yylex() != ',') + crash(".jtab2 needs a comma"); + if (yylex() != NUMBER) + crash(".jtab2 needs a number operand"); + jtab2_size [jtab2_count++] = token.ival; + break; case TSTART: if (yylex() != NUMBER) crash(".trace needs a number operand"); @@ -398,118 +555,6 @@ binaryloadfile() start_trace ((d [nmi +1] << 8) | d [nmi ], "NMI"); } -start_trace(loc, name) -unsigned int loc; -char *name; -{ - fprintf(stderr, "Trace: %4x %s\n", loc, name); - f[loc] |= (NAMED | SREF); - if (!get_name(loc)) - save_name(loc, name); - save_ref(0, loc); - trace(loc); -} - -trace(addr) -register unsigned int addr; -{ - int opcode; - register struct info *ip; - int operand; - int istart; - - if (f[addr] & TDONE) - return; - else - f[addr] |= TDONE; - - istart = addr; - opcode = getbyte(addr); - ip = &optbl[opcode]; - - if (ip->flag & ILL) - return; - - f[addr] |= ISOP; - - addr++; - - /* Get the operand */ - - switch(ip->nb) { - case 1: - break; - case 2: - operand = getbyte(addr); - f[addr++] |= TDONE; - break; - case 3: - operand = getword(addr); - f[addr++] |= TDONE; - f[addr++] |= TDONE; - break; - } - - /* Mark data references */ - - switch (ip->flag & ADRMASK) { - case IMM: - case ACC: - case IMP: - case REL: - case IND: - break; - case ABS: - if (ip->flag & (JUMP | FORK)) - break; - /* Fall into */ - case ABX: - case ABY: - case INX: - case INY: - case ZPG: - case ZPX: - case ZPY: - f[operand] |= DREF; - save_ref(istart, operand); - break; - default: - crash("Optable error"); - break; - } - - /* Trace the next instruction */ - - switch (ip->flag & CTLMASK) { - case NORM: - trace(addr); - break; - case JUMP: - f[operand] |= JREF; - save_ref(istart, operand); - trace(operand); - break; - case FORK: - if (ip->flag & REL) { - if (operand > 127) - operand = (~0xff | operand); - operand = operand + addr; - f[operand] |= JREF; - } else { - f[operand] |= SREF; - } - save_ref(istart, operand); - trace(operand); - trace(addr); - break; - case STOP: - break; - default: - crash("Optable error"); - break; - } -} - int yywrap() { diff --git a/print.c b/print.c index bc0f055..2bf4bd5 100644 --- a/print.c +++ b/print.c @@ -1,4 +1,6 @@ +#include #include + #include "dis.h" char *strcpy(); diff --git a/ref.c b/ref.c index bcb626b..a0ab551 100644 --- a/ref.c +++ b/ref.c @@ -1,3 +1,5 @@ +#include + #include "dis.h" #define HTSIZE 0x1000 /* Power of 2 */ diff --git a/tbl.c b/tbl.c index 95948ed..49691af 100644 --- a/tbl.c +++ b/tbl.c @@ -1,3 +1,4 @@ +#include #include "dis.h" struct info optbl[256] = {