📄 34010ops.c
字号:
*rs+=FW_INC(F); \
WFIELD##F(*rd,data); \
*rd+=FW_INC(F); \
}
static void move0_ni_ni_a (void) { MOVE_NI_NI(0,A); }
static void move0_ni_ni_b (void) { MOVE_NI_NI(0,B); }
static void move1_ni_ni_a (void) { MOVE_NI_NI(1,A); }
static void move1_ni_ni_b (void) { MOVE_NI_NI(1,B); }
#define MOVE_R_NO(F,R) \
{ \
INT32 o = PARAM_WORD(); \
WFIELD##F(R##REG(R##DSTREG)+o,R##REG(R##SRCREG)); \
}
static void move0_r_no_a (void) { MOVE_R_NO(0,A); }
static void move0_r_no_b (void) { MOVE_R_NO(0,B); }
static void move1_r_no_a (void) { MOVE_R_NO(1,A); }
static void move1_r_no_b (void) { MOVE_R_NO(1,B); }
#define MOVE_NO_R(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 o = PARAM_WORD(); \
*rd = RFIELD##F(R##REG(R##SRCREG)+o); \
SET_NZ(*rd); \
CLR_V; \
}
static void move0_no_r_a (void) { MOVE_NO_R(0,A); }
static void move0_no_r_b (void) { MOVE_NO_R(0,B); }
static void move1_no_r_a (void) { MOVE_NO_R(1,A); }
static void move1_no_r_b (void) { MOVE_NO_R(1,B); }
#define MOVE_NO_NI(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 o = PARAM_WORD(); \
INT32 data = RFIELD##F(R##REG(R##SRCREG)+o); \
WFIELD##F(*rd,data); \
*rd+=FW_INC(F); \
}
static void move0_no_ni_a (void) { MOVE_NO_NI(0,A); }
static void move0_no_ni_b (void) { MOVE_NO_NI(0,B); }
static void move1_no_ni_a (void) { MOVE_NO_NI(1,A); }
static void move1_no_ni_b (void) { MOVE_NO_NI(1,B); }
#define MOVE_NO_NO(F,R) \
{ \
INT32 o1 = PARAM_WORD(); \
INT32 o2 = PARAM_WORD(); \
INT32 data = RFIELD##F(R##REG(R##SRCREG)+o1); \
WFIELD##F(R##REG(R##DSTREG)+o2,data); \
}
static void move0_no_no_a (void) { MOVE_NO_NO(0,A); }
static void move0_no_no_b (void) { MOVE_NO_NO(0,B); }
static void move1_no_no_a (void) { MOVE_NO_NO(1,A); }
static void move1_no_no_b (void) { MOVE_NO_NO(1,B); }
#define MOVE_RA(F,R) \
{ \
WFIELD##F(PARAM_LONG(),R##REG(R##DSTREG)); \
}
static void move0_ra_a (void) { MOVE_RA(0,A); }
static void move0_ra_b (void) { MOVE_RA(0,B); }
static void move1_ra_a (void) { MOVE_RA(1,A); }
static void move1_ra_b (void) { MOVE_RA(1,B); }
#define MOVE_AR(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd = RFIELD##F(PARAM_LONG()); \
SET_NZ(*rd); \
CLR_V; \
}
static void move0_ar_a (void) { MOVE_AR(0,A); }
static void move0_ar_b (void) { MOVE_AR(0,B); }
static void move1_ar_a (void) { MOVE_AR(1,A); }
static void move1_ar_b (void) { MOVE_AR(1,B); }
#define MOVE_A_NI(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
WFIELD##F(*rd,RFIELD##F(PARAM_LONG())); \
*rd+=FW_INC(F); \
}
static void move0_a_ni_a (void) { MOVE_A_NI(0,A); }
static void move0_a_ni_b (void) { MOVE_A_NI(0,B); }
static void move1_a_ni_a (void) { MOVE_A_NI(1,A); }
static void move1_a_ni_b (void) { MOVE_A_NI(1,B); }
#define MOVE_AA(F) \
{ \
UINT32 bitaddrs=PARAM_LONG(); \
WFIELD##F(PARAM_LONG(),RFIELD##F(bitaddrs)); \
}
static void move0_aa (void) { MOVE_AA(0); }
static void move1_aa (void) { MOVE_AA(1); }
/* Program Control and Context Switching */
#define CALL(R) \
{ \
PUSH(PC); \
PC = R##REG(R##DSTREG); \
}
static void call_a (void) { CALL(A); }
static void call_b (void) { CALL(B); }
static void callr(void)
{
PUSH(PC+0x10);
PC += (PARAM_WORD_NO_INC()<<4)+0x10;
}
static void calla(void)
{
PUSH(PC+0x20);
PC = PARAM_LONG_NO_INC();
}
#define DSJ(R) \
{ \
if (--R##REG(R##DSTREG)) \
{ \
PC += (PARAM_WORD_NO_INC()<<4)+0x10; \
} \
else \
{ \
SKIP_WORD; \
} \
}
static void dsj_a (void) { DSJ(A); }
static void dsj_b (void) { DSJ(B); }
#define DSJEQ(R) \
{ \
if (!NOTZ_FLAG) \
{ \
if (--R##REG(R##DSTREG)) \
{ \
PC += (PARAM_WORD_NO_INC()<<4)+0x10; \
} \
else \
{ \
SKIP_WORD; \
} \
} \
else \
{ \
SKIP_WORD; \
} \
}
static void dsjeq_a (void) { DSJEQ(A); }
static void dsjeq_b (void) { DSJEQ(B); }
#define DSJNE(R) \
{ \
if (NOTZ_FLAG) \
{ \
if (--R##REG(R##DSTREG)) \
{ \
PC += (PARAM_WORD_NO_INC()<<4)+0x10; \
} \
else \
{ \
SKIP_WORD; \
} \
} \
else \
{ \
SKIP_WORD; \
} \
}
static void dsjne_a (void) { DSJNE(A); }
static void dsjne_b (void) { DSJNE(B); }
#define DSJS(R) \
{ \
if (state.op & 0x0400) \
{ \
if (--R##REG(R##DSTREG)) PC -= ((PARAM_K)<<4); \
} \
else \
{ \
if (--R##REG(R##DSTREG)) PC += ((PARAM_K)<<4); \
} \
}
static void dsjs_a (void) { DSJS(A); }
static void dsjs_b (void) { DSJS(B); }
static void emu(void)
{
/* In RUN state, this instruction is a NOP */
}
#define EXGPC(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 temppc = *rd; \
*rd = PC; \
PC = temppc; \
}
static void exgpc_a (void) { EXGPC(A); }
static void exgpc_b (void) { EXGPC(B); }
#define GETPC(R) \
{ \
R##REG(R##DSTREG) = PC; \
}
static void getpc_a (void) { GETPC(A); }
static void getpc_b (void) { GETPC(B); }
#define GETST(R) \
{ \
R##REG(R##DSTREG) = GET_ST(); \
}
static void getst_a (void) { GETST(A); }
static void getst_b (void) { GETST(B); }
#define j_xx_8(TAKE) \
{ \
if (ADSTREG) \
{ \
if (TAKE) \
{ \
PC += (PARAM_REL8 << 4); \
} \
} \
else \
{ \
if (TAKE) \
{ \
PC = PARAM_LONG_NO_INC(); \
} \
else \
{ \
SKIP_LONG; \
} \
} \
}
#define j_xx_0(TAKE) \
{ \
if (ADSTREG) \
{ \
if (TAKE) \
{ \
PC += (PARAM_REL8 << 4); \
} \
} \
else \
{ \
if (TAKE) \
{ \
PC += (PARAM_WORD_NO_INC()<<4)+0x10; \
} \
else \
{ \
SKIP_WORD; \
} \
} \
}
#define j_xx_x(TAKE) \
{ \
if (TAKE) \
{ \
PC += (PARAM_REL8 << 4); \
} \
}
static void j_UC_0(void)
{
j_xx_0(1);
}
static void j_UC_8(void)
{
j_xx_8(1);
}
static void j_UC_x(void)
{
j_xx_x(1);
}
static void j_P_0(void)
{
j_xx_0(!N_FLAG && NOTZ_FLAG);
}
static void j_P_8(void)
{
j_xx_8(!N_FLAG && NOTZ_FLAG);
}
static void j_P_x(void)
{
j_xx_x(!N_FLAG && NOTZ_FLAG);
}
static void j_LS_0(void)
{
j_xx_0(C_FLAG || !NOTZ_FLAG);
}
static void j_LS_8(void)
{
j_xx_8(C_FLAG || !NOTZ_FLAG);
}
static void j_LS_x(void)
{
j_xx_x(C_FLAG || !NOTZ_FLAG);
}
static void j_HI_0(void)
{
j_xx_0(!C_FLAG && NOTZ_FLAG);
}
static void j_HI_8(void)
{
j_xx_8(!C_FLAG && NOTZ_FLAG);
}
static void j_HI_x(void)
{
j_xx_x(!C_FLAG && NOTZ_FLAG);
}
static void j_LT_0(void)
{
j_xx_0((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG));
}
static void j_LT_8(void)
{
j_xx_8((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG));
}
static void j_LT_x(void)
{
j_xx_x((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG));
}
static void j_GE_0(void)
{
j_xx_0((N_FLAG && V_FLAG) || (!N_FLAG && !V_FLAG));
}
static void j_GE_8(void)
{
j_xx_8((N_FLAG && V_FLAG) || (!N_FLAG && !V_FLAG));
}
static void j_GE_x(void)
{
j_xx_x((N_FLAG && V_FLAG) || (!N_FLAG && !V_FLAG));
}
static void j_LE_0(void)
{
j_xx_0((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG) || !NOTZ_FLAG);
}
static void j_LE_8(void)
{
j_xx_8((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG) || !NOTZ_FLAG);
}
static void j_LE_x(void)
{
j_xx_x((N_FLAG && !V_FLAG) || (!N_FLAG && V_FLAG) || !NOTZ_FLAG);
}
static void j_GT_0(void)
{
j_xx_0((N_FLAG && V_FLAG && NOTZ_FLAG) || (!N_FLAG && !V_FLAG && NOTZ_FLAG));
}
static void j_GT_8(void)
{
j_xx_8((N_FLAG && V_FLAG && NOTZ_FLAG) || (!N_FLAG && !V_FLAG && NOTZ_FLAG));
}
static void j_GT_x(void)
{
j_xx_x((N_FLAG && V_FLAG && NOTZ_FLAG) || (!N_FLAG && !V_FLAG && NOTZ_FLAG));
}
static void j_C_0(void)
{
j_xx_0(C_FLAG);
}
static void j_C_8(void)
{
j_xx_8(C_FLAG);
}
static void j_C_x(void)
{
j_xx_x(C_FLAG);
}
static void j_NC_0(void)
{
j_xx_0(!C_FLAG);
}
static void j_NC_8(void)
{
j_xx_8(!C_FLAG);
}
static void j_NC_x(void)
{
j_xx_x(!C_FLAG);
}
static void j_EQ_0(void)
{
j_xx_0(!NOTZ_FLAG);
}
static void j_EQ_8(void)
{
j_xx_8(!NOTZ_FLAG);
}
static void j_EQ_x(void)
{
j_xx_x(!NOTZ_FLAG);
}
static void j_NE_0(void)
{
j_xx_0(NOTZ_FLAG);
}
static void j_NE_8(void)
{
j_xx_8(NOTZ_FLAG);
}
static void j_NE_x(void)
{
j_xx_x(NOTZ_FLAG);
}
static void j_V_0(void)
{
j_xx_0(V_FLAG);
}
static void j_V_8(void)
{
j_xx_8(V_FLAG);
}
static void j_V_x(void)
{
j_xx_x(V_FLAG);
}
static void j_NV_0(void)
{
j_xx_0(!V_FLAG);
}
static void j_NV_8(void)
{
j_xx_8(!V_FLAG);
}
static void j_NV_x(void)
{
j_xx_x(!V_FLAG);
}
static void j_N_0(void)
{
j_xx_0(N_FLAG);
}
static void j_N_8(void)
{
j_xx_8(N_FLAG);
}
static void j_N_x(void)
{
j_xx_x(N_FLAG);
}
static void j_NN_0(void)
{
j_xx_0(!N_FLAG);
}
static void j_NN_8(void)
{
j_xx_8(!N_FLAG);
}
static void j_NN_x(void)
{
j_xx_x(!N_FLAG);
}
#define JUMP(R) \
{ \
PC = R##REG(R##DSTREG); \
}
static void jump_a (void) { JUMP(A); }
static void jump_b (void) { JUMP(B); }
static void popst(void)
{
SET_ST(POP());
}
static void pushst(void)
{
PUSH(GET_ST());
}
#define PUTST(R) \
{ \
SET_ST(R##REG(R##DSTREG)); \
}
static void putst_a (void) { PUTST(A); }
static void putst_b (void) { PUTST(B); }
static void reti(void)
{
SET_ST(POP());
PC = POP();
SET_FW();
}
static void rets(void)
{
UINT32 offs;
PC = POP();
offs = PARAM_N;
if (offs)
{
SP+=(offs<<4);
}
}
#define REV(R) \
{ \
R##REG(R##DSTREG) = 0x0008; \
}
static void rev_a (void) { REV(A); }
static void rev_b (void) { REV(B); }
static void trap(void)
{
UINT32 t = PARAM_N;
if (t)
{
PUSH(PC);
PUSH(GET_ST());
}
RESET_ST();
PC = RLONG(0xffffffe0-(t<<5));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -