Mercurial > hg-old > index.cgi
view lwdisasm/instab6309.c @ 448:5cccf90bf838 3.0 tip
Fixed bug with complex external references generating invalid relocations in the object file
author | lost@l-w.ca |
---|---|
date | Fri, 05 Nov 2010 22:27:00 -0600 |
parents | cba03436c720 |
children |
line wrap: on
line source
/* instab6309.c Copyright © 2010 William Astle This file is part of LWTOOLS. LWTOOLS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <stdlib.h> #include "lwdisasm.h" /* 6309 instruction table */ /* base page */ instab_t page0_6309[] = { { "neg", ADDR_DIR }, { "oim", ADDR_IMM8DIR }, { "aim", ADDR_IMM8DIR }, { "com", ADDR_DIR }, { "lsr", ADDR_DIR }, { "eim", ADDR_IMM8DIR }, { "ror", ADDR_DIR }, { "asr", ADDR_DIR }, { "lsl", ADDR_DIR }, { "rol", ADDR_DIR }, { "dec", ADDR_DIR }, { "tim", ADDR_IMM8DIR }, { "inc", ADDR_DIR }, { "tst", ADDR_DIR }, { "jmp", ADDR_DIR }, { "clr", ADDR_DIR }, /* $10 */ { "", ADDR_PAGE1 }, { "", ADDR_PAGE2 }, { "nop", ADDR_INH }, { "sync", ADDR_INH }, { "sexw", ADDR_INH }, { NULL }, { "lbra", ADDR_REL16 }, { "lbsr", ADDR_REL16 }, { NULL }, { "daa", ADDR_INH }, { "orcc", ADDR_IMM8 }, { NULL }, { "andcc", ADDR_IMM8 }, { "sex", ADDR_INH }, { "exg", ADDR_RTOR }, { "tfr", ADDR_RTOR }, /* $20 */ { "bra", ADDR_REL8 }, { "brn", ADDR_REL8 }, { "bhi", ADDR_REL8 }, { "bls", ADDR_REL8 }, { "bcc", ADDR_REL8 }, { "bcs", ADDR_REL8 }, { "bne", ADDR_REL8 }, { "beq", ADDR_REL8 }, { "bvc", ADDR_REL8 }, { "bvs", ADDR_REL8 }, { "bpl", ADDR_REL8 }, { "bmi", ADDR_REL8 }, { "bge", ADDR_REL8 }, { "blt", ADDR_REL8 }, { "bgt", ADDR_REL8 }, { "ble", ADDR_REL8 }, /* $30 */ { "leax", ADDR_IND }, { "leay", ADDR_IND }, { "leas", ADDR_IND }, { "leau", ADDR_IND }, { "pshs", ADDR_PSHPULS }, { "puls", ADDR_PSHPULS }, { "pshu", ADDR_PSHPULU }, { "pulu", ADDR_PSHPULU }, { NULL }, { "rts", ADDR_INH }, { "abx", ADDR_INH }, { "rti", ADDR_INH }, { "cwai", ADDR_IMM8 }, { "mul", ADDR_INH }, { NULL }, { "swi", ADDR_INH }, /* $40 */ { "nega", ADDR_INH }, { NULL }, { NULL }, { "coma", ADDR_INH }, { "lsra", ADDR_INH }, { NULL }, { "rora", ADDR_INH }, { "asra", ADDR_INH }, { "lsla", ADDR_INH }, { "rola", ADDR_INH }, { "deca", ADDR_INH }, { NULL }, { "inca", ADDR_INH }, { "tsta", ADDR_INH }, { NULL }, { "clra", ADDR_INH }, /* $50 */ { "negb", ADDR_INH }, { NULL }, { NULL }, { "comb", ADDR_INH }, { "lsrb", ADDR_INH }, { NULL }, { "rorb", ADDR_INH }, { "asrb", ADDR_INH }, { "lslb", ADDR_INH }, { "rolb", ADDR_INH }, { "decb", ADDR_INH }, { NULL }, { "incb", ADDR_INH }, { "tstb", ADDR_INH }, { NULL }, { "clrb", ADDR_INH }, /* $60 */ { "neg", ADDR_IND }, { "oim", ADDR_IMM8IND }, { "aim", ADDR_IMM8IND }, { "com", ADDR_IND }, { "lsr", ADDR_IND }, { "eim", ADDR_IMM8IND }, { "ror", ADDR_IND }, { "asr", ADDR_IND }, { "lsl", ADDR_IND }, { "rol", ADDR_IND }, { "dec", ADDR_IND }, { "tim", ADDR_IMM8IND }, { "inc", ADDR_IND }, { "tst", ADDR_IND }, { "jmp", ADDR_IND }, { "clr", ADDR_IND }, /* $70 */ { "neg", ADDR_EXT }, { "oim", ADDR_IMM8EXT }, { "aim", ADDR_IMM8EXT }, { "com", ADDR_EXT }, { "lsr", ADDR_EXT }, { "eim", ADDR_IMM8EXT }, { "ror", ADDR_EXT }, { "asr", ADDR_EXT }, { "lsl", ADDR_EXT }, { "rol", ADDR_EXT }, { "dec", ADDR_EXT }, { "tim", ADDR_IMM8EXT }, { "inc", ADDR_EXT }, { "tst", ADDR_EXT }, { "jmp", ADDR_EXT }, { "clr", ADDR_EXT }, /* $80 */ { "suba", ADDR_IMM8 }, { "cmpa", ADDR_IMM8 }, { "sbca", ADDR_IMM8 }, { "subd", ADDR_IMM16 }, { "anda", ADDR_IMM8 }, { "bita", ADDR_IMM8 }, { "lda", ADDR_IMM8 }, { NULL }, { "eora", ADDR_IMM8 }, { "adca", ADDR_IMM8 }, { "ora", ADDR_IMM8 }, { "adda", ADDR_IMM8 }, { "cmpx", ADDR_IMM16 }, { "bsr", ADDR_REL8 }, { "ldx", ADDR_IMM16 }, { NULL }, /* $90 */ { "suba", ADDR_DIR }, { "cmpa", ADDR_DIR }, { "sbca", ADDR_DIR }, { "subd", ADDR_DIR }, { "anda", ADDR_DIR }, { "bita", ADDR_DIR }, { "lda", ADDR_DIR }, { "sta", ADDR_DIR }, { "eora", ADDR_DIR }, { "adca", ADDR_DIR }, { "ora", ADDR_DIR }, { "adda", ADDR_DIR }, { "cmpx", ADDR_DIR }, { "jsr", ADDR_DIR }, { "ldx", ADDR_DIR }, { "stx", ADDR_DIR }, /* $A0 */ { "suba", ADDR_IND }, { "cmpa", ADDR_IND }, { "sbca", ADDR_IND }, { "subd", ADDR_IND }, { "anda", ADDR_IND }, { "bita", ADDR_IND }, { "lda", ADDR_IND }, { "sta", ADDR_IND }, { "eora", ADDR_IND }, { "adca", ADDR_IND }, { "ora", ADDR_IND }, { "adda", ADDR_IND }, { "cmpx", ADDR_IND }, { "jsr", ADDR_IND }, { "ldx", ADDR_IND }, { "stx", ADDR_IND }, /* $B0 */ { "suba", ADDR_EXT }, { "cmpa", ADDR_EXT }, { "sbca", ADDR_EXT }, { "subd", ADDR_EXT }, { "anda", ADDR_EXT }, { "bita", ADDR_EXT }, { "lda", ADDR_EXT }, { "sta", ADDR_EXT }, { "eora", ADDR_EXT }, { "adca", ADDR_EXT }, { "ora", ADDR_EXT }, { "adda", ADDR_EXT }, { "cmpx", ADDR_EXT }, { "jsr", ADDR_EXT }, { "ldx", ADDR_EXT }, { "stx", ADDR_EXT }, /* $C0 */ { "subb", ADDR_IMM8 }, { "cmpb", ADDR_IMM8 }, { "sbcb", ADDR_IMM8 }, { "addd", ADDR_IMM16 }, { "andb", ADDR_IMM8 }, { "bitb", ADDR_IMM8 }, { "ldb", ADDR_IMM8 }, { NULL }, { "eorb", ADDR_IMM8 }, { "adcb", ADDR_IMM8 }, { "orb", ADDR_IMM8 }, { "addb", ADDR_IMM8 }, { "ldd", ADDR_IMM16 }, { "ldq", ADDR_IMM32 }, { "ldu", ADDR_IMM16 }, { NULL }, /* $D0 */ { "subb", ADDR_DIR }, { "cmpb", ADDR_DIR }, { "sbcb", ADDR_DIR }, { "addd", ADDR_DIR }, { "andb", ADDR_DIR }, { "bitb", ADDR_DIR }, { "ldb", ADDR_DIR }, { "stb", ADDR_DIR }, { "eorb", ADDR_DIR }, { "adcb", ADDR_DIR }, { "orb", ADDR_DIR }, { "addb", ADDR_DIR }, { "ldd", ADDR_DIR }, { "std", ADDR_DIR }, { "ldu", ADDR_DIR }, { "stu", ADDR_DIR }, /* $E0 */ { "subb", ADDR_IND }, { "cmpb", ADDR_IND }, { "sbcb", ADDR_IND }, { "addd", ADDR_IND }, { "andb", ADDR_IND }, { "bitb", ADDR_IND }, { "ldb", ADDR_IND }, { "stb", ADDR_IND }, { "eorb", ADDR_IND }, { "adcb", ADDR_IND }, { "orb", ADDR_IND }, { "addb", ADDR_IND }, { "ldd", ADDR_IND }, { "std", ADDR_IND }, { "ldu", ADDR_IND }, { "stu", ADDR_IND }, /* $F0 */ { "subb", ADDR_EXT }, { "cmpb", ADDR_EXT }, { "sbcb", ADDR_EXT }, { "addd", ADDR_EXT }, { "andb", ADDR_EXT }, { "bitb", ADDR_EXT }, { "ldb", ADDR_EXT }, { "stb", ADDR_EXT }, { "eorb", ADDR_EXT }, { "adcb", ADDR_EXT }, { "orb", ADDR_EXT }, { "addb", ADDR_EXT }, { "ldd", ADDR_EXT }, { "std", ADDR_EXT }, { "ldu", ADDR_EXT }, { "stu", ADDR_EXT } }; /* $10 prefix */ instab_t page1_6309[] = { { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $10 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $20 */ { NULL }, { "lbrn", ADDR_REL16 }, { "lbhi", ADDR_REL16 }, { "lbls", ADDR_REL16 }, { "lbcc", ADDR_REL16 }, { "lbcs", ADDR_REL16 }, { "lbne", ADDR_REL16 }, { "lbeq", ADDR_REL16 }, { "lbvc", ADDR_REL16 }, { "lbvs", ADDR_REL16 }, { "lbpl", ADDR_REL16 }, { "lbmi", ADDR_REL16 }, { "lbge", ADDR_REL16 }, { "lblt", ADDR_REL16 }, { "lbgt", ADDR_REL16 }, { "lble", ADDR_REL16 }, /* $30 */ { "addr", ADDR_RTOR }, { "adcr", ADDR_RTOR }, { "subr", ADDR_RTOR }, { "sbcr", ADDR_RTOR }, { "andr", ADDR_RTOR }, { "orr", ADDR_RTOR }, { "eorr", ADDR_RTOR }, { "cmpr", ADDR_RTOR }, { "pshsw", ADDR_INH }, { "pulsw", ADDR_INH }, { "pshuw", ADDR_INH }, { "puluw", ADDR_INH }, { NULL }, { NULL }, { NULL }, { "swi2", ADDR_INH }, /* $40 */ { "negd", ADDR_INH }, { NULL }, { NULL }, { "comd", ADDR_INH }, { "lsrd", ADDR_INH }, { NULL }, { "rord", ADDR_INH }, { "asrd", ADDR_INH }, { "lsld", ADDR_INH }, { "rold", ADDR_INH }, { "decd", ADDR_INH }, { NULL }, { "incd", ADDR_INH }, { "tstd", ADDR_INH }, { NULL }, { "clrd", ADDR_INH }, /* $50 */ { NULL }, { NULL }, { NULL }, { "comw", ADDR_INH }, { "lsrw", ADDR_INH }, { NULL }, { "rorw", ADDR_INH }, { NULL }, { NULL }, { "rolw", ADDR_INH }, { "decw", ADDR_INH }, { NULL }, { "incw", ADDR_INH }, { "tstw", ADDR_INH }, { NULL }, { "clrw", ADDR_INH }, /* $60 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $70 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $80 */ { "subw", ADDR_IMM16 }, { "cmpw", ADDR_IMM16 }, { "sbcd", ADDR_IMM16 }, { "cmpd", ADDR_IMM16 }, { "andd", ADDR_IMM16 }, { "bitd", ADDR_IMM16 }, { "ldw", ADDR_IMM16 }, { NULL }, { "eord", ADDR_IMM16 }, { "adcd", ADDR_IMM16 }, { "ord", ADDR_IMM16 }, { "addw", ADDR_IMM16 }, { "cmpy", ADDR_IMM16 }, { NULL }, { "ldy", ADDR_IMM16 }, { NULL }, /* $90 */ { "subw", ADDR_DIR }, { "cmpw", ADDR_DIR }, { "sbcd", ADDR_DIR }, { "cmpd", ADDR_DIR }, { "andd", ADDR_DIR }, { "bitd", ADDR_DIR }, { "ldw", ADDR_DIR }, { "stw", ADDR_DIR }, { "eord", ADDR_DIR }, { "adcd", ADDR_DIR }, { "ord", ADDR_DIR }, { "addw", ADDR_DIR }, { "cmpy", ADDR_DIR }, { NULL }, { "ldy", ADDR_DIR }, { "sty", ADDR_DIR }, /* $A0 */ { "subw", ADDR_IND }, { "cmpw", ADDR_IND }, { "sbcd", ADDR_IND }, { "cmpd", ADDR_IND }, { "andd", ADDR_IND }, { "bitd", ADDR_IND }, { "ldw", ADDR_IND }, { "stw", ADDR_IND }, { "eord", ADDR_IND }, { "adcd", ADDR_IND }, { "ord", ADDR_IND }, { "addw", ADDR_IND }, { "cmpy", ADDR_IND }, { NULL }, { "ldy", ADDR_IND }, { "sty", ADDR_IND }, /* $B0 */ { "subw", ADDR_EXT }, { "cmpw", ADDR_EXT }, { "adcd", ADDR_EXT }, { "cmpd", ADDR_EXT }, { "andd", ADDR_EXT }, { "bitd", ADDR_EXT }, { "ldw", ADDR_EXT }, { "stw", ADDR_EXT }, { "eord", ADDR_EXT }, { "adcd", ADDR_EXT }, { "ord", ADDR_EXT }, { "addw", ADDR_EXT }, { "cmpy", ADDR_EXT }, { NULL }, { "ldy", ADDR_EXT }, { "sty", ADDR_EXT }, /* $C0 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "lds", ADDR_IMM16 }, { NULL }, /* $D0 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldq", ADDR_DIR }, { "stq", ADDR_DIR }, { "lds", ADDR_DIR }, { "sts", ADDR_DIR }, /* $E0 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldq", ADDR_IND }, { "stq", ADDR_IND }, { "lds", ADDR_IND }, { "sts", ADDR_IND }, /* $F0 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldq", ADDR_EXT }, { "stq", ADDR_EXT }, { "lds", ADDR_EXT }, { "sts", ADDR_EXT } }; /* $11 prefix */ instab_t page2_6309[] = { { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $10 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $20 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $30 */ { "band", ADDR_BITBIT }, { "biand", ADDR_BITBIT }, { "bor", ADDR_BITBIT }, { "bior", ADDR_BITBIT }, { "beor", ADDR_BITBIT }, { "bieor", ADDR_BITBIT }, { "ldbt", ADDR_BITBIT }, { "stbt", ADDR_BITBIT }, { "tfm", ADDR_TFMPP }, { "tfm", ADDR_TFMMM }, { "tfm", ADDR_TFMPC }, { "tfm", ADDR_TFMCP }, { "bitmd", ADDR_IMM8 }, { "ldmd", ADDR_IMM8 }, { NULL }, { "swi3", ADDR_INH }, /* $40 */ { NULL }, { NULL }, { NULL }, { "come", ADDR_INH }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "dece", ADDR_INH }, { NULL }, { "ince", ADDR_INH }, { "tste", ADDR_INH }, { NULL }, { "clre", ADDR_INH }, /* $50 */ { NULL }, { NULL }, { NULL }, { "comf", ADDR_INH }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { "incf", ADDR_INH }, { NULL }, { "decf", ADDR_INH }, { "tstf", ADDR_INH }, { NULL }, { "clrf", ADDR_INH }, /* $60 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $70 */ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, /* $80 */ { "sube", ADDR_IMM8 }, { "cmpe", ADDR_IMM8 }, { NULL }, { "cmpu", ADDR_IMM16 }, { NULL }, { NULL }, { "lde", ADDR_IMM8 }, { NULL }, { NULL }, { NULL }, { NULL }, { "adde", ADDR_IMM8 }, { "cmps", ADDR_IMM16 }, { "divd", ADDR_IMM8 }, { "divq", ADDR_IMM16 }, { "muld", ADDR_IMM16 }, /* $90 */ { "sube", ADDR_DIR }, { "cmpe", ADDR_DIR }, { NULL }, { "cmpu", ADDR_DIR }, { NULL }, { NULL }, { "lde", ADDR_DIR }, { "ste", ADDR_DIR }, { NULL }, { NULL }, { NULL }, { "adde", ADDR_DIR }, { "cmps", ADDR_DIR }, { "divd", ADDR_DIR }, { "divq", ADDR_DIR }, { "muld", ADDR_DIR }, /* $A0 */ { "sube", ADDR_IND }, { "cmpe", ADDR_IND }, { NULL }, { "cmpu", ADDR_IND }, { NULL }, { NULL }, { "lde", ADDR_IND }, { "ste", ADDR_IND }, { NULL }, { NULL }, { NULL }, { "adde", ADDR_IND }, { "cmps", ADDR_IND }, { "divd", ADDR_IND }, { "divq", ADDR_IND }, { "muld", ADDR_IND }, /* $B0 */ { "sube", ADDR_EXT }, { "cmpe", ADDR_EXT }, { NULL }, { "cmpu", ADDR_EXT }, { NULL }, { NULL }, { "lde", ADDR_EXT }, { "ste", ADDR_EXT }, { NULL }, { NULL }, { NULL }, { "adde", ADDR_EXT }, { "cmps", ADDR_EXT }, { "divd", ADDR_EXT }, { "divq", ADDR_EXT }, { "muld", ADDR_EXT }, /* $C0 */ { "subf", ADDR_IMM8 }, { "cmpf", ADDR_IMM8 }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldf", ADDR_IMM8 }, { NULL }, { NULL }, { NULL }, { NULL }, { "addf", ADDR_IMM8 }, { NULL }, { NULL }, { NULL }, { NULL }, /* $D0 */ { "subf", ADDR_DIR }, { "cmpf", ADDR_DIR }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldf", ADDR_DIR }, { "stf", ADDR_DIR }, { NULL }, { NULL }, { NULL }, { "addf", ADDR_DIR }, { NULL }, { NULL }, { NULL }, { NULL }, /* $E0 */ { "subf", ADDR_IND }, { "cmpf", ADDR_IND }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldf", ADDR_IND }, { "stf", ADDR_IND }, { NULL }, { NULL }, { NULL }, { "addf", ADDR_IND }, { NULL }, { NULL }, { NULL }, { NULL }, /* $F0 */ { "subf", ADDR_EXT }, { "cmpf", ADDR_EXT }, { NULL }, { NULL }, { NULL }, { NULL }, { "ldf", ADDR_EXT }, { "stf", ADDR_EXT }, { NULL }, { NULL }, { NULL }, { "addf", ADDR_EXT }, { NULL }, { NULL }, { NULL }, { NULL } };