diff options
Diffstat (limited to 'source/cpuops.c')
-rw-r--r-- | source/cpuops.c | 5307 |
1 files changed, 5307 insertions, 0 deletions
diff --git a/source/cpuops.c b/source/cpuops.c new file mode 100644 index 0000000..9dc7f0c --- /dev/null +++ b/source/cpuops.c @@ -0,0 +1,5307 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +/*****************************************************************************/ +/* CPU-S9xOpcodes.CPP */ +/* This file contains all the opcodes */ +/*****************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "missing.h" +#include "apu.h" +#include "sa1.h" +#include "spc7110.h" + +#include "cpuexec.h" +#include "cpuaddr.h" +#include "cpuops.h" +#include "cpumacro.h" +#include "apu.h" + +EXTERN_C long OpAddress; + +// For use with the opcodes whose functions here examine the OpAddress. +static void OpAddressPassthrough (long Addr) +{ + OpAddress = Addr; +} + +/* ADC *************************************************************************************** */ +static void Op69M1 (void) +{ + Immediate8 (READ, ADC8); +} + +static void Op69M0 (void) +{ + Immediate16 (READ, ADC16); +} + +static void Op65M1 (void) +{ + Direct (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op65M0 (void) +{ + Direct (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op75M1 (void) +{ + DirectIndexedX (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op75M0 (void) +{ + DirectIndexedX (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op72M1 (void) +{ + DirectIndirect (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op72M0 (void) +{ + DirectIndirect (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op61M1 (void) +{ + DirectIndexedIndirect (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op61M0 (void) +{ + DirectIndexedIndirect (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op71M1 (void) +{ + DirectIndirectIndexed (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op71M0 (void) +{ + DirectIndirectIndexed (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op67M1 (void) +{ + DirectIndirectLong (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op67M0 (void) +{ + DirectIndirectLong (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op77M1 (void) +{ + DirectIndirectIndexedLong (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op77M0 (void) +{ + DirectIndirectIndexedLong (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op6DM1 (void) +{ + Absolute (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op6DM0 (void) +{ + Absolute (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op7DM1 (void) +{ + AbsoluteIndexedX (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op7DM0 (void) +{ + AbsoluteIndexedX (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op79M1 (void) +{ + AbsoluteIndexedY (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op79M0 (void) +{ + AbsoluteIndexedY (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op6FM1 (void) +{ + AbsoluteLong (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op6FM0 (void) +{ + AbsoluteLong (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op7FM1 (void) +{ + AbsoluteLongIndexedX (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op7FM0 (void) +{ + AbsoluteLongIndexedX (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op63M1 (void) +{ + StackRelative (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op63M0 (void) +{ + StackRelative (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op73M1 (void) +{ + StackRelativeIndirectIndexed (READ, ADC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void Op73M0 (void) +{ + StackRelativeIndirectIndexed (READ, ADC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +/**********************************************************************************************/ + +/* AND *************************************************************************************** */ +static void Op29M1 (void) +{ + ICPU.Registers.AL &= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.AL); +} + +static void Op29M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.A.W &= *(uint16 *) CPU.PC; +#else + ICPU.Registers.A.W &= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.A.W); +} + +static void Op25M1 (void) +{ + Direct (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op25M0 (void) +{ + Direct (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op35M1 (void) +{ + DirectIndexedX (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op35M0 (void) +{ + DirectIndexedX (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op32M1 (void) +{ + DirectIndirect (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op32M0 (void) +{ + DirectIndirect (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op21M1 (void) +{ + DirectIndexedIndirect (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op21M0 (void) +{ + DirectIndexedIndirect (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op31M1 (void) +{ + DirectIndirectIndexed (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op31M0 (void) +{ + DirectIndirectIndexed (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op27M1 (void) +{ + DirectIndirectLong (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op27M0 (void) +{ + DirectIndirectLong (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op37M1 (void) +{ + DirectIndirectIndexedLong (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op37M0 (void) +{ + DirectIndirectIndexedLong (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op2DM1 (void) +{ + Absolute (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op2DM0 (void) +{ + Absolute (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op3DM1 (void) +{ + AbsoluteIndexedX (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op3DM0 (void) +{ + AbsoluteIndexedX (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op39M1 (void) +{ + AbsoluteIndexedY (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op39M0 (void) +{ + AbsoluteIndexedY (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op2FM1 (void) +{ + AbsoluteLong (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op2FM0 (void) +{ + AbsoluteLong (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op3FM1 (void) +{ + AbsoluteLongIndexedX (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op3FM0 (void) +{ + AbsoluteLongIndexedX (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op23M1 (void) +{ + StackRelative (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op23M0 (void) +{ + StackRelative (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op33M1 (void) +{ + StackRelativeIndirectIndexed (READ, AND8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void Op33M0 (void) +{ + StackRelativeIndirectIndexed (READ, AND16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* ASL *************************************************************************************** */ +static void Op0AM1 (void) +{ + A_ASL8 (); +} + +static void Op0AM0 (void) +{ + A_ASL16 (); +} + +static void Op06M1 (void) +{ + Direct (MODIFY, ASL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op06M0 (void) +{ + Direct (MODIFY, ASL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op16M1 (void) +{ + DirectIndexedX (MODIFY, ASL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op16M0 (void) +{ + DirectIndexedX (MODIFY, ASL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op0EM1 (void) +{ + Absolute (MODIFY, ASL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op0EM0 (void) +{ + Absolute (MODIFY, ASL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op1EM1 (void) +{ + AbsoluteIndexedX (MODIFY, ASL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op1EM0 (void) +{ + AbsoluteIndexedX (MODIFY, ASL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} +/**********************************************************************************************/ + +/* BIT *************************************************************************************** */ +static void Op89M1 (void) +{ + ICPU._Zero = ICPU.Registers.AL & *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op89M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU._Zero = (ICPU.Registers.A.W & *(uint16 *) CPU.PC) != 0; +#else + ICPU._Zero = (ICPU.Registers.A.W & (*CPU.PC + (*(CPU.PC + 1) << 8))) != 0; +#endif +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + CPU.PC += 2; +} + +static void Op24M1 (void) +{ + Direct (READ, BIT8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op24M0 (void) +{ + Direct (READ, BIT16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op34M1 (void) +{ + DirectIndexedX (READ, BIT8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op34M0 (void) +{ + DirectIndexedX (READ, BIT16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op2CM1 (void) +{ + Absolute (READ, BIT8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op2CM0 (void) +{ + Absolute (READ, BIT16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op3CM1 (void) +{ + AbsoluteIndexedX (READ, BIT8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op3CM0 (void) +{ + AbsoluteIndexedX (READ, BIT16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} +/**********************************************************************************************/ + +/* CMP *************************************************************************************** */ +static void OpC9M1 (void) +{ + int32 Int32 = (int) ICPU.Registers.AL - (intptr_t) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC9M0 (void) +{ + int32 Int32; +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) ICPU.Registers.A.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) ICPU.Registers.A.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpC5M1 (void) +{ + Direct (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC5M0 (void) +{ + Direct (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD5M1 (void) +{ + DirectIndexedX (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpD5M0 (void) +{ + DirectIndexedX (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpD2M1 (void) +{ + DirectIndirect (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD2M0 (void) +{ + DirectIndirect (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC1M1 (void) +{ + DirectIndexedIndirect (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC1M0 (void) +{ + DirectIndexedIndirect (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD1M1 (void) +{ + DirectIndirectIndexed (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD1M0 (void) +{ + DirectIndirectIndexed (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC7M1 (void) +{ + DirectIndirectLong (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC7M0 (void) +{ + DirectIndirectLong (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD7M1 (void) +{ + DirectIndirectIndexedLong (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpD7M0 (void) +{ + DirectIndirectIndexedLong (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpCDM1 (void) +{ + Absolute (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpCDM0 (void) +{ + Absolute (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpDDM1 (void) +{ + AbsoluteIndexedX (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpDDM0 (void) +{ + AbsoluteIndexedX (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpD9M1 (void) +{ + AbsoluteIndexedY (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpD9M0 (void) +{ + AbsoluteIndexedY (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpCFM1 (void) +{ + AbsoluteLong (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpCFM0 (void) +{ + AbsoluteLong (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpDFM1 (void) +{ + AbsoluteLongIndexedX (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpDFM0 (void) +{ + AbsoluteLongIndexedX (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpC3M1 (void) +{ + StackRelative (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpC3M0 (void) +{ + StackRelative (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpD3M1 (void) +{ + StackRelativeIndirectIndexed (READ, CMP8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void OpD3M0 (void) +{ + StackRelativeIndirectIndexed (READ, CMP16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +/**********************************************************************************************/ + +/* CMX *************************************************************************************** */ +static void OpE0X1 (void) +{ + int32 Int32 = (int) ICPU.Registers.XL - (intptr_t) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE0X0 (void) +{ + int32 Int32; +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) ICPU.Registers.X.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) ICPU.Registers.X.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpE4X1 (void) +{ + Direct (READ, CMX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE4X0 (void) +{ + Direct (READ, CMX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpECX1 (void) +{ + Absolute (READ, CMX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpECX0 (void) +{ + Absolute (READ, CMX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +/**********************************************************************************************/ + +/* CMY *************************************************************************************** */ +static void OpC0X1 (void) +{ + int32 Int32 = (int) ICPU.Registers.YL - (intptr_t) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC0X0 (void) +{ + int32 Int32; +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) ICPU.Registers.Y.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) ICPU.Registers.Y.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpC4X1 (void) +{ + Direct (READ, CMY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpC4X0 (void) +{ + Direct (READ, CMY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpCCX1 (void) +{ + Absolute (READ, CMY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpCCX0 (void) +{ + Absolute (READ, CMY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +/**********************************************************************************************/ + +/* DEC *************************************************************************************** */ +static void Op3AM1 (void) +{ + A_DEC8 (); +} + +static void Op3AM0 (void) +{ + A_DEC16 (); +} + +static void OpC6M1 (void) +{ + Direct (MODIFY, DEC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpC6M0 (void) +{ + Direct (MODIFY, DEC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpD6M1 (void) +{ + DirectIndexedX (MODIFY, DEC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpD6M0 (void) +{ + DirectIndexedX (MODIFY, DEC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpCEM1 (void) +{ + Absolute (MODIFY, DEC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpCEM0 (void) +{ + Absolute (MODIFY, DEC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpDEM1 (void) +{ + AbsoluteIndexedX (MODIFY, DEC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpDEM0 (void) +{ + AbsoluteIndexedX (MODIFY, DEC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +/**********************************************************************************************/ + +/* EOR *************************************************************************************** */ +static void Op49M1 (void) +{ + ICPU.Registers.AL ^= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.AL); +} + +static void Op49M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.A.W ^= *(uint16 *) CPU.PC; +#else + ICPU.Registers.A.W ^= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.A.W); +} + +static void Op45M1 (void) +{ + Direct (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op45M0 (void) +{ + Direct (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op55M1 (void) +{ + DirectIndexedX (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op55M0 (void) +{ + DirectIndexedX (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op52M1 (void) +{ + DirectIndirect (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op52M0 (void) +{ + DirectIndirect (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op41M1 (void) +{ + DirectIndexedIndirect (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op41M0 (void) +{ + DirectIndexedIndirect (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op51M1 (void) +{ + DirectIndirectIndexed (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op51M0 (void) +{ + DirectIndirectIndexed (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op47M1 (void) +{ + DirectIndirectLong (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op47M0 (void) +{ + DirectIndirectLong (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op57M1 (void) +{ + DirectIndirectIndexedLong (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op57M0 (void) +{ + DirectIndirectIndexedLong (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op4DM1 (void) +{ + Absolute (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op4DM0 (void) +{ + Absolute (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op5DM1 (void) +{ + AbsoluteIndexedX (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op5DM0 (void) +{ + AbsoluteIndexedX (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op59M1 (void) +{ + AbsoluteIndexedY (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op59M0 (void) +{ + AbsoluteIndexedY (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op4FM1 (void) +{ + AbsoluteLong (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op4FM0 (void) +{ + AbsoluteLong (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op5FM1 (void) +{ + AbsoluteLongIndexedX (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op5FM0 (void) +{ + AbsoluteLongIndexedX (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op43M1 (void) +{ + StackRelative (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op43M0 (void) +{ + StackRelative (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op53M1 (void) +{ + StackRelativeIndirectIndexed (READ, EOR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void Op53M0 (void) +{ + StackRelativeIndirectIndexed (READ, EOR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +/**********************************************************************************************/ + +/* INC *************************************************************************************** */ +static void Op1AM1 (void) +{ + A_INC8 (); +} + +static void Op1AM0 (void) +{ + A_INC16 (); +} + +static void OpE6M1 (void) +{ + Direct (MODIFY, INC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpE6M0 (void) +{ + Direct (MODIFY, INC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpF6M1 (void) +{ + DirectIndexedX (MODIFY, INC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpF6M0 (void) +{ + DirectIndexedX (MODIFY, INC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpEEM1 (void) +{ + Absolute (MODIFY, INC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpEEM0 (void) +{ + Absolute (MODIFY, INC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpFEM1 (void) +{ + AbsoluteIndexedX (MODIFY, INC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void OpFEM0 (void) +{ + AbsoluteIndexedX (MODIFY, INC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +/**********************************************************************************************/ +/* LDA *************************************************************************************** */ +static void OpA9M1 (void) +{ + ICPU.Registers.AL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.AL); +} + +static void OpA9M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.A.W = *(uint16 *) CPU.PC; +#else + ICPU.Registers.A.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.A.W); +} + +static void OpA5M1 (void) +{ + Direct (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA5M0 (void) +{ + Direct (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB5M1 (void) +{ + DirectIndexedX (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpB5M0 (void) +{ + DirectIndexedX (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpB2M1 (void) +{ + DirectIndirect (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB2M0 (void) +{ + DirectIndirect (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA1M1 (void) +{ + DirectIndexedIndirect (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA1M0 (void) +{ + DirectIndexedIndirect (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB1M1 (void) +{ + DirectIndirectIndexed (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB1M0 (void) +{ + DirectIndirectIndexed (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA7M1 (void) +{ + DirectIndirectLong (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA7M0 (void) +{ + DirectIndirectLong (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB7M1 (void) +{ + DirectIndirectIndexedLong (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB7M0 (void) +{ + DirectIndirectIndexedLong (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpADM1 (void) +{ + Absolute (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpADM0 (void) +{ + Absolute (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBDM1 (void) +{ + AbsoluteIndexedX (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBDM0 (void) +{ + AbsoluteIndexedX (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpB9M1 (void) +{ + AbsoluteIndexedY (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpB9M0 (void) +{ + AbsoluteIndexedY (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpAFM1 (void) +{ + AbsoluteLong (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpAFM0 (void) +{ + AbsoluteLong (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpBFM1 (void) +{ + AbsoluteLongIndexedX (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpBFM0 (void) +{ + AbsoluteLongIndexedX (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpA3M1 (void) +{ + StackRelative (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpA3M0 (void) +{ + StackRelative (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpB3M1 (void) +{ + StackRelativeIndirectIndexed (READ, LDA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void OpB3M0 (void) +{ + StackRelativeIndirectIndexed (READ, LDA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +/**********************************************************************************************/ + +/* LDX *************************************************************************************** */ +static void OpA2X1 (void) +{ + ICPU.Registers.XL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.XL); +} + +static void OpA2X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.X.W = *(uint16 *) CPU.PC; +#else + ICPU.Registers.X.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.X.W); +} + +static void OpA6X1 (void) +{ + Direct (READ, LDX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA6X0 (void) +{ + Direct (READ, LDX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB6X1 (void) +{ + DirectIndexedY (READ, LDX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpB6X0 (void) +{ + DirectIndexedY (READ, LDX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpAEX1 (void) +{ + Absolute (READ, LDX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpAEX0 (void) +{ + Absolute (READ, LDX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBEX1 (void) +{ + AbsoluteIndexedY (READ, LDX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBEX0 (void) +{ + AbsoluteIndexedY (READ, LDX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} +/**********************************************************************************************/ + +/* LDY *************************************************************************************** */ +static void OpA0X1 (void) +{ + ICPU.Registers.YL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.YL); +} + +static void OpA0X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.Y.W = *(uint16 *) CPU.PC; +#else + ICPU.Registers.Y.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.Y.W); +} + +static void OpA4X1 (void) +{ + Direct (READ, LDY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpA4X0 (void) +{ + Direct (READ, LDY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpB4X1 (void) +{ + DirectIndexedX (READ, LDY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpB4X0 (void) +{ + DirectIndexedX (READ, LDY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpACX1 (void) +{ + Absolute (READ, LDY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpACX0 (void) +{ + Absolute (READ, LDY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBCX1 (void) +{ + AbsoluteIndexedX (READ, LDY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpBCX0 (void) +{ + AbsoluteIndexedX (READ, LDY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} +/**********************************************************************************************/ + +/* LSR *************************************************************************************** */ +static void Op4AM1 (void) +{ + A_LSR8 (); +} + +static void Op4AM0 (void) +{ + A_LSR16 (); +} + +static void Op46M1 (void) +{ + Direct (MODIFY, LSR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op46M0 (void) +{ + Direct (MODIFY, LSR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op56M1 (void) +{ + DirectIndexedX (MODIFY, LSR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op56M0 (void) +{ + DirectIndexedX (MODIFY, LSR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op4EM1 (void) +{ + Absolute (MODIFY, LSR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op4EM0 (void) +{ + Absolute (MODIFY, LSR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op5EM1 (void) +{ + AbsoluteIndexedX (MODIFY, LSR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op5EM0 (void) +{ + AbsoluteIndexedX (MODIFY, LSR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +/**********************************************************************************************/ + +/* ORA *************************************************************************************** */ +static void Op09M1 (void) +{ + ICPU.Registers.AL |= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + SetZN8 (ICPU.Registers.AL); +} + +static void Op09M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU.Registers.A.W |= *(uint16 *) CPU.PC; +#else + ICPU.Registers.A.W |= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + SetZN16 (ICPU.Registers.A.W); +} + +static void Op05M1 (void) +{ + Direct (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op05M0 (void) +{ + Direct (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op15M1 (void) +{ + DirectIndexedX (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op15M0 (void) +{ + DirectIndexedX (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op12M1 (void) +{ + DirectIndirect (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op12M0 (void) +{ + DirectIndirect (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op01M1 (void) +{ + DirectIndexedIndirect (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op01M0 (void) +{ + DirectIndexedIndirect (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op11M1 (void) +{ + DirectIndirectIndexed (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op11M0 (void) +{ + DirectIndirectIndexed (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op07M1 (void) +{ + DirectIndirectLong (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op07M0 (void) +{ + DirectIndirectLong (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op17M1 (void) +{ + DirectIndirectIndexedLong (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op17M0 (void) +{ + DirectIndirectIndexedLong (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op0DM1 (void) +{ + Absolute (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op0DM0 (void) +{ + Absolute (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op1DM1 (void) +{ + AbsoluteIndexedX (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op1DM0 (void) +{ + AbsoluteIndexedX (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op19M1 (void) +{ + AbsoluteIndexedY (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op19M0 (void) +{ + AbsoluteIndexedY (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op0FM1 (void) +{ + AbsoluteLong (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op0FM0 (void) +{ + AbsoluteLong (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op1FM1 (void) +{ + AbsoluteLongIndexedX (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op1FM0 (void) +{ + AbsoluteLongIndexedX (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op03M1 (void) +{ + StackRelative (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op03M0 (void) +{ + StackRelative (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op13M1 (void) +{ + StackRelativeIndirectIndexed (READ, ORA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void Op13M0 (void) +{ + StackRelativeIndirectIndexed (READ, ORA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +/**********************************************************************************************/ + +/* ROL *************************************************************************************** */ +static void Op2AM1 (void) +{ + A_ROL8 (); +} + +static void Op2AM0 (void) +{ + A_ROL16 (); +} + +static void Op26M1 (void) +{ + Direct (MODIFY, ROL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op26M0 (void) +{ + Direct (MODIFY, ROL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op36M1 (void) +{ + DirectIndexedX (MODIFY, ROL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op36M0 (void) +{ + DirectIndexedX (MODIFY, ROL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op2EM1 (void) +{ + Absolute (MODIFY, ROL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op2EM0 (void) +{ + Absolute (MODIFY, ROL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op3EM1 (void) +{ + AbsoluteIndexedX (MODIFY, ROL8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op3EM0 (void) +{ + AbsoluteIndexedX (MODIFY, ROL16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} +/**********************************************************************************************/ + +/* ROR *************************************************************************************** */ +static void Op6AM1 (void) +{ + A_ROR8 (); +} + +static void Op6AM0 (void) +{ + A_ROR16 (); +} + +static void Op66M1 (void) +{ + Direct (MODIFY, ROR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op66M0 (void) +{ + Direct (MODIFY, ROR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op76M1 (void) +{ + DirectIndexedX (MODIFY, ROR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op76M0 (void) +{ + DirectIndexedX (MODIFY, ROR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE /* memory */ + ONE_CYCLE /* opcode */; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op6EM1 (void) +{ + Absolute (MODIFY, ROR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op6EM0 (void) +{ + Absolute (MODIFY, ROR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op7EM1 (void) +{ + AbsoluteIndexedX (MODIFY, ROR8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op7EM0 (void) +{ + AbsoluteIndexedX (MODIFY, ROR16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} +/**********************************************************************************************/ + +/* SBC *************************************************************************************** */ +static void OpE9M1 (void) +{ + Immediate8 (READ, SBC8); +} + +static void OpE9M0 (void) +{ + Immediate16 (READ, SBC16); +} + +static void OpE5M1 (void) +{ + Direct (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE5M0 (void) +{ + Direct (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF5M1 (void) +{ + DirectIndexedX (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpF5M0 (void) +{ + DirectIndexedX (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpF2M1 (void) +{ + DirectIndirect (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF2M0 (void) +{ + DirectIndirect (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE1M1 (void) +{ + DirectIndexedIndirect (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE1M0 (void) +{ + DirectIndexedIndirect (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF1M1 (void) +{ + DirectIndirectIndexed (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF1M0 (void) +{ + DirectIndirectIndexed (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE7M1 (void) +{ + DirectIndirectLong (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpE7M0 (void) +{ + DirectIndirectLong (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF7M1 (void) +{ + DirectIndirectIndexedLong (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpF7M0 (void) +{ + DirectIndirectIndexedLong (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void OpEDM1 (void) +{ + Absolute (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpEDM0 (void) +{ + Absolute (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpFDM1 (void) +{ + AbsoluteIndexedX (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpFDM0 (void) +{ + AbsoluteIndexedX (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpF9M1 (void) +{ + AbsoluteIndexedY (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpF9M0 (void) +{ + AbsoluteIndexedY (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void OpEFM1 (void) +{ + AbsoluteLong (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpEFM0 (void) +{ + AbsoluteLong (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpFFM1 (void) +{ + AbsoluteLongIndexedX (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpFFM0 (void) +{ + AbsoluteLongIndexedX (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void OpE3M1 (void) +{ + StackRelative (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpE3M0 (void) +{ + StackRelative (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void OpF3M1 (void) +{ + StackRelativeIndirectIndexed (READ, SBC8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void OpF3M0 (void) +{ + StackRelativeIndirectIndexed (READ, SBC16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* STA *************************************************************************************** */ +static void Op85M1 (void) +{ + Direct (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op85M0 (void) +{ + Direct (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op95M1 (void) +{ + DirectIndexedX (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op95M0 (void) +{ + DirectIndexedX (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op92M1 (void) +{ + DirectIndirect (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op92M0 (void) +{ + DirectIndirect (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op81M1 (void) +{ + DirectIndexedIndirect (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +#ifdef noVAR_CYCLES + if (CheckIndex ()) + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op81M0 (void) +{ + DirectIndexedIndirect (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +#ifdef noVAR_CYCLES + if (CheckIndex ()) + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op91M1 (void) +{ + DirectIndirectIndexed (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op91M0 (void) +{ + DirectIndirectIndexed (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op87M1 (void) +{ + DirectIndirectLong (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op87M0 (void) +{ + DirectIndirectLong (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op97M1 (void) +{ + DirectIndirectIndexedLong (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op97M0 (void) +{ + DirectIndirectIndexedLong (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op8DM1 (void) +{ + Absolute (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op8DM0 (void) +{ + Absolute (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op9DM1 (void) +{ + AbsoluteIndexedX (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op9DM0 (void) +{ + AbsoluteIndexedX (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op99M1 (void) +{ + AbsoluteIndexedY (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op99M0 (void) +{ + AbsoluteIndexedY (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op8FM1 (void) +{ + AbsoluteLong (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op8FM0 (void) +{ + AbsoluteLong (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op9FM1 (void) +{ + AbsoluteLongIndexedX (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op9FM0 (void) +{ + AbsoluteLongIndexedX (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif +} + +static void Op83M1 (void) +{ + StackRelative (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op83M0 (void) +{ + StackRelative (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif +} + +static void Op93M1 (void) +{ + StackRelativeIndirectIndexed (WRITE, STA8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} + +static void Op93M0 (void) +{ + StackRelativeIndirectIndexed (WRITE, STA16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* STX *************************************************************************************** */ +static void Op86X1 (void) +{ + Direct (WRITE, STX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op86X0 (void) +{ + Direct (WRITE, STX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op96X1 (void) +{ + DirectIndexedY (WRITE, STX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op96X0 (void) +{ + DirectIndexedY (WRITE, STX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op8EX1 (void) +{ + Absolute (WRITE, STX8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op8EX0 (void) +{ + Absolute (WRITE, STX16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} +/**********************************************************************************************/ + +/* STY *************************************************************************************** */ +static void Op84X1 (void) +{ + Direct (WRITE, STY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op84X0 (void) +{ + Direct (WRITE, STY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op94X1 (void) +{ + DirectIndexedX (WRITE, STY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op94X0 (void) +{ + DirectIndexedX (WRITE, STY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op8CX1 (void) +{ + Absolute (WRITE, STY8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op8CX0 (void) +{ + Absolute (WRITE, STY16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} +/**********************************************************************************************/ + +/* STZ *************************************************************************************** */ +static void Op64M1 (void) +{ + Direct (WRITE, STZ8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op64M0 (void) +{ + Direct (WRITE, STZ16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif +} + +static void Op74M1 (void) +{ + DirectIndexedX (WRITE, STZ8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op74M0 (void) +{ + DirectIndexedX (WRITE, STZ16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else +// CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op9CM1 (void) +{ + Absolute (WRITE, STZ8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op9CM0 (void) +{ + Absolute (WRITE, STZ16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op9EM1 (void) +{ + AbsoluteIndexedX (WRITE, STZ8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +static void Op9EM0 (void) +{ + AbsoluteIndexedX (WRITE, STZ16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif +} + +/**********************************************************************************************/ + +/* TRB *************************************************************************************** */ +static void Op14M1 (void) +{ + Direct (MODIFY, TRB8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op14M0 (void) +{ + Direct (MODIFY, TRB16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op1CM1 (void) +{ + Absolute (MODIFY, TRB8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op1CM0 (void) +{ + Absolute (MODIFY, TRB16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} +/**********************************************************************************************/ + +/* TSB *************************************************************************************** */ +static void Op04M1 (void) +{ + Direct (MODIFY, TSB8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op04M0 (void) +{ + Direct (MODIFY, TSB16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op0CM1 (void) +{ + Absolute (MODIFY, TSB8); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +static void Op0CM0 (void) +{ + Absolute (MODIFY, TSB16); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 /* memory */ + ONE_CYCLE /* opcode */; +#endif +} + +/**********************************************************************************************/ + +/* Branch Instructions *********************************************************************** */ +#ifndef SA1_OPCODES +#define BranchCheck0()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if (!Settings.SoundSkipMethod)\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } + +#define BranchCheck1()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if (!Settings.SoundSkipMethod) {\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } else \ + if (Settings.SoundSkipMethod == 1)\ + return;\ + if (Settings.SoundSkipMethod == 3)\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + else\ + CPU.PC = CPU.PCBase + OpAddress;\ + } + +#define BranchCheck2()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if (!Settings.SoundSkipMethod) {\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } else \ + if (Settings.SoundSkipMethod == 1)\ + CPU.PC = CPU.PCBase + OpAddress;\ + if (Settings.SoundSkipMethod == 3)\ + if (CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + else\ + CPU.PC = CPU.PCBase + OpAddress;\ + } +#else +#define BranchCheck0() +#define BranchCheck1() +#define BranchCheck2() +#endif + +#ifdef CPU_SHUTDOWN +#ifndef SA1_OPCODES +inline void CPUShutdown() +{ + if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) + { + // Don't skip cycles with a pending NMI or IRQ - could cause delayed + // interrupt. Interrupts are delayed for a few cycles already, but + // the delay could allow the shutdown code to cycle skip again. + // Was causing screen flashing on Top Gear 3000. + + if (CPU.WaitCounter == 0 && + !(CPU.Flags & (IRQ_PENDING_FLAG | NMI_FLAG))) + { + CPU.WaitAddress = NULL; + if (Settings.SA1) + S9xSA1ExecuteDuringSleep (); + CPU.Cycles = CPU.NextEvent; + if (IAPU.APUExecuting) + { + ICPU.CPUExecuting = FALSE; + do + { + APU_EXECUTE1(); + } while (APU.Cycles < CPU.NextEvent); + ICPU.CPUExecuting = TRUE; + } + } + else + if (CPU.WaitCounter >= 2) + CPU.WaitCounter = 1; + else + CPU.WaitCounter--; + } +} +#else +inline void CPUShutdown() +{ + if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) + { + if (CPU.WaitCounter >= 1) + { + SA1.Executing = FALSE; + SA1.CPUExecuting = FALSE; + } + else + CPU.WaitCounter++; + } +} +#endif +#else +#define CPUShutdown() +#endif + +/* BCC */ +static void Op90 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck0 (); + if (!CheckCarry ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown(); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BCS */ +static void OpB0 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck0 (); + if (CheckCarry ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BEQ */ +static void OpF0 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck2 (); + if (CheckZero ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BMI */ +static void Op30 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck1 (); + if (CheckNegative ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BNE */ +static void OpD0 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck1 (); + if (!CheckZero ()) + { + CPU.PC = CPU.PCBase + OpAddress; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BPL */ +static void Op10 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck1 (); + if (!CheckNegative ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BRA */ +static void Op80 (void) +{ + Relative (JUMP, OpAddressPassthrough); + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); +} + +/* BVC */ +static void Op50 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck0 (); + if (!CheckOverflow ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} + +/* BVS */ +static void Op70 (void) +{ + Relative (JUMP, OpAddressPassthrough); + BranchCheck0 (); + if (CheckOverflow ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + CPUShutdown (); + } +#ifndef SA1_OPCODES + else + { + CPU.Cycles += CPU.MemSpeed; + } +#endif +} +/**********************************************************************************************/ + +/* ClearFlag Instructions ******************************************************************** */ +/* CLC */ +static void Op18 (void) +{ + ClearCarry (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* CLD */ +static void OpD8 (void) +{ + ClearDecimal (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* CLI */ +static void Op58 (void) +{ + ClearIRQ (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +/* CHECK_FOR_IRQ(); */ +} + +/* CLV */ +static void OpB8 (void) +{ + ClearOverflow (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* DEX/DEY *********************************************************************************** */ +static void OpCAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.XL--; + SetZN8 (ICPU.Registers.XL); +} + +static void OpCAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.X.W--; + SetZN16 (ICPU.Registers.X.W); +} + +static void Op88X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.YL--; + SetZN8 (ICPU.Registers.YL); +} + +static void Op88X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.Y.W--; + SetZN16 (ICPU.Registers.Y.W); +} +/**********************************************************************************************/ + +/* INX/INY *********************************************************************************** */ +static void OpE8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.XL++; + SetZN8 (ICPU.Registers.XL); +} + +static void OpE8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.X.W++; + SetZN16 (ICPU.Registers.X.W); +} + +static void OpC8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.YL++; + SetZN8 (ICPU.Registers.YL); +} + +static void OpC8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + ICPU.Registers.Y.W++; + SetZN16 (ICPU.Registers.Y.W); +} + +/**********************************************************************************************/ + +/* NOP *************************************************************************************** */ +static void OpEA (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* PUSH Instructions ************************************************************************* */ +/* #define PushW(w) \ + * S9xSetWord (w, ICPU.Registers.S.W - 1);\ + * ICPU.Registers.S.W -= 2; + */ +#define PushB(b)\ + S9xSetByte (b, ICPU.Registers.S.W--); + +#define PushBE(b)\ + S9xSetByte (b, ICPU.Registers.S.W--);\ + ICPU.Registers.SH=0x01; + + +#define PushW(w) \ + S9xSetByte ((w)>>8, ICPU.Registers.S.W);\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W - 1)&0xFFFF);\ + ICPU.Registers.S.W -= 2; + +#define PushWE(w) \ + S9xSetByte ((w)>>8, ICPU.Registers.S.W--);\ + ICPU.Registers.SH=0x01;\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W--)&0xFFFF);\ + ICPU.Registers.SH = 0x01; + +#define PushWENew(w) \ + S9xSetByte ((w)>>8, ICPU.Registers.S.W--);\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W--)&0xFFFF);\ + ICPU.Registers.SH = 0x01; + +//PEA NL +static void OpF4E1 (void) +{ + Absolute (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + PushWENew ((unsigned short)OpAddress); +} + +static void OpF4 (void) +{ + Absolute (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + PushW ((unsigned short)OpAddress); +} + +//PEI NL +static void OpD4E1 (void) +{ + DirectIndirect (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + PushWENew ((unsigned short)OpAddress); +} + +static void OpD4 (void) +{ + DirectIndirect (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed; +#endif + PushW ((unsigned short)OpAddress); +} + +//PER NL +static void Op62E1 (void) +{ + RelativeLong (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + PushWENew ((unsigned short)OpAddress); +} + +static void Op62 (void) +{ + RelativeLong (NONE, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + PushW ((unsigned short)OpAddress); +} + + +//PHA +static void Op48E1 (void) +{ + PushBE (ICPU.Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op48M1 (void) +{ + PushB (ICPU.Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op48M0 (void) +{ + PushW (ICPU.Registers.A.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHB +static void Op8BE1 (void) +{ + PushBE (ICPU.Registers.DB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +static void Op8B (void) +{ + PushB (ICPU.Registers.DB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHD NL +static void Op0BE1 (void) +{ + PushWENew (ICPU.Registers.D.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op0B (void) +{ + PushW (ICPU.Registers.D.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHK +static void Op4BE1 (void) +{ + PushBE (ICPU.Registers.PB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op4B (void) +{ + PushB (ICPU.Registers.PB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHP +static void Op08E1 (void) +{ + S9xPackStatus (); + PushBE (ICPU.Registers.PL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op08 (void) +{ + S9xPackStatus (); + PushB (ICPU.Registers.PL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHX +static void OpDAE1 (void) +{ + PushBE (ICPU.Registers.XL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpDAX1 (void) +{ + PushB (ICPU.Registers.XL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpDAX0 (void) +{ + PushW (ICPU.Registers.X.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHY +static void Op5AE1 (void) +{ + PushBE (ICPU.Registers.YL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op5AX1 (void) +{ + PushB (ICPU.Registers.YL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op5AX0 (void) +{ + PushW (ICPU.Registers.Y.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* PULL Instructions ************************************************************************* */ +#define PullW(w) \ + w = S9xGetByte (++ICPU.Registers.S.W); \ + w |= (S9xGetByte (++ICPU.Registers.S.W)<<8); + +/* w = S9xGetWord (ICPU.Registers.S.W + 1); \ + ICPU.Registers.S.W += 2; +*/ + +#define PullB(b)\ + b = S9xGetByte (++ICPU.Registers.S.W); + +#define PullBE(b)\ + ICPU.Registers.S.W++;\ + ICPU.Registers.SH=0x01;\ + b = S9xGetByte (ICPU.Registers.S.W); + +#define PullWE(w) \ + ICPU.Registers.S.W++;\ + ICPU.Registers.SH=0x01;\ + w = S9xGetByte (ICPU.Registers.S.W); \ + ICPU.Registers.S.W++; \ + ICPU.Registers.SH=0x01;\ + w |= (S9xGetByte (ICPU.Registers.S.W)<<8); + +#define PullWENew(w) \ + PullW(w);\ + ICPU.Registers.SH=0x01; + +//PLA +static void Op68E1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (ICPU.Registers.AL); + SetZN8 (ICPU.Registers.AL); +} + +static void Op68M1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (ICPU.Registers.AL); + SetZN8 (ICPU.Registers.AL); +} + +static void Op68M0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (ICPU.Registers.A.W); + SetZN16 (ICPU.Registers.A.W); +} + +//PLB +static void OpABE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (ICPU.Registers.DB); + SetZN8 (ICPU.Registers.DB); + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +} + +static void OpAB (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (ICPU.Registers.DB); + SetZN8 (ICPU.Registers.DB); + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +} + +/* PHP */ +//PLD NL +static void Op2BE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullWENew (ICPU.Registers.D.W); + SetZN16 (ICPU.Registers.D.W); +} + +static void Op2B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (ICPU.Registers.D.W); + SetZN16 (ICPU.Registers.D.W); +} + +/* PLP */ +static void Op28E1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (ICPU.Registers.PL); + S9xUnpackStatus (); + + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } + S9xFixCycles(); +/* CHECK_FOR_IRQ();*/ +} + +static void Op28 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (ICPU.Registers.PL); + S9xUnpackStatus (); + + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } + S9xFixCycles(); +/* CHECK_FOR_IRQ();*/ +} + +//PLX +static void OpFAE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (ICPU.Registers.XL); + SetZN8 (ICPU.Registers.XL); +} + +static void OpFAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (ICPU.Registers.XL); + SetZN8 (ICPU.Registers.XL); +} + +static void OpFAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (ICPU.Registers.X.W); + SetZN16 (ICPU.Registers.X.W); +} + +//PLY +static void Op7AE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (ICPU.Registers.YL); + SetZN8 (ICPU.Registers.YL); +} + +static void Op7AX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (ICPU.Registers.YL); + SetZN8 (ICPU.Registers.YL); +} + +static void Op7AX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (ICPU.Registers.Y.W); + SetZN16 (ICPU.Registers.Y.W); +} + +/**********************************************************************************************/ + +/* SetFlag Instructions ********************************************************************** */ +/* SEC */ +static void Op38 (void) +{ + SetCarry (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* SED */ +static void OpF8 (void) +{ + SetDecimal (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + missing.decimal_mode = 1; +} + +/* SEI */ +static void Op78 (void) +{ + SetIRQ (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* Transfer Instructions ********************************************************************* */ +/* TAX8 */ +static void OpAAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.XL = ICPU.Registers.AL; + SetZN8 (ICPU.Registers.XL); +} + +/* TAX16 */ +static void OpAAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.X.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.X.W); +} + +/* TAY8 */ +static void OpA8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.YL = ICPU.Registers.AL; + SetZN8 (ICPU.Registers.YL); +} + +/* TAY16 */ +static void OpA8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.Y.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.Y.W); +} + +static void Op5B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.D.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.D.W); +} + +static void Op1B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.S.W = ICPU.Registers.A.W; + if (CheckEmulation()) + ICPU.Registers.SH = 1; +} + +static void Op7B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.A.W = ICPU.Registers.D.W; + SetZN16 (ICPU.Registers.A.W); +} + +static void Op3B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.A.W = ICPU.Registers.S.W; + SetZN16 (ICPU.Registers.A.W); +} + +static void OpBAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.XL = ICPU.Registers.SL; + SetZN8 (ICPU.Registers.XL); +} + +static void OpBAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.X.W = ICPU.Registers.S.W; + SetZN16 (ICPU.Registers.X.W); +} + +static void Op8AM1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.AL = ICPU.Registers.XL; + SetZN8 (ICPU.Registers.AL); +} + +static void Op8AM0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.A.W = ICPU.Registers.X.W; + SetZN16 (ICPU.Registers.A.W); +} + +static void Op9A (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.S.W = ICPU.Registers.X.W; + if (CheckEmulation()) + ICPU.Registers.SH = 1; +} + +static void Op9BX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.YL = ICPU.Registers.XL; + SetZN8 (ICPU.Registers.YL); +} + +static void Op9BX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.Y.W = ICPU.Registers.X.W; + SetZN16 (ICPU.Registers.Y.W); +} + +static void Op98M1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.AL = ICPU.Registers.YL; + SetZN8 (ICPU.Registers.AL); +} + +static void Op98M0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.A.W = ICPU.Registers.Y.W; + SetZN16 (ICPU.Registers.A.W); +} + +static void OpBBX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.XL = ICPU.Registers.YL; + SetZN8 (ICPU.Registers.XL); +} + +static void OpBBX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU.Registers.X.W = ICPU.Registers.Y.W; + SetZN16 (ICPU.Registers.X.W); +} + +/**********************************************************************************************/ + +/* XCE *************************************************************************************** */ +static void OpFB (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + + uint8 A1 = ICPU._Carry; + uint8 A2 = ICPU.Registers.PH; + ICPU._Carry = A2 & 1; + ICPU.Registers.PH = A1; + + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + ICPU.Registers.SH = 1; + missing.emulate6502 = 1; + } + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } + S9xFixCycles(); +} +/**********************************************************************************************/ + +/* BRK *************************************************************************************** */ +static void Op00 (void) +{ +#ifndef SA1_OPCODES + CPU.BRKTriggered = TRUE; +#endif + + if (!CheckEmulation()) + { + PushB (ICPU.Registers.PB); + PushW (CPU.PC - CPU.PCBase + 1); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFE6)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFFE)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* BRL ************************************************************************************** */ +static void Op82 (void) +{ + RelativeLong (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +} +/**********************************************************************************************/ + +/* IRQ *************************************************************************************** */ +void S9xOpcode_IRQ (void) +{ + if (!CheckEmulation()) + { + PushB (ICPU.Registers.PB); + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (Memory.FillRAM [0x2207] | + (Memory.FillRAM [0x2208] << 8)); +#else + if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x40)) + S9xSetPCBase (Memory.FillRAM [0x220e] | + (Memory.FillRAM [0x220f] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFEE)); + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (Memory.FillRAM [0x2207] | + (Memory.FillRAM [0x2208] << 8)); +#else + if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x40)) + S9xSetPCBase (Memory.FillRAM [0x220e] | + (Memory.FillRAM [0x220f] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFFE)); + CPU.Cycles += ONE_CYCLE; +#endif + } +} + +/**********************************************************************************************/ + +/* NMI *************************************************************************************** */ +void S9xOpcode_NMI (void) +{ + if (!CheckEmulation()) + { + PushB (ICPU.Registers.PB); + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (Memory.FillRAM [0x2205] | + (Memory.FillRAM [0x2206] << 8)); +#else + if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x20)) + S9xSetPCBase (Memory.FillRAM [0x220c] | + (Memory.FillRAM [0x220d] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFEA)); + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (Memory.FillRAM [0x2205] | + (Memory.FillRAM [0x2206] << 8)); +#else + if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x20)) + S9xSetPCBase (Memory.FillRAM [0x220c] | + (Memory.FillRAM [0x220d] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFFA)); + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* COP *************************************************************************************** */ +static void Op02 (void) +{ + if (!CheckEmulation()) + { + PushB (ICPU.Registers.PB); + PushW (CPU.PC - CPU.PCBase + 1); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFE4)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (ICPU.Registers.PL); + OpenBus = ICPU.Registers.PL; + ClearDecimal (); + SetIRQ (); + + ICPU.Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFF4)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* JML *************************************************************************************** */ +static void OpDC (void) +{ + AbsoluteIndirectLong (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; +#endif + ICPU.Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} + +static void Op5C (void) +{ + AbsoluteLong (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif + ICPU.Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} +/**********************************************************************************************/ + +/* JMP *************************************************************************************** */ +static void Op4C (void) +{ + Absolute (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES) + CPUShutdown (); +#endif +} + +static void Op6C (void) +{ + AbsoluteIndirect (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2; +#endif + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +} + +static void Op7C (void) +{ + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +} +/**********************************************************************************************/ + +/* JSL/RTL *********************************************************************************** */ +static void Op22E1 (void) +{ + AbsoluteLong (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif + PushB (ICPU.Registers.PB); + PushWENew (CPU.PC - CPU.PCBase - 1); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} + +static void Op22 (void) +{ + AbsoluteLong (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#endif + PushB (ICPU.Registers.PB); + PushW (CPU.PC - CPU.PCBase - 1); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} + +static void Op6BE1 (void) +{ + PullWENew (ICPU.Registers.PC); + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} + +static void Op6B (void) +{ + PullW (ICPU.Registers.PC); + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* JSR/RTS *********************************************************************************** */ +static void Op20 (void) +{ + Absolute (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + PushW (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +} + +//JSR a,x +static void OpFCE1 (void) +{ + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + PushWENew (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +} + +static void OpFC (void) +{ + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#endif + PushW (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +} + +static void Op60 (void) +{ + PullW (ICPU.Registers.PC); + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE * 3; +#endif +} + +/**********************************************************************************************/ + +/* MVN/MVP *********************************************************************************** */ +static void Op54X1 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; +#endif + + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.XL++; + ICPU.Registers.YL++; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op54X0 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; +#endif + + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.X.W++; + ICPU.Registers.Y.W++; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op44X1 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; +#endif + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.XL--; + ICPU.Registers.YL--; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op44X0 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; +#endif + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.X.W--; + ICPU.Registers.Y.W--; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +/**********************************************************************************************/ + +/* REP/SEP *********************************************************************************** */ +static void OpC2 (void) +{ + uint8 Work8 = ~*CPU.PC++; + ICPU.Registers.PL &= Work8; + ICPU._Carry &= Work8; + ICPU._Overflow &= (Work8 >> 6); + ICPU._Negative &= Work8; + ICPU._Zero |= ~Work8 & Zero; + +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + missing.emulate6502 = 1; + } + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } + S9xFixCycles(); +/* CHECK_FOR_IRQ(); */ +} + +static void OpE2 (void) +{ + uint8 Work8 = *CPU.PC++; + ICPU.Registers.PL |= Work8; + ICPU._Carry |= Work8 & 1; + ICPU._Overflow |= (Work8 >> 6) & 1; + ICPU._Negative |= Work8; + if (Work8 & Zero) + ICPU._Zero = 0; +#ifndef SA1_OPCODES + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +#endif + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + missing.emulate6502 = 1; + } + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } + S9xFixCycles(); +} +/**********************************************************************************************/ + +/* XBA *************************************************************************************** */ +static void OpEB (void) +{ + uint8 Work8 = ICPU.Registers.AL; + ICPU.Registers.AL = ICPU.Registers.AH; + ICPU.Registers.AH = Work8; + + SetZN8 (ICPU.Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* RTI *************************************************************************************** */ +static void Op40 (void) +{ + PullB (ICPU.Registers.PL); + S9xUnpackStatus (); + PullW (ICPU.Registers.PC); + if (!CheckEmulation()) + { + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + } + else + { + SetFlags (MemoryFlag | IndexFlag); + missing.emulate6502 = 1; + } + S9xSetPCBase (ICPU.ShiftedPB + ICPU.Registers.PC); + if (CheckIndex ()) + { + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + } +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + S9xFixCycles(); +/* CHECK_FOR_IRQ(); */ +} + +/**********************************************************************************************/ + +/* STP/WAI/DB ******************************************************************************** */ +// WAI +static void OpCB (void) +{ + +// Ok, let's just C-ify the ASM versions separately. +#ifdef SA1_OPCODES + SA1.WaitingForInterrupt = TRUE; + SA1.PC--; +#if 0 +// XXX: FIXME + if(Settings.Shutdown){ + SA1.Cycles = SA1.NextEvent; + if (IAPU.APUExecuting) + { + SA1.Executing = FALSE; + do + { + APU_EXECUTE1 (, } while (APU.Cycles < SA1.NextEvent, SA1.Executing = TRUE; + } + } +#endif +#else // SA1_OPCODES +#if 0 + + + if (CPU.IRQActive) + { +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else +#endif + { + CPU.WaitingForInterrupt = TRUE; + CPU.PC--; +#ifdef CPU_SHUTDOWN + if (Settings.Shutdown) + { + CPU.Cycles = CPU.NextEvent; + if (IAPU.APUExecuting) + { + ICPU.CPUExecuting = FALSE; + do + { + APU_EXECUTE1 (); + } while (APU.Cycles < CPU.NextEvent); + ICPU.CPUExecuting = TRUE; + } + } + else + { +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } +#endif + } +#endif // SA1_OPCODES +} + +// STP +static void OpDB (void) +{ + CPU.PC--; + CPU.Flags |= DEBUG_MODE_FLAG; +} + +// Reserved S9xOpcode +static void Op42 (void) +{ +} + +/*****************************************************************************/ + +/*****************************************************************************/ +/* CPU-S9xOpcodes Definitions */ +/*****************************************************************************/ +struct SOpcodes S9xOpcodesM1X1[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, + {Op05M1}, {Op06M1}, {Op07M1}, {Op08}, {Op09M1}, + {Op0AM1}, {Op0B}, {Op0CM1}, {Op0DM1}, {Op0EM1}, + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22}, + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, + {Op28}, {Op29M1}, {Op2AM1}, {Op2B}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X1}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48M1}, {Op49M1}, {Op4AM1}, + {Op4B}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X1}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AX1}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68M1}, + {Op69M1}, {Op6AM1}, {Op6B}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AX1}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X1}, {Op85M1}, {Op86X1}, + {Op87M1}, {Op88X1}, {Op89M1}, {Op8AM1}, {Op8B}, + {Op8CX1}, {Op8DM1}, {Op8EX1}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X1}, {Op95M1}, + {Op96X1}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX1}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X1}, {OpA1M1}, {OpA2X1}, {OpA3M1}, {OpA4X1}, + {OpA5M1}, {OpA6X1}, {OpA7M1}, {OpA8X1}, {OpA9M1}, + {OpAAX1}, {OpAB}, {OpACX1}, {OpADM1}, {OpAEX1}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X1}, {OpB5M1}, {OpB6X1}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM1}, + {OpBEX1}, {OpBFM1}, {OpC0X1}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X1}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X1}, {OpC9M1}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAX1}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X1}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X1}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X1}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAX1}, {OpFB}, {OpFC}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; + +struct SOpcodes S9xOpcodesE1[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, + {Op05M1}, {Op06M1}, {Op07M1}, {Op08E1}, {Op09M1}, + {Op0AM1}, {Op0BE1}, {Op0CM1}, {Op0DM1}, {Op0EM1}, + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22E1}, + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, + {Op28}, {Op29M1}, {Op2AM1}, {Op2BE1}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X1}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48E1}, {Op49M1}, {Op4AM1}, + {Op4BE1}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X1}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AE1}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62E1}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68E1}, + {Op69M1}, {Op6AM1}, {Op6BE1}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AE1}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X1}, {Op85M1}, {Op86X1}, + {Op87M1}, {Op88X1}, {Op89M1}, {Op8AM1}, {Op8BE1}, + {Op8CX1}, {Op8DM1}, {Op8EX1}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X1}, {Op95M1}, + {Op96X1}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX1}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X1}, {OpA1M1}, {OpA2X1}, {OpA3M1}, {OpA4X1}, + {OpA5M1}, {OpA6X1}, {OpA7M1}, {OpA8X1}, {OpA9M1}, + {OpAAX1}, {OpABE1}, {OpACX1}, {OpADM1}, {OpAEX1}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X1}, {OpB5M1}, {OpB6X1}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM1}, + {OpBEX1}, {OpBFM1}, {OpC0X1}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X1}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X1}, {OpC9M1}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4E1}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAE1}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X1}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X1}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X1}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4E1}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAE1}, {OpFB}, {OpFCE1}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; + +struct SOpcodes S9xOpcodesM1X0[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, + {Op05M1}, {Op06M1}, {Op07M1}, {Op08}, {Op09M1}, + {Op0AM1}, {Op0B}, {Op0CM1}, {Op0DM1}, {Op0EM1}, + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22}, + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, + {Op28}, {Op29M1}, {Op2AM1}, {Op2B}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X0}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48M1}, {Op49M1}, {Op4AM1}, + {Op4B}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X0}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AX0}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68M1}, + {Op69M1}, {Op6AM1}, {Op6B}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AX0}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X0}, {Op85M1}, {Op86X0}, + {Op87M1}, {Op88X0}, {Op89M1}, {Op8AM1}, {Op8B}, + {Op8CX0}, {Op8DM1}, {Op8EX0}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X0}, {Op95M1}, + {Op96X0}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX0}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X0}, {OpA1M1}, {OpA2X0}, {OpA3M1}, {OpA4X0}, + {OpA5M1}, {OpA6X0}, {OpA7M1}, {OpA8X0}, {OpA9M1}, + {OpAAX0}, {OpAB}, {OpACX0}, {OpADM1}, {OpAEX0}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X0}, {OpB5M1}, {OpB6X0}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX0}, {OpBBX0}, {OpBCX0}, {OpBDM1}, + {OpBEX0}, {OpBFM1}, {OpC0X0}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X0}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X0}, {OpC9M1}, {OpCAX0}, {OpCB}, {OpCCX0}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAX0}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X0}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X0}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X0}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX0}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAX0}, {OpFB}, {OpFC}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; + +struct SOpcodes S9xOpcodesM0X0[256] = +{ + {Op00}, {Op01M0}, {Op02}, {Op03M0}, {Op04M0}, + {Op05M0}, {Op06M0}, {Op07M0}, {Op08}, {Op09M0}, + {Op0AM0}, {Op0B}, {Op0CM0}, {Op0DM0}, {Op0EM0}, + {Op0FM0}, {Op10}, {Op11M0}, {Op12M0}, {Op13M0}, + {Op14M0}, {Op15M0}, {Op16M0}, {Op17M0}, {Op18}, + {Op19M0}, {Op1AM0}, {Op1B}, {Op1CM0}, {Op1DM0}, + {Op1EM0}, {Op1FM0}, {Op20}, {Op21M0}, {Op22}, + {Op23M0}, {Op24M0}, {Op25M0}, {Op26M0}, {Op27M0}, + {Op28}, {Op29M0}, {Op2AM0}, {Op2B}, {Op2CM0}, + {Op2DM0}, {Op2EM0}, {Op2FM0}, {Op30}, {Op31M0}, + {Op32M0}, {Op33M0}, {Op34M0}, {Op35M0}, {Op36M0}, + {Op37M0}, {Op38}, {Op39M0}, {Op3AM0}, {Op3B}, + {Op3CM0}, {Op3DM0}, {Op3EM0}, {Op3FM0}, {Op40}, + {Op41M0}, {Op42}, {Op43M0}, {Op44X0}, {Op45M0}, + {Op46M0}, {Op47M0}, {Op48M0}, {Op49M0}, {Op4AM0}, + {Op4B}, {Op4C}, {Op4DM0}, {Op4EM0}, {Op4FM0}, + {Op50}, {Op51M0}, {Op52M0}, {Op53M0}, {Op54X0}, + {Op55M0}, {Op56M0}, {Op57M0}, {Op58}, {Op59M0}, + {Op5AX0}, {Op5B}, {Op5C}, {Op5DM0}, {Op5EM0}, + {Op5FM0}, {Op60}, {Op61M0}, {Op62}, {Op63M0}, + {Op64M0}, {Op65M0}, {Op66M0}, {Op67M0}, {Op68M0}, + {Op69M0}, {Op6AM0}, {Op6B}, {Op6C}, {Op6DM0}, + {Op6EM0}, {Op6FM0}, {Op70}, {Op71M0}, {Op72M0}, + {Op73M0}, {Op74M0}, {Op75M0}, {Op76M0}, {Op77M0}, + {Op78}, {Op79M0}, {Op7AX0}, {Op7B}, {Op7C}, + {Op7DM0}, {Op7EM0}, {Op7FM0}, {Op80}, {Op81M0}, + {Op82}, {Op83M0}, {Op84X0}, {Op85M0}, {Op86X0}, + {Op87M0}, {Op88X0}, {Op89M0}, {Op8AM0}, {Op8B}, + {Op8CX0}, {Op8DM0}, {Op8EX0}, {Op8FM0}, {Op90}, + {Op91M0}, {Op92M0}, {Op93M0}, {Op94X0}, {Op95M0}, + {Op96X0}, {Op97M0}, {Op98M0}, {Op99M0}, {Op9A}, + {Op9BX0}, {Op9CM0}, {Op9DM0}, {Op9EM0}, {Op9FM0}, + {OpA0X0}, {OpA1M0}, {OpA2X0}, {OpA3M0}, {OpA4X0}, + {OpA5M0}, {OpA6X0}, {OpA7M0}, {OpA8X0}, {OpA9M0}, + {OpAAX0}, {OpAB}, {OpACX0}, {OpADM0}, {OpAEX0}, + {OpAFM0}, {OpB0}, {OpB1M0}, {OpB2M0}, {OpB3M0}, + {OpB4X0}, {OpB5M0}, {OpB6X0}, {OpB7M0}, {OpB8}, + {OpB9M0}, {OpBAX0}, {OpBBX0}, {OpBCX0}, {OpBDM0}, + {OpBEX0}, {OpBFM0}, {OpC0X0}, {OpC1M0}, {OpC2}, + {OpC3M0}, {OpC4X0}, {OpC5M0}, {OpC6M0}, {OpC7M0}, + {OpC8X0}, {OpC9M0}, {OpCAX0}, {OpCB}, {OpCCX0}, + {OpCDM0}, {OpCEM0}, {OpCFM0}, {OpD0}, {OpD1M0}, + {OpD2M0}, {OpD3M0}, {OpD4}, {OpD5M0}, {OpD6M0}, + {OpD7M0}, {OpD8}, {OpD9M0}, {OpDAX0}, {OpDB}, + {OpDC}, {OpDDM0}, {OpDEM0}, {OpDFM0}, {OpE0X0}, + {OpE1M0}, {OpE2}, {OpE3M0}, {OpE4X0}, {OpE5M0}, + {OpE6M0}, {OpE7M0}, {OpE8X0}, {OpE9M0}, {OpEA}, + {OpEB}, {OpECX0}, {OpEDM0}, {OpEEM0}, {OpEFM0}, + {OpF0}, {OpF1M0}, {OpF2M0}, {OpF3M0}, {OpF4}, + {OpF5M0}, {OpF6M0}, {OpF7M0}, {OpF8}, {OpF9M0}, + {OpFAX0}, {OpFB}, {OpFC}, {OpFDM0}, {OpFEM0}, + {OpFFM0} +}; + +struct SOpcodes S9xOpcodesM0X1[256] = +{ + {Op00}, {Op01M0}, {Op02}, {Op03M0}, {Op04M0}, + {Op05M0}, {Op06M0}, {Op07M0}, {Op08}, {Op09M0}, + {Op0AM0}, {Op0B}, {Op0CM0}, {Op0DM0}, {Op0EM0}, + {Op0FM0}, {Op10}, {Op11M0}, {Op12M0}, {Op13M0}, + {Op14M0}, {Op15M0}, {Op16M0}, {Op17M0}, {Op18}, + {Op19M0}, {Op1AM0}, {Op1B}, {Op1CM0}, {Op1DM0}, + {Op1EM0}, {Op1FM0}, {Op20}, {Op21M0}, {Op22}, + {Op23M0}, {Op24M0}, {Op25M0}, {Op26M0}, {Op27M0}, + {Op28}, {Op29M0}, {Op2AM0}, {Op2B}, {Op2CM0}, + {Op2DM0}, {Op2EM0}, {Op2FM0}, {Op30}, {Op31M0}, + {Op32M0}, {Op33M0}, {Op34M0}, {Op35M0}, {Op36M0}, + {Op37M0}, {Op38}, {Op39M0}, {Op3AM0}, {Op3B}, + {Op3CM0}, {Op3DM0}, {Op3EM0}, {Op3FM0}, {Op40}, + {Op41M0}, {Op42}, {Op43M0}, {Op44X1}, {Op45M0}, + {Op46M0}, {Op47M0}, {Op48M0}, {Op49M0}, {Op4AM0}, + {Op4B}, {Op4C}, {Op4DM0}, {Op4EM0}, {Op4FM0}, + {Op50}, {Op51M0}, {Op52M0}, {Op53M0}, {Op54X1}, + {Op55M0}, {Op56M0}, {Op57M0}, {Op58}, {Op59M0}, + {Op5AX1}, {Op5B}, {Op5C}, {Op5DM0}, {Op5EM0}, + {Op5FM0}, {Op60}, {Op61M0}, {Op62}, {Op63M0}, + {Op64M0}, {Op65M0}, {Op66M0}, {Op67M0}, {Op68M0}, + {Op69M0}, {Op6AM0}, {Op6B}, {Op6C}, {Op6DM0}, + {Op6EM0}, {Op6FM0}, {Op70}, {Op71M0}, {Op72M0}, + {Op73M0}, {Op74M0}, {Op75M0}, {Op76M0}, {Op77M0}, + {Op78}, {Op79M0}, {Op7AX1}, {Op7B}, {Op7C}, + {Op7DM0}, {Op7EM0}, {Op7FM0}, {Op80}, {Op81M0}, + {Op82}, {Op83M0}, {Op84X1}, {Op85M0}, {Op86X1}, + {Op87M0}, {Op88X1}, {Op89M0}, {Op8AM0}, {Op8B}, + {Op8CX1}, {Op8DM0}, {Op8EX1}, {Op8FM0}, {Op90}, + {Op91M0}, {Op92M0}, {Op93M0}, {Op94X1}, {Op95M0}, + {Op96X1}, {Op97M0}, {Op98M0}, {Op99M0}, {Op9A}, + {Op9BX1}, {Op9CM0}, {Op9DM0}, {Op9EM0}, {Op9FM0}, + {OpA0X1}, {OpA1M0}, {OpA2X1}, {OpA3M0}, {OpA4X1}, + {OpA5M0}, {OpA6X1}, {OpA7M0}, {OpA8X1}, {OpA9M0}, + {OpAAX1}, {OpAB}, {OpACX1}, {OpADM0}, {OpAEX1}, + {OpAFM0}, {OpB0}, {OpB1M0}, {OpB2M0}, {OpB3M0}, + {OpB4X1}, {OpB5M0}, {OpB6X1}, {OpB7M0}, {OpB8}, + {OpB9M0}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM0}, + {OpBEX1}, {OpBFM0}, {OpC0X1}, {OpC1M0}, {OpC2}, + {OpC3M0}, {OpC4X1}, {OpC5M0}, {OpC6M0}, {OpC7M0}, + {OpC8X1}, {OpC9M0}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM0}, {OpCEM0}, {OpCFM0}, {OpD0}, {OpD1M0}, + {OpD2M0}, {OpD3M0}, {OpD4}, {OpD5M0}, {OpD6M0}, + {OpD7M0}, {OpD8}, {OpD9M0}, {OpDAX1}, {OpDB}, + {OpDC}, {OpDDM0}, {OpDEM0}, {OpDFM0}, {OpE0X1}, + {OpE1M0}, {OpE2}, {OpE3M0}, {OpE4X1}, {OpE5M0}, + {OpE6M0}, {OpE7M0}, {OpE8X1}, {OpE9M0}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM0}, {OpEEM0}, {OpEFM0}, + {OpF0}, {OpF1M0}, {OpF2M0}, {OpF3M0}, {OpF4}, + {OpF5M0}, {OpF6M0}, {OpF7M0}, {OpF8}, {OpF9M0}, + {OpFAX1}, {OpFB}, {OpFC}, {OpFDM0}, {OpFEM0}, + {OpFFM0} +}; + |