📄 34010ops.c
字号:
static void cmp_xy_b(void) { CMP_XY(B); }
#define CPW(R) \
{ \
INT32 res = 0; \
INT16 x = GET_X(R##REG(R##SRCREG)); \
INT16 y = GET_Y(R##REG(R##SRCREG)); \
INT16 wstartx = GET_X(WSTART); \
INT16 wstarty = GET_Y(WSTART); \
INT16 wendx = GET_X(WEND); \
INT16 wendy = GET_Y(WEND); \
\
res |= ((wstartx > x) ? 0x20 : 0); \
res |= ((x > wendx) ? 0x40 : 0); \
res |= ((wstarty > y) ? 0x80 : 0); \
res |= ((y > wendy) ? 0x100 : 0); \
R##REG(R##DSTREG) = V_FLAG = res; \
}
static void cpw_a(void) { CPW(A); }
static void cpw_b(void) { CPW(B); }
#define CVXYL(R) \
{ \
R##REG(R##DSTREG) = XYTOL(R##REG(R##SRCREG)); \
}
static void cvxyl_a(void) { CVXYL(A); }
static void cvxyl_b(void) { CVXYL(B); }
#define MOVX(R) \
{ \
INT16 x = GET_X(R##REG(R##SRCREG)); \
INT16 y = GET_Y(R##REG(R##DSTREG)); \
R##REG(R##DSTREG) = COMBINE_XY(x,y); \
}
static void movx_a(void) { MOVX(A); }
static void movx_b(void) { MOVX(B); }
#define MOVY(R) \
{ \
INT16 x = GET_X(R##REG(R##DSTREG)); \
INT16 y = GET_Y(R##REG(R##SRCREG)); \
R##REG(R##DSTREG) = COMBINE_XY(x,y); \
}
static void movy_a(void) { MOVY(A); }
static void movy_b(void) { MOVY(B); }
#define PIXT_RI(R) \
{ \
WPIXEL(R##REG(R##DSTREG),R##REG(R##SRCREG)); \
FINISH_PIX_OP; \
}
static void pixt_ri_a(void) { PIXT_RI(A); }
static void pixt_ri_b(void) { PIXT_RI(B); }
#define PIXT_RIXY(R) \
{ \
WPIXEL(XYTOL(R##REG(R##DSTREG)),R##REG(R##SRCREG)); \
FINISH_PIX_OP; \
}
static void pixt_rixy_a(void) { PIXT_RIXY(A); }
static void pixt_rixy_b(void) { PIXT_RIXY(B); }
#define PIXT_IR(R) \
{ \
R##REG(R##DSTREG) = V_FLAG = RPIXEL(R##REG(R##SRCREG)); \
FINISH_PIX_OP; \
}
static void pixt_ir_a(void) { PIXT_IR(A); }
static void pixt_ir_b(void) { PIXT_IR(B); }
#define PIXT_II(R) \
{ \
WPIXEL(R##REG(R##DSTREG),RPIXEL(R##REG(R##SRCREG))); \
FINISH_PIX_OP; \
}
static void pixt_ii_a(void) { PIXT_II(A); }
static void pixt_ii_b(void) { PIXT_II(B); }
#define PIXT_IXYR(R) \
{ \
R##REG(R##DSTREG) = V_FLAG = RPIXEL(XYTOL(R##REG(R##SRCREG))); \
FINISH_PIX_OP; \
}
static void pixt_ixyr_a(void) { PIXT_IXYR(A); }
static void pixt_ixyr_b(void) { PIXT_IXYR(B); }
#define PIXT_IXYIXY(R) \
{ \
WPIXEL(XYTOL(R##REG(R##DSTREG)),RPIXEL(XYTOL(R##REG(R##SRCREG)))); \
FINISH_PIX_OP; \
}
static void pixt_ixyixy_a(void) { PIXT_IXYIXY(A); }
static void pixt_ixyixy_b(void) { PIXT_IXYIXY(B); }
#define DRAV(R) \
{ \
INT16 x1,y1,x2,y2,newx,newy; \
\
WPIXEL(XYTOL(R##REG(R##DSTREG)),COLOR1); \
\
x1 = GET_X(R##REG(R##DSTREG)); \
y1 = GET_Y(R##REG(R##DSTREG)); \
x2 = GET_X(R##REG(R##SRCREG)); \
y2 = GET_Y(R##REG(R##SRCREG)); \
newx = x1+x2; \
newy = y1+y2; \
R##REG(R##DSTREG) = COMBINE_XY(newx,newy); \
FINISH_PIX_OP; \
}
static void drav_a(void) { DRAV(A); }
static void drav_b(void) { DRAV(B); }
/* General Instructions */
#define ABS(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 r = 0 - *rd; \
SET_NZV_SUB(0,*rd,r); \
if (!N_FLAG) \
{ \
*rd = r; \
} \
}
static void abs_a(void) { ABS(A); }
static void abs_b(void) { ABS(B); }
#define ADD(R) \
{ \
INT32 a = R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 b = *rd; \
INT32 r = *rd = a + b; \
SET_NZCV_ADD(a,b,r); \
}
static void add_a(void) { ADD(A); }
static void add_b(void) { ADD(B); }
#define ADDC(R) \
{ \
/* I'm not sure to which side the carry is added to, should */ \
/* verify it against the examples */ \
INT32 a = R##REG(R##SRCREG) + (C_FLAG?1:0); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 b = *rd; \
INT32 r = *rd = a + b; \
SET_NZCV_ADD(a,b,r); \
}
static void addc_a(void) { ADDC(A); }
static void addc_b(void) { ADDC(B); }
#define ADDI_W(R) \
{ \
INT32 a = PARAM_WORD(); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 b = *rd; \
INT32 r = *rd = a + b; \
SET_NZCV_ADD(a,b,r); \
}
static void addi_w_a(void) { ADDI_W(A); }
static void addi_w_b(void) { ADDI_W(B); }
#define ADDI_L(R) \
{ \
INT32 a = PARAM_LONG(); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 b = *rd; \
INT32 r = *rd = a + b; \
SET_NZCV_ADD(a,b,r); \
}
static void addi_l_a(void) { ADDI_L(A); }
static void addi_l_b(void) { ADDI_L(B); }
#define ADDK(R) \
{ \
INT32 r,b,*rd; \
INT32 a = PARAM_K; if (!a) a = 32; \
rd = &R##REG(R##DSTREG); \
b = *rd; \
r = *rd = a + b; \
SET_NZCV_ADD(a,b,r); \
}
static void addk_a(void) { ADDK(A); }
static void addk_b(void) { ADDK(B); }
#define AND(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd &= R##REG(R##SRCREG); \
SET_Z(*rd); \
}
static void and_a(void) { AND(A); }
static void and_b(void) { AND(B); }
#define ANDI(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd &= ~PARAM_LONG(); \
SET_Z(*rd); \
}
static void andi_a(void) { ANDI(A); }
static void andi_b(void) { ANDI(B); }
#define ANDN(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
*rd &= ~R##REG(R##SRCREG); \
SET_Z(*rd); \
}
static void andn_a(void) { ANDN(A); }
static void andn_b(void) { ANDN(B); }
#define BTST_K(R) \
{ \
SET_Z(R##REG(R##DSTREG) & (1<<(31-PARAM_K))); \
}
static void btst_k_a(void) { BTST_K(A); }
static void btst_k_b(void) { BTST_K(B); }
#define BTST_R(R) \
{ \
SET_Z(R##REG(R##DSTREG) & (1<<(R##REG(R##SRCREG)&0x1f))); \
}
static void btst_r_a(void) { BTST_R(A); }
static void btst_r_b(void) { BTST_R(B); }
static void clrc(void)
{
C_FLAG = 0;
}
#define CMP(R) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 r = *rd - *rs; \
SET_NZCV_SUB(*rd,*rs,r); \
}
static void cmp_a(void) { CMP(A); }
static void cmp_b(void) { CMP(B); }
#define CMPI_W(R) \
{ \
INT32 r; \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = ~PARAM_WORD(); \
r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
}
static void cmpi_w_a(void) { CMPI_W(A); }
static void cmpi_w_b(void) { CMPI_W(B); }
#define CMPI_L(R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
INT32 t = ~PARAM_LONG(); \
INT32 r = *rd - t; \
SET_NZCV_SUB(*rd,t,r); \
}
static void cmpi_l_a(void) { CMPI_L(A); }
static void cmpi_l_b(void) { CMPI_L(B); }
static void dint(void)
{
IE_FLAG = 0;
}
#define DIVS(R,N) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd1 = &R##REG(R##DSTREG); \
V_FLAG = N_FLAG = 0; \
NOTZ_FLAG = 1; \
if (!(R##DSTREG & (1*N))) \
{ \
if (!*rs) \
{ \
V_FLAG = 0; \
} \
else \
{ \
INT32 *rd2 = &R##REG(R##DSTREG+N); \
INT64 dividend = COMBINE_64_32_32(*rd1, *rd2); \
INT64 quotient = DIV_64_64_32(dividend, *rs); \
INT32 remainder = MOD_32_64_32(dividend, *rs); \
UINT32 signbits = ((quotient & 0x80000000) ? 0xffffffff : 0); \
if (HI32_32_64(quotient) != signbits) \
{ \
V_FLAG = 0; \
} \
else \
{ \
*rd1 = quotient; \
*rd2 = remainder; \
SET_NZ(*rd1); \
} \
} \
} \
else \
{ \
if (!*rs) \
{ \
V_FLAG = 0; \
} \
else \
{ \
*rd1 /= *rs; \
SET_NZ(*rd1); \
} \
} \
}
static void divs_a(void) { DIVS(A,1 ); }
static void divs_b(void) { DIVS(B,0x10); }
#define DIVU(R,N) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd1 = &R##REG(R##DSTREG); \
V_FLAG = 0; \
NOTZ_FLAG = 1; \
if (!(R##DSTREG & (1*N))) \
{ \
if (!*rs) \
{ \
V_FLAG = 0; \
} \
else \
{ \
INT32 *rd2 = &R##REG(R##DSTREG+N); \
UINT64 dividend = COMBINE_U64_U32_U32(*rd1, *rd2); \
UINT64 quotient = DIV_U64_U64_U32(dividend, *rs); \
UINT32 remainder = MOD_U32_U64_U32(dividend, *rs); \
if (HI32_U32_U64(quotient) != 0) \
{ \
V_FLAG = 0; \
} \
else \
{ \
*rd1 = quotient; \
*rd2 = remainder; \
SET_Z(*rd1); \
} \
} \
} \
else \
{ \
if (!*rs) \
{ \
V_FLAG = 0; \
} \
else \
{ \
*rd1 = (UINT32)*rd1 / (UINT32)*rs; \
SET_Z(*rd1); \
} \
} \
}
static void divu_a(void) { DIVU(A,1 ); }
static void divu_b(void) { DIVU(B,0x10); }
static void eint(void)
{
IE_FLAG = 1;
}
#define EXGF(F,R) \
{ \
INT32 *rd = &R##REG(R##DSTREG); \
UINT32 temp = (FE##F##_FLAG ? 0x20 : 0) | FW(F); \
FE##F##_FLAG = (*rd&0x20); \
FW(F) = (*rd&0x1f); \
SET_FW(); \
*rd = temp; \
}
static void exgf0_a(void) { EXGF(0,A); }
static void exgf0_b(void) { EXGF(0,B); }
static void exgf1_a(void) { EXGF(1,A); }
static void exgf1_b(void) { EXGF(1,B); }
#define LMO(R) \
{ \
UINT32 res = 0; \
UINT32 rs = R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
SET_Z(rs); \
if (rs) \
{ \
while (!(rs & 0x80000000)) \
{ \
res++; \
rs <<= 1; \
} \
} \
*rd = res; \
}
static void lmo_a(void) { LMO(A); }
static void lmo_b(void) { LMO(B); }
#define MMFM(R,N) \
{ \
INT32 i; \
UINT16 l = (UINT16) PARAM_WORD(); \
if (R##DSTREG == 15*N) \
{ \
UINT32 bitaddr1 = SP; \
UINT8 *bitaddr2 = STACKPTR(bitaddr1); \
for (i = 15; i >= 0 ; i--) \
{ \
if (l & 0x8000) \
{ \
R##REG(i*N) = READ_WORD(bitaddr2) + (READ_WORD(bitaddr2+2) << 16); \
bitaddr1 += 0x20; \
bitaddr2 += 4; \
} \
l <<= 1; \
} \
SP = bitaddr1; \
} \
else \
{ \
INT32 rd = R##DSTREG; \
for (i = 15; i >= 0 ; i--) \
{ \
if (l & 0x8000) \
{ \
R##REG(i*N) = RLONG(R##REG(rd)); \
R##REG(rd) += 0x20; \
} \
l <<= 1; \
} \
} \
}
static void mmfm_a(void) { MMFM(A,1 ); }
static void mmfm_b(void) { MMFM(B,0x10); }
#define MMTM(R,N) \
{ \
UINT32 i; \
UINT16 l = (UINT16) PARAM_WORD(); \
if (R##DSTREG == 15*N) \
{ \
UINT32 bitaddr1 = SP; \
UINT8 *bitaddr2 = STACKPTR(bitaddr1); \
SET_N(bitaddr1^0x80000000); \
for (i = 0; i < 16; i++) \
{ \
if (l & 0x8000) \
{ \
UINT32 reg = R##REG(i*N); \
bitaddr1 -= 0x20; \
bitaddr2 -= 4; \
WRITE_WORD(bitaddr2 , (UINT16)reg); \
WRITE_WORD(bitaddr2+2, reg >> 16); \
} \
l <<= 1; \
} \
SP = bitaddr1; \
} \
else \
{ \
INT32 rd = R##DSTREG; \
SET_N(R##REG(rd)^0x80000000); \
for (i = 0; i < 16; i++) \
{ \
if (l & 0x8000) \
{ \
R##REG(rd) -= 0x20; \
WLONG(R##REG(rd),R##REG(i*N)); \
} \
l <<= 1; \
} \
} \
}
static void mmtm_a(void) { MMTM(A,1 ); }
static void mmtm_b(void) { MMTM(B,0x10); }
#define MODS(R) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
V_FLAG = (*rs == 0); \
if (!V_FLAG) \
{ \
*rd %= *rs; \
SET_Z(*rd); \
} \
}
static void mods_a(void) { MODS(A); }
static void mods_b(void) { MODS(B); }
#define MODU(R) \
{ \
INT32 *rs = &R##REG(R##SRCREG); \
INT32 *rd = &R##REG(R##DSTREG); \
V_FLAG = (*rs == 0); \
if (!V_FLAG) \
{ \
*rd = (UINT32)*rd % (UINT32)*rs; \
SET_Z(*rd); \
} \
}
static void modu_a(void) { MODU(A); }
static void modu_b(void) { MODU(B); }
#define MPYS(R,N) \
{ \
INT32 *rd1 = &R##REG(R##DSTREG); \
\
INT32 m1 = R##REG(R##SRCREG); \
SEXTEND(m1, FW(1)); \
\
if (!(R##DSTREG & (1*N))) \
{ \
INT64 product = MUL_64_32_32(m1, *rd1); \
*rd1 = HI32_32_64(product); \
R##REG(R##DSTREG+N) = LO32_32_64(product); \
SET_Z(product!=0); \
SET_N(*rd1); \
} \
else \
{ \
*rd1 *= m1; \
SET_NZ(*rd1); \
} \
}
static void mpys_a(void) { MPYS(A,1 ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -