void S9xMainLoop (void) { START_PROFILE_FUNC (S9xMainLoop); //CPUPack.Setting_SA1=Settings.SA1; if (Settings.APUEnabled) { if (Settings.SA1) S9xMainLoop_SA1_APU(); else { S9xMainLoop_NoSA1_APU(); } } else { if (Settings.SA1) S9xMainLoop_SA1_NoAPU(); else S9xMainLoop_NoSA1_NoAPU(); } #ifndef ME_SOUND if (cpu_glob_cycles>=0x00000000) { APU_EXECUTE2 (); } #endif CPUPack.Registers.PC = CPUPack.CPU.PC - CPUPack.CPU.PCBase; S9xPackStatus (); if (CPUPack.CPU.Flags & SCAN_KEYS_FLAG) { FINISH_PROFILE_FUNC (S9xMainLoop); S9xSyncSpeed (); CPUPack.CPU.Flags &= ~SCAN_KEYS_FLAG; } if (CPUPack.CPU.BRKTriggered && Settings.SuperFX && !CPUPack.CPU.TriedInterleavedMode2) { CPUPack.CPU.TriedInterleavedMode2 = TRUE; CPUPack.CPU.BRKTriggered = FALSE; S9xDeinterleaveMode2 (); } /*(APURegistersUncached.PC) = (IAPUuncached.PC) - (IAPUuncached.RAM); S9xAPUPackStatusUncached ();*/ }
void S9xDoHBlankProcessing () { START_PROFILE_FUNC (S9xDoHBlankProcessing); #ifdef CPU_SHUTDOWN CPU.WaitCounter++; #endif switch (CPU.WhichEvent) { case HBLANK_START_EVENT: if (IPPU.HDMA && CPU.V_Counter <= PPU.ScreenHeight) IPPU.HDMA = S9xDoHDMA (IPPU.HDMA); break; case HBLANK_END_EVENT: S9xSuperFXExec (); CPU.Cycles -= Settings.H_Max; (IAPUuncached->NextAPUTimerPos) -= (Settings.H_Max * 10000L); if ( (IAPUuncached->APUExecuting)) (APUuncached->Cycles) -= Settings.H_Max; else (APUuncached->Cycles) = 0; CPU.NextEvent = -1; ICPU.Scanline++; if (++CPU.V_Counter > (Settings.PAL ? SNES_MAX_PAL_VCOUNTER : SNES_MAX_NTSC_VCOUNTER)) { PPU.OAMAddr = PPU.SavedOAMAddr; PPU.OAMFlip = 0; CPU.V_Counter = 0; CPU.NMIActive = FALSE; ICPU.Frame++; PPU.HVBeamCounterLatched = 0; CPU.Flags |= SCAN_KEYS_FLAG; S9xStartHDMA (); } if (PPU.VTimerEnabled && !PPU.HTimerEnabled && CPU.V_Counter == PPU.IRQVBeamPos) { S9xSetIRQ (PPU_V_BEAM_IRQ_SOURCE); } if (CPU.V_Counter == PPU.ScreenHeight + FIRST_VISIBLE_LINE) { // Start of V-blank S9xEndScreenRefresh (); PPU.FirstSprite = 0; IPPU.HDMA = 0; // Bits 7 and 6 of $4212 are computed when read in S9xGetPPU. missing.dma_this_frame = 0; IPPU.MaxBrightness = PPU.Brightness; PPU.ForcedBlanking = (FillRAM[0x2100] >> 7) & 1; FillRAM[0x4210] = 0x80; if (FillRAM[0x4200] & 0x80) { CPU.NMIActive = TRUE; CPU.Flags |= NMI_FLAG; CPU.NMICycleCount = CPU.NMITriggerPoint; } } if (CPU.V_Counter == PPU.ScreenHeight + 3) S9xUpdateJoypads (); if (CPU.V_Counter == FIRST_VISIBLE_LINE) { FillRAM[0x4210] = 0; CPU.Flags &= ~NMI_FLAG; S9xStartScreenRefresh (); } if (CPU.V_Counter >= FIRST_VISIBLE_LINE && CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE) { RenderLine (CPU.V_Counter - FIRST_VISIBLE_LINE); } break; case HTIMER_BEFORE_EVENT: case HTIMER_AFTER_EVENT: if (PPU.HTimerEnabled && (!PPU.VTimerEnabled || CPU.V_Counter == PPU.IRQVBeamPos)) { S9xSetIRQ (PPU_H_BEAM_IRQ_SOURCE); } break; }