Path: blob/main/misc/emulator/xnes/snes9x/cpuops.cpp
28515 views
/***********************************************************************************1Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.23(c) Copyright 1996 - 2002 Gary Henderson ([email protected]),4Jerremy Koot ([email protected])56(c) Copyright 2002 - 2004 Matthew Kendora78(c) Copyright 2002 - 2005 Peter Bortas ([email protected])910(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)1112(c) Copyright 2001 - 2006 John Weidman ([email protected])1314(c) Copyright 2002 - 2006 funkyass ([email protected]),15Kris Bleakley ([email protected])1617(c) Copyright 2002 - 2010 Brad Jorsch ([email protected]),18Nach ([email protected]),1920(c) Copyright 2002 - 2011 zones ([email protected])2122(c) Copyright 2006 - 2007 nitsuja2324(c) Copyright 2009 - 2011 BearOso,25OV2262728BS-X C emulator code29(c) Copyright 2005 - 2006 Dreamer Nom,30zones3132C4 x86 assembler and some C emulation code33(c) Copyright 2000 - 2003 _Demo_ ([email protected]),34Nach,35zsKnight ([email protected])3637C4 C++ code38(c) Copyright 2003 - 2006 Brad Jorsch,39Nach4041DSP-1 emulator code42(c) Copyright 1998 - 2006 _Demo_,43Andreas Naive ([email protected]),44Gary Henderson,45Ivar ([email protected]),46John Weidman,47Kris Bleakley,48Matthew Kendora,49Nach,50neviksti ([email protected])5152DSP-2 emulator code53(c) Copyright 2003 John Weidman,54Kris Bleakley,55Lord Nightmare ([email protected]),56Matthew Kendora,57neviksti5859DSP-3 emulator code60(c) Copyright 2003 - 2006 John Weidman,61Kris Bleakley,62Lancer,63z80 gaiden6465DSP-4 emulator code66(c) Copyright 2004 - 2006 Dreamer Nom,67John Weidman,68Kris Bleakley,69Nach,70z80 gaiden7172OBC1 emulator code73(c) Copyright 2001 - 2004 zsKnight,74pagefault ([email protected]),75Kris Bleakley76Ported from x86 assembler to C by sanmaiwashi7778SPC7110 and RTC C++ emulator code used in 1.39-1.5179(c) Copyright 2002 Matthew Kendora with research by80zsKnight,81John Weidman,82Dark Force8384SPC7110 and RTC C++ emulator code used in 1.52+85(c) Copyright 2009 byuu,86neviksti8788S-DD1 C emulator code89(c) Copyright 2003 Brad Jorsch with research by90Andreas Naive,91John Weidman9293S-RTC C emulator code94(c) Copyright 2001 - 2006 byuu,95John Weidman9697ST010 C++ emulator code98(c) Copyright 2003 Feather,99John Weidman,100Kris Bleakley,101Matthew Kendora102103Super FX x86 assembler emulator code104(c) Copyright 1998 - 2003 _Demo_,105pagefault,106zsKnight107108Super FX C emulator code109(c) Copyright 1997 - 1999 Ivar,110Gary Henderson,111John Weidman112113Sound emulator code used in 1.5-1.51114(c) Copyright 1998 - 2003 Brad Martin115(c) Copyright 1998 - 2006 Charles Bilyue'116117Sound emulator code used in 1.52+118(c) Copyright 2004 - 2007 Shay Green ([email protected])119120SH assembler code partly based on x86 assembler code121(c) Copyright 2002 - 2004 Marcus Comstedt ([email protected])1221232xSaI filter124(c) Copyright 1999 - 2001 Derek Liauw Kie Fa125126HQ2x, HQ3x, HQ4x filters127(c) Copyright 2003 Maxim Stepin ([email protected])128129NTSC filter130(c) Copyright 2006 - 2007 Shay Green131132GTK+ GUI code133(c) Copyright 2004 - 2011 BearOso134135Win32 GUI code136(c) Copyright 2003 - 2006 blip,137funkyass,138Matthew Kendora,139Nach,140nitsuja141(c) Copyright 2009 - 2011 OV2142143Mac OS GUI code144(c) Copyright 1998 - 2001 John Stiles145(c) Copyright 2001 - 2011 zones146147148Specific ports contains the works of other authors. See headers in149individual files.150151152Snes9x homepage: http://www.snes9x.com/153154Permission to use, copy, modify and/or distribute Snes9x in both binary155and source form, for non-commercial purposes, is hereby granted without156fee, providing that this license information and copyright notice appear157with all copies and any derived work.158159This software is provided 'as-is', without any express or implied160warranty. In no event shall the authors be held liable for any damages161arising from the use of this software or it's derivatives.162163Snes9x is freeware for PERSONAL USE only. Commercial users should164seek permission of the copyright holders first. Commercial use includes,165but is not limited to, charging money for Snes9x or software derived from166Snes9x, including Snes9x or derivatives in commercial game bundles, and/or167using Snes9x as a promotion for your commercial product.168169The copyright holders request that bug fixes and improvements to the code170should be forwarded to them so everyone can benefit from the modifications171in future versions.172173Super NES and Super Nintendo Entertainment System are trademarks of174Nintendo Co., Limited and its subsidiary companies.175***********************************************************************************/176177178#include "snes9x.h"179#include "memmap.h"180#include "apu/apu.h"181182// for "Magic WDM" features183#ifdef DEBUGGER184#include "snapshot.h"185#include "display.h"186#include "debug.h"187#include "missing.h"188#endif189190#ifdef SA1_OPCODES191#define AddCycles(n) { SA1.Cycles += (n); }192#else193#define AddCycles(n) { CPU.PrevCycles = CPU.Cycles; CPU.Cycles += (n); S9xCheckInterrupts(); while (CPU.Cycles >= CPU.NextEvent) S9xDoHEventProcessing(); }194#endif195196#include "cpuaddr.h"197#include "cpuops.h"198#include "cpumacro.h"199200201/* ADC ********************************************************************* */202203static void Op69M1 (void)204{205ADC(Immediate8(READ));206}207208static void Op69M0 (void)209{210ADC(Immediate16(READ));211}212213static void Op69Slow (void)214{215if (CheckMemory())216ADC(Immediate8Slow(READ));217else218ADC(Immediate16Slow(READ));219}220221rOP8 (65M1, Direct, WRAP_BANK, ADC)222rOP16(65M0, Direct, WRAP_BANK, ADC)223rOPM (65Slow, DirectSlow, WRAP_BANK, ADC)224225rOP8 (75E1, DirectIndexedXE1, WRAP_BANK, ADC)226rOP8 (75E0M1, DirectIndexedXE0, WRAP_BANK, ADC)227rOP16(75E0M0, DirectIndexedXE0, WRAP_BANK, ADC)228rOPM (75Slow, DirectIndexedXSlow, WRAP_BANK, ADC)229230rOP8 (72E1, DirectIndirectE1, WRAP_NONE, ADC)231rOP8 (72E0M1, DirectIndirectE0, WRAP_NONE, ADC)232rOP16(72E0M0, DirectIndirectE0, WRAP_NONE, ADC)233rOPM (72Slow, DirectIndirectSlow, WRAP_NONE, ADC)234235rOP8 (61E1, DirectIndexedIndirectE1, WRAP_NONE, ADC)236rOP8 (61E0M1, DirectIndexedIndirectE0, WRAP_NONE, ADC)237rOP16(61E0M0, DirectIndexedIndirectE0, WRAP_NONE, ADC)238rOPM (61Slow, DirectIndexedIndirectSlow, WRAP_NONE, ADC)239240rOP8 (71E1, DirectIndirectIndexedE1, WRAP_NONE, ADC)241rOP8 (71E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, ADC)242rOP16(71E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, ADC)243rOP8 (71E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, ADC)244rOP16(71E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, ADC)245rOPM (71Slow, DirectIndirectIndexedSlow, WRAP_NONE, ADC)246247rOP8 (67M1, DirectIndirectLong, WRAP_NONE, ADC)248rOP16(67M0, DirectIndirectLong, WRAP_NONE, ADC)249rOPM (67Slow, DirectIndirectLongSlow, WRAP_NONE, ADC)250251rOP8 (77M1, DirectIndirectIndexedLong, WRAP_NONE, ADC)252rOP16(77M0, DirectIndirectIndexedLong, WRAP_NONE, ADC)253rOPM (77Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, ADC)254255rOP8 (6DM1, Absolute, WRAP_NONE, ADC)256rOP16(6DM0, Absolute, WRAP_NONE, ADC)257rOPM (6DSlow, AbsoluteSlow, WRAP_NONE, ADC)258259rOP8 (7DM1X1, AbsoluteIndexedXX1, WRAP_NONE, ADC)260rOP16(7DM0X1, AbsoluteIndexedXX1, WRAP_NONE, ADC)261rOP8 (7DM1X0, AbsoluteIndexedXX0, WRAP_NONE, ADC)262rOP16(7DM0X0, AbsoluteIndexedXX0, WRAP_NONE, ADC)263rOPM (7DSlow, AbsoluteIndexedXSlow, WRAP_NONE, ADC)264265rOP8 (79M1X1, AbsoluteIndexedYX1, WRAP_NONE, ADC)266rOP16(79M0X1, AbsoluteIndexedYX1, WRAP_NONE, ADC)267rOP8 (79M1X0, AbsoluteIndexedYX0, WRAP_NONE, ADC)268rOP16(79M0X0, AbsoluteIndexedYX0, WRAP_NONE, ADC)269rOPM (79Slow, AbsoluteIndexedYSlow, WRAP_NONE, ADC)270271rOP8 (6FM1, AbsoluteLong, WRAP_NONE, ADC)272rOP16(6FM0, AbsoluteLong, WRAP_NONE, ADC)273rOPM (6FSlow, AbsoluteLongSlow, WRAP_NONE, ADC)274275rOP8 (7FM1, AbsoluteLongIndexedX, WRAP_NONE, ADC)276rOP16(7FM0, AbsoluteLongIndexedX, WRAP_NONE, ADC)277rOPM (7FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, ADC)278279rOP8 (63M1, StackRelative, WRAP_NONE, ADC)280rOP16(63M0, StackRelative, WRAP_NONE, ADC)281rOPM (63Slow, StackRelativeSlow, WRAP_NONE, ADC)282283rOP8 (73M1, StackRelativeIndirectIndexed, WRAP_NONE, ADC)284rOP16(73M0, StackRelativeIndirectIndexed, WRAP_NONE, ADC)285rOPM (73Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, ADC)286287/* AND ********************************************************************* */288289static void Op29M1 (void)290{291Registers.AL &= Immediate8(READ);292SetZN(Registers.AL);293}294295static void Op29M0 (void)296{297Registers.A.W &= Immediate16(READ);298SetZN(Registers.A.W);299}300301static void Op29Slow (void)302{303if (CheckMemory())304{305Registers.AL &= Immediate8Slow(READ);306SetZN(Registers.AL);307}308else309{310Registers.A.W &= Immediate16Slow(READ);311SetZN(Registers.A.W);312}313}314315rOP8 (25M1, Direct, WRAP_BANK, AND)316rOP16(25M0, Direct, WRAP_BANK, AND)317rOPM (25Slow, DirectSlow, WRAP_BANK, AND)318319rOP8 (35E1, DirectIndexedXE1, WRAP_BANK, AND)320rOP8 (35E0M1, DirectIndexedXE0, WRAP_BANK, AND)321rOP16(35E0M0, DirectIndexedXE0, WRAP_BANK, AND)322rOPM (35Slow, DirectIndexedXSlow, WRAP_BANK, AND)323324rOP8 (32E1, DirectIndirectE1, WRAP_NONE, AND)325rOP8 (32E0M1, DirectIndirectE0, WRAP_NONE, AND)326rOP16(32E0M0, DirectIndirectE0, WRAP_NONE, AND)327rOPM (32Slow, DirectIndirectSlow, WRAP_NONE, AND)328329rOP8 (21E1, DirectIndexedIndirectE1, WRAP_NONE, AND)330rOP8 (21E0M1, DirectIndexedIndirectE0, WRAP_NONE, AND)331rOP16(21E0M0, DirectIndexedIndirectE0, WRAP_NONE, AND)332rOPM (21Slow, DirectIndexedIndirectSlow, WRAP_NONE, AND)333334rOP8 (31E1, DirectIndirectIndexedE1, WRAP_NONE, AND)335rOP8 (31E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, AND)336rOP16(31E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, AND)337rOP8 (31E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, AND)338rOP16(31E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, AND)339rOPM (31Slow, DirectIndirectIndexedSlow, WRAP_NONE, AND)340341rOP8 (27M1, DirectIndirectLong, WRAP_NONE, AND)342rOP16(27M0, DirectIndirectLong, WRAP_NONE, AND)343rOPM (27Slow, DirectIndirectLongSlow, WRAP_NONE, AND)344345rOP8 (37M1, DirectIndirectIndexedLong, WRAP_NONE, AND)346rOP16(37M0, DirectIndirectIndexedLong, WRAP_NONE, AND)347rOPM (37Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, AND)348349rOP8 (2DM1, Absolute, WRAP_NONE, AND)350rOP16(2DM0, Absolute, WRAP_NONE, AND)351rOPM (2DSlow, AbsoluteSlow, WRAP_NONE, AND)352353rOP8 (3DM1X1, AbsoluteIndexedXX1, WRAP_NONE, AND)354rOP16(3DM0X1, AbsoluteIndexedXX1, WRAP_NONE, AND)355rOP8 (3DM1X0, AbsoluteIndexedXX0, WRAP_NONE, AND)356rOP16(3DM0X0, AbsoluteIndexedXX0, WRAP_NONE, AND)357rOPM (3DSlow, AbsoluteIndexedXSlow, WRAP_NONE, AND)358359rOP8 (39M1X1, AbsoluteIndexedYX1, WRAP_NONE, AND)360rOP16(39M0X1, AbsoluteIndexedYX1, WRAP_NONE, AND)361rOP8 (39M1X0, AbsoluteIndexedYX0, WRAP_NONE, AND)362rOP16(39M0X0, AbsoluteIndexedYX0, WRAP_NONE, AND)363rOPM (39Slow, AbsoluteIndexedYSlow, WRAP_NONE, AND)364365rOP8 (2FM1, AbsoluteLong, WRAP_NONE, AND)366rOP16(2FM0, AbsoluteLong, WRAP_NONE, AND)367rOPM (2FSlow, AbsoluteLongSlow, WRAP_NONE, AND)368369rOP8 (3FM1, AbsoluteLongIndexedX, WRAP_NONE, AND)370rOP16(3FM0, AbsoluteLongIndexedX, WRAP_NONE, AND)371rOPM (3FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, AND)372373rOP8 (23M1, StackRelative, WRAP_NONE, AND)374rOP16(23M0, StackRelative, WRAP_NONE, AND)375rOPM (23Slow, StackRelativeSlow, WRAP_NONE, AND)376377rOP8 (33M1, StackRelativeIndirectIndexed, WRAP_NONE, AND)378rOP16(33M0, StackRelativeIndirectIndexed, WRAP_NONE, AND)379rOPM (33Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, AND)380381/* ASL ********************************************************************* */382383static void Op0AM1 (void)384{385AddCycles(ONE_CYCLE);386ICPU._Carry = (Registers.AL & 0x80) != 0;387Registers.AL <<= 1;388SetZN(Registers.AL);389}390391static void Op0AM0 (void)392{393AddCycles(ONE_CYCLE);394ICPU._Carry = (Registers.AH & 0x80) != 0;395Registers.A.W <<= 1;396SetZN(Registers.A.W);397}398399static void Op0ASlow (void)400{401AddCycles(ONE_CYCLE);402403if (CheckMemory())404{405ICPU._Carry = (Registers.AL & 0x80) != 0;406Registers.AL <<= 1;407SetZN(Registers.AL);408}409else410{411ICPU._Carry = (Registers.AH & 0x80) != 0;412Registers.A.W <<= 1;413SetZN(Registers.A.W);414}415}416417mOP8 (06M1, Direct, WRAP_BANK, ASL)418mOP16(06M0, Direct, WRAP_BANK, ASL)419mOPM (06Slow, DirectSlow, WRAP_BANK, ASL)420421mOP8 (16E1, DirectIndexedXE1, WRAP_BANK, ASL)422mOP8 (16E0M1, DirectIndexedXE0, WRAP_BANK, ASL)423mOP16(16E0M0, DirectIndexedXE0, WRAP_BANK, ASL)424mOPM (16Slow, DirectIndexedXSlow, WRAP_BANK, ASL)425426mOP8 (0EM1, Absolute, WRAP_NONE, ASL)427mOP16(0EM0, Absolute, WRAP_NONE, ASL)428mOPM (0ESlow, AbsoluteSlow, WRAP_NONE, ASL)429430mOP8 (1EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ASL)431mOP16(1EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ASL)432mOP8 (1EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ASL)433mOP16(1EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ASL)434mOPM (1ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ASL)435436/* BIT ********************************************************************* */437438static void Op89M1 (void)439{440ICPU._Zero = Registers.AL & Immediate8(READ);441}442443static void Op89M0 (void)444{445ICPU._Zero = (Registers.A.W & Immediate16(READ)) != 0;446}447448static void Op89Slow (void)449{450if (CheckMemory())451ICPU._Zero = Registers.AL & Immediate8Slow(READ);452else453ICPU._Zero = (Registers.A.W & Immediate16Slow(READ)) != 0;454}455456rOP8 (24M1, Direct, WRAP_BANK, BIT)457rOP16(24M0, Direct, WRAP_BANK, BIT)458rOPM (24Slow, DirectSlow, WRAP_BANK, BIT)459460rOP8 (34E1, DirectIndexedXE1, WRAP_BANK, BIT)461rOP8 (34E0M1, DirectIndexedXE0, WRAP_BANK, BIT)462rOP16(34E0M0, DirectIndexedXE0, WRAP_BANK, BIT)463rOPM (34Slow, DirectIndexedXSlow, WRAP_BANK, BIT)464465rOP8 (2CM1, Absolute, WRAP_NONE, BIT)466rOP16(2CM0, Absolute, WRAP_NONE, BIT)467rOPM (2CSlow, AbsoluteSlow, WRAP_NONE, BIT)468469rOP8 (3CM1X1, AbsoluteIndexedXX1, WRAP_NONE, BIT)470rOP16(3CM0X1, AbsoluteIndexedXX1, WRAP_NONE, BIT)471rOP8 (3CM1X0, AbsoluteIndexedXX0, WRAP_NONE, BIT)472rOP16(3CM0X0, AbsoluteIndexedXX0, WRAP_NONE, BIT)473rOPM (3CSlow, AbsoluteIndexedXSlow, WRAP_NONE, BIT)474475/* CMP ********************************************************************* */476477static void OpC9M1 (void)478{479int16 Int16 = (int16) Registers.AL - (int16) Immediate8(READ);480ICPU._Carry = Int16 >= 0;481SetZN((uint8) Int16);482}483484static void OpC9M0 (void)485{486int32 Int32 = (int32) Registers.A.W - (int32) Immediate16(READ);487ICPU._Carry = Int32 >= 0;488SetZN((uint16) Int32);489}490491static void OpC9Slow (void)492{493if (CheckMemory())494{495int16 Int16 = (int16) Registers.AL - (int16) Immediate8Slow(READ);496ICPU._Carry = Int16 >= 0;497SetZN((uint8) Int16);498}499else500{501int32 Int32 = (int32) Registers.A.W - (int32) Immediate16Slow(READ);502ICPU._Carry = Int32 >= 0;503SetZN((uint16) Int32);504}505}506507rOP8 (C5M1, Direct, WRAP_BANK, CMP)508rOP16(C5M0, Direct, WRAP_BANK, CMP)509rOPM (C5Slow, DirectSlow, WRAP_BANK, CMP)510511rOP8 (D5E1, DirectIndexedXE1, WRAP_BANK, CMP)512rOP8 (D5E0M1, DirectIndexedXE0, WRAP_BANK, CMP)513rOP16(D5E0M0, DirectIndexedXE0, WRAP_BANK, CMP)514rOPM (D5Slow, DirectIndexedXSlow, WRAP_BANK, CMP)515516rOP8 (D2E1, DirectIndirectE1, WRAP_NONE, CMP)517rOP8 (D2E0M1, DirectIndirectE0, WRAP_NONE, CMP)518rOP16(D2E0M0, DirectIndirectE0, WRAP_NONE, CMP)519rOPM (D2Slow, DirectIndirectSlow, WRAP_NONE, CMP)520521rOP8 (C1E1, DirectIndexedIndirectE1, WRAP_NONE, CMP)522rOP8 (C1E0M1, DirectIndexedIndirectE0, WRAP_NONE, CMP)523rOP16(C1E0M0, DirectIndexedIndirectE0, WRAP_NONE, CMP)524rOPM (C1Slow, DirectIndexedIndirectSlow, WRAP_NONE, CMP)525526rOP8 (D1E1, DirectIndirectIndexedE1, WRAP_NONE, CMP)527rOP8 (D1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, CMP)528rOP16(D1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, CMP)529rOP8 (D1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, CMP)530rOP16(D1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, CMP)531rOPM (D1Slow, DirectIndirectIndexedSlow, WRAP_NONE, CMP)532533rOP8 (C7M1, DirectIndirectLong, WRAP_NONE, CMP)534rOP16(C7M0, DirectIndirectLong, WRAP_NONE, CMP)535rOPM (C7Slow, DirectIndirectLongSlow, WRAP_NONE, CMP)536537rOP8 (D7M1, DirectIndirectIndexedLong, WRAP_NONE, CMP)538rOP16(D7M0, DirectIndirectIndexedLong, WRAP_NONE, CMP)539rOPM (D7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, CMP)540541rOP8 (CDM1, Absolute, WRAP_NONE, CMP)542rOP16(CDM0, Absolute, WRAP_NONE, CMP)543rOPM (CDSlow, AbsoluteSlow, WRAP_NONE, CMP)544545rOP8 (DDM1X1, AbsoluteIndexedXX1, WRAP_NONE, CMP)546rOP16(DDM0X1, AbsoluteIndexedXX1, WRAP_NONE, CMP)547rOP8 (DDM1X0, AbsoluteIndexedXX0, WRAP_NONE, CMP)548rOP16(DDM0X0, AbsoluteIndexedXX0, WRAP_NONE, CMP)549rOPM (DDSlow, AbsoluteIndexedXSlow, WRAP_NONE, CMP)550551rOP8 (D9M1X1, AbsoluteIndexedYX1, WRAP_NONE, CMP)552rOP16(D9M0X1, AbsoluteIndexedYX1, WRAP_NONE, CMP)553rOP8 (D9M1X0, AbsoluteIndexedYX0, WRAP_NONE, CMP)554rOP16(D9M0X0, AbsoluteIndexedYX0, WRAP_NONE, CMP)555rOPM (D9Slow, AbsoluteIndexedYSlow, WRAP_NONE, CMP)556557rOP8 (CFM1, AbsoluteLong, WRAP_NONE, CMP)558rOP16(CFM0, AbsoluteLong, WRAP_NONE, CMP)559rOPM (CFSlow, AbsoluteLongSlow, WRAP_NONE, CMP)560561rOP8 (DFM1, AbsoluteLongIndexedX, WRAP_NONE, CMP)562rOP16(DFM0, AbsoluteLongIndexedX, WRAP_NONE, CMP)563rOPM (DFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, CMP)564565rOP8 (C3M1, StackRelative, WRAP_NONE, CMP)566rOP16(C3M0, StackRelative, WRAP_NONE, CMP)567rOPM (C3Slow, StackRelativeSlow, WRAP_NONE, CMP)568569rOP8 (D3M1, StackRelativeIndirectIndexed, WRAP_NONE, CMP)570rOP16(D3M0, StackRelativeIndirectIndexed, WRAP_NONE, CMP)571rOPM (D3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, CMP)572573/* CPX ********************************************************************* */574575static void OpE0X1 (void)576{577int16 Int16 = (int16) Registers.XL - (int16) Immediate8(READ);578ICPU._Carry = Int16 >= 0;579SetZN((uint8) Int16);580}581582static void OpE0X0 (void)583{584int32 Int32 = (int32) Registers.X.W - (int32) Immediate16(READ);585ICPU._Carry = Int32 >= 0;586SetZN((uint16) Int32);587}588589static void OpE0Slow (void)590{591if (CheckIndex())592{593int16 Int16 = (int16) Registers.XL - (int16) Immediate8Slow(READ);594ICPU._Carry = Int16 >= 0;595SetZN((uint8) Int16);596}597else598{599int32 Int32 = (int32) Registers.X.W - (int32) Immediate16Slow(READ);600ICPU._Carry = Int32 >= 0;601SetZN((uint16) Int32);602}603}604605rOP8 (E4X1, Direct, WRAP_BANK, CPX)606rOP16(E4X0, Direct, WRAP_BANK, CPX)607rOPX (E4Slow, DirectSlow, WRAP_BANK, CPX)608609rOP8 (ECX1, Absolute, WRAP_NONE, CPX)610rOP16(ECX0, Absolute, WRAP_NONE, CPX)611rOPX (ECSlow, AbsoluteSlow, WRAP_NONE, CPX)612613/* CPY ********************************************************************* */614615static void OpC0X1 (void)616{617int16 Int16 = (int16) Registers.YL - (int16) Immediate8(READ);618ICPU._Carry = Int16 >= 0;619SetZN((uint8) Int16);620}621622static void OpC0X0 (void)623{624int32 Int32 = (int32) Registers.Y.W - (int32) Immediate16(READ);625ICPU._Carry = Int32 >= 0;626SetZN((uint16) Int32);627}628629static void OpC0Slow (void)630{631if (CheckIndex())632{633int16 Int16 = (int16) Registers.YL - (int16) Immediate8Slow(READ);634ICPU._Carry = Int16 >= 0;635SetZN((uint8) Int16);636}637else638{639int32 Int32 = (int32) Registers.Y.W - (int32) Immediate16Slow(READ);640ICPU._Carry = Int32 >= 0;641SetZN((uint16) Int32);642}643}644645rOP8 (C4X1, Direct, WRAP_BANK, CPY)646rOP16(C4X0, Direct, WRAP_BANK, CPY)647rOPX (C4Slow, DirectSlow, WRAP_BANK, CPY)648649rOP8 (CCX1, Absolute, WRAP_NONE, CPY)650rOP16(CCX0, Absolute, WRAP_NONE, CPY)651rOPX (CCSlow, AbsoluteSlow, WRAP_NONE, CPY)652653/* DEC ********************************************************************* */654655static void Op3AM1 (void)656{657AddCycles(ONE_CYCLE);658Registers.AL--;659SetZN(Registers.AL);660}661662static void Op3AM0 (void)663{664AddCycles(ONE_CYCLE);665Registers.A.W--;666SetZN(Registers.A.W);667}668669static void Op3ASlow (void)670{671AddCycles(ONE_CYCLE);672673if (CheckMemory())674{675Registers.AL--;676SetZN(Registers.AL);677}678else679{680Registers.A.W--;681SetZN(Registers.A.W);682}683}684685mOP8 (C6M1, Direct, WRAP_BANK, DEC)686mOP16(C6M0, Direct, WRAP_BANK, DEC)687mOPM (C6Slow, DirectSlow, WRAP_BANK, DEC)688689mOP8 (D6E1, DirectIndexedXE1, WRAP_BANK, DEC)690mOP8 (D6E0M1, DirectIndexedXE0, WRAP_BANK, DEC)691mOP16(D6E0M0, DirectIndexedXE0, WRAP_BANK, DEC)692mOPM (D6Slow, DirectIndexedXSlow, WRAP_BANK, DEC)693694mOP8 (CEM1, Absolute, WRAP_NONE, DEC)695mOP16(CEM0, Absolute, WRAP_NONE, DEC)696mOPM (CESlow, AbsoluteSlow, WRAP_NONE, DEC)697698mOP8 (DEM1X1, AbsoluteIndexedXX1, WRAP_NONE, DEC)699mOP16(DEM0X1, AbsoluteIndexedXX1, WRAP_NONE, DEC)700mOP8 (DEM1X0, AbsoluteIndexedXX0, WRAP_NONE, DEC)701mOP16(DEM0X0, AbsoluteIndexedXX0, WRAP_NONE, DEC)702mOPM (DESlow, AbsoluteIndexedXSlow, WRAP_NONE, DEC)703704/* EOR ********************************************************************* */705706static void Op49M1 (void)707{708Registers.AL ^= Immediate8(READ);709SetZN(Registers.AL);710}711712static void Op49M0 (void)713{714Registers.A.W ^= Immediate16(READ);715SetZN(Registers.A.W);716}717718static void Op49Slow (void)719{720if (CheckMemory())721{722Registers.AL ^= Immediate8Slow(READ);723SetZN(Registers.AL);724}725else726{727Registers.A.W ^= Immediate16Slow(READ);728SetZN(Registers.A.W);729}730}731732rOP8 (45M1, Direct, WRAP_BANK, EOR)733rOP16(45M0, Direct, WRAP_BANK, EOR)734rOPM (45Slow, DirectSlow, WRAP_BANK, EOR)735736rOP8 (55E1, DirectIndexedXE1, WRAP_BANK, EOR)737rOP8 (55E0M1, DirectIndexedXE0, WRAP_BANK, EOR)738rOP16(55E0M0, DirectIndexedXE0, WRAP_BANK, EOR)739rOPM (55Slow, DirectIndexedXSlow, WRAP_BANK, EOR)740741rOP8 (52E1, DirectIndirectE1, WRAP_NONE, EOR)742rOP8 (52E0M1, DirectIndirectE0, WRAP_NONE, EOR)743rOP16(52E0M0, DirectIndirectE0, WRAP_NONE, EOR)744rOPM (52Slow, DirectIndirectSlow, WRAP_NONE, EOR)745746rOP8 (41E1, DirectIndexedIndirectE1, WRAP_NONE, EOR)747rOP8 (41E0M1, DirectIndexedIndirectE0, WRAP_NONE, EOR)748rOP16(41E0M0, DirectIndexedIndirectE0, WRAP_NONE, EOR)749rOPM (41Slow, DirectIndexedIndirectSlow, WRAP_NONE, EOR)750751rOP8 (51E1, DirectIndirectIndexedE1, WRAP_NONE, EOR)752rOP8 (51E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, EOR)753rOP16(51E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, EOR)754rOP8 (51E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, EOR)755rOP16(51E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, EOR)756rOPM (51Slow, DirectIndirectIndexedSlow, WRAP_NONE, EOR)757758rOP8 (47M1, DirectIndirectLong, WRAP_NONE, EOR)759rOP16(47M0, DirectIndirectLong, WRAP_NONE, EOR)760rOPM (47Slow, DirectIndirectLongSlow, WRAP_NONE, EOR)761762rOP8 (57M1, DirectIndirectIndexedLong, WRAP_NONE, EOR)763rOP16(57M0, DirectIndirectIndexedLong, WRAP_NONE, EOR)764rOPM (57Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, EOR)765766rOP8 (4DM1, Absolute, WRAP_NONE, EOR)767rOP16(4DM0, Absolute, WRAP_NONE, EOR)768rOPM (4DSlow, AbsoluteSlow, WRAP_NONE, EOR)769770rOP8 (5DM1X1, AbsoluteIndexedXX1, WRAP_NONE, EOR)771rOP16(5DM0X1, AbsoluteIndexedXX1, WRAP_NONE, EOR)772rOP8 (5DM1X0, AbsoluteIndexedXX0, WRAP_NONE, EOR)773rOP16(5DM0X0, AbsoluteIndexedXX0, WRAP_NONE, EOR)774rOPM (5DSlow, AbsoluteIndexedXSlow, WRAP_NONE, EOR)775776rOP8 (59M1X1, AbsoluteIndexedYX1, WRAP_NONE, EOR)777rOP16(59M0X1, AbsoluteIndexedYX1, WRAP_NONE, EOR)778rOP8 (59M1X0, AbsoluteIndexedYX0, WRAP_NONE, EOR)779rOP16(59M0X0, AbsoluteIndexedYX0, WRAP_NONE, EOR)780rOPM (59Slow, AbsoluteIndexedYSlow, WRAP_NONE, EOR)781782rOP8 (4FM1, AbsoluteLong, WRAP_NONE, EOR)783rOP16(4FM0, AbsoluteLong, WRAP_NONE, EOR)784rOPM (4FSlow, AbsoluteLongSlow, WRAP_NONE, EOR)785786rOP8 (5FM1, AbsoluteLongIndexedX, WRAP_NONE, EOR)787rOP16(5FM0, AbsoluteLongIndexedX, WRAP_NONE, EOR)788rOPM (5FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, EOR)789790rOP8 (43M1, StackRelative, WRAP_NONE, EOR)791rOP16(43M0, StackRelative, WRAP_NONE, EOR)792rOPM (43Slow, StackRelativeSlow, WRAP_NONE, EOR)793794rOP8 (53M1, StackRelativeIndirectIndexed, WRAP_NONE, EOR)795rOP16(53M0, StackRelativeIndirectIndexed, WRAP_NONE, EOR)796rOPM (53Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, EOR)797798/* INC ********************************************************************* */799800static void Op1AM1 (void)801{802AddCycles(ONE_CYCLE);803Registers.AL++;804SetZN(Registers.AL);805}806807static void Op1AM0 (void)808{809AddCycles(ONE_CYCLE);810Registers.A.W++;811SetZN(Registers.A.W);812}813814static void Op1ASlow (void)815{816AddCycles(ONE_CYCLE);817818if (CheckMemory())819{820Registers.AL++;821SetZN(Registers.AL);822}823else824{825Registers.A.W++;826SetZN(Registers.A.W);827}828}829830mOP8 (E6M1, Direct, WRAP_BANK, INC)831mOP16(E6M0, Direct, WRAP_BANK, INC)832mOPM (E6Slow, DirectSlow, WRAP_BANK, INC)833834mOP8 (F6E1, DirectIndexedXE1, WRAP_BANK, INC)835mOP8 (F6E0M1, DirectIndexedXE0, WRAP_BANK, INC)836mOP16(F6E0M0, DirectIndexedXE0, WRAP_BANK, INC)837mOPM (F6Slow, DirectIndexedXSlow, WRAP_BANK, INC)838839mOP8 (EEM1, Absolute, WRAP_NONE, INC)840mOP16(EEM0, Absolute, WRAP_NONE, INC)841mOPM (EESlow, AbsoluteSlow, WRAP_NONE, INC)842843mOP8 (FEM1X1, AbsoluteIndexedXX1, WRAP_NONE, INC)844mOP16(FEM0X1, AbsoluteIndexedXX1, WRAP_NONE, INC)845mOP8 (FEM1X0, AbsoluteIndexedXX0, WRAP_NONE, INC)846mOP16(FEM0X0, AbsoluteIndexedXX0, WRAP_NONE, INC)847mOPM (FESlow, AbsoluteIndexedXSlow, WRAP_NONE, INC)848849/* LDA ********************************************************************* */850851static void OpA9M1 (void)852{853Registers.AL = Immediate8(READ);854SetZN(Registers.AL);855}856857static void OpA9M0 (void)858{859Registers.A.W = Immediate16(READ);860SetZN(Registers.A.W);861}862863static void OpA9Slow (void)864{865if (CheckMemory())866{867Registers.AL = Immediate8Slow(READ);868SetZN(Registers.AL);869}870else871{872Registers.A.W = Immediate16Slow(READ);873SetZN(Registers.A.W);874}875}876877rOP8 (A5M1, Direct, WRAP_BANK, LDA)878rOP16(A5M0, Direct, WRAP_BANK, LDA)879rOPM (A5Slow, DirectSlow, WRAP_BANK, LDA)880881rOP8 (B5E1, DirectIndexedXE1, WRAP_BANK, LDA)882rOP8 (B5E0M1, DirectIndexedXE0, WRAP_BANK, LDA)883rOP16(B5E0M0, DirectIndexedXE0, WRAP_BANK, LDA)884rOPM (B5Slow, DirectIndexedXSlow, WRAP_BANK, LDA)885886rOP8 (B2E1, DirectIndirectE1, WRAP_NONE, LDA)887rOP8 (B2E0M1, DirectIndirectE0, WRAP_NONE, LDA)888rOP16(B2E0M0, DirectIndirectE0, WRAP_NONE, LDA)889rOPM (B2Slow, DirectIndirectSlow, WRAP_NONE, LDA)890891rOP8 (A1E1, DirectIndexedIndirectE1, WRAP_NONE, LDA)892rOP8 (A1E0M1, DirectIndexedIndirectE0, WRAP_NONE, LDA)893rOP16(A1E0M0, DirectIndexedIndirectE0, WRAP_NONE, LDA)894rOPM (A1Slow, DirectIndexedIndirectSlow, WRAP_NONE, LDA)895896rOP8 (B1E1, DirectIndirectIndexedE1, WRAP_NONE, LDA)897rOP8 (B1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, LDA)898rOP16(B1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, LDA)899rOP8 (B1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, LDA)900rOP16(B1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, LDA)901rOPM (B1Slow, DirectIndirectIndexedSlow, WRAP_NONE, LDA)902903rOP8 (A7M1, DirectIndirectLong, WRAP_NONE, LDA)904rOP16(A7M0, DirectIndirectLong, WRAP_NONE, LDA)905rOPM (A7Slow, DirectIndirectLongSlow, WRAP_NONE, LDA)906907rOP8 (B7M1, DirectIndirectIndexedLong, WRAP_NONE, LDA)908rOP16(B7M0, DirectIndirectIndexedLong, WRAP_NONE, LDA)909rOPM (B7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, LDA)910911rOP8 (ADM1, Absolute, WRAP_NONE, LDA)912rOP16(ADM0, Absolute, WRAP_NONE, LDA)913rOPM (ADSlow, AbsoluteSlow, WRAP_NONE, LDA)914915rOP8 (BDM1X1, AbsoluteIndexedXX1, WRAP_NONE, LDA)916rOP16(BDM0X1, AbsoluteIndexedXX1, WRAP_NONE, LDA)917rOP8 (BDM1X0, AbsoluteIndexedXX0, WRAP_NONE, LDA)918rOP16(BDM0X0, AbsoluteIndexedXX0, WRAP_NONE, LDA)919rOPM (BDSlow, AbsoluteIndexedXSlow, WRAP_NONE, LDA)920921rOP8 (B9M1X1, AbsoluteIndexedYX1, WRAP_NONE, LDA)922rOP16(B9M0X1, AbsoluteIndexedYX1, WRAP_NONE, LDA)923rOP8 (B9M1X0, AbsoluteIndexedYX0, WRAP_NONE, LDA)924rOP16(B9M0X0, AbsoluteIndexedYX0, WRAP_NONE, LDA)925rOPM (B9Slow, AbsoluteIndexedYSlow, WRAP_NONE, LDA)926927rOP8 (AFM1, AbsoluteLong, WRAP_NONE, LDA)928rOP16(AFM0, AbsoluteLong, WRAP_NONE, LDA)929rOPM (AFSlow, AbsoluteLongSlow, WRAP_NONE, LDA)930931rOP8 (BFM1, AbsoluteLongIndexedX, WRAP_NONE, LDA)932rOP16(BFM0, AbsoluteLongIndexedX, WRAP_NONE, LDA)933rOPM (BFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, LDA)934935rOP8 (A3M1, StackRelative, WRAP_NONE, LDA)936rOP16(A3M0, StackRelative, WRAP_NONE, LDA)937rOPM (A3Slow, StackRelativeSlow, WRAP_NONE, LDA)938939rOP8 (B3M1, StackRelativeIndirectIndexed, WRAP_NONE, LDA)940rOP16(B3M0, StackRelativeIndirectIndexed, WRAP_NONE, LDA)941rOPM (B3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, LDA)942943/* LDX ********************************************************************* */944945static void OpA2X1 (void)946{947Registers.XL = Immediate8(READ);948SetZN(Registers.XL);949}950951static void OpA2X0 (void)952{953Registers.X.W = Immediate16(READ);954SetZN(Registers.X.W);955}956957static void OpA2Slow (void)958{959if (CheckIndex())960{961Registers.XL = Immediate8Slow(READ);962SetZN(Registers.XL);963}964else965{966Registers.X.W = Immediate16Slow(READ);967SetZN(Registers.X.W);968}969}970971rOP8 (A6X1, Direct, WRAP_BANK, LDX)972rOP16(A6X0, Direct, WRAP_BANK, LDX)973rOPX (A6Slow, DirectSlow, WRAP_BANK, LDX)974975rOP8 (B6E1, DirectIndexedYE1, WRAP_BANK, LDX)976rOP8 (B6E0X1, DirectIndexedYE0, WRAP_BANK, LDX)977rOP16(B6E0X0, DirectIndexedYE0, WRAP_BANK, LDX)978rOPX (B6Slow, DirectIndexedYSlow, WRAP_BANK, LDX)979980rOP8 (AEX1, Absolute, WRAP_BANK, LDX)981rOP16(AEX0, Absolute, WRAP_BANK, LDX)982rOPX (AESlow, AbsoluteSlow, WRAP_BANK, LDX)983984rOP8 (BEX1, AbsoluteIndexedYX1, WRAP_BANK, LDX)985rOP16(BEX0, AbsoluteIndexedYX0, WRAP_BANK, LDX)986rOPX (BESlow, AbsoluteIndexedYSlow, WRAP_BANK, LDX)987988/* LDY ********************************************************************* */989990static void OpA0X1 (void)991{992Registers.YL = Immediate8(READ);993SetZN(Registers.YL);994}995996static void OpA0X0 (void)997{998Registers.Y.W = Immediate16(READ);999SetZN(Registers.Y.W);1000}10011002static void OpA0Slow (void)1003{1004if (CheckIndex())1005{1006Registers.YL = Immediate8Slow(READ);1007SetZN(Registers.YL);1008}1009else1010{1011Registers.Y.W = Immediate16Slow(READ);1012SetZN(Registers.Y.W);1013}1014}10151016rOP8 (A4X1, Direct, WRAP_BANK, LDY)1017rOP16(A4X0, Direct, WRAP_BANK, LDY)1018rOPX (A4Slow, DirectSlow, WRAP_BANK, LDY)10191020rOP8 (B4E1, DirectIndexedXE1, WRAP_BANK, LDY)1021rOP8 (B4E0X1, DirectIndexedXE0, WRAP_BANK, LDY)1022rOP16(B4E0X0, DirectIndexedXE0, WRAP_BANK, LDY)1023rOPX (B4Slow, DirectIndexedXSlow, WRAP_BANK, LDY)10241025rOP8 (ACX1, Absolute, WRAP_BANK, LDY)1026rOP16(ACX0, Absolute, WRAP_BANK, LDY)1027rOPX (ACSlow, AbsoluteSlow, WRAP_BANK, LDY)10281029rOP8 (BCX1, AbsoluteIndexedXX1, WRAP_BANK, LDY)1030rOP16(BCX0, AbsoluteIndexedXX0, WRAP_BANK, LDY)1031rOPX (BCSlow, AbsoluteIndexedXSlow, WRAP_BANK, LDY)10321033/* LSR ********************************************************************* */10341035static void Op4AM1 (void)1036{1037AddCycles(ONE_CYCLE);1038ICPU._Carry = Registers.AL & 1;1039Registers.AL >>= 1;1040SetZN(Registers.AL);1041}10421043static void Op4AM0 (void)1044{1045AddCycles(ONE_CYCLE);1046ICPU._Carry = Registers.A.W & 1;1047Registers.A.W >>= 1;1048SetZN(Registers.A.W);1049}10501051static void Op4ASlow (void)1052{1053AddCycles(ONE_CYCLE);10541055if (CheckMemory())1056{1057ICPU._Carry = Registers.AL & 1;1058Registers.AL >>= 1;1059SetZN(Registers.AL);1060}1061else1062{1063ICPU._Carry = Registers.A.W & 1;1064Registers.A.W >>= 1;1065SetZN(Registers.A.W);1066}1067}10681069mOP8 (46M1, Direct, WRAP_BANK, LSR)1070mOP16(46M0, Direct, WRAP_BANK, LSR)1071mOPM (46Slow, DirectSlow, WRAP_BANK, LSR)10721073mOP8 (56E1, DirectIndexedXE1, WRAP_BANK, LSR)1074mOP8 (56E0M1, DirectIndexedXE0, WRAP_BANK, LSR)1075mOP16(56E0M0, DirectIndexedXE0, WRAP_BANK, LSR)1076mOPM (56Slow, DirectIndexedXSlow, WRAP_BANK, LSR)10771078mOP8 (4EM1, Absolute, WRAP_NONE, LSR)1079mOP16(4EM0, Absolute, WRAP_NONE, LSR)1080mOPM (4ESlow, AbsoluteSlow, WRAP_NONE, LSR)10811082mOP8 (5EM1X1, AbsoluteIndexedXX1, WRAP_NONE, LSR)1083mOP16(5EM0X1, AbsoluteIndexedXX1, WRAP_NONE, LSR)1084mOP8 (5EM1X0, AbsoluteIndexedXX0, WRAP_NONE, LSR)1085mOP16(5EM0X0, AbsoluteIndexedXX0, WRAP_NONE, LSR)1086mOPM (5ESlow, AbsoluteIndexedXSlow, WRAP_NONE, LSR)10871088/* ORA ********************************************************************* */10891090static void Op09M1 (void)1091{1092Registers.AL |= Immediate8(READ);1093SetZN(Registers.AL);1094}10951096static void Op09M0 (void)1097{1098Registers.A.W |= Immediate16(READ);1099SetZN(Registers.A.W);1100}11011102static void Op09Slow (void)1103{1104if (CheckMemory())1105{1106Registers.AL |= Immediate8Slow(READ);1107SetZN(Registers.AL);1108}1109else1110{1111Registers.A.W |= Immediate16Slow(READ);1112SetZN(Registers.A.W);1113}1114}11151116rOP8 (05M1, Direct, WRAP_BANK, ORA)1117rOP16(05M0, Direct, WRAP_BANK, ORA)1118rOPM (05Slow, DirectSlow, WRAP_BANK, ORA)11191120rOP8 (15E1, DirectIndexedXE1, WRAP_BANK, ORA)1121rOP8 (15E0M1, DirectIndexedXE0, WRAP_BANK, ORA)1122rOP16(15E0M0, DirectIndexedXE0, WRAP_BANK, ORA)1123rOPM (15Slow, DirectIndexedXSlow, WRAP_BANK, ORA)11241125rOP8 (12E1, DirectIndirectE1, WRAP_NONE, ORA)1126rOP8 (12E0M1, DirectIndirectE0, WRAP_NONE, ORA)1127rOP16(12E0M0, DirectIndirectE0, WRAP_NONE, ORA)1128rOPM (12Slow, DirectIndirectSlow, WRAP_NONE, ORA)11291130rOP8 (01E1, DirectIndexedIndirectE1, WRAP_NONE, ORA)1131rOP8 (01E0M1, DirectIndexedIndirectE0, WRAP_NONE, ORA)1132rOP16(01E0M0, DirectIndexedIndirectE0, WRAP_NONE, ORA)1133rOPM (01Slow, DirectIndexedIndirectSlow, WRAP_NONE, ORA)11341135rOP8 (11E1, DirectIndirectIndexedE1, WRAP_NONE, ORA)1136rOP8 (11E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, ORA)1137rOP16(11E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, ORA)1138rOP8 (11E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, ORA)1139rOP16(11E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, ORA)1140rOPM (11Slow, DirectIndirectIndexedSlow, WRAP_NONE, ORA)11411142rOP8 (07M1, DirectIndirectLong, WRAP_NONE, ORA)1143rOP16(07M0, DirectIndirectLong, WRAP_NONE, ORA)1144rOPM (07Slow, DirectIndirectLongSlow, WRAP_NONE, ORA)11451146rOP8 (17M1, DirectIndirectIndexedLong, WRAP_NONE, ORA)1147rOP16(17M0, DirectIndirectIndexedLong, WRAP_NONE, ORA)1148rOPM (17Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, ORA)11491150rOP8 (0DM1, Absolute, WRAP_NONE, ORA)1151rOP16(0DM0, Absolute, WRAP_NONE, ORA)1152rOPM (0DSlow, AbsoluteSlow, WRAP_NONE, ORA)11531154rOP8 (1DM1X1, AbsoluteIndexedXX1, WRAP_NONE, ORA)1155rOP16(1DM0X1, AbsoluteIndexedXX1, WRAP_NONE, ORA)1156rOP8 (1DM1X0, AbsoluteIndexedXX0, WRAP_NONE, ORA)1157rOP16(1DM0X0, AbsoluteIndexedXX0, WRAP_NONE, ORA)1158rOPM (1DSlow, AbsoluteIndexedXSlow, WRAP_NONE, ORA)11591160rOP8 (19M1X1, AbsoluteIndexedYX1, WRAP_NONE, ORA)1161rOP16(19M0X1, AbsoluteIndexedYX1, WRAP_NONE, ORA)1162rOP8 (19M1X0, AbsoluteIndexedYX0, WRAP_NONE, ORA)1163rOP16(19M0X0, AbsoluteIndexedYX0, WRAP_NONE, ORA)1164rOPM (19Slow, AbsoluteIndexedYSlow, WRAP_NONE, ORA)11651166rOP8 (0FM1, AbsoluteLong, WRAP_NONE, ORA)1167rOP16(0FM0, AbsoluteLong, WRAP_NONE, ORA)1168rOPM (0FSlow, AbsoluteLongSlow, WRAP_NONE, ORA)11691170rOP8 (1FM1, AbsoluteLongIndexedX, WRAP_NONE, ORA)1171rOP16(1FM0, AbsoluteLongIndexedX, WRAP_NONE, ORA)1172rOPM (1FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, ORA)11731174rOP8 (03M1, StackRelative, WRAP_NONE, ORA)1175rOP16(03M0, StackRelative, WRAP_NONE, ORA)1176rOPM (03Slow, StackRelativeSlow, WRAP_NONE, ORA)11771178rOP8 (13M1, StackRelativeIndirectIndexed, WRAP_NONE, ORA)1179rOP16(13M0, StackRelativeIndirectIndexed, WRAP_NONE, ORA)1180rOPM (13Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, ORA)11811182/* ROL ********************************************************************* */11831184static void Op2AM1 (void)1185{1186AddCycles(ONE_CYCLE);1187uint16 w = (((uint16) Registers.AL) << 1) | CheckCarry();1188ICPU._Carry = w >= 0x100;1189Registers.AL = (uint8) w;1190SetZN(Registers.AL);1191}11921193static void Op2AM0 (void)1194{1195AddCycles(ONE_CYCLE);1196uint32 w = (((uint32) Registers.A.W) << 1) | CheckCarry();1197ICPU._Carry = w >= 0x10000;1198Registers.A.W = (uint16) w;1199SetZN(Registers.A.W);1200}12011202static void Op2ASlow (void)1203{1204AddCycles(ONE_CYCLE);12051206if (CheckMemory())1207{1208uint16 w = (((uint16) Registers.AL) << 1) | CheckCarry();1209ICPU._Carry = w >= 0x100;1210Registers.AL = (uint8) w;1211SetZN(Registers.AL);1212}1213else1214{1215uint32 w = (((uint32) Registers.A.W) << 1) | CheckCarry();1216ICPU._Carry = w >= 0x10000;1217Registers.A.W = (uint16) w;1218SetZN(Registers.A.W);1219}1220}12211222mOP8 (26M1, Direct, WRAP_BANK, ROL)1223mOP16(26M0, Direct, WRAP_BANK, ROL)1224mOPM (26Slow, DirectSlow, WRAP_BANK, ROL)12251226mOP8 (36E1, DirectIndexedXE1, WRAP_BANK, ROL)1227mOP8 (36E0M1, DirectIndexedXE0, WRAP_BANK, ROL)1228mOP16(36E0M0, DirectIndexedXE0, WRAP_BANK, ROL)1229mOPM (36Slow, DirectIndexedXSlow, WRAP_BANK, ROL)12301231mOP8 (2EM1, Absolute, WRAP_NONE, ROL)1232mOP16(2EM0, Absolute, WRAP_NONE, ROL)1233mOPM (2ESlow, AbsoluteSlow, WRAP_NONE, ROL)12341235mOP8 (3EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ROL)1236mOP16(3EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ROL)1237mOP8 (3EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ROL)1238mOP16(3EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ROL)1239mOPM (3ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ROL)12401241/* ROR ********************************************************************* */12421243static void Op6AM1 (void)1244{1245AddCycles(ONE_CYCLE);1246uint16 w = ((uint16) Registers.AL) | (((uint16) CheckCarry()) << 8);1247ICPU._Carry = w & 1;1248w >>= 1;1249Registers.AL = (uint8) w;1250SetZN(Registers.AL);1251}12521253static void Op6AM0 (void)1254{1255AddCycles(ONE_CYCLE);1256uint32 w = ((uint32) Registers.A.W) | (((uint32) CheckCarry()) << 16);1257ICPU._Carry = w & 1;1258w >>= 1;1259Registers.A.W = (uint16) w;1260SetZN(Registers.A.W);1261}12621263static void Op6ASlow (void)1264{1265AddCycles(ONE_CYCLE);12661267if (CheckMemory())1268{1269uint16 w = ((uint16) Registers.AL) | (((uint16) CheckCarry()) << 8);1270ICPU._Carry = w & 1;1271w >>= 1;1272Registers.AL = (uint8) w;1273SetZN(Registers.AL);1274}1275else1276{1277uint32 w = ((uint32) Registers.A.W) | (((uint32) CheckCarry()) << 16);1278ICPU._Carry = w & 1;1279w >>= 1;1280Registers.A.W = (uint16) w;1281SetZN(Registers.A.W);1282}1283}12841285mOP8 (66M1, Direct, WRAP_BANK, ROR)1286mOP16(66M0, Direct, WRAP_BANK, ROR)1287mOPM (66Slow, DirectSlow, WRAP_BANK, ROR)12881289mOP8 (76E1, DirectIndexedXE1, WRAP_BANK, ROR)1290mOP8 (76E0M1, DirectIndexedXE0, WRAP_BANK, ROR)1291mOP16(76E0M0, DirectIndexedXE0, WRAP_BANK, ROR)1292mOPM (76Slow, DirectIndexedXSlow, WRAP_BANK, ROR)12931294mOP8 (6EM1, Absolute, WRAP_NONE, ROR)1295mOP16(6EM0, Absolute, WRAP_NONE, ROR)1296mOPM (6ESlow, AbsoluteSlow, WRAP_NONE, ROR)12971298mOP8 (7EM1X1, AbsoluteIndexedXX1, WRAP_NONE, ROR)1299mOP16(7EM0X1, AbsoluteIndexedXX1, WRAP_NONE, ROR)1300mOP8 (7EM1X0, AbsoluteIndexedXX0, WRAP_NONE, ROR)1301mOP16(7EM0X0, AbsoluteIndexedXX0, WRAP_NONE, ROR)1302mOPM (7ESlow, AbsoluteIndexedXSlow, WRAP_NONE, ROR)13031304/* SBC ********************************************************************* */13051306static void OpE9M1 (void)1307{1308SBC(Immediate8(READ));1309}13101311static void OpE9M0 (void)1312{1313SBC(Immediate16(READ));1314}13151316static void OpE9Slow (void)1317{1318if (CheckMemory())1319SBC(Immediate8Slow(READ));1320else1321SBC(Immediate16Slow(READ));1322}13231324rOP8 (E5M1, Direct, WRAP_BANK, SBC)1325rOP16(E5M0, Direct, WRAP_BANK, SBC)1326rOPM (E5Slow, DirectSlow, WRAP_BANK, SBC)13271328rOP8 (F5E1, DirectIndexedXE1, WRAP_BANK, SBC)1329rOP8 (F5E0M1, DirectIndexedXE0, WRAP_BANK, SBC)1330rOP16(F5E0M0, DirectIndexedXE0, WRAP_BANK, SBC)1331rOPM (F5Slow, DirectIndexedXSlow, WRAP_BANK, SBC)13321333rOP8 (F2E1, DirectIndirectE1, WRAP_NONE, SBC)1334rOP8 (F2E0M1, DirectIndirectE0, WRAP_NONE, SBC)1335rOP16(F2E0M0, DirectIndirectE0, WRAP_NONE, SBC)1336rOPM (F2Slow, DirectIndirectSlow, WRAP_NONE, SBC)13371338rOP8 (E1E1, DirectIndexedIndirectE1, WRAP_NONE, SBC)1339rOP8 (E1E0M1, DirectIndexedIndirectE0, WRAP_NONE, SBC)1340rOP16(E1E0M0, DirectIndexedIndirectE0, WRAP_NONE, SBC)1341rOPM (E1Slow, DirectIndexedIndirectSlow, WRAP_NONE, SBC)13421343rOP8 (F1E1, DirectIndirectIndexedE1, WRAP_NONE, SBC)1344rOP8 (F1E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, SBC)1345rOP16(F1E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, SBC)1346rOP8 (F1E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, SBC)1347rOP16(F1E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, SBC)1348rOPM (F1Slow, DirectIndirectIndexedSlow, WRAP_NONE, SBC)13491350rOP8 (E7M1, DirectIndirectLong, WRAP_NONE, SBC)1351rOP16(E7M0, DirectIndirectLong, WRAP_NONE, SBC)1352rOPM (E7Slow, DirectIndirectLongSlow, WRAP_NONE, SBC)13531354rOP8 (F7M1, DirectIndirectIndexedLong, WRAP_NONE, SBC)1355rOP16(F7M0, DirectIndirectIndexedLong, WRAP_NONE, SBC)1356rOPM (F7Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, SBC)13571358rOP8 (EDM1, Absolute, WRAP_NONE, SBC)1359rOP16(EDM0, Absolute, WRAP_NONE, SBC)1360rOPM (EDSlow, AbsoluteSlow, WRAP_NONE, SBC)13611362rOP8 (FDM1X1, AbsoluteIndexedXX1, WRAP_NONE, SBC)1363rOP16(FDM0X1, AbsoluteIndexedXX1, WRAP_NONE, SBC)1364rOP8 (FDM1X0, AbsoluteIndexedXX0, WRAP_NONE, SBC)1365rOP16(FDM0X0, AbsoluteIndexedXX0, WRAP_NONE, SBC)1366rOPM (FDSlow, AbsoluteIndexedXSlow, WRAP_NONE, SBC)13671368rOP8 (F9M1X1, AbsoluteIndexedYX1, WRAP_NONE, SBC)1369rOP16(F9M0X1, AbsoluteIndexedYX1, WRAP_NONE, SBC)1370rOP8 (F9M1X0, AbsoluteIndexedYX0, WRAP_NONE, SBC)1371rOP16(F9M0X0, AbsoluteIndexedYX0, WRAP_NONE, SBC)1372rOPM (F9Slow, AbsoluteIndexedYSlow, WRAP_NONE, SBC)13731374rOP8 (EFM1, AbsoluteLong, WRAP_NONE, SBC)1375rOP16(EFM0, AbsoluteLong, WRAP_NONE, SBC)1376rOPM (EFSlow, AbsoluteLongSlow, WRAP_NONE, SBC)13771378rOP8 (FFM1, AbsoluteLongIndexedX, WRAP_NONE, SBC)1379rOP16(FFM0, AbsoluteLongIndexedX, WRAP_NONE, SBC)1380rOPM (FFSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, SBC)13811382rOP8 (E3M1, StackRelative, WRAP_NONE, SBC)1383rOP16(E3M0, StackRelative, WRAP_NONE, SBC)1384rOPM (E3Slow, StackRelativeSlow, WRAP_NONE, SBC)13851386rOP8 (F3M1, StackRelativeIndirectIndexed, WRAP_NONE, SBC)1387rOP16(F3M0, StackRelativeIndirectIndexed, WRAP_NONE, SBC)1388rOPM (F3Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, SBC)13891390/* STA ********************************************************************* */13911392wOP8 (85M1, Direct, WRAP_BANK, STA)1393wOP16(85M0, Direct, WRAP_BANK, STA)1394wOPM (85Slow, DirectSlow, WRAP_BANK, STA)13951396wOP8 (95E1, DirectIndexedXE1, WRAP_BANK, STA)1397wOP8 (95E0M1, DirectIndexedXE0, WRAP_BANK, STA)1398wOP16(95E0M0, DirectIndexedXE0, WRAP_BANK, STA)1399wOPM (95Slow, DirectIndexedXSlow, WRAP_BANK, STA)14001401wOP8 (92E1, DirectIndirectE1, WRAP_NONE, STA)1402wOP8 (92E0M1, DirectIndirectE0, WRAP_NONE, STA)1403wOP16(92E0M0, DirectIndirectE0, WRAP_NONE, STA)1404wOPM (92Slow, DirectIndirectSlow, WRAP_NONE, STA)14051406wOP8 (81E1, DirectIndexedIndirectE1, WRAP_NONE, STA)1407wOP8 (81E0M1, DirectIndexedIndirectE0, WRAP_NONE, STA)1408wOP16(81E0M0, DirectIndexedIndirectE0, WRAP_NONE, STA)1409wOPM (81Slow, DirectIndexedIndirectSlow, WRAP_NONE, STA)14101411wOP8 (91E1, DirectIndirectIndexedE1, WRAP_NONE, STA)1412wOP8 (91E0M1X1, DirectIndirectIndexedE0X1, WRAP_NONE, STA)1413wOP16(91E0M0X1, DirectIndirectIndexedE0X1, WRAP_NONE, STA)1414wOP8 (91E0M1X0, DirectIndirectIndexedE0X0, WRAP_NONE, STA)1415wOP16(91E0M0X0, DirectIndirectIndexedE0X0, WRAP_NONE, STA)1416wOPM (91Slow, DirectIndirectIndexedSlow, WRAP_NONE, STA)14171418wOP8 (87M1, DirectIndirectLong, WRAP_NONE, STA)1419wOP16(87M0, DirectIndirectLong, WRAP_NONE, STA)1420wOPM (87Slow, DirectIndirectLongSlow, WRAP_NONE, STA)14211422wOP8 (97M1, DirectIndirectIndexedLong, WRAP_NONE, STA)1423wOP16(97M0, DirectIndirectIndexedLong, WRAP_NONE, STA)1424wOPM (97Slow, DirectIndirectIndexedLongSlow, WRAP_NONE, STA)14251426wOP8 (8DM1, Absolute, WRAP_NONE, STA)1427wOP16(8DM0, Absolute, WRAP_NONE, STA)1428wOPM (8DSlow, AbsoluteSlow, WRAP_NONE, STA)14291430wOP8 (9DM1X1, AbsoluteIndexedXX1, WRAP_NONE, STA)1431wOP16(9DM0X1, AbsoluteIndexedXX1, WRAP_NONE, STA)1432wOP8 (9DM1X0, AbsoluteIndexedXX0, WRAP_NONE, STA)1433wOP16(9DM0X0, AbsoluteIndexedXX0, WRAP_NONE, STA)1434wOPM (9DSlow, AbsoluteIndexedXSlow, WRAP_NONE, STA)14351436wOP8 (99M1X1, AbsoluteIndexedYX1, WRAP_NONE, STA)1437wOP16(99M0X1, AbsoluteIndexedYX1, WRAP_NONE, STA)1438wOP8 (99M1X0, AbsoluteIndexedYX0, WRAP_NONE, STA)1439wOP16(99M0X0, AbsoluteIndexedYX0, WRAP_NONE, STA)1440wOPM (99Slow, AbsoluteIndexedYSlow, WRAP_NONE, STA)14411442wOP8 (8FM1, AbsoluteLong, WRAP_NONE, STA)1443wOP16(8FM0, AbsoluteLong, WRAP_NONE, STA)1444wOPM (8FSlow, AbsoluteLongSlow, WRAP_NONE, STA)14451446wOP8 (9FM1, AbsoluteLongIndexedX, WRAP_NONE, STA)1447wOP16(9FM0, AbsoluteLongIndexedX, WRAP_NONE, STA)1448wOPM (9FSlow, AbsoluteLongIndexedXSlow, WRAP_NONE, STA)14491450wOP8 (83M1, StackRelative, WRAP_NONE, STA)1451wOP16(83M0, StackRelative, WRAP_NONE, STA)1452wOPM (83Slow, StackRelativeSlow, WRAP_NONE, STA)14531454wOP8 (93M1, StackRelativeIndirectIndexed, WRAP_NONE, STA)1455wOP16(93M0, StackRelativeIndirectIndexed, WRAP_NONE, STA)1456wOPM (93Slow, StackRelativeIndirectIndexedSlow, WRAP_NONE, STA)14571458/* STX ********************************************************************* */14591460wOP8 (86X1, Direct, WRAP_BANK, STX)1461wOP16(86X0, Direct, WRAP_BANK, STX)1462wOPX (86Slow, DirectSlow, WRAP_BANK, STX)14631464wOP8 (96E1, DirectIndexedYE1, WRAP_BANK, STX)1465wOP8 (96E0X1, DirectIndexedYE0, WRAP_BANK, STX)1466wOP16(96E0X0, DirectIndexedYE0, WRAP_BANK, STX)1467wOPX (96Slow, DirectIndexedYSlow, WRAP_BANK, STX)14681469wOP8 (8EX1, Absolute, WRAP_BANK, STX)1470wOP16(8EX0, Absolute, WRAP_BANK, STX)1471wOPX (8ESlow, AbsoluteSlow, WRAP_BANK, STX)14721473/* STY ********************************************************************* */14741475wOP8 (84X1, Direct, WRAP_BANK, STY)1476wOP16(84X0, Direct, WRAP_BANK, STY)1477wOPX (84Slow, DirectSlow, WRAP_BANK, STY)14781479wOP8 (94E1, DirectIndexedXE1, WRAP_BANK, STY)1480wOP8 (94E0X1, DirectIndexedXE0, WRAP_BANK, STY)1481wOP16(94E0X0, DirectIndexedXE0, WRAP_BANK, STY)1482wOPX (94Slow, DirectIndexedXSlow, WRAP_BANK, STY)14831484wOP8 (8CX1, Absolute, WRAP_BANK, STY)1485wOP16(8CX0, Absolute, WRAP_BANK, STY)1486wOPX (8CSlow, AbsoluteSlow, WRAP_BANK, STY)14871488/* STZ ********************************************************************* */14891490wOP8 (64M1, Direct, WRAP_BANK, STZ)1491wOP16(64M0, Direct, WRAP_BANK, STZ)1492wOPM (64Slow, DirectSlow, WRAP_BANK, STZ)14931494wOP8 (74E1, DirectIndexedXE1, WRAP_BANK, STZ)1495wOP8 (74E0M1, DirectIndexedXE0, WRAP_BANK, STZ)1496wOP16(74E0M0, DirectIndexedXE0, WRAP_BANK, STZ)1497wOPM (74Slow, DirectIndexedXSlow, WRAP_BANK, STZ)14981499wOP8 (9CM1, Absolute, WRAP_NONE, STZ)1500wOP16(9CM0, Absolute, WRAP_NONE, STZ)1501wOPM (9CSlow, AbsoluteSlow, WRAP_NONE, STZ)15021503wOP8 (9EM1X1, AbsoluteIndexedXX1, WRAP_NONE, STZ)1504wOP16(9EM0X1, AbsoluteIndexedXX1, WRAP_NONE, STZ)1505wOP8 (9EM1X0, AbsoluteIndexedXX0, WRAP_NONE, STZ)1506wOP16(9EM0X0, AbsoluteIndexedXX0, WRAP_NONE, STZ)1507wOPM (9ESlow, AbsoluteIndexedXSlow, WRAP_NONE, STZ)15081509/* TRB ********************************************************************* */15101511mOP8 (14M1, Direct, WRAP_BANK, TRB)1512mOP16(14M0, Direct, WRAP_BANK, TRB)1513mOPM (14Slow, DirectSlow, WRAP_BANK, TRB)15141515mOP8 (1CM1, Absolute, WRAP_BANK, TRB)1516mOP16(1CM0, Absolute, WRAP_BANK, TRB)1517mOPM (1CSlow, AbsoluteSlow, WRAP_BANK, TRB)15181519/* TSB ********************************************************************* */15201521mOP8 (04M1, Direct, WRAP_BANK, TSB)1522mOP16(04M0, Direct, WRAP_BANK, TSB)1523mOPM (04Slow, DirectSlow, WRAP_BANK, TSB)15241525mOP8 (0CM1, Absolute, WRAP_BANK, TSB)1526mOP16(0CM0, Absolute, WRAP_BANK, TSB)1527mOPM (0CSlow, AbsoluteSlow, WRAP_BANK, TSB)15281529/* Branch Instructions ***************************************************** */15301531// BCC1532bOP(90E0, Relative, !CheckCarry(), 0, 0)1533bOP(90E1, Relative, !CheckCarry(), 0, 1)1534bOP(90Slow, RelativeSlow, !CheckCarry(), 0, CheckEmulation())15351536// BCS1537bOP(B0E0, Relative, CheckCarry(), 0, 0)1538bOP(B0E1, Relative, CheckCarry(), 0, 1)1539bOP(B0Slow, RelativeSlow, CheckCarry(), 0, CheckEmulation())15401541// BEQ1542bOP(F0E0, Relative, CheckZero(), 2, 0)1543bOP(F0E1, Relative, CheckZero(), 2, 1)1544bOP(F0Slow, RelativeSlow, CheckZero(), 2, CheckEmulation())15451546// BMI1547bOP(30E0, Relative, CheckNegative(), 1, 0)1548bOP(30E1, Relative, CheckNegative(), 1, 1)1549bOP(30Slow, RelativeSlow, CheckNegative(), 1, CheckEmulation())15501551// BNE1552bOP(D0E0, Relative, !CheckZero(), 1, 0)1553bOP(D0E1, Relative, !CheckZero(), 1, 1)1554bOP(D0Slow, RelativeSlow, !CheckZero(), 1, CheckEmulation())15551556// BPL1557bOP(10E0, Relative, !CheckNegative(), 1, 0)1558bOP(10E1, Relative, !CheckNegative(), 1, 1)1559bOP(10Slow, RelativeSlow, !CheckNegative(), 1, CheckEmulation())15601561// BRA1562bOP(80E0, Relative, 1, X, 0)1563bOP(80E1, Relative, 1, X, 1)1564bOP(80Slow, RelativeSlow, 1, X, CheckEmulation())15651566// BVC1567bOP(50E0, Relative, !CheckOverflow(), 0, 0)1568bOP(50E1, Relative, !CheckOverflow(), 0, 1)1569bOP(50Slow, RelativeSlow, !CheckOverflow(), 0, CheckEmulation())15701571// BVS1572bOP(70E0, Relative, CheckOverflow(), 0, 0)1573bOP(70E1, Relative, CheckOverflow(), 0, 1)1574bOP(70Slow, RelativeSlow, CheckOverflow(), 0, CheckEmulation())15751576// BRL1577static void Op82 (void)1578{1579S9xSetPCBase(ICPU.ShiftedPB + RelativeLong(JUMP));1580}15811582static void Op82Slow (void)1583{1584S9xSetPCBase(ICPU.ShiftedPB + RelativeLongSlow(JUMP));1585}15861587/* Flag Instructions ******************************************************* */15881589// CLC1590static void Op18 (void)1591{1592ClearCarry();1593AddCycles(ONE_CYCLE);1594}15951596// SEC1597static void Op38 (void)1598{1599SetCarry();1600AddCycles(ONE_CYCLE);1601}16021603// CLD1604static void OpD8 (void)1605{1606ClearDecimal();1607AddCycles(ONE_CYCLE);1608}16091610// SED1611static void OpF8 (void)1612{1613SetDecimal();1614AddCycles(ONE_CYCLE);1615#ifdef DEBUGGER1616missing.decimal_mode = 1;1617#endif1618}16191620// CLI1621static void Op58 (void)1622{1623ClearIRQ();1624AddCycles(ONE_CYCLE);1625CHECK_FOR_IRQ();1626}16271628// SEI1629static void Op78 (void)1630{1631SetIRQ();1632AddCycles(ONE_CYCLE);1633}16341635// CLV1636static void OpB8 (void)1637{1638ClearOverflow();1639AddCycles(ONE_CYCLE);1640}16411642/* DEX/DEY ***************************************************************** */16431644static void OpCAX1 (void)1645{1646AddCycles(ONE_CYCLE);1647Registers.XL--;1648SetZN(Registers.XL);1649}16501651static void OpCAX0 (void)1652{1653AddCycles(ONE_CYCLE);1654Registers.X.W--;1655SetZN(Registers.X.W);1656}16571658static void OpCASlow (void)1659{1660AddCycles(ONE_CYCLE);16611662if (CheckIndex())1663{1664Registers.XL--;1665SetZN(Registers.XL);1666}1667else1668{1669Registers.X.W--;1670SetZN(Registers.X.W);1671}1672}16731674static void Op88X1 (void)1675{1676AddCycles(ONE_CYCLE);1677Registers.YL--;1678SetZN(Registers.YL);1679}16801681static void Op88X0 (void)1682{1683AddCycles(ONE_CYCLE);1684Registers.Y.W--;1685SetZN(Registers.Y.W);1686}16871688static void Op88Slow (void)1689{1690AddCycles(ONE_CYCLE);16911692if (CheckIndex())1693{1694Registers.YL--;1695SetZN(Registers.YL);1696}1697else1698{1699Registers.Y.W--;1700SetZN(Registers.Y.W);1701}1702}17031704/* INX/INY ***************************************************************** */17051706static void OpE8X1 (void)1707{1708AddCycles(ONE_CYCLE);1709Registers.XL++;1710SetZN(Registers.XL);1711}17121713static void OpE8X0 (void)1714{1715AddCycles(ONE_CYCLE);1716Registers.X.W++;1717SetZN(Registers.X.W);1718}17191720static void OpE8Slow (void)1721{1722AddCycles(ONE_CYCLE);17231724if (CheckIndex())1725{1726Registers.XL++;1727SetZN(Registers.XL);1728}1729else1730{1731Registers.X.W++;1732SetZN(Registers.X.W);1733}1734}17351736static void OpC8X1 (void)1737{1738AddCycles(ONE_CYCLE);1739Registers.YL++;1740SetZN(Registers.YL);1741}17421743static void OpC8X0 (void)1744{1745AddCycles(ONE_CYCLE);1746Registers.Y.W++;1747SetZN(Registers.Y.W);1748}17491750static void OpC8Slow (void)1751{1752AddCycles(ONE_CYCLE);17531754if (CheckIndex())1755{1756Registers.YL--;1757SetZN(Registers.YL);1758}1759else1760{1761Registers.Y.W--;1762SetZN(Registers.Y.W);1763}1764}17651766/* NOP ********************************************************************* */17671768static void OpEA (void)1769{1770AddCycles(ONE_CYCLE);1771}17721773/* PUSH Instructions ******************************************************* */17741775#define PushW(w) \1776S9xSetWord(w, Registers.S.W - 1, WRAP_BANK, WRITE_10); \1777Registers.S.W -= 2;17781779#define PushWE(w) \1780Registers.SL--; \1781S9xSetWord(w, Registers.S.W, WRAP_PAGE, WRITE_10); \1782Registers.SL--;17831784#define PushB(b) \1785S9xSetByte(b, Registers.S.W--);17861787#define PushBE(b) \1788S9xSetByte(b, Registers.S.W); \1789Registers.SL--;17901791// PEA1792static void OpF4E0 (void)1793{1794uint16 val = (uint16) Absolute(NONE);1795PushW(val);1796OpenBus = val & 0xff;1797}17981799static void OpF4E1 (void)1800{1801// Note: PEA is a new instruction,1802// and so doesn't respect the emu-mode stack bounds.1803uint16 val = (uint16) Absolute(NONE);1804PushW(val);1805OpenBus = val & 0xff;1806Registers.SH = 1;1807}18081809static void OpF4Slow (void)1810{1811uint16 val = (uint16) AbsoluteSlow(NONE);1812PushW(val);1813OpenBus = val & 0xff;1814if (CheckEmulation())1815Registers.SH = 1;1816}18171818// PEI1819static void OpD4E0 (void)1820{1821uint16 val = (uint16) DirectIndirectE0(NONE);1822PushW(val);1823OpenBus = val & 0xff;1824}18251826static void OpD4E1 (void)1827{1828// Note: PEI is a new instruction,1829// and so doesn't respect the emu-mode stack bounds.1830uint16 val = (uint16) DirectIndirectE1(NONE);1831PushW(val);1832OpenBus = val & 0xff;1833Registers.SH = 1;1834}18351836static void OpD4Slow (void)1837{1838uint16 val = (uint16) DirectIndirectSlow(NONE);1839PushW(val);1840OpenBus = val & 0xff;1841if (CheckEmulation())1842Registers.SH = 1;1843}18441845// PER1846static void Op62E0 (void)1847{1848uint16 val = (uint16) RelativeLong(NONE);1849PushW(val);1850OpenBus = val & 0xff;1851}18521853static void Op62E1 (void)1854{1855// Note: PER is a new instruction,1856// and so doesn't respect the emu-mode stack bounds.1857uint16 val = (uint16) RelativeLong(NONE);1858PushW(val);1859OpenBus = val & 0xff;1860Registers.SH = 1;1861}18621863static void Op62Slow (void)1864{1865uint16 val = (uint16) RelativeLongSlow(NONE);1866PushW(val);1867OpenBus = val & 0xff;1868if (CheckEmulation())1869Registers.SH = 1;1870}18711872// PHA1873static void Op48E1 (void)1874{1875AddCycles(ONE_CYCLE);1876PushBE(Registers.AL);1877OpenBus = Registers.AL;1878}18791880static void Op48E0M1 (void)1881{1882AddCycles(ONE_CYCLE);1883PushB(Registers.AL);1884OpenBus = Registers.AL;1885}18861887static void Op48E0M0 (void)1888{1889AddCycles(ONE_CYCLE);1890PushW(Registers.A.W);1891OpenBus = Registers.AL;1892}18931894static void Op48Slow (void)1895{1896AddCycles(ONE_CYCLE);18971898if (CheckEmulation())1899{1900PushBE(Registers.AL);1901}1902else1903if (CheckMemory())1904{1905PushB(Registers.AL);1906}1907else1908{1909PushW(Registers.A.W);1910}19111912OpenBus = Registers.AL;1913}19141915// PHB1916static void Op8BE1 (void)1917{1918AddCycles(ONE_CYCLE);1919PushBE(Registers.DB);1920OpenBus = Registers.DB;1921}19221923static void Op8BE0 (void)1924{1925AddCycles(ONE_CYCLE);1926PushB(Registers.DB);1927OpenBus = Registers.DB;1928}19291930static void Op8BSlow (void)1931{1932AddCycles(ONE_CYCLE);19331934if (CheckEmulation())1935{1936PushBE(Registers.DB);1937}1938else1939{1940PushB(Registers.DB);1941}19421943OpenBus = Registers.DB;1944}19451946// PHD1947static void Op0BE0 (void)1948{1949AddCycles(ONE_CYCLE);1950PushW(Registers.D.W);1951OpenBus = Registers.DL;1952}19531954static void Op0BE1 (void)1955{1956// Note: PHD is a new instruction,1957// and so doesn't respect the emu-mode stack bounds.1958AddCycles(ONE_CYCLE);1959PushW(Registers.D.W);1960OpenBus = Registers.DL;1961Registers.SH = 1;1962}19631964static void Op0BSlow (void)1965{1966AddCycles(ONE_CYCLE);1967PushW(Registers.D.W);1968OpenBus = Registers.DL;1969if (CheckEmulation())1970Registers.SH = 1;1971}19721973// PHK1974static void Op4BE1 (void)1975{1976AddCycles(ONE_CYCLE);1977PushBE(Registers.PB);1978OpenBus = Registers.PB;1979}19801981static void Op4BE0 (void)1982{1983AddCycles(ONE_CYCLE);1984PushB(Registers.PB);1985OpenBus = Registers.PB;1986}19871988static void Op4BSlow (void)1989{1990AddCycles(ONE_CYCLE);19911992if (CheckEmulation())1993{1994PushBE(Registers.PB);1995}1996else1997{1998PushB(Registers.PB);1999}20002001OpenBus = Registers.PB;2002}20032004// PHP2005static void Op08E0 (void)2006{2007S9xPackStatus();2008AddCycles(ONE_CYCLE);2009PushB(Registers.PL);2010OpenBus = Registers.PL;2011}20122013static void Op08E1 (void)2014{2015S9xPackStatus();2016AddCycles(ONE_CYCLE);2017PushBE(Registers.PL);2018OpenBus = Registers.PL;2019}20202021static void Op08Slow (void)2022{2023S9xPackStatus();2024AddCycles(ONE_CYCLE);20252026if (CheckEmulation())2027{2028PushBE(Registers.PL);2029}2030else2031{2032PushB(Registers.PL);2033}20342035OpenBus = Registers.PL;2036}20372038// PHX2039static void OpDAE1 (void)2040{2041AddCycles(ONE_CYCLE);2042PushBE(Registers.XL);2043OpenBus = Registers.XL;2044}20452046static void OpDAE0X1 (void)2047{2048AddCycles(ONE_CYCLE);2049PushB(Registers.XL);2050OpenBus = Registers.XL;2051}20522053static void OpDAE0X0 (void)2054{2055AddCycles(ONE_CYCLE);2056PushW(Registers.X.W);2057OpenBus = Registers.XL;2058}20592060static void OpDASlow (void)2061{2062AddCycles(ONE_CYCLE);20632064if (CheckEmulation())2065{2066PushBE(Registers.XL);2067}2068else2069if (CheckIndex())2070{2071PushB(Registers.XL);2072}2073else2074{2075PushW(Registers.X.W);2076}20772078OpenBus = Registers.XL;2079}20802081// PHY2082static void Op5AE1 (void)2083{2084AddCycles(ONE_CYCLE);2085PushBE(Registers.YL);2086OpenBus = Registers.YL;2087}20882089static void Op5AE0X1 (void)2090{2091AddCycles(ONE_CYCLE);2092PushB(Registers.YL);2093OpenBus = Registers.YL;2094}20952096static void Op5AE0X0 (void)2097{2098AddCycles(ONE_CYCLE);2099PushW(Registers.Y.W);2100OpenBus = Registers.YL;2101}21022103static void Op5ASlow (void)2104{2105AddCycles(ONE_CYCLE);21062107if (CheckEmulation())2108{2109PushBE(Registers.YL);2110}2111else2112if (CheckIndex())2113{2114PushB(Registers.YL);2115}2116else2117{2118PushW(Registers.Y.W);2119}21202121OpenBus = Registers.YL;2122}21232124/* PULL Instructions ******************************************************* */21252126#define PullW(w) \2127w = S9xGetWord(Registers.S.W + 1, WRAP_BANK); \2128Registers.S.W += 2;21292130#define PullWE(w) \2131Registers.SL++; \2132w = S9xGetWord(Registers.S.W, WRAP_PAGE); \2133Registers.SL++;21342135#define PullB(b) \2136b = S9xGetByte(++Registers.S.W);21372138#define PullBE(b) \2139Registers.SL++; \2140b = S9xGetByte(Registers.S.W);21412142// PLA2143static void Op68E1 (void)2144{2145AddCycles(TWO_CYCLES);2146PullBE(Registers.AL);2147SetZN(Registers.AL);2148OpenBus = Registers.AL;2149}21502151static void Op68E0M1 (void)2152{2153AddCycles(TWO_CYCLES);2154PullB(Registers.AL);2155SetZN(Registers.AL);2156OpenBus = Registers.AL;2157}21582159static void Op68E0M0 (void)2160{2161AddCycles(TWO_CYCLES);2162PullW(Registers.A.W);2163SetZN(Registers.A.W);2164OpenBus = Registers.AH;2165}21662167static void Op68Slow (void)2168{2169AddCycles(TWO_CYCLES);21702171if (CheckEmulation())2172{2173PullBE(Registers.AL);2174SetZN(Registers.AL);2175OpenBus = Registers.AL;2176}2177else2178if (CheckMemory())2179{2180PullB(Registers.AL);2181SetZN(Registers.AL);2182OpenBus = Registers.AL;2183}2184else2185{2186PullW(Registers.A.W);2187SetZN(Registers.A.W);2188OpenBus = Registers.AH;2189}2190}21912192// PLB2193static void OpABE1 (void)2194{2195AddCycles(TWO_CYCLES);2196PullBE(Registers.DB);2197SetZN(Registers.DB);2198ICPU.ShiftedDB = Registers.DB << 16;2199OpenBus = Registers.DB;2200}22012202static void OpABE0 (void)2203{2204AddCycles(TWO_CYCLES);2205PullB(Registers.DB);2206SetZN(Registers.DB);2207ICPU.ShiftedDB = Registers.DB << 16;2208OpenBus = Registers.DB;2209}22102211static void OpABSlow (void)2212{2213AddCycles(TWO_CYCLES);22142215if (CheckEmulation())2216{2217PullBE(Registers.DB);2218}2219else2220{2221PullB(Registers.DB);2222}22232224SetZN(Registers.DB);2225ICPU.ShiftedDB = Registers.DB << 16;2226OpenBus = Registers.DB;2227}22282229// PLD2230static void Op2BE0 (void)2231{2232AddCycles(TWO_CYCLES);2233PullW(Registers.D.W);2234SetZN(Registers.D.W);2235OpenBus = Registers.DH;2236}22372238static void Op2BE1 (void)2239{2240// Note: PLD is a new instruction,2241// and so doesn't respect the emu-mode stack bounds.2242AddCycles(TWO_CYCLES);2243PullW(Registers.D.W);2244SetZN(Registers.D.W);2245OpenBus = Registers.DH;2246Registers.SH = 1;2247}22482249static void Op2BSlow (void)2250{2251AddCycles(TWO_CYCLES);2252PullW(Registers.D.W);2253SetZN(Registers.D.W);2254OpenBus = Registers.DH;2255if (CheckEmulation())2256Registers.SH = 1;2257}22582259// PLP2260static void Op28E1 (void)2261{2262AddCycles(TWO_CYCLES);2263PullBE(Registers.PL);2264OpenBus = Registers.PL;2265SetFlags(MemoryFlag | IndexFlag);2266S9xUnpackStatus();2267S9xFixCycles();2268CHECK_FOR_IRQ();2269}22702271static void Op28E0 (void)2272{2273AddCycles(TWO_CYCLES);2274PullB(Registers.PL);2275OpenBus = Registers.PL;2276S9xUnpackStatus();22772278if (CheckIndex())2279{2280Registers.XH = 0;2281Registers.YH = 0;2282}22832284S9xFixCycles();2285CHECK_FOR_IRQ();2286}22872288static void Op28Slow (void)2289{2290AddCycles(TWO_CYCLES);22912292if (CheckEmulation())2293{2294PullBE(Registers.PL);2295OpenBus = Registers.PL;2296SetFlags(MemoryFlag | IndexFlag);2297}2298else2299{2300PullB(Registers.PL);2301OpenBus = Registers.PL;2302}23032304S9xUnpackStatus();23052306if (CheckIndex())2307{2308Registers.XH = 0;2309Registers.YH = 0;2310}23112312S9xFixCycles();2313CHECK_FOR_IRQ();2314}23152316// PLX2317static void OpFAE1 (void)2318{2319AddCycles(TWO_CYCLES);2320PullBE(Registers.XL);2321SetZN(Registers.XL);2322OpenBus = Registers.XL;2323}23242325static void OpFAE0X1 (void)2326{2327AddCycles(TWO_CYCLES);2328PullB(Registers.XL);2329SetZN(Registers.XL);2330OpenBus = Registers.XL;2331}23322333static void OpFAE0X0 (void)2334{2335AddCycles(TWO_CYCLES);2336PullW(Registers.X.W);2337SetZN(Registers.X.W);2338OpenBus = Registers.XH;2339}23402341static void OpFASlow (void)2342{2343AddCycles(TWO_CYCLES);23442345if (CheckEmulation())2346{2347PullBE(Registers.XL);2348SetZN(Registers.XL);2349OpenBus = Registers.XL;2350}2351else2352if (CheckIndex())2353{2354PullB(Registers.XL);2355SetZN(Registers.XL);2356OpenBus = Registers.XL;2357}2358else2359{2360PullW(Registers.X.W);2361SetZN(Registers.X.W);2362OpenBus = Registers.XH;2363}2364}23652366// PLY2367static void Op7AE1 (void)2368{2369AddCycles(TWO_CYCLES);2370PullBE(Registers.YL);2371SetZN(Registers.YL);2372OpenBus = Registers.YL;2373}23742375static void Op7AE0X1 (void)2376{2377AddCycles(TWO_CYCLES);2378PullB(Registers.YL);2379SetZN(Registers.YL);2380OpenBus = Registers.YL;2381}23822383static void Op7AE0X0 (void)2384{2385AddCycles(TWO_CYCLES);2386PullW(Registers.Y.W);2387SetZN(Registers.Y.W);2388OpenBus = Registers.YH;2389}23902391static void Op7ASlow (void)2392{2393AddCycles(TWO_CYCLES);23942395if (CheckEmulation())2396{2397PullBE(Registers.YL);2398SetZN(Registers.YL);2399OpenBus = Registers.YL;2400}2401else2402if (CheckIndex())2403{2404PullB(Registers.YL);2405SetZN(Registers.YL);2406OpenBus = Registers.YL;2407}2408else2409{2410PullW(Registers.Y.W);2411SetZN(Registers.Y.W);2412OpenBus = Registers.YH;2413}2414}24152416/* Transfer Instructions *************************************************** */24172418// TAX2419static void OpAAX1 (void)2420{2421AddCycles(ONE_CYCLE);2422Registers.XL = Registers.AL;2423SetZN(Registers.XL);2424}24252426static void OpAAX0 (void)2427{2428AddCycles(ONE_CYCLE);2429Registers.X.W = Registers.A.W;2430SetZN(Registers.X.W);2431}24322433static void OpAASlow (void)2434{2435AddCycles(ONE_CYCLE);24362437if (CheckIndex())2438{2439Registers.XL = Registers.AL;2440SetZN(Registers.XL);2441}2442else2443{2444Registers.X.W = Registers.A.W;2445SetZN(Registers.X.W);2446}2447}24482449// TAY2450static void OpA8X1 (void)2451{2452AddCycles(ONE_CYCLE);2453Registers.YL = Registers.AL;2454SetZN(Registers.YL);2455}24562457static void OpA8X0 (void)2458{2459AddCycles(ONE_CYCLE);2460Registers.Y.W = Registers.A.W;2461SetZN(Registers.Y.W);2462}24632464static void OpA8Slow (void)2465{2466AddCycles(ONE_CYCLE);24672468if (CheckIndex())2469{2470Registers.YL = Registers.AL;2471SetZN(Registers.YL);2472}2473else2474{2475Registers.Y.W = Registers.A.W;2476SetZN(Registers.Y.W);2477}2478}24792480// TCD2481static void Op5B (void)2482{2483AddCycles(ONE_CYCLE);2484Registers.D.W = Registers.A.W;2485SetZN(Registers.D.W);2486}24872488// TCS2489static void Op1B (void)2490{2491AddCycles(ONE_CYCLE);2492Registers.S.W = Registers.A.W;2493if (CheckEmulation())2494Registers.SH = 1;2495}24962497// TDC2498static void Op7B (void)2499{2500AddCycles(ONE_CYCLE);2501Registers.A.W = Registers.D.W;2502SetZN(Registers.A.W);2503}25042505// TSC2506static void Op3B (void)2507{2508AddCycles(ONE_CYCLE);2509Registers.A.W = Registers.S.W;2510SetZN(Registers.A.W);2511}25122513// TSX2514static void OpBAX1 (void)2515{2516AddCycles(ONE_CYCLE);2517Registers.XL = Registers.SL;2518SetZN(Registers.XL);2519}25202521static void OpBAX0 (void)2522{2523AddCycles(ONE_CYCLE);2524Registers.X.W = Registers.S.W;2525SetZN(Registers.X.W);2526}25272528static void OpBASlow (void)2529{2530AddCycles(ONE_CYCLE);25312532if (CheckIndex())2533{2534Registers.XL = Registers.SL;2535SetZN(Registers.XL);2536}2537else2538{2539Registers.X.W = Registers.S.W;2540SetZN(Registers.X.W);2541}2542}25432544// TXA2545static void Op8AM1 (void)2546{2547AddCycles(ONE_CYCLE);2548Registers.AL = Registers.XL;2549SetZN(Registers.AL);2550}25512552static void Op8AM0 (void)2553{2554AddCycles(ONE_CYCLE);2555Registers.A.W = Registers.X.W;2556SetZN(Registers.A.W);2557}25582559static void Op8ASlow (void)2560{2561AddCycles(ONE_CYCLE);25622563if (CheckMemory())2564{2565Registers.AL = Registers.XL;2566SetZN(Registers.AL);2567}2568else2569{2570Registers.A.W = Registers.X.W;2571SetZN(Registers.A.W);2572}2573}25742575// TXS2576static void Op9A (void)2577{2578AddCycles(ONE_CYCLE);2579Registers.S.W = Registers.X.W;2580if (CheckEmulation())2581Registers.SH = 1;2582}25832584// TXY2585static void Op9BX1 (void)2586{2587AddCycles(ONE_CYCLE);2588Registers.YL = Registers.XL;2589SetZN(Registers.YL);2590}25912592static void Op9BX0 (void)2593{2594AddCycles(ONE_CYCLE);2595Registers.Y.W = Registers.X.W;2596SetZN(Registers.Y.W);2597}25982599static void Op9BSlow (void)2600{2601AddCycles(ONE_CYCLE);26022603if (CheckIndex())2604{2605Registers.YL = Registers.XL;2606SetZN(Registers.YL);2607}2608else2609{2610Registers.Y.W = Registers.X.W;2611SetZN(Registers.Y.W);2612}2613}26142615// TYA2616static void Op98M1 (void)2617{2618AddCycles(ONE_CYCLE);2619Registers.AL = Registers.YL;2620SetZN(Registers.AL);2621}26222623static void Op98M0 (void)2624{2625AddCycles(ONE_CYCLE);2626Registers.A.W = Registers.Y.W;2627SetZN(Registers.A.W);2628}26292630static void Op98Slow (void)2631{2632AddCycles(ONE_CYCLE);26332634if (CheckMemory())2635{2636Registers.AL = Registers.YL;2637SetZN(Registers.AL);2638}2639else2640{2641Registers.A.W = Registers.Y.W;2642SetZN(Registers.A.W);2643}2644}26452646// TYX2647static void OpBBX1 (void)2648{2649AddCycles(ONE_CYCLE);2650Registers.XL = Registers.YL;2651SetZN(Registers.XL);2652}26532654static void OpBBX0 (void)2655{2656AddCycles(ONE_CYCLE);2657Registers.X.W = Registers.Y.W;2658SetZN(Registers.X.W);2659}26602661static void OpBBSlow (void)2662{2663AddCycles(ONE_CYCLE);26642665if (CheckIndex())2666{2667Registers.XL = Registers.YL;2668SetZN(Registers.XL);2669}2670else2671{2672Registers.X.W = Registers.Y.W;2673SetZN(Registers.X.W);2674}2675}26762677/* XCE ********************************************************************* */26782679static void OpFB (void)2680{2681AddCycles(ONE_CYCLE);26822683uint8 A1 = ICPU._Carry;2684uint8 A2 = Registers.PH;26852686ICPU._Carry = A2 & 1;2687Registers.PH = A1;26882689if (CheckEmulation())2690{2691SetFlags(MemoryFlag | IndexFlag);2692Registers.SH = 1;2693#ifdef DEBUGGER2694missing.emulate6502 = 1;2695#endif2696}26972698if (CheckIndex())2699{2700Registers.XH = 0;2701Registers.YH = 0;2702}27032704S9xFixCycles();2705}27062707/* BRK ********************************************************************* */27082709static void Op00 (void)2710{2711#ifdef DEBUGGER2712if (CPU.Flags & TRACE_FLAG)2713S9xTraceMessage("*** BRK");2714#endif27152716AddCycles(CPU.MemSpeed);27172718uint16 addr;27192720if (!CheckEmulation())2721{2722PushB(Registers.PB);2723PushW(Registers.PCw + 1);2724S9xPackStatus();2725PushB(Registers.PL);2726OpenBus = Registers.PL;2727ClearDecimal();2728SetIRQ();27292730addr = S9xGetWord(0xFFE6);2731}2732else2733{2734PushWE(Registers.PCw + 1);2735S9xPackStatus();2736PushBE(Registers.PL);2737OpenBus = Registers.PL;2738ClearDecimal();2739SetIRQ();27402741addr = S9xGetWord(0xFFFE);2742}27432744S9xSetPCBase(addr);2745OpenBus = addr >> 8;2746}27472748/* IRQ ********************************************************************* */27492750void S9xOpcode_IRQ (void)2751{2752#ifdef DEBUGGER2753if (CPU.Flags & TRACE_FLAG)2754#ifdef SA1_OPCODES2755S9xTraceMessage("*** SA1 IRQ");2756#else2757S9xTraceMessage("*** IRQ");2758#endif2759#endif27602761// IRQ and NMI do an opcode fetch as their first "IO" cycle.2762AddCycles(CPU.MemSpeed + ONE_CYCLE);27632764if (!CheckEmulation())2765{2766PushB(Registers.PB);2767PushW(Registers.PCw);2768S9xPackStatus();2769PushB(Registers.PL);2770OpenBus = Registers.PL;2771ClearDecimal();2772SetIRQ();27732774#ifdef SA1_OPCODES2775OpenBus = Memory.FillRAM[0x2208];2776AddCycles(2 * SLOW_ONE_CYCLE);2777S9xSA1SetPCBase(Memory.FillRAM[0x2207] | (Memory.FillRAM[0x2208] << 8));2778#else2779if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x40))2780{2781OpenBus = Memory.FillRAM[0x220f];2782AddCycles(2 * SLOW_ONE_CYCLE);2783S9xSetPCBase(Memory.FillRAM[0x220e] | (Memory.FillRAM[0x220f] << 8));2784}2785else2786{2787uint16 addr = S9xGetWord(0xFFEE);2788OpenBus = addr >> 8;2789S9xSetPCBase(addr);2790}2791#endif2792}2793else2794{2795PushWE(Registers.PCw);2796S9xPackStatus();2797PushBE(Registers.PL);2798OpenBus = Registers.PL;2799ClearDecimal();2800SetIRQ();28012802#ifdef SA1_OPCODES2803OpenBus = Memory.FillRAM[0x2208];2804AddCycles(2 * SLOW_ONE_CYCLE);2805S9xSA1SetPCBase(Memory.FillRAM[0x2207] | (Memory.FillRAM[0x2208] << 8));2806#else2807if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x40))2808{2809OpenBus = Memory.FillRAM[0x220f];2810AddCycles(2 * SLOW_ONE_CYCLE);2811S9xSetPCBase(Memory.FillRAM[0x220e] | (Memory.FillRAM[0x220f] << 8));2812}2813else2814{2815uint16 addr = S9xGetWord(0xFFFE);2816OpenBus = addr >> 8;2817S9xSetPCBase(addr);2818}2819#endif2820}2821}28222823/* NMI ********************************************************************* */28242825void S9xOpcode_NMI (void)2826{2827#ifdef DEBUGGER2828if (CPU.Flags & TRACE_FLAG)2829#ifdef SA1_OPCODES2830S9xTraceMessage("*** SA1 NMI");2831#else2832S9xTraceMessage("*** NMI");2833#endif2834#endif28352836// IRQ and NMI do an opcode fetch as their first "IO" cycle.2837AddCycles(CPU.MemSpeed + ONE_CYCLE);28382839if (!CheckEmulation())2840{2841PushB(Registers.PB);2842PushW(Registers.PCw);2843S9xPackStatus();2844PushB(Registers.PL);2845OpenBus = Registers.PL;2846ClearDecimal();2847SetIRQ();28482849#ifdef SA1_OPCODES2850OpenBus = Memory.FillRAM[0x2206];2851AddCycles(2 * SLOW_ONE_CYCLE);2852S9xSA1SetPCBase(Memory.FillRAM[0x2205] | (Memory.FillRAM[0x2206] << 8));2853#else2854if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x10))2855{2856OpenBus = Memory.FillRAM[0x220d];2857AddCycles(2 * SLOW_ONE_CYCLE);2858S9xSetPCBase(Memory.FillRAM[0x220c] | (Memory.FillRAM[0x220d] << 8));2859}2860else2861{2862uint16 addr = S9xGetWord(0xFFEA);2863OpenBus = addr >> 8;2864S9xSetPCBase(addr);2865}2866#endif2867}2868else2869{2870PushWE(Registers.PCw);2871S9xPackStatus();2872PushBE(Registers.PL);2873OpenBus = Registers.PL;2874ClearDecimal();2875SetIRQ();28762877#ifdef SA1_OPCODES2878OpenBus = Memory.FillRAM[0x2206];2879AddCycles(2 * SLOW_ONE_CYCLE);2880S9xSA1SetPCBase(Memory.FillRAM[0x2205] | (Memory.FillRAM[0x2206] << 8));2881#else2882if (Settings.SA1 && (Memory.FillRAM[0x2209] & 0x10))2883{2884OpenBus = Memory.FillRAM[0x220d];2885AddCycles(2 * SLOW_ONE_CYCLE);2886S9xSetPCBase(Memory.FillRAM[0x220c] | (Memory.FillRAM[0x220d] << 8));2887}2888else2889{2890uint16 addr = S9xGetWord(0xFFFA);2891OpenBus = addr >> 8;2892S9xSetPCBase(addr);2893}2894#endif2895}2896}28972898/* COP ********************************************************************* */28992900static void Op02 (void)2901{2902#ifdef DEBUGGER2903if (CPU.Flags & TRACE_FLAG)2904S9xTraceMessage("*** COP");2905#endif29062907AddCycles(CPU.MemSpeed);29082909uint16 addr;29102911if (!CheckEmulation())2912{2913PushB(Registers.PB);2914PushW(Registers.PCw + 1);2915S9xPackStatus();2916PushB(Registers.PL);2917OpenBus = Registers.PL;2918ClearDecimal();2919SetIRQ();29202921addr = S9xGetWord(0xFFE4);2922}2923else2924{2925PushWE(Registers.PCw + 1);2926S9xPackStatus();2927PushBE(Registers.PL);2928OpenBus = Registers.PL;2929ClearDecimal();2930SetIRQ();29312932addr = S9xGetWord(0xFFF4);2933}29342935S9xSetPCBase(addr);2936OpenBus = addr >> 8;2937}29382939/* JML ********************************************************************* */29402941static void OpDC (void)2942{2943S9xSetPCBase(AbsoluteIndirectLong(JUMP));2944}29452946static void OpDCSlow (void)2947{2948S9xSetPCBase(AbsoluteIndirectLongSlow(JUMP));2949}29502951static void Op5C (void)2952{2953S9xSetPCBase(AbsoluteLong(JUMP));2954}29552956static void Op5CSlow (void)2957{2958S9xSetPCBase(AbsoluteLongSlow(JUMP));2959}29602961/* JMP ********************************************************************* */29622963static void Op4C (void)2964{2965S9xSetPCBase(ICPU.ShiftedPB + ((uint16) Absolute(JUMP)));2966}29672968static void Op4CSlow (void)2969{2970S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteSlow(JUMP)));2971}29722973static void Op6C (void)2974{2975S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndirect(JUMP)));2976}29772978static void Op6CSlow (void)2979{2980S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndirectSlow(JUMP)));2981}29822983static void Op7C (void)2984{2985S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndexedIndirect(JUMP)));2986}29872988static void Op7CSlow (void)2989{2990S9xSetPCBase(ICPU.ShiftedPB + ((uint16) AbsoluteIndexedIndirectSlow(JUMP)));2991}29922993/* JSL/RTL ***************************************************************** */29942995static void Op22E1 (void)2996{2997// Note: JSL is a new instruction,2998// and so doesn't respect the emu-mode stack bounds.2999uint32 addr = AbsoluteLong(JSR);3000PushB(Registers.PB);3001PushW(Registers.PCw - 1);3002Registers.SH = 1;3003S9xSetPCBase(addr);3004}30053006static void Op22E0 (void)3007{3008uint32 addr = AbsoluteLong(JSR);3009PushB(Registers.PB);3010PushW(Registers.PCw - 1);3011S9xSetPCBase(addr);3012}30133014static void Op22Slow (void)3015{3016uint32 addr = AbsoluteLongSlow(JSR);3017PushB(Registers.PB);3018PushW(Registers.PCw - 1);3019if (CheckEmulation())3020Registers.SH = 1;3021S9xSetPCBase(addr);3022}30233024static void Op6BE1 (void)3025{3026// Note: RTL is a new instruction,3027// and so doesn't respect the emu-mode stack bounds.3028AddCycles(TWO_CYCLES);3029PullW(Registers.PCw);3030PullB(Registers.PB);3031Registers.SH = 1;3032Registers.PCw++;3033S9xSetPCBase(Registers.PBPC);3034}30353036static void Op6BE0 (void)3037{3038AddCycles(TWO_CYCLES);3039PullW(Registers.PCw);3040PullB(Registers.PB);3041Registers.PCw++;3042S9xSetPCBase(Registers.PBPC);3043}30443045static void Op6BSlow (void)3046{3047AddCycles(TWO_CYCLES);3048PullW(Registers.PCw);3049PullB(Registers.PB);3050if (CheckEmulation())3051Registers.SH = 1;3052Registers.PCw++;3053S9xSetPCBase(Registers.PBPC);3054}30553056/* JSR/RTS ***************************************************************** */30573058static void Op20E1 (void)3059{3060uint16 addr = Absolute(JSR);3061AddCycles(ONE_CYCLE);3062PushWE(Registers.PCw - 1);3063S9xSetPCBase(ICPU.ShiftedPB + addr);3064}30653066static void Op20E0 (void)3067{3068uint16 addr = Absolute(JSR);3069AddCycles(ONE_CYCLE);3070PushW(Registers.PCw - 1);3071S9xSetPCBase(ICPU.ShiftedPB + addr);3072}30733074static void Op20Slow (void)3075{3076uint16 addr = AbsoluteSlow(JSR);30773078AddCycles(ONE_CYCLE);30793080if (CheckEmulation())3081{3082PushWE(Registers.PCw - 1);3083}3084else3085{3086PushW(Registers.PCw - 1);3087}30883089S9xSetPCBase(ICPU.ShiftedPB + addr);3090}30913092static void OpFCE1 (void)3093{3094// Note: JSR (a,X) is a new instruction,3095// and so doesn't respect the emu-mode stack bounds.3096uint16 addr = AbsoluteIndexedIndirect(JSR);3097PushW(Registers.PCw - 1);3098Registers.SH = 1;3099S9xSetPCBase(ICPU.ShiftedPB + addr);3100}31013102static void OpFCE0 (void)3103{3104uint16 addr = AbsoluteIndexedIndirect(JSR);3105PushW(Registers.PCw - 1);3106S9xSetPCBase(ICPU.ShiftedPB + addr);3107}31083109static void OpFCSlow (void)3110{3111uint16 addr = AbsoluteIndexedIndirectSlow(JSR);3112PushW(Registers.PCw - 1);3113if (CheckEmulation())3114Registers.SH = 1;3115S9xSetPCBase(ICPU.ShiftedPB + addr);3116}31173118static void Op60E1 (void)3119{3120AddCycles(TWO_CYCLES);3121PullWE(Registers.PCw);3122AddCycles(ONE_CYCLE);3123Registers.PCw++;3124S9xSetPCBase(Registers.PBPC);3125}31263127static void Op60E0 (void)3128{3129AddCycles(TWO_CYCLES);3130PullW(Registers.PCw);3131AddCycles(ONE_CYCLE);3132Registers.PCw++;3133S9xSetPCBase(Registers.PBPC);3134}31353136static void Op60Slow (void)3137{3138AddCycles(TWO_CYCLES);31393140if (CheckEmulation())3141{3142PullWE(Registers.PCw);3143}3144else3145{3146PullW(Registers.PCw);3147}31483149AddCycles(ONE_CYCLE);3150Registers.PCw++;3151S9xSetPCBase(Registers.PBPC);3152}31533154/* MVN/MVP ***************************************************************** */31553156static void Op54X1 (void)3157{3158uint32 SrcBank;31593160Registers.DB = Immediate8(NONE);3161ICPU.ShiftedDB = Registers.DB << 16;3162OpenBus = SrcBank = Immediate8(NONE);31633164S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);31653166Registers.XL++;3167Registers.YL++;3168Registers.A.W--;3169if (Registers.A.W != 0xffff)3170Registers.PCw -= 3;31713172AddCycles(TWO_CYCLES);3173}31743175static void Op54X0 (void)3176{3177uint32 SrcBank;31783179Registers.DB = Immediate8(NONE);3180ICPU.ShiftedDB = Registers.DB << 16;3181OpenBus = SrcBank = Immediate8(NONE);31823183S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);31843185Registers.X.W++;3186Registers.Y.W++;3187Registers.A.W--;3188if (Registers.A.W != 0xffff)3189Registers.PCw -= 3;31903191AddCycles(TWO_CYCLES);3192}31933194static void Op54Slow (void)3195{3196uint32 SrcBank;31973198OpenBus = Registers.DB = Immediate8Slow(NONE);3199ICPU.ShiftedDB = Registers.DB << 16;3200OpenBus = SrcBank = Immediate8Slow(NONE);32013202S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);32033204if (CheckIndex())3205{3206Registers.XL++;3207Registers.YL++;3208}3209else3210{3211Registers.X.W++;3212Registers.Y.W++;3213}32143215Registers.A.W--;3216if (Registers.A.W != 0xffff)3217Registers.PCw -= 3;32183219AddCycles(TWO_CYCLES);3220}32213222static void Op44X1 (void)3223{3224uint32 SrcBank;32253226Registers.DB = Immediate8(NONE);3227ICPU.ShiftedDB = Registers.DB << 16;3228OpenBus = SrcBank = Immediate8(NONE);32293230S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);32313232Registers.XL--;3233Registers.YL--;3234Registers.A.W--;3235if (Registers.A.W != 0xffff)3236Registers.PCw -= 3;32373238AddCycles(TWO_CYCLES);3239}32403241static void Op44X0 (void)3242{3243uint32 SrcBank;32443245Registers.DB = Immediate8(NONE);3246ICPU.ShiftedDB = Registers.DB << 16;3247OpenBus = SrcBank = Immediate8(NONE);32483249S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);32503251Registers.X.W--;3252Registers.Y.W--;3253Registers.A.W--;3254if (Registers.A.W != 0xffff)3255Registers.PCw -= 3;32563257AddCycles(TWO_CYCLES);3258}32593260static void Op44Slow (void)3261{3262uint32 SrcBank;32633264OpenBus = Registers.DB = Immediate8Slow(NONE);3265ICPU.ShiftedDB = Registers.DB << 16;3266OpenBus = SrcBank = Immediate8Slow(NONE);32673268S9xSetByte(OpenBus = S9xGetByte((SrcBank << 16) + Registers.X.W), ICPU.ShiftedDB + Registers.Y.W);32693270if (CheckIndex())3271{3272Registers.XL--;3273Registers.YL--;3274}3275else3276{3277Registers.X.W--;3278Registers.Y.W--;3279}32803281Registers.A.W--;3282if (Registers.A.W != 0xffff)3283Registers.PCw -= 3;32843285AddCycles(TWO_CYCLES);3286}32873288/* REP/SEP ***************************************************************** */32893290static void OpC2 (void)3291{3292uint8 Work8 = ~Immediate8(READ);3293Registers.PL &= Work8;3294ICPU._Carry &= Work8;3295ICPU._Overflow &= (Work8 >> 6);3296ICPU._Negative &= Work8;3297ICPU._Zero |= ~Work8 & Zero;32983299AddCycles(ONE_CYCLE);33003301if (CheckEmulation())3302{3303SetFlags(MemoryFlag | IndexFlag);3304#ifdef DEBUGGER3305missing.emulate6502 = 1;3306#endif3307}33083309if (CheckIndex())3310{3311Registers.XH = 0;3312Registers.YH = 0;3313}33143315S9xFixCycles();3316CHECK_FOR_IRQ();3317}33183319static void OpC2Slow (void)3320{3321uint8 Work8 = ~Immediate8Slow(READ);3322Registers.PL &= Work8;3323ICPU._Carry &= Work8;3324ICPU._Overflow &= (Work8 >> 6);3325ICPU._Negative &= Work8;3326ICPU._Zero |= ~Work8 & Zero;33273328AddCycles(ONE_CYCLE);33293330if (CheckEmulation())3331{3332SetFlags(MemoryFlag | IndexFlag);3333#ifdef DEBUGGER3334missing.emulate6502 = 1;3335#endif3336}33373338if (CheckIndex())3339{3340Registers.XH = 0;3341Registers.YH = 0;3342}33433344S9xFixCycles();3345CHECK_FOR_IRQ();3346}33473348static void OpE2 (void)3349{3350uint8 Work8 = Immediate8(READ);3351Registers.PL |= Work8;3352ICPU._Carry |= Work8 & 1;3353ICPU._Overflow |= (Work8 >> 6) & 1;3354ICPU._Negative |= Work8;3355if (Work8 & Zero)3356ICPU._Zero = 0;33573358AddCycles(ONE_CYCLE);33593360if (CheckEmulation())3361{3362SetFlags(MemoryFlag | IndexFlag);3363#ifdef DEBUGGER3364missing.emulate6502 = 1;3365#endif3366}33673368if (CheckIndex())3369{3370Registers.XH = 0;3371Registers.YH = 0;3372}33733374S9xFixCycles();3375}33763377static void OpE2Slow (void)3378{3379uint8 Work8 = Immediate8Slow(READ);3380Registers.PL |= Work8;3381ICPU._Carry |= Work8 & 1;3382ICPU._Overflow |= (Work8 >> 6) & 1;3383ICPU._Negative |= Work8;3384if (Work8 & Zero)3385ICPU._Zero = 0;33863387AddCycles(ONE_CYCLE);33883389if (CheckEmulation())3390{3391SetFlags(MemoryFlag | IndexFlag);3392#ifdef DEBUGGER3393missing.emulate6502 = 1;3394#endif3395}33963397if (CheckIndex())3398{3399Registers.XH = 0;3400Registers.YH = 0;3401}34023403S9xFixCycles();3404}34053406/* XBA ********************************************************************* */34073408static void OpEB (void)3409{3410uint8 Work8 = Registers.AL;3411Registers.AL = Registers.AH;3412Registers.AH = Work8;3413SetZN(Registers.AL);3414AddCycles(TWO_CYCLES);3415}34163417/* RTI ********************************************************************* */34183419static void Op40Slow (void)3420{3421AddCycles(TWO_CYCLES);34223423if (!CheckEmulation())3424{3425PullB(Registers.PL);3426S9xUnpackStatus();3427PullW(Registers.PCw);3428PullB(Registers.PB);3429OpenBus = Registers.PB;3430ICPU.ShiftedPB = Registers.PB << 16;3431}3432else3433{3434PullBE(Registers.PL);3435S9xUnpackStatus();3436PullWE(Registers.PCw);3437OpenBus = Registers.PCh;3438SetFlags(MemoryFlag | IndexFlag);3439#ifdef DEBUGGER3440missing.emulate6502 = 1;3441#endif3442}34433444S9xSetPCBase(Registers.PBPC);34453446if (CheckIndex())3447{3448Registers.XH = 0;3449Registers.YH = 0;3450}34513452S9xFixCycles();3453CHECK_FOR_IRQ();3454}34553456/* STP/WAI ***************************************************************** */34573458// WAI3459static void OpCB (void)3460{3461#ifdef SA1_OPCODES3462SA1.WaitingForInterrupt = TRUE;3463Registers.PCw--;3464AddCycles(TWO_CYCLES);3465#else3466CPU.WaitingForInterrupt = TRUE;3467Registers.PCw--;3468AddCycles(TWO_CYCLES);3469#endif3470}34713472// STP3473static void OpDB (void)3474{3475Registers.PCw--;3476CPU.Flags |= DEBUG_MODE_FLAG | HALTED_FLAG;3477}34783479/* WDM (Reserved S9xOpcode) ************************************************ */34803481#ifdef DEBUGGER3482extern FILE *trace, *trace2;3483#endif34843485static void Op42 (void)3486{3487#ifdef DEBUGGER3488uint8 byte = (uint8) S9xGetWord(Registers.PBPC);3489#else3490S9xGetWord(Registers.PBPC);3491#endif3492Registers.PCw++;34933494#ifdef DEBUGGER3495// Hey, let's use this to trigger debug modes.3496switch (byte)3497{3498case 0xdb: // "STP" = Enter debug mode3499CPU.Flags |= DEBUG_MODE_FLAG;3500break;35013502#ifndef SA1_OPCODES3503case 0xe2: // "SEP" = Trace on3504if (!(CPU.Flags & TRACE_FLAG))3505{3506char buf[25];3507CPU.Flags |= TRACE_FLAG;3508snprintf(buf, 25, "WDM trace on at $%02X:%04X", Registers.PB, Registers.PCw);3509S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, buf);3510if (trace != NULL)3511fclose(trace);3512ENSURE_TRACE_OPEN(trace, "WDMtrace.log", "ab")3513}35143515break;35163517case 0xc2: // "REP" = Trace off3518if (CPU.Flags & TRACE_FLAG)3519{3520char buf[26];3521CPU.Flags &= ~TRACE_FLAG;3522snprintf(buf, 26, "WDM trace off at $%02X:%04X", Registers.PB, Registers.PCw);3523S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, buf);3524if (trace != NULL)3525fclose(trace);3526trace = NULL;3527}35283529break;3530#endif35313532case 0x42: // "WDM" = Snapshot3533char filename[PATH_MAX + 1], drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[PATH_MAX + 1], ext[_MAX_EXT + 1];35343535_splitpath(Memory.ROMFilename, drive, dir, def, ext);3536snprintf(filename, PATH_MAX, "%s%s%s-%06X.wdm", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, Registers.PBPC & 0xffffff);3537sprintf(def, "WDM Snapshot at $%02X:%04X: %s", Registers.PB, Registers.PCw, filename);3538S9xMessage(S9X_DEBUG, S9X_DEBUG_OUTPUT, def);3539S9xFreezeGame(filename);35403541break;35423543default:3544break;3545}3546#endif3547}35483549/* CPU-S9xOpcodes Definitions ************************************************/35503551Opcode S9xOpcodesM1X1[256] =3552{3553Op00 , Op01E0M1 , Op02 , Op03M1 , Op04M1 ,3554Op05M1 , Op06M1 , Op07M1 , Op08E0 , Op09M1 ,3555Op0AM1 , Op0BE0 , Op0CM1 , Op0DM1 , Op0EM1 ,3556Op0FM1 , Op10E0 , Op11E0M1X1 , Op12E0M1 , Op13M1 ,3557Op14M1 , Op15E0M1 , Op16E0M1 , Op17M1 , Op18 ,3558Op19M1X1 , Op1AM1 , Op1B , Op1CM1 , Op1DM1X1 ,3559Op1EM1X1 , Op1FM1 , Op20E0 , Op21E0M1 , Op22E0 ,3560Op23M1 , Op24M1 , Op25M1 , Op26M1 , Op27M1 ,3561Op28E0 , Op29M1 , Op2AM1 , Op2BE0 , Op2CM1 ,3562Op2DM1 , Op2EM1 , Op2FM1 , Op30E0 , Op31E0M1X1 ,3563Op32E0M1 , Op33M1 , Op34E0M1 , Op35E0M1 , Op36E0M1 ,3564Op37M1 , Op38 , Op39M1X1 , Op3AM1 , Op3B ,3565Op3CM1X1 , Op3DM1X1 , Op3EM1X1 , Op3FM1 , Op40Slow ,3566Op41E0M1 , Op42 , Op43M1 , Op44X1 , Op45M1 ,3567Op46M1 , Op47M1 , Op48E0M1 , Op49M1 , Op4AM1 ,3568Op4BE0 , Op4C , Op4DM1 , Op4EM1 , Op4FM1 ,3569Op50E0 , Op51E0M1X1 , Op52E0M1 , Op53M1 , Op54X1 ,3570Op55E0M1 , Op56E0M1 , Op57M1 , Op58 , Op59M1X1 ,3571Op5AE0X1 , Op5B , Op5C , Op5DM1X1 , Op5EM1X1 ,3572Op5FM1 , Op60E0 , Op61E0M1 , Op62E0 , Op63M1 ,3573Op64M1 , Op65M1 , Op66M1 , Op67M1 , Op68E0M1 ,3574Op69M1 , Op6AM1 , Op6BE0 , Op6C , Op6DM1 ,3575Op6EM1 , Op6FM1 , Op70E0 , Op71E0M1X1 , Op72E0M1 ,3576Op73M1 , Op74E0M1 , Op75E0M1 , Op76E0M1 , Op77M1 ,3577Op78 , Op79M1X1 , Op7AE0X1 , Op7B , Op7C ,3578Op7DM1X1 , Op7EM1X1 , Op7FM1 , Op80E0 , Op81E0M1 ,3579Op82 , Op83M1 , Op84X1 , Op85M1 , Op86X1 ,3580Op87M1 , Op88X1 , Op89M1 , Op8AM1 , Op8BE0 ,3581Op8CX1 , Op8DM1 , Op8EX1 , Op8FM1 , Op90E0 ,3582Op91E0M1X1 , Op92E0M1 , Op93M1 , Op94E0X1 , Op95E0M1 ,3583Op96E0X1 , Op97M1 , Op98M1 , Op99M1X1 , Op9A ,3584Op9BX1 , Op9CM1 , Op9DM1X1 , Op9EM1X1 , Op9FM1 ,3585OpA0X1 , OpA1E0M1 , OpA2X1 , OpA3M1 , OpA4X1 ,3586OpA5M1 , OpA6X1 , OpA7M1 , OpA8X1 , OpA9M1 ,3587OpAAX1 , OpABE0 , OpACX1 , OpADM1 , OpAEX1 ,3588OpAFM1 , OpB0E0 , OpB1E0M1X1 , OpB2E0M1 , OpB3M1 ,3589OpB4E0X1 , OpB5E0M1 , OpB6E0X1 , OpB7M1 , OpB8 ,3590OpB9M1X1 , OpBAX1 , OpBBX1 , OpBCX1 , OpBDM1X1 ,3591OpBEX1 , OpBFM1 , OpC0X1 , OpC1E0M1 , OpC2 ,3592OpC3M1 , OpC4X1 , OpC5M1 , OpC6M1 , OpC7M1 ,3593OpC8X1 , OpC9M1 , OpCAX1 , OpCB , OpCCX1 ,3594OpCDM1 , OpCEM1 , OpCFM1 , OpD0E0 , OpD1E0M1X1 ,3595OpD2E0M1 , OpD3M1 , OpD4E0 , OpD5E0M1 , OpD6E0M1 ,3596OpD7M1 , OpD8 , OpD9M1X1 , OpDAE0X1 , OpDB ,3597OpDC , OpDDM1X1 , OpDEM1X1 , OpDFM1 , OpE0X1 ,3598OpE1E0M1 , OpE2 , OpE3M1 , OpE4X1 , OpE5M1 ,3599OpE6M1 , OpE7M1 , OpE8X1 , OpE9M1 , OpEA ,3600OpEB , OpECX1 , OpEDM1 , OpEEM1 , OpEFM1 ,3601OpF0E0 , OpF1E0M1X1 , OpF2E0M1 , OpF3M1 , OpF4E0 ,3602OpF5E0M1 , OpF6E0M1 , OpF7M1 , OpF8 , OpF9M1X1 ,3603OpFAE0X1 , OpFB , OpFCE0 , OpFDM1X1 , OpFEM1X1 ,3604OpFFM13605};36063607Opcode S9xOpcodesE1[256] =3608{3609Op00 , Op01E1 , Op02 , Op03M1 , Op04M1 ,3610Op05M1 , Op06M1 , Op07M1 , Op08E1 , Op09M1 ,3611Op0AM1 , Op0BE1 , Op0CM1 , Op0DM1 , Op0EM1 ,3612Op0FM1 , Op10E1 , Op11E1 , Op12E1 , Op13M1 ,3613Op14M1 , Op15E1 , Op16E1 , Op17M1 , Op18 ,3614Op19M1X1 , Op1AM1 , Op1B , Op1CM1 , Op1DM1X1 ,3615Op1EM1X1 , Op1FM1 , Op20E1 , Op21E1 , Op22E1 ,3616Op23M1 , Op24M1 , Op25M1 , Op26M1 , Op27M1 ,3617Op28E1 , Op29M1 , Op2AM1 , Op2BE1 , Op2CM1 ,3618Op2DM1 , Op2EM1 , Op2FM1 , Op30E1 , Op31E1 ,3619Op32E1 , Op33M1 , Op34E1 , Op35E1 , Op36E1 ,3620Op37M1 , Op38 , Op39M1X1 , Op3AM1 , Op3B ,3621Op3CM1X1 , Op3DM1X1 , Op3EM1X1 , Op3FM1 , Op40Slow ,3622Op41E1 , Op42 , Op43M1 , Op44X1 , Op45M1 ,3623Op46M1 , Op47M1 , Op48E1 , Op49M1 , Op4AM1 ,3624Op4BE1 , Op4C , Op4DM1 , Op4EM1 , Op4FM1 ,3625Op50E1 , Op51E1 , Op52E1 , Op53M1 , Op54X1 ,3626Op55E1 , Op56E1 , Op57M1 , Op58 , Op59M1X1 ,3627Op5AE1 , Op5B , Op5C , Op5DM1X1 , Op5EM1X1 ,3628Op5FM1 , Op60E1 , Op61E1 , Op62E1 , Op63M1 ,3629Op64M1 , Op65M1 , Op66M1 , Op67M1 , Op68E1 ,3630Op69M1 , Op6AM1 , Op6BE1 , Op6C , Op6DM1 ,3631Op6EM1 , Op6FM1 , Op70E1 , Op71E1 , Op72E1 ,3632Op73M1 , Op74E1 , Op75E1 , Op76E1 , Op77M1 ,3633Op78 , Op79M1X1 , Op7AE1 , Op7B , Op7C ,3634Op7DM1X1 , Op7EM1X1 , Op7FM1 , Op80E1 , Op81E1 ,3635Op82 , Op83M1 , Op84X1 , Op85M1 , Op86X1 ,3636Op87M1 , Op88X1 , Op89M1 , Op8AM1 , Op8BE1 ,3637Op8CX1 , Op8DM1 , Op8EX1 , Op8FM1 , Op90E1 ,3638Op91E1 , Op92E1 , Op93M1 , Op94E1 , Op95E1 ,3639Op96E1 , Op97M1 , Op98M1 , Op99M1X1 , Op9A ,3640Op9BX1 , Op9CM1 , Op9DM1X1 , Op9EM1X1 , Op9FM1 ,3641OpA0X1 , OpA1E1 , OpA2X1 , OpA3M1 , OpA4X1 ,3642OpA5M1 , OpA6X1 , OpA7M1 , OpA8X1 , OpA9M1 ,3643OpAAX1 , OpABE1 , OpACX1 , OpADM1 , OpAEX1 ,3644OpAFM1 , OpB0E1 , OpB1E1 , OpB2E1 , OpB3M1 ,3645OpB4E1 , OpB5E1 , OpB6E1 , OpB7M1 , OpB8 ,3646OpB9M1X1 , OpBAX1 , OpBBX1 , OpBCX1 , OpBDM1X1 ,3647OpBEX1 , OpBFM1 , OpC0X1 , OpC1E1 , OpC2 ,3648OpC3M1 , OpC4X1 , OpC5M1 , OpC6M1 , OpC7M1 ,3649OpC8X1 , OpC9M1 , OpCAX1 , OpCB , OpCCX1 ,3650OpCDM1 , OpCEM1 , OpCFM1 , OpD0E1 , OpD1E1 ,3651OpD2E1 , OpD3M1 , OpD4E1 , OpD5E1 , OpD6E1 ,3652OpD7M1 , OpD8 , OpD9M1X1 , OpDAE1 , OpDB ,3653OpDC , OpDDM1X1 , OpDEM1X1 , OpDFM1 , OpE0X1 ,3654OpE1E1 , OpE2 , OpE3M1 , OpE4X1 , OpE5M1 ,3655OpE6M1 , OpE7M1 , OpE8X1 , OpE9M1 , OpEA ,3656OpEB , OpECX1 , OpEDM1 , OpEEM1 , OpEFM1 ,3657OpF0E1 , OpF1E1 , OpF2E1 , OpF3M1 , OpF4E1 ,3658OpF5E1 , OpF6E1 , OpF7M1 , OpF8 , OpF9M1X1 ,3659OpFAE1 , OpFB , OpFCE1 , OpFDM1X1 , OpFEM1X1 ,3660OpFFM13661};36623663Opcode S9xOpcodesM1X0[256] =3664{3665Op00 , Op01E0M1 , Op02 , Op03M1 , Op04M1 ,3666Op05M1 , Op06M1 , Op07M1 , Op08E0 , Op09M1 ,3667Op0AM1 , Op0BE0 , Op0CM1 , Op0DM1 , Op0EM1 ,3668Op0FM1 , Op10E0 , Op11E0M1X0 , Op12E0M1 , Op13M1 ,3669Op14M1 , Op15E0M1 , Op16E0M1 , Op17M1 , Op18 ,3670Op19M1X0 , Op1AM1 , Op1B , Op1CM1 , Op1DM1X0 ,3671Op1EM1X0 , Op1FM1 , Op20E0 , Op21E0M1 , Op22E0 ,3672Op23M1 , Op24M1 , Op25M1 , Op26M1 , Op27M1 ,3673Op28E0 , Op29M1 , Op2AM1 , Op2BE0 , Op2CM1 ,3674Op2DM1 , Op2EM1 , Op2FM1 , Op30E0 , Op31E0M1X0 ,3675Op32E0M1 , Op33M1 , Op34E0M1 , Op35E0M1 , Op36E0M1 ,3676Op37M1 , Op38 , Op39M1X0 , Op3AM1 , Op3B ,3677Op3CM1X0 , Op3DM1X0 , Op3EM1X0 , Op3FM1 , Op40Slow ,3678Op41E0M1 , Op42 , Op43M1 , Op44X0 , Op45M1 ,3679Op46M1 , Op47M1 , Op48E0M1 , Op49M1 , Op4AM1 ,3680Op4BE0 , Op4C , Op4DM1 , Op4EM1 , Op4FM1 ,3681Op50E0 , Op51E0M1X0 , Op52E0M1 , Op53M1 , Op54X0 ,3682Op55E0M1 , Op56E0M1 , Op57M1 , Op58 , Op59M1X0 ,3683Op5AE0X0 , Op5B , Op5C , Op5DM1X0 , Op5EM1X0 ,3684Op5FM1 , Op60E0 , Op61E0M1 , Op62E0 , Op63M1 ,3685Op64M1 , Op65M1 , Op66M1 , Op67M1 , Op68E0M1 ,3686Op69M1 , Op6AM1 , Op6BE0 , Op6C , Op6DM1 ,3687Op6EM1 , Op6FM1 , Op70E0 , Op71E0M1X0 , Op72E0M1 ,3688Op73M1 , Op74E0M1 , Op75E0M1 , Op76E0M1 , Op77M1 ,3689Op78 , Op79M1X0 , Op7AE0X0 , Op7B , Op7C ,3690Op7DM1X0 , Op7EM1X0 , Op7FM1 , Op80E0 , Op81E0M1 ,3691Op82 , Op83M1 , Op84X0 , Op85M1 , Op86X0 ,3692Op87M1 , Op88X0 , Op89M1 , Op8AM1 , Op8BE0 ,3693Op8CX0 , Op8DM1 , Op8EX0 , Op8FM1 , Op90E0 ,3694Op91E0M1X0 , Op92E0M1 , Op93M1 , Op94E0X0 , Op95E0M1 ,3695Op96E0X0 , Op97M1 , Op98M1 , Op99M1X0 , Op9A ,3696Op9BX0 , Op9CM1 , Op9DM1X0 , Op9EM1X0 , Op9FM1 ,3697OpA0X0 , OpA1E0M1 , OpA2X0 , OpA3M1 , OpA4X0 ,3698OpA5M1 , OpA6X0 , OpA7M1 , OpA8X0 , OpA9M1 ,3699OpAAX0 , OpABE0 , OpACX0 , OpADM1 , OpAEX0 ,3700OpAFM1 , OpB0E0 , OpB1E0M1X0 , OpB2E0M1 , OpB3M1 ,3701OpB4E0X0 , OpB5E0M1 , OpB6E0X0 , OpB7M1 , OpB8 ,3702OpB9M1X0 , OpBAX0 , OpBBX0 , OpBCX0 , OpBDM1X0 ,3703OpBEX0 , OpBFM1 , OpC0X0 , OpC1E0M1 , OpC2 ,3704OpC3M1 , OpC4X0 , OpC5M1 , OpC6M1 , OpC7M1 ,3705OpC8X0 , OpC9M1 , OpCAX0 , OpCB , OpCCX0 ,3706OpCDM1 , OpCEM1 , OpCFM1 , OpD0E0 , OpD1E0M1X0 ,3707OpD2E0M1 , OpD3M1 , OpD4E0 , OpD5E0M1 , OpD6E0M1 ,3708OpD7M1 , OpD8 , OpD9M1X0 , OpDAE0X0 , OpDB ,3709OpDC , OpDDM1X0 , OpDEM1X0 , OpDFM1 , OpE0X0 ,3710OpE1E0M1 , OpE2 , OpE3M1 , OpE4X0 , OpE5M1 ,3711OpE6M1 , OpE7M1 , OpE8X0 , OpE9M1 , OpEA ,3712OpEB , OpECX0 , OpEDM1 , OpEEM1 , OpEFM1 ,3713OpF0E0 , OpF1E0M1X0 , OpF2E0M1 , OpF3M1 , OpF4E0 ,3714OpF5E0M1 , OpF6E0M1 , OpF7M1 , OpF8 , OpF9M1X0 ,3715OpFAE0X0 , OpFB , OpFCE0 , OpFDM1X0 , OpFEM1X0 ,3716OpFFM13717};37183719Opcode S9xOpcodesM0X0[256] =3720{3721Op00 , Op01E0M0 , Op02 , Op03M0 , Op04M0 ,3722Op05M0 , Op06M0 , Op07M0 , Op08E0 , Op09M0 ,3723Op0AM0 , Op0BE0 , Op0CM0 , Op0DM0 , Op0EM0 ,3724Op0FM0 , Op10E0 , Op11E0M0X0 , Op12E0M0 , Op13M0 ,3725Op14M0 , Op15E0M0 , Op16E0M0 , Op17M0 , Op18 ,3726Op19M0X0 , Op1AM0 , Op1B , Op1CM0 , Op1DM0X0 ,3727Op1EM0X0 , Op1FM0 , Op20E0 , Op21E0M0 , Op22E0 ,3728Op23M0 , Op24M0 , Op25M0 , Op26M0 , Op27M0 ,3729Op28E0 , Op29M0 , Op2AM0 , Op2BE0 , Op2CM0 ,3730Op2DM0 , Op2EM0 , Op2FM0 , Op30E0 , Op31E0M0X0 ,3731Op32E0M0 , Op33M0 , Op34E0M0 , Op35E0M0 , Op36E0M0 ,3732Op37M0 , Op38 , Op39M0X0 , Op3AM0 , Op3B ,3733Op3CM0X0 , Op3DM0X0 , Op3EM0X0 , Op3FM0 , Op40Slow ,3734Op41E0M0 , Op42 , Op43M0 , Op44X0 , Op45M0 ,3735Op46M0 , Op47M0 , Op48E0M0 , Op49M0 , Op4AM0 ,3736Op4BE0 , Op4C , Op4DM0 , Op4EM0 , Op4FM0 ,3737Op50E0 , Op51E0M0X0 , Op52E0M0 , Op53M0 , Op54X0 ,3738Op55E0M0 , Op56E0M0 , Op57M0 , Op58 , Op59M0X0 ,3739Op5AE0X0 , Op5B , Op5C , Op5DM0X0 , Op5EM0X0 ,3740Op5FM0 , Op60E0 , Op61E0M0 , Op62E0 , Op63M0 ,3741Op64M0 , Op65M0 , Op66M0 , Op67M0 , Op68E0M0 ,3742Op69M0 , Op6AM0 , Op6BE0 , Op6C , Op6DM0 ,3743Op6EM0 , Op6FM0 , Op70E0 , Op71E0M0X0 , Op72E0M0 ,3744Op73M0 , Op74E0M0 , Op75E0M0 , Op76E0M0 , Op77M0 ,3745Op78 , Op79M0X0 , Op7AE0X0 , Op7B , Op7C ,3746Op7DM0X0 , Op7EM0X0 , Op7FM0 , Op80E0 , Op81E0M0 ,3747Op82 , Op83M0 , Op84X0 , Op85M0 , Op86X0 ,3748Op87M0 , Op88X0 , Op89M0 , Op8AM0 , Op8BE0 ,3749Op8CX0 , Op8DM0 , Op8EX0 , Op8FM0 , Op90E0 ,3750Op91E0M0X0 , Op92E0M0 , Op93M0 , Op94E0X0 , Op95E0M0 ,3751Op96E0X0 , Op97M0 , Op98M0 , Op99M0X0 , Op9A ,3752Op9BX0 , Op9CM0 , Op9DM0X0 , Op9EM0X0 , Op9FM0 ,3753OpA0X0 , OpA1E0M0 , OpA2X0 , OpA3M0 , OpA4X0 ,3754OpA5M0 , OpA6X0 , OpA7M0 , OpA8X0 , OpA9M0 ,3755OpAAX0 , OpABE0 , OpACX0 , OpADM0 , OpAEX0 ,3756OpAFM0 , OpB0E0 , OpB1E0M0X0 , OpB2E0M0 , OpB3M0 ,3757OpB4E0X0 , OpB5E0M0 , OpB6E0X0 , OpB7M0 , OpB8 ,3758OpB9M0X0 , OpBAX0 , OpBBX0 , OpBCX0 , OpBDM0X0 ,3759OpBEX0 , OpBFM0 , OpC0X0 , OpC1E0M0 , OpC2 ,3760OpC3M0 , OpC4X0 , OpC5M0 , OpC6M0 , OpC7M0 ,3761OpC8X0 , OpC9M0 , OpCAX0 , OpCB , OpCCX0 ,3762OpCDM0 , OpCEM0 , OpCFM0 , OpD0E0 , OpD1E0M0X0 ,3763OpD2E0M0 , OpD3M0 , OpD4E0 , OpD5E0M0 , OpD6E0M0 ,3764OpD7M0 , OpD8 , OpD9M0X0 , OpDAE0X0 , OpDB ,3765OpDC , OpDDM0X0 , OpDEM0X0 , OpDFM0 , OpE0X0 ,3766OpE1E0M0 , OpE2 , OpE3M0 , OpE4X0 , OpE5M0 ,3767OpE6M0 , OpE7M0 , OpE8X0 , OpE9M0 , OpEA ,3768OpEB , OpECX0 , OpEDM0 , OpEEM0 , OpEFM0 ,3769OpF0E0 , OpF1E0M0X0 , OpF2E0M0 , OpF3M0 , OpF4E0 ,3770OpF5E0M0 , OpF6E0M0 , OpF7M0 , OpF8 , OpF9M0X0 ,3771OpFAE0X0 , OpFB , OpFCE0 , OpFDM0X0 , OpFEM0X0 ,3772OpFFM03773};37743775Opcode S9xOpcodesM0X1[256] =3776{3777Op00 , Op01E0M0 , Op02 , Op03M0 , Op04M0 ,3778Op05M0 , Op06M0 , Op07M0 , Op08E0 , Op09M0 ,3779Op0AM0 , Op0BE0 , Op0CM0 , Op0DM0 , Op0EM0 ,3780Op0FM0 , Op10E0 , Op11E0M0X1 , Op12E0M0 , Op13M0 ,3781Op14M0 , Op15E0M0 , Op16E0M0 , Op17M0 , Op18 ,3782Op19M0X1 , Op1AM0 , Op1B , Op1CM0 , Op1DM0X1 ,3783Op1EM0X1 , Op1FM0 , Op20E0 , Op21E0M0 , Op22E0 ,3784Op23M0 , Op24M0 , Op25M0 , Op26M0 , Op27M0 ,3785Op28E0 , Op29M0 , Op2AM0 , Op2BE0 , Op2CM0 ,3786Op2DM0 , Op2EM0 , Op2FM0 , Op30E0 , Op31E0M0X1 ,3787Op32E0M0 , Op33M0 , Op34E0M0 , Op35E0M0 , Op36E0M0 ,3788Op37M0 , Op38 , Op39M0X1 , Op3AM0 , Op3B ,3789Op3CM0X1 , Op3DM0X1 , Op3EM0X1 , Op3FM0 , Op40Slow ,3790Op41E0M0 , Op42 , Op43M0 , Op44X1 , Op45M0 ,3791Op46M0 , Op47M0 , Op48E0M0 , Op49M0 , Op4AM0 ,3792Op4BE0 , Op4C , Op4DM0 , Op4EM0 , Op4FM0 ,3793Op50E0 , Op51E0M0X1 , Op52E0M0 , Op53M0 , Op54X1 ,3794Op55E0M0 , Op56E0M0 , Op57M0 , Op58 , Op59M0X1 ,3795Op5AE0X1 , Op5B , Op5C , Op5DM0X1 , Op5EM0X1 ,3796Op5FM0 , Op60E0 , Op61E0M0 , Op62E0 , Op63M0 ,3797Op64M0 , Op65M0 , Op66M0 , Op67M0 , Op68E0M0 ,3798Op69M0 , Op6AM0 , Op6BE0 , Op6C , Op6DM0 ,3799Op6EM0 , Op6FM0 , Op70E0 , Op71E0M0X1 , Op72E0M0 ,3800Op73M0 , Op74E0M0 , Op75E0M0 , Op76E0M0 , Op77M0 ,3801Op78 , Op79M0X1 , Op7AE0X1 , Op7B , Op7C ,3802Op7DM0X1 , Op7EM0X1 , Op7FM0 , Op80E0 , Op81E0M0 ,3803Op82 , Op83M0 , Op84X1 , Op85M0 , Op86X1 ,3804Op87M0 , Op88X1 , Op89M0 , Op8AM0 , Op8BE0 ,3805Op8CX1 , Op8DM0 , Op8EX1 , Op8FM0 , Op90E0 ,3806Op91E0M0X1 , Op92E0M0 , Op93M0 , Op94E0X1 , Op95E0M0 ,3807Op96E0X1 , Op97M0 , Op98M0 , Op99M0X1 , Op9A ,3808Op9BX1 , Op9CM0 , Op9DM0X1 , Op9EM0X1 , Op9FM0 ,3809OpA0X1 , OpA1E0M0 , OpA2X1 , OpA3M0 , OpA4X1 ,3810OpA5M0 , OpA6X1 , OpA7M0 , OpA8X1 , OpA9M0 ,3811OpAAX1 , OpABE0 , OpACX1 , OpADM0 , OpAEX1 ,3812OpAFM0 , OpB0E0 , OpB1E0M0X1 , OpB2E0M0 , OpB3M0 ,3813OpB4E0X1 , OpB5E0M0 , OpB6E0X1 , OpB7M0 , OpB8 ,3814OpB9M0X1 , OpBAX1 , OpBBX1 , OpBCX1 , OpBDM0X1 ,3815OpBEX1 , OpBFM0 , OpC0X1 , OpC1E0M0 , OpC2 ,3816OpC3M0 , OpC4X1 , OpC5M0 , OpC6M0 , OpC7M0 ,3817OpC8X1 , OpC9M0 , OpCAX1 , OpCB , OpCCX1 ,3818OpCDM0 , OpCEM0 , OpCFM0 , OpD0E0 , OpD1E0M0X1 ,3819OpD2E0M0 , OpD3M0 , OpD4E0 , OpD5E0M0 , OpD6E0M0 ,3820OpD7M0 , OpD8 , OpD9M0X1 , OpDAE0X1 , OpDB ,3821OpDC , OpDDM0X1 , OpDEM0X1 , OpDFM0 , OpE0X1 ,3822OpE1E0M0 , OpE2 , OpE3M0 , OpE4X1 , OpE5M0 ,3823OpE6M0 , OpE7M0 , OpE8X1 , OpE9M0 , OpEA ,3824OpEB , OpECX1 , OpEDM0 , OpEEM0 , OpEFM0 ,3825OpF0E0 , OpF1E0M0X1 , OpF2E0M0 , OpF3M0 , OpF4E0 ,3826OpF5E0M0 , OpF6E0M0 , OpF7M0 , OpF8 , OpF9M0X1 ,3827OpFAE0X1 , OpFB , OpFCE0 , OpFDM0X1 , OpFEM0X1 ,3828OpFFM03829};38303831Opcode S9xOpcodesSlow[256] =3832{3833Op00 , Op01Slow , Op02 , Op03Slow , Op04Slow ,3834Op05Slow , Op06Slow , Op07Slow , Op08Slow , Op09Slow ,3835Op0ASlow , Op0BSlow , Op0CSlow , Op0DSlow , Op0ESlow ,3836Op0FSlow , Op10Slow , Op11Slow , Op12Slow , Op13Slow ,3837Op14Slow , Op15Slow , Op16Slow , Op17Slow , Op18 ,3838Op19Slow , Op1ASlow , Op1B , Op1CSlow , Op1DSlow ,3839Op1ESlow , Op1FSlow , Op20Slow , Op21Slow , Op22Slow ,3840Op23Slow , Op24Slow , Op25Slow , Op26Slow , Op27Slow ,3841Op28Slow , Op29Slow , Op2ASlow , Op2BSlow , Op2CSlow ,3842Op2DSlow , Op2ESlow , Op2FSlow , Op30Slow , Op31Slow ,3843Op32Slow , Op33Slow , Op34Slow , Op35Slow , Op36Slow ,3844Op37Slow , Op38 , Op39Slow , Op3ASlow , Op3B ,3845Op3CSlow , Op3DSlow , Op3ESlow , Op3FSlow , Op40Slow ,3846Op41Slow , Op42 , Op43Slow , Op44Slow , Op45Slow ,3847Op46Slow , Op47Slow , Op48Slow , Op49Slow , Op4ASlow ,3848Op4BSlow , Op4CSlow , Op4DSlow , Op4ESlow , Op4FSlow ,3849Op50Slow , Op51Slow , Op52Slow , Op53Slow , Op54Slow ,3850Op55Slow , Op56Slow , Op57Slow , Op58 , Op59Slow ,3851Op5ASlow , Op5B , Op5CSlow , Op5DSlow , Op5ESlow ,3852Op5FSlow , Op60Slow , Op61Slow , Op62Slow , Op63Slow ,3853Op64Slow , Op65Slow , Op66Slow , Op67Slow , Op68Slow ,3854Op69Slow , Op6ASlow , Op6BSlow , Op6CSlow , Op6DSlow ,3855Op6ESlow , Op6FSlow , Op70Slow , Op71Slow , Op72Slow ,3856Op73Slow , Op74Slow , Op75Slow , Op76Slow , Op77Slow ,3857Op78 , Op79Slow , Op7ASlow , Op7B , Op7CSlow ,3858Op7DSlow , Op7ESlow , Op7FSlow , Op80Slow , Op81Slow ,3859Op82Slow , Op83Slow , Op84Slow , Op85Slow , Op86Slow ,3860Op87Slow , Op88Slow , Op89Slow , Op8ASlow , Op8BSlow ,3861Op8CSlow , Op8DSlow , Op8ESlow , Op8FSlow , Op90Slow ,3862Op91Slow , Op92Slow , Op93Slow , Op94Slow , Op95Slow ,3863Op96Slow , Op97Slow , Op98Slow , Op99Slow , Op9A ,3864Op9BSlow , Op9CSlow , Op9DSlow , Op9ESlow , Op9FSlow ,3865OpA0Slow , OpA1Slow , OpA2Slow , OpA3Slow , OpA4Slow ,3866OpA5Slow , OpA6Slow , OpA7Slow , OpA8Slow , OpA9Slow ,3867OpAASlow , OpABSlow , OpACSlow , OpADSlow , OpAESlow ,3868OpAFSlow , OpB0Slow , OpB1Slow , OpB2Slow , OpB3Slow ,3869OpB4Slow , OpB5Slow , OpB6Slow , OpB7Slow , OpB8 ,3870OpB9Slow , OpBASlow , OpBBSlow , OpBCSlow , OpBDSlow ,3871OpBESlow , OpBFSlow , OpC0Slow , OpC1Slow , OpC2Slow ,3872OpC3Slow , OpC4Slow , OpC5Slow , OpC6Slow , OpC7Slow ,3873OpC8Slow , OpC9Slow , OpCASlow , OpCB , OpCCSlow ,3874OpCDSlow , OpCESlow , OpCFSlow , OpD0Slow , OpD1Slow ,3875OpD2Slow , OpD3Slow , OpD4Slow , OpD5Slow , OpD6Slow ,3876OpD7Slow , OpD8 , OpD9Slow , OpDASlow , OpDB ,3877OpDCSlow , OpDDSlow , OpDESlow , OpDFSlow , OpE0Slow ,3878OpE1Slow , OpE2Slow , OpE3Slow , OpE4Slow , OpE5Slow ,3879OpE6Slow , OpE7Slow , OpE8Slow , OpE9Slow , OpEA ,3880OpEB , OpECSlow , OpEDSlow , OpEESlow , OpEFSlow ,3881OpF0Slow , OpF1Slow , OpF2Slow , OpF3Slow , OpF4Slow ,3882OpF5Slow , OpF6Slow , OpF7Slow , OpF8 , OpF9Slow ,3883OpFASlow , OpFB , OpFCSlow , OpFDSlow , OpFESlow ,3884OpFFSlow3885};388638873888