# license:BSD-3-Clause # copyright-holders:Olivier Galibert, m_AJR adc_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); do_adc(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); add_imm m_TMP = read_pc(); m_PC++; do_add(m_TMP); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); add_zpg m_TMP = read_pc(); m_PC++; m_TMP2 = read(m_TMP); do_add(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); add_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP2 = read(uint8_t(m_TMP+m_X)); do_add(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); and_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); m_A &= m_TMP2; set_nz(m_A); prefetch(); asr_acc read_pc(); m_A = do_asr(m_A); prefetch(); bar_amr m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP = read_pc(); read_pc(); m_PC++; m_TMP2 = ~m_TMP2 & m_TMP; m_TMP = read_pc(); m_PC++; if(m_TMP2 != 0) { 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(); bas_amr m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; m_TMP2 = read(m_TMP); m_TMP = read_pc(); read_pc(); m_PC++; m_TMP2 &= m_TMP; m_TMP = read_pc(); m_PC++; if(m_TMP2 != 0) { 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_r_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(0xfffc); m_PC = set_h(m_PC, read_arg(0xfffd)); m_nmi_pending = false; } else { if(m_irq_taken) standard_irq_callback(((~m_TMP & 0x000e) >> 1) - 1, m_PC); m_TMP = get_irq_vector(); m_PC = read_arg(m_TMP); m_PC = set_h(m_PC, read_arg(m_TMP+1)); } m_irq_taken = false; m_P = (m_P | F_I) & ~F_D; // Do *not* move after the prefetch prefetch(); m_inst_state = -1; clw_imp read_pc(); m_P &= ~F_V; m_w = 0; prefetch(); cmp_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); do_cmp(m_A, m_TMP2); prefetch(); eor_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); m_A ^= m_TMP2; set_nz(m_A); prefetch(); exc_zpx m_TMP = read_pc(); m_PC++; read(m_TMP); m_TMP = uint8_t(m_TMP+m_X); m_TMP2 = read(m_TMP); write(m_TMP, m_A); m_A = m_TMP2; prefetch(); ini_imp read_pc(); read(m_i); m_i++; prefetch(); jpi_ind m_i = m_PC; m_TMP = read_arg(m_i); m_TMP = set_h(m_TMP, read_arg(m_i+1)); m_i += 2; m_PC = read(m_TMP); m_PC = set_h(m_PC, read(m_TMP+1)); prefetch(); jsb_vec read_pc(); write(m_SP, m_PC>>8); dec_SP(); write(m_SP, m_PC); dec_SP(); m_TMP = 0xffe0 | ((m_inst_state >> 3) & 0x0e); m_PC = read_arg(m_TMP); m_PC = set_h(m_PC, read_arg(m_TMP+1)); prefetch(); jmp_r_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_r_adr m_TMP = read_pc(); m_PC++; m_TMP = set_h(m_TMP, read_pc()); m_PC++; write(m_SP, m_PC>>8); dec_SP(); write(m_SP, m_PC); dec_SP(); m_PC = m_TMP; prefetch(); lab_acc read_pc(); read_pc(); if(int8_t(m_A) < 0) m_A = -m_A; set_nz(m_A); prefetch(); lai_imp read_pc(); m_A = read(m_i); prefetch(); lan_imp read_pc(); m_A = read(m_i); m_i++; prefetch(); lda_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_A = read(m_TMP+m_X); set_nz(m_A); prefetch(); lii_imp read_pc(); m_TMP = read(m_i); m_TMP = set_h(m_TMP, read(m_i+1)); read(m_TMP); m_i = m_TMP; prefetch(); mpa_imp read_pc(); read_pc(); read_pc(); read_pc(); read_pc(); m_TMP = int8_t(m_A) * int8_t(m_Y); m_w = do_accumulate(m_TMP, m_w); prefetch(); mpy_imp read_pc(); read_pc(); read_pc(); read_pc(); read_pc(); m_TMP = int8_t(m_A) * int8_t(m_Y); m_A = do_accumulate(m_TMP, 0)>>8; prefetch(); neg_acc read_pc(); m_A = -m_A; set_nz(m_A); prefetch(); nxt_imp read_pc(); m_PC = read(m_i); m_PC = set_h(m_PC, read(m_i+1)); m_i += 2; prefetch(); ora_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); m_A |= m_TMP2; set_nz(m_A); prefetch(); phi_imp read_pc(); write(m_SP, m_i>>8); dec_SP(); write(m_SP, m_i); dec_SP(); prefetch(); phw_imp read_pc(); write(m_SP, m_w>>8); dec_SP(); write(m_SP, m_w); dec_SP(); prefetch(); pia_imp read_pc(); read(m_SP); inc_SP(); m_i = read(m_SP); inc_SP(); m_i = set_h(m_i, read(m_SP)); m_A = read(m_i); m_i++; prefetch(); pli_imp read_pc(); read(m_SP); inc_SP(); m_i = read(m_SP); inc_SP(); m_i = set_h(m_i, read(m_SP)); read(m_i); prefetch(); plw_imp read_pc(); read(m_SP); inc_SP(); m_w = read(m_SP); inc_SP(); m_w = set_h(m_w, read(m_SP)); prefetch(); psh_imp read_pc(); write(m_SP, m_A); dec_SP(); write(m_SP, m_X); dec_SP(); write(m_SP, m_Y); dec_SP(); prefetch(); pul_imp read_pc(); read(m_SP); inc_SP(); m_Y = read(m_SP); inc_SP(); m_X = read(m_SP); inc_SP(); m_A = read(m_SP); prefetch(); rba_ima m_A = read_pc(); // "Note that Accumulator contents are altered by RBA and SBA" (C29/C39 Technical Reference Manual, p. C-29) m_PC++; 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 &= ~m_A; write(m_TMP, m_TMP2); prefetch(); rnd_imp read_pc(); m_TMP = set_l(m_w, m_Y); m_A = do_accumulate(m_TMP, (m_w<<1) & 0x100)>>8; prefetch(); rts_r_imp read_pc(); read_pc(); inc_SP(); m_PC = read(m_SP); inc_SP(); m_PC = set_h(m_PC, read(m_SP)); prefetch(); sba_ima m_A = read_pc(); m_PC++; 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 |= m_A; write(m_TMP, m_TMP2); prefetch(); sbc_ipx 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_X)) { read(set_l(m_TMP, m_TMP+m_X)); } m_TMP2 = read(m_TMP+m_X); do_sbc_c(m_TMP2); if(m_P & F_D) { read_pc(); set_nz(m_A); } prefetch(); sta_ipx m_TMP2 = read_pc(); m_PC++; m_TMP = read(m_TMP2); m_TMP = set_h(m_TMP, read((m_TMP2+1) & 0xff)); read(set_l(m_TMP, m_TMP+m_X)); write(m_TMP+m_X, m_A); prefetch(); sti_imz m_TMP = read_pc(); m_PC++; m_TMP2 = read_pc(); m_PC++; write(m_TMP2, m_TMP); prefetch(); taw_imp read_pc(); m_w = m_A<<8; set_nz(m_w>>8); prefetch(); tip_imp read_pc(); m_PC = m_i; prefetch(); twa_imp read_pc(); m_A = m_w>>8; set_nz(m_A); prefetch(); # exceptions reset_r read_pc(); m_PC++; 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(0xfffe); m_PC = set_h(m_PC, read_arg(0xffff)); prefetch(); m_inst_state = -1;