コード例 #1
0
ファイル: WindowMonitor.cpp プロジェクト: Superxwolf/nModules
EXPORT_CDECL(bool) IsTaskbarWindow(HWND window) {
  if (!IsWindow(window) || !IsWindowVisible(window)) {
    return false;
  }
  LONG_PTR exStyle = GetWindowLongPtr(window, GWL_EXSTYLE);
  return CHECKFLAG(exStyle, WS_EX_APPWINDOW) ||
    GetParent(window) == nullptr &&
    GetWindow(window, GW_OWNER) == nullptr &&
    !CHECKFLAG(exStyle, WS_EX_TOOLWINDOW) &&
    GetWindowTextLength(window) != 0;
}
コード例 #2
0
ファイル: TaskButton.cpp プロジェクト: Superxwolf/nModules
void TaskButton::ToggleAlwaysOnTop() {
  if (CHECKFLAG(GetWindowLongPtr(mWindow, GWL_EXSTYLE), WS_EX_TOPMOST)) {
    SetWindowPos(mWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
  } else {
    SetWindowPos(mWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  }
}
コード例 #3
0
VOID
VioStorVQUnlock(
    IN PVOID DeviceExtension,
    IN ULONG MessageID,
    IN PSTOR_LOCK_HANDLE LockHandle,
    IN BOOLEAN isr
    )
{
    PADAPTER_EXTENSION  adaptExt;
    RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("--->%s MessageID = %d\n", __FUNCTION__, MessageID));
    adaptExt = (PADAPTER_EXTENSION)DeviceExtension;

    if (!adaptExt->msix_enabled) {
        if (!isr) {
            StorPortReleaseSpinLock(DeviceExtension, LockHandle);
        }
    }
    else {
        if ((adaptExt->num_queues == 1) ||
            (!CHECKFLAG(adaptExt->perfFlags, STOR_PERF_CONCURRENT_CHANNELS))) {
            if (!isr) {
                StorPortReleaseMSISpinLock(DeviceExtension, (adaptExt->msix_one_vector ? 0 : MessageID), LockHandle->Context.OldIrql);
            }
        }
        else {
            NT_ASSERT(MessageID > 0);
            NT_ASSERT(MessageID <= adaptExt->num_queues);
            StorPortReleaseSpinLock(DeviceExtension, LockHandle);
        }
    }
    RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("<---%s MessageID = %d\n", __FUNCTION__, MessageID));
}
コード例 #4
0
ファイル: TaskButton.cpp プロジェクト: Superxwolf/nModules
void TaskButton::Redraw(DWORD parts) {
  mPane->Lock();
  if (CHECKFLAG(parts, Part::Text)) {
    wchar_t windowText[256];
    GetWindowText(mWindow, windowText, 256);
    mPane->SetText(windowText);
  }
  if (CHECKFLAG(parts, Part::Icon)) {
    mIconPainter->SetImage(nCore::GetWindowIcon(mWindow, 32));
    mPane->Repaint(&mIconPosition);
  }
  if (CHECKFLAG(parts, Part::OverlayIcon)) {
    mOverlayIconPainter->SetImage(mTaskData.overlayIcon);
    mPane->Repaint(&mOverlayIconPosition);
  }
  mPane->Unlock();
}
コード例 #5
0
BOOLEAN
SendSRB(
    IN PVOID DeviceExtension,
    IN PSRB_TYPE Srb
    )
{
    PADAPTER_EXTENSION  adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
    PSRB_EXTENSION      srbExt   = SRB_EXTENSION(Srb);
    PVOID               va = NULL;
    ULONGLONG           pa = 0;
    ULONG               QueueNumber = 0;
    ULONG               OldIrql = 0;
    ULONG               MessageId = 0;
    BOOLEAN             kick = FALSE;
    STOR_LOCK_HANDLE    LockHandle = { 0 };
    ULONG               status = STOR_STATUS_SUCCESS;
ENTER_FN();
    SET_VA_PA();

    if (adaptExt->num_queues > 1) {
        QueueNumber = adaptExt->cpu_to_vq_map[srbExt->cpu] + VIRTIO_SCSI_REQUEST_QUEUE_0;
        MessageId = QueueNumber + 1;
    }
    else {
        QueueNumber = VIRTIO_SCSI_REQUEST_QUEUE_0;
    }
    VioScsiAcquireSpinLock(DeviceExtension, MessageId, &LockHandle);
    if (virtqueue_add_buf(adaptExt->vq[QueueNumber],
                     &srbExt->sg[0],
                     srbExt->out, srbExt->in,
                     &srbExt->cmd, va, pa) >= 0){
        kick = TRUE;
    }
    else {
        RhelDbgPrint(TRACE_LEVEL_ERROR, ("%s Can not add packet to queue.\n", __FUNCTION__));
//FIXME
    }

    VioScsiReleaseSpinLock(DeviceExtension, MessageId, &LockHandle);

    if (kick == TRUE) {
        virtqueue_kick(adaptExt->vq[QueueNumber]);
    }

    if (adaptExt->num_queues > 1) {
        if (CHECKFLAG(adaptExt->perfFlags, STOR_PERF_OPTIMIZE_FOR_COMPLETION_DURING_STARTIO)) {
//            ProcessQueue(DeviceExtension, MessageId, FALSE);
        }
    }
EXIT_FN();
    return kick;
}
コード例 #6
0
BOOLEAN
RhelDoReadWrite(PVOID DeviceExtension,
                PSRB_TYPE Srb)
{
    PADAPTER_EXTENSION  adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
    PSRB_EXTENSION      srbExt   = SRB_EXTENSION(Srb);
    PVOID               va = NULL;
    ULONGLONG           pa = 0ULL;

    ULONG               QueueNumber = 0;
    ULONG               OldIrql = 0;
    ULONG               MessageId = 0;
    BOOLEAN             result = FALSE;
    bool                notify = FALSE;
    STOR_LOCK_HANDLE    LockHandle = { 0 };
    ULONG               status = STOR_STATUS_SUCCESS;
    struct virtqueue    *vq = NULL;

    SET_VA_PA();

    if (adaptExt->num_queues > 1) {
        STARTIO_PERFORMANCE_PARAMETERS param;
        param.Size = sizeof(STARTIO_PERFORMANCE_PARAMETERS);
        status = StorPortGetStartIoPerfParams(DeviceExtension, (PSCSI_REQUEST_BLOCK)Srb, &param);
        if (status == STOR_STATUS_SUCCESS && param.MessageNumber != 0) {
           MessageId = param.MessageNumber;
           QueueNumber = MessageId - 1;
           RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("%s srb %p, cpu %d :: QueueNumber %lu, MessageNumber %lu, ChannelNumber %lu.\n", __FUNCTION__, Srb, srbExt->cpu, QueueNumber, param.MessageNumber, param.ChannelNumber));
        }
        else {
           RhelDbgPrint(TRACE_LEVEL_ERROR, ("%s StorPortGetStartIoPerfParams failed srb %p cpu %d status 0x%x.\n", __FUNCTION__, Srb, srbExt->cpu, status));
           QueueNumber = 0;
           MessageId = 1;
        }
    }
    else {
        QueueNumber = 0;
        MessageId = 1;
    }

    srbExt->MessageID = MessageId;
    vq = adaptExt->vq[QueueNumber];
    RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("<--->%s : QueueNumber 0x%x vq = %p\n", __FUNCTION__, QueueNumber, vq));

    VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE);
    if (virtqueue_add_buf(vq,
                     &srbExt->vbr.sg[0],
                     srbExt->out, srbExt->in,
                     &srbExt->vbr, va, pa) >= 0) {
        notify = virtqueue_kick_prepare(vq);
        VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE);
#ifdef DBG
        InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt);
#endif
        result = TRUE;
    }
    else {
        VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE);
        RhelDbgPrint(TRACE_LEVEL_FATAL, ("%s Can not add packet to queue %d.\n", __FUNCTION__, QueueNumber));
        StorPortBusy(DeviceExtension, 2);
    }
    if (notify) {
        virtqueue_notify(vq);
    }

#if (NTDDI_VERSION > NTDDI_WIN7)
    if (adaptExt->num_queues > 1) {
        if (CHECKFLAG(adaptExt->perfFlags, STOR_PERF_OPTIMIZE_FOR_COMPLETION_DURING_STARTIO)) {
           VioStorCompleteRequest(DeviceExtension, MessageId, FALSE);
        }
    }
#endif
    return result;
}
コード例 #7
0
ファイル: TrayIcon.cpp プロジェクト: Superxwolf/nModules
void TrayIcon::Modify(LPLSNOTIFYICONDATA nid) {
  if (CHECKFLAG(nid->uFlags, NIF_ICON)) {
    mIconPainter->SetImage(nid->hIcon);
    mPane->Repaint(nullptr);
  }
}
コード例 #8
0
BOOLEAN
SendSRB(
    IN PVOID DeviceExtension,
    IN PSCSI_REQUEST_BLOCK Srb
    )
{
    PADAPTER_EXTENSION  adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
    PSRB_EXTENSION      srbExt   = (PSRB_EXTENSION)Srb->SrbExtension;
    PVOID               va = NULL;
    ULONGLONG           pa = 0;
    ULONG               QueueNumber = 0;
    ULONG               OldIrql = 0;
    ULONG               MessageId = 0;
    BOOLEAN             kick = FALSE;
    STOR_LOCK_HANDLE    LockHandle = { 0 };
    ULONG               status = STOR_STATUS_SUCCESS;
ENTER_FN();
    SET_VA_PA();
    RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("Srb %p issued on %d::%d QueueNumber %d\n",
                 Srb, srbExt->procNum.Group, srbExt->procNum.Number, QueueNumber));

    if (adaptExt->num_queues > 1) {
        QueueNumber = adaptExt->cpu_to_vq_map[srbExt->procNum.Number];
        MessageId = QueueNumber + 1;
        if (CHECKFLAG(adaptExt->perfFlags, STOR_PERF_OPTIMIZE_FOR_COMPLETION_DURING_STARTIO)) {
            ProcessQueue(DeviceExtension, MessageId, FALSE);
        }
//        status = StorPortAcquireMSISpinLock(DeviceExtension, MessageId, &OldIrql);
        if (status != STOR_STATUS_SUCCESS) {
            RhelDbgPrint(TRACE_LEVEL_ERROR, ("%s StorPortAcquireMSISpinLock returned status 0x%x\n", __FUNCTION__, status));
        }
    }
    else {
        QueueNumber = VIRTIO_SCSI_REQUEST_QUEUE_0;
        StorPortAcquireSpinLock(DeviceExtension, InterruptLock, NULL, &LockHandle);
    }
    if (virtqueue_add_buf(adaptExt->vq[QueueNumber],
                     &srbExt->sg[0],
                     srbExt->out, srbExt->in,
                     &srbExt->cmd, va, pa) >= 0){
        kick = TRUE;
    }
    else {
        RhelDbgPrint(TRACE_LEVEL_WARNING, ("%s Cant add packet to queue.\n", __FUNCTION__));
//FIXME
    }
    if (adaptExt->num_queues > 1) {
//        status = StorPortReleaseMSISpinLock(DeviceExtension, MessageId, OldIrql);
        if (status != STOR_STATUS_SUCCESS) {
            RhelDbgPrint(TRACE_LEVEL_ERROR, ("%s StorPortReleaseMSISpinLock returned status 0x%x\n", __FUNCTION__, status));
        }
    }
    else {
        StorPortReleaseSpinLock(DeviceExtension, &LockHandle);
    }
    if (kick == TRUE) {
        virtqueue_kick(adaptExt->vq[QueueNumber]);
    }
    return kick;
