static void m6502_set_info(UINT32 state, cpuinfo *info) { switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + M6502_IRQ_LINE: m6502_set_irq_line(M6502_IRQ_LINE, info->i); break; case CPUINFO_INT_INPUT_STATE + M6502_SET_OVERFLOW: m6502_set_irq_line(M6502_SET_OVERFLOW, info->i); break; case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: m6502_set_irq_line(INPUT_LINE_NMI, info->i); break; case CPUINFO_INT_PC: PCW = info->i; change_pc(PCD); break; case CPUINFO_INT_REGISTER + M6502_PC: m6502.pc.w.l = info->i; break; case CPUINFO_INT_SP: S = info->i; break; case CPUINFO_INT_REGISTER + M6502_S: m6502.sp.b.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_P: m6502.p = info->i; break; case CPUINFO_INT_REGISTER + M6502_A: m6502.a = info->i; break; case CPUINFO_INT_REGISTER + M6502_X: m6502.x = info->i; break; case CPUINFO_INT_REGISTER + M6502_Y: m6502.y = info->i; break; case CPUINFO_INT_REGISTER + M6502_EA: m6502.ea.w.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_ZP: m6502.zp.w.l = info->i; break; /* --- the following bits of info are set as pointers to data or functions --- */ case CPUINFO_PTR_M6502_READINDEXED_CALLBACK: m6502.rdmem_id = (read8_handler) info->f; break; case CPUINFO_PTR_M6502_WRITEINDEXED_CALLBACK: m6502.wrmem_id = (write8_handler) info->f; break; } }
void m6502_set_reg (int regnum, unsigned val) { switch( regnum ) { case REG_PC: PCW = val; change_pc16(PCD); break; case M6502_PC: m6502.pc.w.l = val; break; case REG_SP: S = val; break; case M6502_S: m6502.sp.b.l = val; break; case M6502_P: m6502.p = val; break; case M6502_A: m6502.a = val; break; case M6502_X: m6502.x = val; break; case M6502_Y: m6502.y = val; break; case M6502_EA: m6502.ea.w.l = val; break; case M6502_ZP: m6502.zp.w.l = val; break; case M6502_NMI_STATE: m6502_set_irq_line( IRQ_LINE_NMI, val ); break; case M6502_IRQ_STATE: m6502_set_irq_line( 0, val ); break; case M6502_SO_STATE: m6502_set_irq_line( M6502_SET_OVERFLOW, val ); break; default: if( regnum <= REG_SP_CONTENTS ) { unsigned offset = S + 2 * (REG_SP_CONTENTS - regnum); if( offset < 0x1ff ) { WRMEM( offset, val & 0xfff ); WRMEM( offset + 1, (val >> 8) & 0xff ); } }
static CPU_SET_INFO( m6502 ) { m6502_Regs *cpustate = get_safe_token(device); switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + M6502_IRQ_LINE: m6502_set_irq_line(cpustate, M6502_IRQ_LINE, info->i); break; case CPUINFO_INT_INPUT_STATE + M6502_SET_OVERFLOW: m6502_set_irq_line(cpustate, M6502_SET_OVERFLOW, info->i); break; case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: m6502_set_irq_line(cpustate, INPUT_LINE_NMI, info->i); break; case CPUINFO_INT_PC: PCW = info->i; break; case CPUINFO_INT_REGISTER + M6502_PC: cpustate->pc.w.l = info->i; break; case CPUINFO_INT_SP: S = info->i; break; case CPUINFO_INT_REGISTER + M6502_S: cpustate->sp.b.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_P: cpustate->p = info->i; break; case CPUINFO_INT_REGISTER + M6502_A: cpustate->a = info->i; break; case CPUINFO_INT_REGISTER + M6502_X: cpustate->x = info->i; break; case CPUINFO_INT_REGISTER + M6502_Y: cpustate->y = info->i; break; case CPUINFO_INT_REGISTER + M6502_EA: cpustate->ea.w.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_ZP: cpustate->zp.w.l = info->i; break; } }
static void m6502_set_info(UINT32 state, union cpuinfo *info) { switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + M6502_IRQ_LINE: m6502_set_irq_line(M6502_IRQ_LINE, info->i); break; case CPUINFO_INT_INPUT_STATE + M6502_SET_OVERFLOW:m6502_set_irq_line(M6502_SET_OVERFLOW, info->i); break; case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: m6502_set_irq_line(INPUT_LINE_NMI, info->i); break; case CPUINFO_INT_PC: PCW = info->i; change_pc(PCD); break; case CPUINFO_INT_REGISTER + M6502_PC: m6502.pc.w.l = info->i; break; case CPUINFO_INT_SP: S = info->i; break; case CPUINFO_INT_REGISTER + M6502_S: m6502.sp.b.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_P: m6502.p = info->i; break; case CPUINFO_INT_REGISTER + M6502_A: m6502.a = info->i; break; case CPUINFO_INT_REGISTER + M6502_X: m6502.x = info->i; break; case CPUINFO_INT_REGISTER + M6502_Y: m6502.y = info->i; break; case CPUINFO_INT_REGISTER + M6502_EA: m6502.ea.w.l = info->i; break; case CPUINFO_INT_REGISTER + M6502_ZP: m6502.zp.w.l = info->i; break; /* --- the following bits of info are set as pointers to data or functions --- */ case CPUINFO_PTR_IRQ_CALLBACK: m6502.irq_callback = info->irqcallback; break; } }
static void m65c02_set_irq_line(m6502_Regs *cpustate, int irqline, int state) { if (irqline == INPUT_LINE_NMI) { if (cpustate->nmi_state == state) return; cpustate->nmi_state = state; if( state != CLEAR_LINE ) { LOG(( "M6502 '%s' set_nmi_line(ASSERT)\n", cpustate->device->tag())); EAD = M6502_NMI_VEC; cpustate->icount -= 2; PUSH(PCH); PUSH(PCL); PUSH(P & ~F_B); P = (P & ~F_D) | F_I; /* knock out D and set I flag */ PCL = RDMEM(EAD); PCH = RDMEM(EAD+1); LOG(("M6502 '%s' takes NMI ($%04x)\n", cpustate->device->tag(), PCD)); } } else m6502_set_irq_line(cpustate, irqline,state); }
static void m65c02_set_irq_line(int irqline, int state) { if (irqline == INPUT_LINE_NMI) { if (m6502.nmi_state == state) return; m6502.nmi_state = state; if( state != CLEAR_LINE ) { LOG(( "M6502#%d set_nmi_line(ASSERT)\n", cpu_getactivecpu())); EAD = M6502_NMI_VEC; m6502_ICount -= 7; PUSH(PCH); PUSH(PCL); PUSH(P & ~F_B); P = (P & ~F_D) | F_I; /* knock out D and set I flag */ PCL = RDMEM(EAD); PCH = RDMEM(EAD+1); LOG(("M6502#%d takes NMI ($%04x)\n", cpu_getactivecpu(), PCD)); change_pc(PCD); } } else m6502_set_irq_line(irqline,state); }
void m6502_set_reg (int regnum, unsigned val) { switch( regnum ) { case M6502_PC: m6502.pc.w.l = val; break; case M6502_S: m6502.sp.b.l = val; break; case M6502_P: m6502.p = val; break; case M6502_A: m6502.a = val; break; case M6502_X: m6502.x = val; break; case M6502_Y: m6502.y = val; break; case M6502_EA: m6502.ea.w.l = val; break; case M6502_ZP: m6502.zp.w.l = val; break; case M6502_NMI_STATE: m6502_set_nmi_line( val ); break; case M6502_IRQ_STATE: m6502_set_irq_line( 0, val ); break; default: if( regnum <= REG_SP_CONTENTS ) { unsigned offset = S + 2 * (REG_SP_CONTENTS - regnum); if( offset < 0x1ff ) { WRMEM( offset, val & 0xfff ); WRMEM( offset + 1, (val >> 8) & 0xff ); } }
int m6502_irq_callback(int irqline) { m6502_set_irq_line(irqline, CLEAR_LINE); return 0; }