# license:m_BSD-3-Clause # copyright-holders:Olivier Galibert # 65ce02 opcodes, a lot only remove dummy read/write cycles, some are new, some use the m_B register adc_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_imm m_TMP = read_pc(); m_PC++; do_adc(m_TMP); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); adc_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); do_adc(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); and_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); m_A &= m_TMP2; set_nz(m_A); prefetch(); and_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); m_A &= m_TMP2; set_nz(m_A); prefetch(); asl_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_ce_acc m_A = do_asl(m_A); prefetch(); asl_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asr_acc m_A = do_asr(m_A); prefetch(); asr_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_asr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asr_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2 = do_asr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asw_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP3 = read(m_TMP); m_TMP3 = set_h(m_TMP3, read(m_TMP+1)); m_P &= ~(F_C|F_N|F_Z); if(m_TMP3 & 0x8000) m_P |= F_C; m_TMP3 <<= 1; if(!m_TMP3) m_P |= F_Z; else if(m_TMP3 & 0x8000) m_P |= F_N; write(m_TMP, m_TMP3); write(m_TMP, m_TMP3 >> 8); prefetch(); aug_iw3 read_pc(); m_PC++; read_pc(); m_PC++; read_pc(); m_PC++; prefetch(); bbr_ce_zpb // Access pattern uncertain m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP = read_pc(); m_PC++; if(!(m_TMP2 & (1 << ((m_inst_state >> 4) & 7)))) m_PC += int8_t(m_TMP); prefetch(); bbs_ce_zpb // Access pattern uncertain m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP = read_pc(); m_PC++; if(m_TMP2 & (1 << ((m_inst_state >> 4) & 7))) m_PC += int8_t(m_TMP); prefetch(); bcc_ce_rel m_TMP = read_pc(); m_PC++; if(!(m_P & F_C)) m_PC += int8_t(m_TMP); prefetch(); bcc_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(!(m_P & F_C)) m_PC += m_TMP-1; prefetch(); bcs_ce_rel m_TMP = read_pc(); m_PC++; if(m_P & F_C) m_PC += int8_t(m_TMP); prefetch(); bcs_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(m_P & F_C) m_PC += m_TMP-1; prefetch(); beq_ce_rel m_TMP = read_pc(); m_PC++; if(m_P & F_Z) m_PC += int8_t(m_TMP); prefetch(); beq_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(m_P & F_Z) m_PC += m_TMP-1; prefetch(); bit_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); do_bit(m_TMP2); prefetch(); bit_ce_imm m_TMP = read_pc(); m_PC++; do_bit(m_TMP); prefetch(); bit_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); do_bit(m_TMP2); prefetch(); bit_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); do_bit(m_TMP2); prefetch(); bmi_ce_rel m_TMP = read_pc(); m_PC++; if(m_P & F_N) m_PC += int8_t(m_TMP); prefetch(); bmi_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(m_P & F_N) m_PC += m_TMP-1; prefetch(); bne_ce_rel m_TMP = read_pc(); m_PC++; if(!(m_P & F_Z)) m_PC += int8_t(m_TMP); prefetch(); bne_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(!(m_P & F_Z)) m_PC += m_TMP-1; prefetch(); bpl_ce_rel m_TMP = read_pc(); m_PC++; if(!(m_P & F_N)) m_PC += int8_t(m_TMP); prefetch(); bpl_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(!(m_P & F_N)) m_PC += m_TMP-1; prefetch(); bra_ce_rel m_TMP = read_pc(); m_PC++; m_PC += int8_t(m_TMP); prefetch(); bra_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC += m_TMP; prefetch(); brk_ce_imp if(m_irq_taken) { read_pc(); } else { read_pc(); m_PC++; } write(m_SP, m_PC >> 8); dec_SP_ce(); write(m_SP, m_PC); dec_SP_ce(); write(m_SP, m_irq_taken || m_nmi_pending ? m_P & ~F_B : m_P); dec_SP_ce(); if(m_nmi_pending) { m_PC = read_arg(0xfffa); m_PC = set_h(m_PC, read_arg(0xfffb)); m_nmi_pending = false; } else { m_PC = read_arg(0xfffe); m_PC = set_h(m_PC, read_arg(0xffff)); } m_irq_taken = false; m_P = (m_P | F_I) & ~F_D; // Do *not* move after the prefetch prefetch(); m_inst_state = -1; bsr_rw2 m_TMP = read_pc(); m_PC++; write(m_SP, m_PC>>8); dec_SP_ce(); write(m_SP, m_PC); dec_SP_ce(); m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC += m_TMP-1; prefetch(); bvc_ce_rel m_TMP = read_pc(); m_PC++; if(!(m_P & F_V)) m_PC += int8_t(m_TMP); prefetch(); bvc_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(!(m_P & F_V)) m_PC += m_TMP-1; prefetch(); bvs_ce_rel m_TMP = read_pc(); m_PC++; if(m_P & F_V) m_PC += int8_t(m_TMP); prefetch(); bvs_rw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(m_P & F_V) m_PC += m_TMP-1; prefetch(); clc_ce_imp m_P &= ~F_C; prefetch(); cld_ce_imp m_P &= ~F_D; prefetch(); cle_imp read_pc(); m_P &= ~F_E; logerror("CLE\n"); prefetch(); cli_ce_imp prefetch(); m_P &= ~F_I; // Do *not* move it before the prefetch clv_ce_imp m_P &= ~F_V; prefetch(); cmp_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); do_cmp(m_A, m_TMP2); prefetch(); cmp_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); do_cmp(m_A, m_TMP2); prefetch(); cmp_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); do_cmp(m_A, m_TMP2); prefetch(); cmp_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); do_cmp(m_A, m_TMP2); prefetch(); cmp_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); do_cmp(m_A, m_TMP2); prefetch(); cmp_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_cmp(m_A, m_TMP2); prefetch(); cmp_ce_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); do_cmp(m_A, m_TMP2); prefetch(); cpx_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_cmp(m_X, m_TMP2); prefetch(); cpy_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_cmp(m_Y, m_TMP2); prefetch(); cpz_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); do_cmp(m_Z, m_TMP2); prefetch(); cpz_imm m_TMP = read_pc(); m_PC++; do_cmp(m_Z, m_TMP); prefetch(); cpz_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_cmp(m_Z, m_TMP2); prefetch(); dec_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_ce_acc m_A--; set_nz(m_A); prefetch(); dec_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dew_zpg m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_P &= ~(F_N|F_Z); m_TMP--; if(!m_TMP) m_P |= F_Z; else if(m_TMP & 0x8000) m_P |= F_N; m_TMP2--; write(m_B|m_TMP2, m_TMP); m_TMP2++; write(m_B|m_TMP2, m_TMP >> 8); prefetch(); dex_ce_imp m_X--; set_nz(m_X); prefetch(); dey_ce_imp m_Y--; set_nz(m_Y); prefetch(); dez_imp m_Z--; set_nz(m_Z); prefetch(); eor_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); m_A ^= m_TMP2; set_nz(m_A); prefetch(); eor_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); m_A ^= m_TMP2; set_nz(m_A); prefetch(); inc_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_ce_acc m_A++; set_nz(m_A); prefetch(); inc_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inw_zpg m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_P &= ~(F_N|F_Z); m_TMP++; if(!m_TMP) m_P |= F_Z; else if(m_TMP & 0x8000) m_P |= F_N; m_TMP2--; write(m_B|m_TMP2, m_TMP); m_TMP2++; write(m_B|m_TMP2, m_TMP >> 8); prefetch(); inx_ce_imp m_X++; set_nz(m_X); prefetch(); iny_ce_imp m_Y++; set_nz(m_Y); prefetch(); inz_imp m_Z++; set_nz(m_Z); prefetch(); jmp_ce_iax m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); jmp_ce_ind m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); jsr_ce_adr m_TMP = read_pc(); m_PC++; write(m_SP, m_PC>>8); dec_SP_ce(); write(m_SP, m_PC); dec_SP_ce(); m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC = m_TMP; prefetch(); jsr_iax m_TMP = read_pc(); m_PC++; write(m_SP, m_PC>>8); dec_SP_ce(); write(m_SP, m_PC); dec_SP_ce(); m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); m_PC += m_X; prefetch(); jsr_ind m_TMP = read_pc(); m_PC++; write(m_SP, m_PC>>8); dec_SP_ce(); write(m_SP, m_PC); dec_SP_ce(); m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); lda_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_A = read(m_TMP + m_X); set_nz(m_A); prefetch(); lda_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_A = read(m_TMP + m_Y); set_nz(m_A); prefetch(); lda_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_A = read(m_TMP); set_nz(m_A); prefetch(); lda_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_A = read(m_TMP+m_Y); set_nz(m_A); prefetch(); lda_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_A = read(m_TMP+m_Z); set_nz(m_A); prefetch(); lda_isy read_pc(); m_TMP = read_pc(); m_PC++; if(m_P & F_E) m_TMP = set_l(m_SP, m_SP+m_TMP); else m_TMP = m_SP + m_TMP; m_TMP2 = read(m_TMP); m_TMP++; m_TMP = m_TMP2 | (read(m_TMP) << 8); m_A = read(m_TMP+m_Y); set_nz(m_A); prefetch(); lda_ce_zpg m_TMP = read_pc(); m_PC++; m_A = read(m_B|m_TMP); set_nz(m_A); prefetch(); lda_ce_zpx m_TMP = read_pc(); m_PC++; m_A = read(m_B|uint8_t(m_TMP+m_X)); set_nz(m_A); prefetch(); ldx_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_X = read(m_TMP + m_Y); set_nz(m_X); prefetch(); ldx_ce_zpg m_TMP = read_pc(); m_PC++; m_X = read(m_B|m_TMP); set_nz(m_X); prefetch(); ldx_ce_zpy m_TMP = read_pc(); m_PC++; m_X = read(m_B|uint8_t(m_TMP+m_Y)); set_nz(m_X); prefetch(); ldy_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_Y = read(m_TMP); set_nz(m_Y); prefetch(); ldy_ce_zpg m_TMP = read_pc(); m_PC++; m_Y = read(m_B|m_TMP); set_nz(m_Y); prefetch(); ldy_ce_zpx m_TMP = read_pc(); m_PC++; m_Y = read(m_B|uint8_t(m_TMP+m_X)); set_nz(m_Y); prefetch(); ldz_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_Z = read(m_TMP); set_nz(m_Z); prefetch(); ldz_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_Z = read(m_TMP + m_X); set_nz(m_Z); prefetch(); ldz_imm m_Z = read_pc(); m_PC++; set_nz(m_Z); prefetch(); lsr_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; read(set_l(m_TMP, m_TMP+m_X)); m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_ce_acc m_A = do_lsr(m_A); prefetch(); lsr_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); neg_acc read_pc(); m_A = -m_A; set_nz(m_A); prefetch(); ora_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); m_A |= m_TMP2; set_nz(m_A); prefetch(); ora_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); m_A |= m_TMP2; set_nz(m_A); prefetch(); # push/pop instructions and rti/rtn/rts are not fully streamlined pha_ce_imp read_pc(); write(m_SP, m_A); dec_SP_ce(); prefetch(); php_ce_imp read_pc(); write(m_SP, m_P); dec_SP_ce(); prefetch(); phw_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP3 = read(m_TMP); m_TMP3 = set_h(m_TMP3, read(m_TMP+1)); write(m_SP, m_TMP3); dec_SP_ce(); write(m_SP, m_TMP3 >> 8); dec_SP_ce(); prefetch(); phw_iw2 m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_SP, m_TMP); dec_SP_ce(); write(m_SP, m_TMP >> 8); dec_SP_ce(); prefetch(); phx_ce_imp read_pc(); write(m_SP, m_X); dec_SP_ce(); prefetch(); phy_ce_imp read_pc(); write(m_SP, m_Y); dec_SP_ce(); prefetch(); phz_imp read_pc(); write(m_SP, m_Z); dec_SP_ce(); prefetch(); pla_ce_imp read_pc(); inc_SP_ce(); m_A = read(m_SP); set_nz(m_A); prefetch(); plp_ce_imp read_pc(); inc_SP_ce(); m_TMP = read(m_SP) | F_B; prefetch(); m_P = m_TMP; // Do *not* move it before the prefetch plx_ce_imp read_pc(); inc_SP_ce(); m_X = read(m_SP); set_nz(m_X); prefetch(); ply_ce_imp read_pc(); inc_SP_ce(); m_Y = read(m_SP); set_nz(m_Y); prefetch(); plz_imp read_pc(); inc_SP_ce(); m_Z = read(m_SP); set_nz(m_Z); prefetch(); rmb_ce_bzp m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 &= ~(1 << ((m_inst_state >> 4) & 7)); write(m_TMP, m_TMP2); prefetch(); rol_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_ce_acc m_A = do_rol(m_A); prefetch(); rol_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_ce_acc m_A = do_ror(m_A); prefetch(); ror_ce_zpg m_TMP = m_B|read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_ce_zpx m_TMP = read_pc(); m_PC++; m_TMP = m_B|uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); row_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP3 = read(m_TMP); m_TMP3 = set_h(m_TMP3, read(m_TMP+1)); m_TMP2 = m_P; m_P &= ~(F_C|F_N|F_Z); if(m_TMP3 & 0x8000) m_P |= F_C; m_TMP3 <<= 1; if(m_TMP2 & F_C) m_TMP3 |= 0x0001; if(!m_TMP3) m_P |= F_Z; else if(m_TMP3 & 0x8000) m_P |= F_N; write(m_TMP, m_TMP3); write(m_TMP, m_TMP3 >> 8); prefetch(); rti_ce_imp read_pc(); inc_SP_ce(); m_P = read(m_SP) | F_B; inc_SP_ce(); m_PC = read(m_SP); inc_SP_ce(); m_PC = set_h(m_PC, read(m_SP)); prefetch(); rtn_imm m_TMP = read_pc(); m_PC++; if(m_P & F_E) m_SP = set_l(m_SP, m_SP+m_TMP); else m_SP += m_TMP; read_pc(); read(m_SP); inc_SP(); m_PC = read(m_SP); inc_SP(); m_PC = set_h(m_PC, read(m_SP)); read_pc(); m_PC++; prefetch(); rts_ce_imp inc_SP_ce(); m_PC = read(m_SP); inc_SP_ce(); m_PC = set_h(m_PC, read(m_SP)); read_pc(); m_PC++; prefetch(); sbc_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_X; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP += m_Y; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Y); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); m_TMP2 = read(m_TMP+m_Z); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_imm m_TMP = read_pc(); m_PC++; do_sbc_c(m_TMP); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_B|m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sbc_ce_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(m_B|uint8_t(m_TMP+m_X)); do_sbc_c(m_TMP2); if(m_P & F_D) set_nz(m_A); prefetch(); sec_ce_imp m_P |= F_C; prefetch(); sed_ce_imp m_P |= F_D; prefetch(); see_imp read_pc(); m_P |= F_E; prefetch(); sei_ce_imp prefetch(); m_P |= F_I; // Do *not* move it before the prefetch smb_ce_bzp m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); m_TMP2 |= 1 << ((m_inst_state >> 4) & 7); write(m_TMP, m_TMP2); prefetch(); sta_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP+m_X, m_A); prefetch(); sta_ce_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP+m_Y, m_A); prefetch(); sta_ce_idx m_TMP2 = read_pc(); m_PC++; m_TMP2 += m_X; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); write(m_TMP, m_A); prefetch(); sta_ce_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); write(m_TMP+m_Y, m_A); prefetch(); sta_idz m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_B|m_TMP2); m_TMP2++; m_TMP = set_h(m_TMP, read(m_B|m_TMP2)); write(m_TMP+m_Z, m_A); prefetch(); sta_isy read_pc(); m_TMP = read_pc(); m_PC++; if(m_P & F_E) m_TMP = set_l(m_SP, m_SP+m_TMP); else m_TMP = m_SP + m_TMP; m_TMP2 = read(m_TMP); m_TMP++; m_TMP = m_TMP2 | (read(m_TMP) << 8); write(m_TMP+m_Y, m_A); prefetch(); sta_ce_zpg m_TMP = read_pc(); m_PC++; write(m_B|m_TMP, m_A); prefetch(); sta_ce_zpx m_TMP = read_pc(); m_PC++; write(m_B|uint8_t(m_TMP+m_X), m_A); prefetch(); stx_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP+m_Y, m_X); prefetch(); stx_ce_zpg m_TMP = read_pc(); m_PC++; write(m_B|m_TMP, m_X); prefetch(); stx_ce_zpy m_TMP = read_pc(); m_PC++; write(m_B|uint8_t(m_TMP+m_Y), m_X); prefetch(); sty_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP+m_X, m_Y); prefetch(); sty_ce_zpg m_TMP = read_pc(); m_PC++; write(m_B|m_TMP, m_Y); prefetch(); sty_ce_zpx m_TMP = read_pc(); m_PC++; write(m_B|uint8_t(m_TMP+m_X), m_Y); prefetch(); stz_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP, m_Z); prefetch(); stz_ce_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP+m_X, m_Z); prefetch(); stz_ce_zpg m_TMP = read_pc(); m_PC++; write(m_B|m_TMP, m_Z); prefetch(); stz_ce_zpx m_TMP = read_pc(); m_PC++; write(m_B|uint8_t(m_TMP+m_X), m_Z); prefetch(); tab_imp m_B = m_A << 8; prefetch(); tax_ce_imp m_X = m_A; set_nz(m_X); prefetch(); tay_ce_imp m_Y = m_A; set_nz(m_Y); prefetch(); taz_imp m_Z = m_A; set_nz(m_Z); prefetch(); tba_imp m_A = m_B >> 8; set_nz(m_A); prefetch(); trb_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); if(m_A & m_TMP2) m_P &= ~F_Z; else m_P |= F_Z; m_TMP2 &= ~m_A; write(m_TMP, m_TMP2); prefetch(); trb_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); if(m_A & m_TMP2) m_P &= ~F_Z; else m_P |= F_Z; m_TMP2 &= ~m_A; write(m_TMP, m_TMP2); prefetch(); tsb_ce_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); if(m_A & m_TMP2) m_P &= ~F_Z; else m_P |= F_Z; m_TMP2 |= m_A; write(m_TMP, m_TMP2); prefetch(); tsb_ce_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); if(m_A & m_TMP2) m_P &= ~F_Z; else m_P |= F_Z; m_TMP2 |= m_A; write(m_TMP, m_TMP2); prefetch(); tsx_ce_imp m_X = m_SP; set_nz(m_X); prefetch(); tsy_imp m_Y = m_SP >> 8; set_nz(m_Y); prefetch(); txa_ce_imp m_A = m_X; set_nz(m_A); prefetch(); txs_ce_imp m_SP = set_l(m_SP, m_X); prefetch_noirq(); tys_imp m_SP = set_h(m_SP, m_Y); prefetch(); tya_ce_imp m_A = m_Y; set_nz(m_A); prefetch(); tza_imp m_A = m_Z; set_nz(m_A); prefetch();