# HG changeset patch
# User lost@l-w.ca
# Date 1280777047 21600
# Node ID 2a94b2e64621278c36f445a50a30a381ca08f056
# Parent b2e007c28b8f7c9e7aa1ad94fa252a8f08cb1ecc
Started creation of lwdisasm
diff -r b2e007c28b8f -r 2a94b2e64621 .hgignore
--- a/.hgignore Fri Jul 23 19:53:43 2010 -0600
+++ b/.hgignore Mon Aug 02 13:24:07 2010 -0600
@@ -6,6 +6,7 @@
lwlink/lwobjdump
lwar/lwar
lwlib/liblw.a
+lwdisasm/lwdisasm
link-warning.h
syntax: regexp
diff -r b2e007c28b8f -r 2a94b2e64621 ChangeLog
--- a/ChangeLog Fri Jul 23 19:53:43 2010 -0600
+++ b/ChangeLog Mon Aug 02 13:24:07 2010 -0600
@@ -16,3 +16,4 @@
Version 3.0
[*] Completely new architecture for lwasm
+[+] Added LWDISASM, a disassembler
diff -r b2e007c28b8f -r 2a94b2e64621 Makefile.am
--- a/Makefile.am Fri Jul 23 19:53:43 2010 -0600
+++ b/Makefile.am Mon Aug 02 13:24:07 2010 -0600
@@ -1,4 +1,4 @@
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = lib lwlib lwasm lwlink lwar
-DIST_SUBDIRS = lib lwlib lwasm lwlink lwar doc
+SUBDIRS = lib lwlib lwasm lwlink lwar lwdisasm
+DIST_SUBDIRS = lib lwlib lwasm lwlink lwar lwdisasm doc
EXTRA_DIST = m4/gnulib-cache.m4
diff -r b2e007c28b8f -r 2a94b2e64621 configure.ac
--- a/configure.ac Fri Jul 23 19:53:43 2010 -0600
+++ b/configure.ac Mon Aug 02 13:24:07 2010 -0600
@@ -12,6 +12,7 @@
lwasm/Makefile
lwlink/Makefile
lwar/Makefile
+ lwdisasm/Makefile
doc/Makefile
])
AC_OUTPUT
diff -r b2e007c28b8f -r 2a94b2e64621 lwdisasm/Makefile.am
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/Makefile.am Mon Aug 02 13:24:07 2010 -0600
@@ -0,0 +1,5 @@
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_builddir)/lwlib -I$(top_srcdir)/lwlib
+bin_PROGRAMS = lwdisasm
+lwdisasm_SOURCES = main.c instab.c instab6309.c
+lwdisasm_LDADD = -L$(top_builddir)/lib -L$(top_srcdir)/lib -L$(top_builddir)/lwlib -L$(top_srcdir)/lwlib -lgnu -llw
+EXTRA_DIST = lwdisasm.h
diff -r b2e007c28b8f -r 2a94b2e64621 lwdisasm/instab.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/instab.c Mon Aug 02 13:24:07 2010 -0600
@@ -0,0 +1,901 @@
+/*
+instab.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 .
+*/
+
+#include
+
+#include
+
+#include "lwdisasm.h"
+
+/* 6809 instruction table */
+
+/* base page */
+instab_t page0_6809[] =
+{
+ { "neg", ADDR_DIR },
+ { NULL },
+ { NULL },
+ { "com", ADDR_DIR },
+ { "lsr", ADDR_DIR },
+ { NULL },
+ { "ror", ADDR_DIR },
+ { "asr", ADDR_DIR },
+ { "lsl", ADDR_DIR },
+ { "rol", ADDR_DIR },
+ { "dec", ADDR_DIR },
+ { NULL },
+ { "inc", ADDR_DIR },
+ { "tst", ADDR_DIR },
+ { "jmp", ADDR_DIR },
+ { "clr", ADDR_DIR },
+
+ /* $10 */
+ { "", ADDR_PAGE1 },
+ { "", ADDR_PAGE2 },
+ { "nop", ADDR_INH },
+ { "sync", ADDR_INH },
+ { NULL },
+ { 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_PSHPUL },
+ { "puls", ADDR_PSHPUL },
+ { "pshu", ADDR_PSHPUL },
+ { "pulu", ADDR_PSHPUL },
+ { 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 },
+ { NULL },
+ { NULL },
+ { "com", ADDR_IND },
+ { "lsr", ADDR_IND },
+ { NULL },
+ { "ror", ADDR_IND },
+ { "asr", ADDR_IND },
+ { "lsl", ADDR_IND },
+ { "rol", ADDR_IND },
+ { "dec", ADDR_IND },
+ { NULL },
+ { "inc", ADDR_IND },
+ { "tst", ADDR_IND },
+ { "jmp", ADDR_IND },
+ { "clr", ADDR_IND },
+
+ /* $70 */
+ { "neg", ADDR_EXT },
+ { NULL },
+ { NULL },
+ { "com", ADDR_EXT },
+ { "lsr", ADDR_EXT },
+ { NULL },
+ { "ror", ADDR_EXT },
+ { "asr", ADDR_EXT },
+ { "lsl", ADDR_EXT },
+ { "rol", ADDR_EXT },
+ { "dec", ADDR_EXT },
+ { NULL },
+ { "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 },
+ { NULL },
+ { "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_6809[] =
+{
+ { 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 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "swi2", ADDR_INH },
+
+ /* $40 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $50 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $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 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpd", ADDR_IMM16 },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpy", ADDR_IMM16 },
+ { NULL },
+ { "ldy", ADDR_IMM16 },
+ { NULL },
+
+ /* $90 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpd", ADDR_DIR },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpy", ADDR_DIR },
+ { NULL },
+ { "ldy", ADDR_DIR },
+ { "sty", ADDR_DIR },
+
+ /* $A0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpd", ADDR_IND },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpy", ADDR_IND },
+ { NULL },
+ { "ldy", ADDR_IND },
+ { "sty", ADDR_IND },
+
+ /* $B0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpd", ADDR_EXT },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "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 },
+ { NULL },
+ { NULL },
+ { "lds", ADDR_DIR },
+ { "sts", ADDR_DIR },
+
+ /* $E0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "lds", ADDR_IND },
+ { "sts", ADDR_IND },
+
+ /* $F0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "lds", ADDR_EXT },
+ { "sts", ADDR_EXT }
+};
+
+/* $11 prefix */
+instab_t page2_6809[] =
+{
+ { 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 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "swi3", ADDR_INH },
+
+ /* $40 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $50 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $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 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpu", ADDR_IMM16 },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmps", ADDR_IMM16 },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $90 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpu", ADDR_DIR },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmps", ADDR_DIR },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $A0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpu", ADDR_IND },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmps", ADDR_IND },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $B0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmpu", ADDR_EXT },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { "cmps", ADDR_EXT },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $C0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $D0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $E0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+
+ /* $F0 */
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL },
+ { NULL }
+};
diff -r b2e007c28b8f -r 2a94b2e64621 lwdisasm/instab6309.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/instab6309.c Mon Aug 02 13:24:07 2010 -0600
@@ -0,0 +1,901 @@
+/*
+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 .
+*/
+
+#include
+
+#include
+
+#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_PSHPUL },
+ { "puls", ADDR_PSHPUL },
+ { "pshu", ADDR_PSHPUL },
+ { "pulu", ADDR_PSHPUL },
+ { 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 }
+};
diff -r b2e007c28b8f -r 2a94b2e64621 lwdisasm/lwdisasm.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/lwdisasm.h Mon Aug 02 13:24:07 2010 -0600
@@ -0,0 +1,95 @@
+/*
+lwdisasm.h
+
+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 .
+*/
+
+#ifndef ____lwdisasm_h_seen____
+#define ____lwdisasm_h_seen____
+
+#include
+
+enum
+{
+ INPUT_RAW = 0,
+ INPUT_DECB,
+ INPUT_OBJ,
+ INPUT_OS9
+};
+
+enum
+{
+ TARGET_6809 = 0,
+ TARGET_6309
+};
+
+enum
+{
+ ADDR_DIR = 0,
+ ADDR_EXT,
+ ADDR_IND,
+ ADDR_IMM8,
+ ADDR_IMM16,
+ ADDR_IMM32,
+ ADDR_INH,
+ ADDR_RTOR,
+ ADDR_PSHPUL,
+ ADDR_IMM8DIR,
+ ADDR_IMM8IND,
+ ADDR_IMM8EXT,
+ ADDR_BITBIT,
+ ADDR_REL8,
+ ADDR_REL16,
+ ADDR_PAGE1,
+ ADDR_PAGE2,
+ ADDR_TFMPP,
+ ADDR_TFMMM,
+ ADDR_TFMPC,
+ ADDR_TFMCP
+};
+
+typedef struct disasmstate_s
+{
+ int input_type;
+ int debug_level;
+ char *output_file;
+ char *input_file;
+ int target;
+ uint8_t *filedata; // the file data
+ long filelen; // length of the file data
+ int base; // base address (raw)
+ int entry; // entry address
+} disasmstate_t;
+
+
+
+typedef struct instab_s
+{
+ char *op; // mneumonic
+ int addrmode; // addressing mode
+} instab_t;
+
+extern instab_t page0_6809[];
+extern instab_t page1_6809[];
+extern instab_t page2_6809[];
+
+extern instab_t page0_6309[];
+extern instab_t page1_6309[];
+extern instab_t page2_6309[];
+
+#endif // ____lwdisasm_h_seen____
diff -r b2e007c28b8f -r 2a94b2e64621 lwdisasm/main.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/main.c Mon Aug 02 13:24:07 2010 -0600
@@ -0,0 +1,219 @@
+/*
+main.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 .
+*/
+
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+#include "lwdisasm.h"
+
+/* command line option handling */
+const char *argp_program_version = "lwdisasmasm from " PACKAGE_STRING;
+const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+char *program_name;
+
+static struct argp_option options[] =
+{
+ { "output", 'o', "FILE", 0, "Output to FILE"},
+ { "debug", 'd', "LEVEL", OPTION_ARG_OPTIONAL, "Set debug mode"},
+ { "format", 'f', "TYPE", 0, "Select input format: decb, raw, obj, os9"},
+ { "decb", 'b', 0, 0, "Read DECB .bin format input, equivalent of --format=decb"},
+ { "raw", 'r', 0, 0, "Read raw binary format input, equivalent of --format=raw"},
+ { "obj", 0x100, 0, 0, "Read proprietary object file format, equivalent of --format=obj" },
+ { "6809", '9', 0, 0, "Set disassembler to 6809 only mode" },
+ { "6309", '3', 0, 0, "Set disassembler to 6309 mode (default)" },
+ { "data", 0x101, "RANGE", 0, "Set an address range as data" },
+ { "code", 0x102, "RANGE", 0, "Set an address range as code" },
+ { "entry", 0x103, "ADDR", 0, "Start disassembling at ADDR" },
+ { "base", 0x104, "ADDR", 0, "Set the base address of a raw file" },
+ { 0 }
+};
+
+
+static error_t parse_opts(int key, char *arg, struct argp_state *state)
+{
+ disasmstate_t *as = state -> input;
+ int rangelow, rangehigh;
+ char *e;
+
+ switch (key)
+ {
+
+ case 0x101: // data range
+ rangelow = strtol(arg, &e, 0);
+ if (*e != ':')
+ {
+ fprintf(stderr, "Invalid range: %s\n", arg);
+ exit(1);
+ }
+ rangehigh = strtol(e + 1, NULL, 0);
+ if (rangelow < 0 || rangehigh < 0 || rangehigh < rangelow)
+ {
+ fprintf(stderr, "Invalid range: %s\n", arg);
+ exit(1);
+ }
+ // register the range as data
+ break;
+
+ case 0x102: // code range
+ rangelow = strtol(arg, &e, 0);
+ if (*e != ':')
+ {
+ fprintf(stderr, "Invalid range: %s\n", arg);
+ exit(1);
+ }
+ rangehigh = strtol(e + 1, NULL, 0);
+ if (rangelow < 0 || rangehigh < 0 || rangehigh < rangelow)
+ {
+ fprintf(stderr, "Invalid range: %s\n", arg);
+ exit(1);
+ }
+ // register the range as code
+ break;
+
+ case 0x103: // entry
+ as -> entry = strtol(arg, NULL, 0);
+ break;
+
+ case 0x104: // base
+ as -> base = strtol(arg, NULL, 0);
+ break;
+
+ case 'o':
+ if (as -> output_file)
+ lw_free(as -> output_file);
+ as -> output_file = lw_strdup(arg);
+ break;
+
+ case 'd':
+ if (!arg)
+ as -> debug_level = 50;
+ else
+ as -> debug_level = atoi(arg);
+ break;
+
+ case 'b':
+ as -> input_type = INPUT_DECB;
+ break;
+
+ case 'r':
+ as -> input_type = INPUT_RAW;
+ break;
+
+ case 0x100:
+ as -> input_type = INPUT_OBJ;
+ break;
+
+ case 'f':
+ if (!strcasecmp(arg, "decb"))
+ as -> input_type = INPUT_DECB;
+ else if (!strcasecmp(arg, "raw"))
+ as -> input_type = INPUT_RAW;
+ else if (!strcasecmp(arg, "obj"))
+ as -> input_type = INPUT_OBJ;
+ else if (!strcasecmp(arg, "os9"))
+ as -> input_type = INPUT_OS9;
+ else
+ {
+ fprintf(stderr, "Invalid input format: %s\n", arg);
+ exit(1);
+ }
+ break;
+
+ case '9':
+ as -> target = TARGET_6809;
+ break;
+
+ case '3':
+ as -> target = TARGET_6309;
+ break;
+
+ case ARGP_KEY_END:
+ break;
+
+ case ARGP_KEY_ARG:
+ if (as -> input_file)
+ {
+ fprintf(stderr, "Only one input file allowed\n");
+ exit(1);
+ }
+ as -> input_file = lw_strdup(arg);
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp argp =
+{
+ options,
+ parse_opts,
+ "",
+ "LWDISASM, a HD6309 and MC6809 disassembler"
+};
+
+/*
+main function; parse command line, set up disassembler state, and run the
+disassembler on the first file
+*/
+
+int main(int argc, char **argv)
+{
+ disasmstate_t as = { 0 };
+ FILE *fp;
+
+ /* assembler state */
+ program_name = argv[0];
+
+ /* parse command line arguments */
+ argp_parse(&argp, argc, argv, 0, 0, &as);
+
+ if (as.input_file == NULL)
+ {
+ fprintf(stderr, "No input files specified.\n");
+ exit(1);
+ }
+
+ fp = fopen(as.input_file, "rb");
+ if (!fp)
+ {
+ perror("Cannot open input file");
+ exit(1);
+ }
+
+ fseek(fp, 0, SEEK_END);
+ as.filelen = ftell(fp);
+ rewind(fp);
+
+ as.filedata = lw_alloc(as.filelen);
+ 0 == fread(as.filedata, as.filelen, 1, fp);
+
+ fclose(fp);
+
+ exit(0);
+}