📄 34010ops.c
字号:
static void mpys_b(void) { MPYS(B,0x10); }
#define MPYU(R,N) \
{ \
INT32 *rd1 = &R##REG(R##DSTREG); \
\
UINT32 m1 = R##REG(R##SRCREG); \
ZEXTEND(m1, FW(1)); \
\
if (!(R##DSTREG & (1*N))) \
{ \
UINT64 product = MUL_U64_U32_U32(m1, *rd1); \
*rd1 = HI32_U32_U64(product); \
R##REG(R##DSTREG+N) = LO32_U32_U64(product); \
SET_Z(product!=0); \
} \
else \
{ \
*rd1 = (UINT32)*rd1 * m1; \
SET_Z(*rd1); \
} \
}
static void mpyu_a(void) { MPYU(A,1 ); }
static void mpyu_b(void) { MPYU(B,0x10); }
#define NEG(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 r = 0 - *rd; \
SET_NZCV_SUB(0,*rd,r); \
*rd = r; \
}
static void neg_a(void) { NEG(A); }
static void neg_b(void) { NEG(B); }
#define NEGB(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = *rd + (C_FLAG?1:0); \
INT32 r = 0 - t; \
SET_NZCV_SUB(0,t,r); \
*rd = r; \
}
static void negb_a(void) { NEGB(A); }
static void negb_b(void) { NEGB(B); }
static void nop(void)
{
}
#define NOT(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd = ~(*rd); \
SET_Z(*rd); \
}
static void not_a(void) { NOT(A); }
static void not_b(void) { NOT(B); }
#define OR(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd |= R##REG(R##SRCREG); \
SET_Z(*rd); \
}
static void or_a(void) { OR(A); }
static void or_b(void) { OR(B); }
#define ORI(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd |= PARAM_LONG(); \
SET_Z(*rd); \
}
static void ori_a(void) { ORI(A); }
static void ori_b(void) { ORI(B); }
static void setc(void)
{
C_FLAG = 1;
}
#define SETF(F) \
{ \
FE##F##_FLAG = state.op & 0x20; \
FW(F) = state.op & 0x1f; \
SET_FW(); \
}
static void setf0(void) { SETF(0); }
static void setf1(void) { SETF(1); }
#define SEXT(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
SEXTEND(*rd,FW(F)); \
SET_NZ(*rd); \
}
static void sext0_a(void) { SEXT(0,A); }
static void sext0_b(void) { SEXT(0,B); }
static void sext1_a(void) { SEXT(1,A); }
static void sext1_b(void) { SEXT(1,B); }
#define RL(R,K) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 res = *rd; \
INT32 k = (K); \
if (k) \
{ \
res<<=(k-1); \
C_FLAG = SIGN(res); \
res<<=1; \
res |= (((UINT32)*rd)>>((-k)&0x1f)); \
*rd = res; \
} \
else \
{ \
C_FLAG = 0; \
} \
SET_Z(res); \
}
static void rl_k_a(void) { RL(A,PARAM_K); }
static void rl_k_b(void) { RL(B,PARAM_K); }
static void rl_r_a(void) { RL(A,AREG(ASRCREG)&0x1f); }
static void rl_r_b(void) { RL(B,BREG(BSRCREG)&0x1f); }
#define SLA(R,K) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
UINT32 res = *rd; \
INT32 k = K; \
if (k) \
{ \
UINT32 mask = (0xffffffff<<(31-k))&0x7fffffff; \
UINT32 res2 = SIGN(res) ? res^mask : res; \
V_FLAG = (res2 & mask); \
\
res<<=(k-1); \
C_FLAG = SIGN(res); \
res<<=1; \
*rd = res; \
} \
else \
{ \
C_FLAG = V_FLAG = 0; \
} \
SET_NZ(res); \
}
static void sla_k_a(void) { SLA(A,PARAM_K); }
static void sla_k_b(void) { SLA(B,PARAM_K); }
static void sla_r_a(void) { SLA(A,AREG(ASRCREG)&0x1f); }
static void sla_r_b(void) { SLA(B,BREG(BSRCREG)&0x1f); }
#define SLL(R,K) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
UINT32 res = *rd; \
INT32 k = K; \
if (k) \
{ \
res<<=(k-1); \
C_FLAG = SIGN(res); \
res<<=1; \
*rd = res; \
} \
else \
{ \
C_FLAG = 0; \
} \
SET_Z(res); \
}
static void sll_k_a(void) { SLL(A,PARAM_K); }
static void sll_k_b(void) { SLL(B,PARAM_K); }
static void sll_r_a(void) { SLL(A,AREG(ASRCREG)&0x1f); }
static void sll_r_b(void) { SLL(B,BREG(BSRCREG)&0x1f); }
#define SRA(R,K) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 res = *rd; \
INT32 k = (-(K)) & 0x1f; \
if (k) \
{ \
res>>=(k-1); \
C_FLAG = res & 1; \
res>>=1; \
*rd = res; \
} \
else \
{ \
C_FLAG = 0; \
} \
SET_NZ(res); \
}
static void sra_k_a(void) { SRA(A,PARAM_K); }
static void sra_k_b(void) { SRA(B,PARAM_K); }
static void sra_r_a(void) { SRA(A,AREG(ASRCREG)); }
static void sra_r_b(void) { SRA(B,BREG(BSRCREG)); }
#define SRL(R,K) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
UINT32 res = *rd; \
INT32 k = (-(K)) & 0x1f; \
if (k) \
{ \
res>>=(k-1); \
C_FLAG = res & 1; \
res>>=1; \
*rd = res; \
} \
else \
{ \
C_FLAG = 0; \
} \
SET_NZ(res); \
}
static void srl_k_a(void) { SRL(A,PARAM_K); }
static void srl_k_b(void) { SRL(B,PARAM_K); }
static void srl_r_a(void) { SRL(A,AREG(ASRCREG)); }
static void srl_r_b(void) { SRL(B,BREG(BSRCREG)); }
#define SUB(R) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 r = *rd - *rs; \
SET_NZCV_SUB(*rd,*rs,r); \
*rd = r; \
}
static void sub_a(void) { SUB(A); }
static void sub_b(void) { SUB(B); }
#define SUBB(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = R##REG(R##SRCREG) + (C_FLAG?1:0); \
INT32 r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
*rd = r; \
}
static void subb_a(void) { SUBB(A); }
static void subb_b(void) { SUBB(B); }
#define SUBI_W(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 r; \
INT32 t = ~PARAM_WORD(); \
r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
*rd = r; \
}
static void subi_w_a(void) { SUBI_W(A); }
static void subi_w_b(void) { SUBI_W(B); }
#define SUBI_L(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = ~PARAM_LONG(); \
INT32 r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
*rd = r; \
}
static void subi_l_a(void) { SUBI_L(A); }
static void subi_l_b(void) { SUBI_L(B); }
#define SUBK(R) \
{ \
INT32 r; \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = PARAM_K; if (!t) t = 32; \
r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
*rd = r; \
}
static void subk_a(void) { SUBK(A); }
static void subk_b(void) { SUBK(B); }
#define XOR(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd ^= R##REG(R##SRCREG); \
SET_Z(*rd); \
}
static void xor_a(void) { XOR(A); }
static void xor_b(void) { XOR(B); }
#define XORI(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd ^= PARAM_LONG(); \
SET_Z(*rd); \
}
static void xori_a(void) { XORI(A); }
static void xori_b(void) { XORI(B); }
#define ZEXT(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
ZEXTEND(*rd,FW(F)); \
SET_Z(*rd); \
}
static void zext0_a(void) { ZEXT(0,A); }
static void zext0_b(void) { ZEXT(0,B); }
static void zext1_a(void) { ZEXT(1,A); }
static void zext1_b(void) { ZEXT(1,B); }
/* Move Instructions */
#define MOVI_W(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd=PARAM_WORD(); \
SET_NZ(*rd); \
CLR_V; \
}
static void movi_w_a(void) { MOVI_W(A); }
static void movi_w_b(void) { MOVI_W(B); }
#define MOVI_L(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd=PARAM_LONG(); \
SET_NZ(*rd); \
CLR_V; \
}
static void movi_l_a(void) { MOVI_L(A); }
static void movi_l_b(void) { MOVI_L(B); }
#define MOVK(R) \
{ \
INT32 k = PARAM_K; if (!k) k = 32; \
R##REG(R##DSTREG) = k; \
}
static void movk_a(void) { MOVK(A); }
static void movk_b(void) { MOVK(B); }
#define MOVB_RN(R) \
{ \
WBYTE(R##REG(R##DSTREG),R##REG(R##SRCREG)); \
}
static void movb_rn_a(void) { MOVB_RN(A); }
static void movb_rn_b(void) { MOVB_RN(B); }
#define MOVB_NR(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd = RBYTE(R##REG(R##SRCREG)); \
SET_NZ(*rd); \
CLR_V; \
}
static void movb_nr_a(void) { MOVB_NR(A); }
static void movb_nr_b(void) { MOVB_NR(B); }
#define MOVB_NN(R) \
{ \
WBYTE(R##REG(R##DSTREG),(UINT32)(UINT8)RBYTE(R##REG(R##SRCREG))); \
}
static void movb_nn_a(void) { MOVB_NN(A); }
static void movb_nn_b(void) { MOVB_NN(B); }
#define MOVB_R_NO(R) \
{ \
INT32 o = PARAM_WORD(); \
WBYTE(R##REG(R##DSTREG)+o,R##REG(R##SRCREG)); \
}
static void movb_r_no_a(void) { MOVB_R_NO(A); }
static void movb_r_no_b(void) { MOVB_R_NO(B); }
#define MOVB_NO_R(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 o = PARAM_WORD(); \
*rd = RBYTE(R##REG(R##SRCREG)+o); \
SET_NZ(*rd); \
CLR_V; \
}
static void movb_no_r_a(void) { MOVB_NO_R(A); }
static void movb_no_r_b(void) { MOVB_NO_R(B); }
#define MOVB_NO_NO(R) \
{ \
INT32 o1 = PARAM_WORD(); \
INT32 o2 = PARAM_WORD(); \
WBYTE(R##REG(R##DSTREG)+o2,(UINT32)(UINT8)RBYTE(R##REG(R##SRCREG)+o1)); \
}
static void movb_no_no_a(void) { MOVB_NO_NO(A); }
static void movb_no_no_b(void) { MOVB_NO_NO(B); }
#define MOVB_RA(R) \
{ \
WBYTE(PARAM_LONG(),R##REG(R##DSTREG)); \
}
static void movb_ra_a(void) { MOVB_RA(A); }
static void movb_ra_b(void) { MOVB_RA(B); }
#define MOVB_AR(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd = RBYTE(PARAM_LONG()); \
SET_NZ(*rd); \
CLR_V; \
}
static void movb_ar_a(void) { MOVB_AR(A); }
static void movb_ar_b(void) { MOVB_AR(B); }
static void movb_aa(void)
{
UINT32 bitaddrs=PARAM_LONG();
WBYTE(PARAM_LONG(),(UINT32)(UINT8)RBYTE(bitaddrs));
}
#define MOVE_RR(RS,RD) \
{ \
INT32 *rd = &RD##REG(RD##DSTREG); \
*rd = RS##REG(RS##SRCREG); \
SET_NZ(*rd); \
CLR_V; \
}
static void move_rr_a (void) { MOVE_RR(A,A); }
static void move_rr_b (void) { MOVE_RR(B,B); }
static void move_rr_ax(void) { MOVE_RR(A,B); }
static void move_rr_bx(void) { MOVE_RR(B,A); }
#define MOVE_RN(F,R) \
{ \
WFIELD##F(R##REG(R##DSTREG),R##REG(R##SRCREG)); \
}
static void move0_rn_a (void) { MOVE_RN(0,A); }
static void move0_rn_b (void) { MOVE_RN(0,B); }
static void move1_rn_a (void) { MOVE_RN(1,A); }
static void move1_rn_b (void) { MOVE_RN(1,B); }
#define MOVE_R_DN(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd-=FW_INC(F); \
WFIELD##F(*rd,R##REG(R##SRCREG)); \
}
static void move0_r_dn_a (void) { MOVE_R_DN(0,A); }
static void move0_r_dn_b (void) { MOVE_R_DN(0,B); }
static void move1_r_dn_a (void) { MOVE_R_DN(1,A); }
static void move1_r_dn_b (void) { MOVE_R_DN(1,B); }
#define MOVE_R_NI(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
WFIELD##F(*rd,R##REG(R##SRCREG)); \
*rd+=FW_INC(F); \
}
static void move0_r_ni_a (void) { MOVE_R_NI(0,A); }
static void move0_r_ni_b (void) { MOVE_R_NI(0,B); }
static void move1_r_ni_a (void) { MOVE_R_NI(1,A); }
static void move1_r_ni_b (void) { MOVE_R_NI(1,B); }
#define MOVE_NR(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd = RFIELD##F(R##REG(R##SRCREG)); \
SET_NZ(*rd); \
CLR_V; \
}
static void move0_nr_a (void) { MOVE_NR(0,A); }
static void move0_nr_b (void) { MOVE_NR(0,B); }
static void move1_nr_a (void) { MOVE_NR(1,A); }
static void move1_nr_b (void) { MOVE_NR(1,B); }
#define MOVE_DN_R(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 *rs = &R##REG(R##SRCREG); \
*rs-=FW_INC(F); \
*rd = RFIELD##F(*rs); \
SET_NZ(*rd); \
CLR_V; \
}
static void move0_dn_r_a (void) { MOVE_DN_R(0,A); }
static void move0_dn_r_b (void) { MOVE_DN_R(0,B); }
static void move1_dn_r_a (void) { MOVE_DN_R(1,A); }
static void move1_dn_r_b (void) { MOVE_DN_R(1,B); }
#define MOVE_NI_R(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 data = RFIELD##F(*rs); \
*rs+=FW_INC(F); \
*rd = data; \
SET_NZ(*rd); \
CLR_V; \
}
static void move0_ni_r_a (void) { MOVE_NI_R(0,A); }
static void move0_ni_r_b (void) { MOVE_NI_R(0,B); }
static void move1_ni_r_a (void) { MOVE_NI_R(1,A); }
static void move1_ni_r_b (void) { MOVE_NI_R(1,B); }
#define MOVE_NN(F,R) \
{ \
WFIELD##F(R##REG(R##DSTREG),RFIELD##F(R##REG(R##SRCREG))); \
}
static void move0_nn_a (void) { MOVE_NN(0,A); }
static void move0_nn_b (void) { MOVE_NN(0,B); }
static void move1_nn_a (void) { MOVE_NN(1,A); }
static void move1_nn_b (void) { MOVE_NN(1,B); }
#define MOVE_DN_DN(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 data; \
*rs-=FW_INC(F); \
data = RFIELD##F(*rs); \
*rd-=FW_INC(F); \
WFIELD##F(*rd,data); \
}
static void move0_dn_dn_a (void) { MOVE_DN_DN(0,A); }
static void move0_dn_dn_b (void) { MOVE_DN_DN(0,B); }
static void move1_dn_dn_a (void) { MOVE_DN_DN(1,A); }
static void move1_dn_dn_b (void) { MOVE_DN_DN(1,B); }
#define MOVE_NI_NI(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 data = RFIELD##F(*rs); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -