static void m68000_dbf() { UIntSubArray d_reg = new UIntSubArray(m68k_cpu.dr, (int)m68k_cpu.ir & 7); uint res = ((d_reg[0] - 1) & 0xffff); d_reg[0] = (uint)((d_reg[0]) & ~0xffff) | res; if (res != 0xffff) { ; /* auto-disable (see m68kcpu.h) */ m68k_cpu.pc += (uint)MAKE_INT_16(m68ki_read_16(m68k_cpu.pc)); m68k_clks_left[0] -= (10); return; } m68k_cpu.pc += 2; m68k_clks_left[0] -= (14); }
static void m68000_abcd_rr() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint src = (m68k_cpu.dr[m68k_cpu.ir & 7]); uint dst = d_dst[0]; uint res = ((src) & 0x0f) + ((dst) & 0x0f) + ((m68k_cpu.x_flag != 0) ? 1u : 0u); if (res > 9) res += 6; res += ((src) & 0xf0) + ((dst) & 0xf0); if ((m68k_cpu.x_flag = m68k_cpu.c_flag = (res > 0x99) ? 1u : 0) != 0) res -= 0xa0; d_dst[0] = (uint)((d_dst[0]) & ~0xff) | ((res) & 0xff); m68k_cpu.n_flag = ((res) & 0x80); /* officially undefined */ if (((res) & 0xff) != 0) m68k_cpu.not_z_flag = 1; m68k_clks_left[0] -= (6); }
static void m68000_nbcd_d() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint dst = d_dst[0]; uint res = ((0x9a - dst - (((m68k_cpu.x_flag != 0) ? 1u : 0u))) & 0xff); if (res != 0x9a) { if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; d_dst[0] = (uint)((d_dst[0]) & ~0xff) | res; if (res != 0) m68k_cpu.not_z_flag = 1; m68k_cpu.c_flag = m68k_cpu.x_flag = 1; } else m68k_cpu.c_flag = m68k_cpu.x_flag = 0; m68k_clks_left[0] -= (6); }
static void m68000_movep_er_16() { uint ea = (m68k_cpu.ar[m68k_cpu.ir & 7]) + (uint)MAKE_INT_16(((m68ki_read_imm_16()) & 0xffff)); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] =(uint) ((d_dst[0]) & ~0xffff) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2)); m68k_clks_left[0] -= (16); }
static void m68000_move_dd_i_32() { uint res = m68ki_read_imm_32(); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 8); }
static void m68000_move_dd_di_32() { uint res = m68ki_read_32(((m68k_cpu.ar[m68k_cpu.ir & 7]) + (uint)MAKE_INT_16(m68ki_read_imm_16()))); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 12); }
static void m68000_divs_i_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); int src = MAKE_INT_16(m68ki_read_imm_16()); m68k_cpu.c_flag = 0; if (src != 0) { int quotient = MAKE_INT_32(d_dst[0]) / src; int remainder = MAKE_INT_32(d_dst[0]) % src; if (quotient == MAKE_INT_16(quotient)) { m68k_cpu.not_z_flag = (uint)quotient; m68k_cpu.n_flag = (uint)((quotient) & 0x8000); m68k_cpu.v_flag = 0; d_dst[0] = (uint)(((quotient) & 0xffff) | (remainder << 16)); m68k_clks_left[0] -= (158 + 4); return; } m68k_cpu.v_flag = 1; m68k_clks_left[0] -= (158 + 4); return; } m68ki_interrupt(5); }
static void m68000_move_dd_pi_16() { uint res = m68ki_read_16((((m68k_cpu.ar[m68k_cpu.ir & 7]) += 2) - 2)); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = (uint)((d_dst[0]) & ~0xffff) | res; m68k_cpu.n_flag = ((res) & 0x8000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 4); }
static void m68000_lsl_r_32() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint shift = (m68k_cpu.dr[(m68k_cpu.ir >> 9) & 7]) & 0x3f; uint src = d_dst[0]; uint res = (src << (int)shift); m68k_clks_left[0] -= (int)((shift << 1) + 8); if (shift != 0) { if (shift < 32) { d_dst[0] = res; m68k_cpu.x_flag = m68k_cpu.c_flag = (src >> (int)(32 - shift)) & 1; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = 0; return; } d_dst[0] = 0; m68k_cpu.x_flag = m68k_cpu.c_flag = (shift == 32 ? src & 1 : 0); m68k_cpu.n_flag = 0; m68k_cpu.not_z_flag = 0; m68k_cpu.v_flag = 0; return; } m68k_cpu.c_flag = 0; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = 0; }
static void m68000_mulu_i_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint res = m68ki_read_imm_16() * ((d_dst[0]) & 0xffff); d_dst[0] = res; m68k_cpu.not_z_flag = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (54 + 4); }
static void m68000_mulu_pcdi_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint old_pc = (m68k_cpu.pc += 2) - 2; uint ea = old_pc + (uint)MAKE_INT_16(m68ki_read_16(old_pc)); uint res = m68ki_read_16(ea) * ((d_dst[0]) & 0xffff); d_dst[0] = res; m68k_cpu.not_z_flag = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (54 + 8); }
static void m68000_muls_pcix_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint res = (uint)MAKE_INT_16(m68ki_read_16(m68ki_get_ea_pcix())) * (uint)MAKE_INT_16(((d_dst[0]) & 0xffff)); d_dst[0] = res; m68k_cpu.not_z_flag = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (54 + 10); }
static void m68020_cas2_32() { if ((m68k_cpu.mode & (4 | 8)) != 0) { uint word2 = m68ki_read_imm_32(); UIntSubArray r_src1 = new UIntSubArray(m68k_cpu.dr,(int)(word2 >> 16) & 7); uint ea1 = m68k_cpu_dar[word2 >> 31][(int)(word2 >> 28) & 7]; uint dst1 = m68ki_read_32(ea1); uint res1 = (dst1 - r_src1[0]); UIntSubArray r_src2 = new UIntSubArray(m68k_cpu.dr, (int)word2 & 7); uint ea2 = m68k_cpu_dar[word2 >> 15][(int)(word2 >> 12) & 7]; uint dst2 = m68ki_read_32(ea2); uint res2; ; /* auto-disable (see m68kcpu.h) */ m68k_cpu.n_flag = ((res1) & 0x80000000); m68k_cpu.not_z_flag = res1; m68k_cpu.v_flag = (((~r_src1[0] & dst1 & ~res1) | (r_src1[0] & ~dst1 & res1)) & 0x80000000); m68k_cpu.c_flag = (((r_src1[0] & ~dst1) | (res1 & ~dst1) | (r_src1[0] & res1)) & 0x80000000); if (m68k_cpu.not_z_flag==0) { res2 = (dst2 - r_src2[0]); m68k_cpu.n_flag = ((res2) & 0x80000000); m68k_cpu.not_z_flag = res2; m68k_cpu.v_flag = (((~r_src2[0] & dst2 & ~res2) | (r_src2[0] & ~dst2 & res2)) & 0x80000000); m68k_cpu.c_flag = (((r_src2[0] & ~dst2) | (res2 & ~dst2) | (r_src2[0] & res2)) & 0x80000000); if (m68k_cpu.not_z_flag==0) { m68ki_write_32(ea1, m68k_cpu.dr[(word2 >> 22) & 7]); m68ki_write_32(ea2, m68k_cpu.dr[(word2 >> 6) & 7]); m68k_clks_left[0] -= (22); return; } } r_src1[0] = dst1; r_src2[0] = dst2; m68k_clks_left[0] -= (25); return; } m68000_illegal(); }
static void m68020_cas_al_32() { if ((m68k_cpu.mode & (4 | 8)) != 0) { uint word2 = m68ki_read_imm_16(); uint ea = m68ki_read_imm_32(); uint dst = m68ki_read_32(ea); UIntSubArray d_src = new UIntSubArray(m68k_cpu.dr,(int)word2 & 7); uint res = (dst - d_src[0]); ; /* auto-disable (see m68kcpu.h) */ m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = (((~d_src[0] & dst & ~res) | (d_src[0] & ~dst & res)) & 0x80000000); m68k_cpu.c_flag = (((d_src[0] & ~dst) | (res & ~dst) | (d_src[0] & res)) & 0x80000000); if (m68k_cpu.not_z_flag!=0) d_src[0] = dst; else m68ki_write_32(ea, m68k_cpu.dr[(word2 >> 6) & 7]); m68k_clks_left[0] -= (15 + 16); return; } m68000_illegal(); }
static void m68000_add_er_i_32() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint src = m68ki_read_imm_32(); uint dst = d_dst[0]; uint res = d_dst[0] = (src + dst); m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = (((src & dst & ~res) | (~src & ~dst & res)) & 0x80000000); m68k_cpu.x_flag = m68k_cpu.c_flag = (((src & dst) | (~res & dst) | (src & ~res)) & 0x80000000); m68k_clks_left[0] -= (6 + 10); }
static void m68000_lsl_s_32() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint shift = (((m68k_cpu.ir >> 9) - 1) & 7) + 1; uint src = d_dst[0]; uint res = (src << (int)shift); d_dst[0] = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.x_flag = m68k_cpu.c_flag = (src >> (int)(32 - shift)) & 1; m68k_cpu.v_flag = 0; m68k_clks_left[0] -= (int)((shift << 1) + 8); }
static void m68000_lsl_r_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint shift = (m68k_cpu.dr[(m68k_cpu.ir >> 9) & 7]) & 0x3f; uint src = ((d_dst[0]) & 0xffff); uint res = ((src << (int)shift) & 0xffff); m68k_clks_left[0] -= (int)((shift << 1) + 6); if (shift != 0) { if (shift <= 16) { d_dst[0] = (uint)((d_dst[0]) & ~0xffff) | res; m68k_cpu.x_flag = m68k_cpu.c_flag = (src >> (int)(16 - shift)) & 1; m68k_cpu.n_flag = ((res) & 0x8000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = 0; return; } d_dst[0] &= 0xffff0000; m68k_cpu.x_flag = m68k_cpu.c_flag = 0; m68k_cpu.n_flag = 0; m68k_cpu.not_z_flag = 0; m68k_cpu.v_flag = 0; return; } m68k_cpu.c_flag = 0; m68k_cpu.n_flag = ((res) & 0x8000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = 0; }
static void m68000_exg_da() { UIntSubArray reg_a = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); UIntSubArray reg_b = new UIntSubArray(m68k_cpu.ar, (int)m68k_cpu.ir & 7); uint tmp = reg_a[0]; reg_a[0] = reg_b[0]; reg_b[0] = tmp; m68k_clks_left[0] -= (6); }
static void m68000_move_dd_aw_8() { uint res = m68ki_read_8((uint)MAKE_INT_16(m68ki_read_imm_16())); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = (uint)((d_dst[0]) & ~0xff) | res; m68k_cpu.n_flag = ((res) & 0x80); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 8); }
static void m68000_ext_32() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); d_dst[0] = ((d_dst[0]) & 0xffff) | (((d_dst[0]) & 0x8000) != 0 ? 0xffff0000 : 0); m68k_cpu.n_flag = ((d_dst[0]) & 0x80000000); m68k_cpu.not_z_flag = d_dst[0]; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4); }
static void m68000_move_dd_pcix_16() { uint res = m68ki_read_16(m68ki_get_ea_pcix()); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = (uint)((d_dst[0]) & ~0xffff) | res; m68k_cpu.n_flag = ((res) & 0x8000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 10); }
static void m68020_extb() { if ((m68k_cpu.mode & (4 | 8)) != 0) { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); d_dst[0] = ((d_dst[0]) & 0xff) | (((d_dst[0]) & 0x80) != 0 ? 0xffffff00 : 0); m68k_cpu.n_flag = ((d_dst[0]) & 0x80000000); m68k_cpu.not_z_flag = d_dst[0]; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4); return; } m68000_illegal(); }
static void m68000_move_dd_a_32() { uint res = ((m68k_cpu.ar[m68k_cpu.ir & 7])); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4); }
static void m68000_link_16() { UIntSubArray a_dst = new UIntSubArray(m68k_cpu.ar, m68k_cpu.ir & 7); m68ki_write_32(m68k_cpu.ar[7] -= 4, a_dst[0]); a_dst[0] = m68k_cpu.ar[7]; m68k_cpu.ar[7] = (m68k_cpu.ar[7] + (uint)MAKE_INT_16(m68ki_read_imm_16())); m68k_clks_left[0] -= (16); }
static void m68000_move_dd_pcdi_32() { uint old_pc = (m68k_cpu.pc += 2) - 2; uint ea = old_pc + (uint)MAKE_INT_16(m68ki_read_16(old_pc)); uint res = m68ki_read_32(ea); UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); d_dst[0] = res; m68k_cpu.n_flag = ((res) & 0x80000000); m68k_cpu.not_z_flag = res; m68k_cpu.v_flag = m68k_cpu.c_flag = 0; m68k_clks_left[0] -= (4 + 12); }
static void m68020_link_32() { if ((m68k_cpu.mode & (4 | 8)) != 0) { UIntSubArray a_dst = new UIntSubArray(m68k_cpu.ar, m68k_cpu.ir & 7); m68ki_write_32(m68k_cpu.ar[7] -= 4, a_dst[0]); a_dst[0] = m68k_cpu.ar[7]; m68k_cpu.ar[7] = (m68k_cpu.ar[7] + m68ki_read_imm_32()); m68k_clks_left[0] -= (16); return; } m68000_illegal(); }
static void m68000_divu_pcdi_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint old_pc = (m68k_cpu.pc += 2) - 2; uint ea = old_pc + (uint)MAKE_INT_16(m68ki_read_16(old_pc)); uint src = m68ki_read_16(ea); m68k_cpu.c_flag = 0; if (src != 0) { uint quotient = d_dst[0] / src; uint remainder = d_dst[0] % src; if (quotient < 0x10000) { m68k_cpu.not_z_flag = quotient; m68k_cpu.n_flag = ((quotient) & 0x8000); m68k_cpu.v_flag = 0; d_dst[0] = (((quotient) & 0xffff) | (remainder << 16)); m68k_clks_left[0] -= (140 + 8); return; } m68k_cpu.v_flag = 1; m68k_clks_left[0] -= (140 + 8); return; } m68ki_interrupt(5); }
static void m68000_lsr_s_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint shift = (((m68k_cpu.ir >> 9) - 1) & 7) + 1; uint src = ((d_dst[0]) & 0xffff); uint res = src >> (int)shift; d_dst[0] = (uint)((d_dst[0]) & ~0xffff) | res; m68k_cpu.n_flag = 0; m68k_cpu.not_z_flag = res; m68k_cpu.x_flag = m68k_cpu.c_flag = (src >> (int)(shift - 1)) & 1; m68k_cpu.v_flag = 0; m68k_clks_left[0] -= (int)((shift << 1) + 6); }
static void m68000_divu_i_16() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, (int)(m68k_cpu.ir >> 9) & 7); uint src = m68ki_read_imm_16(); m68k_cpu.c_flag = 0; if (src != 0) { uint quotient = d_dst[0] / src; uint remainder = d_dst[0] % src; if (quotient < 0x10000) { m68k_cpu.not_z_flag = quotient; m68k_cpu.n_flag = ((quotient) & 0x8000); m68k_cpu.v_flag = 0; d_dst[0] = (((quotient) & 0xffff) | (remainder << 16)); m68k_clks_left[0] -= (140 + 4); return; } m68k_cpu.v_flag = 1; m68k_clks_left[0] -= (140 + 4); return; } m68ki_interrupt(5); }
static void m68000_lsl_s_8() { UIntSubArray d_dst = new UIntSubArray(m68k_cpu.dr, m68k_cpu.ir & 7); uint shift = (((m68k_cpu.ir >> 9) - 1) & 7) + 1; uint src = ((d_dst[0]) & 0xff); uint res = ((src << (int)shift) & 0xff); d_dst[0] = (uint)((d_dst[0]) & ~0xff) | res; m68k_cpu.n_flag = ((res) & 0x80); m68k_cpu.not_z_flag = res; m68k_cpu.x_flag = m68k_cpu.c_flag = shift > 8 ? 0 : (src >> (int)(8 - shift)) & 1; m68k_cpu.v_flag = 0; m68k_clks_left[0] -= (int)((shift << 1) + 6); }