From news.media.mit.edu!bloom-beacon.mit.edu!news.kei.com!sol.ctr.columbia.edu!spool.mu.edu!news.introl.com!not-for-mail Mon Jan 17 10:12:58 EST 1994
Article: 7773 of comp.robotics
Path: news.media.mit.edu!bloom-beacon.mit.edu!news.kei.com!sol.ctr.columbia.edu!spool.mu.edu!news.introl.com!not-for-mail
From: jake@introl.com (Joel Jacobson)
Newsgroups: comp.robotics
Subject: 68hc11 disassembler
Date: 17 Jan 1994 09:04:54 -0600
Organization: Introl Corp.
Lines: 1317
Message-ID: <2he9em$hnj@introl.introl.com>
NNTP-Posting-Host: introl.introl.com


I've noticed some interest here in a 68hc11 disassembler, so I took one I've
been working on here (read: not completed) and stripped out the Introl-specific
stuff from it.  If you have any questions / comments / bugs reports / bug
fixes, please let me know.  All I ask is that if you re-distribute it, you keep
the copyright at the top of the source file...


Joel Jacobson
jake@introl.com

------------------------------------<cut here>------------------------------

/*
 * dis11 - disassemble a raw data file of hc11 assembly
 *
 * Introl Corp.  (c) 1994
 */

#include <stdio.h>

#define PNAME "dis11"

#define ILL	0
#define	INH	1
#define DIR	2
#define IMM	3
#define IND_X	4
#define IND_Y	5
#define REL	6
#define EXT	7

#define MAXLINE 80

#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif

#define GETC(x,y) y = getc(x); ++curr_paddr

typedef struct instr_tag
	{
	unsigned char	*opco_name;
	short		operand_len;
	short		addr_mode;
	} INSTR;

static char as_line[MAXLINE];		/* the output line is sprintf'd here */

static INSTR instr1[] = 		/* first page instructions */
	{
/*0x00*/	{"test", 0, INH},
		{"nop", 0, INH},
		{"idiv", 0, INH},
		{"fdiv", 0, INH},
		{"lsrd", 0, INH},
		{"lsld", 0, INH},
		{"tap", 0, INH},
		{"tpa", 0, INH},
		{"inx", 0, INH},
		{"dex", 0, INH},
		{"clv", 0, INH},
		{"sev", 0, INH},
		{"clc", 0, INH},
		{"sec", 0, INH},
		{"cli", 0, INH},
		{"sei", 0, INH},
/*0x10*/	{"sba", 0, INH},
		{"cba", 0, INH},
		{"brset", 3, DIR},
		{"brclr", 3, DIR},
		{"bset", 2, DIR},
		{"bclr", 2, DIR},
		{"tab", 0, INH},
		{"tba", 0, INH},
		{"dc.b", 0, 0},
		{"daa", 0, INH},
		{"dc.b", 0, 0},
		{"aba", 0, INH},
		{"bset", 2, IND_X},
		{"bclr", 2, IND_X},
		{"brset", 3, IND_X},
		{"brclr", 3, IND_X},
/*0x20*/	{"bra", 1, REL},
		{"brn", 1, REL},
		{"bhi", 1, REL},
		{"bls", 1, REL},
		{"bcc", 1, REL},
		{"blo", 1, REL},
		{"bne", 1, REL},
		{"beq", 1, REL},
		{"bvc", 1, REL},
		{"bvs", 1, REL},
		{"bpl", 1, REL},
		{"bmi", 1, REL},
		{"bge", 1, REL},
		{"blt", 1, REL},
		{"bgt", 1, REL},
		{"ble", 1, REL},
/*0x30*/	{"tsx", 0, INH},
		{"ins", 0, INH},
		{"pula", 0, INH},
		{"pulb", 0, INH},
		{"des", 0, INH},
		{"txs", 0, INH},
		{"psha", 0, INH},
		{"pshb", 0, INH},
		{"pulx", 0, INH},
		{"rts", 0, INH},
		{"abx", 0, INH},
		{"rti", 0, INH},
		{"pshx", 0, INH},
		{"mul", 0, INH},
		{"wai", 0, INH},
		{"swi", 0, INH},
/*0x40*/	{"nega", 0, INH},
		{"dc.b", 0,0},
		{"dc.b", 0,0},
		{"coma", 0, INH},
		{"lsra", 0, INH},
		{"dc.b", 0,0},
		{"rora", 0, INH},
		{"asra", 0, INH},
		{"lsla", 0, INH},
		{"rola", 0, INH},
		{"deca", 0, INH},
		{"dc.b", 0,0},
		{"inca", 0, INH},
		{"tsta", 0, INH},
		{"dc.b", 0,0},
		{"clra", 0, INH},
/*0x50*/	{"negb", 0, INH},
		{"dc.b", 0,0},
		{"dc.b", 0,0},
		{"comb", 0, INH},
		{"lsrb", 0, INH},
		{"dc.b", 0,0},
		{"rorb", 0, INH},
		{"aslb", 0, INH},
		{"lslb", 0, INH},
		{"rolb", 0, INH},
		{"decb", 0, INH},
		{"dc.b", 0,0},
		{"incb", 0, INH},
		{"tstb", 0, INH},
		{"dc.b", 0,0},
		{"clrb", 0, INH},
/*0x60*/	{"neg", 1, IND_X},
		{"dc.b", 0,0},
		{"dc.b", 0,0},
		{"com", 1, IND_X},
		{"lsr", 1, IND_X},
		{"dc.b", 0,0},
		{"ror", 1, IND_X},
		{"asr", 1, IND_X},
		{"asl", 1, IND_X},
		{"rol", 1, IND_X},
		{"dec", 1, IND_X},
		{"dc.b", 0,0},
		{"inc", 1, IND_X},
		{"tst", 1, IND_X},
		{"jmp", 1, IND_X},
		{"clr", 1, IND_X},
/*0x70*/	{"neg", 2, EXT},
		{"dc.b", 0,0},
		{"dc.b", 0,0},
		{"com", 2, EXT},
		{"lsr", 2, EXT},
		{"dc.b", 0,0},
		{"ror", 2, EXT},
		{"asr", 2, EXT},
		{"lsl", 2, EXT},
		{"rol", 2, EXT},
		{"dec", 2, EXT},
		{"dc.b", 0,0},
		{"inc", 2, EXT},
		{"tst", 2, EXT},
		{"jmp", 2, EXT},
		{"clr", 2, EXT},
/*0x80*/	{"suba", 1, IMM},
		{"cmpa", 1, IMM},
		{"sbca", 1, IMM},
		{"subd", 2, IMM},
		{"anda", 1, IMM},
		{"bita", 1, IMM},
		{"ldaa", 1, IMM},
		{"dc.b", 0, 0},
		{"eora", 1, IMM},
		{"adca", 1, IMM},
		{"oraa", 1, IMM},
		{"adda", 1, IMM},
		{"cpx", 2, IMM},
		{"bsr", 1, REL},
		{"lds", 2, IMM},
		{"xgdx", 0, INH},
/*0x90*/	{"suba", 1, DIR},
		{"cmpa", 1, DIR},
		{"sbca", 1, DIR},
		{"subd", 1, DIR},
		{"anda", 1, DIR},
		{"bita", 1, DIR},
		{"ldaa", 1, DIR},
		{"staa", 1, DIR},
		{"eora", 1, DIR},
		{"adca", 1, DIR},
		{"oraa", 1, DIR},
		{"adda", 1, DIR},
		{"cpx", 1, DIR},
		{"jsr", 1, DIR},
		{"lds", 1, DIR},
		{"sts", 1, DIR},
/*0xa0*/	{"suba", 1, IND_X},
		{"cmpa", 1, IND_X},
		{"sbca", 1, IND_X},
		{"subd", 1, IND_X},
		{"anda", 1, IND_X},
		{"bita", 1, IND_X},
		{"ldaa", 1, IND_X},
		{"staa", 1, IND_X},
		{"eora", 1, IND_X},
		{"adca", 1, IND_X},
		{"oraa", 1, IND_X},
		{"adda", 1, IND_X},
		{"cpx", 1, IND_X},
		{"jsr", 1, IND_X},
		{"lds", 1, IND_X},
		{"sts", 1, IND_X},
/*0xb0*/	{"suba", 2, EXT},
		{"cmpa", 2, EXT},
		{"sbca", 2, EXT},
		{"subd", 2, EXT},
		{"anda", 2, EXT},
		{"bita", 2, EXT},
		{"ldaa", 2, EXT},
		{"staa", 2, EXT},
		{"eora", 2, EXT},
		{"adca", 2, EXT},
		{"oraa", 2, EXT},
		{"adda", 2, EXT},
		{"cpx", 2, EXT},
		{"jsr", 2, EXT},
		{"lds", 2, EXT},
		{"sts", 2, EXT},
/*0xc0*/	{"subb", 1, IMM},
		{"cmpb", 1, IMM},
		{"sbcb", 1, IMM},
		{"addd", 2, IMM},
		{"andb", 1, IMM},
		{"bitb", 1, IMM},
		{"ldab", 1, IMM},
		{"dc.b", 0, 0},
		{"eorb", 1, IMM},
		{"adcb", 1, IMM},
		{"orab", 1, IMM},
		{"addb", 1, IMM},
		{"ldd", 2, IMM},
		{"dc.b", 0, 0},
		{"ldx", 2, IMM},
		{"stop", 0, INH},
/*0xd0*/	{"subb", 1, DIR},
		{"cmpb", 1, DIR},
		{"sbcb", 1, DIR},
		{"addd", 1, DIR},
		{"andb", 1, DIR},
		{"bitb", 1, DIR},
		{"ldab", 1, DIR},
		{"stab", 1, DIR},
		{"eorb", 1, DIR},
		{"adcb", 1, DIR},
		{"orab", 1, DIR},
		{"addb", 1, DIR},
		{"ldd", 1, DIR},
		{"std", 1, DIR},
		{"ldx", 1, DIR},
		{"stx", 1, DIR},
/*0xe0*/	{"subb", 1, IND_X},
		{"cmpb", 1, IND_X},
		{"sbcb", 1, IND_X},
		{"addd", 1, IND_X},
		{"andb", 1, IND_X},
		{"bitb", 1, IND_X},
		{"ldab", 1, IND_X},
		{"stab", 1, IND_X},
		{"eorb", 1, IND_X},
		{"adcb", 1, IND_X},
		{"orab", 1, IND_X},
		{"addb", 1, IND_X},
		{"ldd", 1, IND_X},
		{"std", 1, IND_X},
		{"ldx", 1, IND_X},
		{"stx", 1, IND_X},
/*0xf0*/	{"subb", 2, EXT},
		{"cmpb", 2, EXT},
		{"sbcb", 2, EXT},
		{"addd", 2, EXT},
		{"andb", 2, EXT},
		{"bitb", 2, EXT},
		{"ldab", 2, EXT},
		{"stab", 2, EXT},
		{"eorb", 2, EXT},
		{"adcb", 2, EXT},
		{"orab", 2, EXT},
		{"addb", 2, EXT},
		{"ldd", 2, EXT},
		{"std", 2, EXT},
		{"ldx", 2, EXT},
		{"stx", 2, EXT}
	};

static INSTR instr2[] = 		/* second page (0x18) instructions */
	{
/*0x00*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"iny",0, INH},
		{"dey",0, INH},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x10*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"bset", 2, IND_Y},
		{"bclr", 2, IND_Y},
		{"brset", 3, IND_Y},
		{"brclr", 3, IND_Y},
/*0x20*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x30*/	{"tsy", 0, INH},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"tys", 0, INH},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"puly", 0, INH},
		{"dc.b", 0, 0},
		{"aby", 0, INH},
		{"dc.b", 0, 0},
		{"pshy", 0, INH},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x40*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x50*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x60*/	{"neg", 1, IND_Y},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"com", 1, IND_Y},
		{"lsr", 1, IND_Y},
		{"dc.b", 0, 0},
		{"ror", 1, IND_Y},
		{"asr", 1, IND_Y},
		{"lsl", 1, IND_Y},
		{"rol", 1, IND_Y},
		{"dec", 1, IND_Y},
		{"dc.b", 0, 0},
		{"inc", 1, IND_Y},
		{"tst", 1, IND_Y},
		{"jmp", 1, IND_Y},
		{"clr", 1, IND_Y},
/*0x70*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x80*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpy", 2, IMM},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"xgdy", 0, INH},
/*0x90*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpy", 1, DIR},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xa0*/	{"suba", 1, IND_Y},
		{"cmpa", 1, IND_Y},
		{"sbca", 1, IND_Y},
		{"subd", 1, IND_Y},
		{"anda", 1, IND_Y},
		{"bita", 1, IND_Y},
		{"ldaa", 1, IND_Y},
		{"staa", 1, IND_Y},
		{"eora", 1, IND_Y},
		{"adca", 1, IND_Y},
		{"oraa", 1, IND_Y},
		{"adda", 1, IND_Y},
		{"cpy", 1, IND_Y},
		{"jsr", 1, IND_Y},
		{"lds", 1, IND_Y},
		{"sts", 1, IND_Y},
