Added new CPU SWEET16
git-svn-id: svn://svn.cc65.org/cc65/trunk@3208 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
68
src/ca65/ea.h
Normal file
68
src/ca65/ea.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* ea65.h */
|
||||||
|
/* */
|
||||||
|
/* Effective address structure definition */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 1998-2004 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 EA_H
|
||||||
|
#define EA_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* GetEA result struct */
|
||||||
|
typedef struct EffAddr EffAddr;
|
||||||
|
struct EffAddr {
|
||||||
|
/* First three fields get filled when calling GetEA */
|
||||||
|
unsigned long AddrModeSet; /* Possible addressing modes */
|
||||||
|
struct ExprNode* Expr; /* Expression if any (NULL otherwise) */
|
||||||
|
unsigned Reg; /* Register number in sweet16 mode */
|
||||||
|
|
||||||
|
/* The following fields are used inside instr.c */
|
||||||
|
unsigned AddrMode; /* Actual addressing mode used */
|
||||||
|
unsigned long AddrModeBit; /* Addressing mode as bit mask */
|
||||||
|
unsigned char Opcode; /* Opcode */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of ea.h */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
205
src/ca65/ea65.c
Normal file
205
src/ca65/ea65.c
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* ea65.c */
|
||||||
|
/* */
|
||||||
|
/* 65XX effective address parsing for the ca65 macroassembler */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 1998-2004 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. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ca65 */
|
||||||
|
#include "ea.h"
|
||||||
|
#include "ea65.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "expr.h"
|
||||||
|
#include "instr.h"
|
||||||
|
#include "nexttok.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GetEA (EffAddr* A)
|
||||||
|
/* Parse an effective address, return the result in A */
|
||||||
|
{
|
||||||
|
unsigned long Restrictions;
|
||||||
|
|
||||||
|
/* Clear the output struct */
|
||||||
|
A->AddrModeSet = 0;
|
||||||
|
A->Expr = 0;
|
||||||
|
|
||||||
|
/* Handle an addressing size override */
|
||||||
|
switch (Tok) {
|
||||||
|
case TOK_OVERRIDE_ZP:
|
||||||
|
Restrictions = AM65_DIR | AM65_DIR_X | AM65_DIR_Y;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_OVERRIDE_ABS:
|
||||||
|
Restrictions = AM65_ABS | AM65_ABS_X | AM65_ABS_Y;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_OVERRIDE_FAR:
|
||||||
|
Restrictions = AM65_ABS_LONG | AM65_ABS_LONG_X;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Restrictions = ~0UL; /* None */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the effective address */
|
||||||
|
if (TokIsSep (Tok)) {
|
||||||
|
|
||||||
|
A->AddrModeSet = AM65_IMPLICIT;
|
||||||
|
|
||||||
|
} else if (Tok == TOK_HASH) {
|
||||||
|
|
||||||
|
/* #val */
|
||||||
|
NextTok ();
|
||||||
|
A->Expr = Expression ();
|
||||||
|
A->AddrModeSet = AM65_IMM;
|
||||||
|
|
||||||
|
} else if (Tok == TOK_A) {
|
||||||
|
|
||||||
|
NextTok ();
|
||||||
|
A->AddrModeSet = AM65_ACCU;
|
||||||
|
|
||||||
|
} else if (Tok == TOK_LBRACK) {
|
||||||
|
|
||||||
|
/* [dir] or [dir],y */
|
||||||
|
NextTok ();
|
||||||
|
A->Expr = Expression ();
|
||||||
|
Consume (TOK_RBRACK, "']' expected");
|
||||||
|
if (Tok == TOK_COMMA) {
|
||||||
|
/* [dir],y */
|
||||||
|
NextTok ();
|
||||||
|
Consume (TOK_Y, "`Y' expected");
|
||||||
|
A->AddrModeSet = AM65_DIR_IND_LONG_Y;
|
||||||
|
} else {
|
||||||
|
/* [dir] */
|
||||||
|
A->AddrModeSet = AM65_DIR_IND_LONG;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (Tok == TOK_LPAREN) {
|
||||||
|
|
||||||
|
/* One of the indirect modes */
|
||||||
|
NextTok ();
|
||||||
|
A->Expr = Expression ();
|
||||||
|
|
||||||
|
if (Tok == TOK_COMMA) {
|
||||||
|
|
||||||
|
/* (expr,X) or (rel,S),y */
|
||||||
|
NextTok ();
|
||||||
|
if (Tok == TOK_X) {
|
||||||
|
/* (adr,x) */
|
||||||
|
NextTok ();
|
||||||
|
A->AddrModeSet = AM65_ABS_X_IND | AM65_DIR_X_IND;
|
||||||
|
ConsumeRParen ();
|
||||||
|
} else if (Tok == TOK_S) {
|
||||||
|
/* (rel,s),y */
|
||||||
|
NextTok ();
|
||||||
|
A->AddrModeSet = AM65_STACK_REL_IND_Y;
|
||||||
|
ConsumeRParen ();
|
||||||
|
ConsumeComma ();
|
||||||
|
Consume (TOK_Y, "`Y' expected");
|
||||||
|
} else {
|
||||||
|
Error ("Syntax error");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* (adr) or (adr),y */
|
||||||
|
ConsumeRParen ();
|
||||||
|
if (Tok == TOK_COMMA) {
|
||||||
|
/* (adr),y */
|
||||||
|
NextTok ();
|
||||||
|
Consume (TOK_Y, "`Y' expected");
|
||||||
|
A->AddrModeSet = AM65_DIR_IND_Y;
|
||||||
|
} else {
|
||||||
|
/* (adr) */
|
||||||
|
A->AddrModeSet = AM65_ABS_IND | AM65_DIR_IND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* Remaining stuff:
|
||||||
|
*
|
||||||
|
* adr
|
||||||
|
* adr,x
|
||||||
|
* adr,y
|
||||||
|
* adr,s
|
||||||
|
*/
|
||||||
|
A->Expr = Expression ();
|
||||||
|
|
||||||
|
if (Tok == TOK_COMMA) {
|
||||||
|
|
||||||
|
NextTok ();
|
||||||
|
switch (Tok) {
|
||||||
|
|
||||||
|
case TOK_X:
|
||||||
|
A->AddrModeSet = AM65_ABS_LONG_X | AM65_ABS_X | AM65_DIR_X;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_Y:
|
||||||
|
A->AddrModeSet = AM65_ABS_Y | AM65_DIR_Y;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_S:
|
||||||
|
A->AddrModeSet = AM65_STACK_REL;
|
||||||
|
NextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Error ("Syntax error");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
A->AddrModeSet = AM65_ABS_LONG | AM65_ABS | AM65_DIR;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Apply addressing mode overrides */
|
||||||
|
A->AddrModeSet &= Restrictions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
67
src/ca65/ea65.h
Normal file
67
src/ca65/ea65.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* ea65.h */
|
||||||
|
/* */
|
||||||
|
/* 65XX effective address parsing for the ca65 macroassembler */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 1998-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 EA65_H
|
||||||
|
#define EA65_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Forwards */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct EffAddr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GetEA (EffAddr* A);
|
||||||
|
/* Parse an effective address, return the result in A */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of ea65.h */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
107
src/ca65/easw16.c
Normal file
107
src/ca65/easw16.c
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* easw16.c */
|
||||||
|
/* */
|
||||||
|
/* SWEET16 effective address parsing for the ca65 macroassembler */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2004 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. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ca65 */
|
||||||
|
#include "ea.h"
|
||||||
|
#include "ea65.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "expr.h"
|
||||||
|
#include "instr.h"
|
||||||
|
#include "nexttok.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GetSweet16EA (EffAddr* A)
|
||||||
|
/* Parse an effective address, return the result in A */
|
||||||
|
{
|
||||||
|
/* Clear the output struct */
|
||||||
|
A->AddrModeSet = 0;
|
||||||
|
A->Expr = 0;
|
||||||
|
A->Reg = 0;
|
||||||
|
|
||||||
|
/* Parse the effective address */
|
||||||
|
if (TokIsSep (Tok)) {
|
||||||
|
|
||||||
|
A->AddrModeSet = AMSW16_IMP;
|
||||||
|
|
||||||
|
} else if (Tok == TOK_AT) {
|
||||||
|
|
||||||
|
/* @reg */
|
||||||
|
A->AddrModeSet = AMSW16_IND;
|
||||||
|
NextTok ();
|
||||||
|
if (Tok != TOK_REG) {
|
||||||
|
ErrorSkip ("Register expected");
|
||||||
|
A->Reg = 0;
|
||||||
|
} else {
|
||||||
|
A->Reg = (unsigned) IVal;
|
||||||
|
NextTok ();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (Tok == TOK_REG) {
|
||||||
|
|
||||||
|
A->Reg = (unsigned) IVal;
|
||||||
|
NextTok ();
|
||||||
|
|
||||||
|
if (Tok == TOK_COMMA) {
|
||||||
|
|
||||||
|
/* Rx, Constant */
|
||||||
|
NextTok ();
|
||||||
|
A->Expr = Expression ();
|
||||||
|
|
||||||
|
A->AddrModeSet = AMSW16_IMM;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
A->AddrModeSet = AMSW16_REG;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* OPC ea */
|
||||||
|
A->Expr = Expression ();
|
||||||
|
A->AddrModeSet = AMSW16_BRA;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
68
src/ca65/easw16.h
Normal file
68
src/ca65/easw16.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* easw16.h */
|
||||||
|
/* */
|
||||||
|
/* SWEET16 effective address parsing for the ca65 macroassembler */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2004 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 EASW16_H
|
||||||
|
#define EASW16_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Forwards */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct EffAddr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GetSweet16EA (EffAddr* A);
|
||||||
|
/* Parse an effective address, return the result in A */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of easw16.h */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
162
src/ca65/instr.c
162
src/ca65/instr.c
@@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* R<>merstra<72>e 52 */
|
/* R<>merstra<72>e 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@@ -48,6 +48,8 @@
|
|||||||
/* ca65 */
|
/* ca65 */
|
||||||
#include "asserts.h"
|
#include "asserts.h"
|
||||||
#include "ea.h"
|
#include "ea.h"
|
||||||
|
#include "ea65.h"
|
||||||
|
#include "easw16.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "expr.h"
|
#include "expr.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
@@ -76,6 +78,8 @@ static void PutSEP (const InsDesc* Ins);
|
|||||||
static void PutJMP (const InsDesc* Ins);
|
static void PutJMP (const InsDesc* Ins);
|
||||||
static void PutRTS (const InsDesc* Ins);
|
static void PutRTS (const InsDesc* Ins);
|
||||||
static void PutAll (const InsDesc* Ins);
|
static void PutAll (const InsDesc* Ins);
|
||||||
|
static void PutSweet16 (const InsDesc* Ins);
|
||||||
|
static void PutSweet16Branch (const InsDesc* Ins);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -530,6 +534,43 @@ static const struct {
|
|||||||
#include "sunplus.inc"
|
#include "sunplus.inc"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Instruction table for the SWEET16 pseudo CPU */
|
||||||
|
#define INS_COUNT_SWEET16 27
|
||||||
|
static const struct {
|
||||||
|
unsigned Count;
|
||||||
|
InsDesc Ins[INS_COUNT_SWEET16];
|
||||||
|
} InsTabSweet16 = {
|
||||||
|
INS_COUNT_SWEET16,
|
||||||
|
{
|
||||||
|
{ "ADD", AMSW16_REG, 0xA0, 0, PutSweet16 },
|
||||||
|
{ "BC", AMSW16_BRA, 0x03, 0, PutSweet16Branch },
|
||||||
|
{ "BK", AMSW16_IMP, 0x0A, 0, PutSweet16 },
|
||||||
|
{ "BM", AMSW16_BRA, 0x05, 0, PutSweet16Branch },
|
||||||
|
{ "BM1", AMSW16_BRA, 0x08, 0, PutSweet16Branch },
|
||||||
|
{ "BNC", AMSW16_BRA, 0x02, 0, PutSweet16Branch },
|
||||||
|
{ "BNM1", AMSW16_BRA, 0x09, 0, PutSweet16Branch },
|
||||||
|
{ "BNZ", AMSW16_BRA, 0x07, 0, PutSweet16Branch },
|
||||||
|
{ "BP", AMSW16_BRA, 0x04, 0, PutSweet16Branch },
|
||||||
|
{ "BR", AMSW16_BRA, 0x01, 0, PutSweet16Branch },
|
||||||
|
{ "BS", AMSW16_BRA, 0x0B, 0, PutSweet16Branch },
|
||||||
|
{ "BZ", AMSW16_BRA, 0x06, 0, PutSweet16Branch },
|
||||||
|
{ "CPR", AMSW16_REG, 0xD0, 0, PutSweet16 },
|
||||||
|
{ "DCR", AMSW16_REG, 0xF0, 0, PutSweet16 },
|
||||||
|
{ "INR", AMSW16_REG, 0xE0, 0, PutSweet16 },
|
||||||
|
{ "LD", AMSW16_REG | AMSW16_IND, 0x00, 1, PutSweet16 },
|
||||||
|
{ "LDD", AMSW16_IND, 0x60, 0, PutSweet16 },
|
||||||
|
{ "POP", AMSW16_IND, 0x80, 0, PutSweet16 },
|
||||||
|
{ "POPD", AMSW16_IND, 0xC0, 0, PutSweet16 },
|
||||||
|
{ "RS", AMSW16_IMP, 0x0B, 0, PutSweet16 },
|
||||||
|
{ "RTN", AMSW16_IMP, 0x00, 0, PutSweet16 },
|
||||||
|
{ "SET", AMSW16_IMM, 0x10, 0, PutSweet16 },
|
||||||
|
{ "ST", AMSW16_REG | AMSW16_IND, 0x10, 1, PutSweet16 },
|
||||||
|
{ "STD", AMSW16_IND, 0x70, 0, PutSweet16 },
|
||||||
|
{ "STP", AMSW16_IND, 0x90, 0, PutSweet16 },
|
||||||
|
{ "SUB", AMSW16_IMM, 0xB0, 0, PutSweet16 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* An array with instruction tables */
|
/* An array with instruction tables */
|
||||||
@@ -541,14 +582,17 @@ static const InsTable* InsTabs[CPU_COUNT] = {
|
|||||||
(const InsTable*) &InsTab65816,
|
(const InsTable*) &InsTab65816,
|
||||||
#ifdef SUNPLUS
|
#ifdef SUNPLUS
|
||||||
(const InsTable*) &InsTabSunPlus,
|
(const InsTable*) &InsTabSunPlus,
|
||||||
|
#else
|
||||||
|
NULL,
|
||||||
#endif
|
#endif
|
||||||
|
(const InsTable*) &InsTabSweet16,
|
||||||
};
|
};
|
||||||
const InsTable* InsTab = (const InsTable*) &InsTab6502;
|
const InsTable* InsTab = (const InsTable*) &InsTab6502;
|
||||||
|
|
||||||
/* Table to build the effective opcode from a base opcode and an addressing
|
/* Table to build the effective 65xx opcode from a base opcode and an
|
||||||
* mode.
|
* addressing mode.
|
||||||
*/
|
*/
|
||||||
unsigned char EATab [9][AMI_COUNT] = {
|
static unsigned char EATab[9][AM65I_COUNT] = {
|
||||||
{ /* Table 0 */
|
{ /* Table 0 */
|
||||||
0x00, 0x00, 0x05, 0x0D, 0x0F, 0x15, 0x1D, 0x1F,
|
0x00, 0x00, 0x05, 0x0D, 0x0F, 0x15, 0x1D, 0x1F,
|
||||||
0x00, 0x19, 0x12, 0x00, 0x07, 0x11, 0x17, 0x01,
|
0x00, 0x19, 0x12, 0x00, 0x07, 0x11, 0x17, 0x01,
|
||||||
@@ -605,8 +649,20 @@ unsigned char EATab [9][AMI_COUNT] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Table that encodes the additional bytes for each instruction */
|
/* Table to build the effective SWEET16 opcode from a base opcode and an
|
||||||
unsigned char ExtBytes [AMI_COUNT] = {
|
* addressing mode.
|
||||||
|
*/
|
||||||
|
static unsigned char Sweet16EATab[2][AMSW16I_COUNT] = {
|
||||||
|
{ /* Table 0 */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
{ /* Table 1 */
|
||||||
|
0x00, 0x00, 0x00, 0x40, 0x20,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Table that encodes the additional bytes for each 65xx instruction */
|
||||||
|
unsigned char ExtBytes[AM65I_COUNT] = {
|
||||||
0, /* Implicit */
|
0, /* Implicit */
|
||||||
0, /* Accu */
|
0, /* Accu */
|
||||||
1, /* Direct */
|
1, /* Direct */
|
||||||
@@ -634,10 +690,19 @@ unsigned char ExtBytes [AMI_COUNT] = {
|
|||||||
2 /* Blockmove */
|
2 /* Blockmove */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Table that encodes the additional bytes for each SWEET16 instruction */
|
||||||
|
static unsigned char Sweet16ExtBytes[AMSW16I_COUNT] = {
|
||||||
|
0, /* AMSW16_IMP */
|
||||||
|
1, /* AMSW16_BRA */
|
||||||
|
2, /* AMSW16_IMM */
|
||||||
|
0, /* AMSW16_IND */
|
||||||
|
0, /* AMSW16_REG */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Handler functions */
|
/* Handler functions for 6502 derivates */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
@@ -680,11 +745,11 @@ static int EvalEA (const InsDesc* Ins, EffAddr* A)
|
|||||||
switch (ED.AddrSize) {
|
switch (ED.AddrSize) {
|
||||||
|
|
||||||
case ADDR_SIZE_ABS:
|
case ADDR_SIZE_ABS:
|
||||||
A->AddrModeSet &= ~AM_SET_ZP;
|
A->AddrModeSet &= ~AM65_SET_ZP;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADDR_SIZE_FAR:
|
case ADDR_SIZE_FAR:
|
||||||
A->AddrModeSet &= ~(AM_SET_ZP | AM_SET_ABS);
|
A->AddrModeSet &= ~(AM65_SET_ZP | AM65_SET_ABS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -706,8 +771,8 @@ static int EvalEA (const InsDesc* Ins, EffAddr* A)
|
|||||||
* emit a warning. This warning protects against a typo, where the '#'
|
* emit a warning. This warning protects against a typo, where the '#'
|
||||||
* for the immediate operand is omitted.
|
* for the immediate operand is omitted.
|
||||||
*/
|
*/
|
||||||
if (A->Expr && (Ins->AddrMode & AM_IMM) &&
|
if (A->Expr && (Ins->AddrMode & AM65_IMM) &&
|
||||||
(A->AddrModeSet & (AM_DIR | AM_ABS | AM_ABS_LONG)) &&
|
(A->AddrModeSet & (AM65_DIR | AM65_ABS | AM65_ABS_LONG)) &&
|
||||||
ExtBytes[A->AddrMode] == 1) {
|
ExtBytes[A->AddrMode] == 1) {
|
||||||
|
|
||||||
/* Found, check the expression */
|
/* Found, check the expression */
|
||||||
@@ -745,7 +810,7 @@ static void EmitCode (EffAddr* A)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
if (CPU == CPU_65816 && (A->AddrModeBit & (AM_ABS | AM_ABS_X | AM_ABS_Y))) {
|
if (CPU == CPU_65816 && (A->AddrModeBit & (AM65_ABS | AM65_ABS_X | AM65_ABS_Y))) {
|
||||||
/* This is a 16 bit mode that uses an address. If in 65816,
|
/* This is a 16 bit mode that uses an address. If in 65816,
|
||||||
* mode, force this address into 16 bit range to allow
|
* mode, force this address into 16 bit range to allow
|
||||||
* addressing inside a 64K segment.
|
* addressing inside a 64K segment.
|
||||||
@@ -859,11 +924,11 @@ static void PutREP (const InsDesc* Ins)
|
|||||||
} else {
|
} else {
|
||||||
if (Val & 0x10) {
|
if (Val & 0x10) {
|
||||||
/* Index registers to 16 bit */
|
/* Index registers to 16 bit */
|
||||||
ExtBytes[AMI_IMM_INDEX] = 2;
|
ExtBytes[AM65I_IMM_INDEX] = 2;
|
||||||
}
|
}
|
||||||
if (Val & 0x20) {
|
if (Val & 0x20) {
|
||||||
/* Accu to 16 bit */
|
/* Accu to 16 bit */
|
||||||
ExtBytes[AMI_IMM_ACCU] = 2;
|
ExtBytes[AM65I_IMM_ACCU] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -887,11 +952,11 @@ static void PutSEP (const InsDesc* Ins)
|
|||||||
} else {
|
} else {
|
||||||
if (Val & 0x10) {
|
if (Val & 0x10) {
|
||||||
/* Index registers to 8 bit */
|
/* Index registers to 8 bit */
|
||||||
ExtBytes [AMI_IMM_INDEX] = 1;
|
ExtBytes[AM65I_IMM_INDEX] = 1;
|
||||||
}
|
}
|
||||||
if (Val & 0x20) {
|
if (Val & 0x20) {
|
||||||
/* Accu to 8 bit */
|
/* Accu to 8 bit */
|
||||||
ExtBytes [AMI_IMM_ACCU] = 1;
|
ExtBytes[AM65I_IMM_ACCU] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -912,7 +977,7 @@ static void PutJMP (const InsDesc* Ins)
|
|||||||
if (EvalEA (Ins, &A)) {
|
if (EvalEA (Ins, &A)) {
|
||||||
|
|
||||||
/* Check for indirect addressing */
|
/* Check for indirect addressing */
|
||||||
if (A.AddrModeBit & AM_ABS_IND) {
|
if (A.AddrModeBit & AM65_ABS_IND) {
|
||||||
|
|
||||||
/* Compare the low byte of the expression to 0xFF to check for
|
/* Compare the low byte of the expression to 0xFF to check for
|
||||||
* a page cross. Be sure to use a copy of the expression otherwise
|
* a page cross. Be sure to use a copy of the expression otherwise
|
||||||
@@ -963,7 +1028,68 @@ static void PutAll (const InsDesc* Ins)
|
|||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Code */
|
/* Handler functions for SWEET16 */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void PutSweet16 (const InsDesc* Ins)
|
||||||
|
/* Handle a generic sweet16 instruction */
|
||||||
|
{
|
||||||
|
EffAddr A;
|
||||||
|
|
||||||
|
/* Evaluate the addressing mode used */
|
||||||
|
GetSweet16EA (&A);
|
||||||
|
|
||||||
|
/* From the possible addressing modes, remove the ones that are invalid
|
||||||
|
* for this instruction or CPU.
|
||||||
|
*/
|
||||||
|
A.AddrModeSet &= Ins->AddrMode;
|
||||||
|
|
||||||
|
/* Check if we have any adressing modes left */
|
||||||
|
if (A.AddrModeSet == 0) {
|
||||||
|
Error ("Illegal addressing mode");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
A.AddrMode = BitFind (A.AddrModeSet);
|
||||||
|
A.AddrModeBit = (0x01UL << A.AddrMode);
|
||||||
|
|
||||||
|
/* Build the opcode */
|
||||||
|
A.Opcode = Ins->BaseCode | Sweet16EATab[Ins->ExtCode][A.AddrMode] | A.Reg;
|
||||||
|
|
||||||
|
/* Check how many extension bytes are needed and output the instruction */
|
||||||
|
switch (Sweet16ExtBytes[A.AddrMode]) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
Emit0 (A.Opcode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
Emit1 (A.Opcode, A.Expr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
Emit2 (A.Opcode, A.Expr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Internal ("Invalid operand byte count: %u", Sweet16ExtBytes[A.AddrMode]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void PutSweet16Branch (const InsDesc* Ins)
|
||||||
|
/* Handle a sweet16 branch instruction */
|
||||||
|
{
|
||||||
|
EmitPCRel (Ins->BaseCode, GenBranchExpr (2), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* R<>merstrasse 52 */
|
/* R<>merstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Data */
|
/* Data for 6502 and successors */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
@@ -57,43 +57,43 @@
|
|||||||
* When assembling for the 6502 or 65C02, all addressing modes that are not
|
* When assembling for the 6502 or 65C02, all addressing modes that are not
|
||||||
* available on these CPUs are removed before doing any checks.
|
* available on these CPUs are removed before doing any checks.
|
||||||
*/
|
*/
|
||||||
#define AM_IMPLICIT 0x00000003UL
|
#define AM65_IMPLICIT 0x00000003UL
|
||||||
#define AM_ACCU 0x00000002UL
|
#define AM65_ACCU 0x00000002UL
|
||||||
#define AM_DIR 0x00000004UL
|
#define AM65_DIR 0x00000004UL
|
||||||
#define AM_ABS 0x00000008UL
|
#define AM65_ABS 0x00000008UL
|
||||||
#define AM_ABS_LONG 0x00000010UL
|
#define AM65_ABS_LONG 0x00000010UL
|
||||||
#define AM_DIR_X 0x00000020UL
|
#define AM65_DIR_X 0x00000020UL
|
||||||
#define AM_ABS_X 0x00000040UL
|
#define AM65_ABS_X 0x00000040UL
|
||||||
#define AM_ABS_LONG_X 0x00000080UL
|
#define AM65_ABS_LONG_X 0x00000080UL
|
||||||
#define AM_DIR_Y 0x00000100UL
|
#define AM65_DIR_Y 0x00000100UL
|
||||||
#define AM_ABS_Y 0x00000200UL
|
#define AM65_ABS_Y 0x00000200UL
|
||||||
#define AM_DIR_IND 0x00000400UL
|
#define AM65_DIR_IND 0x00000400UL
|
||||||
#define AM_ABS_IND 0x00000800UL
|
#define AM65_ABS_IND 0x00000800UL
|
||||||
#define AM_DIR_IND_LONG 0x00001000UL
|
#define AM65_DIR_IND_LONG 0x00001000UL
|
||||||
#define AM_DIR_IND_Y 0x00002000UL
|
#define AM65_DIR_IND_Y 0x00002000UL
|
||||||
#define AM_DIR_IND_LONG_Y 0x00004000UL
|
#define AM65_DIR_IND_LONG_Y 0x00004000UL
|
||||||
#define AM_DIR_X_IND 0x00008000UL
|
#define AM65_DIR_X_IND 0x00008000UL
|
||||||
#define AM_ABS_X_IND 0x00010000UL
|
#define AM65_ABS_X_IND 0x00010000UL
|
||||||
#define AM_REL 0x00020000UL
|
#define AM65_REL 0x00020000UL
|
||||||
#define AM_REL_LONG 0x00040000UL
|
#define AM65_REL_LONG 0x00040000UL
|
||||||
#define AM_STACK_REL 0x00080000UL
|
#define AM65_STACK_REL 0x00080000UL
|
||||||
#define AM_STACK_REL_IND_Y 0x00100000UL
|
#define AM65_STACK_REL_IND_Y 0x00100000UL
|
||||||
#define AM_IMM_ACCU 0x00200000UL
|
#define AM65_IMM_ACCU 0x00200000UL
|
||||||
#define AM_IMM_INDEX 0x00400000UL
|
#define AM65_IMM_INDEX 0x00400000UL
|
||||||
#define AM_IMM_IMPLICIT 0x00800000UL
|
#define AM65_IMM_IMPLICIT 0x00800000UL
|
||||||
#define AM_IMM (AM_IMM_ACCU | AM_IMM_INDEX | AM_IMM_IMPLICIT)
|
#define AM65_IMM (AM65_IMM_ACCU | AM65_IMM_INDEX | AM65_IMM_IMPLICIT)
|
||||||
#define AM_BLOCKMOVE 0x01000000UL
|
#define AM65_BLOCKMOVE 0x01000000UL
|
||||||
|
|
||||||
/* Bitmask for all ZP operations that have correspondent ABS ops */
|
/* Bitmask for all ZP operations that have correspondent ABS ops */
|
||||||
#define AM_SET_ZP (AM_DIR | AM_DIR_X | AM_DIR_Y | AM_DIR_IND | AM_DIR_X_IND)
|
#define AM65_SET_ZP (AM65_DIR | AM65_DIR_X | AM65_DIR_Y | AM65_DIR_IND | AM65_DIR_X_IND)
|
||||||
|
|
||||||
/* Bitmask for all ABS operations that have correspondent FAR ops */
|
/* Bitmask for all ABS operations that have correspondent FAR ops */
|
||||||
#define AM_SET_ABS (AM_ABS | AM_ABS_X)
|
#define AM65_SET_ABS (AM65_ABS | AM65_ABS_X)
|
||||||
|
|
||||||
/* Bit numbers and count */
|
/* Bit numbers and count */
|
||||||
#define AMI_IMM_ACCU 21
|
#define AM65I_IMM_ACCU 21
|
||||||
#define AMI_IMM_INDEX 22
|
#define AM65I_IMM_INDEX 22
|
||||||
#define AMI_COUNT 25
|
#define AM65I_COUNT 25
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -117,18 +117,30 @@ struct InsTable {
|
|||||||
/* The instruction table for the currently active CPU */
|
/* The instruction table for the currently active CPU */
|
||||||
extern const InsTable* InsTab;
|
extern const InsTable* InsTab;
|
||||||
|
|
||||||
/* Table to build the effective opcode from a base opcode and an addressing
|
|
||||||
* mode.
|
|
||||||
*/
|
|
||||||
extern unsigned char EATab [9][AMI_COUNT];
|
|
||||||
|
|
||||||
/* Table that encodes the additional bytes for each instruction */
|
/* Table that encodes the additional bytes for each instruction */
|
||||||
extern unsigned char ExtBytes [AMI_COUNT];
|
extern unsigned char ExtBytes[AM65I_COUNT];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Code */
|
/* Data for the SWEET16 pseudo CPU */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* SWEET16 addressing modes */
|
||||||
|
#define AMSW16_IMP 0x0001 /* Implicit */
|
||||||
|
#define AMSW16_BRA 0x0002 /* A branch */
|
||||||
|
#define AMSW16_IMM 0x0004 /* Immediate */
|
||||||
|
#define AMSW16_IND 0x0008 /* Indirect */
|
||||||
|
#define AMSW16_REG 0x0010 /* Register */
|
||||||
|
|
||||||
|
#define AMSW16I_COUNT 5 /* Number of addressing modes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ OBJS = anonname.o \
|
|||||||
asserts.o \
|
asserts.o \
|
||||||
condasm.o \
|
condasm.o \
|
||||||
dbginfo.o \
|
dbginfo.o \
|
||||||
ea.o \
|
ea65.o \
|
||||||
|
easw16.o \
|
||||||
enum.o \
|
enum.o \
|
||||||
error.o \
|
error.o \
|
||||||
expr.o \
|
expr.o \
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ OBJS = anonname.obj \
|
|||||||
asserts.obj \
|
asserts.obj \
|
||||||
condasm.obj \
|
condasm.obj \
|
||||||
dbginfo.obj \
|
dbginfo.obj \
|
||||||
ea.obj \
|
ea65.obj \
|
||||||
|
easw16.obj \
|
||||||
enum.obj \
|
enum.obj \
|
||||||
error.obj \
|
error.obj \
|
||||||
expr.obj \
|
expr.obj \
|
||||||
|
|||||||
@@ -269,7 +269,7 @@ static void DoA16 (void)
|
|||||||
Error ("Command is only valid in 65816 mode");
|
Error ("Command is only valid in 65816 mode");
|
||||||
} else {
|
} else {
|
||||||
/* Immidiate mode has two extension bytes */
|
/* Immidiate mode has two extension bytes */
|
||||||
ExtBytes [AMI_IMM_ACCU] = 2;
|
ExtBytes [AM65I_IMM_ACCU] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,7 +282,7 @@ static void DoA8 (void)
|
|||||||
Error ("Command is only valid in 65816 mode");
|
Error ("Command is only valid in 65816 mode");
|
||||||
} else {
|
} else {
|
||||||
/* Immidiate mode has one extension byte */
|
/* Immidiate mode has one extension byte */
|
||||||
ExtBytes [AMI_IMM_ACCU] = 1;
|
ExtBytes [AM65I_IMM_ACCU] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -943,7 +943,7 @@ static void DoI16 (void)
|
|||||||
Error ("Command is only valid in 65816 mode");
|
Error ("Command is only valid in 65816 mode");
|
||||||
} else {
|
} else {
|
||||||
/* Immidiate mode has two extension bytes */
|
/* Immidiate mode has two extension bytes */
|
||||||
ExtBytes [AMI_IMM_INDEX] = 2;
|
ExtBytes [AM65I_IMM_INDEX] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -956,7 +956,7 @@ static void DoI8 (void)
|
|||||||
Error ("Command is only valid in 65816 mode");
|
Error ("Command is only valid in 65816 mode");
|
||||||
} else {
|
} else {
|
||||||
/* Immidiate mode has one extension byte */
|
/* Immidiate mode has one extension byte */
|
||||||
ExtBytes [AMI_IMM_INDEX] = 1;
|
ExtBytes [AM65I_IMM_INDEX] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1501,12 +1501,16 @@ static void DoSetCPU (void)
|
|||||||
if (Tok != TOK_STRCON) {
|
if (Tok != TOK_STRCON) {
|
||||||
ErrorSkip ("String constant expected");
|
ErrorSkip ("String constant expected");
|
||||||
} else {
|
} else {
|
||||||
/* Try to find the CPU, then skip the identifier */
|
/* Try to find the CPU */
|
||||||
cpu_t CPU = FindCPU (SVal);
|
cpu_t CPU = FindCPU (SVal);
|
||||||
NextTok ();
|
|
||||||
|
|
||||||
/* Switch to the new CPU */
|
/* Switch to the new CPU */
|
||||||
SetCPU (CPU);
|
SetCPU (CPU);
|
||||||
|
|
||||||
|
/* Skip the identifier. If the CPU switch was successful, the scanner
|
||||||
|
* will treat the input now correctly for the new CPU.
|
||||||
|
*/
|
||||||
|
NextTok ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -640,6 +640,32 @@ static unsigned ReadStringConst (int StringTerm)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int Sweet16Reg (const char* Ident)
|
||||||
|
/* Check if the given identifier is a sweet16 register. Return -1 if this is
|
||||||
|
* not the case, return the register number otherwise.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
unsigned RegNum;
|
||||||
|
char Check;
|
||||||
|
|
||||||
|
if (Ident[0] != 'r' && Ident[0] != 'R') {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!IsDigit (Ident[1])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sscanf (Ident+1, "%u%c", &RegNum, &Check) != 1 || RegNum > 15) {
|
||||||
|
/* Invalid register */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The register number is valid */
|
||||||
|
return (int) RegNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void NextRawTok (void)
|
void NextRawTok (void)
|
||||||
/* Read the next raw token from the input stream */
|
/* Read the next raw token from the input stream */
|
||||||
{
|
{
|
||||||
@@ -791,6 +817,15 @@ Again:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Indirect op for sweet16 cpu. Must check this before checking for local
|
||||||
|
* symbols, because these may also use the '@' symbol.
|
||||||
|
*/
|
||||||
|
if (CPU == CPU_SWEET16 && C == '@') {
|
||||||
|
NextChar ();
|
||||||
|
Tok = TOK_AT;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Local symbol? */
|
/* Local symbol? */
|
||||||
if (C == LocalStart) {
|
if (C == LocalStart) {
|
||||||
|
|
||||||
@@ -834,7 +869,7 @@ Again:
|
|||||||
if (C == ':') {
|
if (C == ':') {
|
||||||
NextChar ();
|
NextChar ();
|
||||||
Tok = TOK_OVERRIDE_FAR;
|
Tok = TOK_OVERRIDE_FAR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -854,14 +889,21 @@ Again:
|
|||||||
if (C == ':') {
|
if (C == ':') {
|
||||||
NextChar ();
|
NextChar ();
|
||||||
Tok = TOK_OVERRIDE_ZP;
|
Tok = TOK_OVERRIDE_ZP;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
} else if (CPU == CPU_SWEET16 && (IVal = Sweet16Reg (SVal)) >= 0) {
|
||||||
|
|
||||||
|
/* A sweet16 register number in sweet16 mode */
|
||||||
|
Tok = TOK_REG;
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for define style macro */
|
/* Check for define style macro */
|
||||||
if (IsDefine (SVal)) {
|
if (IsDefine (SVal)) {
|
||||||
@@ -1147,7 +1189,7 @@ int TokHasSVal (enum Token Tok)
|
|||||||
int TokHasIVal (enum Token Tok)
|
int TokHasIVal (enum Token Tok)
|
||||||
/* Return true if the given token has an attached IVal */
|
/* Return true if the given token has an attached IVal */
|
||||||
{
|
{
|
||||||
return (Tok == TOK_INTCON || Tok == TOK_CHARCON);
|
return (Tok == TOK_INTCON || Tok == TOK_CHARCON || Tok == TOK_REG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -62,10 +62,11 @@ enum Token {
|
|||||||
TOK_CHARCON, /* Character constant */
|
TOK_CHARCON, /* Character constant */
|
||||||
TOK_STRCON, /* String constant */
|
TOK_STRCON, /* String constant */
|
||||||
|
|
||||||
TOK_A, /* A)ccu */
|
TOK_A, /* A)ccumulator */
|
||||||
TOK_X, /* X register */
|
TOK_X, /* X register */
|
||||||
TOK_Y, /* Y register */
|
TOK_Y, /* Y register */
|
||||||
TOK_S, /* S register */
|
TOK_S, /* S register */
|
||||||
|
TOK_REG, /* Sweet16 R.. register (in sweet16 mode) */
|
||||||
|
|
||||||
TOK_ASSIGN, /* := */
|
TOK_ASSIGN, /* := */
|
||||||
TOK_ULABEL, /* :++ or :-- */
|
TOK_ULABEL, /* :++ or :-- */
|
||||||
@@ -108,6 +109,7 @@ enum Token {
|
|||||||
TOK_RBRACK, /* ] */
|
TOK_RBRACK, /* ] */
|
||||||
TOK_LCURLY, /* { */
|
TOK_LCURLY, /* { */
|
||||||
TOK_RCURLY, /* } */
|
TOK_RCURLY, /* } */
|
||||||
|
TOK_AT, /* @ - in Sweet16 mode */
|
||||||
|
|
||||||
TOK_OVERRIDE_ZP, /* z: */
|
TOK_OVERRIDE_ZP, /* z: */
|
||||||
TOK_OVERRIDE_ABS, /* a: */
|
TOK_OVERRIDE_ABS, /* a: */
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ const char* CPUNames[CPU_COUNT] = {
|
|||||||
"65C02",
|
"65C02",
|
||||||
"65816",
|
"65816",
|
||||||
"sunplus",
|
"sunplus",
|
||||||
|
"sweet16",
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Tables with CPU instruction sets */
|
/* Tables with CPU instruction sets */
|
||||||
@@ -66,7 +67,8 @@ const unsigned CPUIsets[CPU_COUNT] = {
|
|||||||
CPU_ISET_6502 | CPU_ISET_65SC02,
|
CPU_ISET_6502 | CPU_ISET_65SC02,
|
||||||
CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02,
|
CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02,
|
||||||
CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02 | CPU_ISET_65816,
|
CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02 | CPU_ISET_65816,
|
||||||
CPU_ISET_SUNPLUS
|
CPU_ISET_SUNPLUS,
|
||||||
|
CPU_ISET_SWEET16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ typedef enum {
|
|||||||
CPU_65C02,
|
CPU_65C02,
|
||||||
CPU_65816,
|
CPU_65816,
|
||||||
CPU_SUNPLUS, /* Not in the freeware version - sorry */
|
CPU_SUNPLUS, /* Not in the freeware version - sorry */
|
||||||
|
CPU_SWEET16,
|
||||||
CPU_COUNT /* Number of different CPUs */
|
CPU_COUNT /* Number of different CPUs */
|
||||||
} cpu_t;
|
} cpu_t;
|
||||||
|
|
||||||
@@ -63,7 +64,8 @@ enum {
|
|||||||
CPU_ISET_65SC02 = 1 << CPU_65SC02,
|
CPU_ISET_65SC02 = 1 << CPU_65SC02,
|
||||||
CPU_ISET_65C02 = 1 << CPU_65C02,
|
CPU_ISET_65C02 = 1 << CPU_65C02,
|
||||||
CPU_ISET_65816 = 1 << CPU_65816,
|
CPU_ISET_65816 = 1 << CPU_65816,
|
||||||
CPU_ISET_SUNPLUS = 1 << CPU_SUNPLUS
|
CPU_ISET_SUNPLUS = 1 << CPU_SUNPLUS,
|
||||||
|
CPU_ISET_SWEET16 = 1 << CPU_SWEET16,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* CPU used */
|
/* CPU used */
|
||||||
|
|||||||
Reference in New Issue
Block a user