# license:BSD-3-Clause # copyright-holders:Olivier Galibert # w65c02 opcodes adc_c_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) { read_pc(); set_nz(m_A); } prefetch(); adc_c_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(page_changing(m_TMP, m_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP += m_X; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(page_changing(m_TMP, m_Y)) { read(set_l(m_TMP, m_TMP+m_Y)); } m_TMP += m_Y; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_idx m_TMP2 = read_pc(); m_PC++; read(m_TMP2); m_TMP2 += m_X; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); if(page_changing(m_TMP, m_Y)) { read(set_l(m_TMP, m_TMP+m_Y)); } m_TMP2 = read(m_TMP+m_Y); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_imm m_TMP = read_pc(); m_PC++; do_adc(m_TMP); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); adc_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(uint8_t(m_TMP+m_X)); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); and_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); m_A &= m_TMP2; set_nz(m_A); prefetch(); asl_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_c_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); read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); asl_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_asl(m_TMP2); write(m_TMP, m_TMP2); prefetch(); bbr_zpb m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP = read_pc(); m_PC++; if(!(m_TMP2 & (1 << ((m_inst_state >> 4) & 7)))) { read_pc(); if(page_changing(m_PC, int8_t(m_TMP))) { read_arg(set_l(m_PC, m_PC+int8_t(m_TMP))); } m_PC += int8_t(m_TMP); } prefetch(); bbs_zpb m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP = read_pc(); m_PC++; if(m_TMP2 & (1 << ((m_inst_state >> 4) & 7))) { read_pc(); if(page_changing(m_PC, int8_t(m_TMP))) { read_arg(set_l(m_PC, m_PC+int8_t(m_TMP))); } m_PC += int8_t(m_TMP); } prefetch(); bit_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(page_changing(m_TMP, m_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP += m_X; m_TMP2 = read(m_TMP); do_bit(m_TMP2); prefetch(); bit_imm m_TMP = read_pc(); m_PC++; if(m_A & m_TMP) m_P &= ~F_Z; else m_P |= F_Z; prefetch(); bit_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(uint8_t(m_TMP+m_X)); do_bit(m_TMP2); prefetch(); bra_rel m_TMP = read_pc(); m_PC++; read_pc(); if(page_changing(m_PC, int8_t(m_TMP))) { read_arg(set_l(m_PC, m_PC+int8_t(m_TMP))); } m_PC += int8_t(m_TMP); prefetch(); brk_c_imp if(m_irq_taken || m_nmi_pending) { read_pc(); } else { read_pc(); m_PC++; } write(m_SP, m_PC >> 8); dec_SP(); write(m_SP, m_PC); dec_SP(); write(m_SP, m_irq_taken || m_nmi_pending ? m_P & ~F_B : m_P); dec_SP(); if(m_irq_taken && m_nmi_pending) { standard_irq_callback(NMI_LINE, m_PC); m_PC = read_arg(0xfffa); m_PC = set_h(m_PC, read_arg(0xfffb)); m_nmi_pending = false; } else { if(m_irq_taken) standard_irq_callback(IRQ_LINE, m_PC); 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; cmp_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); do_cmp(m_A, m_TMP2); prefetch(); dec_acc read_pc(); m_A--; set_nz(m_A); prefetch(); dec_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_c_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); read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); dec_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2--; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); eor_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); m_A ^= m_TMP2; set_nz(m_A); prefetch(); inc_acc read_pc(); m_A++; set_nz(m_A); prefetch(); inc_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_c_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); read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); inc_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2++; set_nz(m_TMP2); write(m_TMP, m_TMP2); prefetch(); jmp_iax 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_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); jmp_c_ind m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_PC = read(m_TMP); read(set_l(m_TMP, m_TMP+1)); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); lda_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_A = read(m_TMP); set_nz(m_A); prefetch(); lsr_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_c_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); read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); lsr_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_lsr(m_TMP2); write(m_TMP, m_TMP2); prefetch(); nop_c_imp prefetch(); nop_c_aba read_pc(); m_PC++; read_pc(); m_PC++; read_pc(); read_pc(); read_pc(); read_pc(); read_pc(); prefetch(); nop_c_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)); prefetch(); ora_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); m_A |= m_TMP2; set_nz(m_A); prefetch(); phx_imp read_pc(); write(m_SP, m_X); dec_SP(); prefetch(); phy_imp read_pc(); write(m_SP, m_Y); dec_SP(); prefetch(); plx_imp read_pc(); read(m_SP); inc_SP(); m_X = read(m_SP); set_nz(m_X); prefetch(); ply_imp read_pc(); read(m_SP); inc_SP(); m_Y = read(m_SP); set_nz(m_Y); prefetch(); rmb_bzp m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 &= ~(1 << ((m_inst_state >> 4) & 7)); write(m_TMP, m_TMP2); prefetch(); rol_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_c_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); read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); rol_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_rol(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_c_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_c_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); read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); ror_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 = do_ror(m_TMP2); write(m_TMP, m_TMP2); prefetch(); sbc_c_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) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_abx m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(page_changing(m_TMP, m_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP += m_X; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_aby m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; if(page_changing(m_TMP, m_Y)) { read(set_l(m_TMP, m_TMP+m_Y)); } m_TMP += m_Y; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_idx m_TMP2 = read_pc(); m_PC++; read(m_TMP2); m_TMP2 += m_X; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_idy m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); if(page_changing(m_TMP, m_Y)) { read(set_l(m_TMP, m_TMP+m_Y)); } m_TMP2 = read(m_TMP+m_Y); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_imm m_TMP = read_pc(); m_PC++; do_sbc_c(m_TMP); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); m_TMP2 = read(m_TMP); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sbc_c_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(uint8_t(m_TMP+m_X)); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); smb_bzp m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); read(m_TMP); m_TMP2 |= 1 << ((m_inst_state >> 4) & 7); write(m_TMP, m_TMP2); prefetch(); sta_zpi m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2 & 0xff); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); write(m_TMP, m_A); prefetch(); stp_imp for(;;) { eat-all-cycles; } stz_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_TMP, 0x00); prefetch(); stz_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)); write(m_TMP+m_X, 0x00); prefetch(); stz_zpg m_TMP = read_pc(); m_PC++; write(m_TMP, 0x00); prefetch(); stz_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); write(uint8_t(m_TMP+m_X), 0x00); prefetch(); trb_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); 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_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); 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_aba m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); 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_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); 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(); wai_imp read_pc(); read_pc(); while(!m_nmi_pending && !m_irq_state) { eat-all-cycles; } prefetch(); # exceptions reset_c read_arg(0xffff); read_pc(); read(m_SP); dec_SP(); read(m_SP); dec_SP(); read(m_SP); dec_SP(); m_P = (m_P | F_I) & ~F_D; m_PC = read_arg(0xfffc); m_PC = set_h(m_PC, read_arg(0xfffd)); prefetch(); m_inst_state = -1;