void h6280_set_reg (int regnum, unsigned val) { switch( regnum ) { case REG_PC: case H6280_PC: PCW = val; break; case REG_SP: case H6280_S: S = val; break; case H6280_P: P = val; break; case H6280_A: A = val; break; case H6280_X: X = val; break; case H6280_Y: Y = val; break; case H6280_IRQ_MASK: h6280.irq_mask = val; CHECK_IRQ_LINES; break; case H6280_TIMER_STATE: h6280.timer_status = val; break; case H6280_NMI_STATE: h6280_set_irq_line( IRQ_LINE_NMI, val ); break; case H6280_IRQ1_STATE: h6280_set_irq_line( 0, val ); break; case H6280_IRQ2_STATE: h6280_set_irq_line( 1, val ); break; case H6280_IRQT_STATE: h6280_set_irq_line( 2, val ); break; #ifdef MAME_DEBUG case H6280_M1: h6280.mmr[0] = val; break; case H6280_M2: h6280.mmr[1] = val; break; case H6280_M3: h6280.mmr[2] = val; break; case H6280_M4: h6280.mmr[3] = val; break; case H6280_M5: h6280.mmr[4] = val; break; case H6280_M6: h6280.mmr[5] = val; break; case H6280_M7: h6280.mmr[6] = val; break; case H6280_M8: h6280.mmr[7] = val; break; #endif default: if( regnum <= REG_SP_CONTENTS ) { unsigned offset = S + 2 * (REG_SP_CONTENTS - regnum); if( offset < 0x1ff ) { WRMEM( offset, val & 0xff ); WRMEM( offset+1, (val >> 8) & 0xff ); } }
int h6280_execute(int cycles) { int in,lastcycle,deltacycle; h6280_ICount = cycles; /* Subtract cycles used for taking an interrupt */ h6280_ICount -= h6280.extra_cycles; h6280.extra_cycles = 0; lastcycle = h6280_ICount; /* Execute instructions */ do { h6280.ppc = h6280.pc; #ifdef MAME_DEBUG { if (mame_debug) { /* Copy the segmentation registers for debugger to use */ int i; for (i=0; i<8; i++) H6280_debug_mmr[i]=h6280.mmr[i]; MAME_Debug(); } } #endif /* Execute 1 instruction */ in=RDOP(); PCW++; insnh6280[in](); /* Check internal timer */ if(h6280.timer_status) { deltacycle = lastcycle - h6280_ICount; h6280.timer_value -= deltacycle; if(h6280.timer_value<=0 && h6280.timer_ack==1) { h6280.timer_ack=h6280.timer_status=0; h6280_set_irq_line(2,ASSERT_LINE); } } lastcycle = h6280_ICount; /* If PC has not changed we are stuck in a tight loop, may as well finish */ if( h6280.pc.d == h6280.ppc.d ) { if (h6280_ICount > 0) h6280_ICount=0; h6280.extra_cycles = 0; return cycles; } } while (h6280_ICount > 0); /* Subtract cycles used for taking an interrupt */ h6280_ICount -= h6280.extra_cycles; h6280.extra_cycles = 0; return cycles - h6280_ICount; }
static int h6280_irq_callback(int irqline) { // printf("6280 irq callback: line %d\n", irqline); h6280_set_irq_line(irqline, CLEAR_LINE); return 0; }