snes9xgx/source/snes9x/cpu.cpp

174 lines
3.7 KiB
C++
Raw Normal View History

/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
2009-11-30 09:14:38 +01:00
#include "snes9x.h"
#include "memmap.h"
#include "dma.h"
2010-01-27 23:08:56 +01:00
#include "apu/apu.h"
#include "fxemu.h"
2009-11-30 09:14:38 +01:00
#include "sdd1.h"
2010-01-27 23:08:56 +01:00
#include "srtc.h"
#include "snapshot.h"
2010-01-27 23:08:56 +01:00
#include "cheats.h"
2008-09-10 07:57:37 +02:00
#include "logger.h"
2010-01-27 23:08:56 +01:00
#ifdef DEBUGGER
#include "debug.h"
2008-09-10 07:57:37 +02:00
#endif
2010-01-27 23:08:56 +01:00
static void S9xResetCPU (void);
static void S9xSoftResetCPU (void);
2010-01-27 23:08:56 +01:00
static void S9xResetCPU (void)
{
2010-01-27 23:08:56 +01:00
S9xSoftResetCPU();
Registers.SL = 0xff;
Registers.P.W = 0;
Registers.A.W = 0;
Registers.X.W = 0;
Registers.Y.W = 0;
SetFlags(MemoryFlag | IndexFlag | IRQ | Emulation);
ClearFlags(Decimal);
}
2010-01-27 23:08:56 +01:00
static void S9xSoftResetCPU (void)
{
2010-01-27 23:08:56 +01:00
CPU.Cycles = 182; // Or 188. This is the cycle count just after the jump to the Reset Vector.
CPU.PrevCycles = CPU.Cycles;
2010-01-27 23:08:56 +01:00
CPU.V_Counter = 0;
CPU.Flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG);
CPU.PCBase = NULL;
CPU.NMIPending = FALSE;
CPU.IRQLine = FALSE;
CPU.IRQTransition = FALSE;
CPU.IRQExternal = FALSE;
2010-01-27 23:08:56 +01:00
CPU.MemSpeed = SLOW_ONE_CYCLE;
CPU.MemSpeedx2 = SLOW_ONE_CYCLE * 2;
CPU.FastROMSpeed = SLOW_ONE_CYCLE;
2008-09-10 07:57:37 +02:00
CPU.InDMA = FALSE;
CPU.InHDMA = FALSE;
2010-01-27 23:08:56 +01:00
CPU.InDMAorHDMA = FALSE;
2008-09-10 07:57:37 +02:00
CPU.InWRAMDMAorHDMA = FALSE;
CPU.HDMARanInDMA = 0;
2010-01-27 23:08:56 +01:00
CPU.CurrentDMAorHDMAChannel = -1;
CPU.WhichEvent = HC_RENDER_EVENT;
CPU.NextEvent = Timings.RenderPos;
CPU.WaitingForInterrupt = FALSE;
CPU.AutoSaveTimer = 0;
CPU.SRAMModified = FALSE;
Registers.PBPC = 0;
Registers.PB = 0;
Registers.PCw = S9xGetWord(0xfffc);
OpenBus = Registers.PCh;
Registers.D.W = 0;
Registers.DB = 0;
Registers.SH = 1;
Registers.SL -= 3;
Registers.XH = 0;
Registers.YH = 0;
ICPU.ShiftedPB = 0;
ICPU.ShiftedDB = 0;
SetFlags(MemoryFlag | IndexFlag | IRQ | Emulation);
ClearFlags(Decimal);
Timings.InterlaceField = FALSE;
Timings.H_Max = Timings.H_Max_Master;
Timings.V_Max = Timings.V_Max_Master;
2010-01-27 23:08:56 +01:00
Timings.NMITriggerPos = 0xffff;
Timings.NextIRQTimer = 0x0fffffff;
Timings.IRQFlagChanging = IRQ_NONE;
if (Model->_5A22 == 2)
Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v2;
else
Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v1;
2010-01-27 23:08:56 +01:00
S9xSetPCBase(Registers.PBPC);
2009-11-30 09:14:38 +01:00
2010-01-27 23:08:56 +01:00
ICPU.S9xOpcodes = S9xOpcodesE1;
ICPU.S9xOpLengths = S9xOpLengthsM1X1;
2010-01-27 23:08:56 +01:00
S9xUnpackStatus();
2009-11-30 09:14:38 +01:00
}
void S9xReset (void)
{
2010-01-27 23:08:56 +01:00
S9xResetSaveTimer(FALSE);
S9xResetLogger();
2010-01-27 23:08:56 +01:00
memset(Memory.RAM, 0x55, 0x20000);
memset(Memory.VRAM, 0x00, 0x10000);
2018-11-12 02:31:52 +01:00
memset(Memory.FillRAM, 0, 0x8000);
S9xResetBSX();
2010-01-27 23:08:56 +01:00
S9xResetCPU();
S9xResetPPU();
S9xResetDMA();
S9xResetAPU();
S9xResetMSU();
2010-01-27 23:08:56 +01:00
if (Settings.DSP)
S9xResetDSP();
if (Settings.SuperFX)
S9xResetSuperFX();
if (Settings.SA1)
S9xSA1Init();
if (Settings.SDD1)
S9xResetSDD1();
if (Settings.SPC7110)
S9xResetSPC7110();
if (Settings.C4)
S9xInitC4();
if (Settings.OBC1)
2010-01-27 23:08:56 +01:00
S9xResetOBC1();
if (Settings.SRTC)
S9xResetSRTC();
2018-01-17 15:23:10 +01:00
if (Settings.MSU1)
S9xMSU1Init();
2010-01-27 23:08:56 +01:00
S9xInitCheatData();
}
void S9xSoftReset (void)
{
2010-01-27 23:08:56 +01:00
S9xResetSaveTimer(FALSE);
2018-11-12 02:31:52 +01:00
memset(Memory.FillRAM, 0, 0x8000);
2010-01-27 23:08:56 +01:00
if (Settings.BS)
S9xResetBSX();
2009-11-30 09:14:38 +01:00
2010-01-27 23:08:56 +01:00
S9xSoftResetCPU();
S9xSoftResetPPU();
S9xResetDMA();
S9xSoftResetAPU();
S9xResetMSU();
2010-01-27 23:08:56 +01:00
if (Settings.DSP)
S9xResetDSP();
if (Settings.SuperFX)
S9xResetSuperFX();
if (Settings.SA1)
S9xSA1Init();
if (Settings.SDD1)
S9xResetSDD1();
if (Settings.SPC7110)
S9xResetSPC7110();
if (Settings.C4)
S9xInitC4();
if (Settings.OBC1)
S9xResetOBC1();
if (Settings.SRTC)
S9xResetSRTC();
2018-01-17 15:23:10 +01:00
if (Settings.MSU1)
S9xMSU1Init();
2010-01-27 23:08:56 +01:00
S9xInitCheatData();
}