mirror of
https://github.com/holub/mame
synced 2025-10-05 00:38:58 +03:00
2607 lines
110 KiB
C
2607 lines
110 KiB
C
/* ======================================================================== */
|
|
/* ============================= CONFIGURATION ============================ */
|
|
/* ======================================================================== */
|
|
|
|
#undef FLAG_SET_M
|
|
#undef FLAG_SET_X
|
|
#undef m37710i_set_flag_mx
|
|
#undef m37710i_set_reg_p
|
|
|
|
#if EXECUTION_MODE == EXECUTION_MODE_M0X0
|
|
#define FLAG_SET_M 0
|
|
#define FLAG_SET_X 0
|
|
#define m37710i_set_flag_mx m37710i_set_flag_m0x0
|
|
#define m37710i_set_reg_p m37710i_set_reg_p_m0x0
|
|
#elif EXECUTION_MODE == EXECUTION_MODE_M0X1
|
|
#define FLAG_SET_M 0
|
|
#define FLAG_SET_X 1
|
|
#define m37710i_set_flag_mx m37710i_set_flag_m0x1
|
|
#define m37710i_set_reg_p m37710i_set_reg_p_m0x1
|
|
#elif EXECUTION_MODE == EXECUTION_MODE_M1X0
|
|
#define FLAG_SET_M 1
|
|
#define FLAG_SET_X 0
|
|
#define m37710i_set_flag_mx m37710i_set_flag_m1x0
|
|
#define m37710i_set_reg_p m37710i_set_reg_p_m1x0
|
|
#elif EXECUTION_MODE == EXECUTION_MODE_M1X1
|
|
#define FLAG_SET_M 1
|
|
#define FLAG_SET_X 1
|
|
#define m37710i_set_flag_mx m37710i_set_flag_m1x1
|
|
#define m37710i_set_reg_p m37710i_set_reg_p_m1x1
|
|
#endif
|
|
|
|
/* ======================================================================== */
|
|
/* ============================ STATUS REGISTER =========================== */
|
|
/* ======================================================================== */
|
|
|
|
/* note: difference from 65816. when switching to 8-bit X/Y, X and Y are *not* truncated
|
|
to 8 bits! */
|
|
|
|
void m37710_cpu_device::m37710i_set_flag_mx(UINT32 value)
|
|
{
|
|
#if FLAG_SET_M
|
|
if(!(value & FLAGPOS_M))
|
|
{
|
|
REG_A |= REG_B;
|
|
REG_B = 0;
|
|
REG_BA |= REG_BB;
|
|
REG_BB = 0;
|
|
FLAG_M = MFLAG_CLEAR;
|
|
}
|
|
#else
|
|
if(value & FLAGPOS_M)
|
|
{
|
|
REG_B = REG_A & 0xff00;
|
|
REG_A = MAKE_UINT_8(REG_A);
|
|
REG_BB = REG_BA & 0xff00;
|
|
REG_BA = MAKE_UINT_8(REG_BA);
|
|
FLAG_M = MFLAG_SET;
|
|
}
|
|
#endif
|
|
#if FLAG_SET_X
|
|
if(!(value & FLAGPOS_X))
|
|
{
|
|
REG_X |= REG_XH;
|
|
REG_XH = 0;
|
|
REG_Y |= REG_YH;
|
|
REG_YH = 0;
|
|
FLAG_X = XFLAG_CLEAR;
|
|
}
|
|
#else
|
|
if(value & FLAGPOS_X)
|
|
{
|
|
REG_XH = REG_X & 0xff00;
|
|
REG_X = MAKE_UINT_8(REG_X);
|
|
REG_YH = REG_Y & 0xff00;
|
|
REG_Y = MAKE_UINT_8(REG_Y);
|
|
FLAG_X = XFLAG_SET;
|
|
}
|
|
#endif
|
|
m37710i_set_execution_mode((FLAG_M>>4) | (FLAG_X>>4));
|
|
}
|
|
|
|
|
|
void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
|
|
{
|
|
FLAG_N = value;
|
|
FLAG_V = value << 1;
|
|
FLAG_D = value & FLAGPOS_D;
|
|
FLAG_Z = !(value & FLAGPOS_Z);
|
|
FLAG_C = value << 8;
|
|
m37710i_set_flag_mx(value);
|
|
FLAG_I = value & FLAGPOS_I;
|
|
}
|
|
|
|
|
|
/* ======================================================================== */
|
|
/* =========================== OPERATION MACROS =========================== */
|
|
/* ======================================================================== */
|
|
|
|
/* M37710 Push all */
|
|
#undef OP_PSH
|
|
|
|
#if FLAG_SET_M
|
|
#if FLAG_SET_X
|
|
#define OP_PSH(MODE) \
|
|
SRC = OPER_8_##MODE(); \
|
|
CLK(12); \
|
|
if (SRC&0x1) \
|
|
{ m37710i_push_8(REG_A); CLK(2); } \
|
|
if (SRC&0x2) \
|
|
{ m37710i_push_8(REG_BA); CLK(2); } \
|
|
if (SRC&0x4) \
|
|
{ m37710i_push_8(REG_X); CLK(2); } \
|
|
if (SRC&0x8) \
|
|
{ m37710i_push_8(REG_Y); CLK(2); } \
|
|
if (SRC&0x10) \
|
|
{ m37710i_push_16(REG_D); CLK(2); } \
|
|
if (SRC&0x20) \
|
|
{ m37710i_push_8(REG_DB>>16); CLK(1); } \
|
|
if (SRC&0x40) \
|
|
{ m37710i_push_8(REG_PB>>16); CLK(1); } \
|
|
if (SRC&0x80) \
|
|
{ m37710i_push_8(m_ipl); m37710i_push_8(m37710i_get_reg_p()); CLK(2); }
|
|
#else // FLAG_SET_X
|
|
#define OP_PSH(MODE) \
|
|
SRC = OPER_8_##MODE(); \
|
|
CLK(12); \
|
|
if (SRC&0x1) \
|
|
{ m37710i_push_8(REG_A); CLK(2); } \
|
|
if (SRC&0x2) \
|
|
{ m37710i_push_8(REG_BA); CLK(2); } \
|
|
if (SRC&0x4) \
|
|
{ m37710i_push_16(REG_X); CLK(2); } \
|
|
if (SRC&0x8) \
|
|
{ m37710i_push_16(REG_Y); CLK(2); } \
|
|
if (SRC&0x10) \
|
|
{ m37710i_push_16(REG_D); CLK(2); } \
|
|
if (SRC&0x20) \
|
|
{ m37710i_push_8(REG_DB>>16); CLK(1); } \
|
|
if (SRC&0x40) \
|
|
{ m37710i_push_8(REG_PB>>16); CLK(1); } \
|
|
if (SRC&0x80) \
|
|
{ m37710i_push_8(m_ipl); m37710i_push_8(m37710i_get_reg_p()); CLK(2); }
|
|
#endif // FLAG_SET_X
|
|
#else // FLAG_SET_M
|
|
#if FLAG_SET_X
|
|
#define OP_PSH(MODE) \
|
|
SRC = OPER_8_##MODE(); \
|
|
CLK(12); \
|
|
if (SRC&0x1) \
|
|
{ m37710i_push_16(REG_A); CLK(2); } \
|
|
if (SRC&0x2) \
|
|
{ m37710i_push_16(REG_BA); CLK(2); } \
|
|
if (SRC&0x4) \
|
|
{ m37710i_push_8(REG_X); CLK(2); } \
|
|
if (SRC&0x8) \
|
|
{ m37710i_push_8(REG_Y); CLK(2); } \
|
|
if (SRC&0x10) \
|
|
{ m37710i_push_16(REG_D); CLK(2); } \
|
|
if (SRC&0x20) \
|
|
{ m37710i_push_8(REG_DB>>16); CLK(1); } \
|
|
if (SRC&0x40) \
|
|
{ m37710i_push_8(REG_PB>>16); CLK(1); } \
|
|
if (SRC&0x80) \
|
|
{ m37710i_push_8(m_ipl); m37710i_push_8(m37710i_get_reg_p()); CLK(2); }
|
|
#else // FLAG_SET_X
|
|
#define OP_PSH(MODE) \
|
|
SRC = OPER_8_##MODE(); \
|
|
CLK(12); \
|
|
if (SRC&0x1) \
|
|
{ m37710i_push_16(REG_A); CLK(2); } \
|
|
if (SRC&0x2) \
|
|
{ m37710i_push_16(REG_BA); CLK(2);} \
|
|
if (SRC&0x4) \
|
|
{ m37710i_push_16(REG_X); CLK(2); } \
|
|
if (SRC&0x8) \
|
|
{ m37710i_push_16(REG_Y); CLK(2); } \
|
|
if (SRC&0x10) \
|
|
{ m37710i_push_16(REG_D); CLK(2); } \
|
|
if (SRC&0x20) \
|
|
{ m37710i_push_8(REG_DB>>16); CLK(1); } \
|
|
if (SRC&0x40) \
|
|
{ m37710i_push_8(REG_PB>>16); CLK(1); } \
|
|
if (SRC&0x80) \
|
|
{ m37710i_push_8(m_ipl); m37710i_push_8(m37710i_get_reg_p()); CLK(2); }
|
|
#endif // FLAG_SET_X
|
|
#endif // FLAG_SET_M
|
|
|
|
/* M37710 Pull all */
|
|
/* Unusual behavior: bit 6 has no effect */
|
|
#undef OP_PUL
|
|
#define OP_PUL(MODE) \
|
|
SRC = OPER_8_##MODE(); \
|
|
CLK(14); \
|
|
if (SRC&0x80) \
|
|
{ m37710i_set_reg_p(m37710i_pull_8()); m37710i_set_reg_ipl(m37710i_pull_8()); CLK(3); } \
|
|
if (SRC&0x20) \
|
|
{ REG_DB = m37710i_pull_8() << 16; CLK(3); } \
|
|
if (SRC&0x10) \
|
|
{ REG_D = m37710i_pull_16(); CLK(4); } \
|
|
if (m37710i_get_reg_p() & XFLAG_SET) \
|
|
{ \
|
|
if (SRC&0x8) \
|
|
{ REG_Y = m37710i_pull_8(); CLK(3); } \
|
|
if (SRC&0x4) \
|
|
{ REG_X = m37710i_pull_8(); CLK(3); } \
|
|
} \
|
|
else \
|
|
{ \
|
|
if (SRC&0x8) \
|
|
{ REG_Y = m37710i_pull_16(); CLK(3); } \
|
|
if (SRC&0x4) \
|
|
{ REG_X = m37710i_pull_16(); CLK(3); } \
|
|
} \
|
|
if (m37710i_get_reg_p() & MFLAG_SET) \
|
|
{ \
|
|
if (SRC&0x2) \
|
|
{ REG_BA = m37710i_pull_8(); CLK(3); } \
|
|
if (SRC&0x1) \
|
|
{ REG_A = m37710i_pull_8(); CLK(3); } \
|
|
} \
|
|
else \
|
|
{ \
|
|
if (SRC&0x2) \
|
|
{ REG_BA = m37710i_pull_16(); CLK(3); } \
|
|
if (SRC&0x1) \
|
|
{ REG_A = m37710i_pull_16(); CLK(3); } \
|
|
} \
|
|
m37710i_update_irqs()
|
|
|
|
/* M37710 Multiply */
|
|
#undef OP_MPY
|
|
#if FLAG_SET_M
|
|
#define OP_MPY(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE + 14); \
|
|
SRC = OPER_8_##MODE(); \
|
|
{ UINT16 temp = SRC * (REG_A&0xff); REG_A = temp & 0xff; REG_BA = (temp>>8)&0xff; FLAG_Z = temp; FLAG_N = (temp & 0x8000) ? 1 : 0; FLAG_C = 0; }
|
|
#else
|
|
#define OP_MPY(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE + 14+8); \
|
|
SRC = OPER_16_##MODE(); \
|
|
{ UINT32 temp = SRC * REG_A; REG_A = temp & 0xffff; REG_BA = (temp>>16)&0xffff; FLAG_Z = temp; FLAG_N = (temp & 0x80000000) ? 1 : 0; FLAG_C = 0; }
|
|
#endif
|
|
|
|
/* M37710 Divide */
|
|
#undef OP_DIV
|
|
#if FLAG_SET_M
|
|
#define OP_DIV(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE + 17); \
|
|
SRC = (REG_BA&0xff)<<8 | (REG_A & 0xff); \
|
|
DST = OPER_8_##MODE(); \
|
|
if (DST != 0) \
|
|
{ \
|
|
UINT16 tempa = SRC / DST; UINT16 tempb = SRC % DST; \
|
|
FLAG_V = ((tempa | tempb) & 0xff00) ? VFLAG_SET : 0; \
|
|
FLAG_C = FLAG_V ? CFLAG_SET : 0; \
|
|
if (!FLAG_V) { FLAG_N = (tempa & 0x80) ? 1 : 0; } \
|
|
FLAG_Z = REG_A = tempa & 0xff; REG_BA = tempb & 0xff; \
|
|
CLK(8); \
|
|
} else m37710i_interrupt_software(0xfffc)
|
|
#else
|
|
#define OP_DIV(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE + 17); \
|
|
SRC = (REG_BA<<16) | REG_A; \
|
|
DST = OPER_16_##MODE(); \
|
|
if (DST != 0) \
|
|
{ \
|
|
UINT32 tempa = SRC / DST; UINT32 tempb = SRC % DST; \
|
|
FLAG_V = ((tempa | tempb) & 0xffff0000) ? VFLAG_SET : 0; \
|
|
FLAG_C = FLAG_V ? CFLAG_SET : 0; \
|
|
if (!FLAG_V) { FLAG_N = (tempa & 0x8000) ? 1 : 0; } \
|
|
FLAG_Z = REG_A = tempa & 0xffff; REG_BA = tempb & 0xffff; \
|
|
CLK(8+15); \
|
|
} else m37710i_interrupt_software(0xfffc)
|
|
#endif
|
|
|
|
/* M37710 Add With Carry */
|
|
#undef OP_ADC
|
|
#if FLAG_SET_M
|
|
#define OP_ADC(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
SRC = OPER_8_##MODE(); \
|
|
FLAG_C = REG_A + SRC + CFLAG_AS_1(); \
|
|
if(FLAG_D) \
|
|
{ \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
} \
|
|
FLAG_V = VFLAG_ADD_8(SRC, REG_A, FLAG_C); \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_ADC(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
SRC = OPER_16_##MODE(); \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_A + SRC + CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_ADD_16(SRC, REG_A, FLAG_C); \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(REG_A); \
|
|
FLAG_C = CFLAG_16(FLAG_C); \
|
|
BREAKOUT; \
|
|
} \
|
|
FLAG_C = MAKE_UINT_8(REG_A) + MAKE_UINT_8(SRC) + CFLAG_AS_1(); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
\
|
|
FLAG_C = MAKE_UINT_8(REG_A>>8) + MAKE_UINT_8(SRC>>8) + CFLAG_AS_1(); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
FLAG_Z |= MAKE_UINT_8(FLAG_C) << 8; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
FLAG_V = VFLAG_ADD_16(SRC, REG_A, FLAG_C); \
|
|
REG_A = FLAG_Z
|
|
#endif
|
|
|
|
/* M37710 Add With Carry - B accumulator*/
|
|
#undef OP_ADCB
|
|
#if FLAG_SET_M
|
|
#define OP_ADCB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
SRC = OPER_8_##MODE(); \
|
|
FLAG_C = REG_BA + SRC + CFLAG_AS_1(); \
|
|
if(FLAG_D) \
|
|
{ \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
} \
|
|
FLAG_V = VFLAG_ADD_8(SRC, REG_BA, FLAG_C); \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_ADCB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
SRC = OPER_16_##MODE(); \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_BA + SRC + CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_ADD_16(SRC, REG_BA, FLAG_C); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(REG_BA); \
|
|
FLAG_C = CFLAG_16(FLAG_C); \
|
|
BREAKOUT; \
|
|
} \
|
|
FLAG_C = MAKE_UINT_8(REG_BA) + MAKE_UINT_8(SRC) + CFLAG_AS_1(); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
\
|
|
FLAG_C = MAKE_UINT_8(REG_BA>>8) + MAKE_UINT_8(SRC>>8) + CFLAG_AS_1(); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C+=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C+=0x60; \
|
|
FLAG_Z |= MAKE_UINT_8(FLAG_C) << 8; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
FLAG_V = VFLAG_ADD_16(SRC, REG_BA, FLAG_C); \
|
|
REG_BA = FLAG_Z
|
|
#endif
|
|
|
|
/* M37710 Logical AND with accumulator */
|
|
#undef OP_AND
|
|
#if FLAG_SET_M
|
|
#define OP_AND(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_A &= OPER_8_##MODE()
|
|
#else
|
|
#define OP_AND(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_A &= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Logical AND with B accumulator */
|
|
#undef OP_ANDB
|
|
#if FLAG_SET_M
|
|
#define OP_ANDB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_BA &= OPER_8_##MODE()
|
|
#else
|
|
#define OP_ANDB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_BA &= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Arithmetic Shift Left accumulator */
|
|
#undef OP_ASL
|
|
#if FLAG_SET_M
|
|
#define OP_ASL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = REG_A << 1; \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_ASL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = REG_A << 1; \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Arithmetic Shift Left B accumulator */
|
|
#undef OP_BSL
|
|
#if FLAG_SET_M
|
|
#define OP_BSL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = REG_BA << 1; \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_BSL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = REG_BA << 1; \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Arithmetic Shift Left operand */
|
|
#undef OP_ASLM
|
|
#if FLAG_SET_M
|
|
#define OP_ASLM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_C = read_8_##MODE(DST) << 1; \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_ASLM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_C = read_16_##MODE(DST) << 1; \
|
|
FLAG_Z = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C); \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Branch on Condition Code */
|
|
#undef OP_BCC
|
|
#define OP_BCC(COND) \
|
|
DST = OPER_8_IMM(); \
|
|
if(COND) \
|
|
{ \
|
|
CLK(CLK_OP + CLK_RELATIVE_8 + 1); \
|
|
m37710i_branch_8(DST); \
|
|
BREAKOUT; \
|
|
} \
|
|
CLK(CLK_OP + CLK_RELATIVE_8);
|
|
/* M37710 Cause a Break interrupt */
|
|
#undef OP_BRK
|
|
#define OP_BRK() \
|
|
REG_PC++; CLK(CLK_OP + CLK_R8 + CLK_IMM); \
|
|
logerror("error M37710: BRK at PC=%06x\n", REG_PB|REG_PC); \
|
|
m37710i_interrupt_software(0xfffa)
|
|
|
|
/* M37710 Branch Always */
|
|
#undef OP_BRA
|
|
#define OP_BRA() \
|
|
CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_8); \
|
|
m37710i_branch_8(OPER_8_IMM())
|
|
|
|
/* M37710 Branch Always Long */
|
|
#undef OP_BRL
|
|
#define OP_BRL() \
|
|
CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_16); \
|
|
m37710i_branch_16(OPER_16_IMM())
|
|
|
|
/* M37710 Clear Carry flag */
|
|
#undef OP_CLC
|
|
#define OP_CLC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = CFLAG_CLEAR
|
|
|
|
/* M37710 Clear Interrupt Mask flag */
|
|
#undef OP_CLI
|
|
#define OP_CLI() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_I = IFLAG_CLEAR; \
|
|
m37710i_update_irqs()
|
|
|
|
/* M37710 Clear oVerflow flag */
|
|
#undef OP_CLV
|
|
#define OP_CLV() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_V = VFLAG_CLEAR
|
|
|
|
/* M37710 Compare operand to accumulator */
|
|
/* Unusual behavior: C flag is inverted */
|
|
#undef OP_CMP
|
|
#if FLAG_SET_M
|
|
#define OP_CMP(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_C = REG_A - OPER_8_##MODE(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C ^= CFLAG_SET
|
|
#else
|
|
#define OP_CMP(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_C = REG_A - OPER_16_##MODE(); \
|
|
FLAG_Z = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = ~CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Compare operand to B accumulator */
|
|
/* Unusual behavior: C flag is inverted */
|
|
#undef OP_CMPB
|
|
#if FLAG_SET_M
|
|
#define OP_CMPB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_C = REG_BA - OPER_8_##MODE(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C ^= CFLAG_SET
|
|
#else
|
|
#define OP_CMPB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_C = REG_BA - OPER_16_##MODE(); \
|
|
FLAG_Z = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = ~CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Compare operand to index register */
|
|
/* Unusual behavior: C flag is inverted */
|
|
#undef OP_CMPX
|
|
#if FLAG_SET_X
|
|
#define OP_CMPX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_C = REG - OPER_8_##MODE(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C ^= CFLAG_SET
|
|
#else
|
|
#define OP_CMPX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_C = REG - OPER_16_##MODE(); \
|
|
FLAG_Z = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = ~CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Decrement accumulator */
|
|
#undef OP_DEC
|
|
#if FLAG_SET_M
|
|
#define OP_DEC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(REG_A - 1)
|
|
#else
|
|
#define OP_DEC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(REG_A - 1); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Decrement B accumulator */
|
|
#undef OP_DECB
|
|
#if FLAG_SET_M
|
|
#define OP_DECB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(REG_BA - 1)
|
|
#else
|
|
#define OP_DECB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(REG_BA - 1); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Decrement operand */
|
|
#undef OP_DECM
|
|
#if FLAG_SET_M
|
|
#define OP_DECM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) - 1); \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_DECM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) - 1); \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Decrement index register */
|
|
#undef OP_DECX
|
|
#if FLAG_SET_X
|
|
#define OP_DECX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG - 1)
|
|
#else
|
|
#define OP_DECX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = MAKE_UINT_16(REG - 1); \
|
|
FLAG_N = NFLAG_16(REG)
|
|
#endif
|
|
|
|
/* M37710 Exclusive Or operand to accumulator */
|
|
#undef OP_EOR
|
|
#if FLAG_SET_M
|
|
#define OP_EOR(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_A ^= OPER_8_##MODE()
|
|
#else
|
|
#define OP_EOR(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_A ^= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Exclusive Or operand to accumulator B */
|
|
#undef OP_EORB
|
|
#if FLAG_SET_M
|
|
#define OP_EORB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_BA ^= OPER_8_##MODE()
|
|
#else
|
|
#define OP_EORB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_BA ^= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Increment accumulator */
|
|
#undef OP_INC
|
|
#if FLAG_SET_M
|
|
#define OP_INC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(REG_A + 1)
|
|
#else
|
|
#define OP_INC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(REG_A + 1); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Increment B accumulator */
|
|
#undef OP_INCB
|
|
#if FLAG_SET_M
|
|
#define OP_INCB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(REG_BA + 1)
|
|
#else
|
|
#define OP_INCB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(REG_BA + 1); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Increment operand */
|
|
#undef OP_INCM
|
|
#if FLAG_SET_M
|
|
#define OP_INCM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) + 1); \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_INCM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) + 1); \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Increment index register */
|
|
#undef OP_INCX
|
|
#if FLAG_SET_X
|
|
#define OP_INCX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG + 1)
|
|
#else
|
|
#define OP_INCX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = MAKE_UINT_16(REG + 1); \
|
|
FLAG_N = NFLAG_16(REG)
|
|
#endif
|
|
|
|
/* M37710 Jump Long */
|
|
#undef OP_JMLAI
|
|
#define OP_JMLAI() \
|
|
CLK(CLK_OP + CLK_AI + 1); \
|
|
m37710i_jump_24(read_24_A(OPER_16_IMM()))
|
|
|
|
/* M37710 Jump */
|
|
#undef OP_JMP
|
|
#define OP_JMP(MODE) \
|
|
CLK(CLK_OP + CLK_##MODE); \
|
|
m37710i_jump_16(EA_##MODE())
|
|
|
|
/* M37710 Jump absolute indexed indirect */
|
|
#undef OP_JMPAXI
|
|
#define OP_JMPAXI() \
|
|
CLK(CLK_OP + CLK_AXI); \
|
|
m37710i_jump_16(read_16_AXI(REG_PB | (MAKE_UINT_16(OPER_16_IMM() + REG_X))))
|
|
|
|
/* M37710 Jump absolute long */
|
|
#undef OP_JMPAL
|
|
#define OP_JMPAL() \
|
|
CLK(CLK_OP + CLK_AL); \
|
|
m37710i_jump_24(EA_AL())
|
|
|
|
/* M37710 Jump to Subroutine Long */
|
|
#undef OP_JSL
|
|
#define OP_JSL(MODE) \
|
|
CLK(CLK_OP + CLK_W24 + CLK_##MODE + 1); \
|
|
DST = EA_##MODE(); \
|
|
m37710i_push_8(REG_PB>>16); \
|
|
m37710i_push_16(REG_PC); \
|
|
m37710i_jump_24(DST)
|
|
|
|
/* M37710 Jump to Subroutine */
|
|
#undef OP_JSR
|
|
#define OP_JSR(MODE) \
|
|
CLK(CLK_OP + CLK_W16 + CLK_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
m37710i_push_16(REG_PC); \
|
|
m37710i_jump_16(DST)
|
|
|
|
/* M37710 Jump to Subroutine */
|
|
#undef OP_JSRAXI
|
|
#define OP_JSRAXI() \
|
|
CLK(CLK_OP + CLK_W16 + CLK_AXI); \
|
|
DST = read_16_AXI(REG_PB | (MAKE_UINT_16(OPER_16_IMM() + REG_X))); \
|
|
m37710i_push_16(REG_PC); \
|
|
m37710i_jump_16(DST)
|
|
|
|
/* M37710 Load accumulator with operand */
|
|
#undef OP_LDA
|
|
#if FLAG_SET_M
|
|
#define OP_LDA(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_A = OPER_8_##MODE()
|
|
#else
|
|
#define OP_LDA(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_A = OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Load B accumulator with operand */
|
|
#undef OP_LDB
|
|
#if FLAG_SET_M
|
|
#define OP_LDB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_BA = OPER_8_##MODE()
|
|
#else
|
|
#define OP_LDB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_BA = OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Load memory with operand */
|
|
#undef OP_LDM
|
|
#if FLAG_SET_M
|
|
#define OP_LDM(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
REG_IM2 = EA_##MODE(); \
|
|
REG_IM = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
write_8_##MODE(REG_IM2, REG_IM)
|
|
#else
|
|
#define OP_LDM(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
REG_IM2 = EA_##MODE(); \
|
|
REG_IM = read_16_IMM(REG_PB | REG_PC); \
|
|
REG_PC+=2; \
|
|
write_16_##MODE(REG_IM2, REG_IM)
|
|
#endif
|
|
|
|
/* M37710 Branch if bits set */
|
|
#undef OP_BBS
|
|
#if FLAG_SET_M
|
|
#define OP_BBS(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
REG_IM2 = read_8_NORM(EA_##MODE()); \
|
|
REG_IM = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
DST = OPER_8_IMM(); \
|
|
if ((REG_IM2 & REG_IM) == REG_IM) \
|
|
{ \
|
|
CLK(CLK_OP + CLK_RELATIVE_8 + 1); \
|
|
m37710i_branch_8(DST); \
|
|
BREAKOUT; \
|
|
}
|
|
#else
|
|
#define OP_BBS(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
REG_IM2 = read_16_NORM(EA_##MODE()); \
|
|
REG_IM = read_16_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
REG_PC++; \
|
|
DST = OPER_8_IMM(); \
|
|
if ((REG_IM2 & REG_IM) == REG_IM) \
|
|
{ \
|
|
CLK(CLK_OP + CLK_RELATIVE_8 + 1); \
|
|
m37710i_branch_8(DST); \
|
|
BREAKOUT; \
|
|
}
|
|
#endif
|
|
|
|
/* M37710 Branch if bits clear */
|
|
#undef OP_BBC
|
|
#if FLAG_SET_M
|
|
#define OP_BBC(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
REG_IM2 = read_8_NORM(EA_##MODE()); \
|
|
REG_IM = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
DST = OPER_8_IMM(); \
|
|
if ((REG_IM2 & REG_IM) == 0) \
|
|
{ \
|
|
CLK(CLK_OP + CLK_RELATIVE_8 + 1); \
|
|
m37710i_branch_8(DST); \
|
|
BREAKOUT; \
|
|
}
|
|
#else
|
|
#define OP_BBC(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
REG_IM2 = read_16_NORM(EA_##MODE()); \
|
|
REG_IM = read_16_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
REG_PC++; \
|
|
DST = OPER_8_IMM(); \
|
|
if ((REG_IM2 & REG_IM) == 0) \
|
|
{ \
|
|
CLK(CLK_OP + CLK_RELATIVE_8 + 1); \
|
|
m37710i_branch_8(DST); \
|
|
BREAKOUT; \
|
|
}
|
|
#endif
|
|
|
|
/* M37710 Swap accumulators */
|
|
#undef OP_XAB
|
|
#if FLAG_SET_M
|
|
#define OP_XAB() \
|
|
CLK(6); \
|
|
DST = REG_A; \
|
|
FLAG_N = FLAG_Z = REG_A = REG_BA; \
|
|
REG_BA = DST;
|
|
#else
|
|
#define OP_XAB() \
|
|
CLK(6); \
|
|
DST = REG_A; \
|
|
FLAG_Z = REG_A = REG_BA; \
|
|
FLAG_N = NFLAG_16(REG_A); \
|
|
REG_BA = DST;
|
|
#endif
|
|
|
|
/* M37710 Load index register with operand */
|
|
#undef OP_LDX
|
|
#if FLAG_SET_X
|
|
#define OP_LDX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG = OPER_8_##MODE()
|
|
#else
|
|
#define OP_LDX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG = OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG)
|
|
#endif
|
|
|
|
/* M37710 Logical Shift Right accumulator */
|
|
#undef OP_LSR
|
|
#if FLAG_SET_M
|
|
#define OP_LSR() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = 0; \
|
|
FLAG_C = REG_A << 8; \
|
|
FLAG_Z = REG_A >>= 1
|
|
#else
|
|
#define OP_LSR() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = 0; \
|
|
FLAG_C = REG_A << 8; \
|
|
FLAG_Z = REG_A >>= 1
|
|
#endif
|
|
|
|
/* M37710 Logical Shift Right B accumulator */
|
|
#undef OP_LSRB
|
|
#if FLAG_SET_M
|
|
#define OP_LSRB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = 0; \
|
|
FLAG_C = REG_BA << 8; \
|
|
FLAG_Z = REG_BA >>= 1
|
|
#else
|
|
#define OP_LSRB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_N = 0; \
|
|
FLAG_C = REG_BA << 8; \
|
|
FLAG_Z = REG_BA >>= 1
|
|
#endif
|
|
|
|
/* M37710 Logical Shift Right operand */
|
|
#undef OP_LSRM
|
|
#if FLAG_SET_M
|
|
#define OP_LSRM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_N = 0; \
|
|
FLAG_Z = read_8_##MODE(DST); \
|
|
FLAG_C = FLAG_Z << 8; \
|
|
FLAG_Z >>= 1; \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_LSRM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_N = 0; \
|
|
FLAG_Z = read_16_##MODE(DST); \
|
|
FLAG_C = FLAG_Z << 8; \
|
|
FLAG_Z >>= 1; \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Move Block Negative */
|
|
#undef OP_MVN
|
|
#if FLAG_SET_X
|
|
#define OP_MVN() \
|
|
DST = OPER_8_IMM()<<16; \
|
|
SRC = OPER_8_IMM()<<16; \
|
|
REG_DB = DST; \
|
|
REG_A |= REG_B; \
|
|
CLK(7); \
|
|
if (REG_A > 0) \
|
|
{ \
|
|
write_8_NORM(DST | REG_Y, read_8_NORM(SRC | REG_X)); \
|
|
REG_X = MAKE_UINT_8(REG_X+1); \
|
|
REG_Y = MAKE_UINT_8(REG_Y+1); \
|
|
REG_A--; \
|
|
if ((REG_A&0xffff) != 0) \
|
|
{\
|
|
REG_PC -= 3; \
|
|
}\
|
|
else \
|
|
{ \
|
|
if (FLAG_M) \
|
|
{ \
|
|
REG_A = 0xff; \
|
|
REG_B = 0xff00; \
|
|
} \
|
|
else \
|
|
{ \
|
|
REG_A = 0xffff; \
|
|
} \
|
|
} \
|
|
}
|
|
#else
|
|
#define OP_MVN() \
|
|
DST = OPER_8_IMM()<<16; \
|
|
SRC = OPER_8_IMM()<<16; \
|
|
REG_DB = DST; \
|
|
REG_A |= REG_B; \
|
|
CLK(7); \
|
|
if (REG_A > 0) \
|
|
{ \
|
|
write_8_NORM(DST | REG_Y, read_8_NORM(SRC | REG_X)); \
|
|
REG_X = MAKE_UINT_16(REG_X+1); \
|
|
REG_Y = MAKE_UINT_16(REG_Y+1); \
|
|
REG_A--; \
|
|
if ((REG_A&0xffff) != 0) \
|
|
{\
|
|
REG_PC -= 3; \
|
|
}\
|
|
else \
|
|
{ \
|
|
if (FLAG_M) \
|
|
{ \
|
|
REG_A = 0xff; \
|
|
REG_B = 0xff00; \
|
|
} \
|
|
else \
|
|
{ \
|
|
REG_A = 0xffff; \
|
|
} \
|
|
} \
|
|
}
|
|
#endif
|
|
|
|
/* M37710 Move Block Positive */
|
|
#undef OP_MVP
|
|
#if FLAG_SET_X
|
|
#define OP_MVP() \
|
|
DST = OPER_8_IMM()<<16; \
|
|
SRC = OPER_8_IMM()<<16; \
|
|
REG_DB = DST; \
|
|
REG_A |= REG_B; \
|
|
CLK(7); \
|
|
if (REG_A > 0) \
|
|
{ \
|
|
write_8_NORM(DST | REG_Y, read_8_NORM(SRC | REG_X)); \
|
|
REG_X = MAKE_UINT_8(REG_X-1); \
|
|
REG_Y = MAKE_UINT_8(REG_Y-1); \
|
|
REG_A--; \
|
|
if ((REG_A&0xffff) != 0) \
|
|
{\
|
|
REG_PC -= 3; \
|
|
}\
|
|
else \
|
|
{ \
|
|
if (FLAG_M) \
|
|
{ \
|
|
REG_A = 0xff; \
|
|
REG_B = 0xff00; \
|
|
} \
|
|
else \
|
|
{ \
|
|
REG_A = 0xffff; \
|
|
} \
|
|
} \
|
|
}
|
|
#else
|
|
#define OP_MVP() \
|
|
DST = OPER_8_IMM()<<16; \
|
|
SRC = OPER_8_IMM()<<16; \
|
|
REG_DB = DST; \
|
|
REG_A |= REG_B; \
|
|
CLK(7); \
|
|
if (REG_A > 0) \
|
|
{ \
|
|
write_8_NORM(DST | REG_Y, read_8_NORM(SRC | REG_X)); \
|
|
REG_X = MAKE_UINT_16(REG_X-1); \
|
|
REG_Y = MAKE_UINT_16(REG_Y-1); \
|
|
REG_A--; \
|
|
if ((REG_A&0xffff) != 0) \
|
|
{\
|
|
REG_PC -= 3; \
|
|
}\
|
|
else \
|
|
{ \
|
|
if (FLAG_M) \
|
|
{ \
|
|
REG_A = 0xff; \
|
|
REG_B = 0xff00; \
|
|
} \
|
|
else \
|
|
{ \
|
|
REG_A = 0xffff; \
|
|
} \
|
|
} \
|
|
}
|
|
#endif
|
|
|
|
/* M37710 No Operation */
|
|
#undef OP_NOP
|
|
#define OP_NOP() \
|
|
CLK(CLK_OP + CLK_IMPLIED)
|
|
|
|
/* M37710 Logical OR operand to accumulator */
|
|
#undef OP_ORA
|
|
#if FLAG_SET_M
|
|
#define OP_ORA(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_A |= OPER_8_ ## MODE()
|
|
#else
|
|
#define OP_ORA(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_A |= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Logical OR operand to B accumulator */
|
|
#undef OP_ORB
|
|
#if FLAG_SET_M
|
|
#define OP_ORB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
FLAG_N = FLAG_Z = REG_BA |= OPER_8_ ## MODE()
|
|
#else
|
|
#define OP_ORB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
FLAG_Z = REG_BA |= OPER_16_##MODE(); \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Push Effective Address */
|
|
#undef OP_PEA
|
|
#define OP_PEA() \
|
|
CLK(CLK_OP + CLK_R16 + CLK_W16); \
|
|
m37710i_push_16(OPER_16_IMM())
|
|
|
|
/* M37710 Push Effective Indirect Address */
|
|
#undef OP_PEI
|
|
#define OP_PEI() \
|
|
CLK(CLK_OP + CLK_R16 + CLK_W16 + CLK_D); \
|
|
m37710i_push_16(EA_DI())
|
|
|
|
/* M37710 Push Effective PC-Relative Address */
|
|
#undef OP_PER
|
|
#define OP_PER() \
|
|
CLK(CLK_OP + CLK_R16 + CLK_W16 + 1); \
|
|
SRC = OPER_16_IMM(); \
|
|
m37710i_push_16(REG_PC + SRC)
|
|
|
|
/* M37710 Push accumulator to the stack */
|
|
#undef OP_PHA
|
|
#if FLAG_SET_M
|
|
#define OP_PHA() \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(REG_A)
|
|
#else
|
|
#define OP_PHA() \
|
|
CLK(CLK_OP + CLK_W16 + 1); \
|
|
m37710i_push_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Push B accumulator to the stack */
|
|
#undef OP_PHAB
|
|
#if FLAG_SET_M
|
|
#define OP_PHAB() \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(REG_BA)
|
|
#else
|
|
#define OP_PHAB() \
|
|
CLK(CLK_OP + CLK_W16 + 1); \
|
|
m37710i_push_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Push index register to the stack */
|
|
#undef OP_PHX
|
|
#if FLAG_SET_X
|
|
#define OP_PHX(REG) \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(REG)
|
|
#else
|
|
#define OP_PHX(REG) \
|
|
CLK(CLK_OP + CLK_W16 + 1); \
|
|
m37710i_push_16(REG)
|
|
#endif
|
|
|
|
/* M37710 Push data bank register */
|
|
#undef OP_PHT
|
|
#define OP_PHT() \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(REG_DB>>16)
|
|
|
|
/* M37710 Push direct register */
|
|
#undef OP_PHD
|
|
#define OP_PHD() \
|
|
CLK(CLK_OP + CLK_W16 + 1); \
|
|
m37710i_push_16(REG_D)
|
|
|
|
/* M37710 Push program bank register */
|
|
#undef OP_PHK
|
|
#define OP_PHK() \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(REG_PB>>16)
|
|
|
|
/* M37710 Push the Processor Status Register to the stack */
|
|
#undef OP_PHP
|
|
#define OP_PHP() \
|
|
CLK(CLK_OP + CLK_W8 + 1); \
|
|
m37710i_push_8(m_ipl); \
|
|
m37710i_push_8(m37710i_get_reg_p())
|
|
|
|
/* M37710 Pull accumulator from the stack */
|
|
#undef OP_PLA
|
|
#if FLAG_SET_M
|
|
#define OP_PLA() \
|
|
CLK(CLK_OP + CLK_R8 + 2); \
|
|
FLAG_N = FLAG_Z = REG_A = m37710i_pull_8()
|
|
#else
|
|
#define OP_PLA() \
|
|
CLK(CLK_OP + CLK_R16 + 2); \
|
|
FLAG_Z = REG_A = m37710i_pull_16(); \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Pull B accumulator from the stack */
|
|
#undef OP_PLAB
|
|
#if FLAG_SET_M
|
|
#define OP_PLAB() \
|
|
CLK(CLK_OP + CLK_R8 + 2); \
|
|
FLAG_N = FLAG_Z = REG_BA = m37710i_pull_8()
|
|
#else
|
|
#define OP_PLAB() \
|
|
CLK(CLK_OP + CLK_R16 + 2); \
|
|
FLAG_Z = REG_BA = m37710i_pull_16(); \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Pull index register from the stack */
|
|
#undef OP_PLX
|
|
#if FLAG_SET_X
|
|
#define OP_PLX(REG) \
|
|
CLK(CLK_OP + CLK_R8 + 2); \
|
|
FLAG_N = FLAG_Z = REG = m37710i_pull_8()
|
|
#else
|
|
#define OP_PLX(REG) \
|
|
CLK(CLK_OP + CLK_R16 + 2); \
|
|
FLAG_Z = REG = m37710i_pull_16(); \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Pull data bank register */
|
|
#undef OP_PLT
|
|
#define OP_PLT() \
|
|
CLK(CLK_OP + CLK_R8 + 2); \
|
|
FLAG_N = FLAG_Z = m37710i_pull_8(); \
|
|
REG_DB = FLAG_Z << 16
|
|
|
|
/* M37710 Pull direct register */
|
|
#undef OP_PLD
|
|
#define OP_PLD() \
|
|
CLK(CLK_OP + CLK_R16 + 2); \
|
|
REG_D = m37710i_pull_16()
|
|
|
|
/* M37710 Pull the Processor Status Register from the stack */
|
|
#undef OP_PLP
|
|
#define OP_PLP() \
|
|
CLK(CLK_OP + CLK_R8 + 2); \
|
|
m37710i_set_reg_p(m37710i_pull_8()); \
|
|
m37710i_set_reg_ipl(m37710i_pull_8()); \
|
|
m37710i_update_irqs()
|
|
|
|
/* M37710 Reset Program status word */
|
|
#undef OP_REP
|
|
#define OP_REP() \
|
|
CLK(CLK_OP + CLK_R8 + 1); \
|
|
m37710i_set_reg_p(m37710i_get_reg_p() & ~OPER_8_IMM()); \
|
|
m37710i_update_irqs()
|
|
|
|
/* M37710 Clear "M" status bit */
|
|
#undef OP_CLM
|
|
#define OP_CLM() \
|
|
CLK(CLK_OP + CLK_R8 + 1); \
|
|
m37710i_set_reg_p(m37710i_get_reg_p() & ~FLAGPOS_M)
|
|
|
|
/* M37710 Rotate Left the accumulator */
|
|
#undef OP_ROL
|
|
#if FLAG_SET_M
|
|
#define OP_ROL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = (REG_A<<1) | CFLAG_AS_1(); \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_ROL() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = (REG_A<<1) | CFLAG_AS_1(); \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Rotate Left the B accumulator */
|
|
#undef OP_ROLB
|
|
#if FLAG_SET_M
|
|
#define OP_ROLB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = (REG_BA<<1) | CFLAG_AS_1(); \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(FLAG_C)
|
|
#else
|
|
#define OP_ROLB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = (REG_BA<<1) | CFLAG_AS_1(); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C)
|
|
#endif
|
|
|
|
/* M37710 Rotate Left the accumulator by a specified amount */
|
|
#undef OP_RLA
|
|
#if FLAG_SET_M
|
|
#define OP_RLA(MODE) \
|
|
{ int cnt = OPER_8_##MODE(); while (cnt > 0) { CLK(6); REG_A=((REG_A<<1)|(REG_A>>7&1))&0xff; cnt--; } }
|
|
#else
|
|
#define OP_RLA(MODE) \
|
|
{ int cnt = OPER_16_##MODE(); while (cnt > 0) { CLK(6); REG_A=((REG_A<<1)|(REG_A>>15&1))&0xffff; cnt--; } }
|
|
#endif
|
|
|
|
/* M37710 Rotate Left an operand */
|
|
#undef OP_ROLM
|
|
#if FLAG_SET_M
|
|
#define OP_ROLM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_C = (read_8_##MODE(DST)<<1) | CFLAG_AS_1(); \
|
|
FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_ROLM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_C = (read_16_##MODE(DST)<<1) | CFLAG_AS_1(); \
|
|
FLAG_Z = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(FLAG_C); \
|
|
FLAG_C = CFLAG_16(FLAG_C); \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Rotate Right the accumulator */
|
|
#undef OP_ROR
|
|
#if FLAG_SET_M
|
|
#define OP_ROR() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_A |= FLAG_C & 0x100; \
|
|
FLAG_C = REG_A << 8; \
|
|
FLAG_N = FLAG_Z = REG_A >>= 1
|
|
#else
|
|
#define OP_ROR() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_A |= (FLAG_C<<8) & 0x10000; \
|
|
FLAG_C = REG_A << 8; \
|
|
FLAG_Z = REG_A >>= 1; \
|
|
FLAG_N = NFLAG_16(REG_A)
|
|
#endif
|
|
|
|
/* M37710 Rotate Right the B accumulator */
|
|
#undef OP_RORB
|
|
#if FLAG_SET_M
|
|
#define OP_RORB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_BA |= FLAG_C & 0x100; \
|
|
FLAG_C = REG_BA << 8; \
|
|
FLAG_N = FLAG_Z = REG_BA >>= 1
|
|
#else
|
|
#define OP_RORB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_BA |= (FLAG_C<<8) & 0x10000; \
|
|
FLAG_C = REG_BA << 8; \
|
|
FLAG_Z = REG_BA >>= 1; \
|
|
FLAG_N = NFLAG_16(REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Rotate Right an operand */
|
|
#undef OP_RORM
|
|
#if FLAG_SET_M
|
|
#define OP_RORM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_Z = read_8_##MODE(DST) | (FLAG_C & 0x100); \
|
|
FLAG_C = FLAG_Z << 8; \
|
|
FLAG_N = FLAG_Z >>= 1; \
|
|
write_8_##MODE(DST, FLAG_Z)
|
|
#else
|
|
#define OP_RORM(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
FLAG_Z = read_16_##MODE(DST) | ((FLAG_C<<8) & 0x10000); \
|
|
FLAG_C = FLAG_Z << 8; \
|
|
FLAG_Z >>= 1; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
write_16_##MODE(DST, FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Return from Interrupt */
|
|
#undef OP_RTI
|
|
#define OP_RTI() \
|
|
CLK(8); \
|
|
m37710i_set_reg_p(m37710i_pull_8()); \
|
|
m37710i_set_reg_ipl(m37710i_pull_8()); \
|
|
m37710i_jump_16(m37710i_pull_16()); \
|
|
REG_PB = m37710i_pull_8() << 16; \
|
|
m37710i_update_irqs()
|
|
|
|
/* M37710 Return from Subroutine Long */
|
|
#undef OP_RTL
|
|
#define OP_RTL() \
|
|
CLK(6); \
|
|
m37710i_jump_24(m37710i_pull_24())
|
|
|
|
/* M37710 Return from Subroutine */
|
|
#undef OP_RTS
|
|
#define OP_RTS() \
|
|
CLK(6); \
|
|
DST = m37710i_pull_16(); \
|
|
m37710i_jump_16(DST)
|
|
|
|
/* M37710 Subtract with Carry */
|
|
/* Unusual behavior: C flag is inverted */
|
|
#undef OP_SBC
|
|
#if FLAG_SET_M
|
|
#define OP_SBC(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
SRC = OPER_8_##MODE(); \
|
|
FLAG_C = ~FLAG_C; \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_A - SRC - CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_SUB_8(SRC, REG_A, FLAG_C); \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C = ~FLAG_C; \
|
|
BREAKOUT; \
|
|
} \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = REG_A - SRC - DST; \
|
|
FLAG_V = VFLAG_SUB_8(SRC, REG_A, FLAG_C); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_N = FLAG_Z = REG_A = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C = ~FLAG_C
|
|
#else
|
|
#define OP_SBC(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
SRC = OPER_16_##MODE(); \
|
|
FLAG_C = ~FLAG_C; \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_A - SRC - CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_SUB_16(SRC, REG_A, FLAG_C); \
|
|
FLAG_Z = REG_A = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(REG_A); \
|
|
FLAG_C = ~CFLAG_16(FLAG_C); \
|
|
BREAKOUT; \
|
|
} \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = MAKE_UINT_8(REG_A) - MAKE_UINT_8(SRC) - DST; \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = MAKE_UINT_8(REG_A>>8) - MAKE_UINT_8(SRC>>8) - DST; \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_Z |= MAKE_UINT_8(FLAG_C) << 8; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
FLAG_V = VFLAG_SUB_16(SRC, REG_A, FLAG_Z); \
|
|
REG_A = FLAG_Z; \
|
|
FLAG_C = ~FLAG_C
|
|
#endif
|
|
|
|
/* M37710 Subtract with Carry - B accumulator */
|
|
/* Unusual behavior: C flag is inverted */
|
|
#undef OP_SBCB
|
|
#if FLAG_SET_M
|
|
#define OP_SBCB(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
SRC = OPER_8_##MODE(); \
|
|
FLAG_C = ~FLAG_C; \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_BA - SRC - CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_SUB_8(SRC, REG_BA, FLAG_C); \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C = ~FLAG_C; \
|
|
BREAKOUT; \
|
|
} \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = REG_BA - SRC - DST; \
|
|
FLAG_V = VFLAG_SUB_8(SRC, REG_BA, FLAG_C); \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_N = FLAG_Z = REG_BA = MAKE_UINT_8(FLAG_C); \
|
|
FLAG_C = ~FLAG_C
|
|
#else
|
|
#define OP_SBCB(MODE) \
|
|
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
|
|
SRC = OPER_16_##MODE(); \
|
|
FLAG_C = ~FLAG_C; \
|
|
if(!FLAG_D) \
|
|
{ \
|
|
FLAG_C = REG_BA - SRC - CFLAG_AS_1(); \
|
|
FLAG_V = VFLAG_SUB_16(SRC, REG_BA, FLAG_C); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_16(FLAG_C); \
|
|
FLAG_N = NFLAG_16(REG_BA); \
|
|
FLAG_C = ~CFLAG_16(FLAG_C); \
|
|
BREAKOUT; \
|
|
} \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = MAKE_UINT_8(REG_BA) - MAKE_UINT_8(SRC) - DST; \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_Z = MAKE_UINT_8(FLAG_C); \
|
|
DST = CFLAG_AS_1(); \
|
|
FLAG_C = MAKE_UINT_8(REG_A>>8) - MAKE_UINT_8(SRC>>8) - DST; \
|
|
if((FLAG_C & 0xf) > 9) \
|
|
FLAG_C-=6; \
|
|
if((FLAG_C & 0xf0) > 0x90) \
|
|
FLAG_C-=0x60; \
|
|
FLAG_Z |= MAKE_UINT_8(FLAG_C) << 8; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
FLAG_V = VFLAG_SUB_16(SRC, REG_BA, FLAG_Z); \
|
|
REG_BA = FLAG_Z; \
|
|
FLAG_C = ~FLAG_C
|
|
#endif
|
|
|
|
/* M37710 Set Carry flag */
|
|
#undef OP_SEC
|
|
#define OP_SEC() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_C = CFLAG_SET
|
|
|
|
/* M37710 Set Interrupt Mask flag */
|
|
#undef OP_SEI
|
|
#define OP_SEI() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_I = IFLAG_SET
|
|
|
|
/* M37710 Set Program status word */
|
|
#undef OP_SEP
|
|
#define OP_SEP() \
|
|
CLK(CLK_OP + CLK_R8 + 1); \
|
|
m37710i_set_reg_p(m37710i_get_reg_p() | OPER_8_IMM())
|
|
|
|
/* M37710 Set "M" status bit */
|
|
#undef OP_SEM
|
|
#define OP_SEM() \
|
|
CLK(CLK_OP + CLK_R8 + 1); \
|
|
m37710i_set_reg_p(m37710i_get_reg_p() | FLAGPOS_M)
|
|
|
|
/* M37710 Store accumulator to memory */
|
|
#undef OP_STA
|
|
#if FLAG_SET_M
|
|
#define OP_STA(MODE) \
|
|
CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \
|
|
write_8_##MODE(EA_##MODE(), REG_A)
|
|
#else
|
|
#define OP_STA(MODE) \
|
|
CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \
|
|
write_16_##MODE(EA_##MODE(), REG_A)
|
|
#endif
|
|
|
|
/* M37710 Store B accumulator to memory */
|
|
#undef OP_STB
|
|
#if FLAG_SET_M
|
|
#define OP_STB(MODE) \
|
|
CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \
|
|
write_8_##MODE(EA_##MODE(), REG_BA)
|
|
#else
|
|
#define OP_STB(MODE) \
|
|
CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \
|
|
write_16_##MODE(EA_##MODE(), REG_BA)
|
|
#endif
|
|
|
|
/* M37710 Store index register to memory */
|
|
#undef OP_STX
|
|
#if FLAG_SET_X
|
|
#define OP_STX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \
|
|
write_8_##MODE(EA_##MODE(), REG)
|
|
#else
|
|
#define OP_STX(REG, MODE) \
|
|
CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \
|
|
write_16_##MODE(EA_##MODE(), REG)
|
|
#endif
|
|
|
|
/* M37710 Stop the clock */
|
|
#undef OP_STP
|
|
#define OP_STP() \
|
|
USE_ALL_CLKS(); \
|
|
CPU_STOPPED |= STOP_LEVEL_STOP
|
|
|
|
/* M37710 Transfer accumulator to index */
|
|
#undef OP_TAX
|
|
#if FLAG_SET_M
|
|
#if FLAG_SET_X
|
|
#define OP_TAX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_A; \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else /* FLAG_SET_X */
|
|
#define OP_TAX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_B | REG_A; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif /* FLAG_SET_X */
|
|
#else /* FLAG_SET_M */
|
|
#if FLAG_SET_X
|
|
#define OP_TAX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = MAKE_UINT_8(REG_A); \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else /* FLAG_SET_X */
|
|
#define OP_TAX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_A; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif /* FLAG_SET_X */
|
|
#endif /* FLAG_SET_M */
|
|
|
|
|
|
/* M37710 Transfer accumulator B to index */
|
|
#undef OP_TBX
|
|
#if FLAG_SET_M
|
|
#if FLAG_SET_X
|
|
#define OP_TBX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_BA; \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else /* FLAG_SET_X */
|
|
#define OP_TBX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_BB | REG_BA; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif /* FLAG_SET_X */
|
|
#else /* FLAG_SET_M */
|
|
#if FLAG_SET_X
|
|
#define OP_TBX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = MAKE_UINT_8(REG_BA); \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else /* FLAG_SET_X */
|
|
#define OP_TBX(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG = REG_BA; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif /* FLAG_SET_X */
|
|
#endif /* FLAG_SET_M */
|
|
|
|
/* M37710 Transfer index to accumulator */
|
|
#undef OP_TXA
|
|
#if FLAG_SET_M
|
|
#define OP_TXA(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = MAKE_UINT_8(REG); \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else
|
|
#define OP_TXA(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = REG; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer index to accumulator B */
|
|
#undef OP_TXB
|
|
#if FLAG_SET_M
|
|
#define OP_TXB(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = MAKE_UINT_8(REG); \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else
|
|
#define OP_TXB(REG) \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = REG; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer accumulator to direct register */
|
|
#undef OP_TAD
|
|
#if FLAG_SET_M
|
|
#define OP_TAD() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_D = REG_A | REG_B
|
|
#else
|
|
#define OP_TAD() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_D = REG_A
|
|
#endif
|
|
|
|
/* M37710 Transfer accumulator B to direct register */
|
|
#undef OP_TBD
|
|
#if FLAG_SET_M
|
|
#define OP_TBD() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_D = REG_BA | REG_BB
|
|
#else
|
|
#define OP_TBD() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_D = REG_BA
|
|
#endif
|
|
|
|
/* M37710 Transfer direct register to accumulator */
|
|
#undef OP_TDA
|
|
#if FLAG_SET_M
|
|
#define OP_TDA() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_D; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
REG_A = MAKE_UINT_8(REG_D); \
|
|
REG_B = REG_D & 0xff00
|
|
#else
|
|
#define OP_TDA() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = REG_D; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer direct register to accumulator B */
|
|
#undef OP_TDB
|
|
#if FLAG_SET_M
|
|
#define OP_TDB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_D; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
REG_BA = MAKE_UINT_8(REG_D); \
|
|
REG_BB = REG_D & 0xff00
|
|
#else
|
|
#define OP_TDB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = REG_D; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer accumulator to stack pointer */
|
|
#undef OP_TAS
|
|
#if FLAG_SET_M
|
|
#define OP_TAS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = REG_A | REG_B
|
|
#else
|
|
#define OP_TAS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = REG_A
|
|
#endif
|
|
|
|
/* M37710 Transfer accumulator B to stack pointer */
|
|
#undef OP_TBS
|
|
#if FLAG_SET_M
|
|
#define OP_TBS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = REG_BA | REG_BB
|
|
#else
|
|
#define OP_TBS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = REG_BA
|
|
#endif
|
|
|
|
/* M37710 Transfer stack pointer to accumulator */
|
|
#undef OP_TSA
|
|
#if FLAG_SET_M
|
|
#define OP_TSA() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_S; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
REG_A = MAKE_UINT_8(REG_S); \
|
|
REG_B = REG_S & 0xff00
|
|
#else
|
|
#define OP_TSA() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_A = REG_S; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer stack pointer to accumulator B */
|
|
#undef OP_TSB
|
|
#if FLAG_SET_M
|
|
#define OP_TSB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_S; \
|
|
FLAG_N = NFLAG_16(FLAG_Z); \
|
|
REG_BA = MAKE_UINT_8(REG_S); \
|
|
REG_BB = REG_S & 0xff00
|
|
#else
|
|
#define OP_TSB() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_BA = REG_S; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer stack pointer to X */
|
|
#undef OP_TSX
|
|
#if FLAG_SET_X
|
|
#define OP_TSX() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_X = MAKE_UINT_8(REG_S); \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else
|
|
#define OP_TSX() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_X = REG_S; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer X to stack pointer */
|
|
#undef OP_TXS
|
|
#if FLAG_SET_X
|
|
#define OP_TXS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = MAKE_UINT_8(REG_X)
|
|
#else
|
|
#define OP_TXS() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
REG_S = REG_X
|
|
#endif
|
|
|
|
/* M37710 Transfer X to Y */
|
|
#undef OP_TXY
|
|
#if FLAG_SET_X
|
|
#define OP_TXY() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_Y = REG_X; \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else
|
|
#define OP_TXY() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_Y = REG_X; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 Transfer Y to X */
|
|
#undef OP_TYX
|
|
#if FLAG_SET_X
|
|
#define OP_TYX() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_X = REG_Y; \
|
|
FLAG_N = NFLAG_8(FLAG_Z)
|
|
#else
|
|
#define OP_TYX() \
|
|
CLK(CLK_OP + CLK_IMPLIED); \
|
|
FLAG_Z = REG_X = REG_Y; \
|
|
FLAG_N = NFLAG_16(FLAG_Z)
|
|
#endif
|
|
|
|
/* M37710 clear bit */
|
|
#undef OP_CLB
|
|
#if FLAG_SET_M
|
|
#define OP_CLB(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
REG_IM = read_8_##MODE(DST); \
|
|
REG_IM2 = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
write_8_##MODE(DST, REG_IM & ~REG_IM2);
|
|
#else
|
|
#define OP_CLB(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
REG_IM = read_16_##MODE(DST); \
|
|
REG_IM2 = read_16_IMM(REG_PB | REG_PC); \
|
|
REG_PC+=2; \
|
|
write_16_##MODE(DST, REG_IM & ~REG_IM2);
|
|
#endif
|
|
|
|
/* M37710 set bit */
|
|
#undef OP_SEB
|
|
#if FLAG_SET_M
|
|
#define OP_SEB(MODE) \
|
|
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
REG_IM = read_8_##MODE(DST); \
|
|
REG_IM2 = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
write_8_##MODE(DST, REG_IM | REG_IM2);
|
|
#else
|
|
#define OP_SEB(MODE) \
|
|
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
|
|
DST = EA_##MODE(); \
|
|
REG_IM = read_16_##MODE(DST); \
|
|
REG_IM2 = read_16_IMM(REG_PB | REG_PC); \
|
|
REG_PC+=2; \
|
|
write_16_##MODE(DST, REG_IM | REG_IM2);
|
|
#endif
|
|
|
|
/* M37710 Wait for interrupt */
|
|
#undef OP_WAI
|
|
#define OP_WAI() \
|
|
USE_ALL_CLKS(); \
|
|
CPU_STOPPED |= STOP_LEVEL_WAI
|
|
|
|
/* M37710 load data bank register */
|
|
#undef OP_LDT
|
|
#define OP_LDT(MODE) \
|
|
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
|
|
REG_DB = OPER_8_##MODE()<<16;
|
|
|
|
|
|
/* M37710 prefix for B accumulator (0x42) */
|
|
/* There is a 2 cycle penalty for all instructions using this prefix */
|
|
#undef OP_PFB
|
|
#define OP_PFB() \
|
|
CLK(2); \
|
|
REG_IR = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
(this->*m_opcodes42[REG_IR])();
|
|
|
|
|
|
/* M37710 prefix for multiply / divide instructions (0x89) */
|
|
#undef OP_PFXM
|
|
#define OP_PFXM() \
|
|
REG_IR = read_8_IMM(REG_PB | REG_PC); \
|
|
REG_PC++; \
|
|
(this->*m_opcodes89[REG_IR])();
|
|
|
|
|
|
/* M37710 unimplemented opcode */
|
|
#undef OP_UNIMP
|
|
#define OP_UNIMP() \
|
|
logerror("error M37710: UNIMPLEMENTED OPCODE! K=%x PC=%x\n", REG_PB, REG_PPC);
|
|
|
|
/* ======================================================================== */
|
|
/* ======================== OPCODE & FUNCTION TABLES ====================== */
|
|
/* ======================================================================== */
|
|
|
|
#undef OP
|
|
#undef O
|
|
#undef TABLE_OPCODES
|
|
#undef TABLE_FUNCTION
|
|
|
|
#if !FLAG_SET_M && !FLAG_SET_X
|
|
#define OP(CODE, OPERATION) void m37710_cpu_device::m37710i_ ## CODE ## _M0X0() {OPERATION;}
|
|
#define O(CODE) &m37710_cpu_device::m37710i_ ## CODE ## _M0X0
|
|
#define TABLE_OPCODES const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes_M0X0[256]
|
|
#define TABLE_OPCODES2 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes42_M0X0[256]
|
|
#define TABLE_OPCODES3 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes89_M0X0[256]
|
|
#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE m37710_cpu_device::m37710i_ ## NAME ## _M0X0 ARGS
|
|
|
|
#elif !FLAG_SET_M && FLAG_SET_X
|
|
|
|
#define OP(CODE, OPERATION) void m37710_cpu_device::m37710i_ ## CODE ## _M0X1() {OPERATION;}
|
|
#define O(CODE) &m37710_cpu_device::m37710i_ ## CODE ## _M0X1
|
|
#define TABLE_OPCODES const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes_M0X1[256]
|
|
#define TABLE_OPCODES2 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes42_M0X1[256]
|
|
#define TABLE_OPCODES3 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes89_M0X1[256]
|
|
#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE m37710_cpu_device::m37710i_ ## NAME ## _M0X1 ARGS
|
|
|
|
#elif FLAG_SET_M && !FLAG_SET_X
|
|
|
|
#define OP(CODE, OPERATION) void m37710_cpu_device::m37710i_ ## CODE ## _M1X0() {OPERATION;}
|
|
#define O(CODE) &m37710_cpu_device::m37710i_ ## CODE ## _M1X0
|
|
#define TABLE_OPCODES const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes_M1X0[256]
|
|
#define TABLE_OPCODES2 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes42_M1X0[256]
|
|
#define TABLE_OPCODES3 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes89_M1X0[256]
|
|
#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE m37710_cpu_device::m37710i_ ## NAME ## _M1X0 ARGS
|
|
|
|
#elif FLAG_SET_M && FLAG_SET_X
|
|
|
|
#define OP(CODE, OPERATION) void m37710_cpu_device::m37710i_ ## CODE ## _M1X1() {OPERATION;}
|
|
#define O(CODE) &m37710_cpu_device::m37710i_ ## CODE ## _M1X1
|
|
#define TABLE_OPCODES const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes_M1X1[256]
|
|
#define TABLE_OPCODES2 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes42_M1X1[256]
|
|
#define TABLE_OPCODES3 const m37710_cpu_device::opcode_func m37710_cpu_device::m37710i_opcodes89_M1X1[256]
|
|
#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE m37710_cpu_device::m37710i_ ## NAME ## _M1X1 ARGS
|
|
|
|
#endif
|
|
|
|
#define BREAKOUT return
|
|
|
|
/* OP FUNCTION Comment */
|
|
OP(00, OP_BRK ( ) ) /* BRK */
|
|
OP(01, OP_ORA ( DXI ) ) /* ORA dxi */
|
|
OP(02, OP_NOP ( ) ) /* unused */
|
|
OP(03, OP_ORA ( S ) ) /* ORA s (G) */
|
|
OP(04, OP_SEB ( D ) ) /* SEB d (C) */
|
|
OP(05, OP_ORA ( D ) ) /* ORA d */
|
|
OP(06, OP_ASLM ( D ) ) /* ASL d */
|
|
OP(07, OP_ORA ( DLI ) ) /* ORA dli (G) */
|
|
OP(08, OP_PHP ( ) ) /* PHP */
|
|
OP(09, OP_ORA ( IMM ) ) /* ORA imm */
|
|
OP(0a, OP_ASL ( ) ) /* ASL acc */
|
|
OP(0b, OP_PHD ( ) ) /* PHD (G) */
|
|
OP(0c, OP_SEB ( A ) ) /* SEB a (C) */
|
|
OP(0d, OP_ORA ( A ) ) /* ORA a */
|
|
OP(0e, OP_ASLM ( A ) ) /* ASL a */
|
|
OP(0f, OP_ORA ( AL ) ) /* ORA al (G) */
|
|
OP(10, OP_BCC ( COND_PL() ) ) /* BPL */
|
|
OP(11, OP_ORA ( DIY ) ) /* ORA diy */
|
|
OP(12, OP_ORA ( DI ) ) /* ORA di (C) */
|
|
OP(13, OP_ORA ( SIY ) ) /* ORA siy (G) */
|
|
OP(14, OP_CLB ( D ) ) /* CLB d (C) */
|
|
OP(15, OP_ORA ( DX ) ) /* ORA dx */
|
|
OP(16, OP_ASLM ( DX ) ) /* ASL dx */
|
|
OP(17, OP_ORA ( DLIY ) ) /* ORA dliy(C) */
|
|
OP(18, OP_CLC ( ) ) /* CLC */
|
|
OP(19, OP_ORA ( AY ) ) /* ORA ay */
|
|
OP(1a, OP_DEC ( ) ) /* DEA (C) */
|
|
OP(1b, OP_TAS ( ) ) /* TAS (G) */
|
|
OP(1c, OP_CLB ( A ) ) /* CLB a (C) */
|
|
OP(1d, OP_ORA ( AX ) ) /* ORA ax */
|
|
OP(1e, OP_ASLM ( AX ) ) /* ASL ax */
|
|
OP(1f, OP_ORA ( ALX ) ) /* ORA alx (G) */
|
|
OP(20, OP_JSR ( A ) ) /* JSR a */
|
|
OP(21, OP_AND ( DXI ) ) /* AND dxi */
|
|
OP(22, OP_JSL ( AL ) ) /* JSL al (G) */
|
|
OP(23, OP_AND ( S ) ) /* AND s (G) */
|
|
OP(24, OP_BBS ( D ) ) /* BBS d */
|
|
OP(25, OP_AND ( D ) ) /* AND d */
|
|
OP(26, OP_ROLM ( D ) ) /* ROL d */
|
|
OP(27, OP_AND ( DLI ) ) /* AND dli (G) */
|
|
OP(28, OP_PLP ( ) ) /* PLP */
|
|
OP(29, OP_AND ( IMM ) ) /* AND imm */
|
|
OP(2a, OP_ROL ( ) ) /* ROL acc */
|
|
OP(2b, OP_PLD ( ) ) /* PLD (G) */
|
|
OP(2c, OP_BBS ( A ) ) /* BBS a */
|
|
OP(2d, OP_AND ( A ) ) /* AND a */
|
|
OP(2e, OP_ROLM ( A ) ) /* ROL a */
|
|
OP(2f, OP_AND ( AL ) ) /* AND al (G) */
|
|
OP(30, OP_BCC ( COND_MI() ) ) /* BMI */
|
|
OP(31, OP_AND ( DIY ) ) /* AND diy */
|
|
OP(32, OP_AND ( DI ) ) /* AND di (C) */
|
|
OP(33, OP_AND ( SIY ) ) /* AND siy */
|
|
OP(34, OP_BBC ( D ) ) /* BBC d */
|
|
OP(35, OP_AND ( DX ) ) /* AND dx */
|
|
OP(36, OP_ROLM ( DX ) ) /* ROL dx */
|
|
OP(37, OP_AND ( DLIY ) ) /* AND dliy(G) */
|
|
OP(38, OP_SEC ( ) ) /* SEC */
|
|
OP(39, OP_AND ( AY ) ) /* AND ay */
|
|
OP(3a, OP_INC ( ) ) /* INA (C) */
|
|
OP(3b, OP_TSA ( ) ) /* TSA (G) */
|
|
OP(3c, OP_BBC ( A ) ) /* BBC a */
|
|
OP(3d, OP_AND ( AX ) ) /* AND ax */
|
|
OP(3e, OP_ROLM ( AX ) ) /* ROL ax */
|
|
OP(3f, OP_AND ( ALX ) ) /* AND alx (G) */
|
|
OP(40, OP_RTI ( ) ) /* RTI */
|
|
OP(41, OP_EOR ( DXI ) ) /* EOR dxi */
|
|
OP(42, OP_PFB ( ) ) /* prefix for "B" accumulator */
|
|
OP(43, OP_EOR ( S ) ) /* EOR s (G) */
|
|
OP(44, OP_MVP ( ) ) /* MVP (G) */
|
|
OP(45, OP_EOR ( D ) ) /* EOR d */
|
|
OP(46, OP_LSRM ( D ) ) /* LSR d */
|
|
OP(47, OP_EOR ( DLI ) ) /* EOR dli (G) */
|
|
OP(48, OP_PHA ( ) ) /* PHA */
|
|
OP(49, OP_EOR ( IMM ) ) /* EOR imm */
|
|
OP(4a, OP_LSR ( ) ) /* LSR acc */
|
|
OP(4b, OP_PHK ( ) ) /* PHK (G) */
|
|
OP(4c, OP_JMP ( A ) ) /* JMP a */
|
|
OP(4d, OP_EOR ( A ) ) /* EOR a */
|
|
OP(4e, OP_LSRM ( A ) ) /* LSR a */
|
|
OP(4f, OP_EOR ( AL ) ) /* EOR al (G) */
|
|
OP(50, OP_BCC ( COND_VC() ) ) /* BVC */
|
|
OP(51, OP_EOR ( DIY ) ) /* EOR diy */
|
|
OP(52, OP_EOR ( DI ) ) /* EOR di (C) */
|
|
OP(53, OP_EOR ( SIY ) ) /* EOR siy (G) */
|
|
OP(54, OP_MVN ( ) ) /* MVN (G) */
|
|
OP(55, OP_EOR ( DX ) ) /* EOR dx */
|
|
OP(56, OP_LSRM ( DX ) ) /* LSR dx */
|
|
OP(57, OP_EOR ( DLIY ) ) /* EOR dliy(G) */
|
|
OP(58, OP_CLI ( ) ) /* CLI */
|
|
OP(59, OP_EOR ( AY ) ) /* EOR ay */
|
|
OP(5a, OP_PHX ( REG_Y ) ) /* PHY (C) */
|
|
OP(5b, OP_TAD ( ) ) /* TAD (G) */
|
|
OP(5c, OP_JMPAL( ) ) /* JMP al (G) */
|
|
OP(5d, OP_EOR ( AX ) ) /* EOR ax */
|
|
OP(5e, OP_LSRM ( AX ) ) /* LSR ax */
|
|
OP(5f, OP_EOR ( ALX ) ) /* EOR alx (G) */
|
|
OP(60, OP_RTS ( ) ) /* RTS */
|
|
OP(61, OP_ADC ( DXI ) ) /* ADC dxi */
|
|
OP(62, OP_PER ( ) ) /* PER (G) */
|
|
OP(63, OP_ADC ( S ) ) /* ADC s (G) */
|
|
OP(64, OP_LDM ( D ) ) /* LDM d (C) */
|
|
OP(65, OP_ADC ( D ) ) /* ADC d */
|
|
OP(66, OP_RORM ( D ) ) /* ROR d */
|
|
OP(67, OP_ADC ( DLI ) ) /* ADC dli (G) */
|
|
OP(68, OP_PLA ( ) ) /* PLA */
|
|
OP(69, OP_ADC ( IMM ) ) /* ADC imm */
|
|
OP(6a, OP_ROR ( ) ) /* ROR acc */
|
|
OP(6b, OP_RTL ( ) ) /* RTL (G) */
|
|
OP(6c, OP_JMP ( AI ) ) /* JMP ai */
|
|
OP(6d, OP_ADC ( A ) ) /* ADC a */
|
|
OP(6e, OP_RORM ( A ) ) /* ROR a */
|
|
OP(6f, OP_ADC ( AL ) ) /* ADC al (G) */
|
|
OP(70, OP_BCC ( COND_VS() ) ) /* BVS */
|
|
OP(71, OP_ADC ( DIY ) ) /* ADC diy */
|
|
OP(72, OP_ADC ( DI ) ) /* ADC di (G) */
|
|
OP(73, OP_ADC ( SIY ) ) /* ADC siy (G) */
|
|
OP(74, OP_LDM ( DX ) ) /* LDM dx (C) */
|
|
OP(75, OP_ADC ( DX ) ) /* ADC dx */
|
|
OP(76, OP_RORM ( DX ) ) /* ROR dx */
|
|
OP(77, OP_ADC ( DLIY ) ) /* ADC dliy(G) */
|
|
OP(78, OP_SEI ( ) ) /* SEI */
|
|
OP(79, OP_ADC ( AY ) ) /* ADC ay */
|
|
OP(7a, OP_PLX ( REG_Y ) ) /* PLY (C) */
|
|
OP(7b, OP_TDA ( ) ) /* TDA (G) */
|
|
OP(7c, OP_JMPAXI( ) ) /* JMP axi (C) */
|
|
OP(7d, OP_ADC ( AX ) ) /* ADC ax */
|
|
OP(7e, OP_RORM ( AX ) ) /* ROR ax */
|
|
OP(7f, OP_ADC ( ALX ) ) /* ADC alx (G) */
|
|
OP(80, OP_BRA ( ) ) /* BRA (C) */
|
|
OP(81, OP_STA ( DXI ) ) /* STA dxi */
|
|
OP(82, OP_BRL ( ) ) /* BRL (G) */
|
|
OP(83, OP_STA ( S ) ) /* STA s (G) */
|
|
OP(84, OP_STX ( REG_Y, D ) ) /* STY d */
|
|
OP(85, OP_STA ( D ) ) /* STA d */
|
|
OP(86, OP_STX ( REG_X, D ) ) /* STX d */
|
|
OP(87, OP_STA ( DLI ) ) /* STA dli (G) */
|
|
OP(88, OP_DECX ( REG_Y ) ) /* DEY */
|
|
OP(89, OP_PFXM ( ) ) /* prefix for mul/div insns */
|
|
OP(8a, OP_TXA ( REG_X ) ) /* TXA */
|
|
OP(8b, OP_PHT ( ) ) /* PHT (G) */
|
|
OP(8c, OP_STX ( REG_Y, A ) ) /* STY a */
|
|
OP(8d, OP_STA ( A ) ) /* STA a */
|
|
OP(8e, OP_STX ( REG_X, A ) ) /* STX a */
|
|
OP(8f, OP_STA ( AL ) ) /* STA al (G) */
|
|
OP(90, OP_BCC ( COND_CC() ) ) /* BCC */
|
|
OP(91, OP_STA ( DIY ) ) /* STA diy */
|
|
OP(92, OP_STA ( DI ) ) /* STA di (C) */
|
|
OP(93, OP_STA ( SIY ) ) /* STA siy (G) */
|
|
OP(94, OP_STX ( REG_Y, DX ) ) /* STY dx */
|
|
OP(95, OP_STA ( DX ) ) /* STA dx */
|
|
OP(96, OP_STX ( REG_X, DY ) ) /* STX dy */
|
|
OP(97, OP_STA ( DLIY ) ) /* STA dliy(G) */
|
|
OP(98, OP_TXA ( REG_Y ) ) /* TYA */
|
|
OP(99, OP_STA ( AY ) ) /* STA ay */
|
|
OP(9a, OP_TXS ( ) ) /* TXS */
|
|
OP(9b, OP_TXY ( ) ) /* TXY (G) */
|
|
OP(9c, OP_LDM ( A ) ) /* LDM a (C) */
|
|
OP(9d, OP_STA ( AX ) ) /* STA ax */
|
|
OP(9e, OP_LDM ( AX ) ) /* LDM ax (C) */
|
|
OP(9f, OP_STA ( ALX ) ) /* STA alx (G) */
|
|
OP(a0, OP_LDX ( REG_Y, IMM ) ) /* LDY imm */
|
|
OP(a1, OP_LDA ( DXI ) ) /* LDA dxi */
|
|
OP(a2, OP_LDX ( REG_X, IMM ) ) /* LDX imm */
|
|
OP(a3, OP_LDA ( S ) ) /* LDA s (G) */
|
|
OP(a4, OP_LDX ( REG_Y, D ) ) /* LDY d */
|
|
OP(a5, OP_LDA ( D ) ) /* LDA d */
|
|
OP(a6, OP_LDX ( REG_X, D ) ) /* LDX d */
|
|
OP(a7, OP_LDA ( DLI ) ) /* LDA dli (G) */
|
|
OP(a8, OP_TAX ( REG_Y ) ) /* TAY */
|
|
OP(a9, OP_LDA ( IMM ) ) /* LDA imm */
|
|
OP(aa, OP_TAX ( REG_X ) ) /* TAX */
|
|
OP(ab, OP_PLT ( ) ) /* PLT (G) */
|
|
OP(ac, OP_LDX ( REG_Y, A ) ) /* LDY a */
|
|
OP(ad, OP_LDA ( A ) ) /* LDA a */
|
|
OP(ae, OP_LDX ( REG_X, A ) ) /* LDX a */
|
|
OP(af, OP_LDA ( AL ) ) /* LDA al (G) */
|
|
OP(b0, OP_BCC ( COND_CS() ) ) /* BCS */
|
|
OP(b1, OP_LDA ( DIY ) ) /* LDA diy */
|
|
OP(b2, OP_LDA ( DI ) ) /* LDA di (C) */
|
|
OP(b3, OP_LDA ( SIY ) ) /* LDA siy (G) */
|
|
OP(b4, OP_LDX ( REG_Y, DX ) ) /* LDY dx */
|
|
OP(b5, OP_LDA ( DX ) ) /* LDA dx */
|
|
OP(b6, OP_LDX ( REG_X, DY ) ) /* LDX dy */
|
|
OP(b7, OP_LDA ( DLIY ) ) /* LDA dliy(G) */
|
|
OP(b8, OP_CLV ( ) ) /* CLV */
|
|
OP(b9, OP_LDA ( AY ) ) /* LDA ay */
|
|
OP(ba, OP_TSX ( ) ) /* TSX */
|
|
OP(bb, OP_TYX ( ) ) /* TYX (G) */
|
|
OP(bc, OP_LDX ( REG_Y, AX ) ) /* LDY ax */
|
|
OP(bd, OP_LDA ( AX ) ) /* LDA ax */
|
|
OP(be, OP_LDX ( REG_X, AY ) ) /* LDX ay */
|
|
OP(bf, OP_LDA ( ALX ) ) /* LDA alx (G) */
|
|
OP(c0, OP_CMPX ( REG_Y, IMM ) ) /* CPY imm */
|
|
OP(c1, OP_CMP ( DXI ) ) /* CMP dxi */
|
|
OP(c2, OP_REP ( ) ) /* REP (G) */
|
|
OP(c3, OP_CMP ( S ) ) /* CMP s (G) */
|
|
OP(c4, OP_CMPX ( REG_Y, D ) ) /* CPY d */
|
|
OP(c5, OP_CMP ( D ) ) /* CMP d */
|
|
OP(c6, OP_DECM ( D ) ) /* DEC d */
|
|
OP(c7, OP_CMP ( DLI ) ) /* CMP dli (G) */
|
|
OP(c8, OP_INCX ( REG_Y ) ) /* INY */
|
|
OP(c9, OP_CMP ( IMM ) ) /* CMP imm */
|
|
OP(ca, OP_DECX ( REG_X ) ) /* DEX */
|
|
OP(cb, OP_WAI ( ) ) /* WAI (G) */
|
|
OP(cc, OP_CMPX ( REG_Y, A ) ) /* CPY a */
|
|
OP(cd, OP_CMP ( A ) ) /* CMP a */
|
|
OP(ce, OP_DECM ( A ) ) /* DEC a */
|
|
OP(cf, OP_CMP ( AL ) ) /* CMP al (G) */
|
|
OP(d0, OP_BCC ( COND_NE() ) ) /* BNE */
|
|
OP(d1, OP_CMP ( DIY ) ) /* CMP diy */
|
|
OP(d2, OP_CMP ( DI ) ) /* CMP di (C) */
|
|
OP(d3, OP_CMP ( SIY ) ) /* CMP siy (G) */
|
|
OP(d4, OP_PEI ( ) ) /* PEI (G) */
|
|
OP(d5, OP_CMP ( DX ) ) /* CMP dx */
|
|
OP(d6, OP_DECM ( DX ) ) /* DEC dx */
|
|
OP(d7, OP_CMP ( DLIY ) ) /* CMP dliy(G) */
|
|
OP(d8, OP_CLM ( ) ) /* CLM */
|
|
OP(d9, OP_CMP ( AY ) ) /* CMP ay */
|
|
OP(da, OP_PHX ( REG_X ) ) /* PHX (C) */
|
|
OP(db, OP_STP ( ) ) /* STP (G) */
|
|
OP(dc, OP_JMLAI( ) ) /* JML ai (G) */
|
|
OP(dd, OP_CMP ( AX ) ) /* CMP ax */
|
|
OP(de, OP_DECM ( AX ) ) /* DEC ax */
|
|
OP(df, OP_CMP ( ALX ) ) /* CMP alx (G) */
|
|
OP(e0, OP_CMPX ( REG_X, IMM ) ) /* CPX imm */
|
|
OP(e1, OP_SBC ( DXI ) ) /* SBC dxi */
|
|
OP(e2, OP_SEP ( ) ) /* SEP imm (G) */
|
|
OP(e3, OP_SBC ( S ) ) /* SBC s (G) */
|
|
OP(e4, OP_CMPX ( REG_X, D ) ) /* CPX d */
|
|
OP(e5, OP_SBC ( D ) ) /* SBC d */
|
|
OP(e6, OP_INCM ( D ) ) /* INC d */
|
|
OP(e7, OP_SBC ( DLI ) ) /* SBC dli (G) */
|
|
OP(e8, OP_INCX ( REG_X ) ) /* INX */
|
|
OP(e9, OP_SBC ( IMM ) ) /* SBC imm */
|
|
OP(ea, OP_NOP ( ) ) /* NOP */
|
|
OP(eb, OP_PSH ( IMM ) ) /* PSH imm */
|
|
OP(ec, OP_CMPX ( REG_X, A ) ) /* CPX a */
|
|
OP(ed, OP_SBC ( A ) ) /* SBC a */
|
|
OP(ee, OP_INCM ( A ) ) /* INC a */
|
|
OP(ef, OP_SBC ( AL ) ) /* SBC al (G) */
|
|
OP(f0, OP_BCC ( COND_EQ() ) ) /* BEQ */
|
|
OP(f1, OP_SBC ( DIY ) ) /* SBC diy */
|
|
OP(f2, OP_SBC ( DI ) ) /* SBC di (C) */
|
|
OP(f3, OP_SBC ( SIY ) ) /* SBC siy (G) */
|
|
OP(f4, OP_PEA ( ) ) /* PEA (G) */
|
|
OP(f5, OP_SBC ( DX ) ) /* SBC dx */
|
|
OP(f6, OP_INCM ( DX ) ) /* INC dx */
|
|
OP(f7, OP_SBC ( DLIY ) ) /* SBC dliy(G) */
|
|
OP(f8, OP_SEM ( ) ) /* SEM */
|
|
OP(f9, OP_SBC ( AY ) ) /* SBC ay */
|
|
OP(fa, OP_PLX ( REG_X ) ) /* PLX (C) */
|
|
OP(fb, OP_PUL ( IMM ) ) /* PUL imm */
|
|
OP(fc, OP_JSRAXI( ) ) /* JSR axi (G) */
|
|
OP(fd, OP_SBC ( AX ) ) /* SBC ax */
|
|
OP(fe, OP_INCM ( AX ) ) /* INC ax */
|
|
OP(ff, OP_SBC ( ALX ) ) /* SBC alx (G) */
|
|
|
|
/* B accumulator */
|
|
OP(101,OP_ORB ( DXI ) ) /* ORB dxi */
|
|
OP(103,OP_ORB ( S ) ) /* ORB s */
|
|
OP(105,OP_ORB ( D ) ) /* ORB d */
|
|
OP(107,OP_ORB ( DLI ) ) /* ORB dli */
|
|
OP(109,OP_ORB ( IMM ) ) /* ORB imm */
|
|
OP(10a,OP_BSL ( ) ) /* BSL acc */
|
|
OP(10d,OP_ORB ( A ) ) /* ORB a */
|
|
OP(10f,OP_ORB ( AL ) ) /* ORB al */
|
|
OP(111,OP_ORB ( DIY ) ) /* ORB diy */
|
|
OP(112,OP_ORB ( DI ) ) /* ORB di */
|
|
OP(113,OP_ORB ( SIY ) ) /* ORB siy */
|
|
OP(115,OP_ORB ( DX ) ) /* ORB dx */
|
|
OP(117,OP_ORB ( DLIY ) ) /* ORB dliy */
|
|
OP(119,OP_ORB ( AY ) ) /* ORB ay */
|
|
OP(11a,OP_DECB ( ) ) /* DEB */
|
|
OP(11b,OP_TBS ( ) ) /* TBS */
|
|
OP(11d,OP_ORB ( AX ) ) /* ORB ax */
|
|
OP(11f,OP_ORB ( ALX ) ) /* ORB alx */
|
|
OP(121,OP_ANDB ( DXI ) ) /* ANDB dxi */
|
|
OP(123,OP_ANDB ( S ) ) /* ANDB s */
|
|
OP(125,OP_ANDB ( D ) ) /* ANDB d */
|
|
OP(127,OP_ANDB ( DLI ) ) /* ANDB dli */
|
|
OP(129,OP_ANDB ( IMM ) ) /* ANDB imm */
|
|
OP(12a,OP_ROLB ( ) ) /* ROL Bacc */
|
|
OP(12d,OP_ANDB ( A ) ) /* ANDB a */
|
|
OP(12f,OP_ANDB ( AL ) ) /* ANDB al */
|
|
OP(131,OP_ANDB ( DIY ) ) /* ANDB diy */
|
|
OP(132,OP_ANDB ( DI ) ) /* ANDB di */
|
|
OP(133,OP_ANDB ( SIY ) ) /* ANDB siy */
|
|
OP(135,OP_ANDB ( DX ) ) /* ANDB dx */
|
|
OP(137,OP_ANDB ( DLIY ) ) /* ANDB dliy */
|
|
OP(139,OP_ANDB ( AY ) ) /* ANDB ay */
|
|
OP(13a,OP_INCB ( ) ) /* INB */
|
|
OP(13b,OP_TSB ( ) ) /* TSB */
|
|
OP(13d,OP_ANDB ( AX ) ) /* ANDB ax */
|
|
OP(13f,OP_ANDB ( ALX ) ) /* ANDB alx */
|
|
OP(141,OP_EORB ( DXI ) ) /* EORB dxi */
|
|
OP(143,OP_EORB ( S ) ) /* EORB s */
|
|
OP(145,OP_EORB ( D ) ) /* EORB d */
|
|
OP(147,OP_EORB ( DLI ) ) /* EORB dli */
|
|
OP(148,OP_PHAB ( ) ) /* PHB */
|
|
OP(149,OP_EORB ( IMM ) ) /* EORB imm */
|
|
OP(14a,OP_LSRB ( ) ) /* LSRB acc */
|
|
OP(14d,OP_EORB ( A ) ) /* EORB a */
|
|
OP(14f,OP_EORB ( AL ) ) /* EORB al */
|
|
OP(151,OP_EORB ( DIY ) ) /* EORB diy */
|
|
OP(152,OP_EORB ( DI ) ) /* EORB di */
|
|
OP(153,OP_EORB ( SIY ) ) /* EORB siy */
|
|
OP(155,OP_EORB ( DX ) ) /* EORB dx */
|
|
OP(157,OP_EORB ( DLIY ) ) /* EORB dliy */
|
|
OP(159,OP_EORB ( AY ) ) /* EORB ay */
|
|
OP(15b,OP_TBD ( ) ) /* TBD */
|
|
OP(15d,OP_EORB ( AX ) ) /* EORB ax */
|
|
OP(15f,OP_EORB ( ALX ) ) /* EORB alx */
|
|
OP(161,OP_ADCB ( DXI ) ) /* ADCB dxi */
|
|
OP(163,OP_ADCB ( S ) ) /* ADCB s */
|
|
OP(165,OP_ADCB ( D ) ) /* ADCB d */
|
|
OP(167,OP_ADCB ( DLI ) ) /* ADCB dli */
|
|
OP(168,OP_PLAB ( ) ) /* PLB */
|
|
OP(169,OP_ADCB ( IMM ) ) /* ADCB imm */
|
|
OP(16a,OP_RORB ( ) ) /* ROR Bacc */
|
|
OP(16d,OP_ADCB ( A ) ) /* ADCB a */
|
|
OP(16f,OP_ADCB ( AL ) ) /* ADCB al */
|
|
OP(171,OP_ADCB ( DIY ) ) /* ADCB diy */
|
|
OP(172,OP_ADCB ( DI ) ) /* ADCB di */
|
|
OP(173,OP_ADCB ( SIY ) ) /* ADCB siy */
|
|
OP(175,OP_ADCB ( DX ) ) /* ADCB dx */
|
|
OP(177,OP_ADCB ( DLIY ) ) /* ADCB dliy */
|
|
OP(179,OP_ADCB ( AY ) ) /* ADCB ay */
|
|
OP(17b,OP_TDB ( ) ) /* TDB */
|
|
OP(17d,OP_ADCB ( AX ) ) /* ADCB ax */
|
|
OP(17f,OP_ADCB ( ALX ) ) /* ADCB alx */
|
|
OP(181,OP_STB ( DXI ) ) /* STB dxi */
|
|
OP(183,OP_STB ( S ) ) /* STB s */
|
|
OP(185,OP_STB ( D ) ) /* STB d */
|
|
OP(187,OP_STB ( DLI ) ) /* STB dli */
|
|
OP(18a,OP_TXB ( REG_X ) ) /* TXB */
|
|
OP(18d,OP_STB ( A ) ) /* STB a */
|
|
OP(18f,OP_STB ( AL ) ) /* STB al */
|
|
OP(191,OP_STB ( DIY ) ) /* STB diy */
|
|
OP(192,OP_STB ( DI ) ) /* STB di */
|
|
OP(193,OP_STB ( SIY ) ) /* STB siy */
|
|
OP(195,OP_STB ( DX ) ) /* STB dx */
|
|
OP(197,OP_STB ( DLIY ) ) /* STB dliy */
|
|
OP(198,OP_TXB ( REG_Y ) ) /* TYB */
|
|
OP(199,OP_STB ( AY ) ) /* STB ay */
|
|
OP(19d,OP_STB ( AX ) ) /* STB ax */
|
|
OP(19f,OP_STB ( ALX ) ) /* STB alx */
|
|
OP(1a1,OP_LDB ( DXI ) ) /* LDB dxi */
|
|
OP(1a3,OP_LDB ( S ) ) /* LDB s */
|
|
OP(1a5,OP_LDB ( D ) ) /* LDB d */
|
|
OP(1a7,OP_LDB ( DLI ) ) /* LDB dli */
|
|
OP(1a8,OP_TBX ( REG_Y ) ) /* TBY */
|
|
OP(1a9,OP_LDB ( IMM ) ) /* LDB imm */
|
|
OP(1aa,OP_TBX ( REG_X ) ) /* TBX */
|
|
OP(1ad,OP_LDB ( A ) ) /* LDB a */
|
|
OP(1af,OP_LDB ( AL ) ) /* LDB al */
|
|
OP(1b1,OP_LDB ( DIY ) ) /* LDB diy */
|
|
OP(1b2,OP_LDB ( DI ) ) /* LDB di */
|
|
OP(1b3,OP_LDB ( SIY ) ) /* LDB siy */
|
|
OP(1b5,OP_LDB ( DX ) ) /* LDB dx */
|
|
OP(1b7,OP_LDB ( DLIY ) ) /* LDB dliy */
|
|
OP(1b9,OP_LDB ( AY ) ) /* LDB ay */
|
|
OP(1bd,OP_LDB ( AX ) ) /* LDB ax */
|
|
OP(1bf,OP_LDB ( ALX ) ) /* LDB alx */
|
|
OP(1c1,OP_CMPB ( DXI ) ) /* CMPB dxi */
|
|
OP(1c3,OP_CMPB ( S ) ) /* CMPB s */
|
|
OP(1c5,OP_CMPB ( D ) ) /* CMPB d */
|
|
OP(1c7,OP_CMPB ( DLI ) ) /* CMPB dli */
|
|
OP(1c9,OP_CMPB ( IMM ) ) /* CMPB imm */
|
|
OP(1cd,OP_CMPB ( A ) ) /* CMPB a */
|
|
OP(1cf,OP_CMPB ( AL ) ) /* CMPB al */
|
|
OP(1d1,OP_CMPB ( DIY ) ) /* CMPB diy */
|
|
OP(1d2,OP_CMPB ( DI ) ) /* CMPB di */
|
|
OP(1d3,OP_CMPB ( SIY ) ) /* CMPB siy */
|
|
OP(1d5,OP_CMPB ( DX ) ) /* CMPB dx */
|
|
OP(1d7,OP_CMPB ( DLIY ) ) /* CMPB dliy */
|
|
OP(1d9,OP_CMPB ( AY ) ) /* CMPB ay */
|
|
OP(1dd,OP_CMPB ( AX ) ) /* CMPB ax */
|
|
OP(1df,OP_CMPB ( ALX ) ) /* CMPB alx */
|
|
OP(1e1,OP_SBCB ( DXI ) ) /* SBCB dxi */
|
|
OP(1e3,OP_SBCB ( S ) ) /* SBCB s */
|
|
OP(1e5,OP_SBCB ( D ) ) /* SBCB d */
|
|
OP(1e7,OP_SBCB ( DLI ) ) /* SBCB dli */
|
|
OP(1e9,OP_SBCB ( IMM ) ) /* SBCB imm */
|
|
OP(1ed,OP_SBCB ( A ) ) /* SBCB a */
|
|
OP(1ef,OP_SBCB ( AL ) ) /* SBCB al */
|
|
OP(1f1,OP_SBCB ( DIY ) ) /* SBCB diy */
|
|
OP(1f2,OP_SBCB ( DI ) ) /* SBCB di */
|
|
OP(1f3,OP_SBCB ( SIY ) ) /* SBCB siy */
|
|
OP(1f5,OP_SBCB ( DX ) ) /* SBCB dx */
|
|
OP(1f7,OP_SBCB ( DLIY ) ) /* SBCB dliy */
|
|
OP(1f9,OP_SBCB ( AY ) ) /* SBCB ay */
|
|
OP(1fd,OP_SBCB ( AX ) ) /* SBCB ax */
|
|
OP(1ff,OP_SBCB ( ALX ) ) /* SBCB alx */
|
|
|
|
OP(200,OP_UNIMP( ) ) /* unimplemented */
|
|
|
|
/* multiply/divide */
|
|
OP(201,OP_MPY ( DXI ) ) /* MPY dxi */
|
|
OP(203,OP_MPY ( S ) ) /* MPY s */
|
|
OP(205,OP_MPY ( D ) ) /* MPY d */
|
|
OP(207,OP_MPY ( DLI ) ) /* MPY dli */
|
|
OP(209,OP_MPY ( IMM ) ) /* MPY imm */
|
|
OP(20d,OP_MPY ( A ) ) /* MPY a */
|
|
OP(20f,OP_MPY ( AL ) ) /* MPY al */
|
|
OP(211,OP_MPY ( DIY ) ) /* MPY diy */
|
|
OP(212,OP_MPY ( DI ) ) /* MPY di */
|
|
OP(213,OP_MPY ( SIY ) ) /* MPY siy */
|
|
OP(215,OP_MPY ( DX ) ) /* MPY dx */
|
|
OP(217,OP_MPY ( DLIY ) ) /* MPY dliy */
|
|
OP(219,OP_MPY ( AY ) ) /* MPY ay */
|
|
OP(21d,OP_MPY ( AX ) ) /* MPY ax */
|
|
OP(21f,OP_MPY ( ALX ) ) /* MPY alx */
|
|
OP(221,OP_DIV ( DXI ) ) /* DIV dxi */
|
|
OP(223,OP_DIV ( S ) ) /* DIV s */
|
|
OP(225,OP_DIV ( D ) ) /* DIV d */
|
|
OP(227,OP_DIV ( DLI ) ) /* DIV dli */
|
|
OP(228,OP_XAB ( ) ) /* XAB */
|
|
OP(229,OP_DIV ( IMM ) ) /* DIV imm */
|
|
OP(22d,OP_DIV ( A ) ) /* DIV a */
|
|
OP(22f,OP_DIV ( AL ) ) /* DIV al */
|
|
OP(231,OP_DIV ( DIY ) ) /* DIV diy */
|
|
OP(232,OP_DIV ( DI ) ) /* DIV di */
|
|
OP(233,OP_DIV ( SIY ) ) /* DIV siy */
|
|
OP(235,OP_DIV ( DX ) ) /* DIV dx */
|
|
OP(237,OP_DIV ( DLIY ) ) /* DIV dliy */
|
|
OP(239,OP_DIV ( AY ) ) /* DIV ay */
|
|
OP(23d,OP_DIV ( AX ) ) /* DIV ax */
|
|
OP(23f,OP_DIV ( ALX ) ) /* DIV alx */
|
|
OP(249,OP_RLA ( IMM ) ) /* RLA imm */
|
|
OP(2c2,OP_LDT ( IMM ) ) /* LDT imm */
|
|
// note: block 28x-2bx is for 7750 opcodes, not implemented yet
|
|
|
|
TABLE_OPCODES =
|
|
// 00 01 02 03 04 05 06 07
|
|
// 08 09 0a 0b 0c 0d 0e 0f
|
|
{
|
|
O(00), O(01), O(02), O(03), O(04), O(05), O(06), O(07), // 00
|
|
O(08), O(09), O(0a), O(0b), O(0c), O(0d), O(0e), O(0f),
|
|
O(10), O(11), O(12), O(13), O(14), O(15), O(16), O(17), // 10
|
|
O(18), O(19), O(1a), O(1b), O(1c), O(1d), O(1e), O(1f),
|
|
O(20), O(21), O(22), O(23), O(24), O(25), O(26), O(27), // 20
|
|
O(28), O(29), O(2a), O(2b), O(2c), O(2d), O(2e), O(2f),
|
|
O(30), O(31), O(32), O(33), O(34), O(35), O(36), O(37), // 30
|
|
O(38), O(39), O(3a), O(3b), O(3c), O(3d), O(3e), O(3f),
|
|
O(40), O(41), O(42), O(43), O(44), O(45), O(46), O(47), // 40
|
|
O(48), O(49), O(4a), O(4b), O(4c), O(4d), O(4e), O(4f),
|
|
O(50), O(51), O(52), O(53), O(54), O(55), O(56), O(57), // 50
|
|
O(58), O(59), O(5a), O(5b), O(5c), O(5d), O(5e), O(5f),
|
|
O(60), O(61), O(62), O(63), O(64), O(65), O(66), O(67), // 60
|
|
O(68), O(69), O(6a), O(6b), O(6c), O(6d), O(6e), O(6f),
|
|
O(70), O(71), O(72), O(73), O(74), O(75), O(76), O(77), // 70
|
|
O(78), O(79), O(7a), O(7b), O(7c), O(7d), O(7e), O(7f),
|
|
O(80), O(81), O(82), O(83), O(84), O(85), O(86), O(87), // 80
|
|
O(88), O(89), O(8a), O(8b), O(8c), O(8d), O(8e), O(8f),
|
|
O(90), O(91), O(92), O(93), O(94), O(95), O(96), O(97), // 90
|
|
O(98), O(99), O(9a), O(9b), O(9c), O(9d), O(9e), O(9f),
|
|
O(a0), O(a1), O(a2), O(a3), O(a4), O(a5), O(a6), O(a7), // a0
|
|
O(a8), O(a9), O(aa), O(ab), O(ac), O(ad), O(ae), O(af),
|
|
O(b0), O(b1), O(b2), O(b3), O(b4), O(b5), O(b6), O(b7), // b0
|
|
O(b8), O(b9), O(ba), O(bb), O(bc), O(bd), O(be), O(bf),
|
|
O(c0), O(c1), O(c2), O(c3), O(c4), O(c5), O(c6), O(c7), // c0
|
|
O(c8), O(c9), O(ca), O(cb), O(cc), O(cd), O(ce), O(cf),
|
|
O(d0), O(d1), O(d2), O(d3), O(d4), O(d5), O(d6), O(d7), // d0
|
|
O(d8), O(d9), O(da), O(db), O(dc), O(dd), O(de), O(df),
|
|
O(e0), O(e1), O(e2), O(e3), O(e4), O(e5), O(e6), O(e7), // e0
|
|
O(e8), O(e9), O(ea), O(eb), O(ec), O(ed), O(ee), O(ef),
|
|
O(f0), O(f1), O(f2), O(f3), O(f4), O(f5), O(f6), O(f7), // f0
|
|
O(f8), O(f9), O(fa), O(fb), O(fc), O(fd), O(fe), O(ff)
|
|
};
|
|
|
|
TABLE_OPCODES2 =
|
|
// 00 01 02 03 04 05 06 07
|
|
// 08 09 0a 0b 0c 0d 0e 0f
|
|
{
|
|
O(200),O(101),O(200),O(103),O(200),O(105),O(200),O(107), // 00
|
|
O(200),O(109),O(10a),O(200),O(200),O(10d),O(200),O(10f),
|
|
O(200),O(111),O(112),O(113),O(200),O(115),O(200),O(117), // 10
|
|
O(200),O(119),O(11a),O(11b),O(200),O(11d),O(200),O(11f),
|
|
O(200),O(121),O(200),O(123),O(200),O(125),O(200),O(127), // 20
|
|
O(200),O(129),O(12a),O(200),O(200),O(12d),O(200),O(12f),
|
|
O(200),O(131),O(132),O(133),O(200),O(135),O(200),O(137), // 30
|
|
O(200),O(139),O(13a),O(13b),O(200),O(13d),O(200),O(13f),
|
|
O(200),O(141),O(200),O(143),O(200),O(145),O(200),O(147), // 40
|
|
O(148),O(149),O(14a),O(200),O(200),O(14d),O(200),O(14f),
|
|
O(200),O(151),O(152),O(153),O(200),O(155),O(200),O(157), // 50
|
|
O(200),O(159),O(200),O(15b),O(200),O(15d),O(200),O(15f),
|
|
O(200),O(161),O(200),O(163),O(200),O(165),O(200),O(167), // 60
|
|
O(168),O(169),O(16a),O(200),O(200),O(16d),O(200),O(16f),
|
|
O(200),O(171),O(172),O(173),O(200),O(175),O(200),O(177), // 70
|
|
O(200),O(179),O(200),O(17b),O(200),O(17d),O(200),O(17f),
|
|
O(200),O(181),O(200),O(183),O(200),O(185),O(200),O(187), // 80
|
|
O(200),O(200),O(18a),O(200),O(200),O(18d),O(200),O(18f),
|
|
O(200),O(191),O(192),O(193),O(200),O(195),O(200),O(197), // 90
|
|
O(198),O(199),O(200),O(200),O(200),O(19d),O(200),O(19f),
|
|
O(200),O(1a1),O(200),O(1a3),O(200),O(1a5),O(200),O(1a7), // a0
|
|
O(1a8),O(1a9),O(1aa),O(200),O(200),O(1ad),O(200),O(1af),
|
|
O(200),O(1b1),O(1b2),O(1b3),O(200),O(1b5),O(200),O(1b7), // b0
|
|
O(200),O(1b9),O(200),O(200),O(200),O(1bd),O(200),O(1bf),
|
|
O(200),O(1c1),O(200),O(1c3),O(200),O(1c5),O(200),O(1c7), // c0
|
|
O(200),O(1c9),O(200),O(200),O(200),O(1cd),O(200),O(1cf),
|
|
O(200),O(1d1),O(1d2),O(1d3),O(200),O(1d5),O(200),O(1d7), // d0
|
|
O(200),O(1d9),O(200),O(200),O(200),O(1dd),O(200),O(1df),
|
|
O(200),O(1e1),O(200),O(1e3),O(200),O(1e5),O(200),O(1e7), // e0
|
|
O(200),O(1e9),O(200),O(200),O(200),O(1ed),O(200),O(1ef),
|
|
O(200),O(1f1),O(1f2),O(1f3),O(200),O(1f5),O(200),O(1f7), // f0
|
|
O(200),O(1f9),O(200),O(200),O(200),O(1fd),O(200),O(1ff)
|
|
};
|
|
|
|
TABLE_OPCODES3 =
|
|
// 00 01 02 03 04 05 06 07
|
|
// 08 09 0a 0b 0c 0d 0e 0f
|
|
{
|
|
O(200),O(201),O(200),O(203),O(200),O(205),O(200),O(207), // 00
|
|
O(200),O(209),O(200),O(200),O(200),O(20d),O(200),O(20f),
|
|
O(200),O(211),O(212),O(213),O(200),O(215),O(200),O(217), // 10
|
|
O(200),O(219),O(200),O(200),O(200),O(21d),O(200),O(21f),
|
|
O(200),O(221),O(200),O(223),O(200),O(225),O(200),O(227), // 20
|
|
O(228),O(229),O(200),O(200),O(200),O(22d),O(200),O(22f),
|
|
O(200),O(231),O(232),O(233),O(200),O(235),O(200),O(237), // 30
|
|
O(200),O(239),O(200),O(200),O(200),O(23d),O(200),O(23f),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 40
|
|
O(200),O(249),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 50
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 60
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 70
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 80
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // 90
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // a0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // b0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(2c2),O(200),O(200),O(200),O(200),O(200), // c0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // d0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // e0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200),
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200), // f0
|
|
O(200),O(200),O(200),O(200),O(200),O(200),O(200),O(200)
|
|
};
|
|
|
|
|
|
/* Assert or clear a line on the CPU */
|
|
TABLE_FUNCTION(void, set_line, (int line, int state))
|
|
{
|
|
switch(line)
|
|
{
|
|
// maskable interrupts
|
|
case M37710_LINE_ADC:
|
|
case M37710_LINE_UART1XMIT:
|
|
case M37710_LINE_UART1RECV:
|
|
case M37710_LINE_UART0XMIT:
|
|
case M37710_LINE_UART0RECV:
|
|
case M37710_LINE_TIMERB2:
|
|
case M37710_LINE_TIMERB1:
|
|
case M37710_LINE_TIMERB0:
|
|
case M37710_LINE_TIMERA4:
|
|
case M37710_LINE_TIMERA3:
|
|
case M37710_LINE_TIMERA2:
|
|
case M37710_LINE_TIMERA1:
|
|
case M37710_LINE_TIMERA0:
|
|
case M37710_LINE_IRQ2:
|
|
case M37710_LINE_IRQ1:
|
|
case M37710_LINE_IRQ0:
|
|
switch(state)
|
|
{
|
|
case CLEAR_LINE:
|
|
LINE_IRQ &= ~(1 << line);
|
|
if (m37710_irq_levels[line])
|
|
{
|
|
m_m37710_regs[m37710_irq_levels[line]] &= ~8;
|
|
}
|
|
break;
|
|
|
|
case ASSERT_LINE:
|
|
case PULSE_LINE:
|
|
case HOLD_LINE:
|
|
LINE_IRQ |= (1 << line);
|
|
if (m37710_irq_levels[line])
|
|
{
|
|
m_m37710_regs[m37710_irq_levels[line]] |= 8;
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Get a register from the CPU core */
|
|
TABLE_FUNCTION(UINT32, get_reg, (int regnum))
|
|
{
|
|
switch(regnum)
|
|
{
|
|
case M37710_A: return REG_B | REG_A;
|
|
case M37710_B: return REG_BB | REG_BA;
|
|
case M37710_X: return REG_X;
|
|
case M37710_Y: return REG_Y;
|
|
case M37710_S: return REG_S;
|
|
case M37710_PC: return REG_PC;
|
|
case M37710_PB: return REG_PB >> 16;
|
|
case M37710_DB: return REG_DB >> 16;
|
|
case M37710_D: return REG_D;
|
|
case M37710_P: return m37710i_get_reg_p();
|
|
case M37710_IRQ_STATE: return LINE_IRQ;
|
|
case STATE_GENPCBASE: return REG_PPC;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
TABLE_FUNCTION(void, set_reg, (int regnum, UINT32 val))
|
|
{
|
|
switch(regnum)
|
|
{
|
|
case M37710_PC: REG_PC = MAKE_UINT_16(val); break;
|
|
case M37710_S: REG_S = MAKE_UINT_16(val); break;
|
|
case M37710_P: m37710i_set_reg_p(val); break;
|
|
#if FLAG_SET_M
|
|
case M37710_A: REG_A = MAKE_UINT_8(val); REG_B = val&0xff00; break;
|
|
case M37710_B: REG_BA = MAKE_UINT_8(val); REG_BB = val&0xff00; break;
|
|
#else
|
|
case M37710_A: REG_A = MAKE_UINT_16(val); break;
|
|
case M37710_B: REG_BA = MAKE_UINT_16(val); break;
|
|
#endif
|
|
#if FLAG_SET_X
|
|
case M37710_X: REG_X = MAKE_UINT_8(val); break;
|
|
case M37710_Y: REG_Y = MAKE_UINT_8(val); break;
|
|
#else
|
|
case M37710_X: REG_X = MAKE_UINT_16(val); break;
|
|
case M37710_Y: REG_Y = MAKE_UINT_16(val); break;
|
|
#endif
|
|
case M37710_IRQ_STATE: (this->*FTABLE_SET_LINE)(M37710_LINE_IRQ0, val == 0 ? CLEAR_LINE : ASSERT_LINE); break;
|
|
}
|
|
}
|
|
|
|
TABLE_FUNCTION(int, execute, (int clocks))
|
|
{
|
|
if(!CPU_STOPPED)
|
|
{
|
|
CLOCKS = clocks;
|
|
do
|
|
{
|
|
REG_PPC = REG_PC;
|
|
M37710_CALL_DEBUGGER(REG_PB | REG_PC);
|
|
REG_PC++;
|
|
REG_IR = read_8_IMM(REG_PB | REG_PPC);
|
|
(this->*m_opcodes[REG_IR])();
|
|
} while(CLOCKS > 0);
|
|
return clocks - CLOCKS;
|
|
}
|
|
return clocks;
|
|
}
|
|
|
|
|
|
/* ======================================================================== */
|
|
/* ================================== EOF ================================= */
|
|
/* ======================================================================== */
|