/* Execute some instructions until we use up cycles clock cycles */ int m68k_execute(m68ki_cpu_core *m68k, unsigned int cycles) { m68k->initial_cycles = cycles; /* eat up any reset cycles */ if (m68k->reset_cycles) { int rc = m68k->reset_cycles; m68k->reset_cycles = 0; cycles -= rc; if (cycles <= 0) return rc; } /* Set our pool of clock cycles available */ m68k->remaining_cycles = cycles; /* See if interrupts came in */ m68ki_check_interrupts(m68k); /* Make sure we're not stopped */ if(!m68k->stopped) { /* Return point if we had an address error */ m68ki_set_address_error_trap(m68k); /* auto-disable (see m68kcpu.h) */ /* Main loop. Keep going until we run out of clock cycles */ do { /* Set tracing accodring to T1. (T0 is done inside instruction) */ m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */ /* Record previous program counter */ REG_PPC = REG_PC; /* Read an instruction and call its handler */ m68k->ir = m68ki_read_imm_16(m68k); m68ki_instruction_jump_table[m68k->ir](m68k); m68k->remaining_cycles -= m68k->cyc_instruction[m68k->ir]; /* Trace m68k_exception, if necessary */ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ } while (m68k->remaining_cycles > 0); /* set previous PC to current PC for the next entry into the loop */ REG_PPC = REG_PC; } else if (m68k->remaining_cycles > 0) m68k->remaining_cycles = 0; /* return how many clocks we used */ return m68k->initial_cycles - m68k->remaining_cycles; }
/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ void m68k_set_irq(unsigned int intLevel) { #if 0 uint old_level = CPU_INT_LEVEL; CPU_INT_LEVEL = int_level << 8; /* A transition from < 7 to 7 always interrupts (NMI) */ /* Note: Level 7 can also level trigger like a normal IRQ */ if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */ else m68ki_check_interrupts(); /* Level triggered (IRQ) */ #else int oldLevel = regs.intLevel; regs.intLevel = intLevel; // A transition from < 7 to 7 always interrupts (NMI) // Note: Level 7 can also level trigger like a normal IRQ if (oldLevel != 0x07 && regs.intLevel == 0x07) m68ki_exception_interrupt(7); // Edge triggered level 7 (NMI) else m68ki_check_interrupts(); // Level triggered (IRQ) #endif }
/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ void m68k_set_irq2(unsigned int intLevel) { // pthread_mutex_lock(&executionLock); // printf("m68k_set_irq: Could not get the lock!!!\n"); int oldLevel = regs.intLevel; regs.intLevel = intLevel; // A transition from < 7 to 7 always interrupts (NMI) // Note: Level 7 can also level trigger like a normal IRQ if (oldLevel != 0x07 && regs.intLevel == 0x07) m68ki_exception_interrupt(7); // Edge triggered level 7 (NMI) else m68ki_check_interrupts(); // Level triggered (IRQ) // pthread_mutex_unlock(&executionLock); }