home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
disasm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
26KB
|
956 lines
/* ---------------------------------------------------------------------- */
/* Copyright (C) 1992 by Natürlich! */
/* This file is copyrighted! */
/* Refer to the documentation for details. */
/* ---------------------------------------------------------------------- */
/* rev. history 1.0 -- original buggy version */
/* 1.1 -- fixed bcc/bpl bug */
/* 1.2 -- fixed dget_j, added ASCII support */
/* 1.3 -- fixed tables (at LEAST 6 Errors) */
/* 1.4 -- X drivers, .O65, FF FF done rite, */
/* Boot files */
/* 1.5 -- print inverted chars optionally */
/* 1.6 -- even more boot file support */
/* 1.7 -- AppleII and C64 support */
/* 1.8 -- no real changes, actually */
/* ---------------------------------------------------------- */
#include "defines.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define __BIG_GENERATOR__
#include OSBIND
#include "code.h"
#include "seg.h"
#include "object.h"
#define ATARI 0
#define PLAIN 1
#define C64 2
#define APPLE 3
#define SPARTA 4
#define MODULE 5
#define BOOT 6
#define CHMIN ' '
#define CHMAX '~'
#ifdef isprint
# undef isprint
#endif
#define toprint( c) ((c) & (0x7F | inverted))
#define isprint( c) ( toprint( c) >= CHMIN && toprint( c) <= CHMAX)
#define chprint( c) ( isprint( c) ? (char) toprint( c) : '.')
word disasm(), seg_disasm();
extern char trc_loss[];
int maxerrors = 100;
struct
{
byte flag,
secs;
word start,
init;
} boot_header;
struct
{
word ffff,
start,
end;
} ffff_header;
struct
{
byte byte1,
byte2;
word start,
len;
} feff_header;
struct
{
byte byte1,
len_lsb,
len_msb;
} fdff_header;
struct
{
byte mode, lsb, msb;
char id[ 8];
} fcff_header;
struct
{
char id[8];
word w1;
} fbff_header;
struct
{
word start,
end;
} faff_header;
struct
{
word start,
end;
} apple_header;
struct
{
word start,
end;
} c64_header;
word __x;
lword __lx;
void fixheader()
{
ffff_header.start = dpeek( &ffff_header.start);
ffff_header.end = dpeek( &ffff_header.end);
}
#if OS == TOS
int tossable;
#endif
char cminusminus[] = "; ---------------------------------------\n";
FILE *fq;
int pcoff,
showascii = 1,
showheader,
pstart,
inverted,
filetype;
lword space,
mspace;
byte *room;
long bread;
int fp;
int tok_remain;
main( argc, argv)
int argc;
char **argv;
{
static char infile[ 256],
outfile[ 256];
int i = 0;
fq = stdout; /* done here for some lame Amiga cc */
#if ! VERSION
chk_tables();
#endif
while( ++i < argc)
{
if( *argv[i] == '-')
switch( Xtolower( argv[i][1]))
{
#if OS == TOS
case 't' :
tossable = ! tossable;
break;
#endif
case 'f' :
switch( Xtolower( argv[ i][2]))
{
case 'o' :
filetype = MODULE;
break;
case 's' :
filetype = SPARTA;
break;
case 'p' :
filetype = PLAIN;
if( ! sscanf( &argv[ i][ 3], "%X", &pstart) ||
! pstart)
nferror("Missing start address");
break;
case 'b' :
filetype = BOOT;
break;
case 'a' :
filetype = APPLE;
break;
case 'c' :
filetype = C64;
break;
case 0 :
case 'x' :
filetype = ATARI;
default :
goto usage;
}
break;
case 'a' :
showascii = ! showascii;
break;
#ifdef __DATE__
case ':' :
fputs( __DATE__, stderr);
# ifdef __TIME__
fprintf( stderr, " %s", __TIME__);
# endif
putc( '\n', stderr);
break;
#endif
case 'v' :
fprintf( stderr, "disasm65 v1.8 (c) 1992 by Natuerlich!\
-- disassembles 6502 binaries\n");
break;
case 'i' :
inverted = ~inverted;
break;
case 'h' :
showheader = ! showheader;
break;
case 'p' :
pcoff = ! pcoff;
break;
}
else
if( ! infile[0])
strcpy( infile, argv[i]);
else
if( ! outfile[0])
strcpy( outfile, argv[i]);
else
goto usage;
}
if( ! infile[0])
goto usage;
#if OS == MSDOS
_fmode = O_BINARY;
#endif
if( (fp = (int) Fopen( infile, OPEN_R)) < 0)
nferror("File open failed");
if( outfile[0] && ! (fq = fopen( outfile, "w")))
nferror("File creation failed");
switch( filetype)
{
case APPLE :
if( (bread = Fread( fp, 4L, &apple_header)) < 4L)
nferror( trc_loss);
seg_disasm( dpeek( &apple_header.start),
dpeek( &apple_header.end), 0);
break;
case C64 :
{
word pos;
if( (bread = Fread( fp, 2L, &c64_header)) < 2L)
nferror( trc_loss);
pos = Fseek( 0L, fp, SEEK_END) - 2;
Fseek( 2L, fp, SEEK_SET);
seg_disasm( dpeek( &c64_header), pos, 0);
}
break;
case PLAIN :
{
word pos;
pos = (word) Fseek( 0L, fp, SEEK_END);
Fseek( 0L, fp, SEEK_SET);
seg_disasm( pstart, pos, 0);
}
break;
case BOOT :
{
word start;
if( (bread = Fread( fp, 6L, &boot_header)) < 6L)
nferror( trc_loss);
start = dpeek( &boot_header.start);
if( showheader)
{
fputs( cminusminus, fq);
fprintf( fq, "; Boot header - Flag $%02X %d sectors\n\
; Address : $%04X Init: $%04X\n",
boot_header.flag, (word) boot_header.secs,
start, dpeek( &boot_header.init));
fputs( cminusminus, fq);
}
if( ! showascii && pcoff)
fprintf( fq, "; link with -x%04X\n\n", dpeek( &boot_header.init));
seg_disasm( start + 6, boot_header.secs * 0x80 - 6, 0);
}
break;
case SPARTA :
if( do_sparta())
do_atari();
break;
case MODULE :
do_module();
break;
case ATARI :
if( (bread = Fread( fp, 6L, &ffff_header)) < 6L)
nferror( trc_loss);
if( ffff_header.ffff != 0xFFFF)
nferror("Not a $FF $FF header");
do_atari();
}
#if OS == TOS
keypress();
#endif
return(0);
usage:
#if OS == TOS
fputs( "usage: disasm65 [-{tpiahvf}] infile [outfile]\n", stderr);
#else
fputs( "usage: disasm65 [-{fahvip}] infile [outfile]\n", stderr);
#endif
fputs( "\
\t-p\t: turn off the dump\n\
\t-i\t: don't print inverted stuff\n\
\t-a\t: turn off ASCII dump\n\
\t-h\t: show info about the binary headers\n\
\t-v\t: version\n\
\t-f[type]: input file type (default: -fx)\n\
\t o\t: .O65 module\n\
\t a\t: Apple II ProDOS binary\n\
\t c\t: C64 binary\n\
\t pxxxx: plain 6502 binary (xxxx gives start address)\n\
\t s\t: SpartaDOS X-Cartridge drivers\n\
\t x\t: Atari 8bit FF FF binaries\n", stderr);
#if OS == TOS
fputs( "\t-t\t: wait for keypress before exitin'\n", stderr);
keypress();
#endif
return( 1);
}
do_atari()
{
lword bread;
for(;;)
{
fixheader();
if( showheader)
{
fputs( cminusminus, fq);
fprintf( fq, "; FFFF header start : $%04X end : $%04X\n",
ffff_header.start, ffff_header.end);
fputs( cminusminus, fq);
}
fprintf( fq, "\n\t\t * = $%04X\n\n",
ffff_header.start, ffff_header.ffff);
seg_disasm( ffff_header.start,
(1 + ffff_header.end - ffff_header.start), 0);
if( (bread = Fread( fp, 4L, ((char huge *) &ffff_header) + 2)) <= 0)
break;
if( bread < 4)
nferror("Garbage at end of segment");
if( ffff_header.start == 0xFFFF)
{
ffff_header.ffff = ffff_header.start;
ffff_header.start = ffff_header.end;
if( (bread = Fread( fp, 2L, (char huge *) &ffff_header + 4)) <= 0 ||
bread < 2)
nferror("It's a trashed binary");
}
}
}
do_sparta()
{
word head, len, pc, byteit,
oldpcoff = pcoff,
oldshowascii = showascii;
for(;;)
{
if( (bread = Fread( fp, 2L, &head)) <= 0 || (bread == 1 && head < 256))
break;
if( bread != 2)
nferror("File trunctated or mangled");
len = dpeek( &head);
switch( len)
{
case 0xFFFF :
ffff_header.ffff = 0xFFFF;
if( (bread = Fread( fp, 4L, (char huge *) &ffff_header + 2)) != 4L)
nferror( trc_loss);
return( 1);
case 0xFFFE :
if( (bread = Fread( fp, 6L, &feff_header)) != 6L)
nferror( trc_loss);
len = dpeek( &feff_header.len);
pc = dpeek( &feff_header.start);
if( showheader)
{
fputs( cminusminus, fq);
fprintf( fq, "; FEFF header %02X %02X start : $%04X len : $%04X\n",
feff_header.byte1, feff_header.byte2,
pc, len);
fputs( cminusminus, fq);
}
fprintf( fq, "\n\t\t * = $%04X\n\n", pc);
if( feff_header.byte2 > 0x80)
continue;
byteit = 0;
break;
case 0xFFFD :
if( (bread = Fread( fp, 3L, &fdff_header)) != 3L)
nferror( trc_loss);
len = dpeek( &fdff_header.len_lsb);
if( showheader)
{
fputs( cminusminus, fq);
fprintf( fq, "; FDFF header $%02X len : $%04X\n",
fdff_header.byte1,
len);
fputs( cminusminus, fq);
}
showascii = 0;
pcoff = byteit = 1;
break;
case 0xFFFC :
if( (bread = Fread( fp, 11L, &fcff_header)) != 11L)
nferror( trc_loss);
if( showheader)
{
fputs( cminusminus, fq);
fputs( "; FCFF header (Export address @ loadtime)\n", fq);
fputs( cminusminus, fq);
}
fprintf( fq, "\t\t .byte $%02X\n\t\t .word $%02X%02X\n\t\t \
.byte \"%8.8s\"\n",
fcff_header.mode,
fcff_header.msb, fcff_header.lsb,
fcff_header.id);
continue;
case 0xFFFB :
if( (bread = Fread( fp, 10L, &fbff_header)) != 10L)
nferror( trc_loss);
if( showheader)
{
fputs( cminusminus, fq);
fputs( "; FBFF header (Import address @ loadtime)\n", fq);
fputs( cminusminus, fq);
}
fprintf( fq, "\t\t .byte \"%8.8s\"\n\t\t .word $%04X\n",
fbff_header.id,
len = dpeek( &fbff_header.w1));
showascii = 0;
pcoff = byteit = 1;
break;
case 0xFFFA :
if( (bread = Fread( fp, 4L, (char huge *) &faff_header)) != 4L)
nferror( trc_loss);
pc = dpeek( &faff_header.start);
len = dpeek( &faff_header.end);
if( showheader)
{
fputs( cminusminus, fq);
fprintf( fq, "; FAFF header start : $%04X end : $%04X\n",
pc, len);
fputs( cminusminus, fq);
}
len = 1 + len - pc;
fprintf( fq, "\n\t\t * = $%04X\n\n", pc);
byteit = 0;
break;
default :
{
static char mess[] = "Unknown SpartaDOS header $FFFF";
sprintf( mess + 26, "%04X", len);
nferror( mess);
}
}
pc = seg_disasm( pc, len, byteit);
showascii = oldshowascii;
pcoff = oldpcoff;
}
return( 0);
}
static char *txlat[] =
{
"Reloc. code ",
"Static data ",
"Reloc. .WORDs ",
"Reloc. .DBYTEs",
".DS allocation"
};
do_module()
{
extern byte huge *pb;
extern s_dropped huge *ps;
extern lword bytes, sbytes;
word i;
word pc = DEFORG;
do_load( fp);
if( showheader)
{
s_dropped huge *p = ps;
word plus = 0;
fputs( cminusminus, fq);
fprintf( fq, "; SEGMENTS:\n");
for( i = (word) sbytes; i; i--, p++)
{
fprintf( fq, ";\tType: %s $%04X-$%04X\n",
txlat[ p->type], DEFORG + p->index + plus,
DEFORG + p->index + plus + p->size - 1);
if( p->type == S_DS)
plus += p->size;
}
fputs( cminusminus, fq);
}
for( i = (word) sbytes; i; i--, pc += ps->size, ps++)
if( ps->type != S_DS)
{
disasm( pc, pb, (lword) ps->size, 0);
pb += ps->size;
}
}
word seg_disasm( pc, len, byteit)
word pc, len;
int byteit;
{
static lword space,
mspace;
static byte *room;
space = (lword) len;
if( space > mspace)
{
if( mspace)
free( room);
if( ! (room = (byte *) malloc( (mspace = space))))
nferror("out of memory");
}
if( Fread( fp, space, room) != space)
nferror("read failed (file truncated ?)");
return( disasm( pc, room, space, byteit));
}
char
adc[]="adc", xnd[]="and", asl[]="asl", bcc[]="bcc",
bcs[]="bcs", beq[]="beq", bit[]="bit", bmi[]="bmi",
bne[]="bne", bpl[]="bpl", bra[]="bra",xbrk[]="brk",
bvc[]="bvc", bvs[]="bvs", clc[]="clc", cld[]="cld",
cli[]="cli", clv[]="clv", cmp[]="cmp", cpx[]="cpx",
cpy[]="cpy", dea[]="dea", dec[]="dec", dex[]="dex",
dey[]="dey", eor[]="eor", ina[]="ina", inc[]="inc",
inx[]="inx", iny[]="iny", jmp[]="jmp", jsr[]="jsr",
lda[]="lda", ldx[]="ldx", ldy[]="ldy", lsr[]="lsr",
nop[]="nop", ora[]="ora", pha[]="pha", php[]="php",
phx[]="phx", phy[]="phy", pla[]="pla", plp[]="plp",
plx[]="plx", ply[]="ply", rol[]="rol", ror[]="ror",
rti[]="rti", rts[]="rts", sbc[]="sbc", sec[]="sec",
sed[]="sed", sei[]="sei", sta[]="sta", stx[]="stx",
sty[]="sty", stz[]="stz", tax[]="tax", tay[]="tay",
trb[]="trb", tsb[]="tsb", tsx[]="txa", txa[]="txa",
txs[]="txs", tya[]="tya", o__[]=".byte";
char *ops[] =
{
xbrk, ora, o__, o__, tsb, ora, asl, o__,
php, ora, asl, o__, tsb, ora, asl, o__, /*0*/
bpl, ora, ora, o__, trb, ora, asl, o__,
clc, ora, ina, o__, trb, ora, asl, o__, /*1*/
jsr, xnd, o__, o__, bit, xnd, rol, o__,
plp, xnd, rol, o__, bit, xnd, rol, o__, /*2*/
bmi, xnd, xnd, o__, bit, xnd, rol, o__,
sec, xnd, dea, o__, bit, xnd, rol, o__, /*3*/
rti, eor, o__, o__, o__, eor, lsr, o__,
pha, eor, lsr, o__, jmp, eor, lsr, o__, /*4*/
bvc, eor, eor, o__, o__, eor, lsr, o__,
cli, eor, phy, o__, o__, eor, lsr, o__, /*5*/
rts, adc, o__, o__, stz, adc, ror, o__,
pla, adc, ror, o__, jmp, adc, ror, o__, /*6*/
bvs, adc, adc, o__, stz, adc, ror, o__,
sei, adc, ply, o__, jmp, adc, ror, o__, /*7*/
bra, sta, o__, o__, sty, sta, stx, o__,
dey, o__, txa, o__, sty, sta, stx, o__, /*8*/
bcc, sta, sta, o__, sty, sta, stx, o__,
tya, sta, txs, o__, stz, sta, stz, o__, /*9*/
ldy, lda, ldx, o__, ldy, lda, ldx, o__,
tay, lda, tax, o__, ldy, lda, ldx, o__, /*A*/
bcs, lda, lda, o__, ldy, lda, ldx, o__,
clv, lda, tsx, o__, ldy, lda, ldx, o__, /*B*/
cpy, cmp, o__, o__, cpy, cmp, dec, o__,
iny, cmp, dex, o__, cpy, cmp, dec, o__, /*C*/
bne, cmp, cmp, o__, o__, cmp, dec, o__,
cld, cmp, phx, o__, o__, cmp, dec, o__, /*D*/
cpx, sbc, o__, o__, cpx, sbc, inc, o__,
inx, sbc, nop, o__, cpx, sbc, inc, o__, /*E*/
beq, sbc, sbc, o__, o__, sbc, inc, o__,
sed, sbc, plx, o__, o__, sbc, inc, o__ /*F*/
};
byte mode[]=
{
8, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 1,0xF,0, 0x5, 5, 5, 0, /*0*/
9, 0xB, 0xD, 0, 2, 3, 3, 0, 8, 7, 8, 0, 0x5, 6, 6, 0, /*1*/
5, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 1,0xF,0, 0x5, 5, 5, 0, /*2*/
9, 0xB, 0xD, 0, 3, 3, 3, 0, 8, 7, 8, 0, 0x6, 6, 6, 0, /*3*/
8, 0xA, 0x0, 0, 0, 2, 2, 0, 8, 1,0xF,0, 0x5, 5, 5, 0, /*4*/
9, 0xB, 0xD, 0, 0, 3, 3, 0, 8, 7, 8, 0, 0x0, 6, 6, 0, /*5*/
8, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 1,0xF,0, 0xC, 5, 5, 0, /*6*/
9, 0xB, 0xD, 0, 3, 3, 3, 0, 8, 7, 8, 0, 0xE, 6, 6, 0, /*7*/
9, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 0, 8, 0, 0x5, 5, 5, 0, /*8*/
9, 0xB, 0xD, 0, 3, 3, 4, 0, 8, 7, 8, 0, 0x6, 6, 6, 0, /*9*/
1, 0xA, 0x1, 0, 2, 2, 2, 0, 8, 1, 8, 0, 0x5, 5, 5, 0, /*A*/
9, 0xB, 0xD, 0, 3, 3, 4, 0, 8, 7, 8, 0, 0x6, 6, 7, 0, /*B*/
1, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 1, 8, 0, 0x5, 5, 5, 0, /*C*/
9, 0xB, 0xD, 0, 0, 3, 3, 0, 8, 7, 8, 0, 0x0, 6, 6, 0, /*D*/
1, 0xA, 0x0, 0, 2, 2, 2, 0, 8, 1, 8, 0, 0x5, 5, 5, 0, /*E*/
9, 0xB, 0xD, 0, 0, 3, 3, 0, 8, 7, 8, 0, 0x0, 6, 6, 0 /*F*/
};
#if ! VERSION
chk_tables()
{
register byte huge *p = mode;
register char huge **q = ops;
register int i = 256;
while( i--)
if( (*q++ != o__) ^ (*p++ >= 1))
fprintf( stderr, "Table entry mismatch for op-code $%02X \
mnemo=\"%s\" mode=%d\n", 255 - i, q[-1], p[-1]);
}
#endif
#define get_j() \
{ \
pc++; \
if( len--) \
j = *p++; \
else \
goto fini; \
}
#define dget_j() \
if( (len - 2) >= 0) \
{ \
j = dpeek( p); \
and = j; \
shift= peek( p + 1); \
p += 2; \
len -= 2; \
pc += 2; \
} \
else \
goto fini2
#define printpc() fprintf( fq, "%04X ", pc)
word disasm( pc, p, len, byteit)
register word pc;
byte huge *p;
word byteit;
long len;
{
register word i, j;
register byte shift, and;
while( len--)
{
if( ! pcoff)
printpc();
else
putc( '\t', fq);
i = *p++;
pc++;
if( byteit)
{
if( ! pcoff)
fprintf( fq, "%02X", i);
fprintf( fq, "\t .byte $%02X", i);
if( showascii)
fprintf( fq, "\t\t; \"%c\"", chprint( i));
}
else
switch( mode[i])
{
case 0x0 :
if( ! pcoff)
fprintf( fq, "%02X", i);
fprintf( fq, "\t %s", ops[ i]);
if( ops[i] == o__)
fprintf( fq, " $%02X", i);
if( showascii)
fprintf( fq, "\t\t; \"%c\"", chprint( i));
break;
case 0x1 :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s #", ops[i]);
if( j < 0xA)
fprintf( fq, "%d", j);
else
fprintf( fq, "$%X", j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"", chprint( i), chprint( j));
break;
case 0x2 :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s $%02X", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"", chprint( i), chprint( j));
break;
case 0x3 :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s $%02X,X", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"", chprint( i), chprint( j));
break;
case 0x4 :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s $%02X,Y", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"", chprint( i), chprint( j));
break;
case 0x5 :
dget_j();
if( ! pcoff)
fprintf( fq, "%02X %02X %02X", i,(word) and,(word) shift);
fprintf( fq, "\t %s $%04X", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c%c\"",
chprint( i), chprint( and), chprint( shift));
break;
case 0x6 :
dget_j();
if( ! pcoff)
fprintf( fq, "%02X %02X %02X", i,(word) and,(word) shift);
fprintf( fq, "\t %s $%04X,X", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c%c\"",
chprint( i), chprint( and), chprint( shift));
break;
case 0x7 :
dget_j();
if( ! pcoff)
fprintf( fq, "%02X %02X %02X", i,(word) and,(word) shift);
fprintf( fq, "\t %s $%04X,Y", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c%c\"",
chprint( i), chprint( and), chprint( shift));
break;
case 0x8 :
if( ! pcoff)
fprintf( fq, "%02X", i);
fprintf( fq, "\t %s", ops[i]);
if( showascii)
fprintf( fq, "\t\t\t; \"%c\"", chprint( i));
break;
case 0x9 :
{
register byte j;
register word k;
get_j();
k = j;
if( ! pcoff)
fprintf( fq, "%02X %02X", i, k);
fprintf( fq, "\t %s $%04X", ops[ i], pc +
(signed char) j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"",
chprint( i), chprint( j));
}
break;
case 0xA :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s ($%02X,X)", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"",
chprint( i), chprint( j));
break;
case 0xB :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s ($%02X),Y", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"",
chprint( i), chprint( j));
break;
case 0xC :
dget_j();
if( ! pcoff)
fprintf( fq, "%02X %02X %02X", i,(word) and,(word) shift);
fprintf( fq, "\t %s ($%04X)", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c%c\"",
chprint( i), chprint( and), chprint( shift));
break;
case 0xD :
get_j();
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t %s ($%02X)", ops[i], j);
if( showascii)
fprintf( fq, "\t\t; \"%c%c\"",
chprint( i), chprint( j));
break;
case 0xE :
dget_j();
if( ! pcoff)
fprintf( fq, "%02X %02X %02X", i,(word) and,(word) shift);
fprintf( fq, "\t %s ($%04X,X)", ops[i], j);
if( showascii)
fprintf( fq, "\t; \"%c%c%c\"",
chprint( i), chprint( and), chprint( shift));
break;
case 0xF :
if( ! pcoff)
fprintf( fq, "%02X", i);
fprintf( fq, "\t %s a", ops[i]);
if( showascii)
fprintf( fq, "\t\t; \"%c\"", chprint( i));
break;
}
putc( '\n', fq);
}
return( pc);
fini:
if( ! pcoff)
fprintf( fq, "%02X", i);
fprintf( fq, "\t .byte $%02X", i);
if( showascii)
fprintf( fq, "\t\t; \"%c\"", chprint( i));
putc( '\n', fq);
return( pc);
fini2:
if( ! len)
goto fini;
j = *p;
if( ! pcoff)
fprintf( fq, "%02X %02X", i, j);
fprintf( fq, "\t .byte $%02X, $%02X", i, j);
if( showascii)
fprintf( fq, "\t; \"%c%c\"", chprint( i), chprint( j));
putc( '\n', fq);
return( pc);
}
keypress()
{
#if OS == TOS
if( tossable)
{
while( Bconstat( 2))
Bconin( 2);
Bconin( 2);
}
#endif
}
h_print()
{
fputs( "disasm65: ", stderr);
}
finalshit()
{
}