mirror of
https://github.com/brouhaha/dis6502.git
synced 2024-06-07 13:39:33 +00:00
*** empty log message ***
This commit is contained in:
parent
183516d160
commit
e6e1e0ba2b
3
dis.h
3
dis.h
|
@ -1,5 +1,3 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define NPREDEF 10
|
#define NPREDEF 10
|
||||||
|
|
||||||
extern char *predef[];
|
extern char *predef[];
|
||||||
|
@ -88,6 +86,7 @@ char *get_name();
|
||||||
#define TSTART 261
|
#define TSTART 261
|
||||||
#define TSTOP 262
|
#define TSTOP 262
|
||||||
#define TRTSTAB 263
|
#define TRTSTAB 263
|
||||||
|
#define TJTAB2 264
|
||||||
|
|
||||||
extern FILE *yyin, *yyout;
|
extern FILE *yyin, *yyout;
|
||||||
int lineno;
|
int lineno;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* dis [-p predefineds] file
|
* dis [-p predefineds] file
|
||||||
|
@ -6,6 +5,8 @@
|
||||||
* The -p option may be repeated.
|
* The -p option may be repeated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "dis.h"
|
#include "dis.h"
|
||||||
|
|
||||||
char *predef[NPREDEF];
|
char *predef[NPREDEF];
|
||||||
|
@ -26,7 +27,7 @@ void usage (void)
|
||||||
" -c Commodore 64\n"
|
" -c Commodore 64\n"
|
||||||
" options: -a assembly output\n"
|
" options: -a assembly output\n"
|
||||||
" -p <file> predefs\n"
|
" -p <file> predefs\n"
|
||||||
" -v <address> alternate vector address",
|
" -v <address> alternate vector address\n",
|
||||||
progname);
|
progname);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
301
main.c
301
main.c
|
@ -1,3 +1,6 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "dis.h"
|
#include "dis.h"
|
||||||
|
|
||||||
#define NTSTART 500
|
#define NTSTART 500
|
||||||
|
@ -8,12 +11,19 @@ int pre_index = 0;
|
||||||
int tstart[NTSTART]; /* .trace directive keep locations */
|
int tstart[NTSTART]; /* .trace directive keep locations */
|
||||||
int tstarti = 0;
|
int tstarti = 0;
|
||||||
|
|
||||||
#define RTSTAB 50
|
#define RTSTAB_MAX 50
|
||||||
|
|
||||||
int rtstab_addr [RTSTAB]; /* .rtstab directive */
|
int rtstab_addr [RTSTAB_MAX]; /* .rtstab directive */
|
||||||
int rtstab_size [RTSTAB];
|
int rtstab_size [RTSTAB_MAX];
|
||||||
int rtstab_count = 0;
|
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;
|
VALUE token;
|
||||||
|
|
||||||
#ifdef AMIGA
|
#ifdef AMIGA
|
||||||
|
@ -28,6 +38,128 @@ unsigned char f[0x10000]; /* Flags for memory usage */
|
||||||
#define INITLOC 0x2e2
|
#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)
|
void do_ptrace (void)
|
||||||
{
|
{
|
||||||
int i;
|
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)
|
main(argc, argv)
|
||||||
|
@ -102,6 +252,7 @@ f = calloc(0x10000,1);
|
||||||
|
|
||||||
do_ptrace ();
|
do_ptrace ();
|
||||||
do_rtstab ();
|
do_rtstab ();
|
||||||
|
do_jtab2 ();
|
||||||
|
|
||||||
dumpitout();
|
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()
|
get_predef()
|
||||||
{
|
{
|
||||||
int loc;
|
int loc;
|
||||||
|
@ -159,6 +297,25 @@ get_predef()
|
||||||
rtstab_addr [rtstab_count] = loc;
|
rtstab_addr [rtstab_count] = loc;
|
||||||
rtstab_size [rtstab_count++] = size;
|
rtstab_size [rtstab_count++] = size;
|
||||||
break;
|
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:
|
case TSTART:
|
||||||
if (yylex() != NUMBER)
|
if (yylex() != NUMBER)
|
||||||
crash(".trace needs a number operand");
|
crash(".trace needs a number operand");
|
||||||
|
@ -398,118 +555,6 @@ binaryloadfile()
|
||||||
start_trace ((d [nmi +1] << 8) | d [nmi ], "NMI");
|
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
|
int
|
||||||
yywrap()
|
yywrap()
|
||||||
{
|
{
|
||||||
|
|
2
print.c
2
print.c
|
@ -1,4 +1,6 @@
|
||||||
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include "dis.h"
|
#include "dis.h"
|
||||||
|
|
||||||
char *strcpy();
|
char *strcpy();
|
||||||
|
|
2
ref.c
2
ref.c
|
@ -1,3 +1,5 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "dis.h"
|
#include "dis.h"
|
||||||
|
|
||||||
#define HTSIZE 0x1000 /* Power of 2 */
|
#define HTSIZE 0x1000 /* Power of 2 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user