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 ------------------------------------------------------------------ /* * dis11 - disassemble a raw data file of hc11 assembly * * Introl Corp. (c) 1994 */ #include #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; } }