# license:BSD-3-Clause # copyright-holders:David Haywood # xavix opcodes callf_xa3 read_stack(SP); write_special_stack(get_codebank()); dec_special_stack(); TMP2 = read_pc(); TMP = read_pc(); //read_stack(SP); write_stack(SP, PC>>8); dec_SP(); write_stack(SP, PC); dec_SP(); TMP = set_h(TMP, read_pc()); PC = TMP; set_codebank(TMP2); prefetch(); jmp_xa3 TMP2 = read_pc(); TMP = read_pc(); TMP = set_h(TMP, read_pc()); PC = TMP; set_codebank(TMP2); prefetch(); retf_imp read_pc_noinc(); read_stack(SP); inc_SP(); PC = read_stack(SP); inc_SP(); PC = set_h(PC, read_stack(SP)); inc_special_stack(); TMP2 = read_special_stack(); set_codebank(TMP2); read_pc(); prefetch(); brk_xav_imp // there is code in some games to indicate this doesn't always push the far bank to the stack.. // The 6502 bug when a nmi occurs in a brk is reproduced (case !irq_taken && nmi_pending) if(irq_taken) { read_pc_noinc(); } else { read_pc(); } write_special_stack(get_codebank()); set_codebank(0x00); // epo_efdx, rad_ping and rad_mtrk strongly suggest that interrupts must force bank 0 as code jumps to a ROM pointer stored earlier / a fixed pointer to a rom address in bank 0 dec_special_stack(); write_stack(SP, PC >> 8); dec_SP(); write_stack(SP, PC); dec_SP(); write_stack(SP, irq_taken ? P & ~F_B : P); dec_SP(); if(nmi_pending) { if (m_vector_callback.isnull()) { PC = read_arg(0xfffa); PC = set_h(PC, read_arg(0xfffb)); } else { if (m_vector_callback(0,1) != -1) { PC = m_vector_callback(0,1); PC = set_h(PC, m_vector_callback(0,0)); } else { PC = read_arg(0xfffa); PC = set_h(PC, read_arg(0xfffb)); } } nmi_pending = false; standard_irq_callback(NMI_LINE); } else { if (m_vector_callback.isnull()) { PC = read_arg(0xfffe); PC = set_h(PC, read_arg(0xffff)); } else { if (m_vector_callback(1,1) != -1) { PC = m_vector_callback(1,1); PC = set_h(PC, m_vector_callback(1,0)); } else { PC = read_arg(0xfffe); PC = set_h(PC, read_arg(0xffff)); } } if(irq_taken) standard_irq_callback(IRQ_LINE); } irq_taken = false; P |= F_I; // Do *not* move after the prefetch prefetch(); inst_state = -1; rti_xav_imp read_pc_noinc(); read_stack(SP); inc_SP(); P = read_stack(SP) | (F_B|F_E); inc_SP(); PC = read_stack(SP); inc_SP(); PC = set_h(PC, read_stack(SP)); inc_special_stack(); TMP2 = read_special_stack(); set_codebank(TMP2); prefetch(); # opcodes below are modified to access stack through different handlers pha_xav_imp read_pc_noinc(); write_stack(SP, A); dec_SP(); prefetch(); php_xav_imp read_pc_noinc(); write_stack(SP, P); dec_SP(); prefetch(); jsr_xav_adr TMP = read_pc(); read_stack(SP); write_stack(SP, PC>>8); dec_SP(); write_stack(SP, PC); dec_SP(); TMP = set_h(TMP, read_pc()); PC = TMP; prefetch(); pla_xav_imp read_pc_noinc(); read_stack(SP); inc_SP(); A = read_stack(SP); set_nz(A); prefetch(); plp_xav_imp read_pc_noinc(); read_stack(SP); inc_SP(); TMP = read_stack(SP) | (F_B|F_E); prefetch(); P = TMP; // Do *not* move it before the prefetch rts_xav_imp read_pc_noinc(); read_stack(SP); inc_SP(); PC = read_stack(SP); inc_SP(); PC = set_h(PC, read_stack(SP)); read_pc(); prefetch(); # opcodes below are modified to access zero page through different handlers lda_xav_idy TMP2 = read_pc(); // we need to fetch the zero page part from zero page, but the rest as if zero page wasn't there, similar to the 6509 TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } A = read(TMP+Y); set_nz(A); prefetch(); adc_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } do_adc(read(TMP+Y)); prefetch(); cmp_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } do_cmp(A, read(TMP+Y)); prefetch(); sbc_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } do_sbc(read(TMP+Y)); prefetch(); eor_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } A ^= read(TMP+Y); set_nz(A); prefetch(); and_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } A &= read(TMP+Y); set_nz(A); prefetch(); ora_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } A |= read(TMP+Y); set_nz(A); prefetch(); ora_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); A |= read(TMP); set_nz(A); prefetch(); and_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); A &= read(TMP); set_nz(A); prefetch(); eor_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); A ^= read(TMP); set_nz(A); prefetch(); adc_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); do_adc(read(TMP)); prefetch(); lda_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); A = read(TMP); set_nz(A); prefetch(); cmp_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); do_cmp(A, read(TMP)); prefetch(); sbc_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); do_sbc(read(TMP)); prefetch(); sta_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read_zeropage(set_l(TMP, TMP+Y)); // dummy read write(TMP+Y, A); // TODO prefetch(); sta_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); write(TMP, A); // TODO prefetch(); adc_xav_zpg TMP = read_pc(); TMP = read_zeropage(TMP); do_adc(TMP); prefetch(); and_xav_zpg TMP = read_pc(); A &= read_zeropage(TMP); set_nz(A); prefetch(); asl_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_asl(TMP2); write_zeropage(TMP, TMP2); prefetch(); bit_xav_zpg TMP = read_pc(); do_bit(read_zeropage(TMP)); prefetch(); cmp_xav_zpg TMP = read_pc(); TMP = read_zeropage(TMP); do_cmp(A, TMP); prefetch(); cpx_xav_zpg TMP = read_pc(); TMP = read_zeropage(TMP); do_cmp(X, TMP); prefetch(); cpy_xav_zpg TMP = read_pc(); TMP = read_zeropage(TMP); do_cmp(Y, TMP); prefetch(); dec_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2--; set_nz(TMP2); write_zeropage(TMP, TMP2); prefetch(); eor_xav_zpg TMP = read_pc(); A ^= read_zeropage(TMP); set_nz(A); prefetch(); inc_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2++; set_nz(TMP2); write_zeropage(TMP, TMP2); prefetch(); lda_xav_zpg TMP = read_pc(); A = read_zeropage(TMP); set_nz(A); prefetch(); ldx_xav_zpg TMP = read_pc(); X = read_zeropage(TMP); set_nz(X); prefetch(); ldy_xav_zpg TMP = read_pc(); Y = read_zeropage(TMP); set_nz(Y); prefetch(); lsr_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_lsr(TMP2); write_zeropage(TMP, TMP2); prefetch(); ora_xav_zpg TMP = read_pc(); A |= read_zeropage(TMP); set_nz(A); prefetch(); rol_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_rol(TMP2); write_zeropage(TMP, TMP2); prefetch(); ror_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_ror(TMP2); write_zeropage(TMP, TMP2); prefetch(); sbc_xav_zpg TMP = read_pc(); TMP = read_zeropage(TMP); do_sbc(TMP); prefetch(); sta_xav_zpg TMP = read_pc(); write_zeropage(TMP, A); prefetch(); stx_xav_zpg TMP = read_pc(); write_zeropage(TMP, X); prefetch(); sty_xav_zpg TMP = read_pc(); write_zeropage(TMP, Y); prefetch(); dcp_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2--; write_zeropage(TMP, TMP2); do_cmp(A, TMP2); prefetch(); isb_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2++; write_zeropage(TMP, TMP2); do_sbc(TMP2); prefetch(); lax_xav_zpg TMP = read_pc(); A = X = read_zeropage(TMP); set_nz(A); prefetch(); rla_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_rol(TMP2); write_zeropage(TMP, TMP2); A &= TMP2; set_nz(A); prefetch(); rra_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_ror(TMP2); write_zeropage(TMP, TMP2); do_adc(TMP2); prefetch(); sax_xav_zpg TMP = read_pc(); TMP2 = A & X; write_zeropage(TMP, TMP2); prefetch(); slo_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_asl(TMP2); write_zeropage(TMP, TMP2); A |= TMP2; set_nz(A); prefetch(); sre_xav_zpg TMP = read_pc(); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_lsr(TMP2); write_zeropage(TMP, TMP2); A ^= TMP2; set_nz(A); prefetch(); nop_xav_zpg TMP = read_pc(); read_zeropage(TMP); // dummy read prefetch(); # more zero page changes ldx_xav_zpy TMP = read_pc(); read_zeropage(TMP); // dummy read X = read_zeropage(uint8_t(TMP+Y)); set_nz(X); prefetch(); stx_xav_zpy TMP = read_pc(); read_zeropage(TMP); // dummy read write_zeropage(uint8_t(TMP+Y), X); prefetch(); lax_xav_zpy TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+Y); A = X = read_zeropage(TMP); set_nz(A); prefetch(); sax_xav_zpy TMP = read_pc(); read_zeropage(TMP); // dummy reaad TMP = uint8_t(TMP+Y); TMP2 = A & X; write_zeropage(TMP, TMP2); prefetch(); # more zero page changes adc_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = read_zeropage(uint8_t(TMP+X)); do_adc(TMP); prefetch(); and_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read A &= read_zeropage(uint8_t(TMP+X)); set_nz(A); prefetch(); asl_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_asl(TMP2); write_zeropage(TMP, TMP2); prefetch(); cmp_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = read_zeropage(uint8_t(TMP+X)); do_cmp(A, TMP); prefetch(); dec_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2--; set_nz(TMP2); write_zeropage(TMP, TMP2); prefetch(); eor_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read A ^= read_zeropage(uint8_t(TMP+X)); set_nz(A); prefetch(); inc_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2++; set_nz(TMP2); write_zeropage(TMP, TMP2); prefetch(); lda_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read A = read_zeropage(uint8_t(TMP+X)); set_nz(A); prefetch(); ldy_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read Y = read_zeropage(uint8_t(TMP+X)); set_nz(Y); prefetch(); lsr_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_lsr(TMP2); write_zeropage(TMP, TMP2); prefetch(); ora_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read A |= read_zeropage(uint8_t(TMP+X)); set_nz(A); prefetch(); rol_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_rol(TMP2); write_zeropage(TMP, TMP2); prefetch(); ror_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_ror(TMP2); write_zeropage(TMP, TMP2); prefetch(); sbc_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = read_zeropage(uint8_t(TMP+X)); do_sbc(TMP); prefetch(); sta_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read write_zeropage(uint8_t(TMP+X), A); prefetch(); sty_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read write_zeropage(uint8_t(TMP+X), Y); prefetch(); dcp_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2--; write_zeropage(TMP, TMP2); do_cmp(A, TMP2); prefetch(); isb_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2++; write_zeropage(TMP, TMP2); do_sbc(TMP2); prefetch(); rla_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_rol(TMP2); write_zeropage(TMP, TMP2); A &= TMP2; set_nz(A); prefetch(); rra_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_ror(TMP2); write_zeropage(TMP, TMP2); do_adc(TMP2); prefetch(); slo_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_asl(TMP2); write_zeropage(TMP, TMP2); A |= TMP2; set_nz(A); prefetch(); sre_xav_zpx TMP = read_pc(); read_zeropage(TMP); // dummy read TMP = uint8_t(TMP+X); TMP2 = read_zeropage(TMP); write_zeropage(TMP, TMP2); // dummy write TMP2 = do_lsr(TMP2); write_zeropage(TMP, TMP2); A ^= TMP2; set_nz(A); prefetch(); nop_xav_zpx TMP = read_pc(); read_zeropage(TMP); read_zeropage(uint8_t(TMP+X)); prefetch(); #### slo_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_asl(TMP2); write(TMP, TMP2); A |= TMP2; set_nz(A); prefetch(); # idx with zero page changes rla_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_rol(TMP2); write(TMP, TMP2); A &= TMP2; set_nz(A); prefetch(); sre_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_lsr(TMP2); write(TMP, TMP2); A ^= TMP2; set_nz(A); prefetch(); rra_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_ror(TMP2); write(TMP, TMP2); do_adc(TMP2); prefetch(); sax_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = A & X; write(TMP, TMP2); prefetch(); lax_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dumm read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); A = X = read(TMP); set_nz(A); prefetch(); dcp_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2--; write(TMP, TMP2); do_cmp(A, TMP2); prefetch(); isb_xav_idx TMP2 = read_pc(); read_zeropage(TMP2); // dummy read TMP2 += X; TMP = read_zeropage(TMP2 & 0xff); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); TMP2 = read(TMP); write(TMP, TMP2); TMP2++; write(TMP, TMP2); do_sbc(TMP2); prefetch(); # idy with zero page changes slo_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_asl(TMP2); write(TMP, TMP2); A |= TMP2; set_nz(A); prefetch(); rla_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_rol(TMP2); write(TMP, TMP2); A &= TMP2; set_nz(A); prefetch(); sre_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_lsr(TMP2); write(TMP, TMP2); A ^= TMP2; set_nz(A); prefetch(); rra_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2 = do_ror(TMP2); write(TMP, TMP2); do_adc(TMP2); prefetch(); sha_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP2 = A & X & ((TMP >> 8)+1); if(page_changing(TMP, Y)) TMP = set_h(TMP+Y, TMP2); else TMP += Y; write(TMP, TMP2); prefetch(); lax_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); if(page_changing(TMP, Y)) { read(set_l(TMP, TMP+Y)); // dummy read } A = X = read(TMP+Y); set_nz(A); prefetch(); dcp_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2--; write(TMP, TMP2); do_cmp(A, TMP2); prefetch(); isb_xav_idy TMP2 = read_pc(); TMP = read_zeropage(TMP2); TMP = set_h(TMP, read_zeropage((TMP2+1) & 0xff)); read(set_l(TMP, TMP+Y)); // dummy read TMP += Y; TMP2 = read(TMP); write(TMP, TMP2); TMP2++; write(TMP, TMP2); do_sbc(TMP2); prefetch();