]> git.sur5r.net Git - cc65/commitdiff
Merge pull request #353 from SvOlli/da65
authorOliver Schmidt <ol.sc@web.de>
Tue, 27 Sep 2016 12:56:28 +0000 (14:56 +0200)
committerGitHub <noreply@github.com>
Tue, 27 Sep 2016 12:56:28 +0000 (14:56 +0200)
da65: adding support for 4510 cpu of c65

doc/da65.sgml
src/da65/handler.c
src/da65/handler.h
src/da65/opc4510.c [new file with mode: 0644]
src/da65/opc4510.h [new file with mode: 0644]
src/da65/opctable.c
test/Makefile
test/disassembler/4510-disass.s [new file with mode: 0644]
test/disassembler/Makefile [new file with mode: 0644]

index df8cd777293817fff8d59abe317c748df80cd6ee..a8e32e1c851aab07b74061d70a0b875a9b60dbce 100644 (file)
@@ -114,10 +114,12 @@ Here is a description of all the command line options:
   <item>65sc02
   <item>65c02
   <item>huc6280
+  <item>4510
   </itemize>
 
   6502x is for the NMOS 6502 with unofficial opcodes. huc6280 is the CPU of
-  the PC engine. Support for the 65816 currently is not available.
+  the PC engine. 4510 is the CPU of the Commodore C65. Support for the 65816
+  currently is not available.
 
 
   <label id="option--formfeeds">
@@ -239,6 +241,11 @@ disassembler may be told to recognize either the 65SC02 or 65C02 CPUs. The
 latter understands the same opcodes as the former, plus 16 additional bit
 manipulation and bit test-and-branch commands.
 
+When disassembling 4510 code, due to handling of 16-bit wide branches, da65
+can produce output that can not be re-assembled, when one or more of those
+branches point outside of the disassembled memory. This can happen when text
+or binary data is processed.
+
 While there is some code for the 65816 in the sources, it is currently
 unsupported.
 
index c034aed1406364a9810fe841c3c2e06cb7280785..6249523630005ed7c6a252e1e57f128730240d8f 100644 (file)
@@ -227,6 +227,13 @@ void OH_Immediate (const OpcDesc* D)
 
 
 
+void OH_ImmediateWord (const OpcDesc* D)
+{
+    OneLine (D, "#$%04X", GetCodeWord (PC+1));
+}
+
+
+
 void OH_Direct (const OpcDesc* D)
 {
     /* Get the operand */
@@ -349,6 +356,23 @@ void OH_RelativeLong (const OpcDesc* D attribute ((unused)))
 
 
 
+void OH_RelativeLong4510 (const OpcDesc* D attribute ((unused)))
+{
+    /* Get the operand */
+    signed short Offs = GetCodeWord (PC+1);
+
+    /* Calculate the target address */
+    unsigned Addr = (((int) PC+2) + Offs) & 0xFFFF;
+
+    /* Generate a label in pass 1 */
+    GenerateLabel (D->Flags, Addr);
+
+    /* Output the line */
+    OneLine (D, "%s", GetAddrArg (D->Flags, Addr));
+}
+
+
+
 void OH_DirectIndirect (const OpcDesc* D)
 {
     /* Get the operand */
@@ -377,6 +401,20 @@ void OH_DirectIndirectY (const OpcDesc* D)
 
 
 
+void OH_DirectIndirectZ (const OpcDesc* D)
+{
+    /* Get the operand */
+    unsigned Addr = GetCodeByte (PC+1);
+
+    /* Generate a label in pass 1 */
+    GenerateLabel (D->Flags, Addr);
+
+    /* Output the line */
+    OneLine (D, "(%s),z", GetAddrArg (D->Flags, Addr));
+}
+
+
+
 void OH_DirectXIndirect (const OpcDesc* D)
 {
     /* Get the operand */
@@ -510,7 +548,16 @@ void OH_DirectIndirectLongX (const OpcDesc* D attribute ((unused)))
 
 void OH_StackRelativeIndirectY (const OpcDesc* D attribute ((unused)))
 {
-    Error ("Not implemented");
+    /* Output the line */
+    OneLine (D, "($%02X,s),y", GetCodeByte (PC+1));
+}
+
+
+
+void OH_StackRelativeIndirectY4510 (const OpcDesc* D attribute ((unused)))
+{
+    /* Output the line */
+    OneLine (D, "($%02X,sp),y", GetCodeByte (PC+1));
 }
 
 
index 433ba2594bf4dbfb2962dc541935aa29f9d4678d..c0fa68e56a7874b4d1e639dbf4a298e9f42650cc 100644 (file)
@@ -57,6 +57,7 @@ void OH_Illegal (const OpcDesc* D attribute ((unused)));
 void OH_Accumulator (const OpcDesc*);
 void OH_Implicit (const OpcDesc*);
 void OH_Immediate (const OpcDesc*);
+void OH_ImmediateWord (const OpcDesc*);
 void OH_Direct (const OpcDesc*);
 void OH_DirectX (const OpcDesc*);
 void OH_DirectY (const OpcDesc*);
@@ -67,8 +68,10 @@ void OH_AbsoluteLong (const OpcDesc*);
 void OH_AbsoluteLongX (const OpcDesc*);
 void OH_Relative (const OpcDesc*);
 void OH_RelativeLong (const OpcDesc*);
+void OH_RelativeLong4510 (const OpcDesc*);
 void OH_DirectIndirect (const OpcDesc*);
 void OH_DirectIndirectY (const OpcDesc*);
+void OH_DirectIndirectZ (const OpcDesc*);
 void OH_DirectXIndirect (const OpcDesc*);
 void OH_AbsoluteIndirect (const OpcDesc*);
 
@@ -82,6 +85,7 @@ void OH_ImmediateAbsoluteX (const OpcDesc*);
 void OH_StackRelative (const OpcDesc*);
 void OH_DirectIndirectLongX (const OpcDesc*);
 void OH_StackRelativeIndirectY (const OpcDesc*);
+void OH_StackRelativeIndirectY4510 (const OpcDesc*);
 void OH_DirectIndirectLong (const OpcDesc*);
 void OH_DirectIndirectLongY (const OpcDesc*);
 void OH_BlockMove (const OpcDesc*);
diff --git a/src/da65/opc4510.c b/src/da65/opc4510.c
new file mode 100644 (file)
index 0000000..0356499
--- /dev/null
@@ -0,0 +1,306 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                 opc4510.c                                 */
+/*                                                                           */
+/*                        4510 opcode description table                      */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2003-2011, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+/* da65 */
+#include "handler.h"
+#include "opc4510.h"
+
+
+
+/*****************************************************************************/
+/*                                   Data                                    */
+/*****************************************************************************/
+
+
+
+/* Descriptions for all opcodes */
+const OpcDesc OpcTable_4510[256] = {
+    {   "brk",  1,  flNone,                   OH_Implicit                  }, /* $00 */
+    {   "ora",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $01 */
+    {   "cle",  1,  flNone,                   OH_Implicit                  }, /* $02 */
+    {   "see",  1,  flNone,                   OH_Implicit                  }, /* $03 */
+    {   "tsb",  2,  flUseLabel,               OH_Direct                    }, /* $04 */
+    {   "ora",  2,  flUseLabel,               OH_Direct                    }, /* $05 */
+    {   "asl",  2,  flUseLabel,               OH_Direct                    }, /* $06 */
+    {   "rmb0", 2,  flUseLabel,               OH_Direct                    }, /* $07 */
+    {   "php",  1,  flNone,                   OH_Implicit                  }, /* $08 */
+    {   "ora",  2,  flNone,                   OH_Immediate                 }, /* $09 */
+    {   "asl",  1,  flNone,                   OH_Accumulator               }, /* $0a */
+    {   "tsy",  1,  flNone,                   OH_Implicit                  }, /* $0b */
+    {   "tsb",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $0c */
+    {   "ora",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $0d */
+    {   "asl",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $0e */
+    {   "bbr0", 3,  flUseLabel,               OH_BitBranch                 }, /* $0f */
+    {   "bpl",  2,  flLabel,                  OH_Relative                  }, /* $10 */
+    {   "ora",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $11 */
+    {   "ora",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $12 */
+    {   "lbpl", 3,  flLabel,                  OH_RelativeLong4510          }, /* $13 */
+    {   "trb",  2,  flUseLabel,               OH_Direct                    }, /* $14 */
+    {   "ora",  2,  flUseLabel,               OH_DirectX                   }, /* $15 */
+    {   "asl",  2,  flUseLabel,               OH_DirectX                   }, /* $16 */
+    {   "rmb1", 2,  flUseLabel,               OH_Direct                    }, /* $17 */
+    {   "clc",  1,  flNone,                   OH_Implicit                  }, /* $18 */
+    {   "ora",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $19 */
+    {   "inc",  1,  flNone,                   OH_Accumulator               }, /* $1a */
+    {   "inz",  1,  flNone,                   OH_Implicit                  }, /* $1b */
+    {   "trb",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $1c */
+    {   "ora",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $1d */
+    {   "asl",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $1e */
+    {   "bbr1", 3,  flUseLabel,               OH_BitBranch                 }, /* $1f */
+    {   "jsr",  3,  flLabel,                  OH_Absolute                  }, /* $20 */
+    {   "and",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $21 */
+    {   "jsr",  3,  flLabel,                  OH_JmpAbsoluteIndirect       }, /* $22 */
+    {   "jsr",  3,  flLabel,                  OH_JmpAbsoluteXIndirect      }, /* $23 */
+    {   "bit",  2,  flUseLabel,               OH_Direct                    }, /* $24 */
+    {   "and",  2,  flUseLabel,               OH_Direct                    }, /* $25 */
+    {   "rol",  2,  flUseLabel,               OH_Direct                    }, /* $26 */
+    {   "rmb2", 2,  flUseLabel,               OH_Direct                    }, /* $27 */
+    {   "plp",  1,  flNone,                   OH_Implicit                  }, /* $28 */
+    {   "and",  2,  flNone,                   OH_Immediate                 }, /* $29 */
+    {   "rol",  1,  flNone,                   OH_Accumulator               }, /* $2a */
+    {   "tys",  1,  flNone,                   OH_Implicit                  }, /* $2b */
+    {   "bit",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $2c */
+    {   "and",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $2d */
+    {   "rol",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $2e */
+    {   "bbr2", 3,  flUseLabel,               OH_BitBranch                 }, /* $2f */
+    {   "bmi",  2,  flLabel,                  OH_Relative                  }, /* $30 */
+    {   "and",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $31 */
+    {   "and",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $32 */
+    {   "lbmi", 3,  flLabel,                  OH_RelativeLong4510          }, /* $33 */
+    {   "bit",  2,  flUseLabel,               OH_DirectX                   }, /* $34 */
+    {   "and",  2,  flUseLabel,               OH_DirectX                   }, /* $35 */
+    {   "rol",  2,  flUseLabel,               OH_DirectX                   }, /* $36 */
+    {   "rmb3", 2,  flUseLabel,               OH_Direct                    }, /* $37 */
+    {   "sec",  1,  flNone,                   OH_Implicit                  }, /* $38 */
+    {   "and",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $39 */
+    {   "dec",  1,  flNone,                   OH_Accumulator               }, /* $3a */
+    {   "dez",  1,  flNone,                   OH_Implicit                  }, /* $3b */
+    {   "bit",  3,  flUseLabel,               OH_AbsoluteX                 }, /* $3c */
+    {   "and",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $3d */
+    {   "rol",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $3e */
+    {   "bbr3", 3,  flUseLabel,               OH_BitBranch                 }, /* $3f */
+    {   "rti",  1,  flNone,                   OH_Rts                       }, /* $40 */
+    {   "eor",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $41 */
+    {   "neg",  1,  flNone,                   OH_Implicit                  }, /* $42 */
+    {   "asr",  1,  flNone,                   OH_Accumulator               }, /* $43 */
+    {   "asr",  2,  flUseLabel,               OH_Direct                    }, /* $44 */
+    {   "eor",  2,  flUseLabel,               OH_Direct                    }, /* $45 */
+    {   "lsr",  2,  flUseLabel,               OH_Direct                    }, /* $46 */
+    {   "rmb4", 2,  flUseLabel,               OH_Direct                    }, /* $47 */
+    {   "pha",  1,  flNone,                   OH_Implicit                  }, /* $48 */
+    {   "eor",  2,  flNone,                   OH_Immediate                 }, /* $49 */
+    {   "lsr",  1,  flNone,                   OH_Accumulator               }, /* $4a */
+    {   "taz",  1,  flNone,                   OH_Implicit                  }, /* $4b */
+    {   "jmp",  3,  flLabel,                  OH_JmpAbsolute               }, /* $4c */
+    {   "eor",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $4d */
+    {   "lsr",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $4e */
+    {   "bbr4", 3,  flUseLabel,               OH_BitBranch                 }, /* $4f */
+    {   "bvc",  2,  flLabel,                  OH_Relative                  }, /* $50 */
+    {   "eor",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $51 */
+    {   "eor",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $52 */
+    {   "lbvc", 3,  flLabel,                  OH_RelativeLong4510          }, /* $53 */
+    {   "asr",  2,  flUseLabel,               OH_DirectX                   }, /* $54 */
+    {   "eor",  2,  flUseLabel,               OH_DirectX                   }, /* $55 */
+    {   "lsr",  2,  flUseLabel,               OH_DirectX                   }, /* $56 */
+    {   "rmb5", 2,  flUseLabel,               OH_Direct                    }, /* $57 */
+    {   "cli",  1,  flNone,                   OH_Implicit                  }, /* $58 */
+    {   "eor",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $59 */
+    {   "phy",  1,  flNone,                   OH_Implicit                  }, /* $5a */
+    {   "tab",  1,  flNone,                   OH_Implicit                  }, /* $5b */
+    {   "map",  1,  flNone,                   OH_Implicit                  }, /* $5c */
+    {   "eor",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $5d */
+    {   "lsr",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $5e */
+    {   "bbr5", 3,  flUseLabel,               OH_BitBranch                 }, /* $5f */
+    {   "rts",  1,  flNone,                   OH_Rts                       }, /* $60 */
+    {   "adc",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $61 */
+    {   "rtn",  2,  flNone,                   OH_Immediate                 }, /* $62 */
+    {   "bsr",  3,  flLabel,                  OH_RelativeLong4510          }, /* $63 */
+    {   "stz",  2,  flUseLabel,               OH_Direct                    }, /* $64 */
+    {   "adc",  2,  flUseLabel,               OH_Direct                    }, /* $65 */
+    {   "ror",  2,  flUseLabel,               OH_Direct                    }, /* $66 */
+    {   "rmb6", 2,  flUseLabel,               OH_Direct,                   }, /* $67 */
+    {   "pla",  1,  flNone,                   OH_Implicit                  }, /* $68 */
+    {   "adc",  2,  flNone,                   OH_Immediate                 }, /* $69 */
+    {   "ror",  1,  flNone,                   OH_Accumulator               }, /* $6a */
+    {   "tza",  1,  flNone,                   OH_Implicit                  }, /* $6b */
+    {   "jmp",  3,  flLabel,                  OH_JmpAbsoluteIndirect       }, /* $6c */
+    {   "adc",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $6d */
+    {   "ror",  3,  flUseLabel,               OH_Absolute                  }, /* $6e */
+    {   "bbr6", 3,  flUseLabel,               OH_BitBranch                 }, /* $6f */
+    {   "bvs",  2,  flLabel,                  OH_Relative                  }, /* $70 */
+    {   "adc",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $71 */
+    {   "adc",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $72 */
+    {   "lbvs", 3,  flLabel,                  OH_RelativeLong4510          }, /* $73 */
+    {   "stz",  2,  flUseLabel,               OH_DirectX                   }, /* $74 */
+    {   "adc",  2,  flUseLabel,               OH_DirectX                   }, /* $75 */
+    {   "ror",  2,  flUseLabel,               OH_DirectX                   }, /* $76 */
+    {   "rmb7", 2,  flUseLabel,               OH_Direct                    }, /* $77 */
+    {   "sei",  1,  flNone,                   OH_Implicit                  }, /* $78 */
+    {   "adc",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $79 */
+    {   "ply",  1,  flNone,                   OH_Implicit                  }, /* $7a */
+    {   "tba",  1,  flNone,                   OH_Implicit                  }, /* $7b */
+    {   "jmp",  3,  flLabel,                  OH_AbsoluteXIndirect         }, /* $7c */
+    {   "adc",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $7d */
+    {   "ror",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $7e */
+    {   "bbr7", 3,  flUseLabel,               OH_BitBranch                 }, /* $7f */
+    {   "bra",  2,  flLabel,                  OH_Relative                  }, /* $80 */
+    {   "sta",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $81 */
+    {   "sta",  2,  flNone,                   OH_StackRelativeIndirectY4510}, /* $82 */
+    {   "lbra", 3,  flLabel,                  OH_RelativeLong4510          }, /* $83 */
+    {   "sty",  2,  flUseLabel,               OH_Direct                    }, /* $84 */
+    {   "sta",  2,  flUseLabel,               OH_Direct                    }, /* $85 */
+    {   "stx",  2,  flUseLabel,               OH_Direct                    }, /* $86 */
+    {   "smb0", 2,  flUseLabel,               OH_Direct                    }, /* $87 */
+    {   "dey",  1,  flNone,                   OH_Implicit                  }, /* $88 */
+    {   "bit",  2,  flNone,                   OH_Immediate                 }, /* $89 */
+    {   "txa",  1,  flNone,                   OH_Implicit                  }, /* $8a */
+    {   "sty",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $8b */
+    {   "sty",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $8c */
+    {   "sta",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $8d */
+    {   "stx",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $8e */
+    {   "bbs0", 3,  flUseLabel,               OH_BitBranch                 }, /* $8f */
+    {   "bcc",  2,  flLabel,                  OH_Relative                  }, /* $90 */
+    {   "sta",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $91 */
+    {   "sta",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $92 */
+    {   "lbcc", 3,  flLabel,                  OH_RelativeLong4510          }, /* $93 */
+    {   "sty",  2,  flUseLabel,               OH_DirectX                   }, /* $94 */
+    {   "sta",  2,  flUseLabel,               OH_DirectX                   }, /* $95 */
+    {   "stx",  2,  flUseLabel,               OH_DirectY                   }, /* $96 */
+    {   "smb1", 2,  flUseLabel,               OH_Direct                    }, /* $97 */
+    {   "tya",  1,  flNone,                   OH_Implicit                  }, /* $98 */
+    {   "sta",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $99 */
+    {   "txs",  1,  flNone,                   OH_Implicit                  }, /* $9a */
+    {   "stx",  3,  flUseLabel|flAbsOverride, OH_AbsoluteY                 }, /* $9b */
+    {   "stz",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $9c */
+    {   "sta",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $9d */
+    {   "stz",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $9e */
+    {   "bbs1", 3,  flUseLabel,               OH_BitBranch                 }, /* $9f */
+    {   "ldy",  2,  flNone,                   OH_Immediate                 }, /* $a0 */
+    {   "lda",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $a1 */
+    {   "ldx",  2,  flNone,                   OH_Immediate                 }, /* $a2 */
+    {   "ldz",  2,  flNone,                   OH_Immediate                 }, /* $a3 */
+    {   "ldy",  2,  flUseLabel,               OH_Direct                    }, /* $a4 */
+    {   "lda",  2,  flUseLabel,               OH_Direct                    }, /* $a5 */
+    {   "ldx",  2,  flUseLabel,               OH_Direct                    }, /* $a6 */
+    {   "smb2", 2,  flUseLabel,               OH_Direct                    }, /* $a7 */
+    {   "tay",  1,  flNone,                   OH_Implicit                  }, /* $a8 */
+    {   "lda",  2,  flNone,                   OH_Immediate                 }, /* $a9 */
+    {   "tax",  1,  flNone,                   OH_Implicit                  }, /* $aa */
+    {   "ldz",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ab */
+    {   "ldy",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ac */
+    {   "lda",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ad */
+    {   "ldx",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ae */
+    {   "bbs2", 3,  flUseLabel,               OH_BitBranch                 }, /* $af */
+    {   "bcs",  2,  flLabel,                  OH_Relative                  }, /* $b0 */
+    {   "lda",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $b1 */
+    {   "lda",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $b2 */
+    {   "lbcs", 3,  flLabel,                  OH_RelativeLong4510          }, /* $b3 */
+    {   "ldy",  2,  flUseLabel,               OH_DirectX                   }, /* $b4 */
+    {   "lda",  2,  flUseLabel,               OH_DirectX                   }, /* $b5 */
+    {   "ldx",  2,  flUseLabel,               OH_DirectY                   }, /* $b6 */
+    {   "smb3", 2,  flUseLabel,               OH_Direct                    }, /* $b7 */
+    {   "clv",  1,  flNone,                   OH_Implicit                  }, /* $b8 */
+    {   "lda",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $b9 */
+    {   "tsx",  1,  flNone,                   OH_Implicit                  }, /* $ba */
+    {   "ldz",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $bb */
+    {   "ldy",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $bc */
+    {   "lda",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $bd */
+    {   "ldx",  3,  flUseLabel|flAbsOverride, OH_AbsoluteY                 }, /* $be */
+    {   "bbs3", 3,  flUseLabel,               OH_BitBranch                 }, /* $bf */
+    {   "cpy",  2,  flNone,                   OH_Immediate                 }, /* $c0 */
+    {   "cmp",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $c1 */
+    {   "cpz",  2,  flNone,                   OH_Immediate                 }, /* $c2 */
+    {   "dew",  2,  flUseLabel,               OH_Direct                    }, /* $c3 */
+    {   "cpy",  2,  flUseLabel,               OH_Direct                    }, /* $c4 */
+    {   "cmp",  2,  flUseLabel,               OH_Direct                    }, /* $c5 */
+    {   "dec",  2,  flUseLabel,               OH_Direct                    }, /* $c6 */
+    {   "smb4", 2,  flUseLabel,               OH_Direct                    }, /* $c7 */
+    {   "iny",  1,  flNone,                   OH_Implicit                  }, /* $c8 */
+    {   "cmp",  2,  flNone,                   OH_Immediate                 }, /* $c9 */
+    {   "dex",  1,  flNone,                   OH_Implicit                  }, /* $ca */
+    {   "asw",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $cb */
+    {   "cpy",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $cc */
+    {   "cmp",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $cd */
+    {   "dec",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ce */
+    {   "bbs4", 3,  flUseLabel,               OH_BitBranch                 }, /* $cf */
+    {   "bne",  2,  flLabel,                  OH_Relative                  }, /* $d0 */
+    {   "cmp",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $d1 */
+    {   "cmp",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $d2 */
+    {   "lbne", 3,  flLabel,                  OH_RelativeLong4510          }, /* $d3 */
+    {   "cpz",  2,  flUseLabel,               OH_Direct                    }, /* $d4 */
+    {   "cmp",  2,  flUseLabel,               OH_DirectX                   }, /* $d5 */
+    {   "dec",  2,  flUseLabel,               OH_DirectX                   }, /* $d6 */
+    {   "smb5", 2,  flUseLabel,               OH_Direct                    }, /* $d7 */
+    {   "cld",  1,  flNone,                   OH_Implicit                  }, /* $d8 */
+    {   "cmp",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $d9 */
+    {   "phx",  1,  flNone,                   OH_Implicit                  }, /* $da */
+    {   "phz",  1,  flNone,                   OH_Implicit                  }, /* $db */
+    {   "cpz",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $dc */
+    {   "cmp",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $dd */
+    {   "dec",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $de */
+    {   "bbs5", 3,  flUseLabel,               OH_BitBranch                 }, /* $df */
+    {   "cpx",  2,  flNone,                   OH_Immediate                 }, /* $e0 */
+    {   "sbc",  2,  flUseLabel,               OH_DirectXIndirect           }, /* $e1 */
+    {   "lda",  2,  flNone,                   OH_StackRelativeIndirectY4510}, /* $e2 */
+    {   "inw",  2,  flUseLabel,               OH_Direct                    }, /* $e3 */
+    {   "cpx",  2,  flUseLabel,               OH_Direct                    }, /* $e4 */
+    {   "sbc",  2,  flUseLabel,               OH_Direct                    }, /* $e5 */
+    {   "inc",  2,  flUseLabel,               OH_Direct                    }, /* $e6 */
+    {   "smb6", 2,  flUseLabel,               OH_Direct                    }, /* $e7 */
+    {   "inx",  1,  flNone,                   OH_Implicit                  }, /* $e8 */
+    {   "sbc",  2,  flNone,                   OH_Immediate                 }, /* $e9 */
+    {   "eom",  1,  flNone,                   OH_Implicit                  }, /* $ea */
+    {   "row",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $eb */
+    {   "cpx",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ec */
+    {   "sbc",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ed */
+    {   "inc",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $ee */
+    {   "bbs6", 3,  flUseLabel,               OH_BitBranch                 }, /* $ef */
+    {   "beq",  2,  flLabel,                  OH_Relative                  }, /* $f0 */
+    {   "sbc",  2,  flUseLabel,               OH_DirectIndirectY           }, /* $f1 */
+    {   "sbc",  2,  flUseLabel,               OH_DirectIndirectZ           }, /* $f2 */
+    {   "lbeq", 3,  flLabel,                  OH_RelativeLong4510          }, /* $f3 */
+    {   "phw",  3,  flNone,                   OH_ImmediateWord             }, /* $f4 */
+    {   "sbc",  2,  flUseLabel,               OH_DirectX                   }, /* $f5 */
+    {   "inc",  2,  flUseLabel,               OH_DirectX                   }, /* $f6 */
+    {   "smb7", 2,  flUseLabel,               OH_Direct                    }, /* $f7 */
+    {   "sed",  1,  flNone,                   OH_Implicit                  }, /* $f8 */
+    {   "sbc",  3,  flUseLabel,               OH_AbsoluteY                 }, /* $f9 */
+    {   "plx",  1,  flNone,                   OH_Implicit                  }, /* $fa */
+    {   "plz",  1,  flNone,                   OH_Implicit                  }, /* $fb */
+    {   "phw",  3,  flUseLabel|flAbsOverride, OH_Absolute                  }, /* $fc */
+    {   "sbc",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $fd */
+    {   "inc",  3,  flUseLabel|flAbsOverride, OH_AbsoluteX                 }, /* $fe */
+    {   "bbs7", 3,  flUseLabel,               OH_BitBranch                 }, /* $ff */
+};
diff --git a/src/da65/opc4510.h b/src/da65/opc4510.h
new file mode 100644 (file)
index 0000000..1073595
--- /dev/null
@@ -0,0 +1,58 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                 opc4510.h                                 */
+/*                                                                           */
+/*                        4510 opcode description table                      */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2003      Ullrich von Bassewitz                                       */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+#ifndef OPC4510_H
+#define OPC4510_H
+
+
+
+#include "opcdesc.h"
+
+
+
+/*****************************************************************************/
+/*                                   Data                                    */
+/*****************************************************************************/
+
+
+
+/* Descriptions for all opcodes */
+extern const OpcDesc OpcTable_4510[256];
+
+
+
+/* End of opc4510.h */
+
+#endif
index c85805faf8c96fb88e4048cc39a32c8c52893bed..031b1239b1a4e3f0590731e87fb6ed57c86f2f89 100644 (file)
@@ -35,6 +35,7 @@
 
 /* da65 */
 #include "error.h"
+#include "opc4510.h"
 #include "opc6502.h"
 #include "opc6502x.h"
 #include "opc65816.h"
@@ -73,6 +74,7 @@ void SetOpcTable (cpu_t CPU)
         case CPU_65C02:   OpcTable = OpcTable_65C02;    break;
         case CPU_HUC6280: OpcTable = OpcTable_HuC6280;  break;
         case CPU_M740:    OpcTable = OpcTable_M740;     break;
+        case CPU_4510:    OpcTable = OpcTable_4510;     break;
         default:          Error ("Unsupported CPU");
     }
 }
index 7f95e43798c049bf88157fca25bb70b70c6507aa..f0d63f689d587f4919cd8c3c0aefddf1ecaf6192 100644 (file)
@@ -41,6 +41,7 @@ dotests: mostlyclean continue
 
 continue: $(WORKDIR)/bdiff$(EXE)
        @$(MAKE) -C assembler all
+       @$(MAKE) -C disassembler all
        @$(MAKE) -C val all
        @$(MAKE) -C ref all
        @$(MAKE) -C err all
diff --git a/test/disassembler/4510-disass.s b/test/disassembler/4510-disass.s
new file mode 100644 (file)
index 0000000..96ed641
--- /dev/null
@@ -0,0 +1,298 @@
+.setcpu "4510"
+
+ZP = $12
+ABS = $2345
+
+start:
+   brk
+   ora (ZP,x)
+   cle
+   see
+   tsb ZP
+   ora ZP
+   asl ZP
+   rmb0 ZP
+   php
+   ora #$01
+   asl
+   tsy
+   tsb ABS
+   ora ABS
+   asl ABS
+   bbr0 ZP,label1
+
+label1:
+   bpl label2
+   ora (ZP),y
+   ora (ZP),z
+   lbpl start ; bpl start
+   trb ZP
+   ora ZP,x
+   asl ZP,x
+   rmb1 ZP
+   clc
+   ora ABS,y
+   inc
+   inz
+   trb ABS
+   ora ABS,x
+   asl ABS,x
+   bbr1 ZP,label2
+
+label2:
+   jsr ABS
+   and (ZP,x)
+   jsr ($2345)
+   jsr ($2456,x)
+   bit ZP
+   and ZP
+   rol ZP
+   rmb2 ZP
+   plp
+   and #$01
+   rol
+   tys
+   bit ABS
+   and ABS
+   rol ABS
+   bbr2 ZP,label3
+
+label3:
+   bmi label4
+   and (ZP),y
+   and (ZP),z
+   lbmi start ; bmi start
+   bit ZP,x
+   and ZP,x
+   rol ZP,x
+   rmb3 ZP
+   sec
+   and ABS,y
+   dec
+   dez
+   bit ABS,x
+   and ABS,x
+   rol ABS,x
+   bbr3 ZP,label4
+
+label4:
+   rti
+   eor (ZP,x)
+   neg
+   asr
+   asr ZP
+   eor ZP
+   lsr ZP
+   rmb4 ZP
+   pha
+   eor #$01
+   lsr
+   taz
+   jmp ABS
+   eor ABS
+   lsr ABS
+   bbr4 ZP,label5
+
+label5:
+   bvc label6
+   eor (ZP),y
+   eor (ZP),z
+   lbvc start ; bvc start
+   asr ZP,x
+   eor ZP,x
+   lsr ZP,x
+   rmb5 ZP
+   cli
+   eor ABS,y
+   phy
+   tab
+   map
+   eor ABS,x
+   lsr ABS,x
+   bbr5 ZP,label6
+
+label6:
+   rts
+   adc (ZP,x)
+   rtn #$09
+   bsr start
+   stz ZP
+   adc ZP
+   ror ZP
+   rmb6 ZP
+   pla
+   adc #$01
+   ror
+   tza
+   jmp ($2345)
+   adc ABS
+   ror ABS
+   bbr6 ZP,label7
+
+label7:
+   bvs label8
+   adc (ZP),y
+   adc (ZP),z
+   lbvs start ; bvs start
+   stz ZP,x
+   adc ZP,x
+   ror ZP,x
+   rmb7 ZP
+   sei
+   adc ABS,y
+   ply
+   tba
+   jmp ($2456,x)
+   adc ABS,x
+   ror ABS,x
+   bbr7 ZP,label8
+
+label8:
+   bra label9
+   sta (ZP,x)
+   sta ($0f,sp),y
+   lbra start ; bra start
+   sty ZP
+   sta ZP
+   stx ZP
+   smb0 ZP
+   dey
+   bit #$01
+   txa
+   sty ABS,x
+   sty ABS
+   sta ABS
+   stx ABS
+   bbs0 ZP,label9
+
+label9:
+   bcc labelA
+   sta (ZP),y
+   sta (ZP),z
+   lbcc start ; bcc start
+   sty ZP,x
+   sta ZP,x
+   stx ZP,y
+   smb1 ZP
+   tya
+   sta ABS,y
+   txs
+   stx ABS,y
+   stz ABS
+   sta ABS,x
+   stz ABS,x
+   bbs1 ZP,labelA
+
+labelA:
+   ldy #$01
+   lda (ZP,x)
+   ldx #$01
+   ldz #$01
+   ldy ZP
+   lda ZP
+   ldx ZP
+   smb2 ZP
+   tay
+   lda #$01
+   tax
+   ldz ABS
+   ldy ABS
+   lda ABS
+   ldx ABS
+   bbs2 ZP,labelB
+
+labelB:
+   bcs labelC
+   lda (ZP),y
+   lda (ZP),z
+   lbcs start ; bcs start
+   ldy ZP,x
+   lda ZP,x
+   ldx ZP,y
+   smb3 ZP
+   clv
+   lda ABS,y
+   tsx
+   ldz ABS,x
+   ldy ABS,x
+   lda ABS,x
+   ldx ABS,y
+   bbs3 ZP,labelC
+
+labelC:
+   cpy #$01
+   cmp (ZP,x)
+   cpz #$01
+   dew ZP
+   cpy ZP
+   cmp ZP
+   dec ZP
+   smb4 ZP
+   iny
+   cmp #$01
+   dex
+   asw ABS
+   cpy ABS
+   cmp ABS
+   dec ABS
+   bbs4 ZP,labelD
+
+labelD:
+   bne labelE
+   cmp (ZP),y
+   cmp (ZP),z
+   lbne start ; bne start
+   cpz ZP
+   cmp ZP,x
+   dec ZP,x
+   smb5 ZP
+   cld
+   cmp ABS,y
+   phx
+   phz
+   cpz ABS
+   cmp ABS,x
+   dec ABS,x
+   bbs5 ZP,labelE
+
+labelE:
+   cpx #$01
+   sbc (ZP,x)
+   lda ($0f,sp),y
+   inw ZP
+   cpx ZP
+   sbc ZP
+   inc ZP
+   smb6 ZP
+   inx
+   sbc #$01
+   eom
+   nop
+   row ABS
+   cpx ABS
+   sbc ABS
+   inc ABS
+   bbs6 ZP,labelF
+
+labelF:
+   beq labelG
+   sbc (ZP),y
+   sbc (ZP),z
+   lbeq start ; beq start
+   phw #$089a
+   sbc ZP,x
+   inc ZP,x
+   smb7 ZP
+   sed
+   sbc ABS,y
+   plx
+   plz
+   phd ABS
+   phw ABS
+   sbc ABS,x
+   inc ABS,x
+   bbs7 ZP,labelG
+
+labelG:
+   brk
+
diff --git a/test/disassembler/Makefile b/test/disassembler/Makefile
new file mode 100644 (file)
index 0000000..2621b0c
--- /dev/null
@@ -0,0 +1,42 @@
+
+# makefile for the disassembler regression tests
+
+BINDIR = ../../bin
+WORKDIR := ../../testwrk
+
+#BASE_TARGETS  = 6502 6502x 65sc02 65c02
+#BASE_TARGETS += 4510 huc6280
+BASE_TARGETS  = 4510
+
+START = --start-addr 0x8000
+
+DISASS_TARGETS = $(BASE_TARGETS)
+
+# default target defined later
+all:
+
+# generate opcode targets and expand target list
+define disass
+DISASS_TARGETLIST += $$(WORKDIR)/$(1)-reass.bin $$(WORKDIR)/$(1)-reass.s $$(WORKDIR)/$(1)-disass.bin
+
+$$(WORKDIR)/$(1)-disass.bin: $(1)-disass.s
+       @$$(BINDIR)/cl65 --cpu $(1) -t none $(START) --obj-path $$(WORKDIR) -o $$@ $$<
+       @rm -f $(1)-disass.o #workaround for #168
+
+$$(WORKDIR)/$(1)-reass.s: $$(WORKDIR)/$(1)-disass.bin
+       @$$(BINDIR)/da65 --cpu $(1) $(START) -o $$@ $$<
+
+$$(WORKDIR)/$(1)-reass.bin: $$(WORKDIR)/$(1)-reass.s
+       @$$(BINDIR)/cl65 --cpu $(1) -t none $(START) --obj-path $$(WORKDIR) -o $$@ $$<
+       @rm -f $(1)-reass.o #workaround for #168
+       @cmp $$@ $$(WORKDIR)/$(1)-disass.bin
+       @echo da65 --cpu $(1) ok
+endef
+$(foreach target,$(DISASS_TARGETS),$(eval $(call disass,$(target))))
+
+# now that all targets have been generated, get to the manual ones
+all: $(DISASS_TARGETLIST)
+       @#
+
+.PHONY: all $(DISASS_TARGETLIST)
+