/* code65.c */
/*****************************************************************************/
/* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */
/* */
/* AS */
/* */
/* Code Generator 65xx/MELPS740 */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <string.h>
#include <ctype.h>
#include "bpemu.h"
#include "strutil.h"
#include "asmdef.h"
#include "asmpars.h"
#include "asmsub.h"
#include "asmitree.h"
#include "codepseudo.h"
#include "motpseudo.h"
#include "codevars.h"
#include "errmsg.h"
#include "code65.h"
/*---------------------------------------------------------------------------*/
enum
{
ModZA
= 0, /* aa */
ModA
= 1, /* aabb */
ModZIX
= 2, /* aa,X */
ModIX
= 3, /* aabb,X */
ModZIY
= 4, /* aa,Y */
ModIY
= 5, /* aabb,Y */
ModIndIX
= 6, /* (aa,X) */
ModIndOX
= 7, /* (aa),X */
ModIndOY
= 8, /* (aa),Y */
ModIndOZ
= 9, /* (aa),Z (65CE02-specific) */
ModInd16
=10, /* (aabb) */
ModImm
=11, /* #aa */
ModAcc
=12, /* A */
ModNone
=13, /* */
ModInd8
=14, /* (aa) */
ModIndSPY
=15, /* (aa,SP),Y (65CE02-specific) */
ModSpec
= 16 /* \aabb */
};
typedef struct
{
Word CPUFlag
;
Byte Code
;
} FixedOrder
;
typedef struct
{
LongInt Codes
[ModSpec
+ 1];
} NormOrder
;
typedef struct
{
Word CPUFlag
;
Byte CodeShort
, CodeLong
;
} CondOrder
;
typedef struct
{
ShortInt ErgMode
;
int AdrCnt
;
Byte AdrVals
[2];
} tAdrResult
;
/* NOTE: keep in the same order as in registration in code65_init()! */
#define M_6502 (1 << 0)
#define M_65SC02 (1 << 1)
#define M_65C02 (1 << 2)
#define M_65CE02 (1 << 3)
#define M_W65C02S (1 << 4)
#define M_65C19 (1 << 5)
#define M_MELPS740 (1 << 6)
#define M_HUC6280 (1 << 7)
#define M_6502U (1 << 8)
static Boolean This_CLI_SEI_Flag
, This_ADC_SBC_Flag
,
Last_CLI_SEI_Flag
, Last_ADC_SBC_Flag
;
static FixedOrder
*FixedOrders
;
static NormOrder
*NormOrders
;
static CondOrder
*CondOrders
;
static CPUVar CPU6502
, CPU65SC02
, CPU65C02
, CPU65CE02
, CPUW65C02S
, CPU65C19
, CPUM740
, CPUHUC6280
, CPU6502U
;
static LongInt SpecPage
, RegB
, MPR
[8];
/*---------------------------------------------------------------------------*/
static unsigned ChkZero
(const tStrComp
*pArg
, Byte
*erg
)
{
if ((strlen(pArg
->str.
p_str) > 1) && ((*pArg
->str.
p_str == '<') || (*pArg
->str.
p_str == '>')))
{
*erg
= Ord
(*pArg
->str.
p_str == '<') + 1;
return 1;
}
else
{
*erg
= 0;
return 0;
}
}
static Boolean CPUAllowed
(Word Flag
)
{
return (((Flag
>> (MomCPU
- CPU6502
)) & 1) || False
);
}
static void InsNOP
(void)
{
memmove(BAsmCode
, BAsmCode
+ 1, CodeLen
);
CodeLen
++;
BAsmCode
[0] = NOPCode
;
}
static Boolean IsAllowed
(LongInt Val
)
{
return (CPUAllowed
(Val
>> 8) && (Val
!= -1));
}
static void ChkZeroMode
(tAdrResult
*pResult
, const NormOrder
*pOrder
, ShortInt ZeroMode
)
{
if (pOrder
&& (IsAllowed
(pOrder
->Codes
[ZeroMode
])))
{
pResult
->ErgMode
= ZeroMode
;
pResult
->AdrCnt
--;
}
}
/*---------------------------------------------------------------------------*/
static Word EvalAddress
(const tStrComp
*pArg
, IntType Type
, Boolean
*pOK
)
{
/* for the HUC6280, check if the address is within one of the selected pages */
if (MomCPU
== CPUHUC6280
)
{
Word Page
;
LongWord AbsAddress
;
tSymbolFlags Flags
;
/* get the absolute address */
AbsAddress
= EvalStrIntExpressionWithFlags
(pArg
, UInt21
, pOK
, &Flags
);
if (!*pOK
)
return 0;
/* within one of the 8K pages? */
for (Page
= 0; Page
< 8; Page
++)
if ((LargeInt
)((AbsAddress
>> 13) & 255) == MPR
[Page
])
break;
if (Page
>= 8)
{
WrError
(ErrNum_InAccPage
);
AbsAddress
&= 0x1fff;
}
else
AbsAddress
= (AbsAddress
& 0x1fff) | (Page
<< 13);
/* short address requested? */
if ((Type
!= UInt16
) && (Type
!= Int16
) && Hi
(AbsAddress
))
{
if (mFirstPassUnknown
(Flags
))
AbsAddress
&= 0xff;
else
{
*pOK
= False
;
WrError
(ErrNum_OverRange
);
}
}
return AbsAddress
;
}
/* for the 65CE02, regard basepage register */
else if (MomCPU
== CPU65CE02
)
{
Word Address
;
tSymbolFlags Flags
;
/* alwys get a full 16 bit address */
Address
= EvalStrIntExpressionWithFlags
(pArg
, UInt16
, pOK
, &Flags
);
if (!*pOK
)
return 0;
/* short address requested? */
if ((Type
!= UInt16
) && (Type
!= Int16
))
{
if ((Hi
(Address
) != RegB
) && !mFirstPassUnknown
(Flags
))
{
*pOK
= False
;
WrError
(ErrNum_OverRange
);
}
if (*pOK
)
Address
&= 0xff;
}
return Address
;
}
else
return EvalStrIntExpression
(pArg
, Type
, pOK
);
}
static Boolean IsBasePage
(Byte Page
)
{
return (MomCPU
== CPU65CE02
) ? (Page
== RegB
) : !Page
;
}
static void DecodeAdr
(tAdrResult
*pResult
, const NormOrder
*pOrder
)
{
Word AdrWord
;
Boolean ValOK
;
Byte ZeroMode
;
/* normale Anweisungen: Adressausdruck parsen */
pResult
->ErgMode
= -1;
if (ArgCnt
== 0)
{
pResult
->AdrCnt
= 0;
pResult
->ErgMode
= ModNone
;
}
else if (ArgCnt
== 1)
{
/* 1. Akkuadressierung */
if (!as_strcasecmp
(ArgStr
[1].
str.
p_str, "A"))
{
pResult
->AdrCnt
= 0;
pResult
->ErgMode
= ModAcc
;
}
/* 2. immediate ? */
else if (*ArgStr
[1].
str.
p_str == '#')
{
IntType Type
= Memo
("PHW") ? Int16
: Int8
;
Word Value
;
Value
= EvalStrIntExpressionOffs
(&ArgStr
[1], 1, Type
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModImm
;
pResult
->AdrVals
[0] = Lo
(Value
);
pResult
->AdrCnt
= 1;
if (Int16
== Type
)
pResult
->AdrVals
[pResult
->AdrCnt
++] = Hi
(Value
);
}
}
/* 3. Special Page ? */
else if (*ArgStr
[1].
str.
p_str == '\\')
{
tSymbolFlags Flags
;
AdrWord
= EvalStrIntExpressionOffsWithFlags
(&ArgStr
[1], 1, UInt16
, &ValOK
, &Flags
);
if (ValOK
)
{
if (mFirstPassUnknown
(Flags
))
AdrWord
= (SpecPage
<< 8) | Lo
(AdrWord
);
if (Hi
(AdrWord
) != SpecPage
) WrError
(ErrNum_UnderRange
);
else
{
pResult
->ErgMode
= ModSpec
;
pResult
->AdrVals
[0] = Lo
(AdrWord
);
pResult
->AdrCnt
= 1;
}
}
}
/* 4. X-inner-indirekt ? */
else if ((strlen(ArgStr
[1].
str.
p_str) >= 5) && (!as_strcasecmp
(ArgStr
[1].
str.
p_str + strlen(ArgStr
[1].
str.
p_str) - 3, ",X)")))
{
if (*ArgStr
[1].
str.
p_str != '(') WrError
(ErrNum_InvAddrMode
);
else
{
tStrComp AddrArg
;
StrCompRefRight
(&AddrArg
, &ArgStr
[1], 1);
StrCompShorten
(&AddrArg
, 3);
StrCompIncRefLeft
(&AddrArg
, ChkZero
(&AddrArg
, &ZeroMode
));
if (Memo
("JMP") || Memo
("JSR"))
{
AdrWord
= EvalAddress
(&AddrArg
, UInt16
, &ValOK
);
if (ValOK
)
{
pResult
->AdrVals
[0] = Lo
(AdrWord
);
pResult
->AdrVals
[1] = Hi
(AdrWord
);
pResult
->ErgMode
= ModIndIX
;
pResult
->AdrCnt
= 2;
}
}
else
{
pResult
->AdrVals
[0] = EvalAddress
(&AddrArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModIndIX
;
pResult
->AdrCnt
= 1;
}
}
}
}
else
{
/* 5. indirekt absolut ? */
if (IsIndirect
(ArgStr
[1].
str.
p_str))
{
tStrComp AddrArg
;
StrCompRefRight
(&AddrArg
, &ArgStr
[1], 1);
StrCompShorten
(&AddrArg
, 1);
StrCompIncRefLeft
(&AddrArg
, ChkZero
(&AddrArg
, &ZeroMode
));
if (ZeroMode
== 2)
{
pResult
->AdrVals
[0] = EvalAddress
(&AddrArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModInd8
;
pResult
->AdrCnt
= 1;
}
}
else
{
AdrWord
= EvalAddress
(&AddrArg
, UInt16
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModInd16
;
pResult
->AdrCnt
= 2;
pResult
->AdrVals
[0] = Lo
(AdrWord
);
pResult
->AdrVals
[1] = Hi
(AdrWord
);
if ((ZeroMode
== 0) && IsBasePage
(pResult
->AdrVals
[1]))
ChkZeroMode
(pResult
, pOrder
, ModInd8
);
}
}
}
/* 6. absolut */
else
{
tStrComp AddrArg
;
StrCompRefRight
(&AddrArg
, &ArgStr
[1], ChkZero
(&ArgStr
[1], &ZeroMode
));
if (ZeroMode
== 2)
{
pResult
->AdrVals
[0] = EvalAddress
(&AddrArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModZA
;
pResult
->AdrCnt
= 1;
}
}
else
{
AdrWord
= EvalAddress
(&AddrArg
, UInt16
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModA
;
pResult
->AdrCnt
= 2;
pResult
->AdrVals
[0] = Lo
(AdrWord
);
pResult
->AdrVals
[1] = Hi
(AdrWord
);
if ((ZeroMode
== 0) && IsBasePage
(pResult
->AdrVals
[1]))
ChkZeroMode
(pResult
, pOrder
, ModZA
);
}
}
}
}
}
else if (ArgCnt
== 2)
{
Boolean Indir1
= IsIndirect
(ArgStr
[1].
str.
p_str);
/* 7. stack-relative (65CE02-specific) ? */
if (Indir1
&& !as_strcasecmp
(ArgStr
[2].
str.
p_str, "Y") && (!as_strcasecmp
(ArgStr
[1].
str.
p_str + strlen(ArgStr
[1].
str.
p_str) - 4, ",SP)")))
{
if (*ArgStr
[1].
str.
p_str != '(') WrError
(ErrNum_InvAddrMode
);
else
{
tStrComp DistArg
;
StrCompRefRight
(&DistArg
, &ArgStr
[1], 1);
StrCompShorten
(&DistArg
, 4);
pResult
->AdrVals
[0] = EvalStrIntExpression
(&DistArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModIndSPY
;
pResult
->AdrCnt
= 1;
}
}
}
/* 8. X,Y,Z-outer-indirekt ? */
else if (Indir1
&& (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "X")
|| !as_strcasecmp
(ArgStr
[2].
str.
p_str, "Y")
|| !as_strcasecmp
(ArgStr
[2].
str.
p_str, "Z")))
{
int Mode
= toupper(ArgStr
[2].
str.
p_str[0]) - 'X';
tStrComp AddrArg
;
StrCompRefRight
(&AddrArg
, &ArgStr
[1], 1);
StrCompShorten
(&AddrArg
, 1);
StrCompIncRefLeft
(&AddrArg
, ChkZero
(&AddrArg
, &ZeroMode
));
pResult
->AdrVals
[0] = EvalAddress
(&AddrArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->ErgMode
= ModIndOX
+ Mode
;
pResult
->AdrCnt
= 1;
}
}
/* 9. X,Y-indiziert ? */
else
{
tStrComp AddrArg
;
StrCompRefRight
(&AddrArg
, &ArgStr
[1], ChkZero
(&ArgStr
[1], &ZeroMode
));
if (ZeroMode
== 2)
{
pResult
->AdrVals
[0] = EvalAddress
(&AddrArg
, UInt8
, &ValOK
);
if (ValOK
)
{
pResult
->AdrCnt
= 1;
if (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "X"))
pResult
->ErgMode
= ModZIX
;
else if (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "Y"))
pResult
->ErgMode
= ModZIY
;
else
WrStrErrorPos
(ErrNum_InvReg
, &ArgStr
[2]);
}
}
else
{
AdrWord
= EvalAddress
(&AddrArg
, Int16
, &ValOK
);
if (ValOK
)
{
pResult
->AdrCnt
= 2;
pResult
->AdrVals
[0] = Lo
(AdrWord
);
pResult
->AdrVals
[1] = Hi
(AdrWord
);
if (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "X"))
pResult
->ErgMode
= ModIX
;
else if (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "Y"))
pResult
->ErgMode
= ModIY
;
else
WrStrErrorPos
(ErrNum_InvReg
, &ArgStr
[2]);
if (pResult
->ErgMode
!= -1)
{
if (IsBasePage
(pResult
->AdrVals
[1]) && (ZeroMode
== 0))
ChkZeroMode
(pResult
, pOrder
, (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "X")) ? ModZIX
: ModZIY
);
}
}
}
}
}
else
(void)ChkArgCnt
(0, 2);
}
static int ImmStart
(const char *pArg
)
{
return !!(*pArg
== '#');
}
/*---------------------------------------------------------------------------*/
/* Anweisungen ohne Argument */
static void DecodeFixed
(Word Index
)
{
const FixedOrder
*pOrder
= FixedOrders
+ Index
;
if (ChkArgCnt
(0, 0)
&& (ChkExactCPUMask
(pOrder
->CPUFlag
, CPU6502
) >= 0))
{
CodeLen
= 1;
BAsmCode
[0] = pOrder
->Code
;
if (MomCPU
== CPUM740
)
{
if (Memo
("PLP"))
BAsmCode
[CodeLen
++] = NOPCode
;
if ((Last_ADC_SBC_Flag
) && (Memo
("SEC") || Memo
("CLC") || Memo
("CLD")))
InsNOP
();
}
}
}
/* All right, guys, this really makes tool developers' lives difficult: you can't
seem to agree on whether BRK is a single or two byte instruction. Always adding
a NOP is obviously not what suits the majority of people, so I'll change it to
an optional argument. I hope this ends the discussion about BRK. No, wait, it
*will* end discussion because I will not answer any further requests about this
instruction... */
static void DecodeBRK
(Word Index
)
{
UNUSED
(Index
);
if (ChkArgCnt
(0, 1))
{
BAsmCode
[0] = 0x00;
if (ArgCnt
> 0)
{
Boolean OK
;
BAsmCode
[1] = EvalStrIntExpressionOffs
(&ArgStr
[1], !!(*ArgStr
[1].
str.
p_str == '#'), Int8
, &OK
);
if (OK
)
CodeLen
= 2;
}
else
CodeLen
= 1;
}
}
static void DecodeSEB_CLB
(Word Code
)
{
if (ChkArgCnt
(2, 2)
&& ChkExactCPU
(CPUM740
))
{
Boolean ValOK
;
Byte BitNo
= EvalStrIntExpression
(&ArgStr
[1], UInt3
, &ValOK
);
if (ValOK
)
{
BAsmCode
[0] = Code
+ (BitNo
<< 5);
if (!as_strcasecmp
(ArgStr
[2].
str.
p_str, "A"))
CodeLen
= 1;
else
{
BAsmCode
[1] = EvalStrIntExpression
(&ArgStr
[2], UInt8
, &ValOK
);
if (ValOK
)
{
CodeLen
= 2;
BAsmCode
[0] += 4;
}
}
}
}
}
static void DecodeBBC_BBS
(Word Code
)
{
Boolean ValOK
;
tSymbolFlags Flags
;
int b
;
if (ChkArgCnt
(3, 3)
&& ChkExactCPU
(CPUM740
))
{
BAsmCode
[0] = EvalStrIntExpression
(&ArgStr
[1], UInt3
, &ValOK
);
if (ValOK
)
{
BAsmCode
[0] = (BAsmCode
[0] << 5) + Code
;
b
= (as_strcasecmp
(ArgStr
[2].
str.
p_str, "A") != 0);
if (!b
)
ValOK
= True
;
else
{
BAsmCode
[0] += 4;
BAsmCode
[1] = EvalStrIntExpression
(&ArgStr
[2], UInt8
, &ValOK
);
}
if (ValOK
)
{
Integer AdrInt
= EvalStrIntExpressionWithFlags
(&ArgStr
[3], Int16
, &ValOK
, &Flags
) - (EProgCounter
() + 2 + Ord
(b
) + Ord
(Last_CLI_SEI_Flag
));
if (ValOK
)
{
if (((AdrInt
> 127) || (AdrInt
< -128)) && !mSymbolQuestionable
(Flags
)) WrError
(ErrNum_JmpDistTooBig
);
else
{
CodeLen
= 2 + Ord
(b
);
BAsmCode
[CodeLen
- 1] = AdrInt
& 0xff;
if (Last_CLI_SEI_Flag
)
InsNOP
();
}
}
}
}
}
}
static void DecodeBBR_BBS
(Word Code
)
{
Boolean ValOK
;
if (ChkArgCnt
(2, 2)
&& (ChkExactCPUMask
(M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, CPU6502
) >= 0))
{
Byte ForceSize
;
unsigned Offset
= ChkZero
(&ArgStr
[1], &ForceSize
);
if (ForceSize
== 1) WrStrErrorPos
(ErrNum_InvAddrMode
, &ArgStr
[1]);
else
{
BAsmCode
[1] = EvalStrIntExpressionOffs
(&ArgStr
[1], Offset
, UInt8
, &ValOK
);
if (ValOK
)
{
Integer AdrInt
;
tSymbolFlags Flags
;
BAsmCode
[0] = Code
;
AdrInt
= EvalStrIntExpressionWithFlags
(&ArgStr
[2], UInt16
, &ValOK
, &Flags
) - (EProgCounter
() + 3);
if (ValOK
)
{
if (((AdrInt
> 127) || (AdrInt
< -128)) && !mSymbolQuestionable
(Flags
)) WrError
(ErrNum_JmpDistTooBig
);
else
{
CodeLen
= 3;
BAsmCode
[2] = AdrInt
& 0xff;
}
}
}
}
}
}
static void DecodeRMB_SMB
(Word Code
)
{
if (ChkArgCnt
(1, 1)
&& (ChkExactCPUMask
(M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, CPU6502
) >= 0))
{
Byte ForceSize
;
unsigned Offset
= ChkZero
(&ArgStr
[1], &ForceSize
);
if (ForceSize
== 1) WrStrErrorPos
(ErrNum_InvAddrMode
, &ArgStr
[1]);
else
{
Boolean ValOK
;
BAsmCode
[1] = EvalStrIntExpressionOffs
(&ArgStr
[1], Offset
, UInt8
, &ValOK
);
if (ValOK
)
{
BAsmCode
[0] = Code
;
CodeLen
= 2;
}
}
}
}
static void DecodeRBA_SBA
(Word Code
)
{
if (ChkArgCnt
(2, 2)
&& ChkExactCPU
(CPU65C19
))
{
Boolean OK
;
Word Addr
;
Addr
= EvalStrIntExpression
(&ArgStr
[1], UInt16
, &OK
);
if (OK
)
{
BAsmCode
[3] = EvalStrIntExpressionOffs
(&ArgStr
[2], ImmStart
(ArgStr
[2].
str.
p_str), UInt8
, &OK
);
if (OK
)
{
BAsmCode
[0] = Code
;
BAsmCode
[1] = Lo
(Addr
);
BAsmCode
[2] = Hi
(Addr
);
CodeLen
= 4;
}
}
}
}
static void DecodeBAR_BAS
(Word Code
)
{
if (ChkArgCnt
(3, 3)
&& ChkExactCPU
(CPU65C19
))
{
Boolean OK
;
Word Addr
;
Addr
= EvalStrIntExpression
(&ArgStr
[1], UInt16
, &OK
);
if (OK
)
{
BAsmCode
[3] = EvalStrIntExpressionOffs
(&ArgStr
[2], ImmStart
(ArgStr
[2].
str.
p_str), UInt8
, &OK
);
if (OK
)
{
tSymbolFlags Flags
;
Integer Dist
= EvalStrIntExpressionWithFlags
(&ArgStr
[3], UInt16
, &OK
, &Flags
) - (EProgCounter
() + 5);
if (OK
)
{
if (((Dist
> 127) || (Dist
< -128)) && !mSymbolQuestionable
(Flags
)) WrError
(ErrNum_JmpDistTooBig
);
else
{
BAsmCode
[0] = Code
;
BAsmCode
[1] = Lo
(Addr
);
BAsmCode
[2] = Hi
(Addr
);
BAsmCode
[4] = Dist
& 0xff;
CodeLen
= 5;
}
}
}
}
}
}
static void DecodeSTI
(Word Code
)
{
UNUSED
(Code
);
if (ChkArgCnt
(2, 2)
&& ChkExactCPU
(CPU65C19
))
{
Boolean OK
;
BAsmCode
[1] = EvalStrIntExpression
(&ArgStr
[1], UInt8
, &OK
);
if (OK
)
{
BAsmCode
[2] = EvalStrIntExpressionOffs
(&ArgStr
[2], ImmStart
(ArgStr
[2].
str.
p_str), UInt8
, &OK
);
if (OK
)
{
BAsmCode
[0] = 0xb2;
CodeLen
= 3;
}
}
}
}
static void DecodeLDM
(Word Code
)
{
Boolean ValOK
;
UNUSED
(Code
);
if (ChkArgCnt
(2, 2)
&& ChkExactCPU
(CPUM740
))
{
BAsmCode
[0] = 0x3c;
BAsmCode
[2] = EvalStrIntExpression
(&ArgStr
[2], UInt8
, &ValOK
);
if (ValOK
)
{
if (*ArgStr
[1].
str.
p_str != '#') WrError
(ErrNum_InvAddrMode
);
else
{
BAsmCode
[1] = EvalStrIntExpressionOffs
(&ArgStr
[1], 1, Int8
, &ValOK
);
if (ValOK
)
CodeLen
= 3;
}
}
}
}
static void DecodeJSB
(Word Code
)
{
UNUSED
(Code
);
if (ChkArgCnt
(1, 1)
&& ChkExactCPU
(CPU65C19
))
{
Boolean OK
;
tSymbolFlags Flags
;
Word Addr
;
Addr
= EvalStrIntExpressionWithFlags
(&ArgStr
[1], UInt16
, &OK
, &Flags
);
if (mFirstPassUnknown
(Flags
))
Addr
= 0xffe0;
if (OK
)
{
if ((Addr
& 0xffe1) != 0xffe0) WrError
(ErrNum_JmpTargOnDiffPage
);
else
{
BAsmCode
[0] = 0x0b | ((Addr
& 0x000e) << 3);
CodeLen
= 1;
}
}
}
}
static void DecodeAUG
(Word Code
)
{
if (ChkArgCnt
(0, 0) && ChkExactCPU
(CPU65CE02
))
{
BAsmCode
[0] = Code
;
BAsmCode
[1] =
BAsmCode
[2] =
BAsmCode
[3] = 0x00;
CodeLen
= 4;
}
}
static void DecodeNorm
(Word Index
)
{
const NormOrder
*pOrder
= NormOrders
+ Index
;
tAdrResult AdrResult
;
DecodeAdr
(&AdrResult
, pOrder
);
if (AdrResult.
ErgMode != -1)
{
if (pOrder
->Codes
[AdrResult.
ErgMode] == -1)
{
if (AdrResult.
ErgMode == ModZA
) AdrResult.
ErgMode = ModA
;
if (AdrResult.
ErgMode == ModZIX
) AdrResult.
ErgMode = ModIX
;
if (AdrResult.
ErgMode == ModZIY
) AdrResult.
ErgMode = ModIY
;
if (AdrResult.
ErgMode == ModInd8
) AdrResult.
ErgMode = ModInd16
;
AdrResult.
AdrVals[AdrCnt
++] = 0;
}
if (pOrder
->Codes
[AdrResult.
ErgMode] == -1) WrError
(ErrNum_InvAddrMode
);
else if (ChkExactCPUMask
(pOrder
->Codes
[AdrResult.
ErgMode] >> 8, CPU6502
) >= 0)
{
BAsmCode
[0] = Lo
(pOrder
->Codes
[AdrResult.
ErgMode]);
memcpy(BAsmCode
+ 1, AdrResult.
AdrVals, AdrResult.
AdrCnt);
CodeLen
= AdrResult.
AdrCnt + 1;
if ((AdrResult.
ErgMode == ModInd16
) && (MomCPU
!= CPU65C02
) && (BAsmCode
[1] == 0xff))
{
WrError
(ErrNum_NotOnThisAddress
);
CodeLen
= 0;
}
}
}
}
static void DecodeTST
(Word Index
)
{
Byte ImmVal
= 0;
/* split off immediate argument for HUC6280 TST? */
if (MomCPU
== CPUHUC6280
)
{
Boolean OK
;
int z
;
if (!ChkArgCnt
(1, ArgCntMax
))
return;
ImmVal
= EvalStrIntExpressionOffs
(&ArgStr
[1], ImmStart
(ArgStr
[1].
str.
p_str), Int8
, &OK
);
if (!OK
)
return;
for (z
= 1; z
<= ArgCnt
- 1; z
++)
StrCompCopy
(&ArgStr
[z
], &ArgStr
[z
+ 1]);
ArgCnt
--;
}
/* generic generation */
DecodeNorm
(Index
);
/* if succeeded, insert immediate value */
if ((CodeLen
> 0) && (MomCPU
== CPUHUC6280
))
{
memmove(BAsmCode
+ 2, BAsmCode
+ 1, CodeLen
- 1);
BAsmCode
[1] = ImmVal
;
}
}
/* relativer Sprung ? */
static void DecodeCond
(Word Index
)
{
const CondOrder
*pOrder
= CondOrders
+ Index
;
if (ChkArgCnt
(1, 1)
&& (ChkExactCPUMask
(pOrder
->CPUFlag
, CPU6502
) >= 0))
{
Integer AdrInt
;
Boolean ValOK
;
tSymbolFlags Flags
;
const Boolean MayShort
= !!pOrder
->CodeShort
,
MayLong
= !!pOrder
->CodeLong
&& (MomCPU
== CPU65CE02
);
Byte ForceSize
;
AdrInt
= EvalStrIntExpressionOffsWithFlags
(&ArgStr
[1], ChkZero
(&ArgStr
[1], &ForceSize
), UInt16
, &ValOK
, &Flags
);
if (!ValOK
)
return;
if (!ForceSize
)
{
if (!MayLong
)
ForceSize
= 2;
else if (!MayShort
)
ForceSize
= 1;
else
ForceSize
= RangeCheck
(AdrInt
- (EProgCounter
() + 2), SInt8
) ? 2 : 1;
}
AdrInt
-= EProgCounter
() + (4 - ForceSize
);
switch (ForceSize
)
{
case 2:
if (!MayShort
) WrError
(ErrNum_InvAddrMode
);
else if (((AdrInt
> 127) || (AdrInt
< -128)) && !mSymbolQuestionable
(Flags
)) WrError
(ErrNum_JmpDistTooBig
);
else
{
BAsmCode
[0] = pOrder
->CodeShort
;
BAsmCode
[1] = AdrInt
& 0xff;
CodeLen
= 2;
}
break;
case 1:
if (!MayLong
) WrError
(ErrNum_InvAddrMode
);
else
{
BAsmCode
[0] = pOrder
->CodeLong
;
BAsmCode
[1] = AdrInt
& 0xff;
BAsmCode
[2] = (AdrInt
>> 8) & 0xff;
CodeLen
= 3;
}
break;
}
}
}
static void DecodeTransfer
(Word Code
)
{
if (ChkArgCnt
(3, 3)
&& ChkExactCPU
(CPUHUC6280
))
{
Boolean OK
;
Word Address
;
int z
;
for (z
= 1; z
<= 3; z
++)
{
Address
= EvalStrIntExpression
(&ArgStr
[z
], UInt16
, &OK
);
if (!OK
)
return;
BAsmCode
[z
* 2 - 1] = Lo
(Address
);
BAsmCode
[z
* 2 ] = Hi
(Address
);
}
BAsmCode
[0] = Code
;
CodeLen
= 7;
}
}
/*---------------------------------------------------------------------------*/
static void AddFixed
(const char *NName
, Word NFlag
, Byte NCode
)
{
order_array_rsv_end
(FixedOrders
, FixedOrder
);
FixedOrders
[InstrZ
].
CPUFlag = NFlag
;
FixedOrders
[InstrZ
].
Code = NCode
;
AddInstTable
(InstTable
, NName
, InstrZ
++, DecodeFixed
);
}
static void AddNorm
(const char *NName
, LongWord ZACode
, LongWord ACode
, LongWord ZIXCode
,
LongWord IXCode
, LongWord ZIYCode
, LongWord IYCode
, LongWord IndIXCode
,
LongWord IndOXCode
, LongWord IndOYCode
, LongWord IndOZCode
, LongWord Ind16Code
, LongWord ImmCode
, LongWord AccCode
,
LongWord NoneCode
, LongWord Ind8Code
, LongWord IndSPYCode
, LongWord SpecCode
)
{
order_array_rsv_end
(NormOrders
, NormOrder
);
NormOrders
[InstrZ
].
Codes[ModZA
] = ZACode
;
NormOrders
[InstrZ
].
Codes[ModA
] = ACode
;
NormOrders
[InstrZ
].
Codes[ModZIX
] = ZIXCode
;
NormOrders
[InstrZ
].
Codes[ModIX
] = IXCode
;
NormOrders
[InstrZ
].
Codes[ModZIY
] = ZIYCode
;
NormOrders
[InstrZ
].
Codes[ModIY
] = IYCode
;
NormOrders
[InstrZ
].
Codes[ModIndIX
] = IndIXCode
;
NormOrders
[InstrZ
].
Codes[ModIndOX
] = IndOXCode
;
NormOrders
[InstrZ
].
Codes[ModIndOY
] = IndOYCode
;
NormOrders
[InstrZ
].
Codes[ModIndOZ
] = IndOZCode
;
NormOrders
[InstrZ
].
Codes[ModInd16
] = Ind16Code
;
NormOrders
[InstrZ
].
Codes[ModImm
] = ImmCode
;
NormOrders
[InstrZ
].
Codes[ModAcc
] = AccCode
;
NormOrders
[InstrZ
].
Codes[ModNone
] = NoneCode
;
NormOrders
[InstrZ
].
Codes[ModInd8
] = Ind8Code
;
NormOrders
[InstrZ
].
Codes[ModIndSPY
] = IndSPYCode
;
NormOrders
[InstrZ
].
Codes[ModSpec
] = SpecCode
;
AddInstTable
(InstTable
, NName
, InstrZ
++, strcmp(NName
, "TST") ? DecodeNorm
: DecodeTST
);
}
static void AddCond
(const char *NName
, Word NFlag
, Byte NCodeShort
, Byte NCodeLong
)
{
order_array_rsv_end
(CondOrders
, CondOrder
);
CondOrders
[InstrZ
].
CPUFlag = NFlag
;
CondOrders
[InstrZ
].
CodeShort = NCodeShort
;
CondOrders
[InstrZ
].
CodeLong = NCodeLong
;
AddInstTable
(InstTable
, NName
, InstrZ
++, DecodeCond
);
}
static LongWord MkMask
(Word CPUMask
, Byte Code
)
{
return (((LongWord
)CPUMask
) << 8) | Code
;
}
static void InitFields
(void)
{
Boolean Is740
= (MomCPU
== CPUM740
),
Is65C19
= (MomCPU
== CPU65C19
);
int Bit
;
char Name
[20];
InstTable
= CreateInstTable
(237);
SetDynamicInstTable
(InstTable
);
AddInstTable
(InstTable
, "SEB", 0x0b, DecodeSEB_CLB
);
AddInstTable
(InstTable
, "CLB", 0x1b, DecodeSEB_CLB
);
AddInstTable
(InstTable
, "BBC", 0x13, DecodeBBC_BBS
);
AddInstTable
(InstTable
, "BBS", 0x03, DecodeBBC_BBS
);
AddInstTable
(InstTable
, "RBA", 0xc2, DecodeRBA_SBA
);
AddInstTable
(InstTable
, "SBA", 0xd2, DecodeRBA_SBA
);
AddInstTable
(InstTable
, "BAR", 0xe2, DecodeBAR_BAS
);
AddInstTable
(InstTable
, "BAS", 0xf2, DecodeBAR_BAS
);
AddInstTable
(InstTable
, "STI", 0, DecodeSTI
);
AddInstTable
(InstTable
, "BRK", 0, DecodeBRK
);
for (Bit
= 0; Bit
< 8; Bit
++)
{
as_snprintf
(Name
, sizeof(Name
), "BBR%d", Bit
);
AddInstTable
(InstTable
, Name
, (Bit
<< 4) + 0x0f, DecodeBBR_BBS
);
as_snprintf
(Name
, sizeof(Name
), "BBS%d", Bit
);
AddInstTable
(InstTable
, Name
, (Bit
<< 4) + 0x8f, DecodeBBR_BBS
);
as_snprintf
(Name
, sizeof(Name
), "RMB%d", Bit
);
AddInstTable
(InstTable
, Name
, (Bit
<< 4) + 0x07, DecodeRMB_SMB
);
as_snprintf
(Name
, sizeof(Name
), "SMB%d", Bit
);
AddInstTable
(InstTable
, Name
, (Bit
<< 4) + 0x87, DecodeRMB_SMB
);
}
AddInstTable
(InstTable
, "LDM", 0, DecodeLDM
);
AddInstTable
(InstTable
, "JSB", 0, DecodeJSB
);
AddInstTable
(InstTable
, "AUG", 0x5c, DecodeAUG
);
AddInstTable
(InstTable
, "TAI" , 0xf3, DecodeTransfer
);
AddInstTable
(InstTable
, "TDD" , 0xc3, DecodeTransfer
);
AddInstTable
(InstTable
, "TIA" , 0xe3, DecodeTransfer
);
AddInstTable
(InstTable
, "TII" , 0x73, DecodeTransfer
);
AddInstTable
(InstTable
, "TIN" , 0xd3, DecodeTransfer
);
InstrZ
= 0;
AddFixed
("RTS", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x60);
AddFixed
("RTI", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x40);
AddFixed
("TAX", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xaa);
AddFixed
("TXA", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x8a);
AddFixed
("TAY", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa8);
AddFixed
("TYA", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x98);
AddFixed
("TXS", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x9a);
AddFixed
("TSX", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xba);
AddFixed
("TSY", M_65CE02
, 0x0b);
AddFixed
("TYS", M_65CE02
, 0x2b);
AddFixed
("TAZ", M_65CE02
, 0x4b);
AddFixed
("TAB", M_65CE02
, 0x5b);
AddFixed
("TZA", M_65CE02
, 0x6b);
AddFixed
("TBA", M_65CE02
, 0x7b);
AddFixed
("DEX", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xca);
AddFixed
("DEY", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x88);
AddFixed
("DEZ", M_65CE02
, 0x3b);
AddFixed
("INX", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe8);
AddFixed
("INY", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc8);
AddFixed
("INZ", M_65CE02
, 0x1b);
AddFixed
("PHA", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x48);
AddFixed
("PLA", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x68);
AddFixed
("PHP", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x08);
AddFixed
("PLP", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x28);
AddFixed
("PHX", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, 0xda);
AddFixed
("PLX", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, 0xfa);
AddFixed
("PHY", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, 0x5a);
AddFixed
("PLY", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, 0x7a);
AddFixed
("PHZ", M_65CE02
, 0xdb);
AddFixed
("PLZ", M_65CE02
, 0xfb);
AddFixed
("STP", M_W65C02S
| M_MELPS740
, Is740
? 0x42 : 0xdb);
AddFixed
("WAI", M_W65C02S
, 0xcb);
AddFixed
("SLW", M_MELPS740
, 0xc2);
AddFixed
("FST", M_MELPS740
, 0xe2);
AddFixed
("WIT", M_MELPS740
, 0xc2);
AddFixed
("CLI", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x58);
AddFixed
("SEI", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x78);
AddFixed
("CLC", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x18);
AddFixed
("SEC", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x38);
AddFixed
("CLD", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd8);
AddFixed
("SED", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf8);
AddFixed
("CLE", M_65CE02
, 0x02);
AddFixed
("SEE", M_65CE02
, 0x03);
AddFixed
("CLV", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb8);
AddFixed
("CLT", M_MELPS740
, 0x12);
AddFixed
("SET", M_MELPS740
| M_HUC6280
, Is740
? 0x32 : 0xf4); /* !!! for HUC6280, is prefix for (x) instead of ACC as dest */
AddFixed
("JAM", M_6502U
, 0x02);
AddFixed
("CRS", M_6502U
, 0x02);
AddFixed
("KIL", M_6502U
, 0x02);
AddFixed
("CLW", M_65C19
, 0x52);
AddFixed
("MPY", M_65C19
, 0x02);
AddFixed
("MPA", M_65C19
, 0x12);
AddFixed
("PSH", M_65C19
, 0x22);
AddFixed
("PUL", M_65C19
, 0x32);
AddFixed
("PLW", M_65C19
, 0x33);
AddFixed
("RND", M_65C19
, 0x42);
AddFixed
("TAW", M_65C19
, 0x62);
AddFixed
("TWA", M_65C19
, 0x72);
AddFixed
("NXT", M_65C19
, 0x8b);
AddFixed
("LII", M_65C19
, 0x9b);
AddFixed
("LAI", M_65C19
, 0xeb);
AddFixed
("INI", M_65C19
, 0xbb);
AddFixed
("PHI", M_65C19
, 0xcb);
AddFixed
("PLI", M_65C19
, 0xdb);
AddFixed
("TIP", M_65C19
, 0x03);
AddFixed
("PIA", M_65C19
, 0xfb);
AddFixed
("LAN", M_65C19
, 0xab);
AddFixed
("CLA", M_HUC6280
, 0x62);
AddFixed
("CLX", M_HUC6280
, 0x82);
AddFixed
("CLY", M_HUC6280
, 0xc2);
AddFixed
("CSL", M_HUC6280
, 0x54);
AddFixed
("CSH", M_HUC6280
, 0xd4);
AddFixed
("SAY", M_HUC6280
, 0x42);
AddFixed
("SXY", M_HUC6280
, 0x02);
InstrZ
= 0;
AddNorm
("NOP",
/* ZA */ MkMask
( M_6502U
, 0x04),
/* A */ MkMask
( M_6502U
, 0x0c),
/* ZIX */ MkMask
( M_6502U
, 0x14),
/* IX */ MkMask
( M_6502U
, 0x1c),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0x80),
/* ACC */ -1,
/* NON */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xea),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LDA",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa5),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xad),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb5),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xbd),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb9),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa1),
/* (n),X */ MkMask
( M_65C19
, 0xb1),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb1),
/* (n),Z */ MkMask
( M_65CE02
, 0xb2),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa9),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, Is65C19
? 0xa1 : 0xb2),
/*(n,SP),y*/MkMask
( M_65CE02
, 0xe2),
/* spec */ -1);
AddNorm
("LDX",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa6),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xae),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb6),
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xbe),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa2),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LDY",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa4),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xac),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb4),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xbc),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xa0),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LDZ",
/* ZA */ -1,
/* A */ MkMask
( M_65CE02
, 0xab),
/* ZIX */ -1,
/* IX */ MkMask
( M_65CE02
, 0xbb),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65CE02
, 0xa3),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("STA",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x85),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x8d),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x95),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x9d),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x99),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x81),
/* (n),X */ MkMask
( M_65C19
, 0x91),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x91),
/* (n),Z */ MkMask
( M_65CE02
, 0x92),
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0x81 : 0x92),
/*(n,SP),y*/MkMask
( M_65CE02
, 0x82),
/* spec */ -1);
AddNorm
("ST0",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_HUC6280
, 0x03),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ST1",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_HUC6280
, 0x13),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ST2",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_HUC6280
, 0x23),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("STX",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x86),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x8e),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x96),
/* IY */ MkMask
( M_65CE02
, 0x9b),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("STY",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x84),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x8c),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x94),
/* IX */ MkMask
( M_65CE02
, 0x8b),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("STZ",
/* ZA */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x64),
/* A */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x9c),
/* ZIX */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x74),
/* IX */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x9e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ADC",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x65),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x6d),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x75),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x7d),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x79),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x61),
/* (n),X */ MkMask
( M_65C19
, 0x71),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x71),
/* (n),Z */ MkMask
( M_65CE02
, 0x72),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x69),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0x61 : 0x72),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ADD",
/* ZA */ MkMask
( M_65C19
, 0x64),
/* A */ -1,
/* ZIX */ MkMask
( M_65C19
, 0x74),
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65C19
, 0x89),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SBC",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe5),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xed),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf5),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xfd),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf9),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe1),
/* (n),X */ MkMask
( M_65C19
, 0xf1),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf1),
/* (n),Z */ MkMask
( M_65CE02
, 0xf2),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe9),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0xe1 : 0xf2),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("MUL",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ MkMask
( M_MELPS740
, 0x62),
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("DIV",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ MkMask
( M_MELPS740
, 0xe2),
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("AND",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x25),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x2d),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x35),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x3d),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x39),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x21),
/* (n),X */ MkMask
( M_65C19
, 0x31),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x31),
/* (n),Z */ MkMask
( M_65CE02
, 0x32),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x29),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0x21 : 0x32),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ORA",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x05),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x0d),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x15),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x1d),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x19),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x01),
/* (n),X */ MkMask
( M_65C19
, 0x11),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x11),
/* (n),Z */ MkMask
( M_65CE02
, 0x12),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x09),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0x01 : 0x12),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("EOR",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x45),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x4d),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x55),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x5d),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x59),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x41),
/* (n),X */ MkMask
( M_65C19
, 0x51),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x51),
/* (n),Z */ MkMask
( M_65CE02
, 0x52),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x49),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0x41 : 0x52),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("COM",
/* ZA */ MkMask
( M_MELPS740
, 0x44),
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("BIT",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x24),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x2c),
/* ZIX */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x34),
/* IX */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x3c),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x89),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("TST", /* TODO: 6280 */
/* ZA */ MkMask
( M_MELPS740
| M_HUC6280
, Is740
? 0x64 : 0x83),
/* A */ MkMask
( M_HUC6280
, 0x93),
/* ZIX */ MkMask
( M_HUC6280
, 0xa3),
/* IX */ MkMask
( M_HUC6280
, 0xb3),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ASL",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x06),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x0e),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x16),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x1e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x0a),
/* NON */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x0a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ASR",
/* ZA */ MkMask
( M_65CE02
, 0x44),
/* A */ -1,
/* ZIX */ MkMask
( M_65CE02
, 0x54),
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0x4b),
/* ACC */ MkMask
( M_65CE02
| M_65C19
, (MomCPU
== CPU65CE02
) ? 0x43 : 0x3a),
/* NON */ MkMask
( M_65CE02
| M_65C19
, (MomCPU
== CPU65CE02
) ? 0x43 : 0x3a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ASW",
/* ZA */ -1,
/* A */ MkMask
( M_65CE02
, 0xcb),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LAB",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
( M_65C19
, 0x13),
/* NON */ MkMask
( M_65C19
, 0x13),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("NEG",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
( M_65CE02
| M_65C19
, (MomCPU
== CPU65CE02
) ? 0x42 : 0x1a),
/* NON */ MkMask
( M_65CE02
| M_65C19
, (MomCPU
== CPU65CE02
) ? 0x42 : 0x1a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LSR",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x46),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x4e),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x56),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x5e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x4a),
/* NON */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x4a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ROL",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x26),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x2e),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x36),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x3e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x2a),
/* NON */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x2a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ROW",
/* ZA */ -1,
/* A */ MkMask
( M_65CE02
, 0xeb),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ROR",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x66),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x6e),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x76),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x7e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x6a),
/* NON */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x6a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("RRF",
/* ZA */ MkMask
( M_MELPS740
, 0x82),
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("TSB",
/* ZA */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x04),
/* A */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x0c),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("TRB",
/* ZA */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x14),
/* A */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_HUC6280
, 0x1c),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("INC",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe6),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xee),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf6),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xfe),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
, Is740
? 0x3a : 0x1a),
/* NON */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
, Is740
? 0x3a : 0x1a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("INW",
/* ZA */ MkMask
( M_65CE02
, 0xe3),
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("DEC",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc6),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xce),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd6),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xde),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
, Is740
? 0x1a : 0x3a),
/* NON */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
, Is740
? 0x1a : 0x3a),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("DEW",
/* ZA */ MkMask
( M_65CE02
, 0xc3),
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("CMP",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc5),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xcd),
/* ZIX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd5),
/* IX */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xdd),
/* ZIY */ -1,
/* IY */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd9),
/* (n,X) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc1),
/* (n),X */ MkMask
( M_65C19
, 0xd1),
/* (n),Y */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd1),
/* (n),Z */ MkMask
( M_65CE02
, 0xd2),
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc9),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_65SC02
| M_65C02
| M_W65C02S
| M_65C19
| M_HUC6280
, Is65C19
? 0xc1 : 0xd2),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("CPX",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe4),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xec),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xe0),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("CPY",
/* ZA */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc4),
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xcc),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xc0),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("CPZ",
/* ZA */ MkMask
( M_65CE02
, 0xd4),
/* A */ MkMask
( M_65CE02
, 0xdc),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65CE02
, 0xc2),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("JMP",
/* ZA */ -1,
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x4c),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ MkMask
( M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_HUC6280
, 0x7c),
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x6c),
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_MELPS740
, 0xb2),
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("JPI",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ MkMask
( M_65C19
, 0x0c),
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("JSR",
/* ZA */ -1,
/* A */ MkMask
(M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x20),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ MkMask
( M_65CE02
, 0x23),
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ MkMask
( M_65CE02
, 0x22),
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ MkMask
( M_MELPS740
, 0x02),
/*(n,SP),y*/ -1,
/* spec */ MkMask
( M_MELPS740
, 0x22));
AddNorm
("RTN",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65CE02
, 0x62),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SLO",
/* ZA */ MkMask
( M_6502U
, 0x07),
/* A */ MkMask
( M_6502U
, 0x0f),
/* ZIX */ MkMask
( M_6502U
, 0x17),
/* IX */ MkMask
( M_6502U
, 0x1f),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x1b),
/* (n,X) */ MkMask
( M_6502U
, 0x03),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0x13),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ANC",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0x0b),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("RLA",
/* ZA */ MkMask
( M_6502U
, 0x27),
/* A */ MkMask
( M_6502U
, 0x2f),
/* ZIX */ MkMask
( M_6502U
, 0x37),
/* IX */ MkMask
( M_6502U
, 0x3f),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x3b),
/* (n,X) */ MkMask
( M_6502U
, 0x23),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0x33),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SRE",
/* ZA */ MkMask
( M_6502U
, 0x47),
/* A */ MkMask
( M_6502U
, 0x4f),
/* ZIX */ MkMask
( M_6502U
, 0x57),
/* IX */ MkMask
( M_6502U
, 0x5f),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x5b),
/* (n,X) */ MkMask
( M_6502U
, 0x43),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0x53),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("RRA",
/* ZA */ MkMask
( M_6502U
, 0x67),
/* A */ MkMask
( M_6502U
, 0x6f),
/* ZIX */ MkMask
( M_6502U
, 0x77),
/* IX */ MkMask
( M_6502U
, 0x7f),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x7b),
/* (n,X) */ MkMask
( M_6502U
, 0x63),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0x73),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ARR",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0x6b),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SAX",
/* ZA */ MkMask
( M_6502U
, 0x87),
/* A */ MkMask
( M_6502U
, 0x8f),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ MkMask
( M_6502U
, 0x97),
/* IY */ -1,
/* (n,X) */ MkMask
( M_6502U
, 0x83),
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ MkMask
( M_HUC6280
, 0x22),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ANE",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0x8b),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SHA",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ MkMask
( M_6502U
, 0x93),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x9f),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SHS",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x9b),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SHY",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0x9c),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SHX",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ MkMask
( M_6502U
, 0x9e),
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LAX",
/* ZA */ MkMask
( M_6502U
, 0xa7),
/* A */ MkMask
( M_6502U
, 0xaf),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ MkMask
( M_6502U
, 0xb7),
/* IY */ MkMask
( M_6502U
, 0xbf),
/* (n,X) */ MkMask
( M_6502U
, 0xa3),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0xb3),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LXA",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0xab),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("LAE",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0xbb),
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("DCP",
/* ZA */ MkMask
( M_6502U
, 0xc7),
/* A */ MkMask
( M_6502U
, 0xcf),
/* ZIX */ MkMask
( M_6502U
, 0xd7),
/* IX */ MkMask
( M_6502U
, 0xdf),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0xdb),
/* (n,X) */ MkMask
( M_6502U
, 0xc3),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0xd3),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("SBX",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_6502U
, 0xcb),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("ISB",
/* ZA */ MkMask
( M_6502U
, 0xe7),
/* A */ MkMask
( M_6502U
, 0xef),
/* ZIX */ MkMask
( M_6502U
, 0xf7),
/* IX */ MkMask
( M_6502U
, 0xff),
/* ZIY */ -1,
/* IY */ MkMask
( M_6502U
, 0xfb),
/* (n,X) */ MkMask
( M_6502U
, 0xe3),
/* (n),X */ -1,
/* (n),Y */ MkMask
( M_6502U
, 0xf3),
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("EXC",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ MkMask
( M_65C19
, 0xd4),
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ -1,
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("TAM",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_HUC6280
, 0x53),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("TMA",
/* ZA */ -1,
/* A */ -1,
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_HUC6280
, 0x43),
/* ACC */ -1,
/* NON */ -1,
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
AddNorm
("PHW",
/* ZA */ -1,
/* A */ MkMask
( M_65CE02
, 0xfc),
/* ZIX */ -1,
/* IX */ -1,
/* ZIY */ -1,
/* IY */ -1,
/* (n,X) */ -1,
/* (n),X */ -1,
/* (n),Y */ -1,
/* (n),Z */ -1,
/* (n16) */ -1,
/* imm */ MkMask
( M_65CE02
, 0xf4),
/* ACC */ -1,
/* NON */ MkMask
( M_65C19
, 0x23),
/* (n8) */ -1,
/*(n,SP),y*/ -1,
/* spec */ -1);
InstrZ
= 0;
AddCond
("BEQ", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xf0, 0xf3);
AddCond
("BNE", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xd0, 0xd3);
AddCond
("BPL", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x10, 0x13);
AddCond
("BMI", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x30, 0x33);
AddCond
("BCC", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x90, 0x93);
AddCond
("BCS", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0xb0, 0xb3);
AddCond
("BVC", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x50, 0x53);
AddCond
("BVS", M_6502
| M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
| M_6502U
, 0x70, 0x73);
AddCond
("BRA", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
, 0x80, 0x83);
AddCond
("BRU", M_65SC02
| M_65C02
| M_65CE02
| M_W65C02S
| M_65C19
| M_MELPS740
| M_HUC6280
, 0x80, 0x83);
AddCond
("BSR", M_65CE02
| M_HUC6280
,
(MomCPU
== CPUHUC6280
) ? 0x44 : 0x00,
(MomCPU
== CPU65CE02
) ? 0x63 : 0x00);
init_moto8_pseudo
(InstTable
, e_moto_8_le
| e_moto_8_db
| e_moto_8_dw
| e_moto_8_ds
| e_moto_8_ddb
| e_moto_8_dcm
);
}
static void DeinitFields
(void)
{
DestroyInstTable
(InstTable
);
order_array_free
(FixedOrders
);
order_array_free
(NormOrders
);
order_array_free
(CondOrders
);
}
/*---------------------------------------------------------------------------*/
static void MakeCode_65
(void)
{
CodeLen
= 0;
DontPrint
= False
;
This_CLI_SEI_Flag
= (Memo
("CLI") || Memo
("SEI"));
This_ADC_SBC_Flag
= (Memo
("ADC") || Memo
("SBC"));
/* zu ignorierendes */
if (Memo
(""))
return;
/* Pseudoanweisungen */
if (!LookupInstTable
(InstTable
, OpPart.
str.
p_str))
WrStrErrorPos
(ErrNum_UnknownInstruction
, &OpPart
);
Last_CLI_SEI_Flag
= This_CLI_SEI_Flag
;
Last_ADC_SBC_Flag
= This_ADC_SBC_Flag
;
}
static void InitCode_65
(void)
{
int z
;
Last_CLI_SEI_Flag
= False
;
Last_ADC_SBC_Flag
= False
;
for (z
= 0; z
< 8; z
++)
MPR
[z
] = z
;
}
static Boolean IsDef_65
(void)
{
return False
;
}
static void SwitchFrom_65
(void)
{
DeinitFields
();
}
static Boolean ChkZeroArgs
(void)
{
return (0 == ArgCnt
);
}
static void SwitchTo_65
(void)
{
TurnWords
= False
;
SetIntConstMode
(eIntConstModeMoto
);
PCSymbol
= "*";
HeaderID
= 0x11;
NOPCode
= 0xea;
DivideChars
= ",";
HasAttrs
= False
;
ValidSegs
= 1 << SegCode
;
Grans
[SegCode
] = 1; ListGrans
[SegCode
] = 1; SegInits
[SegCode
] = 0;
SegLimits
[SegCode
] = (MomCPU
== CPUHUC6280
) ? 0x1fffff : 0xffff;
if (MomCPU
== CPUM740
)
{
static ASSUMERec ASSUME740s
[] =
{
{ "SP", &SpecPage
, 0, 0xff, -1, NULL
}
};
pASSUMERecs
= ASSUME740s
;
ASSUMERecCnt
= (sizeof(ASSUME740s
) / sizeof(*ASSUME740s
));
SetIsOccupiedFnc
= ChkZeroArgs
;
}
else if (MomCPU
== CPUHUC6280
)
{
static ASSUMERec ASSUME6280s
[] =
{
{ "MPR0", MPR
+ 0, 0, 0xff, -1, NULL
},
{ "MPR1", MPR
+ 1, 0, 0xff, -1, NULL
},
{ "MPR2", MPR
+ 2, 0, 0xff, -1, NULL
},
{ "MPR3", MPR
+ 3, 0, 0xff, -1, NULL
},
{ "MPR4", MPR
+ 4, 0, 0xff, -1, NULL
},
{ "MPR5", MPR
+ 5, 0, 0xff, -1, NULL
},
{ "MPR6", MPR
+ 6, 0, 0xff, -1, NULL
},
{ "MPR7", MPR
+ 7, 0, 0xff, -1, NULL
},
};
pASSUMERecs
= ASSUME6280s
;
ASSUMERecCnt
= (sizeof(ASSUME6280s
) / sizeof(*ASSUME6280s
));
SetIsOccupiedFnc
= ChkZeroArgs
;
}
else if (MomCPU
== CPU65CE02
)
{
static ASSUMERec ASSUME65CE02s
[] =
{
{ "B", &RegB
, 0, 0xff, 0, NULL
}
};
pASSUMERecs
= ASSUME65CE02s
;
ASSUMERecCnt
= (sizeof(ASSUME65CE02s
) / sizeof(*ASSUME65CE02s
));
}
else
SetIsOccupiedFnc
= NULL
;
MakeCode
= MakeCode_65
;
IsDef
= IsDef_65
;
SwitchFrom
= SwitchFrom_65
;
InitFields
();
}
void code65_init
(void)
{
CPU6502
= AddCPU
("6502" , SwitchTo_65
);
CPU65SC02
= AddCPU
("65SC02" , SwitchTo_65
);
CPU65C02
= AddCPU
("65C02" , SwitchTo_65
);
CPU65CE02
= AddCPU
("65CE02" , SwitchTo_65
);
CPUW65C02S
= AddCPU
("W65C02S" , SwitchTo_65
);
CPU65C19
= AddCPU
("65C19" , SwitchTo_65
);
CPUM740
= AddCPU
("MELPS740" , SwitchTo_65
);
CPUHUC6280
= AddCPU
("HUC6280" , SwitchTo_65
);
CPU6502U
= AddCPU
("6502UNDOC", SwitchTo_65
);
AddInitPassProc
(InitCode_65
);
}