Initial revision

This commit is contained in:
Eric Smith 2000-04-27 23:29:28 +00:00
commit cf44f20b54
10 changed files with 1593 additions and 0 deletions

42
Makefile Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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, },
};