EXIT_FN();
}
コード例 #9
0
ファイル: cpuexec.cpp プロジェクト: Tchaly/snes9x-rpi
void S9xMainLoop (void)
{
	struct SCPUState *cpu = &CPU;
	struct SICPU *icpu = &ICPU;
	struct SIAPU *iapu = &IAPU;
	struct SAPU *apu = &APU;
	struct SRegisters *reg = &Registers;
	struct SAPURegisters *areg = &APURegisters;

    for (;;)
    {
		APU_EXECUTE ();

		if (cpu->Flags)
		{
			if (cpu->Flags & NMI_FLAG)
			{
				if (--cpu->NMICycleCount == 0)
				{
					cpu->Flags &= ~NMI_FLAG;
					if (cpu->WaitingForInterrupt)
					{
						cpu->WaitingForInterrupt = FALSE;
						++cpu->PC;
					}
					S9xOpcode_NMI ();
				}
			}

#ifdef DEBUGGER
			if ((cpu->Flags & BREAK_FLAG) &&
			!(cpu->Flags & SINGLE_STEP_FLAG))
			{
				for (int Break = 0; Break != 6; Break++)
				{
					if (S9xBreakpoint[Break].Enabled &&
					S9xBreakpoint[Break].Bank == Registers.PB &&
					S9xBreakpoint[Break].Address == cpu->PC - cpu->PCBase)
					{
						if (S9xBreakpoint[Break].Enabled == 2)
							S9xBreakpoint[Break].Enabled = TRUE;
						else
							cpu->Flags |= DEBUG_MODE_FLAG;
					}
				}
			}
#endif
			CHECK_SOUND ();

			if (cpu->Flags & IRQ_PENDING_FLAG)
			{
				if (cpu->IRQCycleCount == 0)
				{
					if (cpu->WaitingForInterrupt)
					{
						cpu->WaitingForInterrupt = FALSE;
						cpu->PC++;
					}
					if (cpu->IRQActive)
//					if (cpu->IRQActive && !Settings.DisableIRQ)
					{
						if (!CHECKFLAG (IRQ))
							S9xOpcode_IRQ ();
					}
					else
						cpu->Flags &= ~IRQ_PENDING_FLAG;
				}
				else
					cpu->IRQCycleCount--;
			}
#ifdef DEBUGGER
			if (cpu->Flags & DEBUG_MODE_FLAG)
				break;
#endif
			if (cpu->Flags & SCAN_KEYS_FLAG)
				break;
#ifdef DEBUGGER
			if (cpu->Flags & TRACE_FLAG)
				S9xTrace ();

			if (cpu->Flags & SINGLE_STEP_FLAG)
			{
				cpu->Flags &= ~SINGLE_STEP_FLAG;
				cpu->Flags |= DEBUG_MODE_FLAG;
			}
#endif
		} //if (CPU.Flags)
#ifdef CPU_SHUTDOWN
		cpu->PCAtOpcodeStart = cpu->PC;
#endif
#ifdef VAR_CYCLES
		cpu->Cycles += cpu->MemSpeed;
#else
		cpu->Cycles += icpu->Speed [*cpu->PC];
#endif
		(*icpu->S9xOpcodes [*cpu->PC++].S9xOpcode) (reg, icpu, cpu);
#ifndef _ZAURUS
		if (SA1.Executing)
			S9xSA1MainLoop ();
#endif
		DO_HBLANK_CHECK();
	} // for(;;)
    Registers.PC = cpu->PC - cpu->PCBase;
    S9xPackStatus ();
    areg->PC = iapu->PC - iapu->RAM;
    S9xAPUPackStatus_OP ();
    if (cpu->Flags & SCAN_KEYS_FLAG)
    {
#ifdef DEBUGGER
		if (!(cpu->Flags & FRAME_ADVANCE_FLAG))
#endif
			S9xSyncSpeed ();
		cpu->Flags &= ~SCAN_KEYS_FLAG;
    }
#ifndef _ZAURUS
    if (cpu->BRKTriggered && Settings.SuperFX && !cpu->TriedInterleavedMode2)
    {
		cpu->TriedInterleavedMode2 = TRUE;
		cpu->BRKTriggered = FALSE;
		S9xDeinterleaveMode2 ();
    }
#endif
}
コード例 #10
0
ファイル: dcf77.c プロジェクト: K-4U/12006-Dot-Matrix
void handleBit(){
	
	if(onCounter > 7 && onCounter < 14){
		errorInHandle = handleDCF(0, secondCounter);
	}else if(onCounter > 17 && onCounter < 24){
		errorInHandle = handleDCF(1, secondCounter);
	}else if(onCounter != 0){
		//Error bit!
		//SETFLAG(FLAG_ERROR);
		if(secondCounter > 20 && secondCounter < 36){
			errorInHandle = 1;
		} //The rest isn't needed		
	}
	
	secondCounter++;
	if(offCounter >= 93 && secondCounter < 59 && secondCounter > 2){
		//It CAN read the clock, just not handle it yet
		SETFLAG(FLAG_SYNCED);
		RESETFLAG(FLAG_STARTUP);
		RESETFLAG(FLAG_ERROR);
		secondCounter = 0;
		//This probably means it just started up..
	}else if(offCounter >= 93 && secondCounter >= 59){
		if(errorInHandle){
			SETFLAG(FLAG_ERROR);
			errorInHandle = 0;
		}else{
			RESETFLAG(FLAG_ERROR);
		}
		//Oh, new minute! :O
		secondCounter = 0;
		SETFLAG(FLAG_SYNCED);
		//Display the new time
		if(dcfTime.hours > 24 || dcfTime.minutes > 59){		
			//ERROR!
			SETFLAG(FLAG_ERROR);
			dcfTime.hours = 0;
			dcfTime.minutes = 0;
		}
		//if(!checkTime(dcfTime)){
		//	SETFLAG(FLAG_ERROR);
		//}
		/*if(dcfHours > currentHour && dcfHours - currentHour >= 2 && currentHour != 0 && currentHour != 23){
			SETFLAG(FLAG_ERROR);
			addMinute();
		}else if(dcfHours < currentHour && currentHour - dcfHours >= 2 && currentHour != 0 && currentHour != 23){
			SETFLAG(FLAG_ERROR);
			addMinute();
		}
		
		if(dcfMinutes > currentMinutes && dcfMinutes - currentMinutes >= 9 && currentMinutes != 0 && currentMinutes != 59){
			SETFLAG(FLAG_ERROR);
			addMinute();
		}else if(dcfMinutes < currentMinutes && currentMinutes - dcfMinutes >= 9 && currentMinutes != 0 && currentMinutes != 59){
			SETFLAG(FLAG_ERROR);
			addMinute();
		}*/
		if(!CHECKFLAG(FLAG_ERROR)){
			currentTime.hours = dcfTime.hours;
			currentTime.minutes = dcfTime.minutes;
			RESETFLAG(FLAG_STARTUP);
		}else{
			//RESETFLAG(FLAG_ERROR);
			RESETFLAG(FLAG_SYNCED);
			if(currentTime.hours == 0 && currentTime.minutes == 0){
				currentTime.hours = dcfTime.hours;
				currentTime.minutes = dcfTime.minutes;
			}else{
				addMinute(&currentTime);
			}
		}
	}
	onCounter = 0;
	offCounter = 0;
}
コード例 #11
0
ファイル: DotMatrixKlok.c プロジェクト: K-4U/12006-Dot-Matrix
int main(void){
	//PORT mapping
	//On PORTD, we have the matrix the lines.
	//On PORTC, we have inputs, 2 buttons and the DCF and Time sensors
	//On PortB we have control over the shift registers and the DEBUG led!
	//		 76543210
	DDRC = 0b00000110;
	DDRD = 0b11111111;
	DDRB = 0b11111111;
	PORTC = 0b00111001;
	PORTD = 0;
	PORTB = 0;
	
	//Initialize Interrupt for timer0
	TCNT0 = 0xFC;
	TCCR0A = (1 << WGM01);
	TCCR0B = (0<<CS02)|(0<<CS01)|(1<<CS00);
	//TIMSK0 |= _BV(TOIE0);
	
	//Initialize Interrupt for timer1
	TCCR1A |= (0 << COM1A1) | (0 << COM1A0);
	TCCR1B |= (1 << WGM12) | (1 << CS11); // Set CTC and prescaler :8
	OCR1A = 0x61A7;
	TIMSK1 |= (1 << OCIE1A);
	sei();

	DEBUG_UIT();
	SPI_MasterInit();
	
	//SETFLAG(FLAG_STARTUP);
	
	uint16_t refreshCounter = 0;
	uint16_t ttCounter = 0;
	uint8_t tempCounter = 0;
	doDisplay(0);
    while(1) {
		if(CHECKFLAG(FLAG_REFRESHDISPLAY)){
			RESETFLAG(FLAG_REFRESHDISPLAY);
			refreshDisplay();
		}
		
		if(CHECKFLAG(FLAG_HANDLEBIT)){
			RESETFLAG(FLAG_HANDLEBIT);
			//DEBUG_AAN();
			//handleBit();
		}
		
		if(CHECKFLAG(FLAG_STARTUP)){
			//Do something nice..
			if(ttCounter == 4000){
				for(uint8_t display = 0;display <= MAX_DISPLAY; display++){
					for(uint8_t row = 0;row<=8;row++){
						if(display == (tempCounter / 5)){
							displays[display][row] = (3 << (tempCounter % 5));
						}else{
							displays[display][row] = 0;
						}
					}					
				}				
				tempCounter++;
				ttCounter=0;
				if(tempCounter == MAX_DISPLAY * 5){
					tempCounter=0;
				}
			}
			ttCounter++;
		}else{
		//if(secondCounter % 10 >= 8){
			/*if(CHECKFLAG(FLAG_READTEMP)){
				temperature = (uint16_t) ds1820_read();
				RESETFLAG(FLAG_READTEMP);
				//doDisplay(temperature);
			}else{*/
				showClock(12,34);
			//}			
		//}else{
			//showClock(currentTime.hours,currentTime.minutes);
		//}
		}
		
		if(refreshCounter == 20){
			SETFLAG(FLAG_REFRESHDISPLAY);
			refreshCounter = 0;
			//doDisplay(refreshCounter);
		}
		refreshCounter++;
		//doDisplay(refreshCounter);
    }
}
コード例 #12
0
void S9xMainLoop (struct SRegisters * reg, struct SICPU * icpu, struct SCPUState * cpu)
{
#else
void S9xMainLoop (void)
{
	struct SICPU		* icpu  = &ICPU;
	struct SCPUState	* cpu	= &CPU;
	struct SRegisters	* reg	= &Registers;
#endif
    for (;;)
    {
		APU_EXECUTE ();

		if (CPU.Flags)
		{
			if (CPU.Flags & NMI_FLAG)
			{
				if (--CPU.NMICycleCount == 0)
				{
					CPU.Flags &= ~NMI_FLAG;
					if (CPU.WaitingForInterrupt)
					{
						CPU.WaitingForInterrupt = FALSE;
						++CPU.PC;
					}
					S9xOpcode_NMI ();
				}
			}

#ifdef DEBUGGER
			if ((CPU.Flags & BREAK_FLAG) &&
			!(CPU.Flags & SINGLE_STEP_FLAG))
			{
				for (int Break = 0; Break != 6; Break++)
				{
					if (S9xBreakpoint[Break].Enabled &&
					S9xBreakpoint[Break].Bank == Registers.PB &&
					S9xBreakpoint[Break].Address == CPU.PC - CPU.PCBase)
					{
						if (S9xBreakpoint[Break].Enabled == 2)
							S9xBreakpoint[Break].Enabled = TRUE;
						else
							CPU.Flags |= DEBUG_MODE_FLAG;
					}
				}
			}
#endif
			CHECK_SOUND ();

			if (CPU.Flags & IRQ_PENDING_FLAG)
			{
				if (CPU.IRQCycleCount == 0)
				{
					if (CPU.WaitingForInterrupt)
					{
						CPU.WaitingForInterrupt = FALSE;
						CPU.PC++;
					}
					if (CPU.IRQActive && !Settings.DisableIRQ)
					{
						if (!CHECKFLAG (IRQ))
							S9xOpcode_IRQ ();
					}
					else
						CPU.Flags &= ~IRQ_PENDING_FLAG;
				}
				else
					CPU.IRQCycleCount--;
			}
#ifdef DEBUGGER
			if (CPU.Flags & DEBUG_MODE_FLAG)
				break;
#endif
			if (CPU.Flags & SCAN_KEYS_FLAG)
				break;
#ifdef DEBUGGER
			if (CPU.Flags & TRACE_FLAG)
				S9xTrace ();

			if (CPU.Flags & SINGLE_STEP_FLAG)
			{
				CPU.Flags &= ~SINGLE_STEP_FLAG;
				CPU.Flags |= DEBUG_MODE_FLAG;
			}
#endif
		} //if (CPU.Flags)
#ifdef CPU_SHUTDOWN
		CPU.PCAtOpcodeStart = CPU.PC;
#endif
#ifdef VAR_CYCLES
		CPU.Cycles += CPU.MemSpeed;
#else
		CPU.Cycles += ICPU.Speed [*CPU.PC];
#endif
		(*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode) (&Registers, &ICPU, &CPU);
	
		if (SA1.Executing)
			S9xSA1MainLoop ();
		DO_HBLANK_CHECK();
	} // for(;;)
    Registers.PC = CPU.PC - CPU.PCBase;
    S9xPackStatus ();
    APURegisters.PC = IAPU.PC - IAPU.RAM;
    S9xAPUPackStatus ();
    if (CPU.Flags & SCAN_KEYS_FLAG)
    {
#ifdef DEBUGGER
		if (!(CPU.Flags & FRAME_ADVANCE_FLAG))
#endif
			S9xSyncSpeed ();
		CPU.Flags &= ~SCAN_KEYS_FLAG;
    }
    if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2)
    {
		CPU.TriedInterleavedMode2 = TRUE;
		CPU.BRKTriggered = FALSE;
		S9xDeinterleaveMode2 ();
    }
}


void S9xSetIRQ (uint32 source)
{
    CPU.IRQActive |= source;
    CPU.Flags |= IRQ_PENDING_FLAG;
    CPU.IRQCycleCount = 3;
    if (CPU.WaitingForInterrupt)
    {
		// Force IRQ to trigger immediately after WAI - 
		// Final Fantasy Mystic Quest crashes without this.
		CPU.IRQCycleCount = 0;
		CPU.WaitingForInterrupt = FALSE;
		CPU.PC++;
    }
}