mirror of
https://github.com/brouhaha/dis6502.git
synced 2025-01-13 22:32:16 +00:00
Initial revision
This commit is contained in:
commit
cf44f20b54
42
Makefile
Normal file
42
Makefile
Normal file
@ -0,0 +1,42 @@
|
||||
OBJS = main.o initopts.o lex.o ref.o print.o tbl.o
|
||||
SRCS = dis.h main.c initopts.c lex.l ref.c print.c tbl.c
|
||||
CFLAGS = -g
|
||||
|
||||
dis: $(OBJS)
|
||||
cc $(OBJS) -o dis
|
||||
|
||||
tbl.o: dis.h tbl.c
|
||||
cc -c tbl.c
|
||||
|
||||
initopts.o: dis.h initopts.c
|
||||
|
||||
main.o: dis.h main.c
|
||||
|
||||
lex.o: lex.c
|
||||
|
||||
lex.c: dis.h lex.l
|
||||
|
||||
ref.o: dis.h ref.c
|
||||
|
||||
print.o: dis.h print.c
|
||||
|
||||
dis.man: dis.1
|
||||
nroff -man dis.1 > dis.man
|
||||
|
||||
install: dis
|
||||
cp dis /a/rgb/bin/dis6502
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) lex.c dis.man
|
||||
|
||||
clobber: clean
|
||||
rm -f dis
|
||||
|
||||
ckpt: $(SRCS)
|
||||
ci -l $(SRCS)
|
||||
|
||||
lint: dis.h main.c initopts.c lex.c ref.c print.c tbl.c
|
||||
lint dis.h main.c initopts.c lex.c ref.c print.c tbl.c
|
||||
|
||||
shar: Makefile dis.1 $(SRCS)
|
||||
shar -f shar Makefile dis.1 $(SRCS)
|
49
README.Finkelstein
Normal file
49
README.Finkelstein
Normal file
@ -0,0 +1,49 @@
|
||||
|
||||
|
||||
|
||||
Some notes about Robert Bond's 'dis' program, Amiga version.
|
||||
|
||||
|
||||
|
||||
This is a quick & dirty port of a 6502 reverse assembler I that I had under
|
||||
my hand for a long time. I didn't bother optimizing the stuff too much, I
|
||||
just wanted to see it working. This is the sort of 'dirty' ports where you
|
||||
first compiler the original file, then watch the compiler errors, and fix
|
||||
the errors in the file, without looking anywhere else in it. Therefor:
|
||||
|
||||
1) 'dis' requires C:Sort ( too much bother to replace ) & C:Type ( I AM
|
||||
lazy!!!)
|
||||
|
||||
2) I still don't understand why are the line numbers needed in the
|
||||
c64.predef file. I don't have much UNIX experience, and no experience at
|
||||
all with lex. lex code is like chinese to me, but reading the perdef
|
||||
I think that the line numbers are ignored and are used only to easily
|
||||
identify '.eq' lines.
|
||||
|
||||
3) The program is recursive, too much recursive! the trace routine calls
|
||||
itself not only on branches, but every instruction! large stacks ( even
|
||||
50K isn't too much for large programs ), are welcomed... I will modify
|
||||
this as soon as I'll have time. it should be easy to remove recursion in
|
||||
the non branch/jmp instructions. branches must have recursion.
|
||||
|
||||
I also enhanced the original package, and added support for c64 binary file,
|
||||
which wasn't there before. ( It had only ATARI load/boot files ). The C64
|
||||
file format was much simpler than those other 2 formats. To select C64 file
|
||||
format, use the '-c' flag. I also included a c64.predefs file with some C64
|
||||
constant addresses. Also, FYI, lex.c was generated on a SUN from lex.l and
|
||||
then downloaded to the Amiga. lex.c was also __edited__ before compilation.
|
||||
I know that it's a no-no to edit machine-generated files, but it was
|
||||
necessary.
|
||||
|
||||
|
||||
Udi Finkelstein
|
||||
|
||||
10 Glitzenstein st.
|
||||
Tel Aviv 64686 Israel
|
||||
Phone: 972-3-263-927
|
||||
|
||||
BITNET: finkel@taurus.BITNET ( Best )
|
||||
UUCP: ...!uunet!ulysses!attibr!althea!finkel ( Try avoiding this )
|
||||
ARPA: finkel%taurus@cunyvm.cuny.edu ( Same as BITNET )
|
||||
FIDO: Udi Finkelstein ( At 2:40/117 or 2:40/135
|
||||
If you can get there at all!)
|
103
dis.h
Normal file
103
dis.h
Normal file
@ -0,0 +1,103 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#define NPREDEF 10
|
||||
|
||||
extern char *predef[];
|
||||
extern int npredef;
|
||||
extern char *file;
|
||||
extern char *progname;
|
||||
|
||||
extern int bopt;
|
||||
enum boot_mode { UNKNOWN, RAW_BINARY, ATARI_LOAD, C64_LOAD, ATARI_BOOT };
|
||||
extern int base_address, vector_address;
|
||||
|
||||
extern int asmout;
|
||||
#ifndef AMIGA
|
||||
extern unsigned char f[];
|
||||
extern unsigned char d[];
|
||||
#else
|
||||
extern unsigned char *d,*f;
|
||||
#endif
|
||||
|
||||
#define getword(x) (d[x] + (d[x+1] << 8))
|
||||
#define getbyte(x) (d[x])
|
||||
|
||||
/* f bits */
|
||||
|
||||
#define LOADED 1 /* Location loaded */
|
||||
#define JREF 2 /* Referenced as jump/branch dest */
|
||||
#define DREF 4 /* Referenced as data */
|
||||
#define SREF 8 /* Referenced as subroutine dest */
|
||||
#define NAMED 0x10 /* Has a name */
|
||||
#define TDONE 0x20 /* Has been traced */
|
||||
#define ISOP 0x40 /* Is a valid instruction opcode */
|
||||
|
||||
struct info {
|
||||
char opn[4];
|
||||
int nb;
|
||||
int flag;
|
||||
};
|
||||
|
||||
extern struct info optbl[];
|
||||
|
||||
/* Flags */
|
||||
|
||||
/* Where control goes */
|
||||
|
||||
#define NORM 1
|
||||
#define JUMP 2
|
||||
#define FORK 4
|
||||
#define STOP 8
|
||||
|
||||
#define CTLMASK (NORM|JUMP|FORK|STOP)
|
||||
|
||||
/* Instruction format */
|
||||
|
||||
#define IMM 0x20
|
||||
#define ABS 0x40
|
||||
#define ACC 0x80
|
||||
#define IMP 0x100
|
||||
#define INX 0x200
|
||||
#define INY 0x400
|
||||
#define ZPX 0x800
|
||||
#define ABX 0x1000
|
||||
#define ABY 0x2000
|
||||
#define REL 0x4000
|
||||
#define IND 0x8000
|
||||
#define ZPY 0x10000
|
||||
#define ZPG 0x20000
|
||||
#define ILL 0x40000
|
||||
|
||||
#define ADRMASK (IMM|ABS|ACC|IMP|INX|INY|ZPX|ABX|ABY|REL|IND|ZPY|ZPG|ILL)
|
||||
|
||||
struct ref_chain {
|
||||
struct ref_chain *next;
|
||||
int who;
|
||||
};
|
||||
|
||||
struct ref_chain *get_ref();
|
||||
char *get_name();
|
||||
|
||||
/* lex junk */
|
||||
|
||||
#define EQ 256
|
||||
#define NUMBER 257
|
||||
#define NAME 258
|
||||
#define COMMENT 259
|
||||
#define LI 260
|
||||
#define TSTART 261
|
||||
#define TSTOP 262
|
||||
#define TRTSTAB 263
|
||||
|
||||
extern FILE *yyin, *yyout;
|
||||
int lineno;
|
||||
|
||||
int yywrap(), yyerror();
|
||||
char *emalloc();
|
||||
|
||||
typedef union {
|
||||
int ival;
|
||||
char *sval;
|
||||
} VALUE;
|
||||
|
||||
extern VALUE token;
|
63
dis6502.1
Normal file
63
dis6502.1
Normal file
@ -0,0 +1,63 @@
|
||||
.TH DIS6502 1 "1 OCT 1986"
|
||||
.UC 4
|
||||
.SH NAME
|
||||
dis6502 \- Disassemble 6502 object code
|
||||
.SH SYNOPSIS
|
||||
.I dis6502
|
||||
[
|
||||
.I \-b
|
||||
]
|
||||
[
|
||||
.I -p \fIpfile\fP
|
||||
]
|
||||
.I file
|
||||
.LP
|
||||
.SH DESCRIPTION
|
||||
.I Dis6502
|
||||
disassembles 6502 binary files. Binary formats understood include
|
||||
Atari binary files (L menu command) and boot files.
|
||||
Equate and control files can be included via the
|
||||
.I -p
|
||||
option to name well known locations and to control the disassembly
|
||||
process. The output includes a cross reference.
|
||||
.PP
|
||||
The disassembly process is a two pass operation: First the program
|
||||
flow is traced starting with the init and run parameters in the file
|
||||
headers. The dump routine then prints out the information.
|
||||
.PP
|
||||
The command line options are:
|
||||
.TP
|
||||
.I \-b
|
||||
Assume that the file is a boot file, not a load file.
|
||||
.TP
|
||||
.I \-p \fIpfile\fP
|
||||
Read in the predefine file \fIpfile\fP.
|
||||
Up to 20 \fI-p\fP options may be included.
|
||||
.PP
|
||||
Lines in pfile consist of:
|
||||
.PP
|
||||
lineno name .eq number
|
||||
.PP
|
||||
.stop number
|
||||
.PP
|
||||
.trace number
|
||||
.PP
|
||||
.I Lineno
|
||||
refers to a decimal number.
|
||||
.I Number
|
||||
may be a decimal number or
|
||||
may be a hexadecimal number (the first character of the number
|
||||
should be "$"). For example, "$21b5" is
|
||||
the hexadecimal number 21b5.
|
||||
.I Name
|
||||
is a sequence of numbers and characters starting with a
|
||||
letter.
|
||||
.I .trace
|
||||
causes
|
||||
the trace process to continue at the address given.
|
||||
.I .stop
|
||||
causes the
|
||||
trace process to stop at the address given.
|
||||
.SH AUTHOR
|
||||
Robert Bond
|
||||
.SH BUGS
|
95
initopts.c
Normal file
95
initopts.c
Normal file
@ -0,0 +1,95 @@
|
||||
|
||||
/*
|
||||
*
|
||||
* dis [-p predefineds] file
|
||||
*
|
||||
* The -p option may be repeated.
|
||||
*/
|
||||
|
||||
#include "dis.h"
|
||||
|
||||
char *predef[NPREDEF];
|
||||
int npredef = 0;
|
||||
char *file;
|
||||
char *progname = "dis";
|
||||
int bopt = UNKNOWN;
|
||||
int base_address = 0;
|
||||
int vector_address = 0x10000;
|
||||
int asmout = 0;
|
||||
|
||||
void usage (void)
|
||||
{
|
||||
fprintf (stderr, "Usage: %s <format> <options> <object-file>\n"
|
||||
" format: -r <address> raw binary file\n"
|
||||
" -b Atari boot format\n"
|
||||
" -l Atari load format\n"
|
||||
" -c Commodore 64\n"
|
||||
" options: -a assembly output\n"
|
||||
" -p <file> predefs\n"
|
||||
" -v <address> alternate vector address",
|
||||
progname);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
initopts(argc,argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
int ai;
|
||||
char *ca;
|
||||
char *p;
|
||||
int fileset = 0;
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
while (--argc)
|
||||
{
|
||||
if ((*++argv)[0] == '-')
|
||||
{
|
||||
ca = *argv;
|
||||
for(ai = 1; ca[ai] != '\0'; ai++)
|
||||
switch (ca[ai])
|
||||
{
|
||||
case 'a':
|
||||
asmout = 1;
|
||||
break;
|
||||
case 'p':
|
||||
predef[npredef] = *++argv;
|
||||
npredef++;
|
||||
argc--;
|
||||
break;
|
||||
case 'r':
|
||||
base_address = strtoul (*++argv, &p, 0);
|
||||
if (*p)
|
||||
crash ("base address must be specified");
|
||||
bopt = RAW_BINARY;
|
||||
argc--;
|
||||
break;
|
||||
case 'v':
|
||||
vector_address = strtoul (*++argv, &p, 0);
|
||||
if (*p)
|
||||
crash ("address required");
|
||||
argc--;
|
||||
break;
|
||||
case 'l':
|
||||
bopt = ATARI_LOAD;
|
||||
break;
|
||||
case 'c':
|
||||
bopt = C64_LOAD;
|
||||
break;
|
||||
case 'b':
|
||||
bopt = ATARI_BOOT;
|
||||
break;
|
||||
default: crash("Invalid option letter");
|
||||
}
|
||||
}
|
||||
else if (!fileset)
|
||||
{
|
||||
file = *argv;
|
||||
fileset++;
|
||||
}
|
||||
else usage ();
|
||||
}
|
||||
if (!fileset)
|
||||
usage ();
|
||||
}
|
68
lex.l
Normal file
68
lex.l
Normal file
@ -0,0 +1,68 @@
|
||||
%{
|
||||
#undef ECHO
|
||||
#include "dis.h"
|
||||
int lineno = 0;
|
||||
char *strcpy();
|
||||
%}
|
||||
|
||||
digit [0-9]
|
||||
hexdigit [0-9a-fA-F]
|
||||
alpha [a-zA-Z]
|
||||
alphanum [0-9a-zA-Z_]
|
||||
|
||||
%%
|
||||
|
||||
[ \t] { ; }
|
||||
|
||||
[\n] { lineno++; return '\n'; }
|
||||
|
||||
\.[Ee][Qq][Uu] { return EQ; }
|
||||
|
||||
\.[Ee][Qq] { return EQ; }
|
||||
|
||||
\.[Ll][Ii] { return LI; }
|
||||
|
||||
\.[Tt][Rr][Aa][Cc][Ee] { return TSTART; }
|
||||
|
||||
\.[Ss][Tt][Oo][Pp] { return TSTOP; }
|
||||
|
||||
\.[Rr][Tt][Ss][Tt][Aa][Bb] { return TRTSTAB; }
|
||||
|
||||
{digit}+ {
|
||||
(void)sscanf(yytext, "%d", &token.ival);
|
||||
return NUMBER;
|
||||
}
|
||||
|
||||
\${hexdigit}+ {
|
||||
(void)sscanf(yytext+1, "%x", &token.ival);
|
||||
return NUMBER;
|
||||
}
|
||||
|
||||
{alpha}{alphanum}* {
|
||||
token.sval = emalloc((unsigned) strlen(yytext)+1);
|
||||
(void)strcpy((char *)token.sval, (char *)yytext);
|
||||
return NAME;
|
||||
}
|
||||
\*.* {
|
||||
return COMMENT;
|
||||
}
|
||||
\;.* {
|
||||
return COMMENT;
|
||||
}
|
||||
|
||||
. { return yytext[0]; }
|
||||
|
||||
%%
|
||||
|
||||
char *
|
||||
emalloc(n)
|
||||
unsigned n;
|
||||
{
|
||||
char *ptr, *malloc();
|
||||
|
||||
if ((ptr = malloc(n)) == (char *) 0) {
|
||||
(void) fprintf(stderr,"out of core");
|
||||
exit(1);
|
||||
}
|
||||
return ptr;
|
||||
}
|
528
main.c
Normal file
528
main.c
Normal file
@ -0,0 +1,528 @@
|
||||
#include "dis.h"
|
||||
|
||||
#define NTSTART 500
|
||||
|
||||
char *cur_file = NULL; /* the file thats open */
|
||||
int pre_index = 0;
|
||||
|
||||
int tstart[NTSTART]; /* .trace directive keep locations */
|
||||
int tstarti = 0;
|
||||
|
||||
#define RTSTAB 50
|
||||
|
||||
int rtstab_addr [RTSTAB]; /* .rtstab directive */
|
||||
int rtstab_size [RTSTAB];
|
||||
int rtstab_count = 0;
|
||||
|
||||
VALUE token;
|
||||
|
||||
#ifdef AMIGA
|
||||
unsigned char *d,*f; /* Manx has a bug preventing us from declaring arrays >64K */
|
||||
extern unsigned char *calloc();
|
||||
#else
|
||||
unsigned char d[0x10000]; /* The data */
|
||||
unsigned char f[0x10000]; /* Flags for memory usage */
|
||||
#endif
|
||||
|
||||
#define RUNLOC 0x2e0
|
||||
#define INITLOC 0x2e2
|
||||
|
||||
|
||||
void do_ptrace (void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i<tstarti; i++)
|
||||
{
|
||||
char *trace_sym = (char *) malloc (6);
|
||||
sprintf (trace_sym, "P%04x", tstart [i]);
|
||||
start_trace(tstart[i], trace_sym);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void do_rtstab (void)
|
||||
{
|
||||
int i, j;
|
||||
int loc, code;
|
||||
|
||||
for (i = 0; i < rtstab_count; i++)
|
||||
{
|
||||
loc = rtstab_addr [i];
|
||||
for (j = 0; j < rtstab_size [i]; j++)
|
||||
{
|
||||
char *trace_sym = (char *) malloc (6);
|
||||
code = d [loc] + (d [loc + 1] << 8) + 1;
|
||||
sprintf (trace_sym, "T%04x", code);
|
||||
start_trace (code, trace_sym);
|
||||
loc += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifdef AMIGA
|
||||
d = calloc(0x10000,1);
|
||||
f = calloc(0x10000,1);
|
||||
#endif
|
||||
|
||||
initopts(argc, argv);
|
||||
if (npredef > 0) {
|
||||
cur_file = predef[0];
|
||||
pre_index++;
|
||||
yyin = fopen(cur_file, "r");
|
||||
if (!yyin)
|
||||
crash ("Cant open predefine file");
|
||||
get_predef();
|
||||
}
|
||||
|
||||
switch (bopt)
|
||||
{
|
||||
case RAW_BINARY:
|
||||
binaryloadfile();
|
||||
break;
|
||||
case ATARI_LOAD:
|
||||
loadfile();
|
||||
break;
|
||||
case C64_LOAD:
|
||||
c64loadfile();
|
||||
break;
|
||||
case ATARI_BOOT:
|
||||
loadboot();
|
||||
break;
|
||||
default:
|
||||
crash ("file format must be specified");
|
||||
}
|
||||
|
||||
do_ptrace ();
|
||||
do_rtstab ();
|
||||
|
||||
dumpitout();
|
||||
|
||||
#ifdef AMIGA
|
||||
free(d);
|
||||
free(f);
|
||||
#endif
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
int size;
|
||||
char *name;
|
||||
|
||||
for(;;)
|
||||
switch (yylex()) {
|
||||
case '\n':
|
||||
break;
|
||||
case COMMENT:
|
||||
break;
|
||||
case 0:
|
||||
return;
|
||||
case TRTSTAB:
|
||||
if (yylex() != NUMBER)
|
||||
crash(".rtstab needs an address operand");
|
||||
loc = token.ival;
|
||||
if (loc > 0x10000 || loc < 0)
|
||||
crash("Number out of range");
|
||||
if (yylex() != ',')
|
||||
crash(".rtstab needs a comma");
|
||||
if (yylex() != NUMBER)
|
||||
crash(".rtstab needs a comma");
|
||||
size = token.ival;
|
||||
rtstab_addr [rtstab_count] = loc;
|
||||
rtstab_size [rtstab_count++] = size;
|
||||
break;
|
||||
case TSTART:
|
||||
if (yylex() != NUMBER)
|
||||
crash(".trace needs a number operand");
|
||||
loc = token.ival;
|
||||
if (loc > 0x10000 || loc < 0)
|
||||
crash("Number out of range");
|
||||
if (tstarti == NTSTART)
|
||||
crash("Too many .trace directives");
|
||||
tstart[tstarti++] = loc;
|
||||
while (yylex() != '\n')
|
||||
;
|
||||
break;
|
||||
case TSTOP:
|
||||
if (yylex() != NUMBER)
|
||||
crash(".stop needs a number operand");
|
||||
loc = token.ival;
|
||||
if (loc > 0x10000 || loc < 0)
|
||||
crash("Number out of range");
|
||||
f[loc] |= TDONE;
|
||||
while (yylex() != '\n')
|
||||
;
|
||||
break;
|
||||
case NUMBER:
|
||||
switch (yylex()) {
|
||||
case LI:
|
||||
case COMMENT:
|
||||
while (yylex() != '\n')
|
||||
;
|
||||
break;
|
||||
case '\n':
|
||||
break;
|
||||
case NAME:
|
||||
name = token.sval;
|
||||
if (yylex() != EQ)
|
||||
crash("Only EQ and LI supported in defines file");
|
||||
if (yylex() != NUMBER)
|
||||
crash("EQ operand must be a number");
|
||||
loc = token.ival;
|
||||
if (loc > 0x10000 || loc < 0)
|
||||
crash("Number out of range");
|
||||
f[loc] |= NAMED;
|
||||
save_name(loc, name);
|
||||
while (yylex() != '\n')
|
||||
;
|
||||
break;
|
||||
default:
|
||||
crash("Invalid line in predef file");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
crash("Invalid line in predef file");
|
||||
}
|
||||
}
|
||||
|
||||
loadboot()
|
||||
{
|
||||
struct boot_hdr {
|
||||
unsigned char flags;
|
||||
unsigned char nsec;
|
||||
unsigned char base_low;
|
||||
unsigned char base_hi;
|
||||
unsigned char init_low;
|
||||
unsigned char init_hi;
|
||||
} bh;
|
||||
|
||||
FILE *fp;
|
||||
int base_addr;
|
||||
register int i;
|
||||
int len;
|
||||
|
||||
fp = fopen(file, "r");
|
||||
cur_file = NULL;
|
||||
if (!fp) {
|
||||
fprintf(stderr, "Cant open %s\n", file);
|
||||
|
||||
#ifdef AMIGA
|
||||
free(d);
|
||||
free(f);
|
||||
#endif
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(fread((char *)&bh, sizeof(bh), 1, fp) != 1)
|
||||
crash("Input too short");
|
||||
|
||||
base_addr = bh.base_low + (bh.base_hi << 8);
|
||||
len = bh.nsec * 128;
|
||||
rewind(fp);
|
||||
if (fread((char *)&d[base_addr], 1, len, fp) != len)
|
||||
crash("input too short");
|
||||
|
||||
for(i = base_addr; len > 0; len--)
|
||||
f[i++] |= LOADED;
|
||||
|
||||
start_trace(base_addr+6, "**BOOT**");
|
||||
}
|
||||
|
||||
|
||||
loadfile()
|
||||
{
|
||||
FILE *fp;
|
||||
int base_addr;
|
||||
int last_addr;
|
||||
register int i;
|
||||
int had_header;
|
||||
int tmp;
|
||||
|
||||
had_header = 0;
|
||||
fp = fopen(file, "r");
|
||||
cur_file = NULL;
|
||||
if (!fp) {
|
||||
fprintf(stderr, "Cant open %s\n", file);
|
||||
|
||||
#ifdef AMIGA
|
||||
free(d);
|
||||
free(f);
|
||||
#endif
|
||||
|
||||
exit(1);
|
||||
}
|
||||
for(;;) {
|
||||
|
||||
i = getc(fp);
|
||||
|
||||
if (i == EOF) {
|
||||
if (f[RUNLOC] & LOADED & f[RUNLOC+1]) {
|
||||
i = getword(RUNLOC);
|
||||
start_trace(i, "**RUN**");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
i = i | (getc(fp) << 8);
|
||||
if (i == 0xffff) {
|
||||
had_header = 1;
|
||||
base_addr = getc(fp);
|
||||
base_addr = base_addr | (getc(fp) << 8);
|
||||
if (base_addr < 0 || base_addr > 0xffff)
|
||||
crash("Invalid base addr in input file");
|
||||
} else {
|
||||
if (!had_header)
|
||||
crash("Invalid header in input file");
|
||||
base_addr = i;
|
||||
}
|
||||
|
||||
last_addr = getc(fp);
|
||||
last_addr = last_addr | (getc(fp) << 8);
|
||||
if (last_addr < base_addr || last_addr > 0xffff)
|
||||
crash("Invalid length in input file");
|
||||
|
||||
printf("Load: %4x -> %4x\n", base_addr, last_addr);
|
||||
for(i = base_addr; i <= last_addr; i++) {
|
||||
tmp = getc(fp);
|
||||
if (tmp == EOF)
|
||||
crash("File too small");
|
||||
d[i] = tmp;
|
||||
f[i] |= LOADED;
|
||||
}
|
||||
|
||||
if (f[INITLOC] & LOADED & f[INITLOC+1]) {
|
||||
i = getword(INITLOC);
|
||||
start_trace(i, "**INIT**");
|
||||
}
|
||||
|
||||
f[INITLOC] &= ~LOADED;
|
||||
f[INITLOC+1] &= ~LOADED;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
c64loadfile()
|
||||
{
|
||||
FILE *fp;
|
||||
unsigned int base_addr,i;
|
||||
int c;
|
||||
|
||||
fp = fopen(file, "r");
|
||||
cur_file = NULL;
|
||||
if (!fp) {
|
||||
fprintf(stderr, "Cant open %s\n", file);
|
||||
|
||||
#ifdef AMIGA
|
||||
free(d);
|
||||
free(f);
|
||||
#endif
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
base_addr = getc(fp);
|
||||
i = ( base_addr += ( (unsigned int)getc(fp) << 8 ) );
|
||||
|
||||
while( (c = getc(fp)) != EOF) {
|
||||
d[i] = c;
|
||||
f[i++] |= LOADED;
|
||||
}
|
||||
|
||||
start_trace(base_addr, "**C64BIN**");
|
||||
}
|
||||
|
||||
|
||||
binaryloadfile()
|
||||
{
|
||||
FILE *fp;
|
||||
unsigned int i;
|
||||
int c;
|
||||
unsigned int reset, irq, nmi;
|
||||
|
||||
fp = fopen (file, "r");
|
||||
|
||||
cur_file = NULL;
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
fprintf (stderr, "Can't open %s\n", file);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
i = base_address;
|
||||
|
||||
while ((c = getc(fp)) != EOF)
|
||||
{
|
||||
d [i] = c;
|
||||
f [i++] |= LOADED;
|
||||
}
|
||||
|
||||
reset = vector_address - 4;
|
||||
irq = vector_address - 2;
|
||||
nmi = vector_address - 6;
|
||||
|
||||
fprintf (stderr, "base: %04x reset: %04x irq: %04x nmi: %04x\n", base_address, reset, irq, nmi);
|
||||
|
||||
start_trace ((d [reset+1] << 8) | d [reset], "RESET");
|
||||
start_trace ((d [irq +1] << 8) | d [irq ], "IRQ");
|
||||
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()
|
||||
{
|
||||
(void)fclose(yyin);
|
||||
if (npredef == pre_index) {
|
||||
return(1);
|
||||
} else {
|
||||
lineno = 0;
|
||||
cur_file = predef[pre_index];
|
||||
pre_index++;
|
||||
yyin = fopen(cur_file, "r");
|
||||
if (!yyin)
|
||||
crash("Can't open predefines file");
|
||||
return (0);
|
||||
}
|
||||
}
|
295
print.c
Normal file
295
print.c
Normal file
@ -0,0 +1,295 @@
|
||||
#include <ctype.h>
|
||||
#include "dis.h"
|
||||
|
||||
char *strcpy();
|
||||
char *strcat();
|
||||
|
||||
dumpitout()
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i<0x10000;)
|
||||
{
|
||||
if (f[i] & LOADED)
|
||||
{
|
||||
if ((i == 0) || (! (f[i-1] & LOADED)))
|
||||
printf ("\t.org\t$%04x\n", i);
|
||||
|
||||
if (f[i] & SREF && f[i] & ISOP)
|
||||
printf("\n");
|
||||
|
||||
if (! asmout)
|
||||
{
|
||||
printf("%04x ",i);
|
||||
print_bytes(i);
|
||||
}
|
||||
if (print_label(i))
|
||||
printf (":");
|
||||
printf ("\t");
|
||||
if (f[i] & ISOP)
|
||||
i += print_inst(i);
|
||||
else
|
||||
i += print_data(i);
|
||||
printf("\n");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (print_label (i))
|
||||
{
|
||||
if (i <= 0xff)
|
||||
printf ("\t.equ\t$%02x\n", i);
|
||||
else
|
||||
printf ("\t.equ\t$%04x\n", i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (! asmout)
|
||||
print_refs();
|
||||
}
|
||||
|
||||
pchar(c)
|
||||
int c;
|
||||
{
|
||||
if (isascii(c) && isprint(c))
|
||||
return(c);
|
||||
return('.');
|
||||
}
|
||||
|
||||
char *
|
||||
lname(i)
|
||||
int i;
|
||||
{
|
||||
static char buf[20];
|
||||
char t;
|
||||
|
||||
if (f[i] & NAMED)
|
||||
return(get_name(i));
|
||||
if ((i > 0) && ((f[i-1] & (NAMED | DREF)) == (NAMED | DREF))) {
|
||||
(void)strcpy(buf, get_name(i-1));
|
||||
(void)strcat(buf, "+1");
|
||||
return (buf);
|
||||
}
|
||||
if (f[i] & SREF)
|
||||
t = 'S';
|
||||
else if (f[i] & JREF)
|
||||
t = 'L';
|
||||
else if (f[i] & DREF)
|
||||
{
|
||||
if (i <= 0xff)
|
||||
t = 'Z';
|
||||
else
|
||||
t = 'D';
|
||||
}
|
||||
else
|
||||
t = 'X';
|
||||
|
||||
if (i <= 0xff)
|
||||
(void)sprintf(buf, "%c%02x", t, i);
|
||||
else
|
||||
(void)sprintf(buf, "%c%04x", t, i);
|
||||
|
||||
return (buf);
|
||||
}
|
||||
|
||||
print_label(i)
|
||||
{
|
||||
if (f[i] & (NAMED | JREF | SREF | DREF))
|
||||
{
|
||||
printf("%s", lname(i));
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
print_bytes(addr)
|
||||
int addr;
|
||||
{
|
||||
register struct info *ip;
|
||||
|
||||
if ((f[addr] & ISOP) == 0) {
|
||||
printf(" ");
|
||||
return;
|
||||
}
|
||||
|
||||
ip = &optbl[getbyte(addr)];
|
||||
|
||||
switch (ip->nb) {
|
||||
case 1:
|
||||
printf("%02x ", getbyte(addr));
|
||||
break;
|
||||
case 2:
|
||||
printf("%02x %02x ", getbyte(addr), getbyte(addr+1));
|
||||
break;
|
||||
case 3:
|
||||
printf("%02x %02x %02x ", getbyte(addr), getbyte(addr+1), getbyte(addr+2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
print_inst(addr)
|
||||
int addr;
|
||||
{
|
||||
int opcode;
|
||||
register struct info *ip;
|
||||
int operand;
|
||||
|
||||
opcode = getbyte(addr);
|
||||
ip = &optbl[opcode];
|
||||
|
||||
printf("%s", ip->opn);
|
||||
|
||||
addr++;
|
||||
|
||||
switch(ip->nb) {
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
operand = getbyte(addr);
|
||||
break;
|
||||
case 3:
|
||||
operand = getword(addr);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ip->flag & REL) {
|
||||
if (operand > 127)
|
||||
operand = (~0xff | operand);
|
||||
operand = operand + ip->nb + addr - 1;
|
||||
}
|
||||
|
||||
switch (ip->flag & ADRMASK) {
|
||||
case IMM:
|
||||
printf("\t#$%02x\t; %d %c", operand, operand, pchar(operand));
|
||||
break;
|
||||
case ACC:
|
||||
case IMP:
|
||||
break;
|
||||
case REL:
|
||||
case ABS:
|
||||
case ZPG:
|
||||
printf("\t%s", lname(operand));
|
||||
break;
|
||||
case IND:
|
||||
printf("\t(%s)", lname(operand));
|
||||
break;
|
||||
case ABX:
|
||||
case ZPX:
|
||||
printf("\t%s,X", lname(operand));
|
||||
break;
|
||||
case ABY:
|
||||
case ZPY:
|
||||
printf("\t%s,Y", lname(operand));
|
||||
break;
|
||||
case INX:
|
||||
printf("\t(%s,X)", lname(operand));
|
||||
break;
|
||||
case INY:
|
||||
printf("\t(%s),Y", lname(operand));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return(ip->nb);
|
||||
|
||||
}
|
||||
|
||||
print_data(i)
|
||||
{
|
||||
int count;
|
||||
int j;
|
||||
int start;
|
||||
|
||||
start = i;
|
||||
printf(".byte\t$%02x", getbyte(i));
|
||||
count = 1;
|
||||
i++;
|
||||
|
||||
for (j = 1; j < 8; j++) {
|
||||
if (f[i] & (JREF | SREF | DREF) || ((f[i] & LOADED) == 0))
|
||||
break;
|
||||
else
|
||||
printf(",$%02x", getbyte(i));
|
||||
i++;
|
||||
count++;
|
||||
}
|
||||
for (j = count; j < 8; j++)
|
||||
printf(" ");
|
||||
|
||||
printf("\t; \"");
|
||||
|
||||
for (j = start; j < i ; j++)
|
||||
printf("%c", pchar((int)getbyte(j)));
|
||||
|
||||
printf ("\"");
|
||||
|
||||
return (count);
|
||||
}
|
||||
|
||||
print_refs()
|
||||
{
|
||||
char tname[50];
|
||||
char cmd[200];
|
||||
FILE *fp;
|
||||
register struct ref_chain *rp;
|
||||
register int i;
|
||||
int npline;
|
||||
|
||||
#ifndef AMIGA
|
||||
(void)sprintf(tname, "dis.%d", getpid());
|
||||
(void)sprintf(cmd, "sort %s; rm %s", tname, tname);
|
||||
#else
|
||||
(void)sprintf(tname, "dis.%ld", FindTask(0L));
|
||||
(void)sprintf(cmd, "Sort from %s to %s", tname, &tname[3] );
|
||||
#endif
|
||||
|
||||
fp = fopen(tname, "w");
|
||||
if (!fp)
|
||||
crash("Cant open temporary file/n");
|
||||
|
||||
for (i = 0; i<0x10000; i++) {
|
||||
if(f[i] & (JREF|SREF|DREF)) {
|
||||
rp = get_ref(i);
|
||||
if (!rp) {
|
||||
fprintf(stderr, "No ref %d\n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(fp, "%-8s %04x ", lname(i), i);
|
||||
npline = 0;
|
||||
while (rp) {
|
||||
fprintf(fp, "%04x ", rp->who);
|
||||
npline++;
|
||||
if (npline == 12) {
|
||||
fprintf(fp,"\n");
|
||||
fprintf(fp,"%-8s %04x ",lname(i),i);
|
||||
npline = 0;
|
||||
}
|
||||
rp = rp->next;
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
(void)fclose(fp);
|
||||
|
||||
printf("\n\n\n\n\nCross References\n\n");
|
||||
printf("%-8s Value References\n", "Symbol");
|
||||
(void)fflush (stdout);
|
||||
|
||||
#ifndef AMIGA
|
||||
(void)system(cmd);
|
||||
#else
|
||||
(void)Execute(cmd,0L,0L);
|
||||
(void)sprintf(cmd, "Type %s",&tname[3]);
|
||||
(void)Execute(cmd,0L,Output());
|
||||
DeleteFile(tname);
|
||||
DeleteFile(&tname[3]);
|
||||
#endif
|
||||
}
|
90
ref.c
Normal file
90
ref.c
Normal file
@ -0,0 +1,90 @@
|
||||
#include "dis.h"
|
||||
|
||||
#define HTSIZE 0x1000 /* Power of 2 */
|
||||
#define HTMASK (HTSIZE-1)
|
||||
|
||||
struct hashslot {
|
||||
int addr; /* The key */
|
||||
struct ref_chain *ref; /* Who references it */
|
||||
char *name; /* The symbolic name (if it has one) */
|
||||
};
|
||||
|
||||
struct hashslot hashtbl[HTSIZE]; /* the hash table */
|
||||
|
||||
struct hashslot *
|
||||
hash(loc, allocate)
|
||||
int loc;
|
||||
int allocate;
|
||||
{
|
||||
int probes;
|
||||
register struct hashslot *hp;
|
||||
|
||||
hp = &hashtbl[loc & HTMASK];
|
||||
probes = 0;
|
||||
|
||||
while (probes< HTSIZE) {
|
||||
if (hp->addr == loc)
|
||||
return(hp);
|
||||
if (hp->name == NULL && hp->ref == NULL) {
|
||||
if (allocate) {
|
||||
hp->addr = loc;
|
||||
return(hp);
|
||||
} else {
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
hp++;
|
||||
if (hp == &hashtbl[HTSIZE])
|
||||
hp = &hashtbl[0];
|
||||
probes++;
|
||||
}
|
||||
|
||||
crash("Hash table full");
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
save_ref(refer, refee)
|
||||
int refer;
|
||||
int refee;
|
||||
{
|
||||
struct ref_chain *rc;
|
||||
struct hashslot *hp;
|
||||
|
||||
rc = (struct ref_chain *)emalloc(sizeof(*rc));
|
||||
rc->who = refer;
|
||||
hp = hash(refee, 1);
|
||||
rc->next = hp->ref;
|
||||
hp->ref = rc;
|
||||
}
|
||||
|
||||
save_name(loc, name)
|
||||
int loc;
|
||||
char *name;
|
||||
{
|
||||
struct hashslot *hp;
|
||||
|
||||
hp = hash(loc, 1);
|
||||
hp->name = name;
|
||||
}
|
||||
|
||||
struct ref_chain *
|
||||
get_ref(loc)
|
||||
{
|
||||
struct hashslot *hp;
|
||||
|
||||
hp = hash(loc, 0);
|
||||
if (!hp)
|
||||
return(NULL);
|
||||
return(hp->ref);
|
||||
}
|
||||
|
||||
char *
|
||||
get_name(loc)
|
||||
{
|
||||
struct hashslot *hp;
|
||||
|
||||
hp = hash(loc, 0);
|
||||
if (!hp)
|
||||
return(NULL);
|
||||
return(hp->name);
|
||||
}
|
260
tbl.c
Normal file
260
tbl.c
Normal file
@ -0,0 +1,260 @@
|
||||
#include "dis.h"
|
||||
|
||||
struct info optbl[256] = {
|
||||
/* 00 */ { { 'B', 'R', 'K', 0, }, 1, IMP|STOP, },
|
||||
/* 01 */ { { 'O', 'R', 'A', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 05 */ { { 'O', 'R', 'A', 0, }, 2, ZPG|NORM, },
|
||||
/* 06 */ { { 'A', 'S', 'L', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 08 */ { { 'P', 'H', 'P', 0, }, 1, IMP|NORM, },
|
||||
/* 09 */ { { 'O', 'R', 'A', 0, }, 2, IMM|NORM, },
|
||||
/* 0a */ { { 'A', 'S', 'L', 0, }, 1, ACC|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 0d */ { { 'O', 'R', 'A', 0, }, 3, ABS|NORM, },
|
||||
/* 0e */ { { 'A', 'S', 'L', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 10 */ { { 'B', 'P', 'L', 0, }, 2, REL|FORK, },
|
||||
/* 11 */ { { 'O', 'R', 'A', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 15 */ { { 'O', 'R', 'A', 0, }, 2, ZPX|NORM, },
|
||||
/* 16 */ { { 'A', 'S', 'L', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 18 */ { { 'C', 'L', 'C', 0, }, 1, IMP|NORM, },
|
||||
/* 19 */ { { 'O', 'R', 'A', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 1d */ { { 'O', 'R', 'A', 0, }, 3, ABX|NORM, },
|
||||
/* 1e */ { { 'A', 'S', 'L', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 20 */ { { 'J', 'S', 'R', 0, }, 3, ABS|FORK, },
|
||||
/* 21 */ { { 'A', 'N', 'D', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 24 */ { { 'B', 'I', 'T', 0, }, 2, ZPG|NORM, },
|
||||
/* 25 */ { { 'A', 'N', 'D', 0, }, 2, ZPG|NORM, },
|
||||
/* 26 */ { { 'R', 'O', 'L', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 28 */ { { 'P', 'L', 'P', 0, }, 1, IMP|NORM, },
|
||||
/* 29 */ { { 'A', 'N', 'D', 0, }, 2, IMM|NORM, },
|
||||
/* 2a */ { { 'R', 'O', 'L', 0, }, 1, ACC|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 2c */ { { 'B', 'I', 'T', 0, }, 3, ABS|NORM, },
|
||||
/* 2d */ { { 'A', 'N', 'D', 0, }, 3, ABS|NORM, },
|
||||
/* 2e */ { { 'R', 'O', 'L', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 30 */ { { 'B', 'M', 'I', 0, }, 2, REL|FORK, },
|
||||
/* 31 */ { { 'A', 'N', 'D', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 35 */ { { 'A', 'N', 'D', 0, }, 2, ZPX|NORM, },
|
||||
/* 36 */ { { 'R', 'O', 'L', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 38 */ { { 'S', 'E', 'C', 0, }, 1, IMP|NORM, },
|
||||
/* 39 */ { { 'A', 'N', 'D', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 3d */ { { 'A', 'N', 'D', 0, }, 3, ABX|NORM, },
|
||||
/* 3e */ { { 'R', 'O', 'L', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 40 */ { { 'R', 'T', 'I', 0, }, 1, IMP|STOP, },
|
||||
/* 41 */ { { 'E', 'O', 'R', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 45 */ { { 'E', 'O', 'R', 0, }, 2, ZPG|NORM, },
|
||||
/* 46 */ { { 'L', 'S', 'R', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 48 */ { { 'P', 'H', 'A', 0, }, 1, IMP|NORM, },
|
||||
/* 49 */ { { 'E', 'O', 'R', 0, }, 2, IMM|NORM, },
|
||||
/* 4a */ { { 'L', 'S', 'R', 0, }, 1, ACC|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 4c */ { { 'J', 'M', 'P', 0, }, 3, ABS|JUMP, },
|
||||
/* 4d */ { { 'E', 'O', 'R', 0, }, 3, ABS|NORM, },
|
||||
/* 4e */ { { 'L', 'S', 'R', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 50 */ { { 'B', 'V', 'C', 0, }, 2, REL|FORK, },
|
||||
/* 51 */ { { 'E', 'O', 'R', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 55 */ { { 'E', 'O', 'R', 0, }, 2, ZPX|NORM, },
|
||||
/* 56 */ { { 'L', 'S', 'R', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 58 */ { { 'C', 'L', 'I', 0, }, 1, IMP|NORM, },
|
||||
/* 59 */ { { 'E', 'O', 'R', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 5d */ { { 'E', 'O', 'R', 0, }, 3, ABX|NORM, },
|
||||
/* 5e */ { { 'L', 'S', 'R', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 60 */ { { 'R', 'T', 'S', 0, }, 1, IMP|STOP, },
|
||||
/* 61 */ { { 'A', 'D', 'C', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 65 */ { { 'A', 'D', 'C', 0, }, 2, ZPG|NORM, },
|
||||
/* 66 */ { { 'R', 'O', 'R', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 68 */ { { 'P', 'L', 'A', 0, }, 1, IMP|NORM, },
|
||||
/* 69 */ { { 'A', 'D', 'C', 0, }, 2, IMM|NORM, },
|
||||
/* 6a */ { { 'R', 'O', 'R', 0, }, 1, ACC|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 6c */ { { 'J', 'M', 'P', 0, }, 3, IND|STOP, },
|
||||
/* 6d */ { { 'A', 'D', 'C', 0, }, 3, ABS|NORM, },
|
||||
/* 6e */ { { 'R', 'O', 'R', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 70 */ { { 'B', 'V', 'S', 0, }, 2, REL|FORK, },
|
||||
/* 71 */ { { 'A', 'D', 'C', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 75 */ { { 'A', 'D', 'C', 0, }, 2, ZPX|NORM, },
|
||||
/* 76 */ { { 'R', 'O', 'R', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 78 */ { { 'S', 'E', 'I', 0, }, 1, IMP|NORM, },
|
||||
/* 79 */ { { 'A', 'D', 'C', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 7d */ { { 'A', 'D', 'C', 0, }, 3, ABX|NORM, },
|
||||
/* 7e */ { { 'R', 'O', 'R', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 81 */ { { 'S', 'T', 'A', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 84 */ { { 'S', 'T', 'Y', 0, }, 2, ZPG|NORM, },
|
||||
/* 85 */ { { 'S', 'T', 'A', 0, }, 2, ZPG|NORM, },
|
||||
/* 86 */ { { 'S', 'T', 'X', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 88 */ { { 'D', 'E', 'Y', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 8a */ { { 'T', 'X', 'A', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 8c */ { { 'S', 'T', 'Y', 0, }, 3, ABS|NORM, },
|
||||
/* 8d */ { { 'S', 'T', 'A', 0, }, 3, ABS|NORM, },
|
||||
/* 8e */ { { 'S', 'T', 'X', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 90 */ { { 'B', 'C', 'C', 0, }, 2, REL|FORK, },
|
||||
/* 91 */ { { 'S', 'T', 'A', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 94 */ { { 'S', 'T', 'Y', 0, }, 2, ZPX|NORM, },
|
||||
/* 95 */ { { 'S', 'T', 'A', 0, }, 2, ZPX|NORM, },
|
||||
/* 96 */ { { 'S', 'T', 'X', 0, }, 2, ZPY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 98 */ { { 'T', 'Y', 'A', 0, }, 1, IMP|NORM, },
|
||||
/* 99 */ { { 'S', 'T', 'A', 0, }, 3, ABY|NORM, },
|
||||
/* 9a */ { { 'T', 'X', 'S', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 9d */ { { 'S', 'T', 'A', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* a0 */ { { 'L', 'D', 'Y', 0, }, 2, IMM|NORM, },
|
||||
/* a1 */ { { 'L', 'D', 'A', 0, }, 2, INX|NORM, },
|
||||
/* a2 */ { { 'L', 'D', 'X', 0, }, 2, IMM|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* a4 */ { { 'L', 'D', 'Y', 0, }, 2, ZPG|NORM, },
|
||||
/* a5 */ { { 'L', 'D', 'A', 0, }, 2, ZPG|NORM, },
|
||||
/* a6 */ { { 'L', 'D', 'X', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* a8 */ { { 'T', 'A', 'Y', 0, }, 1, IMP|NORM, },
|
||||
/* a9 */ { { 'L', 'D', 'A', 0, }, 2, IMM|NORM, },
|
||||
/* aa */ { { 'T', 'A', 'X', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* ac */ { { 'L', 'D', 'Y', 0, }, 3, ABS|NORM, },
|
||||
/* ad */ { { 'L', 'D', 'A', 0, }, 3, ABS|NORM, },
|
||||
/* ae */ { { 'L', 'D', 'X', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* b0 */ { { 'B', 'C', 'S', 0, }, 2, REL|FORK, },
|
||||
/* b1 */ { { 'L', 'D', 'A', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* b4 */ { { 'L', 'D', 'Y', 0, }, 2, ZPX|NORM, },
|
||||
/* b5 */ { { 'L', 'D', 'A', 0, }, 2, ZPX|NORM, },
|
||||
/* b6 */ { { 'L', 'D', 'X', 0, }, 2, ZPY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* b8 */ { { 'C', 'L', 'V', 0, }, 1, IMP|NORM, },
|
||||
/* b9 */ { { 'L', 'D', 'A', 0, }, 3, ABY|NORM, },
|
||||
/* ba */ { { 'T', 'S', 'X', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* bc */ { { 'L', 'D', 'Y', 0, }, 3, ABX|NORM, },
|
||||
/* bd */ { { 'L', 'D', 'A', 0, }, 3, ABX|NORM, },
|
||||
/* be */ { { 'L', 'D', 'X', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* c0 */ { { 'C', 'P', 'Y', 0, }, 2, IMM|NORM, },
|
||||
/* c1 */ { { 'C', 'M', 'P', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* c4 */ { { 'C', 'P', 'Y', 0, }, 2, ZPG|NORM, },
|
||||
/* c5 */ { { 'C', 'M', 'P', 0, }, 2, ZPG|NORM, },
|
||||
/* c6 */ { { 'D', 'E', 'C', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* c8 */ { { 'I', 'N', 'Y', 0, }, 1, IMP|NORM, },
|
||||
/* c9 */ { { 'C', 'M', 'P', 0, }, 2, IMM|NORM, },
|
||||
/* ca */ { { 'D', 'E', 'X', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* cc */ { { 'C', 'P', 'Y', 0, }, 3, ABS|NORM, },
|
||||
/* cd */ { { 'C', 'M', 'P', 0, }, 3, ABS|NORM, },
|
||||
/* ce */ { { 'D', 'E', 'C', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* d0 */ { { 'B', 'N', 'E', 0, }, 2, REL|FORK, },
|
||||
/* d1 */ { { 'C', 'M', 'P', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* d5 */ { { 'C', 'M', 'P', 0, }, 2, ZPX|NORM, },
|
||||
/* d6 */ { { 'D', 'E', 'C', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* d8 */ { { 'C', 'L', 'D', 0, }, 1, IMP|NORM, },
|
||||
/* d9 */ { { 'C', 'M', 'P', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* dd */ { { 'C', 'M', 'P', 0, }, 3, ABX|NORM, },
|
||||
/* de */ { { 'D', 'E', 'C', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* e0 */ { { 'C', 'P', 'X', 0, }, 2, IMM|NORM, },
|
||||
/* e1 */ { { 'S', 'B', 'C', 0, }, 2, INX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* e4 */ { { 'C', 'P', 'X', 0, }, 2, ZPG|NORM, },
|
||||
/* e5 */ { { 'S', 'B', 'C', 0, }, 2, ZPG|NORM, },
|
||||
/* e6 */ { { 'I', 'N', 'C', 0, }, 2, ZPG|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* e8 */ { { 'I', 'N', 'X', 0, }, 1, IMP|NORM, },
|
||||
/* e9 */ { { 'S', 'B', 'C', 0, }, 2, IMM|NORM, },
|
||||
/* ea */ { { 'N', 'O', 'P', 0, }, 1, IMP|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* ec */ { { 'C', 'P', 'X', 0, }, 3, ABS|NORM, },
|
||||
/* ed */ { { 'S', 'B', 'C', 0, }, 3, ABS|NORM, },
|
||||
/* ee */ { { 'I', 'N', 'C', 0, }, 3, ABS|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* f0 */ { { 'B', 'E', 'Q', 0, }, 2, REL|FORK, },
|
||||
/* f1 */ { { 'S', 'B', 'C', 0, }, 2, INY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* f5 */ { { 'S', 'B', 'C', 0, }, 2, ZPX|NORM, },
|
||||
/* f6 */ { { 'I', 'N', 'C', 0, }, 2, ZPX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* f8 */ { { 'S', 'E', 'D', 0, }, 1, IMP|NORM, },
|
||||
/* f9 */ { { 'S', 'B', 'C', 0, }, 3, ABY|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
/* fd */ { { 'S', 'B', 'C', 0, }, 3, ABX|NORM, },
|
||||
/* fe */ { { 'I', 'N', 'C', 0, }, 3, ABX|NORM, },
|
||||
/* 00 */ { { '?', '?', '?', 0, }, 1, ILL|NORM, },
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user