diff --git a/src/emu/cpu/m6502/dm740.lst b/src/emu/cpu/m6502/dm740.lst index a55447cd32c..e73d1222dd7 100644 --- a/src/emu/cpu/m6502/dm740.lst +++ b/src/emu/cpu/m6502/dm740.lst @@ -1,5 +1,5 @@ # m740 device -brk_imp ora_idx kil_non bbs_acc nop_zpg ora_zpg asl_zpg bbs_bzr php_imp ora_imm asl_acc seb_acc nop_aba ora_aba asl_aba seb_biz +brk740_imp ora_idx kil_non bbs_acc nop_zpg ora_zpg asl_zpg bbs_bzr php_imp ora_imm asl_acc seb_acc nop_aba ora_aba asl_aba seb_biz bpl_rel ora_idy clt_imp bbc_acc nop_zpx ora_zpx asl_zpx bbc_bzr clc_imp ora_aby nop_imp clb_acc nop_abx ora_abx asl_abx clb_biz jsr_adr and_idx jsr_spg bbs_acc bit_zpg and_zpg rol_zpg bbs_bzr plp_imp and_imm rol_acc seb_acc bit_aba and_aba rol_aba seb_biz bmi_rel and_idy set_imp bbc_acc nop_zpx and_zpx rol_zpx bbc_bzr sec_imp and_aby nop_imp clb_acc ldm_imz and_abx rol_abx clb_biz @@ -10,7 +10,7 @@ bvs_rel adc_idy kil_non bbc_acc nop_zpx adc_zpx ror_zpx bra_rel sta_idx rrf_zpg bbs_acc sty_zpg sta_zpg stx_zpg bbs_bzr dey_imp nop_imm txa_imp seb_acc sty_aba sta_aba stx_aba seb_biz bcc_rel sta_idy kil_non bbc_acc sty_zpx sta_zpx stx_zpy bbc_bzr tya_imp sta_aby txs_imp clb_acc shy_abx sta_abx shx_aby clb_biz ldy_imm lda_idx ldx_imm bbs_acc ldy_zpg lda_zpg ldx_zpg bbs_bzr tay_imp lda_imm tax_imp seb_acc ldy_aba lda_aba ldx_aba seb_biz -bcs_rel lda_idy kil_non bbc_acc ldy_zpx lda_zpx ldx_zpy bbc_bzr clv_imp lda_aby tsx_imp clb_acc ldy_abx lda_abx ldx_aby clb_biz +bcs_rel lda_idy jmp_zpi bbc_acc ldy_zpx lda_zpx ldx_zpy bbc_bzr clv_imp lda_aby tsx_imp clb_acc ldy_abx lda_abx ldx_aby clb_biz cpy_imm cmp_idx nop_imm bbs_acc cpy_zpg cmp_zpg dec_zpg bbs_bzr iny_imp cmp_imm dex_imp seb_acc cpy_aba cmp_aba dec_aba seb_biz bne_rel cmp_idy kil_non bbc_acc nop_zpx cmp_zpx dec_zpx bbc_bzr cld_imp cmp_aby nop_imp clb_acc nop_abx cmp_abx dec_abx clb_biz cpx_imm sbc_idx nop_imm bbs_acc cpx_zpg sbc_zpg inc_zpg bbs_bzr inx_imp sbc_imm nop_imp seb_acc cpx_aba sbc_aba inc_aba seb_biz diff --git a/src/emu/cpu/m6502/m6502.h b/src/emu/cpu/m6502/m6502.h index 97b662fe8ee..766f30a1fe3 100644 --- a/src/emu/cpu/m6502/m6502.h +++ b/src/emu/cpu/m6502/m6502.h @@ -49,7 +49,7 @@ public: IRQ_LINE = INPUT_LINE_IRQ0, APU_IRQ_LINE = INPUT_LINE_IRQ1, NMI_LINE = INPUT_LINE_NMI, - V_LINE = 10 + V_LINE = INPUT_LINE_IRQ0 + 16 }; m6502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); diff --git a/src/emu/cpu/m6502/m740.c b/src/emu/cpu/m6502/m740.c index 39f032d8ebb..9aa42f13c37 100644 --- a/src/emu/cpu/m6502/m740.c +++ b/src/emu/cpu/m6502/m740.c @@ -63,6 +63,8 @@ void m740_device::device_reset() inst_substate = 0; nmi_state = false; irq_state = false; + m_irq_multiplex = 0; + m_irq_vector = 0xfffc; apu_irq_state = false; irq_taken = false; v_state = false; @@ -86,7 +88,70 @@ UINT8 m740_device::do_seb(UINT8 in, UINT8 bit) // doesn't affect the flags UINT8 m740_device::do_rrf(UINT8 in) { - return ((in&0xf)<<4) | ((in&0xf0)>>4); + return ((in&0xf)<<4) | ((in&0xf0)>>4); +} + +void m740_device::execute_set_input(int inputnum, int state) +{ + switch(inputnum) + { + case M740_INT0_LINE: + case M740_INT1_LINE: + case M740_INT2_LINE: + case M740_INT3_LINE: + case M740_INT4_LINE: + case M740_INT5_LINE: + case M740_INT6_LINE: + case M740_INT7_LINE: + case M740_INT8_LINE: + case M740_INT9_LINE: + case M740_INT10_LINE: + case M740_INT11_LINE: + case M740_INT12_LINE: + case M740_INT13_LINE: + case M740_INT14_LINE: // 37450 has 15 IRQ lines, no other known variant has that many + set_irq_line(inputnum - M740_INT0_LINE, state); + break; + + case V_LINE: + if(!v_state && state == ASSERT_LINE) + { + P |= F_V; + } + v_state = state == ASSERT_LINE; + break; + } +} + +void m740_device::set_irq_line(int line, int state) +{ + assert(line > 0); + assert(line <= M740_MAX_INT_LINE); + + if (state == ASSERT_LINE) + { + m_irq_multiplex |= (1<> 8); + dec_SP(); + write(SP, PC); + dec_SP(); + write(SP, irq_taken ? P & ~F_B : P); + dec_SP(); + if(nmi_state) { + PC = read_direct(0xfffa); + PC = set_h(PC, read_direct(0xfffb)); + nmi_state = false; + standard_irq_callback(NMI_LINE); + } else { + PC = read_direct(m_irq_vector); + PC = set_h(PC, read_direct(m_irq_vector+1)); + if(irq_taken) + standard_irq_callback(IRQ_LINE); + } + irq_taken = false; + P |= F_I; // Do *not* move after the prefetch + prefetch(); + inst_state = -1; +