/*0xb0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpy", 2, EXT},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xc0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"ldy", 2, IMM},
		{"dc.b", 0, 0},
/*0xd0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"ldy", 1, DIR},
		{"sty", 1, DIR},
/*0xe0*/	{"subb", 1, IND_Y},
		{"cmpb", 1, IND_Y},
		{"sbcb", 1, IND_Y},
		{"addd", 1, IND_Y},
		{"andb", 1, IND_Y},
		{"bitb", 1, IND_Y},
		{"ldab", 1, IND_Y},
		{"stab", 1, IND_Y},
		{"eorb", 1, IND_Y},
		{"adcb", 1, IND_Y},
		{"orab", 1, IND_Y},
		{"addb", 1, IND_Y},
		{"ldd", 1, IND_Y},
		{"std", 1, IND_Y},
		{"ldy", 1, IND_Y},
		{"sty", 1, IND_Y},
/*0xf0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"ldy", 2, EXT},
		{"sty", 2, EXT}
	};

static INSTR instr3[] = 	/* third page (0x1a)	*/
	{
/*0x00*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x10*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x20*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x30*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x40*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x50*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x60*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x70*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x80*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpd", 2, IMM},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x90*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpd", 1, DIR},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xa0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpd", 1, IND_X},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpy", 1, IND_X},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xb0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpd", 1},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xc0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xd0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xe0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"ldy", 1, IND_X},
		{"sty", 1, IND_X},
/*0xf0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
	};

static INSTR instr4[] = 		/* forth page (0xcd) instructions */
	{
/*0x00*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x10*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x20*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x30*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x40*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x50*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x60*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x70*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x80*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0x90*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xa0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpd", 1, IND_Y},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"cpx", 1, IND_Y},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xb0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xc0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xd0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
/*0xe0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"ldx",1, IND_Y},
		{"stx",1, IND_Y},
/*0xf0*/	{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0},
		{"dc.b", 0, 0}
	};


/*
 *	real disassembly work is done here
 */

void
disas(ldptr, start, end)
	FILE *ldptr;
	unsigned long start, end;
	{
	INSTR		*instr_base;
	unsigned char	*instr_name, lab_flag, twobyte_flag, as_buf1[10],
			br_flag, tmp;
	unsigned short	b_rel;
	unsigned long	curr_paddr, i, mark_paddr, tmp_count,
			offset, length, operand, b_mask, opcode;

	printf("Rel Addr\tInstruction\tDisassembled\n");
	printf("========\t===========\t============\n");

	fseek(ldptr, start, SEEK_SET);	/* seek to starting offset in file */
	if (end == 0)			/* do whole file */
		end = 0xffffffff;

	mark_paddr = curr_paddr = 0;
	while(!feof(ldptr) && curr_paddr <= end)
		{
		br_flag = b_mask = b_rel = tmp_count = lab_flag =
			twobyte_flag = 0;

		/* out the opcode part of the assembly line
		*/
		GETC(ldptr, opcode);
		as_buf1[tmp_count++] = opcode;

		switch(opcode)
			{
			case 0x18:	/* 2nd page instructions */
				GETC(ldptr, offset);
				as_buf1[tmp_count++] = offset;
				instr_base = instr2;
				twobyte_flag = TRUE;
				break;
			case 0x1a:	/* 3rd page instructions */	
				GETC(ldptr, offset);
				as_buf1[tmp_count++] = offset;
				instr_base = instr3;
				twobyte_flag = TRUE;
				break;
			case 0xcd:	/* 4th page instructions */	
				GETC(ldptr, offset);
				as_buf1[tmp_count++] = offset;
				instr_base = instr4;
				twobyte_flag = TRUE;
				break;
			default:/* 1st page instructions and constants */
				offset = opcode;
				instr_base = instr1;
				break;
			}
		instr_name = instr_base[offset].opco_name;
		length = instr_base[offset].operand_len;

		/* output the operand part of the assembly line, if
		 * it had any. the operand can be numerical or symbolic.
		 */
		if((strcmp(instr_name, "bset") == 0)
		 ||(strcmp(instr_name, "bclr") == 0))
			{
			GETC(ldptr, operand);
			as_buf1[tmp_count++] = operand;
			GETC(ldptr, b_mask);
			as_buf1[tmp_count++] = b_mask;
			}
		else if((strcmp(instr_name, "brset") == 0)
		      ||(strcmp(instr_name, "brclr") == 0))
			{
			br_flag = TRUE;
			GETC(ldptr, operand);
			as_buf1[tmp_count++] = operand;
			GETC(ldptr, b_mask);
			as_buf1[tmp_count++] = b_mask;
			GETC(ldptr, b_rel);
			as_buf1[tmp_count++] = b_rel;
			}
		else
			{
			for(operand = 0; length; length--)
				{
				GETC(ldptr, tmp);
				as_buf1[tmp_count++] = tmp;
				operand = (operand << 8) | tmp;
				}
			}

		/* output the binary code of the instruction.
		*/

		printf("0x%.4lx\t\t", mark_paddr);
		for(i = 0; i < tmp_count; i++)
			printf("%2.2x", as_buf1[i]);
		for (; i<8; ++i)
			putchar(' ');

		switch(instr_base[offset].addr_mode)
			{
			case INH:
				sprintf(as_line, "\t%s", instr_name);
				break;
			case IND_X:
				if(br_flag)
					sprintf(as_line, "\t%s\t$%lx,x,$%lx,$%.2x",
						instr_name, operand, b_mask,
						b_rel);
				else
					sprintf(as_line, "\t%s\t%lx,x",
						instr_name, operand);
				break;
			case IND_Y:
				if(br_flag)
					sprintf(as_line, "\t%s\t$%lx,y,$%lx,$%.2x",
						instr_name, operand, b_mask,
						b_rel);
				else
					sprintf(as_line, "\t%s\t%lx,y",
						instr_name, operand);
				break;
			case REL:
				sprintf(as_line, "\t%s\t$%.2lx", instr_name,
					tmp);
				break;
			case DIR:
				if(br_flag)
					sprintf(as_line, "\t%s\t$%lx,$%lx,$%.2lx",
						instr_name, operand, b_mask,
						b_rel);
				break;
			case EXT:
				lab_flag = 1;
				sprintf(as_line, "\t%s\t%lx", instr_name,
					operand);
				break;
			case IMM:
				if(operand > 0xff)
					{
					lab_flag = 1;
					sprintf(as_line, "\t%s\t#$%lx",
						instr_name, operand);
					}
				else if (operand <= 0xff)
					{
					lab_flag = 1;
					sprintf(as_line, "\t%s\t#%lx",
						instr_name, operand);
					}
				break;
			default:
				if(twobyte_flag)
					{
					sprintf(as_line, "\tdc.b\t$%lx", opcode);
					sprintf(&as_line[strlen(as_line)],
						",$%lx\t*** ILLEGAL", offset);
					}
				else
					sprintf(as_line, "\tdc.b\t$%lx\t*** ILLEGAL", opcode);
				break;
			}
		printf("%s\n", as_line);
		mark_paddr = curr_paddr;
		}

	putchar('\n');
	}

void
main(argc, argv)
	int argc;
	char **argv;
	{
	char **i;
	FILE *fp;
	unsigned long start = 0, end = 0;

	if (argc == 1)
		goto croak2;
	for (i=&argv[1]; *i; ++i)
		{
		if (**i == '-')
			{
			switch (*(*i + 1))
				{
				case 's':	/* start address */
					if (**(++i))
						sscanf(*i, "%lx", &start);
					else
						goto croak;
					continue;
				case 'e':	/* end address */
					if (**(++i))
						sscanf(*i, "%lx", &end);
					else
						goto croak;
					continue;
				default:
				croak:
					fprintf(stderr,
						"%s: Invalid command line.\n",
						PNAME);
				croak2:
					fprintf(stderr,
						"%s [[-s start] [-e end] [filename]]\n",
						PNAME);
					exit(1);
				}
			}
		else if ((fp = fopen(*i, "rb")) == NULL)
			{
			fprintf(stderr, "%s: Can't open %s.\n", argv[0], *i);
			continue;
			}
		disas(fp, start, end);
		fclose(fp);
		start = end = 0;
		}
	}



